From b3e1e6802f3bd01fb03f8c0b23f5ca40c53e71ad Mon Sep 17 00:00:00 2001 From: itseffi <15998472+itseffi@users.noreply.github.com> Date: Tue, 26 May 2026 18:41:27 +0200 Subject: [PATCH 01/32] v2 Co-Authored-By: Claude Opus 4.7 --- .agents/plugins/marketplace.json | 192 - .agents/productize-runtime.json | 57 - .agents/skills/adversarial-review/SKILL.md | 140 + .../references/reviewer-lenses.md | 38 + .agents/skills/ai-sdk/SKILL.md | 53 + .../skills/ai-sdk/references/ai-gateway.md | 41 + .../skills/ai-sdk/references/common-errors.md | 167 + .agents/skills/app-renderer-systems/SKILL.md | 208 + .../references/directory-layout.md | 119 + .../references/patterns.md | 544 + .../skills/architectural-analysis/SKILL.md | 645 + .agents/skills/autoresearch/SKILL.md | 329 + .agents/skills/autoresearch/eval-guide.md | 121 + .agents/skills/brainstorming/SKILL.md | 107 + .agents/skills/bubbletea/SKILL.md | 277 + .../skills/bubbletea/references/components.md | 647 + .../bubbletea/references/emoji-width-fix.md | 295 + .../bubbletea/references/golden-rules.md | 393 + .../bubbletea/references/troubleshooting.md | 705 + .agents/skills/context7/SKILL.md | 160 + .agents/skills/council/SKILL.md | 97 + .../council/assets/synthesis-template.md | 85 + .../skills/council/references/archetypes.md | 67 + .../council/references/debate-protocols.md | 70 + .../crafting-effective-readmes/README.md | 180 + .../crafting-effective-readmes/SKILL.md | 78 + .../references/art-of-readme.md | 536 + .../references/make-a-readme.md | 119 + .../standard-readme-example-maximal.md | 68 + .../standard-readme-example-minimal.md | 21 + .../references/standard-readme-spec.md | 242 + .../section-checklist.md | 17 + .../crafting-effective-readmes/style-guide.md | 13 + .../templates/internal.md | 106 + .../templates/oss.md | 77 + .../templates/personal.md | 51 + .../templates/xdg-config.md | 71 + .../using-references.md | 35 + .agents/skills/create-prd/SKILL.md | 185 + .../create-prd/references/adr-template.md | 55 + .../create-prd/references/prd-template.md | 102 + .../references/question-protocol.md | 83 + .agents/skills/create-tasks/SKILL.md | 111 + .../references/task-context-schema.md | 35 + .../create-tasks/references/task-template.md | 83 + .agents/skills/create-techspec/SKILL.md | 143 + .../references/adr-template.md | 55 + .../references/techspec-template.md | 116 + .agents/skills/design-taste-frontend/SKILL.md | 226 + .agents/skills/drawio/SKILL.md | 184 + .agents/skills/exa-web-search-free/SKILL.md | 96 + .../references/examples.md | 156 + .agents/skills/execute-task/SKILL.md | 65 + .../references/tracking-checklist.md | 9 + .../extreme-software-optimization/SKILL.md | 150 + .../references/ADVANCED.md | 999 ++ .../references/LANGUAGE-SPECIFIC.md | 513 + .../references/METHODOLOGY.md | 293 + .../references/TECHNIQUES.md | 488 + .agents/skills/final-verify/SKILL.md | 154 + .agents/skills/find-skills/SKILL.md | 133 + .agents/skills/fix-coderabbit-review/SKILL.md | 116 + .../fix-coderabbit-review/agents/openai.yaml | 3 + .../scripts/pr_review.py | 994 ++ .../scripts/resolve_pr_issues.py | 229 + .agents/skills/fix-reviews/SKILL.md | 50 + .agents/skills/frontend-design/SKILL.md | 147 + .../reference/color-and-contrast.md | 132 + .../reference/interaction-design.md | 195 + .../reference/motion-design.md | 99 + .../reference/responsive-design.md | 114 + .../reference/spatial-design.md | 100 + .../frontend-design/reference/typography.md | 133 + .../frontend-design/reference/ux-writing.md | 107 + .agents/skills/git-rebase/SKILL.md | 422 + .../git-rebase/references/automation.md | 25 + .../references/resolution-patterns.md | 76 + .../git-rebase/references/scripts-tools.md | 49 + .../git-rebase/references/strategies.md | 367 + .../git-rebase/references/troubleshooting.md | 70 + .../git-rebase/scripts/analyze-conflicts.sh | 107 + .../git-rebase/scripts/pre-rebase-backup.sh | 94 + .../git-rebase/scripts/validate-merge.sh | 106 + .agents/skills/golang-pro/SKILL.md | 122 + .../golang-pro/references/concurrency.md | 329 + .../skills/golang-pro/references/generics.md | 442 + .../golang-pro/references/interfaces.md | 432 + .../references/project-structure.md | 477 + .../skills/golang-pro/references/testing.md | 451 + .agents/skills/idea-factory/SKILL.md | 217 + .../idea-factory/references/adr-template.md | 55 + .../references/business-analyst.md | 99 + .../skills/idea-factory/references/council.md | 169 + .../idea-factory/references/idea-template.md | 122 + .../references/product-strategist.md | 123 + .../references/question-protocol.md | 82 + .agents/skills/impl-peer-review/SKILL.md | 113 + .../references/impl-review-prompt.md | 121 + .../references/readiness-checks.md | 45 + .agents/skills/interface-design/SKILL.md | 391 + .../interface-design/references/critique.md | 67 + .../interface-design/references/example.md | 86 + .../interface-design/references/principles.md | 235 + .../interface-design/references/validation.md | 48 + .agents/skills/lesson-learned/README.md | 65 + .agents/skills/lesson-learned/SKILL.md | 105 + .../references/anti-patterns.md | 55 + .../references/se-principles.md | 109 + .agents/skills/minimalist-ui/SKILL.md | 85 + .agents/skills/no-workarounds/SKILL.md | 384 + .../references/philosophical-foundations.md | 111 + .../references/workaround-catalog.md | 565 + .agents/skills/productize-runtime/SKILL.md | 246 + .../references/cli-reference.md | 260 + .../references/config-reference.md | 256 + .../references/skills-reference.md | 156 + .../references/workflow-guide.md | 162 + .agents/skills/qa-execution/SKILL.md | 110 + .../qa-execution/assets/issue-template.md | 62 + .../assets/verification-report-template.md | 62 + .../qa-execution/references/checklist.md | 60 + .../qa-execution/references/e2e-coverage.md | 59 + .../references/project-signals.md | 79 + .../qa-execution/references/web-ui-qa.md | 151 + .../scripts/discover-project-contract.py | 433 + .agents/skills/qa-report/SKILL.md | 196 + .../skills/qa-report/assets/issue-template.md | 62 + .../references/bug_report_templates.md | 201 + .../qa-report/references/figma_validation.md | 372 + .../references/regression_testing.md | 402 + .../references/test_case_templates.md | 489 + .../qa-report/scripts/create_bug_report.sh | 287 + .../qa-report/scripts/generate_test_cases.sh | 348 + .agents/skills/react/SKILL.md | 195 + .../skills/react/references/best-practices.md | 1093 ++ .../react/references/useeffect-patterns.md | 620 + .../redesign-existing-projects/SKILL.md | 178 + .agents/skills/refactoring-analysis/SKILL.md | 157 + .../assets/refactoring-report-template.md | 246 + .../checklists/analysis-checklist.md | 77 + .../references/code-smells-catalog.md | 280 + .../references/refactoring-techniques.md | 269 + .../references/solid-ddd-context.md | 153 + .../scripts/validate-metadata.py | 51 + .agents/skills/review-round/SKILL.md | 120 + .../review-round/references/issue-template.md | 60 + .../references/review-criteria.md | 123 + .agents/skills/shadcn-ui/SKILL.md | 1911 +++ .agents/skills/shadcn-ui/references/chart.md | 303 + .agents/skills/shadcn-ui/references/learn.md | 150 + .../references/official-ui-reference.md | 1721 +++ .../skills/shadcn-ui/references/reference.md | 608 + .../shadcn-ui/references/ui-reference.md | 1588 ++ .agents/skills/shadcn/SKILL.md | 140 + .agents/skills/shadcn/references/patterns.md | 613 + .agents/skills/skill-best-practices/SKILL.md | 46 + .../assets/SKILL.template.md | 22 + .../references/checklist.md | 33 + .../scripts/validate-metadata.py | 54 + .agents/skills/skill-writer/SKILL.md | 408 + .../skills/smux-productize-pairing/SKILL.md | 101 + .../assets/boot-prompts.md | 74 + .../assets/claude-append-system-prompt.md | 10 + .../assets/codex-developer-instructions.md | 11 + .../references/runtime-contract.md | 91 + .../scripts/print-session-command.sh | 108 + .../scripts/render-session-plan.py | 162 + .../scripts/run-claude-worker.sh | 9 + .../scripts/run-codex-worker.sh | 9 + .../scripts/run-productize-start.sh | 40 + .agents/skills/smux/SKILL.md | 209 + .agents/skills/smux/references/tmux-bridge.md | 219 + .agents/skills/smux/references/tmux.md | 176 + .agents/skills/storybook-stories/SKILL.md | 376 + .../storybook-stories/references/patterns.md | 60 + .../systematic-debugging/CREATION-LOG.md | 133 + .agents/skills/systematic-debugging/SKILL.md | 305 + .../condition-based-waiting-example.ts | 158 + .../condition-based-waiting.md | 120 + .../systematic-debugging/defense-in-depth.md | 128 + .../systematic-debugging/find-polluter.sh | 63 + .../root-cause-tracing.md | 183 + .../systematic-debugging/test-academic.md | 14 + .../systematic-debugging/test-pressure-1.md | 65 + .../systematic-debugging/test-pressure-2.md | 75 + .../systematic-debugging/test-pressure-3.md | 75 + .agents/skills/systematic-project-qa/SKILL.md | 59 + .../assets/issue-template.md | 32 + .../assets/verification-report-template.md | 10 + .../references/checklist.md | 36 + .../references/project-signals.md | 57 + .../scripts/discover-project-contract.py | 195 + .agents/skills/tailwindcss/SKILL.md | 120 + .../skills/tailwindcss/references/patterns.md | 434 + .../tanstack-query-best-practices/SKILL.md | 114 + .../rules/cache-gc-time.md | 93 + .../rules/cache-invalidation.md | 116 + .../rules/cache-placeholder-vs-initial.md | 156 + .../rules/cache-stale-time.md | 80 + .../rules/err-error-boundaries.md | 150 + .../rules/inf-page-params.md | 132 + .../rules/mut-invalidate-queries.md | 118 + .../rules/mut-mutation-state.md | 169 + .../rules/mut-optimistic-updates.md | 137 + .../rules/network-mode.md | 179 + .../rules/parallel-use-queries.md | 152 + .../rules/perf-select-transform.md | 144 + .../rules/persist-queries.md | 194 + .../rules/pf-intent-prefetch.md | 143 + .../rules/qk-array-structure.md | 50 + .../rules/qk-factory-pattern.md | 102 + .../rules/qk-hierarchical-organization.md | 76 + .../rules/qk-include-dependencies.md | 62 + .../rules/qk-serializable.md | 93 + .../rules/query-cancellation.md | 171 + .../rules/ssr-dehydration.md | 158 + .../tanstack-router-best-practices/SKILL.md | 114 + .../rules/ctx-root-context.md | 170 + .../rules/err-not-found.md | 194 + .../rules/load-ensure-query-data.md | 147 + .../rules/load-parallel.md | 186 + .../rules/load-use-loaders.md | 148 + .../rules/nav-link-component.md | 171 + .../rules/nav-route-masks.md | 195 + .../rules/org-virtual-routes.md | 133 + .../rules/preload-intent.md | 133 + .../rules/router-default-options.md | 159 + .../rules/search-custom-serializer.md | 198 + .../rules/search-validation.md | 154 + .../rules/split-lazy-routes.md | 148 + .../rules/ts-register-router.md | 113 + .../rules/ts-use-from-param.md | 130 + .../tanstack-start-best-practices/SKILL.md | 110 + .../rules/api-routes.md | 236 + .../rules/auth-route-protection.md | 188 + .../rules/auth-session-management.md | 189 + .../rules/deploy-adapters.md | 197 + .../rules/env-functions.md | 207 + .../rules/err-server-errors.md | 189 + .../rules/file-separation.md | 151 + .../rules/mw-request-middleware.md | 157 + .../rules/sf-create-server-fn.md | 146 + .../rules/sf-input-validation.md | 168 + .../rules/ssr-hydration-safety.md | 184 + .../rules/ssr-prerender.md | 190 + .../rules/ssr-streaming.md | 201 + .agents/skills/tanstack/SKILL.md | 275 + .../tanstack/references/form-patterns.md | 638 + .../tanstack/references/query-patterns.md | 349 + .../tanstack/references/router-patterns.md | 373 + .agents/skills/tech-logos/SKILL.md | 88 + .agents/skills/testing-anti-patterns/SKILL.md | 309 + .agents/skills/to-prompt/SKILL.md | 90 + .agents/skills/tui-design/SKILL.md | 434 + .../tui-design/references/app-patterns.md | 219 + .../tui-design/references/visual-catalog.md | 278 + .agents/skills/tui-glamorous/SKILL.md | 293 + .../tui-glamorous/references/PROMPTS.md | 243 + .../references/QUICK-REFERENCE.md | 355 + .../references/advanced-patterns.md | 708 + .../references/component-catalog.md | 655 + .../skills/tui-glamorous/references/go-tui.md | 618 + .../references/infrastructure.md | 421 + .../references/production-architecture.md | 2609 ++++ .../tui-glamorous/references/shell-scripts.md | 713 + .agents/skills/typescript-advanced/SKILL.md | 763 + .../references/best-practices.md | 363 + .agents/skills/ubs/SELF-TEST.md | 39 + .agents/skills/ubs/SKILL.md | 197 + .../skills/ubs/references/FALSE-POSITIVES.md | 306 + .agents/skills/ubs/references/TRIAGE.md | 219 + .agents/skills/ubs/references/WORKFLOWS.md | 313 + .agents/skills/ubs/scripts/validate.py | 82 + .../vercel-composition-patterns/AGENTS.md | 946 ++ .../vercel-composition-patterns/SKILL.md | 89 + .../rules/architecture-avoid-boolean-props.md | 100 + .../rules/architecture-compound-components.md | 112 + .../patterns-children-over-render-props.md | 87 + .../rules/patterns-explicit-variants.md | 100 + .../rules/react19-no-forwardref.md | 42 + .../rules/state-context-interface.md | 191 + .../rules/state-decouple-implementation.md | 113 + .../rules/state-lift-state.md | 125 + .../vercel-react-best-practices/AGENTS.md | 2367 +++ .../vercel-react-best-practices/SKILL.md | 127 + .../rules/advanced-event-handler-refs.md | 55 + .../rules/advanced-use-latest.md | 49 + .../rules/async-api-routes.md | 35 + .../rules/async-defer-await.md | 80 + .../rules/async-dependencies.md | 37 + .../rules/async-parallel.md | 24 + .../rules/async-suspense-boundaries.md | 99 + .../rules/bundle-barrel-imports.md | 59 + .../rules/bundle-conditional.md | 37 + .../rules/bundle-defer-third-party.md | 48 + .../rules/bundle-dynamic-imports.md | 34 + .../rules/bundle-preload.md | 44 + .../rules/client-event-listeners.md | 78 + .../rules/client-localstorage-schema.md | 74 + .../rules/client-passive-event-listeners.md | 48 + .../rules/client-swr-dedup.md | 56 + .../rules/js-batch-dom-css.md | 57 + .../rules/js-cache-function-results.md | 80 + .../rules/js-cache-property-access.md | 28 + .../rules/js-cache-storage.md | 68 + .../rules/js-combine-iterations.md | 32 + .../rules/js-early-exit.md | 50 + .../rules/js-hoist-regexp.md | 45 + .../rules/js-index-maps.md | 37 + .../rules/js-length-check-first.md | 50 + .../rules/js-min-max-loop.md | 82 + .../rules/js-set-map-lookups.md | 24 + .../rules/js-tosorted-immutable.md | 57 + .../rules/rendering-activity.md | 26 + .../rules/rendering-animate-svg-wrapper.md | 38 + .../rules/rendering-conditional-render.md | 32 + .../rules/rendering-content-visibility.md | 38 + .../rules/rendering-hoist-jsx.md | 36 + .../rules/rendering-hydration-no-flicker.md | 72 + .../rules/rendering-svg-precision.md | 28 + .../rules/rerender-defer-reads.md | 39 + .../rules/rerender-dependencies.md | 45 + .../rules/rerender-derived-state.md | 29 + .../rules/rerender-functional-setstate.md | 77 + .../rules/rerender-lazy-state-init.md | 56 + .../rules/rerender-memo.md | 44 + .../rules/rerender-transitions.md | 40 + .../rules/server-after-nonblocking.md | 73 + .../rules/server-cache-lru.md | 41 + .../rules/server-cache-react.md | 76 + .../rules/server-parallel-fetching.md | 83 + .../rules/server-serialization.md | 38 + .agents/skills/vitest/GENERATION.md | 5 + .agents/skills/vitest/SKILL.md | 52 + .../references/advanced-environments.md | 264 + .../vitest/references/advanced-projects.md | 300 + .../references/advanced-type-testing.md | 237 + .../skills/vitest/references/advanced-vi.md | 249 + .agents/skills/vitest/references/core-cli.md | 166 + .../skills/vitest/references/core-config.md | 174 + .../skills/vitest/references/core-describe.md | 193 + .../skills/vitest/references/core-expect.md | 219 + .../skills/vitest/references/core-hooks.md | 244 + .../skills/vitest/references/core-test-api.md | 233 + .../vitest/references/features-concurrency.md | 250 + .../vitest/references/features-context.md | 238 + .../vitest/references/features-coverage.md | 207 + .../vitest/references/features-filtering.md | 211 + .../vitest/references/features-mocking.md | 265 + .../vitest/references/features-snapshots.md | 207 + .agents/skills/workflow-memory/SKILL.md | 85 + .../references/memory-guidelines.md | 75 + .agents/skills/zod/AGENTS.md | 97 + .agents/skills/zod/README.md | 79 + .agents/skills/zod/SKILL.md | 128 + .../zod/references/compose-intersection.md | 143 + .../zod/references/compose-lazy-recursive.md | 138 + .agents/skills/zod/references/compose-pipe.md | 114 + .../zod/references/compose-preprocess.md | 131 + .../zod/references/compose-shared-schemas.md | 142 + .../error-avoid-throwing-in-refine.md | 134 + .../zod/references/error-custom-messages.md | 127 + .agents/skills/zod/references/error-i18n.md | 140 + .../zod/references/error-path-for-nested.md | 135 + .../zod/references/error-use-flatten.md | 135 + .../references/object-discriminated-unions.md | 136 + .../object-extend-for-composition.md | 146 + .../references/object-optional-vs-nullable.md | 120 + .../references/object-partial-for-updates.md | 124 + .../skills/zod/references/object-pick-omit.md | 147 + .../zod/references/object-strict-vs-strip.md | 122 + .../parse-async-for-async-refinements.md | 127 + .../parse-avoid-double-validation.md | 130 + .../zod/references/parse-handle-all-issues.md | 126 + .../zod/references/parse-never-trust-json.md | 116 + .../zod/references/parse-use-safeparse.md | 103 + .../zod/references/parse-validate-early.md | 125 + .agents/skills/zod/references/perf-arrays.md | 154 + .../references/perf-avoid-dynamic-creation.md | 142 + .../zod/references/perf-cache-schemas.md | 143 + .../zod/references/perf-lazy-loading.md | 136 + .../skills/zod/references/perf-zod-mini.md | 118 + .../skills/zod/references/refine-add-path.md | 149 + .agents/skills/zod/references/refine-catch.md | 138 + .../skills/zod/references/refine-defaults.md | 132 + .../zod/references/refine-transform-coerce.md | 103 + .../zod/references/refine-vs-superrefine.md | 159 + .../references/schema-avoid-optional-abuse.md | 94 + .../schema-coercion-for-form-data.md | 89 + .../references/schema-string-validations.md | 87 + .../skills/zod/references/schema-use-enums.md | 106 + .../schema-use-primitives-correctly.md | 63 + .../references/schema-use-unknown-not-any.md | 86 + .../zod/references/type-branded-types.md | 106 + .../zod/references/type-enable-strict-mode.md | 132 + .../type-export-schemas-and-types.md | 117 + .../zod/references/type-input-vs-output.md | 116 + .../skills/zod/references/type-use-z-infer.md | 113 + .agents/skills/zustand/SKILL.md | 152 + .agents/skills/zustand/references/patterns.md | 912 ++ .bun-version | 1 + .claude-plugin/marketplace.json | 636 - .claude/agents/architect-advisor.md | 72 + .claude/agents/devils-advocate.md | 72 + .claude/agents/pragmatic-engineer.md | 72 + .claude/agents/product-mind.md | 72 + .claude/agents/security-advocate.md | 72 + .claude/agents/the-thinker.md | 136 + .claude/commands/refac.md | 55 + .claude/productize-runtime.json | 57 - .claude/skills/0-1/SKILL.md | 237 - .../skills/aarrr-growth-diagnostics/SKILL.md | 156 - .claude/skills/ab-test-analysis/SKILL.md | 165 - .../acceptance-criteria-for-ui/SKILL.md | 147 - .claude/skills/accessibility-review/SKILL.md | 226 - .../SKILL.md | 155 - .../SKILL.md | 131 - .../SKILL.md | 130 - .../SKILL.md | 147 - .../SKILL.md | 233 - .../SKILL.md | 131 - .../SKILL.md | 150 - .../SKILL.md | 320 - .../SKILL.md | 223 - .../skills/analyze-feature-requests/SKILL.md | 131 - .claude/skills/analyze/SKILL.md | 144 - .../SKILL.md | 137 - .../SKILL.md | 147 - .claude/skills/autoplan/SKILL.md | 100 - .claude/skills/backend-design/SKILL.md | 158 - .claude/skills/beachhead-segment/SKILL.md | 226 - .claude/skills/behavioral-guidelines/SKILL.md | 130 - .claude/skills/brainstorm/SKILL.md | 138 - .../skills/brand-archetype-strategy/SKILL.md | 142 - .../skills/brand-equity-diagnostics/SKILL.md | 136 - .../SKILL.md | 131 - .claude/skills/build-dashboard/SKILL.md | 152 - .../SKILL.md | 138 - .../skills/business-model-blindspots/SKILL.md | 169 - .claude/skills/business-model-design/SKILL.md | 181 - .../SKILL.md | 113 - .../capital-structure-financing/SKILL.md | 112 - .../SKILL.md | 118 - .../SKILL.md | 160 - .../SKILL.md | 134 - .claude/skills/cohort-analysis/SKILL.md | 195 - .claude/skills/comms-review/SKILL.md | 98 - .../SKILL.md | 156 - .../SKILL.md | 131 - .claude/skills/competitive-brief/SKILL.md | 446 - .../SKILL.md | 286 - .../SKILL.md | 138 - .../SKILL.md | 131 - .../SKILL.md | 316 - .../SKILL.md | 137 - .claude/skills/create-viz/SKILL.md | 143 - .../SKILL.md | 136 - .../SKILL.md | 143 - .../SKILL.md | 176 - .../SKILL.md | 123 - .../ctas-from-copywriting-strategies/SKILL.md | 136 - .../SKILL.md | 149 - .../SKILL.md | 133 - .../skills/data-context-extractor/SKILL.md | 185 - .../SKILL.md | 133 - .claude/skills/data-visualization/SKILL.md | 171 - .../SKILL.md | 152 - .../SKILL.md | 139 - .../decision-rights-using-davci/SKILL.md | 158 - .../SKILL.md | 131 - .../SKILL.md | 615 - .claude/skills/design-critique/SKILL.md | 210 - .claude/skills/design-handoff/SKILL.md | 229 - .claude/skills/design-review/SKILL.md | 99 - .claude/skills/design-system/SKILL.md | 296 - .../SKILL.md | 146 - .../SKILL.md | 140 - .../SKILL.md | 130 - .claude/skills/docs/SKILL.md | 171 - .claude/skills/dogfood/SKILL.md | 209 - .claude/skills/draft-nda/SKILL.md | 245 - .../SKILL.md | 159 - .claude/skills/dx-review/SKILL.md | 243 - .../SKILL.md | 142 - .../SKILL.md | 162 - .claude/skills/empathy-maps/SKILL.md | 175 - .claude/skills/eng-review/SKILL.md | 223 - .../SKILL.md | 130 - .../SKILL.md | 130 - .../SKILL.md | 252 - .../executive-and-update-review/SKILL.md | 146 - .../SKILL.md | 136 - .claude/skills/explore-data/SKILL.md | 277 - .../SKILL.md | 138 - .../SKILL.md | 141 - .../SKILL.md | 158 - .../skills/finance-modeling-kernel/SKILL.md | 143 - .../skills/financial-markets-context/SKILL.md | 107 - .../SKILL.md | 422 - .../SKILL.md | 126 - .claude/skills/frontend-design/SKILL.md | 153 - .../SKILL.md | 137 - .../SKILL.md | 168 - .claude/skills/grow/SKILL.md | 99 - .claude/skills/growth-loops/SKILL.md | 206 - .../SKILL.md | 153 - .../SKILL.md | 140 - .claude/skills/gtm-motions/SKILL.md | 236 - .claude/skills/gtm-strategy/SKILL.md | 175 - .../SKILL.md | 150 - .../SKILL.md | 148 - .claude/skills/implementation-notes/SKILL.md | 252 - .../skills/industry-trend-strategy/SKILL.md | 145 - .../SKILL.md | 129 - .../SKILL.md | 159 - .../SKILL.md | 167 - .../SKILL.md | 164 - .../SKILL.md | 179 - .../SKILL.md | 132 - .claude/skills/lean-canvas/SKILL.md | 202 - .../SKILL.md | 141 - .../SKILL.md | 149 - .../skills/managerial-finance-dcf/SKILL.md | 120 - .../SKILL.md | 129 - .../SKILL.md | 150 - .claude/skills/market-opportunity/SKILL.md | 224 - .../skills/market-orientation-audit/SKILL.md | 163 - .../SKILL.md | 128 - .claude/skills/market-sizing/SKILL.md | 170 - .../SKILL.md | 133 - .../SKILL.md | 135 - .../SKILL.md | 180 - .../SKILL.md | 152 - .../SKILL.md | 148 - .../SKILL.md | 170 - .claude/skills/metrics-review/SKILL.md | 152 - .claude/skills/monetization-strategy/SKILL.md | 231 - .../multi-step-workflow-optimization/SKILL.md | 204 - .../SKILL.md | 134 - .../netmba-competitor-analysis/SKILL.md | 176 - .claude/skills/north-star-metric/SKILL.md | 155 - .../SKILL.md | 137 - .../SKILL.md | 164 - .../SKILL.md | 128 - .../SKILL.md | 125 - .../SKILL.md | 137 - .../SKILL.md | 146 - .claude/skills/operate/SKILL.md | 100 - .../SKILL.md | 189 - .claude/skills/outcome-roadmap/SKILL.md | 148 - .claude/skills/plg-growth-playbook/SKILL.md | 215 - .../SKILL.md | 712 - .claude/skills/pmf-review/SKILL.md | 195 - .../SKILL.md | 147 - .../SKILL.md | 546 - .../skills/post-launch-feedback-loop/SKILL.md | 182 - .../SKILL.md | 126 - .../SKILL.md | 176 - .../SKILL.md | 176 - .claude/skills/pre-mortem/SKILL.md | 194 - .../SKILL.md | 135 - .../SKILL.md | 132 - .../SKILL.md | 158 - .../SKILL.md | 174 - .claude/skills/pricing-strategy/SKILL.md | 167 - .../skills/prioritization-frameworks/SKILL.md | 157 - .claude/skills/privacy-policy/SKILL.md | 323 - .../SKILL.md | 250 - .../SKILL.md | 155 - .../SKILL.md | 163 - .claude/skills/product-brainstorming/SKILL.md | 137 - .../SKILL.md | 130 - .../SKILL.md | 142 - .../SKILL.md | 129 - .../SKILL.md | 129 - .../skills/product-market-fit-cycle/SKILL.md | 154 - .../SKILL.md | 210 - .../SKILL.md | 134 - .claude/skills/product-review/SKILL.md | 190 - .../SKILL.md | 137 - .../SKILL.md | 134 - .claude/skills/product-vision/SKILL.md | 133 - .../SKILL.md | 180 - .../SKILL.md | 136 - .../SKILL.md | 135 - .claude/skills/qa/SKILL.md | 220 - .../raw-interview-transcript-cleanup/SKILL.md | 118 - .../SKILL.md | 141 - .../SKILL.md | 121 - .claude/skills/release-notes/SKILL.md | 145 - .claude/skills/release/SKILL.md | 207 - .../SKILL.md | 163 - .../SKILL.md | 333 - .../SKILL.md | 210 - .../risk-return-cost-of-capital/SKILL.md | 111 - .../SKILL.md | 139 - .claude/skills/roadmap-update/SKILL.md | 132 - .../SKILL.md | 149 - .../SKILL.md | 156 - .../SKILL.md | 134 - .../SKILL.md | 775 - .../SKILL.md | 130 - .../skimmable-writing-transformation/SKILL.md | 191 - .../SKILL.md | 165 - .../SKILL.md | 133 - .../SKILL.md | 168 - .claude/skills/spec-writing/SKILL.md | 170 - .claude/skills/sprint-planning/SKILL.md | 133 - .claude/skills/sql-queries/SKILL.md | 385 - .../SKILL.md | 144 - .../SKILL.md | 311 - .../SKILL.md | 155 - .../SKILL.md | 174 - .../SKILL.md | 168 - .../SKILL.md | 170 - .claude/skills/stakeholder-update/SKILL.md | 158 - .claude/skills/startup-canvas/SKILL.md | 219 - .claude/skills/statistical-analysis/SKILL.md | 247 - .../SKILL.md | 156 - .../SKILL.md | 167 - .../SKILL.md | 163 - .../SKILL.md | 133 - .../skills/strategy-curve-blue-ocean/SKILL.md | 142 - .../SKILL.md | 149 - .../SKILL.md | 817 - .../SKILL.md | 200 - .../SKILL.md | 138 - .../SKILL.md | 141 - .../SKILL.md | 156 - .../SKILL.md | 154 - .../SKILL.md | 162 - .../SKILL.md | 133 - .../SKILL.md | 122 - .../SKILL.md | 234 - .../SKILL.md | 128 - .../sustainable-business-model/SKILL.md | 168 - .claude/skills/synthesize-research/SKILL.md | 136 - .claude/skills/systematic-debugging/SKILL.md | 177 - .../SKILL.md | 162 - .../SKILL.md | 135 - .../SKILL.md | 121 - .claude/skills/tdd/SKILL.md | 177 - .../SKILL.md | 148 - .../SKILL.md | 140 - .claude/skills/test-scenarios/SKILL.md | 167 - .claude/skills/thesis-review/SKILL.md | 201 - .../SKILL.md | 135 - .../SKILL.md | 124 - .../SKILL.md | 142 - .../SKILL.md | 132 - .../SKILL.md | 127 - .claude/skills/validate-data/SKILL.md | 267 - .../valuation-and-deal-pricing/SKILL.md | 156 - .../SKILL.md | 128 - .../venture-capital-deal-modeling/SKILL.md | 112 - .claude/skills/verification/SKILL.md | 167 - .../visual-decision-making-review/SKILL.md | 147 - .../SKILL.md | 180 - .claude/skills/write-query/SKILL.md | 210 - .claude/skills/write-spec/SKILL.md | 136 - .claude/skills/writing-plans/SKILL.md | 157 - .claude/skills/wwas/SKILL.md | 150 - .coderabbit.yaml | 52 + .commitlintrc.yaml | 19 + .cursor/productize-runtime.json | 57 - .../productize-behavioral-guidelines/SKILL.md | 130 - .../references/diagnostic-questions.md | 60 - .../references/output-format.md | 41 - .../assets/lean-business-model-canvas.html | 192 - .../platform-business-model-canvas.html | 254 - .../standard-business-model-canvas.html | 146 - .../references/business-model-output-rules.md | 64 - .../references/canvas-selection.md | 27 - .../references/canvas-templates.md | 203 - .../references/pm-skills-main-merge.md | 140 - .../references/pm-skills-main-merge.md | 191 - .../references/domain-template.md | 136 - .../references/example-generated-skill.md | 191 - .../references/skill-template.md | 144 - .../references/sql-dialects.md | 109 - .../references/tables/README.md | 3 - .../scripts/package_data_skill.py | 145 - .../references/issue-taxonomy.md | 101 - .../templates/dogfood-report-template.md | 101 - .../references/pm-skills-main-merge.md | 113 - .../finance-modeling-kernel/apv.py | 10 - .../finance-modeling-kernel/bond_math.py | 36 - .../finance-modeling-kernel/cap_table.py | 19 - .../capital_structure.py | 51 - .../finance-modeling-kernel/capm.py | 21 - .../convertible_notes.py | 27 - .../finance-modeling-kernel/dcf.py | 73 - .../finance-modeling-kernel/market_context.py | 34 - .../finance-modeling-kernel/option_pools.py | 22 - .../preferred_stock.py | 19 - .../finance-modeling-kernel/returns.py | 48 - .../finance-modeling-kernel/risk.py | 41 - .../finance-modeling-kernel/safes.py | 15 - .../finance-modeling-kernel/time_value.py | 42 - .../finance-modeling-kernel/validation.py | 33 - .../finance-modeling-kernel/valuation.py | 55 - .../finance-modeling-kernel/vc_method.py | 57 - .../finance-modeling-kernel/wacc.py | 9 - .../references/pm-skills-main-merge.md | 171 - .../references/canonical-canvases.md | 234 - .../references/output-formats.md | 143 - .../references/rating-and-decision-rules.md | 250 - .../references/pm-skills-main-merge.md | 71 - .../references/pm-skills-main-merge.md | 58 - .../references/pm-skills-main-merge.md | 75 - .../references/pm-skills-main-merge.md | 59 - .../references/pm-skills-main-merge.md | 61 - .../references/output-format.md | 56 - .../references/pattern-groups.md | 30 - .../references/pm-skills-main-merge.md | 81 - .../references/pm-skills-main-merge.md | 94 - .../references/pm-skills-main-merge.md | 92 - .cursor/skills/productize/SKILL.md | 185 - .editorconfig | 26 + .factory/productize-runtime.json | 57 - .factory/skills/productize-0-1/SKILL.md | 237 - .../SKILL.md | 156 - .../productize-ab-test-analysis/SKILL.md | 165 - .../SKILL.md | 147 - .../productize-accessibility-review/SKILL.md | 226 - .../SKILL.md | 155 - .../SKILL.md | 131 - .../SKILL.md | 130 - .../SKILL.md | 147 - .../SKILL.md | 233 - .../SKILL.md | 131 - .../SKILL.md | 150 - .../SKILL.md | 320 - .../SKILL.md | 223 - .../SKILL.md | 131 - .factory/skills/productize-analyze/SKILL.md | 144 - .../SKILL.md | 137 - .../SKILL.md | 147 - .factory/skills/productize-autoplan/SKILL.md | 100 - .../skills/productize-backend-design/SKILL.md | 158 - .../productize-beachhead-segment/SKILL.md | 226 - .../productize-behavioral-guidelines/SKILL.md | 130 - .../skills/productize-brainstorm/SKILL.md | 138 - .../SKILL.md | 142 - .../SKILL.md | 136 - .../SKILL.md | 131 - .../productize-build-dashboard/SKILL.md | 152 - .../SKILL.md | 138 - .../SKILL.md | 169 - .../references/diagnostic-questions.md | 60 - .../references/output-format.md | 41 - .../productize-business-model-design/SKILL.md | 181 - .../assets/lean-business-model-canvas.html | 192 - .../platform-business-model-canvas.html | 254 - .../standard-business-model-canvas.html | 146 - .../references/business-model-output-rules.md | 64 - .../references/canvas-selection.md | 27 - .../references/canvas-templates.md | 203 - .../references/pm-skills-main-merge.md | 140 - .../SKILL.md | 113 - .../SKILL.md | 112 - .../SKILL.md | 118 - .../SKILL.md | 160 - .../SKILL.md | 134 - .../productize-cohort-analysis/SKILL.md | 195 - .../skills/productize-comms-review/SKILL.md | 98 - .../SKILL.md | 156 - .../SKILL.md | 131 - .../productize-competitive-brief/SKILL.md | 446 - .../references/pm-skills-main-merge.md | 191 - .../SKILL.md | 286 - .../SKILL.md | 138 - .../SKILL.md | 131 - .../SKILL.md | 316 - .../SKILL.md | 137 - .../skills/productize-create-viz/SKILL.md | 143 - .../SKILL.md | 136 - .../SKILL.md | 143 - .../SKILL.md | 176 - .../SKILL.md | 123 - .../SKILL.md | 136 - .../SKILL.md | 149 - .../SKILL.md | 133 - .../SKILL.md | 185 - .../references/domain-template.md | 136 - .../references/example-generated-skill.md | 191 - .../references/skill-template.md | 144 - .../references/sql-dialects.md | 109 - .../references/tables/README.md | 3 - .../scripts/package_data_skill.py | 145 - .../SKILL.md | 133 - .../productize-data-visualization/SKILL.md | 171 - .../SKILL.md | 152 - .../SKILL.md | 139 - .../SKILL.md | 158 - .../SKILL.md | 131 - .../SKILL.md | 615 - .../productize-design-critique/SKILL.md | 210 - .../skills/productize-design-handoff/SKILL.md | 229 - .../skills/productize-design-review/SKILL.md | 99 - .../skills/productize-design-system/SKILL.md | 296 - .../SKILL.md | 146 - .../SKILL.md | 140 - .../SKILL.md | 130 - .factory/skills/productize-docs/SKILL.md | 171 - .factory/skills/productize-dogfood/SKILL.md | 209 - .../references/issue-taxonomy.md | 101 - .../templates/dogfood-report-template.md | 101 - .factory/skills/productize-draft-nda/SKILL.md | 245 - .../SKILL.md | 159 - .factory/skills/productize-dx-review/SKILL.md | 243 - .../SKILL.md | 142 - .../SKILL.md | 162 - .../references/pm-skills-main-merge.md | 113 - .../skills/productize-empathy-maps/SKILL.md | 175 - .../skills/productize-eng-review/SKILL.md | 223 - .../SKILL.md | 130 - .../SKILL.md | 130 - .../SKILL.md | 252 - .../SKILL.md | 146 - .../SKILL.md | 136 - .../skills/productize-explore-data/SKILL.md | 277 - .../SKILL.md | 138 - .../SKILL.md | 141 - .../SKILL.md | 158 - .../SKILL.md | 143 - .../finance-modeling-kernel/apv.py | 10 - .../finance-modeling-kernel/bond_math.py | 36 - .../finance-modeling-kernel/cap_table.py | 19 - .../capital_structure.py | 51 - .../finance-modeling-kernel/capm.py | 21 - .../convertible_notes.py | 27 - .../finance-modeling-kernel/dcf.py | 73 - .../finance-modeling-kernel/market_context.py | 34 - .../finance-modeling-kernel/option_pools.py | 22 - .../preferred_stock.py | 19 - .../finance-modeling-kernel/returns.py | 48 - .../finance-modeling-kernel/risk.py | 41 - .../finance-modeling-kernel/safes.py | 15 - .../finance-modeling-kernel/time_value.py | 42 - .../finance-modeling-kernel/validation.py | 33 - .../finance-modeling-kernel/valuation.py | 55 - .../finance-modeling-kernel/vc_method.py | 57 - .../finance-modeling-kernel/wacc.py | 9 - .../SKILL.md | 107 - .../SKILL.md | 422 - .../SKILL.md | 126 - .../productize-frontend-design/SKILL.md | 153 - .../SKILL.md | 137 - .../SKILL.md | 168 - .factory/skills/productize-grow/SKILL.md | 99 - .../skills/productize-growth-loops/SKILL.md | 206 - .../SKILL.md | 153 - .../SKILL.md | 140 - .../skills/productize-gtm-motions/SKILL.md | 236 - .../skills/productize-gtm-strategy/SKILL.md | 175 - .../SKILL.md | 150 - .../references/pm-skills-main-merge.md | 171 - .../SKILL.md | 148 - .../productize-implementation-notes/SKILL.md | 252 - .../SKILL.md | 145 - .../SKILL.md | 129 - .../SKILL.md | 159 - .../SKILL.md | 167 - .../SKILL.md | 164 - .../SKILL.md | 179 - .../SKILL.md | 132 - .../skills/productize-lean-canvas/SKILL.md | 202 - .../SKILL.md | 141 - .../SKILL.md | 149 - .../SKILL.md | 120 - .../SKILL.md | 129 - .../SKILL.md | 150 - .../productize-market-opportunity/SKILL.md | 224 - .../references/canonical-canvases.md | 234 - .../references/output-formats.md | 143 - .../references/rating-and-decision-rules.md | 250 - .../SKILL.md | 163 - .../SKILL.md | 128 - .../skills/productize-market-sizing/SKILL.md | 170 - .../SKILL.md | 133 - .../SKILL.md | 135 - .../SKILL.md | 180 - .../SKILL.md | 152 - .../SKILL.md | 148 - .../SKILL.md | 170 - .../skills/productize-metrics-review/SKILL.md | 152 - .../productize-monetization-strategy/SKILL.md | 231 - .../SKILL.md | 204 - .../SKILL.md | 134 - .../SKILL.md | 176 - .../productize-north-star-metric/SKILL.md | 155 - .../SKILL.md | 137 - .../SKILL.md | 164 - .../SKILL.md | 128 - .../SKILL.md | 125 - .../SKILL.md | 137 - .../SKILL.md | 146 - .factory/skills/productize-operate/SKILL.md | 100 - .../SKILL.md | 189 - .../references/pm-skills-main-merge.md | 71 - .../productize-outcome-roadmap/SKILL.md | 148 - .../productize-plg-growth-playbook/SKILL.md | 215 - .../SKILL.md | 712 - .../skills/productize-pmf-review/SKILL.md | 195 - .../SKILL.md | 147 - .../references/pm-skills-main-merge.md | 58 - .../SKILL.md | 546 - .../SKILL.md | 182 - .../SKILL.md | 126 - .../SKILL.md | 176 - .../SKILL.md | 176 - .../skills/productize-pre-mortem/SKILL.md | 194 - .../SKILL.md | 135 - .../SKILL.md | 132 - .../SKILL.md | 158 - .../SKILL.md | 174 - .../productize-pricing-strategy/SKILL.md | 167 - .../SKILL.md | 157 - .../skills/productize-privacy-policy/SKILL.md | 323 - .../SKILL.md | 250 - .../SKILL.md | 155 - .../SKILL.md | 163 - .../productize-product-brainstorming/SKILL.md | 137 - .../SKILL.md | 130 - .../SKILL.md | 142 - .../SKILL.md | 129 - .../SKILL.md | 129 - .../SKILL.md | 154 - .../SKILL.md | 210 - .../SKILL.md | 134 - .../skills/productize-product-review/SKILL.md | 190 - .../SKILL.md | 137 - .../SKILL.md | 134 - .../skills/productize-product-vision/SKILL.md | 133 - .../SKILL.md | 180 - .../references/pm-skills-main-merge.md | 75 - .../SKILL.md | 136 - .../SKILL.md | 135 - .factory/skills/productize-qa/SKILL.md | 220 - .../SKILL.md | 118 - .../SKILL.md | 141 - .../SKILL.md | 121 - .../skills/productize-release-notes/SKILL.md | 145 - .factory/skills/productize-release/SKILL.md | 207 - .../SKILL.md | 163 - .../SKILL.md | 333 - .../SKILL.md | 210 - .../SKILL.md | 111 - .../SKILL.md | 139 - .../skills/productize-roadmap-update/SKILL.md | 132 - .../SKILL.md | 149 - .../SKILL.md | 156 - .../SKILL.md | 134 - .../SKILL.md | 775 - .../SKILL.md | 130 - .../SKILL.md | 191 - .../SKILL.md | 165 - .../SKILL.md | 133 - .../SKILL.md | 168 - .../skills/productize-spec-writing/SKILL.md | 170 - .../productize-sprint-planning/SKILL.md | 133 - .../skills/productize-sql-queries/SKILL.md | 385 - .../SKILL.md | 144 - .../SKILL.md | 311 - .../SKILL.md | 155 - .../SKILL.md | 174 - .../SKILL.md | 168 - .../references/pm-skills-main-merge.md | 59 - .../SKILL.md | 170 - .../productize-stakeholder-update/SKILL.md | 158 - .../skills/productize-startup-canvas/SKILL.md | 219 - .../productize-statistical-analysis/SKILL.md | 247 - .../SKILL.md | 156 - .../SKILL.md | 167 - .../SKILL.md | 163 - .../SKILL.md | 133 - .../SKILL.md | 142 - .../SKILL.md | 149 - .../SKILL.md | 817 - .../SKILL.md | 200 - .../SKILL.md | 138 - .../SKILL.md | 141 - .../references/pm-skills-main-merge.md | 61 - .../SKILL.md | 156 - .../SKILL.md | 154 - .../SKILL.md | 162 - .../SKILL.md | 133 - .../SKILL.md | 122 - .../SKILL.md | 234 - .../SKILL.md | 128 - .../SKILL.md | 168 - .../references/output-format.md | 56 - .../references/pattern-groups.md | 30 - .../productize-synthesize-research/SKILL.md | 136 - .../productize-systematic-debugging/SKILL.md | 177 - .../SKILL.md | 162 - .../SKILL.md | 135 - .../SKILL.md | 121 - .factory/skills/productize-tdd/SKILL.md | 177 - .../SKILL.md | 148 - .../SKILL.md | 140 - .../skills/productize-test-scenarios/SKILL.md | 167 - .../skills/productize-thesis-review/SKILL.md | 201 - .../SKILL.md | 135 - .../SKILL.md | 124 - .../SKILL.md | 142 - .../references/pm-skills-main-merge.md | 81 - .../SKILL.md | 132 - .../SKILL.md | 127 - .../skills/productize-validate-data/SKILL.md | 267 - .../SKILL.md | 156 - .../SKILL.md | 128 - .../SKILL.md | 112 - .../skills/productize-verification/SKILL.md | 167 - .../SKILL.md | 147 - .../SKILL.md | 180 - .../skills/productize-write-query/SKILL.md | 210 - .../references/pm-skills-main-merge.md | 94 - .../skills/productize-write-spec/SKILL.md | 136 - .../references/pm-skills-main-merge.md | 92 - .../skills/productize-writing-plans/SKILL.md | 157 - .factory/skills/productize-wwas/SKILL.md | 150 - .factory/skills/productize/SKILL.md | 185 - .gitattributes | 12 - .github/CODEOWNERS | 1 + .github/actions/setup-bun/action.yml | 66 + .github/actions/setup-git-cliff/action.yml | 98 + .github/actions/setup-go/action.yml | 47 + .github/actions/setup-node/action.yml | 28 + .github/actions/setup-release/action.yml | 158 + .github/codeql/codeql-config.yml | 47 + .github/versions.yml | 27 + .github/workflows/auto-docs.yml | 171 + .github/workflows/ci.yml | 111 +- .github/workflows/claude.yml | 49 + .github/workflows/evals-periodic.yml | 34 - .github/workflows/evals.yml | 75 - .github/workflows/release.yml | 227 + .github/workflows/skill-docs.yml | 34 - .github/workflows/version-gate.yml | 30 - .gitignore | 33 +- .golangci.yml | 109 + .goreleaser.release-footer.md.tmpl | 17 + .goreleaser.release-header.md.tmpl | 23 + .goreleaser.yml | 225 + .husky/commit-msg | 1 + .husky/pre-commit | 1 + .opencode/productize-runtime.json | 57 - .opencode/skills/productize-0-1/SKILL.md | 237 - .../SKILL.md | 156 - .../productize-ab-test-analysis/SKILL.md | 165 - .../SKILL.md | 147 - .../productize-accessibility-review/SKILL.md | 226 - .../SKILL.md | 155 - .../SKILL.md | 131 - .../SKILL.md | 130 - .../SKILL.md | 147 - .../SKILL.md | 233 - .../SKILL.md | 131 - .../SKILL.md | 150 - .../SKILL.md | 320 - .../SKILL.md | 223 - .../SKILL.md | 131 - .opencode/skills/productize-analyze/SKILL.md | 144 - .../SKILL.md | 137 - .../SKILL.md | 147 - .opencode/skills/productize-autoplan/SKILL.md | 100 - .../skills/productize-backend-design/SKILL.md | 158 - .../productize-beachhead-segment/SKILL.md | 226 - .../productize-behavioral-guidelines/SKILL.md | 130 - .../skills/productize-brainstorm/SKILL.md | 138 - .../SKILL.md | 142 - .../SKILL.md | 136 - .../SKILL.md | 131 - .../productize-build-dashboard/SKILL.md | 152 - .../SKILL.md | 138 - .../SKILL.md | 169 - .../references/diagnostic-questions.md | 60 - .../references/output-format.md | 41 - .../productize-business-model-design/SKILL.md | 181 - .../assets/lean-business-model-canvas.html | 192 - .../platform-business-model-canvas.html | 254 - .../standard-business-model-canvas.html | 146 - .../references/business-model-output-rules.md | 64 - .../references/canvas-selection.md | 27 - .../references/canvas-templates.md | 203 - .../references/pm-skills-main-merge.md | 140 - .../SKILL.md | 113 - .../SKILL.md | 112 - .../SKILL.md | 118 - .../SKILL.md | 160 - .../SKILL.md | 134 - .../productize-cohort-analysis/SKILL.md | 195 - .../skills/productize-comms-review/SKILL.md | 98 - .../SKILL.md | 156 - .../SKILL.md | 131 - .../productize-competitive-brief/SKILL.md | 446 - .../references/pm-skills-main-merge.md | 191 - .../SKILL.md | 286 - .../SKILL.md | 138 - .../SKILL.md | 131 - .../SKILL.md | 316 - .../SKILL.md | 137 - .../skills/productize-create-viz/SKILL.md | 143 - .../SKILL.md | 136 - .../SKILL.md | 143 - .../SKILL.md | 176 - .../SKILL.md | 123 - .../SKILL.md | 136 - .../SKILL.md | 149 - .../SKILL.md | 133 - .../SKILL.md | 185 - .../references/domain-template.md | 136 - .../references/example-generated-skill.md | 191 - .../references/skill-template.md | 144 - .../references/sql-dialects.md | 109 - .../references/tables/README.md | 3 - .../scripts/package_data_skill.py | 145 - .../SKILL.md | 133 - .../productize-data-visualization/SKILL.md | 171 - .../SKILL.md | 152 - .../SKILL.md | 139 - .../SKILL.md | 158 - .../SKILL.md | 131 - .../SKILL.md | 615 - .../productize-design-critique/SKILL.md | 210 - .../skills/productize-design-handoff/SKILL.md | 229 - .../skills/productize-design-review/SKILL.md | 99 - .../skills/productize-design-system/SKILL.md | 296 - .../SKILL.md | 146 - .../SKILL.md | 140 - .../SKILL.md | 130 - .opencode/skills/productize-docs/SKILL.md | 171 - .opencode/skills/productize-dogfood/SKILL.md | 209 - .../references/issue-taxonomy.md | 101 - .../templates/dogfood-report-template.md | 101 - .../skills/productize-draft-nda/SKILL.md | 245 - .../SKILL.md | 159 - .../skills/productize-dx-review/SKILL.md | 243 - .../SKILL.md | 142 - .../SKILL.md | 162 - .../references/pm-skills-main-merge.md | 113 - .../skills/productize-empathy-maps/SKILL.md | 175 - .../skills/productize-eng-review/SKILL.md | 223 - .../SKILL.md | 130 - .../SKILL.md | 130 - .../SKILL.md | 252 - .../SKILL.md | 146 - .../SKILL.md | 136 - .../skills/productize-explore-data/SKILL.md | 277 - .../SKILL.md | 138 - .../SKILL.md | 141 - .../SKILL.md | 158 - .../SKILL.md | 143 - .../finance-modeling-kernel/apv.py | 10 - .../finance-modeling-kernel/bond_math.py | 36 - .../finance-modeling-kernel/cap_table.py | 19 - .../capital_structure.py | 51 - .../finance-modeling-kernel/capm.py | 21 - .../convertible_notes.py | 27 - .../finance-modeling-kernel/dcf.py | 73 - .../finance-modeling-kernel/market_context.py | 34 - .../finance-modeling-kernel/option_pools.py | 22 - .../preferred_stock.py | 19 - .../finance-modeling-kernel/returns.py | 48 - .../finance-modeling-kernel/risk.py | 41 - .../finance-modeling-kernel/safes.py | 15 - .../finance-modeling-kernel/time_value.py | 42 - .../finance-modeling-kernel/validation.py | 33 - .../finance-modeling-kernel/valuation.py | 55 - .../finance-modeling-kernel/vc_method.py | 57 - .../finance-modeling-kernel/wacc.py | 9 - .../SKILL.md | 107 - .../SKILL.md | 422 - .../SKILL.md | 126 - .../productize-frontend-design/SKILL.md | 153 - .../SKILL.md | 137 - .../SKILL.md | 168 - .opencode/skills/productize-grow/SKILL.md | 99 - .../skills/productize-growth-loops/SKILL.md | 206 - .../SKILL.md | 153 - .../SKILL.md | 140 - .../skills/productize-gtm-motions/SKILL.md | 236 - .../skills/productize-gtm-strategy/SKILL.md | 175 - .../SKILL.md | 150 - .../references/pm-skills-main-merge.md | 171 - .../SKILL.md | 148 - .../productize-implementation-notes/SKILL.md | 252 - .../SKILL.md | 145 - .../SKILL.md | 129 - .../SKILL.md | 159 - .../SKILL.md | 167 - .../SKILL.md | 164 - .../SKILL.md | 179 - .../SKILL.md | 132 - .../skills/productize-lean-canvas/SKILL.md | 202 - .../SKILL.md | 141 - .../SKILL.md | 149 - .../SKILL.md | 120 - .../SKILL.md | 129 - .../SKILL.md | 150 - .../productize-market-opportunity/SKILL.md | 224 - .../references/canonical-canvases.md | 234 - .../references/output-formats.md | 143 - .../references/rating-and-decision-rules.md | 250 - .../SKILL.md | 163 - .../SKILL.md | 128 - .../skills/productize-market-sizing/SKILL.md | 170 - .../SKILL.md | 133 - .../SKILL.md | 135 - .../SKILL.md | 180 - .../SKILL.md | 152 - .../SKILL.md | 148 - .../SKILL.md | 170 - .../skills/productize-metrics-review/SKILL.md | 152 - .../productize-monetization-strategy/SKILL.md | 231 - .../SKILL.md | 204 - .../SKILL.md | 134 - .../SKILL.md | 176 - .../productize-north-star-metric/SKILL.md | 155 - .../SKILL.md | 137 - .../SKILL.md | 164 - .../SKILL.md | 128 - .../SKILL.md | 125 - .../SKILL.md | 137 - .../SKILL.md | 146 - .opencode/skills/productize-operate/SKILL.md | 100 - .../SKILL.md | 189 - .../references/pm-skills-main-merge.md | 71 - .../productize-outcome-roadmap/SKILL.md | 148 - .../productize-plg-growth-playbook/SKILL.md | 215 - .../SKILL.md | 712 - .../skills/productize-pmf-review/SKILL.md | 195 - .../SKILL.md | 147 - .../references/pm-skills-main-merge.md | 58 - .../SKILL.md | 546 - .../SKILL.md | 182 - .../SKILL.md | 126 - .../SKILL.md | 176 - .../SKILL.md | 176 - .../skills/productize-pre-mortem/SKILL.md | 194 - .../SKILL.md | 135 - .../SKILL.md | 132 - .../SKILL.md | 158 - .../SKILL.md | 174 - .../productize-pricing-strategy/SKILL.md | 167 - .../SKILL.md | 157 - .../skills/productize-privacy-policy/SKILL.md | 323 - .../SKILL.md | 250 - .../SKILL.md | 155 - .../SKILL.md | 163 - .../productize-product-brainstorming/SKILL.md | 137 - .../SKILL.md | 130 - .../SKILL.md | 142 - .../SKILL.md | 129 - .../SKILL.md | 129 - .../SKILL.md | 154 - .../SKILL.md | 210 - .../SKILL.md | 134 - .../skills/productize-product-review/SKILL.md | 190 - .../SKILL.md | 137 - .../SKILL.md | 134 - .../skills/productize-product-vision/SKILL.md | 133 - .../SKILL.md | 180 - .../references/pm-skills-main-merge.md | 75 - .../SKILL.md | 136 - .../SKILL.md | 135 - .opencode/skills/productize-qa/SKILL.md | 220 - .../SKILL.md | 118 - .../SKILL.md | 141 - .../SKILL.md | 121 - .../skills/productize-release-notes/SKILL.md | 145 - .opencode/skills/productize-release/SKILL.md | 207 - .../SKILL.md | 163 - .../SKILL.md | 333 - .../SKILL.md | 210 - .../SKILL.md | 111 - .../SKILL.md | 139 - .../skills/productize-roadmap-update/SKILL.md | 132 - .../SKILL.md | 149 - .../SKILL.md | 156 - .../SKILL.md | 134 - .../SKILL.md | 775 - .../SKILL.md | 130 - .../SKILL.md | 191 - .../SKILL.md | 165 - .../SKILL.md | 133 - .../SKILL.md | 168 - .../skills/productize-spec-writing/SKILL.md | 170 - .../productize-sprint-planning/SKILL.md | 133 - .../skills/productize-sql-queries/SKILL.md | 385 - .../SKILL.md | 144 - .../SKILL.md | 311 - .../SKILL.md | 155 - .../SKILL.md | 174 - .../SKILL.md | 168 - .../references/pm-skills-main-merge.md | 59 - .../SKILL.md | 170 - .../productize-stakeholder-update/SKILL.md | 158 - .../skills/productize-startup-canvas/SKILL.md | 219 - .../productize-statistical-analysis/SKILL.md | 247 - .../SKILL.md | 156 - .../SKILL.md | 167 - .../SKILL.md | 163 - .../SKILL.md | 133 - .../SKILL.md | 142 - .../SKILL.md | 149 - .../SKILL.md | 817 - .../SKILL.md | 200 - .../SKILL.md | 138 - .../SKILL.md | 141 - .../references/pm-skills-main-merge.md | 61 - .../SKILL.md | 156 - .../SKILL.md | 154 - .../SKILL.md | 162 - .../SKILL.md | 133 - .../SKILL.md | 122 - .../SKILL.md | 234 - .../SKILL.md | 128 - .../SKILL.md | 168 - .../references/output-format.md | 56 - .../references/pattern-groups.md | 30 - .../productize-synthesize-research/SKILL.md | 136 - .../productize-systematic-debugging/SKILL.md | 177 - .../SKILL.md | 162 - .../SKILL.md | 135 - .../SKILL.md | 121 - .opencode/skills/productize-tdd/SKILL.md | 177 - .../SKILL.md | 148 - .../SKILL.md | 140 - .../skills/productize-test-scenarios/SKILL.md | 167 - .../skills/productize-thesis-review/SKILL.md | 201 - .../SKILL.md | 135 - .../SKILL.md | 124 - .../SKILL.md | 142 - .../references/pm-skills-main-merge.md | 81 - .../SKILL.md | 132 - .../SKILL.md | 127 - .../skills/productize-validate-data/SKILL.md | 267 - .../SKILL.md | 156 - .../SKILL.md | 128 - .../SKILL.md | 112 - .../skills/productize-verification/SKILL.md | 167 - .../SKILL.md | 147 - .../SKILL.md | 180 - .../skills/productize-write-query/SKILL.md | 210 - .../references/pm-skills-main-merge.md | 94 - .../skills/productize-write-spec/SKILL.md | 136 - .../references/pm-skills-main-merge.md | 92 - .../skills/productize-writing-plans/SKILL.md | 157 - .opencode/skills/productize-wwas/SKILL.md | 150 - .opencode/skills/productize/SKILL.md | 185 - .oxfmtrc.json | 29 + .oxlintrc.json | 123 + .pre-commit-config.yaml | 46 + .prettierignore | 5 + .release-notes/.gitkeep | 0 .../v0.2.0/daemon-architecture-1777593047.md | 84 + .../v0.2.0/daemon-web-ui-1777593047.md | 58 + .../global-config-defaults-1776266427.md | 48 + ...den-runtime-activity-version-1777593047.md | 28 + .../migrate-infer-task-type-1777593047.md | 20 + ...ions-on-run-lifecycle-events-1776266427.md | 52 + .../per-task-runtime-overrides-1777593047.md | 62 + .../v0.2.0/review-watch-mode-1777593047.md | 78 + .../force-archive-confirmation-1777919380.md | 63 + .../qa-workflow-extension-1777919380.md | 74 + .../workspace-register-path-fix-1777919380.md | 70 + .yamlfix.toml | 7 + AGENTS.md | 202 + CHANGELOG.md | 299 +- CLAUDE.md | 202 + CONTRIBUTING.md | 99 + Makefile | 161 + README.md | 1126 +- RELEASE.md | 9 - RELEASE_BODY.md | 8 + SKILL.md | 186 - SKILL.md.tmpl | 73 - UPGRADE.md | 15 - VERSION | 1 - agents/README.md | 4 + agents/embed.go | 8 + assets/productize.png | Bin 11756 -> 0 bytes aur-pkg/PKGBUILD | 24 + aur-pkg/PKGBUILD-src | 44 + aur-pkg/README.md | 21 + aur-pkg/TODO.md | 65 + bin/productize-artifact-log | 12 - bin/productize-completion-status | 17 - bin/productize-config | 38 - bin/productize-context-restore | 9 - bin/productize-context-save | 9 - bin/productize-registry-search | 19 - bin/productize-routing.mjs | 184 - bin/productize-runtime.mjs | 323 - bin/productize-session-log | 12 - bin/productize-skill-router | 11 - bin/productize-team-init | 75 - bin/productize-update-check | 30 - bin/productize-upgrade | 48 - bin/productize-workflow | 106 - bun.lock | 1936 +++ cliff.toml | 168 + cmd/productize/main.go | 184 + cmd/productize/main_test.go | 275 + .../Productize Daemon Workspace.html | 109 + .../daemon-mockup/assets/productize-icon.png | Bin 0 -> 558230 bytes .../assets/providers/claude-code.svg | 1 + .../daemon-mockup/assets/providers/codex.svg | 1 + .../daemon-mockup/assets/providers/gemini.svg | 1 + .../daemon-mockup/assets/providers/ollama.svg | 6 + .../assets/providers/opencode.svg | 5 + docs/design/daemon-mockup/colors_and_type.css | 253 + .../daemon-mockup/fonts/Disket-Mono-Bold.ttf | Bin 0 -> 90660 bytes .../fonts/Disket-Mono-Regular.ttf | Bin 0 -> 84204 bytes .../daemon-mockup/fonts/Nippo-Variable.woff2 | Bin 0 -> 29108 bytes docs/design/daemon-mockup/src/dashboard.jsx | 281 + docs/design/daemon-mockup/src/data.jsx | 383 + docs/design/daemon-mockup/src/icons.jsx | 251 + docs/design/daemon-mockup/src/memory.jsx | 137 + docs/design/daemon-mockup/src/reviews.jsx | 276 + docs/design/daemon-mockup/src/runs.jsx | 232 + docs/design/daemon-mockup/src/shell.jsx | 233 + docs/design/daemon-mockup/src/spec.jsx | 167 + docs/design/daemon-mockup/src/task_detail.jsx | 124 + docs/design/daemon-mockup/src/tasks.jsx | 152 + docs/design/daemon-mockup/src/workflows.jsx | 139 + docs/events.md | 694 + docs/examples/agents/repo-copilot/AGENT.md | 12 + docs/examples/agents/repo-copilot/mcp.json | 15 + docs/examples/agents/reviewer/AGENT.md | 10 + docs/extensibility/architecture.md | 98 + docs/extensibility/capability-reference.md | 49 + docs/extensibility/getting-started.md | 74 + docs/extensibility/hello-world-go.md | 87 + docs/extensibility/hello-world-ts.md | 91 + docs/extensibility/hook-reference.md | 110 + docs/extensibility/host-api-reference.md | 153 + docs/extensibility/index.md | 40 + docs/extensibility/migration-guide.md | 54 + docs/extensibility/testing.md | 103 + docs/extensibility/trust-and-enablement.md | 79 + .../2026-04-17-productize-daemon-design.md | 452 + .../plans/2026-04-21-hot-reload-dev-design.md | 116 + docs/reader-library.md | 138 + docs/reusable-agents.md | 165 + evals/ai-builder-router-cases.json | 42 - evals/decision-making-router-cases.json | 47 - evals/e2e-cases.json | 111 - evals/executive-product-ops-router-cases.json | 28 - evals/existing-product-router-cases.json | 161 - evals/finance-router-cases.json | 65 - evals/llm-cases.json | 177 - evals/qa-router-cases.json | 8 - evals/zero-to-one-router-cases.json | 89 - .../agents/architect-advisor/AGENT.md | 37 + .../agents/devils-advocate/AGENT.md | 38 + .../agents/pragmatic-engineer/AGENT.md | 37 + .../idea-factory/agents/product-mind/AGENT.md | 37 + .../agents/security-advocate/AGENT.md | 37 + .../idea-factory/agents/the-thinker/AGENT.md | 37 + extensions/idea-factory/extension.toml | 12 + .../idea-factory/skills/idea-factory/SKILL.md | 218 + .../idea-factory/references/adr-template.md | 55 + .../references/business-analyst.md | 99 + .../skills/idea-factory/references/council.md | 169 + .../idea-factory/references/idea-template.md | 130 + .../references/product-strategist.md | 129 + .../references/question-protocol.md | 94 + extensions/productize/README.md | 22 + extensions/productize/extension.toml | 11 + .../skills/productize-0-1/SKILL.md | 0 .../skills/productize-0-1/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-ab-test-analysis/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-accessibility-review/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-analyze/SKILL.md | 0 .../productize-analyze/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-autoplan/SKILL.md | 0 .../productize-autoplan/agents/openai.yaml | 0 .../skills/productize-backend-design/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-beachhead-segment/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-behavioral-guidelines/SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-brainstorm/SKILL.md | 0 .../productize-brainstorm/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-build-dashboard/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/diagnostic-questions.md | 0 .../references/output-format.md | 0 .../productize-business-model-design/SKILL.md | 0 .../agents/openai.yaml | 0 .../assets/lean-business-model-canvas.html | 0 .../platform-business-model-canvas.html | 0 .../standard-business-model-canvas.html | 0 .../references/business-model-output-rules.md | 0 .../references/canvas-selection.md | 0 .../references/canvas-templates.md | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-cohort-analysis/SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-comms-review/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-competitive-brief/SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-create-viz/SKILL.md | 0 .../productize-create-viz/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/domain-template.md | 0 .../references/example-generated-skill.md | 0 .../references/skill-template.md | 0 .../references/sql-dialects.md | 0 .../references/tables/README.md | 0 .../scripts/package_data_skill.py | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-data-visualization/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-design-critique/SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-design-handoff/SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-design-review/SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-design-system/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-docs/SKILL.md | 0 .../skills/productize-docs/agents/openai.yaml | 0 .../skills/productize-dogfood/SKILL.md | 0 .../productize-dogfood/agents/openai.yaml | 0 .../references/issue-taxonomy.md | 0 .../templates/dogfood-report-template.md | 0 .../skills/productize-draft-nda/SKILL.md | 0 .../productize-draft-nda/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-dx-review/SKILL.md | 0 .../productize-dx-review/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../skills/productize-empathy-maps/SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-eng-review/SKILL.md | 0 .../productize-eng-review/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-explore-data/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../finance-modeling-kernel/apv.py | 0 .../finance-modeling-kernel/bond_math.py | 0 .../finance-modeling-kernel/cap_table.py | 0 .../capital_structure.py | 0 .../finance-modeling-kernel/capm.py | 0 .../convertible_notes.py | 0 .../finance-modeling-kernel/dcf.py | 0 .../finance-modeling-kernel/market_context.py | 0 .../finance-modeling-kernel/option_pools.py | 0 .../preferred_stock.py | 0 .../finance-modeling-kernel/returns.py | 0 .../finance-modeling-kernel/risk.py | 0 .../finance-modeling-kernel/safes.py | 0 .../finance-modeling-kernel/time_value.py | 0 .../finance-modeling-kernel/validation.py | 0 .../finance-modeling-kernel/valuation.py | 0 .../finance-modeling-kernel/vc_method.py | 0 .../finance-modeling-kernel/wacc.py | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-frontend-design/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-grow/SKILL.md | 0 .../skills/productize-grow/agents/openai.yaml | 0 .../skills/productize-growth-loops/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-gtm-motions/SKILL.md | 0 .../productize-gtm-motions/agents/openai.yaml | 0 .../skills/productize-gtm-strategy/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-implementation-notes/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-lean-canvas/SKILL.md | 0 .../productize-lean-canvas/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-market-opportunity/SKILL.md | 0 .../agents/openai.yaml | 0 .../references/canonical-canvases.md | 0 .../references/output-formats.md | 0 .../references/rating-and-decision-rules.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-market-sizing/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-metrics-review/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-monetization-strategy/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-north-star-metric/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-operate/SKILL.md | 0 .../productize-operate/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../productize-outcome-roadmap/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-plg-growth-playbook/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-pmf-review/SKILL.md | 0 .../productize-pmf-review/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-pre-mortem/SKILL.md | 0 .../productize-pre-mortem/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-pricing-strategy/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-privacy-policy/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-product-brainstorming/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-product-review/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-product-vision/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize}/skills/productize-qa/SKILL.md | 0 .../skills/productize-qa/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-release-notes/SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-release/SKILL.md | 0 .../productize-release/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-roadmap-update/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-spec-writing/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-sprint-planning/SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-sql-queries/SKILL.md | 0 .../productize-sql-queries/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-stakeholder-update/SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-startup-canvas/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-statistical-analysis/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/output-format.md | 0 .../references/pattern-groups.md | 0 .../productize-synthesize-research/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-systematic-debugging/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-tdd/SKILL.md | 0 .../skills/productize-tdd/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-test-scenarios/SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-thesis-review/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-validate-data/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-verification/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-write-query/SKILL.md | 0 .../productize-write-query/agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../skills/productize-write-spec/SKILL.md | 0 .../productize-write-spec/agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../skills/productize-writing-plans/SKILL.md | 0 .../agents/openai.yaml | 0 .../skills/productize-wwas/SKILL.md | 0 .../skills/productize-wwas/agents/openai.yaml | 0 .../productize}/skills/productize/SKILL.md | 0 .../skills/productize/agents/openai.yaml | 0 extensions/qa-workflow/extension.toml | 24 + extensions/qa-workflow/main.go | 397 + extensions/qa-workflow/main_test.go | 203 + go.mod | 99 + go.sum | 286 + hosts/claude.mjs | 22 - hosts/claude.ts | 1 - hosts/codex.mjs | 29 - hosts/codex.ts | 1 - hosts/cursor.mjs | 29 - hosts/cursor.ts | 1 - hosts/factory.mjs | 29 - hosts/factory.ts | 1 - hosts/index.mjs | 20 - hosts/opencode.mjs | 29 - hosts/opencode.ts | 1 - hosts/shared.mjs | 97 - imgs/how-it-works-flow.png | Bin 0 -> 1576155 bytes imgs/how-it-works-flow.svg | 200 + imgs/how-it-works.drawio | 121 + imgs/screenshot.png | Bin 0 -> 634642 bytes internal/api/client/client.go | 335 + internal/api/client/client_contract_test.go | 435 + internal/api/client/client_transport_test.go | 904 ++ internal/api/client/operator.go | 212 + internal/api/client/reviews_exec.go | 199 + internal/api/client/reviews_exec_test.go | 496 + internal/api/client/runs.go | 712 + internal/api/client/runs_test.go | 110 + internal/api/contract/compatibility.go | 68 + .../api/contract/contract_integration_test.go | 330 + internal/api/contract/contract_test.go | 796 + internal/api/contract/doc.go | 3 + internal/api/contract/errors.go | 184 + internal/api/contract/routes.go | 266 + internal/api/contract/sse.go | 129 + internal/api/contract/timeout.go | 58 + internal/api/contract/types.go | 685 + internal/api/core/errors.go | 200 + internal/api/core/handlers.go | 1618 ++ internal/api/core/handlers_contract_test.go | 452 + .../api/core/handlers_error_paths_test.go | 414 + .../api/core/handlers_service_errors_test.go | 835 ++ internal/api/core/handlers_smoke_test.go | 660 + internal/api/core/handlers_test.go | 503 + internal/api/core/interfaces.go | 401 + internal/api/core/internal_helpers_test.go | 275 + internal/api/core/middleware.go | 84 + internal/api/core/routes.go | 65 + internal/api/core/sse.go | 181 + internal/api/core/sse_test.go | 236 + internal/api/core/workspace_socket.go | 118 + internal/api/httpapi/browser_middleware.go | 373 + .../api/httpapi/browser_middleware_test.go | 268 + internal/api/httpapi/openapi_contract_test.go | 401 + internal/api/httpapi/routes.go | 15 + internal/api/httpapi/security_headers.go | 54 + internal/api/httpapi/security_headers_test.go | 34 + internal/api/httpapi/server.go | 341 + .../api/httpapi/transport_integration_test.go | 2591 ++++ internal/api/testutil/sse.go | 109 + internal/api/udsapi/routes.go | 12 + internal/api/udsapi/server.go | 326 + internal/charmtheme/theme.go | 42 + internal/charmtheme/theme_test.go | 60 + internal/cli/.productize/catalog/skills.json | 9 + internal/cli/agents_commands.go | 454 + internal/cli/agents_commands_test.go | 803 + .../cli/archive_command_integration_test.go | 85 + internal/cli/command_context.go | 18 + internal/cli/command_context_test.go | 28 + internal/cli/commands.go | 68 + internal/cli/commands_simple.go | 503 + internal/cli/commands_test.go | 124 + internal/cli/daemon.go | 494 + internal/cli/daemon_commands.go | 571 + internal/cli/daemon_commands_test.go | 2602 ++++ internal/cli/daemon_exec_test_helpers_test.go | 611 + internal/cli/daemon_launch_other.go | 9 + internal/cli/daemon_launch_unix.go | 9 + internal/cli/dispatch_adapters.go | 160 + internal/cli/exit.go | 28 + internal/cli/exit_test.go | 17 + internal/cli/extension/display.go | 302 + internal/cli/extension/display_test.go | 1173 ++ internal/cli/extension/doctor.go | 569 + internal/cli/extension/doctor_test.go | 319 + internal/cli/extension/enablement.go | 124 + internal/cli/extension/install.go | 555 + internal/cli/extension/install_source.go | 619 + internal/cli/extension/install_source_test.go | 306 + internal/cli/extension/root.go | 305 + internal/cli/extensions_bootstrap.go | 312 + internal/cli/extensions_bootstrap_test.go | 371 + internal/cli/form.go | 682 + internal/cli/form_daemon_overrides_test.go | 544 + internal/cli/form_test.go | 639 + internal/cli/kernel_dispatch_test.go | 424 + internal/cli/makefile_publish_test.go | 105 + internal/cli/migrate_command_test.go | 83 + .../cli/operator_commands_integration_test.go | 771 + internal/cli/operator_output.go | 37 + .../operator_transport_integration_test.go | 300 + .../cli/reusable_agents_doc_examples_test.go | 135 + internal/cli/reviews_exec_daemon.go | 1405 ++ .../reviews_exec_daemon_additional_test.go | 2097 +++ internal/cli/root.go | 102 + internal/cli/root_command_execution_test.go | 3084 ++++ internal/cli/root_test.go | 2074 +++ internal/cli/run.go | 245 + internal/cli/run_observe.go | 716 + internal/cli/runs.go | 136 + internal/cli/setup.go | 1066 ++ internal/cli/setup_assets.go | 89 + internal/cli/setup_test.go | 377 + internal/cli/skills_preflight.go | 446 + internal/cli/skills_preflight_test.go | 399 + internal/cli/state.go | 646 + internal/cli/task_runtime_flag.go | 143 + internal/cli/task_runtime_flag_test.go | 86 + internal/cli/task_runtime_form.go | 394 + internal/cli/testdata/exec_help.golden | 42 + internal/cli/testdata/tasks_run_help.golden | 36 + internal/cli/theme.go | 221 + internal/cli/theme_test.go | 117 + internal/cli/upgrade.go | 33 + internal/cli/validate_tasks.go | 225 + internal/cli/validate_tasks_test.go | 373 + internal/cli/workspace_commands.go | 349 + internal/cli/workspace_config.go | 239 + internal/cli/workspace_config_test.go | 1174 ++ internal/config/home.go | 192 + internal/config/home_test.go | 238 + internal/contentblock/engine.go | 125 + internal/contentblock/engine_test.go | 119 + internal/core/agent/acp_convert.go | 505 + internal/core/agent/client.go | 1129 ++ internal/core/agent/client_test.go | 2198 +++ internal/core/agent/codex_live_test.go | 76 + internal/core/agent/hooks.go | 111 + internal/core/agent/registry_compat.go | 233 + internal/core/agent/registry_launch.go | 360 + internal/core/agent/registry_overlay.go | 456 + internal/core/agent/registry_overlay_test.go | 255 + internal/core/agent/registry_specs.go | 407 + internal/core/agent/registry_test.go | 1208 ++ internal/core/agent/registry_validate.go | 208 + internal/core/agent/session.go | 264 + internal/core/agent/session_helpers_test.go | 602 + internal/core/agent/session_test.go | 402 + internal/core/agent/terminal.go | 384 + internal/core/agent/tool_call_input.go | 499 + internal/core/agent/tool_call_name.go | 260 + internal/core/agent/tool_call_name_test.go | 65 + internal/core/agents/agents.go | 622 + internal/core/agents/agents_test.go | 591 + internal/core/agents/doc_examples_test.go | 136 + internal/core/agents/execution.go | 158 + internal/core/agents/execution_test.go | 385 + internal/core/agents/mcpserver/engine.go | 296 + internal/core/agents/mcpserver/engine_test.go | 446 + internal/core/agents/mcpserver/server.go | 139 + internal/core/agents/mcpserver/server_test.go | 192 + internal/core/agents/reasons.go | 38 + internal/core/agents/session_mcp.go | 241 + internal/core/agents/session_mcp_test.go | 296 + internal/core/api.go | 427 + internal/core/api_test.go | 135 + internal/core/archive.go | 512 + internal/core/archive_test.go | 650 + internal/core/contentconv/contentconv.go | 285 + internal/core/contentconv/contentconv_test.go | 400 + internal/core/extension/assets.go | 245 + internal/core/extension/assets_test.go | 137 + internal/core/extension/audit.go | 346 + internal/core/extension/audit_test.go | 475 + internal/core/extension/builtin/doc.go | 6 + internal/core/extension/capability.go | 288 + internal/core/extension/capability_test.go | 286 + internal/core/extension/chain.go | 328 + internal/core/extension/daemon_bridge.go | 32 + internal/core/extension/discovery.go | 546 + internal/core/extension/discovery_bundled.go | 20 + internal/core/extension/discovery_test.go | 579 + internal/core/extension/dispatcher.go | 384 + internal/core/extension/dispatcher_test.go | 793 + internal/core/extension/doc.go | 3 + internal/core/extension/enablement.go | 444 + internal/core/extension/enablement_test.go | 381 + .../core/extension/hooks_integration_test.go | 910 ++ internal/core/extension/host_api.go | 209 + internal/core/extension/host_api_errors.go | 120 + internal/core/extension/host_api_test.go | 255 + internal/core/extension/host_helpers.go | 736 + internal/core/extension/host_helpers_test.go | 576 + internal/core/extension/host_reads.go | 189 + internal/core/extension/host_reads_test.go | 287 + internal/core/extension/host_writes.go | 683 + internal/core/extension/host_writes_test.go | 705 + internal/core/extension/manager.go | 405 + internal/core/extension/manager_active.go | 63 + internal/core/extension/manager_constants.go | 7 + internal/core/extension/manager_events.go | 235 + internal/core/extension/manager_health.go | 111 + internal/core/extension/manager_shutdown.go | 141 + internal/core/extension/manager_spawn.go | 847 ++ internal/core/extension/manager_test.go | 1115 ++ internal/core/extension/manifest.go | 259 + internal/core/extension/manifest_load.go | 528 + internal/core/extension/manifest_test.go | 810 + internal/core/extension/manifest_validate.go | 339 + internal/core/extension/origin.go | 67 + internal/core/extension/origin_test.go | 79 + internal/core/extension/provider_entry.go | 113 + .../core/extension/review_provider_bridge.go | 216 + ...review_provider_bridge_integration_test.go | 505 + .../core/extension/review_provider_runtime.go | 84 + .../extension/review_provider_runtime_test.go | 98 + internal/core/extension/runtime.go | 409 + internal/core/extension/runtime_test.go | 453 + .../extension/sdk_manager_integration_test.go | 129 + .../extension/testdata/mock_extension/main.go | 487 + .../extension/testdata/sdk_extension/main.go | 89 + .../testdata/sdk_review_extension/main.go | 111 + .../ts_template_manager_integration_test.go | 356 + internal/core/fetch.go | 397 + internal/core/fetch_test.go | 417 + internal/core/frontmatter/frontmatter.go | 123 + internal/core/frontmatter/frontmatter_test.go | 63 + .../core/kernel/commands/commands_test.go | 472 + internal/core/kernel/commands/doc.go | 2 + .../core/kernel/commands/reviews_fetch.go | 45 + internal/core/kernel/commands/run_start.go | 30 + .../core/kernel/commands/runtime_config.go | 18 + .../core/kernel/commands/workflow_archive.go | 52 + .../core/kernel/commands/workflow_prepare.go | 30 + .../core/kernel/commands/workflow_sync.go | 51 + .../core/kernel/commands/workspace_migrate.go | 57 + internal/core/kernel/core_adapters.go | 129 + internal/core/kernel/core_adapters_test.go | 318 + internal/core/kernel/deps.go | 91 + internal/core/kernel/deps_test.go | 698 + internal/core/kernel/dispatcher.go | 131 + internal/core/kernel/dispatcher_test.go | 227 + internal/core/kernel/doc.go | 2 + internal/core/kernel/handlers.go | 404 + .../core/kernel/handlers_extensions_test.go | 290 + ...run_scope_cancellation_integration_test.go | 243 + .../core/kernel/run_scope_integration_test.go | 122 + internal/core/memory/store.go | 310 + internal/core/memory/store_test.go | 116 + internal/core/migrate.go | 11 + internal/core/migration/migrate.go | 669 + internal/core/migration/migrate_test.go | 826 ++ internal/core/migration/workflow_target.go | 115 + .../core/migration/workflow_target_test.go | 44 + internal/core/model/artifacts.go | 126 + internal/core/model/constants.go | 52 + internal/core/model/content.go | 409 + internal/core/model/content_test.go | 382 + internal/core/model/hook_types.go | 29 + internal/core/model/hooks.go | 47 + internal/core/model/mcp.go | 41 + internal/core/model/model_test.go | 602 + internal/core/model/preparation.go | 98 + internal/core/model/preparation_test.go | 96 + internal/core/model/run_scope.go | 281 + .../core/model/run_scope_internal_test.go | 111 + internal/core/model/runtime_config.go | 111 + internal/core/model/task_review.go | 81 + internal/core/model/task_runtime.go | 166 + internal/core/model/workflow_ops.go | 83 + internal/core/model/workspace_paths.go | 83 + internal/core/modelprovider/overlay.go | 123 + internal/core/modelprovider/overlay_test.go | 49 + internal/core/plan/input.go | 275 + internal/core/plan/journal.go | 39 + internal/core/plan/prepare.go | 1155 ++ internal/core/plan/prepare_test.go | 1911 +++ internal/core/prompt/common.go | 328 + internal/core/prompt/prd.go | 205 + internal/core/prompt/prompt_test.go | 624 + .../prompt/prompts/claude-reasoning-high.txt | 1 + .../prompt/prompts/claude-reasoning-low.txt | 1 + .../prompts/claude-reasoning-medium.txt | 1 + .../prompt/prompts/claude-reasoning-xhigh.txt | 1 + internal/core/prompt/review.go | 146 + internal/core/prompt/templates.go | 37 + .../core/provider/coderabbit/coderabbit.go | 728 + .../provider/coderabbit/coderabbit_test.go | 572 + internal/core/provider/coderabbit/nitpicks.go | 505 + .../core/provider/coderabbit/nitpicks_test.go | 494 + internal/core/provider/overlay.go | 418 + internal/core/provider/overlay_test.go | 330 + internal/core/provider/provider.go | 89 + internal/core/provider/provider_test.go | 38 + internal/core/provider/registry.go | 60 + internal/core/provider/registry_test.go | 44 + internal/core/providerdefaults/defaults.go | 16 + .../core/providerdefaults/defaults_test.go | 67 + internal/core/reviews/parser.go | 218 + internal/core/reviews/parser_test.go | 208 + internal/core/reviews/store.go | 590 + internal/core/reviews/store_test.go | 604 + internal/core/run/exec/aliases.go | 115 + internal/core/run/exec/exec.go | 1464 ++ .../core/run/exec/exec_integration_test.go | 768 + internal/core/run/exec/exec_test.go | 802 + internal/core/run/exec/hooks.go | 203 + internal/core/run/exec/prompt_exec.go | 105 + .../exec/run_agent_engine_integration_test.go | 192 + internal/core/run/exec/test_helpers_test.go | 381 + internal/core/run/exec_facade.go | 21 + internal/core/run/executor/aliases.go | 156 + internal/core/run/executor/event_stream.go | 217 + .../core/run/executor/event_stream_test.go | 192 + internal/core/run/executor/execution.go | 779 + .../execution_acp_integration_test.go | 1655 +++ .../core/run/executor/execution_acp_test.go | 1255 ++ internal/core/run/executor/execution_test.go | 1571 ++ .../core/run/executor/execution_ui_test.go | 558 + internal/core/run/executor/format_helpers.go | 28 + internal/core/run/executor/hooks.go | 272 + internal/core/run/executor/lifecycle.go | 420 + internal/core/run/executor/result.go | 143 + internal/core/run/executor/result_test.go | 313 + internal/core/run/executor/review_hooks.go | 548 + internal/core/run/executor/runner.go | 303 + .../core/run/executor/runtime_guard_test.go | 178 + internal/core/run/executor/shutdown.go | 226 + .../core/run/executor/test_helpers_test.go | 109 + .../core/run/internal/acpshared/aliases.go | 74 + .../core/run/internal/acpshared/command_io.go | 400 + .../run/internal/acpshared/command_io_test.go | 531 + .../run/internal/acpshared/compat_test.go | 11 + .../acpshared/reusable_agent_lifecycle.go | 323 + .../run/internal/acpshared/session_exec.go | 422 + .../run/internal/acpshared/session_handler.go | 471 + .../acpshared/session_handler_test.go | 1321 ++ .../core/run/internal/runshared/buffers.go | 118 + .../run/internal/runshared/buffers_test.go | 24 + .../core/run/internal/runshared/config.go | 198 + .../run/internal/runshared/config_test.go | 40 + .../core/run/internal/runshared/logging.go | 29 + .../core/run/internal/runshared/shutdown.go | 50 + internal/core/run/internal/runshared/types.go | 76 + .../core/run/internal/runtimeevents/events.go | 68 + .../core/run/internal/worktree/snapshot.go | 137 + .../run/internal/worktree/snapshot_test.go | 192 + internal/core/run/journal/journal.go | 766 + internal/core/run/journal/journal_test.go | 831 ++ internal/core/run/preflight.go | 33 + internal/core/run/preflight/preflight.go | 201 + internal/core/run/preflight/preflight_test.go | 312 + .../preflight/preflight_test_helpers_test.go | 36 + internal/core/run/run.go | 30 + internal/core/run/run_test.go | 86 + internal/core/run/test_hooks.go | 16 + internal/core/run/transcript/compat_test.go | 10 + internal/core/run/transcript/model.go | 755 + internal/core/run/transcript/model_test.go | 673 + internal/core/run/transcript/render.go | 155 + .../core/run/transcript/tool_use_summary.go | 291 + internal/core/run/ui/adapter_test.go | 930 ++ internal/core/run/ui/aliases.go | 79 + internal/core/run/ui/bench_test.go | 105 + internal/core/run/ui/layout.go | 67 + internal/core/run/ui/model.go | 925 ++ internal/core/run/ui/model_test.go | 138 + internal/core/run/ui/remote.go | 612 + internal/core/run/ui/remote_test.go | 494 + internal/core/run/ui/sidebar.go | 267 + internal/core/run/ui/styles.go | 229 + internal/core/run/ui/summary.go | 190 + internal/core/run/ui/timeline.go | 531 + internal/core/run/ui/types.go | 256 + internal/core/run/ui/update.go | 914 ++ internal/core/run/ui/update_test.go | 842 ++ internal/core/run/ui/validation_form.go | 315 + internal/core/run/ui/validation_form_test.go | 222 + internal/core/run/ui/view.go | 286 + internal/core/run/ui/view_test.go | 1277 ++ internal/core/sound/player.go | 68 + internal/core/sound/player_test.go | 165 + internal/core/sound/player_unix.go | 34 + internal/core/sound/player_windows.go | 22 + internal/core/sound/presets.go | 160 + internal/core/sound/presets_test.go | 277 + internal/core/sound/runner.go | 24 + internal/core/sound/subscriber.go | 93 + internal/core/sound/subscriber_test.go | 244 + internal/core/subprocess/handshake.go | 129 + internal/core/subprocess/process.go | 333 + internal/core/subprocess/process_unix.go | 51 + internal/core/subprocess/process_unix_test.go | 309 + internal/core/subprocess/process_windows.go | 31 + internal/core/subprocess/transport.go | 137 + internal/core/subprocess/transport_test.go | 338 + internal/core/sync.go | 596 + internal/core/sync_test.go | 999 ++ internal/core/tasks/fix_prompt.go | 35 + internal/core/tasks/fix_prompt_test.go | 54 + internal/core/tasks/parser.go | 230 + internal/core/tasks/parser_test.go | 343 + internal/core/tasks/store.go | 237 + internal/core/tasks/store_test.go | 286 + .../core/tasks/testdata/fix_prompt.golden | 12 + .../tasks/testdata/validate_title_h1.golden | 1 + internal/core/tasks/title.go | 23 + internal/core/tasks/type_remap.go | 50 + internal/core/tasks/type_remap_test.go | 50 + internal/core/tasks/types.go | 71 + internal/core/tasks/types_test.go | 99 + internal/core/tasks/validate.go | 253 + internal/core/tasks/validate_test.go | 348 + internal/core/tasks/walker.go | 88 + internal/core/tasks/walker_test.go | 39 + internal/core/workflow_target.go | 92 + internal/core/workflow_target_test.go | 92 + internal/core/workspace/config.go | 326 + internal/core/workspace/config_merge.go | 391 + internal/core/workspace/config_test.go | 1458 ++ internal/core/workspace/config_types.go | 97 + internal/core/workspace/config_validate.go | 571 + internal/core/workspace_paths_test.go | 31 + internal/daemon/boot.go | 404 + internal/daemon/boot_integration_test.go | 665 + internal/daemon/boot_test.go | 613 + internal/daemon/extension_bridge.go | 245 + internal/daemon/host.go | 458 + internal/daemon/host_runtime_test.go | 141 + internal/daemon/info.go | 151 + internal/daemon/info_lock_test.go | 321 + internal/daemon/lock.go | 185 + internal/daemon/process_unix.go | 18 + internal/daemon/process_windows.go | 24 + internal/daemon/purge_test.go | 165 + internal/daemon/query_documents.go | 354 + internal/daemon/query_helpers_test.go | 406 + internal/daemon/query_kinds.go | 14 + internal/daemon/query_models.go | 275 + internal/daemon/query_service.go | 1337 ++ internal/daemon/query_service_test.go | 554 + internal/daemon/reconcile.go | 245 + internal/daemon/reconcile_test.go | 257 + .../daemon/review_exec_transport_service.go | 469 + .../review_exec_transport_service_test.go | 506 + internal/daemon/review_watch.go | 1294 ++ internal/daemon/review_watch_git.go | 145 + internal/daemon/review_watch_git_test.go | 282 + internal/daemon/review_watch_hooks.go | 342 + internal/daemon/review_watch_test.go | 1654 +++ internal/daemon/run_integrity.go | 223 + internal/daemon/run_integrity_test.go | 267 + internal/daemon/run_manager.go | 2804 ++++ internal/daemon/run_manager_bench_test.go | 62 + internal/daemon/run_manager_test.go | 3260 ++++ internal/daemon/run_snapshot.go | 409 + internal/daemon/run_snapshot_compact.go | 136 + internal/daemon/run_snapshot_test.go | 251 + internal/daemon/run_transcript.go | 407 + internal/daemon/run_transcript_test.go | 169 + internal/daemon/runtime.go | 127 + internal/daemon/runtime_test.go | 150 + internal/daemon/service.go | 469 + internal/daemon/service_test.go | 220 + internal/daemon/shutdown.go | 334 + internal/daemon/shutdown_test.go | 197 + internal/daemon/signal_other.go | 14 + internal/daemon/signal_unix.go | 15 + internal/daemon/sync_transport_service.go | 139 + .../daemon/sync_transport_service_test.go | 137 + internal/daemon/task_transport_service.go | 299 + internal/daemon/transport_mappers.go | 574 + internal/daemon/transport_read_models_test.go | 670 + internal/daemon/transport_service_test.go | 426 + internal/daemon/watcher_error_test.go | 64 + internal/daemon/watchers.go | 553 + internal/daemon/watchers_test.go | 422 + internal/daemon/workspace_events.go | 233 + internal/daemon/workspace_refresh.go | 191 + .../daemon/workspace_transport_service.go | 113 + internal/logger/logger.go | 321 + internal/logger/logger_test.go | 194 + internal/setup/agents.go | 378 + internal/setup/agents_test.go | 155 + internal/setup/bundle.go | 64 + internal/setup/bundle_test.go | 100 + internal/setup/catalog.go | 70 + internal/setup/catalog_effective.go | 311 + internal/setup/catalog_effective_test.go | 132 + internal/setup/catalog_export.go | 92 + internal/setup/catalog_export_test.go | 52 + internal/setup/catalog_helpers.go | 24 + internal/setup/catalog_test.go | 26 + internal/setup/extensions.go | 510 + internal/setup/extensions_test.go | 339 + internal/setup/install.go | 389 + internal/setup/install_test.go | 408 + internal/setup/legacy_cleanup.go | 159 + internal/setup/legacy_cleanup_test.go | 138 + internal/setup/reusable_agent_sources.go | 443 + internal/setup/reusable_agent_sources_test.go | 169 + internal/setup/reusable_agents.go | 180 + .../reusable_agents_test_helpers_test.go | 40 + internal/setup/runtime_agents.go | 30 + internal/setup/select.go | 54 + internal/setup/skills_selected.go | 114 + internal/setup/types.go | 332 + internal/setup/verify.go | 336 + internal/setup/verify_test.go | 621 + internal/store/globaldb/archive.go | 435 + internal/store/globaldb/archive_test.go | 491 + internal/store/globaldb/close_test.go | 79 + internal/store/globaldb/global_db.go | 111 + internal/store/globaldb/migrations.go | 335 + internal/store/globaldb/migrations_test.go | 271 + .../store/globaldb/query_coverage_test.go | 228 + internal/store/globaldb/read_queries.go | 402 + internal/store/globaldb/read_queries_test.go | 277 + internal/store/globaldb/registry.go | 1271 ++ .../globaldb/registry_integration_test.go | 200 + internal/store/globaldb/registry_test.go | 645 + internal/store/globaldb/reviews.go | 179 + internal/store/globaldb/run_status.go | 20 + internal/store/globaldb/runs.go | 429 + internal/store/globaldb/runs_test.go | 448 + internal/store/globaldb/sync.go | 1299 ++ internal/store/globaldb/sync_test.go | 1243 ++ internal/store/rundb/close_test.go | 77 + internal/store/rundb/migrations.go | 256 + internal/store/rundb/migrations_test.go | 270 + internal/store/rundb/run_db.go | 1864 +++ internal/store/rundb/run_db_bench_test.go | 135 + internal/store/rundb/run_db_test.go | 758 + internal/store/schema.go | 16 + internal/store/sqlite.go | 221 + internal/store/sqlite_test.go | 73 + internal/store/store.go | 15 + internal/store/values.go | 64 + internal/update/check.go | 218 + internal/update/check_test.go | 426 + internal/update/install.go | 163 + internal/update/install_test.go | 161 + internal/update/state.go | 89 + internal/update/state_test.go | 117 + internal/version/version.go | 14 + openapi/productize-daemon.json | 3151 ++++ package.json | 151 +- pkg/productize/events/bus.go | 236 + pkg/productize/events/bus_integration_test.go | 121 + pkg/productize/events/bus_test.go | 301 + pkg/productize/events/doc.go | 2 + pkg/productize/events/docs_test.go | 89 + pkg/productize/events/event.go | 101 + pkg/productize/events/event_test.go | 550 + pkg/productize/events/kinds/content_block.go | 302 + pkg/productize/events/kinds/doc.go | 2 + pkg/productize/events/kinds/extension.go | 54 + pkg/productize/events/kinds/job.go | 77 + .../events/kinds/payload_compat_test.go | 158 + pkg/productize/events/kinds/provider.go | 34 + pkg/productize/events/kinds/reusable_agent.go | 55 + .../events/kinds/reusable_agent_test.go | 36 + pkg/productize/events/kinds/review.go | 55 + pkg/productize/events/kinds/run.go | 61 + pkg/productize/events/kinds/session.go | 110 + pkg/productize/events/kinds/session_test.go | 317 + pkg/productize/events/kinds/shutdown.go | 26 + pkg/productize/events/kinds/task.go | 43 + pkg/productize/events/kinds/tool_call.go | 31 + pkg/productize/events/kinds/usage.go | 38 + pkg/productize/runs/channels.go | 40 + pkg/productize/runs/doc.go | 3 + pkg/productize/runs/examples_test.go | 226 + pkg/productize/runs/helpers_test.go | 103 + pkg/productize/runs/integration_test.go | 556 + pkg/productize/runs/layout/layout.go | 47 + pkg/productize/runs/layout/layout_test.go | 57 + pkg/productize/runs/list_test.go | 77 + pkg/productize/runs/remote_watch.go | 358 + pkg/productize/runs/remote_watch_test.go | 220 + pkg/productize/runs/replay.go | 117 + pkg/productize/runs/run.go | 593 + pkg/productize/runs/run_test.go | 86 + pkg/productize/runs/status.go | 56 + pkg/productize/runs/summary.go | 88 + pkg/productize/runs/tail.go | 104 + pkg/productize/runs/tail_test.go | 139 + pkg/productize/runs/test_helpers_test.go | 288 + pkg/productize/runs/transport_test.go | 367 + pkg/productize/runs/watch.go | 156 + pkg/productize/runs/watch_test.go | 73 + .../.codex-plugin/plugin.json | 31 - .../skills/productize-backend-design/SKILL.md | 158 - .../SKILL.md | 159 - .../skills/productize-dx-review/SKILL.md | 243 - .../skills/productize-eng-review/SKILL.md | 223 - .../SKILL.md | 130 - .../SKILL.md | 158 - .../productize-implementation-notes/SKILL.md | 252 - .../skills/productize-spec-writing/SKILL.md | 170 - .../productize-systematic-debugging/SKILL.md | 177 - .../skills/productize-tdd/SKILL.md | 177 - .../SKILL.md | 148 - .../skills/productize-verification/SKILL.md | 167 - .../skills/productize-writing-plans/SKILL.md | 157 - .../productize-all/.codex-plugin/plugin.json | 31 - .../skills/productize-0-1/SKILL.md | 237 - .../skills/productize-0-1/agents/openai.yaml | 8 - .../SKILL.md | 156 - .../agents/openai.yaml | 8 - .../productize-ab-test-analysis/SKILL.md | 165 - .../agents/openai.yaml | 8 - .../SKILL.md | 147 - .../agents/openai.yaml | 8 - .../productize-accessibility-review/SKILL.md | 226 - .../agents/openai.yaml | 8 - .../SKILL.md | 155 - .../agents/openai.yaml | 8 - .../SKILL.md | 131 - .../agents/openai.yaml | 8 - .../SKILL.md | 130 - .../agents/openai.yaml | 8 - .../SKILL.md | 147 - .../agents/openai.yaml | 8 - .../SKILL.md | 233 - .../agents/openai.yaml | 8 - .../SKILL.md | 131 - .../agents/openai.yaml | 8 - .../SKILL.md | 150 - .../agents/openai.yaml | 8 - .../SKILL.md | 320 - .../agents/openai.yaml | 8 - .../SKILL.md | 223 - .../agents/openai.yaml | 8 - .../SKILL.md | 131 - .../agents/openai.yaml | 8 - .../skills/productize-analyze/SKILL.md | 144 - .../productize-analyze/agents/openai.yaml | 8 - .../SKILL.md | 137 - .../agents/openai.yaml | 8 - .../SKILL.md | 147 - .../agents/openai.yaml | 8 - .../skills/productize-autoplan/SKILL.md | 100 - .../productize-autoplan/agents/openai.yaml | 8 - .../skills/productize-backend-design/SKILL.md | 158 - .../agents/openai.yaml | 8 - .../productize-beachhead-segment/SKILL.md | 226 - .../agents/openai.yaml | 8 - .../productize-behavioral-guidelines/SKILL.md | 130 - .../agents/openai.yaml | 8 - .../skills/productize-brainstorm/SKILL.md | 138 - .../productize-brainstorm/agents/openai.yaml | 8 - .../SKILL.md | 142 - .../agents/openai.yaml | 8 - .../SKILL.md | 136 - .../agents/openai.yaml | 8 - .../SKILL.md | 131 - .../agents/openai.yaml | 8 - .../productize-build-dashboard/SKILL.md | 152 - .../agents/openai.yaml | 8 - .../SKILL.md | 138 - .../agents/openai.yaml | 8 - .../SKILL.md | 169 - .../agents/openai.yaml | 8 - .../references/diagnostic-questions.md | 60 - .../references/output-format.md | 41 - .../productize-business-model-design/SKILL.md | 181 - .../agents/openai.yaml | 8 - .../assets/lean-business-model-canvas.html | 192 - .../platform-business-model-canvas.html | 254 - .../standard-business-model-canvas.html | 146 - .../references/business-model-output-rules.md | 64 - .../references/canvas-selection.md | 27 - .../references/canvas-templates.md | 203 - .../references/pm-skills-main-merge.md | 140 - .../SKILL.md | 113 - .../agents/openai.yaml | 8 - .../SKILL.md | 112 - .../agents/openai.yaml | 8 - .../SKILL.md | 118 - .../agents/openai.yaml | 8 - .../SKILL.md | 160 - .../agents/openai.yaml | 8 - .../SKILL.md | 134 - .../agents/openai.yaml | 8 - .../productize-cohort-analysis/SKILL.md | 195 - .../agents/openai.yaml | 8 - .../skills/productize-comms-review/SKILL.md | 98 - .../agents/openai.yaml | 8 - .../SKILL.md | 156 - .../agents/openai.yaml | 8 - .../SKILL.md | 131 - .../agents/openai.yaml | 8 - .../productize-competitive-brief/SKILL.md | 446 - .../agents/openai.yaml | 8 - .../references/pm-skills-main-merge.md | 191 - .../SKILL.md | 286 - .../agents/openai.yaml | 8 - .../SKILL.md | 138 - .../agents/openai.yaml | 8 - .../SKILL.md | 131 - .../agents/openai.yaml | 8 - .../SKILL.md | 316 - .../agents/openai.yaml | 8 - .../SKILL.md | 137 - .../agents/openai.yaml | 8 - .../skills/productize-create-viz/SKILL.md | 143 - .../productize-create-viz/agents/openai.yaml | 8 - .../SKILL.md | 136 - .../agents/openai.yaml | 8 - .../SKILL.md | 143 - .../agents/openai.yaml | 8 - .../SKILL.md | 176 - .../agents/openai.yaml | 8 - .../SKILL.md | 123 - .../agents/openai.yaml | 8 - .../SKILL.md | 136 - .../agents/openai.yaml | 8 - .../SKILL.md | 149 - .../agents/openai.yaml | 8 - .../SKILL.md | 133 - .../agents/openai.yaml | 8 - .../SKILL.md | 185 - .../agents/openai.yaml | 8 - .../references/domain-template.md | 136 - .../references/example-generated-skill.md | 191 - .../references/skill-template.md | 144 - .../references/sql-dialects.md | 109 - .../references/tables/README.md | 3 - .../scripts/package_data_skill.py | 145 - .../SKILL.md | 133 - .../agents/openai.yaml | 8 - .../productize-data-visualization/SKILL.md | 171 - .../SKILL.md | 152 - .../agents/openai.yaml | 8 - .../SKILL.md | 139 - .../agents/openai.yaml | 8 - .../SKILL.md | 158 - .../agents/openai.yaml | 8 - .../SKILL.md | 131 - .../agents/openai.yaml | 8 - .../SKILL.md | 615 - .../agents/openai.yaml | 8 - .../productize-design-critique/SKILL.md | 210 - .../agents/openai.yaml | 8 - .../skills/productize-design-handoff/SKILL.md | 229 - .../agents/openai.yaml | 8 - .../skills/productize-design-review/SKILL.md | 99 - .../agents/openai.yaml | 8 - .../skills/productize-design-system/SKILL.md | 296 - .../agents/openai.yaml | 8 - .../SKILL.md | 146 - .../agents/openai.yaml | 8 - .../SKILL.md | 140 - .../agents/openai.yaml | 8 - .../SKILL.md | 130 - .../agents/openai.yaml | 8 - .../skills/productize-docs/SKILL.md | 171 - .../skills/productize-docs/agents/openai.yaml | 8 - .../skills/productize-dogfood/SKILL.md | 209 - .../productize-dogfood/agents/openai.yaml | 8 - .../references/issue-taxonomy.md | 101 - .../templates/dogfood-report-template.md | 101 - .../skills/productize-draft-nda/SKILL.md | 245 - .../productize-draft-nda/agents/openai.yaml | 8 - .../SKILL.md | 159 - .../agents/openai.yaml | 8 - .../skills/productize-dx-review/SKILL.md | 243 - .../productize-dx-review/agents/openai.yaml | 8 - .../SKILL.md | 142 - .../agents/openai.yaml | 8 - .../SKILL.md | 162 - .../agents/openai.yaml | 8 - .../references/pm-skills-main-merge.md | 113 - .../skills/productize-empathy-maps/SKILL.md | 175 - .../agents/openai.yaml | 8 - .../skills/productize-eng-review/SKILL.md | 223 - .../productize-eng-review/agents/openai.yaml | 8 - .../SKILL.md | 130 - .../agents/openai.yaml | 8 - .../SKILL.md | 130 - .../agents/openai.yaml | 8 - .../SKILL.md | 252 - .../agents/openai.yaml | 8 - .../SKILL.md | 146 - .../agents/openai.yaml | 8 - .../SKILL.md | 136 - .../agents/openai.yaml | 8 - .../skills/productize-explore-data/SKILL.md | 277 - .../agents/openai.yaml | 8 - .../SKILL.md | 138 - .../agents/openai.yaml | 8 - .../SKILL.md | 141 - .../agents/openai.yaml | 8 - .../SKILL.md | 158 - .../agents/openai.yaml | 8 - .../SKILL.md | 143 - .../agents/openai.yaml | 8 - .../finance-modeling-kernel/apv.py | 10 - .../finance-modeling-kernel/bond_math.py | 36 - .../finance-modeling-kernel/cap_table.py | 19 - .../capital_structure.py | 51 - .../finance-modeling-kernel/capm.py | 21 - .../convertible_notes.py | 27 - .../finance-modeling-kernel/dcf.py | 73 - .../finance-modeling-kernel/market_context.py | 34 - .../finance-modeling-kernel/option_pools.py | 22 - .../preferred_stock.py | 19 - .../finance-modeling-kernel/returns.py | 48 - .../finance-modeling-kernel/risk.py | 41 - .../finance-modeling-kernel/safes.py | 15 - .../finance-modeling-kernel/time_value.py | 42 - .../finance-modeling-kernel/validation.py | 33 - .../finance-modeling-kernel/valuation.py | 55 - .../finance-modeling-kernel/vc_method.py | 57 - .../finance-modeling-kernel/wacc.py | 9 - .../SKILL.md | 107 - .../agents/openai.yaml | 8 - .../SKILL.md | 422 - .../agents/openai.yaml | 8 - .../SKILL.md | 126 - .../agents/openai.yaml | 8 - .../productize-frontend-design/SKILL.md | 153 - .../agents/openai.yaml | 8 - .../SKILL.md | 137 - .../agents/openai.yaml | 8 - .../SKILL.md | 168 - .../agents/openai.yaml | 8 - .../skills/productize-grow/SKILL.md | 99 - .../skills/productize-grow/agents/openai.yaml | 8 - .../skills/productize-growth-loops/SKILL.md | 206 - .../agents/openai.yaml | 8 - .../SKILL.md | 153 - .../agents/openai.yaml | 8 - .../SKILL.md | 140 - .../agents/openai.yaml | 8 - .../skills/productize-gtm-motions/SKILL.md | 236 - .../productize-gtm-motions/agents/openai.yaml | 8 - .../skills/productize-gtm-strategy/SKILL.md | 175 - .../agents/openai.yaml | 8 - .../SKILL.md | 150 - .../agents/openai.yaml | 8 - .../references/pm-skills-main-merge.md | 171 - .../SKILL.md | 148 - .../agents/openai.yaml | 8 - .../productize-implementation-notes/SKILL.md | 252 - .../agents/openai.yaml | 8 - .../SKILL.md | 145 - .../agents/openai.yaml | 8 - .../SKILL.md | 129 - .../agents/openai.yaml | 8 - .../SKILL.md | 159 - .../agents/openai.yaml | 8 - .../SKILL.md | 167 - .../agents/openai.yaml | 8 - .../SKILL.md | 164 - .../agents/openai.yaml | 8 - .../SKILL.md | 179 - .../agents/openai.yaml | 8 - .../SKILL.md | 132 - .../agents/openai.yaml | 8 - .../skills/productize-lean-canvas/SKILL.md | 202 - .../productize-lean-canvas/agents/openai.yaml | 8 - .../SKILL.md | 141 - .../agents/openai.yaml | 8 - .../SKILL.md | 149 - .../agents/openai.yaml | 8 - .../SKILL.md | 120 - .../agents/openai.yaml | 8 - .../SKILL.md | 129 - .../agents/openai.yaml | 8 - .../SKILL.md | 150 - .../agents/openai.yaml | 8 - .../productize-market-opportunity/SKILL.md | 224 - .../agents/openai.yaml | 8 - .../references/canonical-canvases.md | 234 - .../references/output-formats.md | 143 - .../references/rating-and-decision-rules.md | 250 - .../SKILL.md | 163 - .../agents/openai.yaml | 8 - .../SKILL.md | 128 - .../agents/openai.yaml | 8 - .../skills/productize-market-sizing/SKILL.md | 170 - .../agents/openai.yaml | 8 - .../SKILL.md | 133 - .../agents/openai.yaml | 8 - .../SKILL.md | 135 - .../agents/openai.yaml | 8 - .../SKILL.md | 180 - .../agents/openai.yaml | 8 - .../SKILL.md | 152 - .../agents/openai.yaml | 8 - .../SKILL.md | 148 - .../agents/openai.yaml | 8 - .../SKILL.md | 170 - .../agents/openai.yaml | 8 - .../skills/productize-metrics-review/SKILL.md | 152 - .../agents/openai.yaml | 8 - .../productize-monetization-strategy/SKILL.md | 231 - .../agents/openai.yaml | 8 - .../SKILL.md | 204 - .../agents/openai.yaml | 8 - .../SKILL.md | 134 - .../agents/openai.yaml | 8 - .../SKILL.md | 176 - .../agents/openai.yaml | 8 - .../productize-north-star-metric/SKILL.md | 155 - .../agents/openai.yaml | 8 - .../SKILL.md | 137 - .../agents/openai.yaml | 8 - .../SKILL.md | 164 - .../agents/openai.yaml | 8 - .../SKILL.md | 128 - .../agents/openai.yaml | 8 - .../SKILL.md | 125 - .../agents/openai.yaml | 8 - .../SKILL.md | 137 - .../agents/openai.yaml | 8 - .../SKILL.md | 146 - .../agents/openai.yaml | 8 - .../skills/productize-operate/SKILL.md | 100 - .../productize-operate/agents/openai.yaml | 8 - .../SKILL.md | 189 - .../agents/openai.yaml | 8 - .../references/pm-skills-main-merge.md | 71 - .../productize-outcome-roadmap/SKILL.md | 148 - .../agents/openai.yaml | 8 - .../productize-plg-growth-playbook/SKILL.md | 215 - .../agents/openai.yaml | 8 - .../SKILL.md | 712 - .../agents/openai.yaml | 8 - .../skills/productize-pmf-review/SKILL.md | 195 - .../productize-pmf-review/agents/openai.yaml | 8 - .../SKILL.md | 147 - .../agents/openai.yaml | 8 - .../references/pm-skills-main-merge.md | 58 - .../SKILL.md | 546 - .../agents/openai.yaml | 8 - .../SKILL.md | 182 - .../agents/openai.yaml | 8 - .../SKILL.md | 126 - .../agents/openai.yaml | 8 - .../SKILL.md | 176 - .../agents/openai.yaml | 8 - .../SKILL.md | 176 - .../agents/openai.yaml | 8 - .../skills/productize-pre-mortem/SKILL.md | 194 - .../productize-pre-mortem/agents/openai.yaml | 8 - .../SKILL.md | 135 - .../agents/openai.yaml | 8 - .../SKILL.md | 132 - .../agents/openai.yaml | 8 - .../SKILL.md | 158 - .../agents/openai.yaml | 8 - .../SKILL.md | 174 - .../agents/openai.yaml | 8 - .../productize-pricing-strategy/SKILL.md | 167 - .../agents/openai.yaml | 8 - .../SKILL.md | 157 - .../agents/openai.yaml | 8 - .../skills/productize-privacy-policy/SKILL.md | 323 - .../agents/openai.yaml | 8 - .../SKILL.md | 250 - .../agents/openai.yaml | 8 - .../SKILL.md | 155 - .../agents/openai.yaml | 8 - .../SKILL.md | 163 - .../agents/openai.yaml | 8 - .../productize-product-brainstorming/SKILL.md | 137 - .../agents/openai.yaml | 8 - .../SKILL.md | 130 - .../agents/openai.yaml | 8 - .../SKILL.md | 142 - .../agents/openai.yaml | 8 - .../SKILL.md | 129 - .../agents/openai.yaml | 8 - .../SKILL.md | 129 - .../agents/openai.yaml | 8 - .../SKILL.md | 154 - .../agents/openai.yaml | 8 - .../SKILL.md | 210 - .../agents/openai.yaml | 8 - .../SKILL.md | 134 - .../agents/openai.yaml | 8 - .../skills/productize-product-review/SKILL.md | 190 - .../agents/openai.yaml | 8 - .../SKILL.md | 137 - .../agents/openai.yaml | 8 - .../SKILL.md | 134 - .../agents/openai.yaml | 8 - .../skills/productize-product-vision/SKILL.md | 133 - .../agents/openai.yaml | 8 - .../SKILL.md | 180 - .../agents/openai.yaml | 8 - .../references/pm-skills-main-merge.md | 75 - .../SKILL.md | 136 - .../agents/openai.yaml | 8 - .../SKILL.md | 135 - .../agents/openai.yaml | 8 - .../skills/productize-qa/SKILL.md | 220 - .../skills/productize-qa/agents/openai.yaml | 8 - .../SKILL.md | 118 - .../agents/openai.yaml | 8 - .../SKILL.md | 141 - .../agents/openai.yaml | 8 - .../SKILL.md | 121 - .../agents/openai.yaml | 8 - .../skills/productize-release-notes/SKILL.md | 145 - .../agents/openai.yaml | 8 - .../skills/productize-release/SKILL.md | 207 - .../productize-release/agents/openai.yaml | 8 - .../SKILL.md | 163 - .../agents/openai.yaml | 8 - .../SKILL.md | 333 - .../agents/openai.yaml | 8 - .../SKILL.md | 210 - .../agents/openai.yaml | 8 - .../SKILL.md | 111 - .../agents/openai.yaml | 8 - .../SKILL.md | 139 - .../agents/openai.yaml | 8 - .../skills/productize-roadmap-update/SKILL.md | 132 - .../agents/openai.yaml | 8 - .../SKILL.md | 149 - .../agents/openai.yaml | 8 - .../SKILL.md | 156 - .../agents/openai.yaml | 8 - .../SKILL.md | 134 - .../agents/openai.yaml | 8 - .../SKILL.md | 775 - .../agents/openai.yaml | 8 - .../SKILL.md | 130 - .../agents/openai.yaml | 8 - .../SKILL.md | 191 - .../agents/openai.yaml | 8 - .../SKILL.md | 165 - .../agents/openai.yaml | 8 - .../SKILL.md | 133 - .../agents/openai.yaml | 8 - .../SKILL.md | 168 - .../agents/openai.yaml | 8 - .../skills/productize-spec-writing/SKILL.md | 170 - .../agents/openai.yaml | 8 - .../productize-sprint-planning/SKILL.md | 133 - .../agents/openai.yaml | 8 - .../skills/productize-sql-queries/SKILL.md | 385 - .../SKILL.md | 144 - .../agents/openai.yaml | 8 - .../SKILL.md | 311 - .../agents/openai.yaml | 8 - .../SKILL.md | 155 - .../agents/openai.yaml | 8 - .../SKILL.md | 174 - .../agents/openai.yaml | 8 - .../SKILL.md | 168 - .../agents/openai.yaml | 8 - .../references/pm-skills-main-merge.md | 59 - .../SKILL.md | 170 - .../agents/openai.yaml | 8 - .../productize-stakeholder-update/SKILL.md | 158 - .../agents/openai.yaml | 8 - .../skills/productize-startup-canvas/SKILL.md | 219 - .../agents/openai.yaml | 8 - .../productize-statistical-analysis/SKILL.md | 247 - .../SKILL.md | 156 - .../agents/openai.yaml | 8 - .../SKILL.md | 167 - .../agents/openai.yaml | 8 - .../SKILL.md | 163 - .../agents/openai.yaml | 8 - .../SKILL.md | 133 - .../agents/openai.yaml | 8 - .../SKILL.md | 142 - .../agents/openai.yaml | 8 - .../SKILL.md | 149 - .../agents/openai.yaml | 8 - .../SKILL.md | 817 - .../agents/openai.yaml | 8 - .../SKILL.md | 200 - .../agents/openai.yaml | 8 - .../SKILL.md | 138 - .../agents/openai.yaml | 8 - .../SKILL.md | 141 - .../agents/openai.yaml | 8 - .../references/pm-skills-main-merge.md | 61 - .../SKILL.md | 156 - .../agents/openai.yaml | 8 - .../SKILL.md | 154 - .../agents/openai.yaml | 8 - .../SKILL.md | 162 - .../agents/openai.yaml | 8 - .../SKILL.md | 133 - .../agents/openai.yaml | 8 - .../SKILL.md | 122 - .../agents/openai.yaml | 8 - .../SKILL.md | 234 - .../agents/openai.yaml | 8 - .../SKILL.md | 128 - .../agents/openai.yaml | 8 - .../SKILL.md | 168 - .../agents/openai.yaml | 8 - .../references/output-format.md | 56 - .../references/pattern-groups.md | 30 - .../productize-synthesize-research/SKILL.md | 136 - .../agents/openai.yaml | 8 - .../productize-systematic-debugging/SKILL.md | 177 - .../agents/openai.yaml | 8 - .../SKILL.md | 162 - .../agents/openai.yaml | 8 - .../SKILL.md | 135 - .../agents/openai.yaml | 8 - .../SKILL.md | 121 - .../agents/openai.yaml | 8 - .../skills/productize-tdd/SKILL.md | 177 - .../skills/productize-tdd/agents/openai.yaml | 8 - .../SKILL.md | 148 - .../agents/openai.yaml | 8 - .../SKILL.md | 140 - .../agents/openai.yaml | 8 - .../skills/productize-test-scenarios/SKILL.md | 167 - .../agents/openai.yaml | 8 - .../skills/productize-thesis-review/SKILL.md | 201 - .../agents/openai.yaml | 8 - .../SKILL.md | 135 - .../agents/openai.yaml | 8 - .../SKILL.md | 124 - .../agents/openai.yaml | 8 - .../SKILL.md | 142 - .../agents/openai.yaml | 8 - .../references/pm-skills-main-merge.md | 81 - .../SKILL.md | 132 - .../agents/openai.yaml | 8 - .../SKILL.md | 127 - .../agents/openai.yaml | 8 - .../skills/productize-validate-data/SKILL.md | 267 - .../agents/openai.yaml | 8 - .../SKILL.md | 156 - .../agents/openai.yaml | 8 - .../SKILL.md | 128 - .../agents/openai.yaml | 8 - .../SKILL.md | 112 - .../agents/openai.yaml | 8 - .../skills/productize-verification/SKILL.md | 167 - .../agents/openai.yaml | 8 - .../SKILL.md | 147 - .../agents/openai.yaml | 8 - .../SKILL.md | 180 - .../agents/openai.yaml | 8 - .../skills/productize-write-query/SKILL.md | 210 - .../productize-write-query/agents/openai.yaml | 8 - .../references/pm-skills-main-merge.md | 94 - .../skills/productize-write-spec/SKILL.md | 136 - .../productize-write-spec/agents/openai.yaml | 8 - .../references/pm-skills-main-merge.md | 92 - .../skills/productize-writing-plans/SKILL.md | 157 - .../agents/openai.yaml | 8 - .../skills/productize-wwas/SKILL.md | 150 - .../skills/productize-wwas/agents/openai.yaml | 8 - .../productize-all/skills/productize/SKILL.md | 185 - .../skills/productize/agents/openai.yaml | 8 - .../.codex-plugin/plugin.json | 31 - .../productize-ab-test-analysis/SKILL.md | 165 - .../skills/productize-analyze/SKILL.md | 144 - .../productize-build-dashboard/SKILL.md | 152 - .../productize-cohort-analysis/SKILL.md | 195 - .../skills/productize-create-viz/SKILL.md | 143 - .../SKILL.md | 133 - .../SKILL.md | 185 - .../references/domain-template.md | 136 - .../references/example-generated-skill.md | 191 - .../references/skill-template.md | 144 - .../references/sql-dialects.md | 109 - .../references/tables/README.md | 3 - .../scripts/package_data_skill.py | 145 - .../productize-data-visualization/SKILL.md | 171 - .../agents/openai.yaml | 8 - .../SKILL.md | 130 - .../skills/productize-explore-data/SKILL.md | 277 - .../SKILL.md | 141 - .../SKILL.md | 170 - .../skills/productize-metrics-review/SKILL.md | 152 - .../productize-north-star-metric/SKILL.md | 155 - .../SKILL.md | 129 - .../skills/productize-sql-queries/SKILL.md | 385 - .../productize-sql-queries/agents/openai.yaml | 8 - .../SKILL.md | 144 - .../productize-statistical-analysis/SKILL.md | 247 - .../agents/openai.yaml | 8 - .../SKILL.md | 234 - .../SKILL.md | 135 - .../skills/productize-validate-data/SKILL.md | 267 - .../skills/productize-write-query/SKILL.md | 210 - .../references/pm-skills-main-merge.md | 94 - .../.codex-plugin/plugin.json | 31 - .../SKILL.md | 138 - .../SKILL.md | 169 - .../references/diagnostic-questions.md | 60 - .../references/output-format.md | 41 - .../productize-business-model-design/SKILL.md | 181 - .../assets/lean-business-model-canvas.html | 192 - .../platform-business-model-canvas.html | 254 - .../standard-business-model-canvas.html | 146 - .../references/business-model-output-rules.md | 64 - .../references/canvas-selection.md | 27 - .../references/canvas-templates.md | 203 - .../references/pm-skills-main-merge.md | 140 - .../skills/productize-lean-canvas/SKILL.md | 202 - .../productize-monetization-strategy/SKILL.md | 231 - .../productize-pricing-strategy/SKILL.md | 167 - .../SKILL.md | 168 - .../references/output-format.md | 56 - .../references/pattern-groups.md | 30 - .../.codex-plugin/plugin.json | 31 - .../SKILL.md | 152 - .../SKILL.md | 168 - .../SKILL.md | 159 - .../SKILL.md | 180 - .../skills/productize-pre-mortem/SKILL.md | 194 - .../SKILL.md | 156 - .../SKILL.md | 155 - .../SKILL.md | 168 - .../references/pm-skills-main-merge.md | 59 - .../SKILL.md | 167 - .../SKILL.md | 200 - .../SKILL.md | 147 - .../.codex-plugin/plugin.json | 31 - .../SKILL.md | 131 - .../SKILL.md | 131 - .../SKILL.md | 123 - .../SKILL.md | 146 - .../skills/productize-docs/SKILL.md | 171 - .../skills/productize-dogfood/SKILL.md | 209 - .../references/issue-taxonomy.md | 101 - .../templates/dogfood-report-template.md | 101 - .../SKILL.md | 164 - .../productize-outcome-roadmap/SKILL.md | 148 - .../SKILL.md | 176 - .../SKILL.md | 176 - .../SKILL.md | 157 - .../SKILL.md | 134 - .../skills/productize-product-review/SKILL.md | 190 - .../skills/productize-qa/SKILL.md | 220 - .../skills/productize-release-notes/SKILL.md | 145 - .../skills/productize-release/SKILL.md | 207 - .../SKILL.md | 333 - .../SKILL.md | 775 - .../productize-sprint-planning/SKILL.md | 133 - .../SKILL.md | 170 - .../SKILL.md | 133 - .../SKILL.md | 122 - .../skills/productize-test-scenarios/SKILL.md | 167 - .../SKILL.md | 124 - .../SKILL.md | 142 - .../references/pm-skills-main-merge.md | 81 - .../skills/productize-write-spec/SKILL.md | 136 - .../references/pm-skills-main-merge.md | 92 - .../skills/productize-wwas/SKILL.md | 150 - .../.codex-plugin/plugin.json | 31 - .../SKILL.md | 147 - .../productize-accessibility-review/SKILL.md | 226 - .../SKILL.md | 147 - .../productize-behavioral-guidelines/SKILL.md | 130 - .../SKILL.md | 316 - .../productize-design-critique/SKILL.md | 210 - .../skills/productize-design-handoff/SKILL.md | 229 - .../skills/productize-design-review/SKILL.md | 99 - .../skills/productize-design-system/SKILL.md | 296 - .../SKILL.md | 252 - .../SKILL.md | 136 - .../productize-frontend-design/SKILL.md | 153 - .../SKILL.md | 148 - .../SKILL.md | 204 - .../SKILL.md | 134 - .../SKILL.md | 712 - .../SKILL.md | 142 - .../SKILL.md | 136 - .../SKILL.md | 130 - .../SKILL.md | 168 - .../SKILL.md | 156 - .../SKILL.md | 132 - .../SKILL.md | 127 - .../.codex-plugin/plugin.json | 31 - .../SKILL.md | 155 - .../SKILL.md | 131 - .../SKILL.md | 130 - .../SKILL.md | 147 - .../SKILL.md | 233 - .../SKILL.md | 131 - .../SKILL.md | 320 - .../SKILL.md | 137 - .../skills/productize-brainstorm/SKILL.md | 138 - .../SKILL.md | 134 - .../SKILL.md | 131 - .../SKILL.md | 136 - .../SKILL.md | 143 - .../SKILL.md | 149 - .../SKILL.md | 133 - .../SKILL.md | 142 - .../SKILL.md | 162 - .../references/pm-skills-main-merge.md | 113 - .../skills/productize-empathy-maps/SKILL.md | 175 - .../SKILL.md | 138 - .../SKILL.md | 422 - .../SKILL.md | 150 - .../references/pm-skills-main-merge.md | 171 - .../SKILL.md | 167 - .../SKILL.md | 164 - .../SKILL.md | 179 - .../SKILL.md | 132 - .../SKILL.md | 128 - .../SKILL.md | 137 - .../SKILL.md | 128 - .../SKILL.md | 189 - .../references/pm-skills-main-merge.md | 71 - .../SKILL.md | 546 - .../SKILL.md | 182 - .../SKILL.md | 250 - .../SKILL.md | 155 - .../SKILL.md | 163 - .../productize-product-brainstorming/SKILL.md | 137 - .../SKILL.md | 130 - .../SKILL.md | 180 - .../references/pm-skills-main-merge.md | 75 - .../SKILL.md | 118 - .../SKILL.md | 141 - .../SKILL.md | 210 - .../SKILL.md | 139 - .../SKILL.md | 149 - .../SKILL.md | 141 - .../references/pm-skills-main-merge.md | 61 - .../SKILL.md | 154 - .../SKILL.md | 128 - .../productize-synthesize-research/SKILL.md | 136 - .../SKILL.md | 162 - .../.codex-plugin/plugin.json | 31 - .../SKILL.md | 112 - .../SKILL.md | 143 - .../finance-modeling-kernel/apv.py | 10 - .../finance-modeling-kernel/bond_math.py | 36 - .../finance-modeling-kernel/cap_table.py | 19 - .../capital_structure.py | 51 - .../finance-modeling-kernel/capm.py | 21 - .../convertible_notes.py | 27 - .../finance-modeling-kernel/dcf.py | 73 - .../finance-modeling-kernel/market_context.py | 34 - .../finance-modeling-kernel/option_pools.py | 22 - .../preferred_stock.py | 19 - .../finance-modeling-kernel/returns.py | 48 - .../finance-modeling-kernel/risk.py | 41 - .../finance-modeling-kernel/safes.py | 15 - .../finance-modeling-kernel/time_value.py | 42 - .../finance-modeling-kernel/validation.py | 33 - .../finance-modeling-kernel/valuation.py | 55 - .../finance-modeling-kernel/vc_method.py | 57 - .../finance-modeling-kernel/wacc.py | 9 - .../SKILL.md | 107 - .../SKILL.md | 120 - .../SKILL.md | 111 - .../SKILL.md | 156 - .../SKILL.md | 112 - .../.codex-plugin/plugin.json | 31 - .../SKILL.md | 156 - .../SKILL.md | 160 - .../skills/productize-grow/SKILL.md | 99 - .../skills/productize-growth-loops/SKILL.md | 206 - .../SKILL.md | 153 - .../SKILL.md | 140 - .../skills/productize-gtm-motions/SKILL.md | 236 - .../skills/productize-gtm-strategy/SKILL.md | 175 - .../SKILL.md | 149 - .../SKILL.md | 146 - .../productize-plg-growth-playbook/SKILL.md | 215 - .../SKILL.md | 154 - .../.codex-plugin/plugin.json | 31 - .../SKILL.md | 142 - .../SKILL.md | 136 - .../SKILL.md | 131 - .../productize-competitive-brief/SKILL.md | 446 - .../references/pm-skills-main-merge.md | 191 - .../SKILL.md | 136 - .../SKILL.md | 615 - .../SKILL.md | 130 - .../SKILL.md | 145 - .../SKILL.md | 163 - .../SKILL.md | 148 - .../SKILL.md | 147 - .../references/pm-skills-main-merge.md | 58 - .../SKILL.md | 174 - .../SKILL.md | 142 - .../.codex-plugin/plugin.json | 31 - .../skills/productize-autoplan/SKILL.md | 100 - .../SKILL.md | 137 - .../SKILL.md | 158 - .../skills/productize-draft-nda/SKILL.md | 245 - .../SKILL.md | 135 - .../SKILL.md | 152 - .../skills/productize-operate/SKILL.md | 100 - .../skills/productize-privacy-policy/SKILL.md | 323 - .../SKILL.md | 210 - .../SKILL.md | 121 - .../SKILL.md | 163 - .../SKILL.md | 135 - .../SKILL.md | 180 - .../.codex-plugin/plugin.json | 31 - .../SKILL.md | 118 - .../skills/productize-comms-review/SKILL.md | 98 - .../SKILL.md | 176 - .../SKILL.md | 140 - .../SKILL.md | 146 - .../SKILL.md | 129 - .../SKILL.md | 129 - .../SKILL.md | 125 - .../SKILL.md | 126 - .../SKILL.md | 135 - .../SKILL.md | 132 - .../SKILL.md | 158 - .../SKILL.md | 134 - .../skills/productize-product-vision/SKILL.md | 133 - .../SKILL.md | 135 - .../skills/productize-roadmap-update/SKILL.md | 132 - .../SKILL.md | 191 - .../SKILL.md | 165 - .../SKILL.md | 311 - .../SKILL.md | 174 - .../productize-stakeholder-update/SKILL.md | 158 - .../SKILL.md | 133 - .../SKILL.md | 138 - .../SKILL.md | 140 - .../.codex-plugin/plugin.json | 31 - .../SKILL.md | 150 - .../SKILL.md | 223 - .../SKILL.md | 113 - .../SKILL.md | 156 - .../SKILL.md | 286 - .../SKILL.md | 138 - .../SKILL.md | 139 - .../SKILL.md | 126 - .../SKILL.md | 137 - .../SKILL.md | 141 - .../SKILL.md | 133 - .../SKILL.md | 176 - .../SKILL.md | 137 - .../skills/productize-pmf-review/SKILL.md | 195 - .../SKILL.md | 137 - .../SKILL.md | 134 - .../SKILL.md | 133 - .../SKILL.md | 156 - .../SKILL.md | 163 - .../SKILL.md | 149 - .../SKILL.md | 817 - .../SKILL.md | 162 - .../SKILL.md | 121 - .../skills/productize-thesis-review/SKILL.md | 201 - .../SKILL.md | 128 - .../.codex-plugin/plugin.json | 31 - .../skills/productize-0-1/SKILL.md | 237 - .../productize-beachhead-segment/SKILL.md | 226 - .../SKILL.md | 131 - .../SKILL.md | 150 - .../productize-market-opportunity/SKILL.md | 224 - .../references/canonical-canvases.md | 234 - .../references/output-formats.md | 143 - .../references/rating-and-decision-rules.md | 250 - .../skills/productize-market-sizing/SKILL.md | 170 - .../SKILL.md | 129 - .../skills/productize-startup-canvas/SKILL.md | 219 - productize.go | 129 + registry/categories.json | 377 - registry/lifecycle.json | 324 - registry/plugins.json | 107 - registry/site-index.json | 5575 ------- registry/skills.json | 12294 ---------------- scripts/audit-skills.mjs | 26 - scripts/build-plugins.mjs | 241 - scripts/build-site-index.mjs | 64 - scripts/check-repo-hygiene.mjs | 103 - scripts/codegen.mjs | 81 + scripts/eval-llm-offline.mjs | 6 - scripts/eval-productize.mjs | 511 - scripts/gen-skill-docs.mjs | 225 - scripts/import-pm-skills.mjs | 617 - scripts/index-skills.mjs | 57 - scripts/inspect-acp-toolcalls.go | 270 + scripts/install-claude-skills.mjs | 76 - scripts/install-codex-plugins.mjs | 113 - scripts/install-smoke-test.mjs | 75 - scripts/lib/distribution.mjs | 78 - scripts/lib/metadata-quality.mjs | 152 - scripts/lib/productize.mjs | 572 - scripts/link-skills.sh | 63 + scripts/normalize-skills.mjs | 246 - scripts/release-check.mjs | 48 - scripts/release.mjs | 108 - scripts/report-eval-results.mjs | 76 - scripts/setup-host.mjs | 226 - scripts/test-skill-parser.mjs | 90 - scripts/validate-skills.mjs | 339 - sdk/create-extension/README.md | 50 + sdk/create-extension/package.json | 25 + .../scripts/copy-templates.mjs | 12 + sdk/create-extension/src/index.ts | 416 + .../test/create-extension.test.ts | 136 + sdk/create-extension/tsconfig.json | 14 + sdk/extension-sdk-ts/README.md | 54 + sdk/extension-sdk-ts/package.json | 30 + sdk/extension-sdk-ts/src/extension.ts | 869 ++ sdk/extension-sdk-ts/src/handlers.ts | 191 + sdk/extension-sdk-ts/src/host_api.ts | 137 + sdk/extension-sdk-ts/src/index.ts | 5 + sdk/extension-sdk-ts/src/testing/index.ts | 2 + .../src/testing/mock_transport.ts | 92 + .../src/testing/test_harness.ts | 224 + sdk/extension-sdk-ts/src/transport.ts | 273 + sdk/extension-sdk-ts/src/types.ts | 1110 ++ .../templates/lifecycle-observer/README.md | 8 + .../lifecycle-observer/extension.toml | 15 + .../templates/lifecycle-observer/package.json | 16 + .../lifecycle-observer/src/extension.ts | 34 + .../templates/lifecycle-observer/src/index.ts | 8 + .../test/lifecycle-observer.test.ts | 55 + .../lifecycle-observer/tsconfig.json | 15 + .../templates/prompt-decorator/README.md | 8 + .../templates/prompt-decorator/extension.toml | 15 + .../templates/prompt-decorator/package.json | 16 + .../prompt-decorator/src/extension.ts | 13 + .../templates/prompt-decorator/src/index.ts | 8 + .../test/prompt-decorator.test.ts | 53 + .../templates/prompt-decorator/tsconfig.json | 15 + .../templates/review-provider/README.md | 9 + .../templates/review-provider/extension.toml | 16 + .../templates/review-provider/package.json | 16 + .../review-provider/src/extension.ts | 62 + .../templates/review-provider/src/index.ts | 8 + .../test/review-provider.test.ts | 50 + .../templates/review-provider/tsconfig.json | 15 + .../templates/skill-pack/README.md | 3 + .../templates/skill-pack/extension.toml | 11 + .../templates/skill-pack/package.json | 9 + .../skill-pack/skills/announce-run/SKILL.md | 8 + .../skill-pack/test/skill-pack.test.js | 12 + sdk/extension-sdk-ts/test/extension.test.ts | 466 + .../test/fluent_hooks.test.ts | 101 + sdk/extension-sdk-ts/test/handlers.test.ts | 114 + sdk/extension-sdk-ts/test/host_api.test.ts | 252 + sdk/extension-sdk-ts/test/templates.test.ts | 41 + sdk/extension-sdk-ts/test/transport.test.ts | 147 + sdk/extension-sdk-ts/tsconfig.json | 14 + sdk/extension/README.md | 116 + sdk/extension/compat_test.go | 148 + sdk/extension/doc.go | 35 + sdk/extension/extension.go | 1146 ++ sdk/extension/extension_test.go | 734 + sdk/extension/handlers.go | 299 + sdk/extension/hooks.go | 384 + sdk/extension/host_api.go | 347 + sdk/extension/host_api_test.go | 367 + sdk/extension/internal_test.go | 828 ++ sdk/extension/smoke_test.go | 304 + sdk/extension/testing/doc.go | 28 + sdk/extension/testing/harness.go | 446 + sdk/extension/testing/harness_test.go | 298 + sdk/extension/testing/mock_transport.go | 129 + sdk/extension/testing/mock_transport_test.go | 72 + sdk/extension/transport.go | 213 + sdk/extension/types.go | 581 + sdk/extension/types_test.go | 68 + setup | 276 - skills/0-1/SKILL.md | 238 - skills/0-1/SKILL.md.tmpl | 179 - skills/0-1/agents/openai.yaml | 8 - skills/0-1/productize.json | 52 - skills/README.md | 5 - skills/aarrr-growth-diagnostics/SKILL.md | 156 - skills/aarrr-growth-diagnostics/SKILL.md.tmpl | 97 - .../agents/openai.yaml | 8 - .../aarrr-growth-diagnostics/productize.json | 45 - skills/ab-test-analysis/SKILL.md | 165 - skills/ab-test-analysis/SKILL.md.tmpl | 106 - skills/ab-test-analysis/agents/openai.yaml | 8 - skills/ab-test-analysis/productize.json | 53 - skills/acceptance-criteria-for-ui/SKILL.md | 147 - .../acceptance-criteria-for-ui/SKILL.md.tmpl | 88 - .../agents/openai.yaml | 8 - .../productize.json | 40 - skills/accessibility-review/SKILL.md | 226 - skills/accessibility-review/SKILL.md.tmpl | 167 - .../accessibility-review/agents/openai.yaml | 8 - skills/accessibility-review/productize.json | 44 - .../SKILL.md | 155 - .../SKILL.md.tmpl | 96 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 131 - .../SKILL.md.tmpl | 72 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 130 - .../SKILL.md.tmpl | 71 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 147 - .../SKILL.md.tmpl | 88 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 233 - .../SKILL.md.tmpl | 174 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 131 - .../SKILL.md.tmpl | 72 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 150 - .../SKILL.md.tmpl | 91 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 320 - .../SKILL.md.tmpl | 261 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 223 - .../SKILL.md.tmpl | 164 - .../agents/openai.yaml | 8 - .../productize.json | 38 - skills/analyze-feature-requests/SKILL.md | 131 - skills/analyze-feature-requests/SKILL.md.tmpl | 72 - .../agents/openai.yaml | 8 - .../analyze-feature-requests/productize.json | 52 - skills/analyze/SKILL.md | 144 - skills/analyze/SKILL.md.tmpl | 85 - skills/analyze/agents/openai.yaml | 8 - skills/analyze/productize.json | 48 - .../SKILL.md | 137 - .../SKILL.md.tmpl | 78 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 147 - .../SKILL.md.tmpl | 88 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/autoplan/SKILL.md | 100 - skills/autoplan/SKILL.md.tmpl | 41 - skills/autoplan/agents/openai.yaml | 8 - skills/autoplan/productize.json | 51 - skills/backend-design/SKILL.md | 158 - skills/backend-design/SKILL.md.tmpl | 99 - skills/backend-design/agents/openai.yaml | 8 - skills/backend-design/productize.json | 46 - skills/beachhead-segment/SKILL.md | 226 - skills/beachhead-segment/SKILL.md.tmpl | 167 - skills/beachhead-segment/agents/openai.yaml | 8 - skills/beachhead-segment/productize.json | 51 - skills/behavioral-guidelines/SKILL.md | 131 - skills/behavioral-guidelines/SKILL.md.tmpl | 72 - .../behavioral-guidelines/agents/openai.yaml | 8 - skills/behavioral-guidelines/productize.json | 46 - skills/brainstorm/SKILL.md | 138 - skills/brainstorm/SKILL.md.tmpl | 79 - skills/brainstorm/agents/openai.yaml | 8 - skills/brainstorm/productize.json | 48 - skills/brand-archetype-strategy/SKILL.md | 142 - skills/brand-archetype-strategy/SKILL.md.tmpl | 83 - .../agents/openai.yaml | 8 - .../brand-archetype-strategy/productize.json | 46 - skills/brand-equity-diagnostics/SKILL.md | 136 - skills/brand-equity-diagnostics/SKILL.md.tmpl | 77 - .../agents/openai.yaml | 8 - .../brand-equity-diagnostics/productize.json | 45 - .../SKILL.md | 131 - .../SKILL.md.tmpl | 72 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/build-dashboard/SKILL.md | 152 - skills/build-dashboard/SKILL.md.tmpl | 93 - skills/build-dashboard/agents/openai.yaml | 8 - skills/build-dashboard/productize.json | 46 - .../SKILL.md | 138 - .../SKILL.md.tmpl | 79 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/business-model-blindspots/SKILL.md | 170 - .../business-model-blindspots/SKILL.md.tmpl | 111 - .../agents/openai.yaml | 8 - .../business-model-blindspots/productize.json | 47 - .../references/diagnostic-questions.md | 60 - .../references/output-format.md | 41 - skills/business-model-design/SKILL.md | 181 - skills/business-model-design/SKILL.md.tmpl | 122 - .../business-model-design/agents/openai.yaml | 8 - .../assets/lean-business-model-canvas.html | 192 - .../platform-business-model-canvas.html | 254 - .../standard-business-model-canvas.html | 146 - skills/business-model-design/productize.json | 57 - .../references/business-model-output-rules.md | 64 - .../references/canvas-selection.md | 27 - .../references/canvas-templates.md | 203 - .../references/pm-skills-main-merge.md | 140 - .../SKILL.md | 113 - .../SKILL.md.tmpl | 54 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/capital-structure-financing/SKILL.md | 112 - .../capital-structure-financing/SKILL.md.tmpl | 54 - .../agents/openai.yaml | 8 - .../productize.json | 52 - .../SKILL.md | 118 - .../SKILL.md.tmpl | 59 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 160 - .../SKILL.md.tmpl | 101 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 134 - .../SKILL.md.tmpl | 75 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/cohort-analysis/SKILL.md | 195 - skills/cohort-analysis/SKILL.md.tmpl | 136 - skills/cohort-analysis/agents/openai.yaml | 8 - skills/cohort-analysis/productize.json | 53 - skills/comms-review/SKILL.md | 98 - skills/comms-review/SKILL.md.tmpl | 39 - skills/comms-review/agents/openai.yaml | 8 - skills/comms-review/productize.json | 52 - .../SKILL.md | 156 - .../SKILL.md.tmpl | 97 - .../agents/openai.yaml | 8 - .../productize.json | 34 - .../SKILL.md | 131 - .../SKILL.md.tmpl | 72 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/competitive-brief/SKILL.md | 447 - skills/competitive-brief/SKILL.md.tmpl | 388 - skills/competitive-brief/agents/openai.yaml | 8 - skills/competitive-brief/productize.json | 53 - .../references/pm-skills-main-merge.md | 191 - .../SKILL.md | 286 - .../SKILL.md.tmpl | 227 - .../agents/openai.yaml | 8 - .../productize.json | 34 - .../SKILL.md | 138 - .../SKILL.md.tmpl | 79 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 131 - .../SKILL.md.tmpl | 72 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 316 - .../SKILL.md.tmpl | 257 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 137 - .../SKILL.md.tmpl | 78 - .../agents/openai.yaml | 8 - .../productize.json | 40 - skills/create-prd/SKILL.md | 185 + skills/create-prd/references/adr-template.md | 55 + skills/create-prd/references/prd-template.md | 102 + .../references/question-protocol.md | 83 + skills/create-tasks/SKILL.md | 111 + .../references/task-context-schema.md | 35 + .../create-tasks/references/task-template.md | 83 + skills/create-techspec/SKILL.md | 143 + .../references/adr-template.md | 55 + .../references/techspec-template.md | 116 + skills/create-viz/SKILL.md | 143 - skills/create-viz/SKILL.md.tmpl | 84 - skills/create-viz/agents/openai.yaml | 8 - skills/create-viz/productize.json | 48 - .../SKILL.md | 136 - .../SKILL.md.tmpl | 77 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 143 - .../SKILL.md.tmpl | 84 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 176 - .../SKILL.md.tmpl | 117 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 123 - .../SKILL.md.tmpl | 64 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../ctas-from-copywriting-strategies/SKILL.md | 136 - .../SKILL.md.tmpl | 77 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 149 - .../SKILL.md.tmpl | 90 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 133 - .../SKILL.md.tmpl | 74 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/data-context-extractor/SKILL.md | 185 - skills/data-context-extractor/SKILL.md.tmpl | 126 - .../data-context-extractor/agents/openai.yaml | 8 - skills/data-context-extractor/productize.json | 54 - .../references/domain-template.md | 136 - .../references/example-generated-skill.md | 191 - .../references/skill-template.md | 144 - .../references/sql-dialects.md | 109 - .../references/tables/README.md | 3 - .../scripts/package_data_skill.py | 145 - .../SKILL.md | 133 - .../SKILL.md.tmpl | 74 - .../agents/openai.yaml | 8 - .../productize.json | 38 - skills/data-visualization/SKILL.md | 171 - skills/data-visualization/SKILL.md.tmpl | 112 - skills/data-visualization/agents/openai.yaml | 8 - skills/data-visualization/productize.json | 53 - .../SKILL.md | 152 - .../SKILL.md.tmpl | 93 - .../agents/openai.yaml | 8 - .../productize.json | 43 - .../SKILL.md | 139 - .../SKILL.md.tmpl | 80 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/decision-rights-using-davci/SKILL.md | 158 - .../decision-rights-using-davci/SKILL.md.tmpl | 99 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 131 - .../SKILL.md.tmpl | 72 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 615 - .../SKILL.md.tmpl | 556 - .../agents/openai.yaml | 8 - .../productize.json | 40 - skills/design-critique/SKILL.md | 210 - skills/design-critique/SKILL.md.tmpl | 151 - skills/design-critique/agents/openai.yaml | 8 - skills/design-critique/productize.json | 44 - skills/design-handoff/SKILL.md | 229 - skills/design-handoff/SKILL.md.tmpl | 170 - skills/design-handoff/agents/openai.yaml | 8 - skills/design-handoff/productize.json | 43 - skills/design-review/SKILL.md | 99 - skills/design-review/SKILL.md.tmpl | 40 - skills/design-review/agents/openai.yaml | 8 - skills/design-review/productize.json | 52 - skills/design-system/SKILL.md | 296 - skills/design-system/SKILL.md.tmpl | 237 - skills/design-system/agents/openai.yaml | 8 - skills/design-system/productize.json | 43 - .../SKILL.md | 146 - .../SKILL.md.tmpl | 87 - .../agents/openai.yaml | 8 - .../productize.json | 34 - .../SKILL.md | 140 - .../SKILL.md.tmpl | 81 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 130 - .../SKILL.md.tmpl | 71 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/docs/SKILL.md | 171 - skills/docs/SKILL.md.tmpl | 112 - skills/docs/agents/openai.yaml | 8 - skills/docs/productize.json | 51 - skills/dogfood/SKILL.md | 209 - skills/dogfood/SKILL.md.tmpl | 150 - skills/dogfood/agents/openai.yaml | 8 - skills/dogfood/productize.json | 55 - skills/dogfood/references/issue-taxonomy.md | 101 - .../templates/dogfood-report-template.md | 101 - skills/draft-nda/SKILL.md | 245 - skills/draft-nda/SKILL.md.tmpl | 186 - skills/draft-nda/agents/openai.yaml | 8 - skills/draft-nda/productize.json | 50 - .../SKILL.md | 159 - .../SKILL.md.tmpl | 100 - .../agents/openai.yaml | 8 - .../productize.json | 40 - skills/dx-review/SKILL.md | 243 - skills/dx-review/SKILL.md.tmpl | 184 - skills/dx-review/agents/openai.yaml | 8 - skills/dx-review/productize.json | 52 - .../SKILL.md | 142 - .../SKILL.md.tmpl | 83 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 162 - .../SKILL.md.tmpl | 103 - .../agents/openai.yaml | 8 - .../productize.json | 49 - .../references/pm-skills-main-merge.md | 113 - skills/embed.go | 15 + skills/empathy-maps/SKILL.md | 175 - skills/empathy-maps/SKILL.md.tmpl | 116 - skills/empathy-maps/agents/openai.yaml | 8 - skills/empathy-maps/productize.json | 40 - skills/eng-review/SKILL.md | 223 - skills/eng-review/SKILL.md.tmpl | 164 - skills/eng-review/agents/openai.yaml | 8 - skills/eng-review/productize.json | 52 - .../SKILL.md | 130 - .../SKILL.md.tmpl | 71 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 130 - .../SKILL.md.tmpl | 71 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 252 - .../SKILL.md.tmpl | 193 - .../agents/openai.yaml | 8 - .../productize.json | 40 - skills/execute-task/SKILL.md | 65 + .../references/tracking-checklist.md | 9 + skills/executive-and-update-review/SKILL.md | 146 - .../executive-and-update-review/SKILL.md.tmpl | 87 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 136 - .../SKILL.md.tmpl | 77 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/explore-data/SKILL.md | 277 - skills/explore-data/SKILL.md.tmpl | 218 - skills/explore-data/agents/openai.yaml | 8 - skills/explore-data/productize.json | 47 - .../SKILL.md | 138 - .../SKILL.md.tmpl | 79 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 141 - .../SKILL.md.tmpl | 82 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 158 - .../SKILL.md.tmpl | 99 - .../agents/openai.yaml | 8 - .../productize.json | 38 - skills/final-verify/SKILL.md | 154 + skills/finance-modeling-kernel/SKILL.md | 144 - skills/finance-modeling-kernel/SKILL.md.tmpl | 86 - .../agents/openai.yaml | 8 - .../finance-modeling-kernel/apv.py | 10 - .../finance-modeling-kernel/bond_math.py | 36 - .../finance-modeling-kernel/cap_table.py | 19 - .../capital_structure.py | 51 - .../finance-modeling-kernel/capm.py | 21 - .../convertible_notes.py | 27 - .../finance-modeling-kernel/dcf.py | 73 - .../finance-modeling-kernel/market_context.py | 34 - .../finance-modeling-kernel/option_pools.py | 22 - .../preferred_stock.py | 19 - .../finance-modeling-kernel/returns.py | 48 - .../finance-modeling-kernel/risk.py | 41 - .../finance-modeling-kernel/safes.py | 15 - .../finance-modeling-kernel/time_value.py | 42 - .../finance-modeling-kernel/validation.py | 33 - .../finance-modeling-kernel/valuation.py | 55 - .../finance-modeling-kernel/vc_method.py | 57 - .../finance-modeling-kernel/wacc.py | 9 - .../finance-modeling-kernel/productize.json | 52 - skills/financial-markets-context/SKILL.md | 107 - .../financial-markets-context/SKILL.md.tmpl | 49 - .../agents/openai.yaml | 8 - .../financial-markets-context/productize.json | 52 - skills/fix-reviews/SKILL.md | 50 + .../SKILL.md | 422 - .../SKILL.md.tmpl | 363 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 126 - .../SKILL.md.tmpl | 67 - .../agents/openai.yaml | 8 - .../productize.json | 34 - skills/frontend-design/SKILL.md | 153 - skills/frontend-design/SKILL.md.tmpl | 94 - skills/frontend-design/agents/openai.yaml | 8 - skills/frontend-design/productize.json | 44 - .../SKILL.md | 137 - .../SKILL.md.tmpl | 78 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 167 - .../SKILL.md.tmpl | 108 - .../agents/openai.yaml | 8 - .../productize.json | 52 - skills/grow/SKILL.md | 100 - skills/grow/SKILL.md.tmpl | 41 - skills/grow/agents/openai.yaml | 8 - skills/grow/productize.json | 50 - skills/growth-loops/SKILL.md | 206 - skills/growth-loops/SKILL.md.tmpl | 147 - skills/growth-loops/agents/openai.yaml | 8 - skills/growth-loops/productize.json | 52 - .../SKILL.md | 153 - .../SKILL.md.tmpl | 94 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 140 - .../SKILL.md.tmpl | 81 - .../agents/openai.yaml | 8 - .../productize.json | 34 - skills/gtm-motions/SKILL.md | 236 - skills/gtm-motions/SKILL.md.tmpl | 177 - skills/gtm-motions/agents/openai.yaml | 8 - skills/gtm-motions/productize.json | 53 - skills/gtm-strategy/SKILL.md | 175 - skills/gtm-strategy/SKILL.md.tmpl | 116 - skills/gtm-strategy/agents/openai.yaml | 8 - skills/gtm-strategy/productize.json | 53 - .../SKILL.md | 150 - .../SKILL.md.tmpl | 91 - .../agents/openai.yaml | 8 - .../productize.json | 45 - .../references/pm-skills-main-merge.md | 171 - .../SKILL.md | 148 - .../SKILL.md.tmpl | 89 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/implementation-notes/SKILL.md | 252 - skills/implementation-notes/SKILL.md.tmpl | 193 - .../implementation-notes/agents/openai.yaml | 8 - skills/implementation-notes/productize.json | 52 - skills/industry-trend-strategy/SKILL.md | 145 - skills/industry-trend-strategy/SKILL.md.tmpl | 86 - .../agents/openai.yaml | 8 - .../industry-trend-strategy/productize.json | 38 - .../SKILL.md | 129 - .../SKILL.md.tmpl | 70 - .../agents/openai.yaml | 8 - .../productize.json | 40 - .../SKILL.md | 159 - .../SKILL.md.tmpl | 100 - .../agents/openai.yaml | 8 - .../productize.json | 51 - .../SKILL.md | 167 - .../SKILL.md.tmpl | 108 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 164 - .../SKILL.md.tmpl | 105 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 179 - .../SKILL.md.tmpl | 120 - .../agents/openai.yaml | 8 - .../productize.json | 40 - .../SKILL.md | 132 - .../SKILL.md.tmpl | 73 - .../agents/openai.yaml | 8 - .../productize.json | 38 - skills/lean-canvas/SKILL.md | 202 - skills/lean-canvas/SKILL.md.tmpl | 143 - skills/lean-canvas/agents/openai.yaml | 8 - skills/lean-canvas/productize.json | 52 - .../SKILL.md | 141 - .../SKILL.md.tmpl | 82 - .../agents/openai.yaml | 8 - .../productize.json | 34 - .../SKILL.md | 149 - .../SKILL.md.tmpl | 90 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/managerial-finance-dcf/SKILL.md | 120 - skills/managerial-finance-dcf/SKILL.md.tmpl | 62 - .../managerial-finance-dcf/agents/openai.yaml | 8 - skills/managerial-finance-dcf/productize.json | 52 - .../SKILL.md | 129 - .../SKILL.md.tmpl | 70 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 150 - .../SKILL.md.tmpl | 91 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/market-opportunity/SKILL.md | 225 - skills/market-opportunity/SKILL.md.tmpl | 166 - skills/market-opportunity/agents/openai.yaml | 8 - skills/market-opportunity/productize.json | 51 - .../references/canonical-canvases.md | 234 - .../references/output-formats.md | 143 - .../references/rating-and-decision-rules.md | 250 - skills/market-orientation-audit/SKILL.md | 163 - skills/market-orientation-audit/SKILL.md.tmpl | 104 - .../agents/openai.yaml | 8 - .../market-orientation-audit/productize.json | 44 - .../SKILL.md | 128 - .../SKILL.md.tmpl | 69 - .../agents/openai.yaml | 8 - .../productize.json | 34 - skills/market-sizing/SKILL.md | 170 - skills/market-sizing/SKILL.md.tmpl | 111 - skills/market-sizing/agents/openai.yaml | 8 - skills/market-sizing/productize.json | 50 - .../SKILL.md | 133 - .../SKILL.md.tmpl | 74 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 135 - .../SKILL.md.tmpl | 76 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 180 - .../SKILL.md.tmpl | 121 - .../agents/openai.yaml | 8 - .../productize.json | 37 - .../SKILL.md | 152 - .../SKILL.md.tmpl | 93 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 148 - .../SKILL.md.tmpl | 89 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 170 - .../SKILL.md.tmpl | 111 - .../agents/openai.yaml | 8 - .../productize.json | 38 - skills/metrics-review/SKILL.md | 152 - skills/metrics-review/SKILL.md.tmpl | 93 - skills/metrics-review/agents/openai.yaml | 8 - skills/metrics-review/productize.json | 47 - skills/monetization-strategy/SKILL.md | 231 - skills/monetization-strategy/SKILL.md.tmpl | 172 - .../monetization-strategy/agents/openai.yaml | 8 - skills/monetization-strategy/productize.json | 53 - .../multi-step-workflow-optimization/SKILL.md | 204 - .../SKILL.md.tmpl | 145 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 134 - .../SKILL.md.tmpl | 75 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/netmba-competitor-analysis/SKILL.md | 176 - .../netmba-competitor-analysis/SKILL.md.tmpl | 117 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/north-star-metric/SKILL.md | 156 - skills/north-star-metric/SKILL.md.tmpl | 97 - skills/north-star-metric/agents/openai.yaml | 8 - skills/north-star-metric/productize.json | 51 - .../SKILL.md | 137 - .../SKILL.md.tmpl | 78 - .../agents/openai.yaml | 8 - .../productize.json | 40 - .../SKILL.md | 164 - .../SKILL.md.tmpl | 105 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 128 - .../SKILL.md.tmpl | 69 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 125 - .../SKILL.md.tmpl | 66 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 137 - .../SKILL.md.tmpl | 78 - .../agents/openai.yaml | 8 - .../productize.json | 34 - .../SKILL.md | 146 - .../SKILL.md.tmpl | 87 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/operate/SKILL.md | 100 - skills/operate/SKILL.md.tmpl | 41 - skills/operate/agents/openai.yaml | 8 - skills/operate/productize.json | 51 - .../SKILL.md | 189 - .../SKILL.md.tmpl | 130 - .../agents/openai.yaml | 8 - .../productize.json | 47 - .../references/pm-skills-main-merge.md | 71 - skills/outcome-roadmap/SKILL.md | 148 - skills/outcome-roadmap/SKILL.md.tmpl | 89 - skills/outcome-roadmap/agents/openai.yaml | 8 - skills/outcome-roadmap/productize.json | 52 - skills/plg-growth-playbook/SKILL.md | 215 - skills/plg-growth-playbook/SKILL.md.tmpl | 156 - skills/plg-growth-playbook/agents/openai.yaml | 8 - skills/plg-growth-playbook/productize.json | 53 - .../SKILL.md | 712 - .../SKILL.md.tmpl | 653 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/pmf-review/SKILL.md | 195 - skills/pmf-review/SKILL.md.tmpl | 136 - skills/pmf-review/agents/openai.yaml | 8 - skills/pmf-review/productize.json | 52 - .../SKILL.md | 147 - .../SKILL.md.tmpl | 88 - .../agents/openai.yaml | 8 - .../productize.json | 49 - .../references/pm-skills-main-merge.md | 58 - .../SKILL.md | 546 - .../SKILL.md.tmpl | 487 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/post-launch-feedback-loop/SKILL.md | 182 - .../post-launch-feedback-loop/SKILL.md.tmpl | 123 - .../agents/openai.yaml | 8 - .../post-launch-feedback-loop/productize.json | 38 - .../SKILL.md | 126 - .../SKILL.md.tmpl | 67 - .../agents/openai.yaml | 8 - .../productize.json | 40 - .../SKILL.md | 176 - .../SKILL.md.tmpl | 117 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 176 - .../SKILL.md.tmpl | 117 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/pre-mortem/SKILL.md | 194 - skills/pre-mortem/SKILL.md.tmpl | 135 - skills/pre-mortem/agents/openai.yaml | 8 - skills/pre-mortem/productize.json | 53 - .../SKILL.md | 135 - .../SKILL.md.tmpl | 76 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 132 - .../SKILL.md.tmpl | 73 - .../agents/openai.yaml | 8 - .../productize.json | 40 - .../SKILL.md | 158 - .../SKILL.md.tmpl | 99 - .../agents/openai.yaml | 8 - .../productize.json | 40 - .../SKILL.md | 174 - .../SKILL.md.tmpl | 115 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/pricing-strategy/SKILL.md | 167 - skills/pricing-strategy/SKILL.md.tmpl | 108 - skills/pricing-strategy/agents/openai.yaml | 8 - skills/pricing-strategy/productize.json | 53 - skills/prioritization-frameworks/SKILL.md | 157 - .../prioritization-frameworks/SKILL.md.tmpl | 98 - .../agents/openai.yaml | 8 - .../prioritization-frameworks/productize.json | 53 - skills/privacy-policy/SKILL.md | 323 - skills/privacy-policy/SKILL.md.tmpl | 264 - skills/privacy-policy/agents/openai.yaml | 8 - skills/privacy-policy/productize.json | 53 - .../SKILL.md | 250 - .../SKILL.md.tmpl | 191 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 155 - .../SKILL.md.tmpl | 96 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 163 - .../SKILL.md.tmpl | 104 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/product-brainstorming/SKILL.md | 137 - skills/product-brainstorming/SKILL.md.tmpl | 78 - .../product-brainstorming/agents/openai.yaml | 8 - skills/product-brainstorming/productize.json | 50 - .../SKILL.md | 130 - .../SKILL.md.tmpl | 71 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 142 - .../SKILL.md.tmpl | 83 - .../agents/openai.yaml | 8 - .../productize.json | 34 - .../SKILL.md | 129 - .../SKILL.md.tmpl | 70 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 129 - .../SKILL.md.tmpl | 70 - .../agents/openai.yaml | 8 - .../productize.json | 44 - skills/product-market-fit-cycle/SKILL.md | 153 - skills/product-market-fit-cycle/SKILL.md.tmpl | 94 - .../agents/openai.yaml | 8 - .../product-market-fit-cycle/productize.json | 45 - .../SKILL.md | 210 - .../SKILL.md.tmpl | 151 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 134 - .../SKILL.md.tmpl | 75 - .../agents/openai.yaml | 8 - .../productize.json | 42 - skills/product-review/SKILL.md | 190 - skills/product-review/SKILL.md.tmpl | 131 - skills/product-review/agents/openai.yaml | 8 - skills/product-review/productize.json | 52 - .../SKILL.md | 137 - .../SKILL.md.tmpl | 78 - .../agents/openai.yaml | 8 - .../productize.json | 34 - .../SKILL.md | 134 - .../SKILL.md.tmpl | 75 - .../agents/openai.yaml | 8 - .../productize.json | 38 - skills/product-vision/SKILL.md | 133 - skills/product-vision/SKILL.md.tmpl | 74 - skills/product-vision/agents/openai.yaml | 8 - skills/product-vision/productize.json | 53 - .../skills => skills}/productize-0-1/SKILL.md | 0 .../productize-0-1/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-ab-test-analysis/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-accessibility-review/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-analyze/SKILL.md | 0 .../productize-analyze/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-autoplan/SKILL.md | 0 .../productize-autoplan/agents/openai.yaml | 0 .../productize-backend-design/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-beachhead-segment/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-behavioral-guidelines/SKILL.md | 131 + .../agents/openai.yaml | 0 .../productize-brainstorm/SKILL.md | 0 .../productize-brainstorm/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-build-dashboard/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/diagnostic-questions.md | 0 .../references/output-format.md | 0 .../productize-business-model-design/SKILL.md | 0 .../agents/openai.yaml | 0 .../assets/lean-business-model-canvas.html | 0 .../platform-business-model-canvas.html | 0 .../standard-business-model-canvas.html | 0 .../references/business-model-output-rules.md | 0 .../references/canvas-selection.md | 0 .../references/canvas-templates.md | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-cohort-analysis/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-comms-review/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-competitive-brief/SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-create-viz/SKILL.md | 0 .../productize-create-viz/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/domain-template.md | 0 .../references/example-generated-skill.md | 0 .../references/skill-template.md | 0 .../references/sql-dialects.md | 0 .../references/tables/README.md | 0 .../scripts/package_data_skill.py | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-data-visualization/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-design-critique/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-design-handoff/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-design-review/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-design-system/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-docs/SKILL.md | 0 .../productize-docs/agents/openai.yaml | 0 .../productize-dogfood/SKILL.md | 0 .../productize-dogfood/agents/openai.yaml | 0 .../references/issue-taxonomy.md | 0 .../templates/dogfood-report-template.md | 0 .../productize-draft-nda/SKILL.md | 0 .../productize-draft-nda/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-dx-review/SKILL.md | 0 .../productize-dx-review/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../productize-empathy-maps/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-eng-review/SKILL.md | 0 .../productize-eng-review/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-explore-data/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../finance-modeling-kernel/apv.py | 0 .../finance-modeling-kernel/bond_math.py | 0 .../finance-modeling-kernel/cap_table.py | 0 .../capital_structure.py | 0 .../finance-modeling-kernel/capm.py | 0 .../convertible_notes.py | 0 .../finance-modeling-kernel/dcf.py | 0 .../finance-modeling-kernel/market_context.py | 0 .../finance-modeling-kernel/option_pools.py | 0 .../preferred_stock.py | 0 .../finance-modeling-kernel/returns.py | 0 .../finance-modeling-kernel/risk.py | 0 .../finance-modeling-kernel/safes.py | 0 .../tests/test_acceptance.py | 0 .../finance-modeling-kernel/time_value.py | 0 .../finance-modeling-kernel/validation.py | 0 .../finance-modeling-kernel/valuation.py | 0 .../finance-modeling-kernel/vc_method.py | 0 .../finance-modeling-kernel/wacc.py | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-frontend-design/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-grow/SKILL.md | 0 .../productize-grow/agents/openai.yaml | 0 .../productize-growth-loops/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-gtm-motions/SKILL.md | 0 .../productize-gtm-motions/agents/openai.yaml | 0 .../productize-gtm-strategy/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-implementation-notes/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-lean-canvas/SKILL.md | 0 .../productize-lean-canvas/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-market-opportunity/SKILL.md | 0 .../agents/openai.yaml | 0 .../references/canonical-canvases.md | 0 .../references/output-formats.md | 0 .../references/rating-and-decision-rules.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-market-sizing/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-metrics-review/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-monetization-strategy/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-north-star-metric/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-operate/SKILL.md | 0 .../productize-operate/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../productize-outcome-roadmap/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-plg-growth-playbook/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-pmf-review/SKILL.md | 0 .../productize-pmf-review/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-pre-mortem/SKILL.md | 0 .../productize-pre-mortem/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-pricing-strategy/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-privacy-policy/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-product-brainstorming/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-product-review/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-product-vision/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills => skills}/productize-qa/SKILL.md | 0 .../productize-qa/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-release-notes/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-release/SKILL.md | 0 .../productize-release/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-roadmap-update/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 skills/productize-runtime/SKILL.md | 262 + .../references/cli-reference.md | 260 + .../references/config-reference.md | 256 + .../references/skills-reference.md | 178 + .../references/workflow-guide.md | 162 + .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-spec-writing/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-sprint-planning/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-sql-queries/SKILL.md | 0 .../productize-sql-queries/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-stakeholder-update/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-startup-canvas/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-statistical-analysis/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/output-format.md | 0 .../references/pattern-groups.md | 0 .../productize-synthesize-research/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-systematic-debugging/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../skills => skills}/productize-tdd/SKILL.md | 0 .../productize-tdd/agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-test-scenarios/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-thesis-review/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-validate-data/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-verification/SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-write-query/SKILL.md | 0 .../productize-write-query/agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../productize-write-spec/SKILL.md | 0 .../productize-write-spec/agents/openai.yaml | 0 .../references/pm-skills-main-merge.md | 0 .../productize-writing-plans/SKILL.md | 0 .../agents/openai.yaml | 0 .../productize-wwas/SKILL.md | 0 .../productize-wwas/agents/openai.yaml | 0 .../skills => skills}/productize/SKILL.md | 0 .../productize/agents}/openai.yaml | 0 .../SKILL.md | 180 - .../SKILL.md.tmpl | 121 - .../agents/openai.yaml | 8 - .../productize.json | 49 - .../references/pm-skills-main-merge.md | 75 - .../SKILL.md | 136 - .../SKILL.md.tmpl | 77 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 135 - .../SKILL.md.tmpl | 76 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/qa/SKILL.md | 220 - skills/qa/SKILL.md.tmpl | 161 - skills/qa/agents/openai.yaml | 8 - skills/qa/productize.json | 52 - .../raw-interview-transcript-cleanup/SKILL.md | 118 - .../SKILL.md.tmpl | 59 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 141 - .../SKILL.md.tmpl | 82 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 121 - .../SKILL.md.tmpl | 62 - .../agents/openai.yaml | 8 - .../productize.json | 40 - skills/release-notes/SKILL.md | 145 - skills/release-notes/SKILL.md.tmpl | 86 - skills/release-notes/agents/openai.yaml | 8 - skills/release-notes/productize.json | 53 - skills/release/SKILL.md | 207 - skills/release/SKILL.md.tmpl | 148 - skills/release/agents/openai.yaml | 8 - skills/release/productize.json | 51 - .../SKILL.md | 163 - .../SKILL.md.tmpl | 104 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 333 - .../SKILL.md.tmpl | 274 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 210 - .../SKILL.md.tmpl | 151 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/review-round/SKILL.md | 120 + .../review-round/references/issue-template.md | 60 + .../references/review-criteria.md | 123 + skills/risk-return-cost-of-capital/SKILL.md | 111 - .../risk-return-cost-of-capital/SKILL.md.tmpl | 53 - .../agents/openai.yaml | 8 - .../productize.json | 53 - .../SKILL.md | 139 - .../SKILL.md.tmpl | 80 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/roadmap-update/SKILL.md | 132 - skills/roadmap-update/SKILL.md.tmpl | 73 - skills/roadmap-update/agents/openai.yaml | 8 - skills/roadmap-update/productize.json | 47 - .../SKILL.md | 149 - .../SKILL.md.tmpl | 90 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 156 - .../SKILL.md.tmpl | 97 - .../agents/openai.yaml | 8 - .../productize.json | 53 - .../SKILL.md | 134 - .../SKILL.md.tmpl | 75 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 775 - .../SKILL.md.tmpl | 716 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 130 - .../SKILL.md.tmpl | 71 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../skimmable-writing-transformation/SKILL.md | 191 - .../SKILL.md.tmpl | 132 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 165 - .../SKILL.md.tmpl | 106 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 133 - .../SKILL.md.tmpl | 74 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 168 - .../SKILL.md.tmpl | 109 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/spec-writing/SKILL.md | 170 - skills/spec-writing/SKILL.md.tmpl | 111 - skills/spec-writing/agents/openai.yaml | 8 - skills/spec-writing/productize.json | 48 - skills/sprint-planning/SKILL.md | 133 - skills/sprint-planning/SKILL.md.tmpl | 74 - skills/sprint-planning/agents/openai.yaml | 8 - skills/sprint-planning/productize.json | 48 - skills/sql-queries/SKILL.md | 384 - skills/sql-queries/SKILL.md.tmpl | 325 - skills/sql-queries/agents/openai.yaml | 8 - skills/sql-queries/productize.json | 49 - .../SKILL.md | 144 - .../SKILL.md.tmpl | 85 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 311 - .../SKILL.md.tmpl | 252 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 155 - .../SKILL.md.tmpl | 96 - .../agents/openai.yaml | 8 - .../productize.json | 40 - .../SKILL.md | 174 - .../SKILL.md.tmpl | 115 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 168 - .../SKILL.md.tmpl | 109 - .../agents/openai.yaml | 8 - .../productize.json | 51 - .../references/pm-skills-main-merge.md | 59 - .../SKILL.md | 170 - .../SKILL.md.tmpl | 111 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/stakeholder-update/SKILL.md | 158 - skills/stakeholder-update/SKILL.md.tmpl | 99 - skills/stakeholder-update/agents/openai.yaml | 8 - skills/stakeholder-update/productize.json | 44 - skills/startup-canvas/SKILL.md | 219 - skills/startup-canvas/SKILL.md.tmpl | 160 - skills/startup-canvas/agents/openai.yaml | 8 - skills/startup-canvas/productize.json | 50 - skills/statistical-analysis/SKILL.md | 247 - skills/statistical-analysis/SKILL.md.tmpl | 188 - .../statistical-analysis/agents/openai.yaml | 8 - skills/statistical-analysis/productize.json | 50 - .../SKILL.md | 156 - .../SKILL.md.tmpl | 97 - .../agents/openai.yaml | 8 - .../productize.json | 34 - .../SKILL.md | 167 - .../SKILL.md.tmpl | 108 - .../agents/openai.yaml | 8 - .../productize.json | 53 - .../SKILL.md | 163 - .../SKILL.md.tmpl | 104 - .../agents/openai.yaml | 8 - .../productize.json | 34 - .../SKILL.md | 133 - .../SKILL.md.tmpl | 74 - .../agents/openai.yaml | 8 - .../productize.json | 38 - skills/strategy-curve-blue-ocean/SKILL.md | 142 - .../strategy-curve-blue-ocean/SKILL.md.tmpl | 83 - .../agents/openai.yaml | 8 - .../strategy-curve-blue-ocean/productize.json | 43 - .../SKILL.md | 149 - .../SKILL.md.tmpl | 90 - .../agents/openai.yaml | 8 - .../productize.json | 34 - .../SKILL.md | 817 - .../SKILL.md.tmpl | 758 - .../agents/openai.yaml | 8 - .../productize.json | 34 - .../SKILL.md | 200 - .../SKILL.md.tmpl | 141 - .../agents/openai.yaml | 8 - .../productize.json | 42 - .../SKILL.md | 138 - .../SKILL.md.tmpl | 79 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 141 - .../SKILL.md.tmpl | 82 - .../agents/openai.yaml | 8 - .../productize.json | 47 - .../references/pm-skills-main-merge.md | 61 - .../SKILL.md | 156 - .../SKILL.md.tmpl | 97 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 154 - .../SKILL.md.tmpl | 95 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 162 - .../SKILL.md.tmpl | 103 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 133 - .../SKILL.md.tmpl | 74 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 122 - .../SKILL.md.tmpl | 63 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 234 - .../SKILL.md.tmpl | 175 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 128 - .../SKILL.md.tmpl | 69 - .../agents/openai.yaml | 8 - .../productize.json | 38 - skills/sustainable-business-model/SKILL.md | 169 - .../sustainable-business-model/SKILL.md.tmpl | 110 - .../agents/openai.yaml | 8 - .../productize.json | 49 - .../references/output-format.md | 56 - .../references/pattern-groups.md | 30 - skills/synthesize-research/SKILL.md | 136 - skills/synthesize-research/SKILL.md.tmpl | 77 - skills/synthesize-research/agents/openai.yaml | 8 - skills/synthesize-research/productize.json | 43 - skills/systematic-debugging/SKILL.md | 177 - skills/systematic-debugging/SKILL.md.tmpl | 118 - .../systematic-debugging/agents/openai.yaml | 8 - skills/systematic-debugging/productize.json | 47 - .../SKILL.md | 162 - .../SKILL.md.tmpl | 103 - .../agents/openai.yaml | 8 - .../productize.json | 40 - .../SKILL.md | 135 - .../SKILL.md.tmpl | 76 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 121 - .../SKILL.md.tmpl | 62 - .../agents/openai.yaml | 8 - .../productize.json | 34 - skills/tdd/SKILL.md | 177 - skills/tdd/SKILL.md.tmpl | 118 - skills/tdd/agents/openai.yaml | 8 - skills/tdd/productize.json | 47 - .../SKILL.md | 148 - .../SKILL.md.tmpl | 89 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 140 - .../SKILL.md.tmpl | 81 - .../agents/openai.yaml | 8 - .../productize.json | 38 - skills/test-scenarios/SKILL.md | 167 - skills/test-scenarios/SKILL.md.tmpl | 108 - skills/test-scenarios/agents/openai.yaml | 8 - skills/test-scenarios/productize.json | 52 - skills/thesis-review/SKILL.md | 201 - skills/thesis-review/SKILL.md.tmpl | 142 - skills/thesis-review/agents/openai.yaml | 8 - skills/thesis-review/productize.json | 52 - .../SKILL.md | 135 - .../SKILL.md.tmpl | 76 - .../agents/openai.yaml | 8 - .../productize.json | 38 - .../SKILL.md | 124 - .../SKILL.md.tmpl | 65 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 142 - .../SKILL.md.tmpl | 83 - .../agents/openai.yaml | 8 - .../productize.json | 47 - .../references/pm-skills-main-merge.md | 81 - .../SKILL.md | 132 - .../SKILL.md.tmpl | 73 - .../agents/openai.yaml | 8 - .../productize.json | 36 - .../SKILL.md | 127 - .../SKILL.md.tmpl | 68 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/validate-data/SKILL.md | 267 - skills/validate-data/SKILL.md.tmpl | 208 - skills/validate-data/agents/openai.yaml | 8 - skills/validate-data/productize.json | 48 - skills/valuation-and-deal-pricing/SKILL.md | 156 - .../valuation-and-deal-pricing/SKILL.md.tmpl | 98 - .../agents/openai.yaml | 8 - .../productize.json | 53 - .../SKILL.md | 128 - .../SKILL.md.tmpl | 69 - .../agents/openai.yaml | 8 - .../productize.json | 38 - skills/venture-capital-deal-modeling/SKILL.md | 112 - .../SKILL.md.tmpl | 54 - .../agents/openai.yaml | 8 - .../productize.json | 52 - skills/verification/SKILL.md | 167 - skills/verification/SKILL.md.tmpl | 108 - skills/verification/agents/openai.yaml | 8 - skills/verification/productize.json | 48 - skills/visual-decision-making-review/SKILL.md | 147 - .../SKILL.md.tmpl | 88 - .../agents/openai.yaml | 8 - .../productize.json | 53 - skills/workflow-memory/SKILL.md | 85 + .../references/memory-guidelines.md | 75 + .../SKILL.md | 180 - .../SKILL.md.tmpl | 121 - .../agents/openai.yaml | 8 - .../productize.json | 36 - skills/write-query/SKILL.md | 209 - skills/write-query/SKILL.md.tmpl | 150 - skills/write-query/agents/openai.yaml | 8 - skills/write-query/productize.json | 55 - .../references/pm-skills-main-merge.md | 94 - skills/write-spec/SKILL.md | 136 - skills/write-spec/SKILL.md.tmpl | 77 - skills/write-spec/agents/openai.yaml | 8 - skills/write-spec/productize.json | 53 - .../references/pm-skills-main-merge.md | 92 - skills/writing-plans/SKILL.md | 157 - skills/writing-plans/SKILL.md.tmpl | 98 - skills/writing-plans/agents/openai.yaml | 8 - skills/writing-plans/productize.json | 47 - skills/wwas/SKILL.md | 151 - skills/wwas/SKILL.md.tmpl | 92 - skills/wwas/agents/openai.yaml | 8 - skills/wwas/productize.json | 53 - test/codegen-script.test.ts | 71 + test/dogfood.test.mjs | 59 - test/eval-runner.test.mjs | 86 - test/fixtures/fake-llm-eval.mjs | 26 - test/generator.test.mjs | 63 - test/helpers_test.go | 17 + test/metadata-quality.test.mjs | 18 - test/plugin-distribution.test.mjs | 43 - test/public_api_test.go | 214 + test/registry.test.mjs | 80 - test/release.test.mjs | 66 - test/release_config_test.go | 475 + test/repo-hygiene.test.mjs | 29 - test/route-regression.test.mjs | 120 - test/runtime-workflow.test.mjs | 66 - test/setup-host.test.mjs | 119 - test/setup-script.test.mjs | 55 - test/skills_bundle_test.go | 352 + tsconfig.base.json | 14 + tsconfig.json | 12 + turbo.json | 20 + vitest.config.ts | 15 + zsh/productize-completion/README.md | 52 + .../productize-completion.plugin.zsh | 62 + 5266 files changed, 304608 insertions(+), 365495 deletions(-) delete mode 100644 .agents/plugins/marketplace.json delete mode 100644 .agents/productize-runtime.json create mode 100644 .agents/skills/adversarial-review/SKILL.md create mode 100644 .agents/skills/adversarial-review/references/reviewer-lenses.md create mode 100644 .agents/skills/ai-sdk/SKILL.md create mode 100644 .agents/skills/ai-sdk/references/ai-gateway.md create mode 100644 .agents/skills/ai-sdk/references/common-errors.md create mode 100644 .agents/skills/app-renderer-systems/SKILL.md create mode 100644 .agents/skills/app-renderer-systems/references/directory-layout.md create mode 100644 .agents/skills/app-renderer-systems/references/patterns.md create mode 100644 .agents/skills/architectural-analysis/SKILL.md create mode 100644 .agents/skills/autoresearch/SKILL.md create mode 100644 .agents/skills/autoresearch/eval-guide.md create mode 100644 .agents/skills/brainstorming/SKILL.md create mode 100644 .agents/skills/bubbletea/SKILL.md create mode 100644 .agents/skills/bubbletea/references/components.md create mode 100644 .agents/skills/bubbletea/references/emoji-width-fix.md create mode 100644 .agents/skills/bubbletea/references/golden-rules.md create mode 100644 .agents/skills/bubbletea/references/troubleshooting.md create mode 100644 .agents/skills/context7/SKILL.md create mode 100644 .agents/skills/council/SKILL.md create mode 100644 .agents/skills/council/assets/synthesis-template.md create mode 100644 .agents/skills/council/references/archetypes.md create mode 100644 .agents/skills/council/references/debate-protocols.md create mode 100644 .agents/skills/crafting-effective-readmes/README.md create mode 100644 .agents/skills/crafting-effective-readmes/SKILL.md create mode 100644 .agents/skills/crafting-effective-readmes/references/art-of-readme.md create mode 100644 .agents/skills/crafting-effective-readmes/references/make-a-readme.md create mode 100644 .agents/skills/crafting-effective-readmes/references/standard-readme-example-maximal.md create mode 100644 .agents/skills/crafting-effective-readmes/references/standard-readme-example-minimal.md create mode 100644 .agents/skills/crafting-effective-readmes/references/standard-readme-spec.md create mode 100644 .agents/skills/crafting-effective-readmes/section-checklist.md create mode 100644 .agents/skills/crafting-effective-readmes/style-guide.md create mode 100644 .agents/skills/crafting-effective-readmes/templates/internal.md create mode 100644 .agents/skills/crafting-effective-readmes/templates/oss.md create mode 100644 .agents/skills/crafting-effective-readmes/templates/personal.md create mode 100644 .agents/skills/crafting-effective-readmes/templates/xdg-config.md create mode 100644 .agents/skills/crafting-effective-readmes/using-references.md create mode 100644 .agents/skills/create-prd/SKILL.md create mode 100644 .agents/skills/create-prd/references/adr-template.md create mode 100644 .agents/skills/create-prd/references/prd-template.md create mode 100644 .agents/skills/create-prd/references/question-protocol.md create mode 100644 .agents/skills/create-tasks/SKILL.md create mode 100644 .agents/skills/create-tasks/references/task-context-schema.md create mode 100644 .agents/skills/create-tasks/references/task-template.md create mode 100644 .agents/skills/create-techspec/SKILL.md create mode 100644 .agents/skills/create-techspec/references/adr-template.md create mode 100644 .agents/skills/create-techspec/references/techspec-template.md create mode 100644 .agents/skills/design-taste-frontend/SKILL.md create mode 100644 .agents/skills/drawio/SKILL.md create mode 100644 .agents/skills/exa-web-search-free/SKILL.md create mode 100644 .agents/skills/exa-web-search-free/references/examples.md create mode 100644 .agents/skills/execute-task/SKILL.md create mode 100644 .agents/skills/execute-task/references/tracking-checklist.md create mode 100644 .agents/skills/extreme-software-optimization/SKILL.md create mode 100644 .agents/skills/extreme-software-optimization/references/ADVANCED.md create mode 100644 .agents/skills/extreme-software-optimization/references/LANGUAGE-SPECIFIC.md create mode 100644 .agents/skills/extreme-software-optimization/references/METHODOLOGY.md create mode 100644 .agents/skills/extreme-software-optimization/references/TECHNIQUES.md create mode 100644 .agents/skills/final-verify/SKILL.md create mode 100644 .agents/skills/find-skills/SKILL.md create mode 100644 .agents/skills/fix-coderabbit-review/SKILL.md create mode 100644 .agents/skills/fix-coderabbit-review/agents/openai.yaml create mode 100755 .agents/skills/fix-coderabbit-review/scripts/pr_review.py create mode 100755 .agents/skills/fix-coderabbit-review/scripts/resolve_pr_issues.py create mode 100644 .agents/skills/fix-reviews/SKILL.md create mode 100644 .agents/skills/frontend-design/SKILL.md create mode 100644 .agents/skills/frontend-design/reference/color-and-contrast.md create mode 100644 .agents/skills/frontend-design/reference/interaction-design.md create mode 100644 .agents/skills/frontend-design/reference/motion-design.md create mode 100644 .agents/skills/frontend-design/reference/responsive-design.md create mode 100644 .agents/skills/frontend-design/reference/spatial-design.md create mode 100644 .agents/skills/frontend-design/reference/typography.md create mode 100644 .agents/skills/frontend-design/reference/ux-writing.md create mode 100644 .agents/skills/git-rebase/SKILL.md create mode 100644 .agents/skills/git-rebase/references/automation.md create mode 100644 .agents/skills/git-rebase/references/resolution-patterns.md create mode 100644 .agents/skills/git-rebase/references/scripts-tools.md create mode 100644 .agents/skills/git-rebase/references/strategies.md create mode 100644 .agents/skills/git-rebase/references/troubleshooting.md create mode 100755 .agents/skills/git-rebase/scripts/analyze-conflicts.sh create mode 100755 .agents/skills/git-rebase/scripts/pre-rebase-backup.sh create mode 100755 .agents/skills/git-rebase/scripts/validate-merge.sh create mode 100644 .agents/skills/golang-pro/SKILL.md create mode 100644 .agents/skills/golang-pro/references/concurrency.md create mode 100644 .agents/skills/golang-pro/references/generics.md create mode 100644 .agents/skills/golang-pro/references/interfaces.md create mode 100644 .agents/skills/golang-pro/references/project-structure.md create mode 100644 .agents/skills/golang-pro/references/testing.md create mode 100644 .agents/skills/idea-factory/SKILL.md create mode 100644 .agents/skills/idea-factory/references/adr-template.md create mode 100644 .agents/skills/idea-factory/references/business-analyst.md create mode 100644 .agents/skills/idea-factory/references/council.md create mode 100644 .agents/skills/idea-factory/references/idea-template.md create mode 100644 .agents/skills/idea-factory/references/product-strategist.md create mode 100644 .agents/skills/idea-factory/references/question-protocol.md create mode 100644 .agents/skills/impl-peer-review/SKILL.md create mode 100644 .agents/skills/impl-peer-review/references/impl-review-prompt.md create mode 100644 .agents/skills/impl-peer-review/references/readiness-checks.md create mode 100644 .agents/skills/interface-design/SKILL.md create mode 100644 .agents/skills/interface-design/references/critique.md create mode 100644 .agents/skills/interface-design/references/example.md create mode 100644 .agents/skills/interface-design/references/principles.md create mode 100644 .agents/skills/interface-design/references/validation.md create mode 100644 .agents/skills/lesson-learned/README.md create mode 100644 .agents/skills/lesson-learned/SKILL.md create mode 100644 .agents/skills/lesson-learned/references/anti-patterns.md create mode 100644 .agents/skills/lesson-learned/references/se-principles.md create mode 100644 .agents/skills/minimalist-ui/SKILL.md create mode 100644 .agents/skills/no-workarounds/SKILL.md create mode 100644 .agents/skills/no-workarounds/references/philosophical-foundations.md create mode 100644 .agents/skills/no-workarounds/references/workaround-catalog.md create mode 100644 .agents/skills/productize-runtime/SKILL.md create mode 100644 .agents/skills/productize-runtime/references/cli-reference.md create mode 100644 .agents/skills/productize-runtime/references/config-reference.md create mode 100644 .agents/skills/productize-runtime/references/skills-reference.md create mode 100644 .agents/skills/productize-runtime/references/workflow-guide.md create mode 100644 .agents/skills/qa-execution/SKILL.md create mode 100644 .agents/skills/qa-execution/assets/issue-template.md create mode 100644 .agents/skills/qa-execution/assets/verification-report-template.md create mode 100644 .agents/skills/qa-execution/references/checklist.md create mode 100644 .agents/skills/qa-execution/references/e2e-coverage.md create mode 100644 .agents/skills/qa-execution/references/project-signals.md create mode 100644 .agents/skills/qa-execution/references/web-ui-qa.md create mode 100755 .agents/skills/qa-execution/scripts/discover-project-contract.py create mode 100644 .agents/skills/qa-report/SKILL.md create mode 100644 .agents/skills/qa-report/assets/issue-template.md create mode 100644 .agents/skills/qa-report/references/bug_report_templates.md create mode 100644 .agents/skills/qa-report/references/figma_validation.md create mode 100644 .agents/skills/qa-report/references/regression_testing.md create mode 100644 .agents/skills/qa-report/references/test_case_templates.md create mode 100755 .agents/skills/qa-report/scripts/create_bug_report.sh create mode 100755 .agents/skills/qa-report/scripts/generate_test_cases.sh create mode 100644 .agents/skills/react/SKILL.md create mode 100644 .agents/skills/react/references/best-practices.md create mode 100644 .agents/skills/react/references/useeffect-patterns.md create mode 100644 .agents/skills/redesign-existing-projects/SKILL.md create mode 100644 .agents/skills/refactoring-analysis/SKILL.md create mode 100644 .agents/skills/refactoring-analysis/assets/refactoring-report-template.md create mode 100644 .agents/skills/refactoring-analysis/checklists/analysis-checklist.md create mode 100644 .agents/skills/refactoring-analysis/references/code-smells-catalog.md create mode 100644 .agents/skills/refactoring-analysis/references/refactoring-techniques.md create mode 100644 .agents/skills/refactoring-analysis/references/solid-ddd-context.md create mode 100644 .agents/skills/refactoring-analysis/scripts/validate-metadata.py create mode 100644 .agents/skills/review-round/SKILL.md create mode 100644 .agents/skills/review-round/references/issue-template.md create mode 100644 .agents/skills/review-round/references/review-criteria.md create mode 100644 .agents/skills/shadcn-ui/SKILL.md create mode 100644 .agents/skills/shadcn-ui/references/chart.md create mode 100644 .agents/skills/shadcn-ui/references/learn.md create mode 100644 .agents/skills/shadcn-ui/references/official-ui-reference.md create mode 100644 .agents/skills/shadcn-ui/references/reference.md create mode 100644 .agents/skills/shadcn-ui/references/ui-reference.md create mode 100644 .agents/skills/shadcn/SKILL.md create mode 100644 .agents/skills/shadcn/references/patterns.md create mode 100644 .agents/skills/skill-best-practices/SKILL.md create mode 100644 .agents/skills/skill-best-practices/assets/SKILL.template.md create mode 100644 .agents/skills/skill-best-practices/references/checklist.md create mode 100644 .agents/skills/skill-best-practices/scripts/validate-metadata.py create mode 100644 .agents/skills/skill-writer/SKILL.md create mode 100644 .agents/skills/smux-productize-pairing/SKILL.md create mode 100644 .agents/skills/smux-productize-pairing/assets/boot-prompts.md create mode 100644 .agents/skills/smux-productize-pairing/assets/claude-append-system-prompt.md create mode 100644 .agents/skills/smux-productize-pairing/assets/codex-developer-instructions.md create mode 100644 .agents/skills/smux-productize-pairing/references/runtime-contract.md create mode 100755 .agents/skills/smux-productize-pairing/scripts/print-session-command.sh create mode 100755 .agents/skills/smux-productize-pairing/scripts/render-session-plan.py create mode 100755 .agents/skills/smux-productize-pairing/scripts/run-claude-worker.sh create mode 100755 .agents/skills/smux-productize-pairing/scripts/run-codex-worker.sh create mode 100644 .agents/skills/smux-productize-pairing/scripts/run-productize-start.sh create mode 100644 .agents/skills/smux/SKILL.md create mode 100644 .agents/skills/smux/references/tmux-bridge.md create mode 100644 .agents/skills/smux/references/tmux.md create mode 100644 .agents/skills/storybook-stories/SKILL.md create mode 100644 .agents/skills/storybook-stories/references/patterns.md create mode 100644 .agents/skills/systematic-debugging/CREATION-LOG.md create mode 100644 .agents/skills/systematic-debugging/SKILL.md create mode 100644 .agents/skills/systematic-debugging/condition-based-waiting-example.ts create mode 100644 .agents/skills/systematic-debugging/condition-based-waiting.md create mode 100644 .agents/skills/systematic-debugging/defense-in-depth.md create mode 100755 .agents/skills/systematic-debugging/find-polluter.sh create mode 100644 .agents/skills/systematic-debugging/root-cause-tracing.md create mode 100644 .agents/skills/systematic-debugging/test-academic.md create mode 100644 .agents/skills/systematic-debugging/test-pressure-1.md create mode 100644 .agents/skills/systematic-debugging/test-pressure-2.md create mode 100644 .agents/skills/systematic-debugging/test-pressure-3.md create mode 100644 .agents/skills/systematic-project-qa/SKILL.md create mode 100644 .agents/skills/systematic-project-qa/assets/issue-template.md create mode 100644 .agents/skills/systematic-project-qa/assets/verification-report-template.md create mode 100644 .agents/skills/systematic-project-qa/references/checklist.md create mode 100644 .agents/skills/systematic-project-qa/references/project-signals.md create mode 100755 .agents/skills/systematic-project-qa/scripts/discover-project-contract.py create mode 100644 .agents/skills/tailwindcss/SKILL.md create mode 100644 .agents/skills/tailwindcss/references/patterns.md create mode 100644 .agents/skills/tanstack-query-best-practices/SKILL.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/cache-gc-time.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/cache-invalidation.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/cache-placeholder-vs-initial.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/cache-stale-time.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/err-error-boundaries.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/inf-page-params.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/mut-invalidate-queries.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/mut-mutation-state.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/mut-optimistic-updates.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/network-mode.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/parallel-use-queries.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/perf-select-transform.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/persist-queries.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/pf-intent-prefetch.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/qk-array-structure.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/qk-factory-pattern.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/qk-hierarchical-organization.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/qk-include-dependencies.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/qk-serializable.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/query-cancellation.md create mode 100644 .agents/skills/tanstack-query-best-practices/rules/ssr-dehydration.md create mode 100644 .agents/skills/tanstack-router-best-practices/SKILL.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/ctx-root-context.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/err-not-found.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/load-ensure-query-data.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/load-parallel.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/load-use-loaders.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/nav-link-component.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/nav-route-masks.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/org-virtual-routes.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/preload-intent.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/router-default-options.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/search-custom-serializer.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/search-validation.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/split-lazy-routes.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/ts-register-router.md create mode 100644 .agents/skills/tanstack-router-best-practices/rules/ts-use-from-param.md create mode 100644 .agents/skills/tanstack-start-best-practices/SKILL.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/api-routes.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/auth-route-protection.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/auth-session-management.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/deploy-adapters.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/env-functions.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/err-server-errors.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/file-separation.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/mw-request-middleware.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/sf-create-server-fn.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/sf-input-validation.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/ssr-hydration-safety.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/ssr-prerender.md create mode 100644 .agents/skills/tanstack-start-best-practices/rules/ssr-streaming.md create mode 100644 .agents/skills/tanstack/SKILL.md create mode 100644 .agents/skills/tanstack/references/form-patterns.md create mode 100644 .agents/skills/tanstack/references/query-patterns.md create mode 100644 .agents/skills/tanstack/references/router-patterns.md create mode 100644 .agents/skills/tech-logos/SKILL.md create mode 100644 .agents/skills/testing-anti-patterns/SKILL.md create mode 100644 .agents/skills/to-prompt/SKILL.md create mode 100644 .agents/skills/tui-design/SKILL.md create mode 100644 .agents/skills/tui-design/references/app-patterns.md create mode 100644 .agents/skills/tui-design/references/visual-catalog.md create mode 100644 .agents/skills/tui-glamorous/SKILL.md create mode 100644 .agents/skills/tui-glamorous/references/PROMPTS.md create mode 100644 .agents/skills/tui-glamorous/references/QUICK-REFERENCE.md create mode 100644 .agents/skills/tui-glamorous/references/advanced-patterns.md create mode 100644 .agents/skills/tui-glamorous/references/component-catalog.md create mode 100644 .agents/skills/tui-glamorous/references/go-tui.md create mode 100644 .agents/skills/tui-glamorous/references/infrastructure.md create mode 100644 .agents/skills/tui-glamorous/references/production-architecture.md create mode 100644 .agents/skills/tui-glamorous/references/shell-scripts.md create mode 100644 .agents/skills/typescript-advanced/SKILL.md create mode 100644 .agents/skills/typescript-advanced/references/best-practices.md create mode 100644 .agents/skills/ubs/SELF-TEST.md create mode 100644 .agents/skills/ubs/SKILL.md create mode 100644 .agents/skills/ubs/references/FALSE-POSITIVES.md create mode 100644 .agents/skills/ubs/references/TRIAGE.md create mode 100644 .agents/skills/ubs/references/WORKFLOWS.md create mode 100755 .agents/skills/ubs/scripts/validate.py create mode 100644 .agents/skills/vercel-composition-patterns/AGENTS.md create mode 100644 .agents/skills/vercel-composition-patterns/SKILL.md create mode 100644 .agents/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md create mode 100644 .agents/skills/vercel-composition-patterns/rules/architecture-compound-components.md create mode 100644 .agents/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md create mode 100644 .agents/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md create mode 100644 .agents/skills/vercel-composition-patterns/rules/react19-no-forwardref.md create mode 100644 .agents/skills/vercel-composition-patterns/rules/state-context-interface.md create mode 100644 .agents/skills/vercel-composition-patterns/rules/state-decouple-implementation.md create mode 100644 .agents/skills/vercel-composition-patterns/rules/state-lift-state.md create mode 100644 .agents/skills/vercel-react-best-practices/AGENTS.md create mode 100644 .agents/skills/vercel-react-best-practices/SKILL.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/async-api-routes.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/async-defer-await.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/async-dependencies.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/async-parallel.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/bundle-conditional.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/bundle-preload.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/client-event-listeners.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-cache-storage.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-early-exit.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-index-maps.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-length-check-first.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-activity.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-memo.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/rerender-transitions.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-cache-lru.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-cache-react.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md create mode 100644 .agents/skills/vercel-react-best-practices/rules/server-serialization.md create mode 100644 .agents/skills/vitest/GENERATION.md create mode 100644 .agents/skills/vitest/SKILL.md create mode 100644 .agents/skills/vitest/references/advanced-environments.md create mode 100644 .agents/skills/vitest/references/advanced-projects.md create mode 100644 .agents/skills/vitest/references/advanced-type-testing.md create mode 100644 .agents/skills/vitest/references/advanced-vi.md create mode 100644 .agents/skills/vitest/references/core-cli.md create mode 100644 .agents/skills/vitest/references/core-config.md create mode 100644 .agents/skills/vitest/references/core-describe.md create mode 100644 .agents/skills/vitest/references/core-expect.md create mode 100644 .agents/skills/vitest/references/core-hooks.md create mode 100644 .agents/skills/vitest/references/core-test-api.md create mode 100644 .agents/skills/vitest/references/features-concurrency.md create mode 100644 .agents/skills/vitest/references/features-context.md create mode 100644 .agents/skills/vitest/references/features-coverage.md create mode 100644 .agents/skills/vitest/references/features-filtering.md create mode 100644 .agents/skills/vitest/references/features-mocking.md create mode 100644 .agents/skills/vitest/references/features-snapshots.md create mode 100644 .agents/skills/workflow-memory/SKILL.md create mode 100644 .agents/skills/workflow-memory/references/memory-guidelines.md create mode 100644 .agents/skills/zod/AGENTS.md create mode 100644 .agents/skills/zod/README.md create mode 100644 .agents/skills/zod/SKILL.md create mode 100644 .agents/skills/zod/references/compose-intersection.md create mode 100644 .agents/skills/zod/references/compose-lazy-recursive.md create mode 100644 .agents/skills/zod/references/compose-pipe.md create mode 100644 .agents/skills/zod/references/compose-preprocess.md create mode 100644 .agents/skills/zod/references/compose-shared-schemas.md create mode 100644 .agents/skills/zod/references/error-avoid-throwing-in-refine.md create mode 100644 .agents/skills/zod/references/error-custom-messages.md create mode 100644 .agents/skills/zod/references/error-i18n.md create mode 100644 .agents/skills/zod/references/error-path-for-nested.md create mode 100644 .agents/skills/zod/references/error-use-flatten.md create mode 100644 .agents/skills/zod/references/object-discriminated-unions.md create mode 100644 .agents/skills/zod/references/object-extend-for-composition.md create mode 100644 .agents/skills/zod/references/object-optional-vs-nullable.md create mode 100644 .agents/skills/zod/references/object-partial-for-updates.md create mode 100644 .agents/skills/zod/references/object-pick-omit.md create mode 100644 .agents/skills/zod/references/object-strict-vs-strip.md create mode 100644 .agents/skills/zod/references/parse-async-for-async-refinements.md create mode 100644 .agents/skills/zod/references/parse-avoid-double-validation.md create mode 100644 .agents/skills/zod/references/parse-handle-all-issues.md create mode 100644 .agents/skills/zod/references/parse-never-trust-json.md create mode 100644 .agents/skills/zod/references/parse-use-safeparse.md create mode 100644 .agents/skills/zod/references/parse-validate-early.md create mode 100644 .agents/skills/zod/references/perf-arrays.md create mode 100644 .agents/skills/zod/references/perf-avoid-dynamic-creation.md create mode 100644 .agents/skills/zod/references/perf-cache-schemas.md create mode 100644 .agents/skills/zod/references/perf-lazy-loading.md create mode 100644 .agents/skills/zod/references/perf-zod-mini.md create mode 100644 .agents/skills/zod/references/refine-add-path.md create mode 100644 .agents/skills/zod/references/refine-catch.md create mode 100644 .agents/skills/zod/references/refine-defaults.md create mode 100644 .agents/skills/zod/references/refine-transform-coerce.md create mode 100644 .agents/skills/zod/references/refine-vs-superrefine.md create mode 100644 .agents/skills/zod/references/schema-avoid-optional-abuse.md create mode 100644 .agents/skills/zod/references/schema-coercion-for-form-data.md create mode 100644 .agents/skills/zod/references/schema-string-validations.md create mode 100644 .agents/skills/zod/references/schema-use-enums.md create mode 100644 .agents/skills/zod/references/schema-use-primitives-correctly.md create mode 100644 .agents/skills/zod/references/schema-use-unknown-not-any.md create mode 100644 .agents/skills/zod/references/type-branded-types.md create mode 100644 .agents/skills/zod/references/type-enable-strict-mode.md create mode 100644 .agents/skills/zod/references/type-export-schemas-and-types.md create mode 100644 .agents/skills/zod/references/type-input-vs-output.md create mode 100644 .agents/skills/zod/references/type-use-z-infer.md create mode 100644 .agents/skills/zustand/SKILL.md create mode 100644 .agents/skills/zustand/references/patterns.md create mode 100644 .bun-version delete mode 100644 .claude-plugin/marketplace.json create mode 100644 .claude/agents/architect-advisor.md create mode 100644 .claude/agents/devils-advocate.md create mode 100644 .claude/agents/pragmatic-engineer.md create mode 100644 .claude/agents/product-mind.md create mode 100644 .claude/agents/security-advocate.md create mode 100644 .claude/agents/the-thinker.md create mode 100644 .claude/commands/refac.md delete mode 100644 .claude/productize-runtime.json delete mode 100644 .claude/skills/0-1/SKILL.md delete mode 100644 .claude/skills/aarrr-growth-diagnostics/SKILL.md delete mode 100644 .claude/skills/ab-test-analysis/SKILL.md delete mode 100644 .claude/skills/acceptance-criteria-for-ui/SKILL.md delete mode 100644 .claude/skills/accessibility-review/SKILL.md delete mode 100644 .claude/skills/actionable-customer-interview-guides-from-research-topics/SKILL.md delete mode 100644 .claude/skills/actionable-job-stories-from-interview-transcripts/SKILL.md delete mode 100644 .claude/skills/actionable-product-improvements-from-survey-responses/SKILL.md delete mode 100644 .claude/skills/actionable-research-briefs-from-problem-statements-and/SKILL.md delete mode 100644 .claude/skills/actionable-user-profiles-with-tasks-and-constraints-from/SKILL.md delete mode 100644 .claude/skills/actionable-user-research-decisions-from-project-insights/SKILL.md delete mode 100644 .claude/skills/adaptive-planning-from-scenarios-to-strategic-actions/SKILL.md delete mode 100644 .claude/skills/aging-research-insight-validation-before-reusing/SKILL.md delete mode 100644 .claude/skills/ai-product-evaluation-from-recommendation-canvas-framework/SKILL.md delete mode 100644 .claude/skills/analyze-feature-requests/SKILL.md delete mode 100644 .claude/skills/analyze/SKILL.md delete mode 100644 .claude/skills/app-aha-moment-identification-from-user-data-and-app/SKILL.md delete mode 100644 .claude/skills/app-design-from-project-requirements/SKILL.md delete mode 100644 .claude/skills/autoplan/SKILL.md delete mode 100644 .claude/skills/backend-design/SKILL.md delete mode 100644 .claude/skills/beachhead-segment/SKILL.md delete mode 100644 .claude/skills/behavioral-guidelines/SKILL.md delete mode 100644 .claude/skills/brainstorm/SKILL.md delete mode 100644 .claude/skills/brand-archetype-strategy/SKILL.md delete mode 100644 .claude/skills/brand-equity-diagnostics/SKILL.md delete mode 100644 .claude/skills/bug-prioritization-against-work-in-progress/SKILL.md delete mode 100644 .claude/skills/build-dashboard/SKILL.md delete mode 100644 .claude/skills/business-flywheel-from-company-successes-and-failures/SKILL.md delete mode 100644 .claude/skills/business-model-blindspots/SKILL.md delete mode 100644 .claude/skills/business-model-design/SKILL.md delete mode 100644 .claude/skills/business-strategy-creation-from-expert-strategic-thinking/SKILL.md delete mode 100644 .claude/skills/capital-structure-financing/SKILL.md delete mode 100644 .claude/skills/challenging-meeting-with-stakeholders/SKILL.md delete mode 100644 .claude/skills/churn-reduction-from-customer-data-and-exit-survey-analysis/SKILL.md delete mode 100644 .claude/skills/clustered-jtbd-forces-from-interview-data/SKILL.md delete mode 100644 .claude/skills/cohort-analysis/SKILL.md delete mode 100644 .claude/skills/comms-review/SKILL.md delete mode 100644 .claude/skills/competitive-advantage-diagnostics-and-moat-strategy/SKILL.md delete mode 100644 .claude/skills/competitive-analysis-to-winning-positioning-strategy/SKILL.md delete mode 100644 .claude/skills/competitive-brief/SKILL.md delete mode 100644 .claude/skills/competitive-parity-and-strategic-differentiation/SKILL.md delete mode 100644 .claude/skills/complex-problem-structuring-into-actionable-recommendations/SKILL.md delete mode 100644 .claude/skills/comprehensive-use-cases-from-user-input-for-product-strategy/SKILL.md delete mode 100644 .claude/skills/conflicting-stakeholder-requirements-to-balanced-design/SKILL.md delete mode 100644 .claude/skills/conversation-summaries-from-meeting-transcripts/SKILL.md delete mode 100644 .claude/skills/create-viz/SKILL.md delete mode 100644 .claude/skills/creative-solution-generation-from-de-bono-s-lateral-thinking/SKILL.md delete mode 100644 .claude/skills/creative-solution-generation-from-metaphorical-thinking/SKILL.md delete mode 100644 .claude/skills/crisis-communication-plan-from-outage-details-and-company/SKILL.md delete mode 100644 .claude/skills/critical-flaws-in-product-requirements-tough-and-unreasonable/SKILL.md delete mode 100644 .claude/skills/ctas-from-copywriting-strategies/SKILL.md delete mode 100644 .claude/skills/customer-insights-extraction-from-interview-transcript-using/SKILL.md delete mode 100644 .claude/skills/customer-journey-map-based-on-user-behavior-data/SKILL.md delete mode 100644 .claude/skills/data-context-extractor/SKILL.md delete mode 100644 .claude/skills/data-driven-research-plans-from-leadership-intuition/SKILL.md delete mode 100644 .claude/skills/data-visualization/SKILL.md delete mode 100644 .claude/skills/decision-making-with-the-gut-check-protocol/SKILL.md delete mode 100644 .claude/skills/decision-reversibility-classification-from-first-principles/SKILL.md delete mode 100644 .claude/skills/decision-rights-using-davci/SKILL.md delete mode 100644 .claude/skills/defining-the-niche-from-user-input/SKILL.md delete mode 100644 .claude/skills/demo-narratives-showing-user-goals/SKILL.md delete mode 100644 .claude/skills/design-critique/SKILL.md delete mode 100644 .claude/skills/design-handoff/SKILL.md delete mode 100644 .claude/skills/design-review/SKILL.md delete mode 100644 .claude/skills/design-system/SKILL.md delete mode 100644 .claude/skills/detailed-project-plans-from-project-briefs/SKILL.md delete mode 100644 .claude/skills/difficult-conversation-script-5-step-framework/SKILL.md delete mode 100644 .claude/skills/disruptive-strategy-generation-from-what-if-questions/SKILL.md delete mode 100644 .claude/skills/docs/SKILL.md delete mode 100644 .claude/skills/dogfood/SKILL.md delete mode 100644 .claude/skills/draft-nda/SKILL.md delete mode 100644 .claude/skills/dual-mode-ai-coding-assistant-staff-eng-intern/SKILL.md delete mode 100644 .claude/skills/dx-review/SKILL.md delete mode 100644 .claude/skills/easy-signal-identification-from-product-assumption/SKILL.md delete mode 100644 .claude/skills/effective-customer-interview-guides-for-any-topic/SKILL.md delete mode 100644 .claude/skills/empathy-maps/SKILL.md delete mode 100644 .claude/skills/eng-review/SKILL.md delete mode 100644 .claude/skills/engineering-problem-solving-and-solution-structuring/SKILL.md delete mode 100644 .claude/skills/event-tracking-schemas-from-ui-and-metrics-requirements/SKILL.md delete mode 100644 .claude/skills/exec-feedback-without-context-to-actionable-design-requirements/SKILL.md delete mode 100644 .claude/skills/executive-and-update-review/SKILL.md delete mode 100644 .claude/skills/executive-decks-from-quick-dirty-test-analysis/SKILL.md delete mode 100644 .claude/skills/explore-data/SKILL.md delete mode 100644 .claude/skills/feature-impact-models-from-kpis-and-assumptions/SKILL.md delete mode 100644 .claude/skills/feature-results-analysis-from-draft-to-final-report/SKILL.md delete mode 100644 .claude/skills/features-reframing-and-projects-shape-up/SKILL.md delete mode 100644 .claude/skills/finance-modeling-kernel/SKILL.md delete mode 100644 .claude/skills/financial-markets-context/SKILL.md delete mode 100644 .claude/skills/fragmented-user-research-synthesis-into-coherent-insights/SKILL.md delete mode 100644 .claude/skills/framework-application-to-product-challenges-from-user-input/SKILL.md delete mode 100644 .claude/skills/frontend-design/SKILL.md delete mode 100644 .claude/skills/future-product-opportunities-from-market-inflection-points/SKILL.md delete mode 100644 .claude/skills/group-decision-making-quality-review/SKILL.md delete mode 100644 .claude/skills/grow/SKILL.md delete mode 100644 .claude/skills/growth-loops/SKILL.md delete mode 100644 .claude/skills/growth-project-generation-with-pioneer-migrator-settler/SKILL.md delete mode 100644 .claude/skills/growth-strategy-synthesis-from-user-inputs/SKILL.md delete mode 100644 .claude/skills/gtm-motions/SKILL.md delete mode 100644 .claude/skills/gtm-strategy/SKILL.md delete mode 100644 .claude/skills/ideal-customer-profile-icp-representative-for-x-product/SKILL.md delete mode 100644 .claude/skills/ideas-for-affordances-and-signifiers-based-on-a-design-problem/SKILL.md delete mode 100644 .claude/skills/implementation-notes/SKILL.md delete mode 100644 .claude/skills/industry-trend-strategy/SKILL.md delete mode 100644 .claude/skills/influence-strategies-from-cialdini-s-7-principles/SKILL.md delete mode 100644 .claude/skills/innovation-decision-making-heuristics/SKILL.md delete mode 100644 .claude/skills/innovative-idea-generation-from-project-parameters-and/SKILL.md delete mode 100644 .claude/skills/innovative-idea-generation-from-structured-brainstorming/SKILL.md delete mode 100644 .claude/skills/innovative-product-ideas-from-structured-brainstorming/SKILL.md delete mode 100644 .claude/skills/interactive-intake-for-ost-inputs/SKILL.md delete mode 100644 .claude/skills/lean-canvas/SKILL.md delete mode 100644 .claude/skills/limit-based-product-strategy-from-problem-to-execution-plan/SKILL.md delete mode 100644 .claude/skills/low-frequency-to-power-user-transition-strategy/SKILL.md delete mode 100644 .claude/skills/managerial-finance-dcf/SKILL.md delete mode 100644 .claude/skills/map-power-dynamics-before-meetings/SKILL.md delete mode 100644 .claude/skills/market-opportunities-from-jobs-to-be-done-market-canvas/SKILL.md delete mode 100644 .claude/skills/market-opportunity/SKILL.md delete mode 100644 .claude/skills/market-orientation-audit/SKILL.md delete mode 100644 .claude/skills/market-requirements-from-strategic-market-inputs/SKILL.md delete mode 100644 .claude/skills/market-sizing/SKILL.md delete mode 100644 .claude/skills/mece-analysis-and-logical-tree-from-list-items/SKILL.md delete mode 100644 .claude/skills/meeting-agendas-from-meeting-descriptions/SKILL.md delete mode 100644 .claude/skills/meeting-outcome-planning-and-stakeholder-alignment/SKILL.md delete mode 100644 .claude/skills/meeting-summaries-from-meeting-transcript-ideas-framework/SKILL.md delete mode 100644 .claude/skills/message-framing-and-comms-plan-designer/SKILL.md delete mode 100644 .claude/skills/metric-drops-diagnosis-with-rigorous-stepwise-decomposition/SKILL.md delete mode 100644 .claude/skills/metrics-review/SKILL.md delete mode 100644 .claude/skills/monetization-strategy/SKILL.md delete mode 100644 .claude/skills/multi-step-workflow-optimization/SKILL.md delete mode 100644 .claude/skills/multiple-interface-descriptions-from-a-single-image/SKILL.md delete mode 100644 .claude/skills/netmba-competitor-analysis/SKILL.md delete mode 100644 .claude/skills/north-star-metric/SKILL.md delete mode 100644 .claude/skills/now-next-later-vision-roadmap-from-interview-synthesis/SKILL.md delete mode 100644 .claude/skills/nps-feedback-for-prioritized-customer-experience-initiatives/SKILL.md delete mode 100644 .claude/skills/offbeat-question-generation-from-any-topic/SKILL.md delete mode 100644 .claude/skills/office-politics-with-machiavellian-strategy/SKILL.md delete mode 100644 .claude/skills/okr-planning-from-vision-statements/SKILL.md delete mode 100644 .claude/skills/onboarding-flow-optimization-from-product-data-to-user-success/SKILL.md delete mode 100644 .claude/skills/operate/SKILL.md delete mode 100644 .claude/skills/opportunity-solution-tree-from-input/SKILL.md delete mode 100644 .claude/skills/outcome-roadmap/SKILL.md delete mode 100644 .claude/skills/plg-growth-playbook/SKILL.md delete mode 100644 .claude/skills/pm-context-and-design-constraints/SKILL.md delete mode 100644 .claude/skills/pmf-review/SKILL.md delete mode 100644 .claude/skills/positioning-statements-from-competitive-analysis-and-value/SKILL.md delete mode 100644 .claude/skills/post-launch-feedback-into-v2-improvements-synthesis/SKILL.md delete mode 100644 .claude/skills/post-launch-feedback-loop/SKILL.md delete mode 100644 .claude/skills/potential-hidden-agenda-identification/SKILL.md delete mode 100644 .claude/skills/prds-from-industry-and-feature-specifications/SKILL.md delete mode 100644 .claude/skills/prds-from-product-information-and-assumptions/SKILL.md delete mode 100644 .claude/skills/pre-mortem/SKILL.md delete mode 100644 .claude/skills/presentation-narratives-from-conversation-transcripts/SKILL.md delete mode 100644 .claude/skills/presentations-from-5-step-storytelling-framework/SKILL.md delete mode 100644 .claude/skills/presentations-from-structured-content-and-context/SKILL.md delete mode 100644 .claude/skills/press-releases-from-product-vision-working-backwards/SKILL.md delete mode 100644 .claude/skills/pricing-strategy/SKILL.md delete mode 100644 .claude/skills/prioritization-frameworks/SKILL.md delete mode 100644 .claude/skills/privacy-policy/SKILL.md delete mode 100644 .claude/skills/problem-framing-before-jumping-to-solutions/SKILL.md delete mode 100644 .claude/skills/problem-statement-framing-from-conversation-transcript/SKILL.md delete mode 100644 .claude/skills/product-assumptions-from-core-strategy-inputs/SKILL.md delete mode 100644 .claude/skills/product-brainstorming/SKILL.md delete mode 100644 .claude/skills/product-decision-analysis-from-anthropological-research/SKILL.md delete mode 100644 .claude/skills/product-design-analysis-from-context-and-screenshots/SKILL.md delete mode 100644 .claude/skills/product-feature-impact-sizing-from-metrics-and-usage-data/SKILL.md delete mode 100644 .claude/skills/product-ideas-from-user-responses/SKILL.md delete mode 100644 .claude/skills/product-market-fit-cycle/SKILL.md delete mode 100644 .claude/skills/product-refinement-session-planning/SKILL.md delete mode 100644 .claude/skills/product-requirements-from-structured-analysis/SKILL.md delete mode 100644 .claude/skills/product-review/SKILL.md delete mode 100644 .claude/skills/product-simplification-via-via-negativa-analysis/SKILL.md delete mode 100644 .claude/skills/product-strategy-review-from-draft-documents/SKILL.md delete mode 100644 .claude/skills/product-vision/SKILL.md delete mode 100644 .claude/skills/proto-persona-profiles-from-user-research-and-market-data/SKILL.md delete mode 100644 .claude/skills/prototype-creation-from-image-descriptions-and-app-info/SKILL.md delete mode 100644 .claude/skills/pyramid-structure-optimization-from-complex-text/SKILL.md delete mode 100644 .claude/skills/qa/SKILL.md delete mode 100644 .claude/skills/raw-interview-transcript-cleanup/SKILL.md delete mode 100644 .claude/skills/realistic-jtbd-interview-transcripts/SKILL.md delete mode 100644 .claude/skills/reinforcing-sequence-from-unstructured-items/SKILL.md delete mode 100644 .claude/skills/release-notes/SKILL.md delete mode 100644 .claude/skills/release/SKILL.md delete mode 100644 .claude/skills/remote-miro-workshops-from-transcripts-and-specs/SKILL.md delete mode 100644 .claude/skills/requirements-prioritization-with-p0-p1-p2-framework/SKILL.md delete mode 100644 .claude/skills/research-into-durable-competitive-moats/SKILL.md delete mode 100644 .claude/skills/risk-return-cost-of-capital/SKILL.md delete mode 100644 .claude/skills/risky-assumption-prioritization-for-rapid-validation/SKILL.md delete mode 100644 .claude/skills/roadmap-update/SKILL.md delete mode 100644 .claude/skills/robust-experiment-design-from-goals-and-systems/SKILL.md delete mode 100644 .claude/skills/role-identity-decision-making-map/SKILL.md delete mode 100644 .claude/skills/root-cause-and-consequence-analysis-from-a-question/SKILL.md delete mode 100644 .claude/skills/scope-defense-using-time-cost-tradeoff-analysis/SKILL.md delete mode 100644 .claude/skills/sketch-descriptions-for-wireframes-from-product-ideas/SKILL.md delete mode 100644 .claude/skills/skimmable-writing-transformation/SKILL.md delete mode 100644 .claude/skills/slide-decks-from-problem-statements-and-context/SKILL.md delete mode 100644 .claude/skills/solution-anti-patterns-from-customer-problem-analysis/SKILL.md delete mode 100644 .claude/skills/solution-design-for-edge-cases-in-product-development/SKILL.md delete mode 100644 .claude/skills/spec-writing/SKILL.md delete mode 100644 .claude/skills/sprint-planning/SKILL.md delete mode 100644 .claude/skills/sql-queries/SKILL.md delete mode 100644 .claude/skills/sql-query-from-requirements-and-data-tables/SKILL.md delete mode 100644 .claude/skills/stakeholder-brief-clarification-and-problem-definition/SKILL.md delete mode 100644 .claude/skills/stakeholder-decision-making-using-toc-thinking-process/SKILL.md delete mode 100644 .claude/skills/stakeholder-moo-objections-and-product-derailment-risks/SKILL.md delete mode 100644 .claude/skills/stakeholder-power-interest-and-influence-map/SKILL.md delete mode 100644 .claude/skills/stakeholder-risk-review-for-a-feature-or-prd/SKILL.md delete mode 100644 .claude/skills/stakeholder-update/SKILL.md delete mode 100644 .claude/skills/startup-canvas/SKILL.md delete mode 100644 .claude/skills/statistical-analysis/SKILL.md delete mode 100644 .claude/skills/strategic-crux-diagnosis-and-strategy-design/SKILL.md delete mode 100644 .claude/skills/strategic-decision-making-quality-review/SKILL.md delete mode 100644 .claude/skills/strategic-moves-from-swot-pairings/SKILL.md delete mode 100644 .claude/skills/strategic-presentation-planning-from-topic-audience-and-time/SKILL.md delete mode 100644 .claude/skills/strategy-curve-blue-ocean/SKILL.md delete mode 100644 .claude/skills/strategy-kernel-extraction-from-context/SKILL.md delete mode 100644 .claude/skills/strategy-to-execution-bridge-for-ux-decisions/SKILL.md delete mode 100644 .claude/skills/structured-decision-journals-from-decisions-and-context/SKILL.md delete mode 100644 .claude/skills/structured-insight-extraction-from-conversation-transcripts/SKILL.md delete mode 100644 .claude/skills/structured-interview-notes-from-transcript-using-flexible/SKILL.md delete mode 100644 .claude/skills/structured-json-descriptions-from-ui-screenshots/SKILL.md delete mode 100644 .claude/skills/structured-product-hypotheses-from-product-problems/SKILL.md delete mode 100644 .claude/skills/structured-product-strategy-from-product-context/SKILL.md delete mode 100644 .claude/skills/structured-requirements-from-conversation-transcripts/SKILL.md delete mode 100644 .claude/skills/structured-requirements-from-design-assets/SKILL.md delete mode 100644 .claude/skills/success-metrics-for-design-decisions/SKILL.md delete mode 100644 .claude/skills/support-tickets-as-actionable-product-improvements/SKILL.md delete mode 100644 .claude/skills/sustainable-business-model/SKILL.md delete mode 100644 .claude/skills/synthesize-research/SKILL.md delete mode 100644 .claude/skills/systematic-debugging/SKILL.md delete mode 100644 .claude/skills/target-opportunity-selection-from-ost/SKILL.md delete mode 100644 .claude/skills/task-list-optimization-and-contingency-based-project-planning/SKILL.md delete mode 100644 .claude/skills/task-specific-product-strategy-design/SKILL.md delete mode 100644 .claude/skills/tdd/SKILL.md delete mode 100644 .claude/skills/technical-architecture-brief-from-product-requirements-doc/SKILL.md delete mode 100644 .claude/skills/technical-translation-and-stakeholder-communication/SKILL.md delete mode 100644 .claude/skills/test-scenarios/SKILL.md delete mode 100644 .claude/skills/thesis-review/SKILL.md delete mode 100644 .claude/skills/trade-off-analysis-from-feature-priority-and-effort-data/SKILL.md delete mode 100644 .claude/skills/user-stories-from-initiative-requirements/SKILL.md delete mode 100644 .claude/skills/user-stories-with-gherkin-acceptance-criteria-from-requirements/SKILL.md delete mode 100644 .claude/skills/ux-edge-cases-from-product-briefs/SKILL.md delete mode 100644 .claude/skills/ux-terminology-improvements-in-product-requirements/SKILL.md delete mode 100644 .claude/skills/validate-data/SKILL.md delete mode 100644 .claude/skills/valuation-and-deal-pricing/SKILL.md delete mode 100644 .claude/skills/value-chain-mapping-from-end-user-needs-to-core-value/SKILL.md delete mode 100644 .claude/skills/venture-capital-deal-modeling/SKILL.md delete mode 100644 .claude/skills/verification/SKILL.md delete mode 100644 .claude/skills/visual-decision-making-review/SKILL.md delete mode 100644 .claude/skills/workshop-activity-design-from-problem-and-participant/SKILL.md delete mode 100644 .claude/skills/write-query/SKILL.md delete mode 100644 .claude/skills/write-spec/SKILL.md delete mode 100644 .claude/skills/writing-plans/SKILL.md delete mode 100644 .claude/skills/wwas/SKILL.md create mode 100644 .coderabbit.yaml create mode 100644 .commitlintrc.yaml delete mode 100644 .cursor/productize-runtime.json delete mode 100644 .cursor/skills/productize-behavioral-guidelines/SKILL.md delete mode 100644 .cursor/skills/productize-business-model-blindspots/references/diagnostic-questions.md delete mode 100644 .cursor/skills/productize-business-model-blindspots/references/output-format.md delete mode 100644 .cursor/skills/productize-business-model-design/assets/lean-business-model-canvas.html delete mode 100644 .cursor/skills/productize-business-model-design/assets/platform-business-model-canvas.html delete mode 100644 .cursor/skills/productize-business-model-design/assets/standard-business-model-canvas.html delete mode 100644 .cursor/skills/productize-business-model-design/references/business-model-output-rules.md delete mode 100644 .cursor/skills/productize-business-model-design/references/canvas-selection.md delete mode 100644 .cursor/skills/productize-business-model-design/references/canvas-templates.md delete mode 100644 .cursor/skills/productize-business-model-design/references/pm-skills-main-merge.md delete mode 100644 .cursor/skills/productize-competitive-brief/references/pm-skills-main-merge.md delete mode 100644 .cursor/skills/productize-data-context-extractor/references/domain-template.md delete mode 100644 .cursor/skills/productize-data-context-extractor/references/example-generated-skill.md delete mode 100644 .cursor/skills/productize-data-context-extractor/references/skill-template.md delete mode 100644 .cursor/skills/productize-data-context-extractor/references/sql-dialects.md delete mode 100644 .cursor/skills/productize-data-context-extractor/references/tables/README.md delete mode 100755 .cursor/skills/productize-data-context-extractor/scripts/package_data_skill.py delete mode 100644 .cursor/skills/productize-dogfood/references/issue-taxonomy.md delete mode 100644 .cursor/skills/productize-dogfood/templates/dogfood-report-template.md delete mode 100644 .cursor/skills/productize-effective-customer-interview-guides-for-any-topic/references/pm-skills-main-merge.md delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/apv.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/bond_math.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/cap_table.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/capital_structure.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/capm.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/convertible_notes.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/dcf.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/market_context.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/option_pools.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/preferred_stock.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/returns.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/risk.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/safes.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/time_value.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/validation.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/valuation.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/vc_method.py delete mode 100644 .cursor/skills/productize-finance-modeling-kernel/finance-modeling-kernel/wacc.py delete mode 100644 .cursor/skills/productize-ideal-customer-profile-icp-representative-for-x-product/references/pm-skills-main-merge.md delete mode 100644 .cursor/skills/productize-market-opportunity/references/canonical-canvases.md delete mode 100644 .cursor/skills/productize-market-opportunity/references/output-formats.md delete mode 100644 .cursor/skills/productize-market-opportunity/references/rating-and-decision-rules.md delete mode 100644 .cursor/skills/productize-opportunity-solution-tree-from-input/references/pm-skills-main-merge.md delete mode 100644 .cursor/skills/productize-positioning-statements-from-competitive-analysis-and-value/references/pm-skills-main-merge.md delete mode 100644 .cursor/skills/productize-proto-persona-profiles-from-user-research-and-market-data/references/pm-skills-main-merge.md delete mode 100644 .cursor/skills/productize-stakeholder-power-interest-and-influence-map/references/pm-skills-main-merge.md delete mode 100644 .cursor/skills/productize-structured-interview-notes-from-transcript-using-flexible/references/pm-skills-main-merge.md delete mode 100644 .cursor/skills/productize-sustainable-business-model/references/output-format.md delete mode 100644 .cursor/skills/productize-sustainable-business-model/references/pattern-groups.md delete mode 100644 .cursor/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/references/pm-skills-main-merge.md delete mode 100644 .cursor/skills/productize-write-query/references/pm-skills-main-merge.md delete mode 100644 .cursor/skills/productize-write-spec/references/pm-skills-main-merge.md delete mode 100644 .cursor/skills/productize/SKILL.md create mode 100644 .editorconfig delete mode 100644 .factory/productize-runtime.json delete mode 100644 .factory/skills/productize-0-1/SKILL.md delete mode 100644 .factory/skills/productize-aarrr-growth-diagnostics/SKILL.md delete mode 100644 .factory/skills/productize-ab-test-analysis/SKILL.md delete mode 100644 .factory/skills/productize-acceptance-criteria-for-ui/SKILL.md delete mode 100644 .factory/skills/productize-accessibility-review/SKILL.md delete mode 100644 .factory/skills/productize-actionable-customer-interview-guides-from-research-topics/SKILL.md delete mode 100644 .factory/skills/productize-actionable-job-stories-from-interview-transcripts/SKILL.md delete mode 100644 .factory/skills/productize-actionable-product-improvements-from-survey-responses/SKILL.md delete mode 100644 .factory/skills/productize-actionable-research-briefs-from-problem-statements-and/SKILL.md delete mode 100644 .factory/skills/productize-actionable-user-profiles-with-tasks-and-constraints-from/SKILL.md delete mode 100644 .factory/skills/productize-actionable-user-research-decisions-from-project-insights/SKILL.md delete mode 100644 .factory/skills/productize-adaptive-planning-from-scenarios-to-strategic-actions/SKILL.md delete mode 100644 .factory/skills/productize-aging-research-insight-validation-before-reusing/SKILL.md delete mode 100644 .factory/skills/productize-ai-product-evaluation-from-recommendation-canvas-framework/SKILL.md delete mode 100644 .factory/skills/productize-analyze-feature-requests/SKILL.md delete mode 100644 .factory/skills/productize-analyze/SKILL.md delete mode 100644 .factory/skills/productize-app-aha-moment-identification-from-user-data-and-app/SKILL.md delete mode 100644 .factory/skills/productize-app-design-from-project-requirements/SKILL.md delete mode 100644 .factory/skills/productize-autoplan/SKILL.md delete mode 100644 .factory/skills/productize-backend-design/SKILL.md delete mode 100644 .factory/skills/productize-beachhead-segment/SKILL.md delete mode 100644 .factory/skills/productize-behavioral-guidelines/SKILL.md delete mode 100644 .factory/skills/productize-brainstorm/SKILL.md delete mode 100644 .factory/skills/productize-brand-archetype-strategy/SKILL.md delete mode 100644 .factory/skills/productize-brand-equity-diagnostics/SKILL.md delete mode 100644 .factory/skills/productize-bug-prioritization-against-work-in-progress/SKILL.md delete mode 100644 .factory/skills/productize-build-dashboard/SKILL.md delete mode 100644 .factory/skills/productize-business-flywheel-from-company-successes-and-failures/SKILL.md delete mode 100644 .factory/skills/productize-business-model-blindspots/SKILL.md delete mode 100644 .factory/skills/productize-business-model-blindspots/references/diagnostic-questions.md delete mode 100644 .factory/skills/productize-business-model-blindspots/references/output-format.md delete mode 100644 .factory/skills/productize-business-model-design/SKILL.md delete mode 100644 .factory/skills/productize-business-model-design/assets/lean-business-model-canvas.html delete mode 100644 .factory/skills/productize-business-model-design/assets/platform-business-model-canvas.html delete mode 100644 .factory/skills/productize-business-model-design/assets/standard-business-model-canvas.html delete mode 100644 .factory/skills/productize-business-model-design/references/business-model-output-rules.md delete mode 100644 .factory/skills/productize-business-model-design/references/canvas-selection.md delete mode 100644 .factory/skills/productize-business-model-design/references/canvas-templates.md delete mode 100644 .factory/skills/productize-business-model-design/references/pm-skills-main-merge.md delete mode 100644 .factory/skills/productize-business-strategy-creation-from-expert-strategic-thinking/SKILL.md delete mode 100644 .factory/skills/productize-capital-structure-financing/SKILL.md delete mode 100644 .factory/skills/productize-challenging-meeting-with-stakeholders/SKILL.md delete mode 100644 .factory/skills/productize-churn-reduction-from-customer-data-and-exit-survey-analysis/SKILL.md delete mode 100644 .factory/skills/productize-clustered-jtbd-forces-from-interview-data/SKILL.md delete mode 100644 .factory/skills/productize-cohort-analysis/SKILL.md delete mode 100644 .factory/skills/productize-comms-review/SKILL.md delete mode 100644 .factory/skills/productize-competitive-advantage-diagnostics-and-moat-strategy/SKILL.md delete mode 100644 .factory/skills/productize-competitive-analysis-to-winning-positioning-strategy/SKILL.md delete mode 100644 .factory/skills/productize-competitive-brief/SKILL.md delete mode 100644 .factory/skills/productize-competitive-brief/references/pm-skills-main-merge.md delete mode 100644 .factory/skills/productize-competitive-parity-and-strategic-differentiation/SKILL.md delete mode 100644 .factory/skills/productize-complex-problem-structuring-into-actionable-recommendations/SKILL.md delete mode 100644 .factory/skills/productize-comprehensive-use-cases-from-user-input-for-product-strategy/SKILL.md delete mode 100644 .factory/skills/productize-conflicting-stakeholder-requirements-to-balanced-design/SKILL.md delete mode 100644 .factory/skills/productize-conversation-summaries-from-meeting-transcripts/SKILL.md delete mode 100644 .factory/skills/productize-create-viz/SKILL.md delete mode 100644 .factory/skills/productize-creative-solution-generation-from-de-bono-s-lateral-thinking/SKILL.md delete mode 100644 .factory/skills/productize-creative-solution-generation-from-metaphorical-thinking/SKILL.md delete mode 100644 .factory/skills/productize-crisis-communication-plan-from-outage-details-and-company/SKILL.md delete mode 100644 .factory/skills/productize-critical-flaws-in-product-requirements-tough-and-unreasonable/SKILL.md delete mode 100644 .factory/skills/productize-ctas-from-copywriting-strategies/SKILL.md delete mode 100644 .factory/skills/productize-customer-insights-extraction-from-interview-transcript-using/SKILL.md delete mode 100644 .factory/skills/productize-customer-journey-map-based-on-user-behavior-data/SKILL.md delete mode 100644 .factory/skills/productize-data-context-extractor/SKILL.md delete mode 100644 .factory/skills/productize-data-context-extractor/references/domain-template.md delete mode 100644 .factory/skills/productize-data-context-extractor/references/example-generated-skill.md delete mode 100644 .factory/skills/productize-data-context-extractor/references/skill-template.md delete mode 100644 .factory/skills/productize-data-context-extractor/references/sql-dialects.md delete mode 100644 .factory/skills/productize-data-context-extractor/references/tables/README.md delete mode 100755 .factory/skills/productize-data-context-extractor/scripts/package_data_skill.py delete mode 100644 .factory/skills/productize-data-driven-research-plans-from-leadership-intuition/SKILL.md delete mode 100644 .factory/skills/productize-data-visualization/SKILL.md delete mode 100644 .factory/skills/productize-decision-making-with-the-gut-check-protocol/SKILL.md delete mode 100644 .factory/skills/productize-decision-reversibility-classification-from-first-principles/SKILL.md delete mode 100644 .factory/skills/productize-decision-rights-using-davci/SKILL.md delete mode 100644 .factory/skills/productize-defining-the-niche-from-user-input/SKILL.md delete mode 100644 .factory/skills/productize-demo-narratives-showing-user-goals/SKILL.md delete mode 100644 .factory/skills/productize-design-critique/SKILL.md delete mode 100644 .factory/skills/productize-design-handoff/SKILL.md delete mode 100644 .factory/skills/productize-design-review/SKILL.md delete mode 100644 .factory/skills/productize-design-system/SKILL.md delete mode 100644 .factory/skills/productize-detailed-project-plans-from-project-briefs/SKILL.md delete mode 100644 .factory/skills/productize-difficult-conversation-script-5-step-framework/SKILL.md delete mode 100644 .factory/skills/productize-disruptive-strategy-generation-from-what-if-questions/SKILL.md delete mode 100644 .factory/skills/productize-docs/SKILL.md delete mode 100644 .factory/skills/productize-dogfood/SKILL.md delete mode 100644 .factory/skills/productize-dogfood/references/issue-taxonomy.md delete mode 100644 .factory/skills/productize-dogfood/templates/dogfood-report-template.md delete mode 100644 .factory/skills/productize-draft-nda/SKILL.md delete mode 100644 .factory/skills/productize-dual-mode-ai-coding-assistant-staff-eng-intern/SKILL.md delete mode 100644 .factory/skills/productize-dx-review/SKILL.md delete mode 100644 .factory/skills/productize-easy-signal-identification-from-product-assumption/SKILL.md delete mode 100644 .factory/skills/productize-effective-customer-interview-guides-for-any-topic/SKILL.md delete mode 100644 .factory/skills/productize-effective-customer-interview-guides-for-any-topic/references/pm-skills-main-merge.md delete mode 100644 .factory/skills/productize-empathy-maps/SKILL.md delete mode 100644 .factory/skills/productize-eng-review/SKILL.md delete mode 100644 .factory/skills/productize-engineering-problem-solving-and-solution-structuring/SKILL.md delete mode 100644 .factory/skills/productize-event-tracking-schemas-from-ui-and-metrics-requirements/SKILL.md delete mode 100644 .factory/skills/productize-exec-feedback-without-context-to-actionable-design-requirements/SKILL.md delete mode 100644 .factory/skills/productize-executive-and-update-review/SKILL.md delete mode 100644 .factory/skills/productize-executive-decks-from-quick-dirty-test-analysis/SKILL.md delete mode 100644 .factory/skills/productize-explore-data/SKILL.md delete mode 100644 .factory/skills/productize-feature-impact-models-from-kpis-and-assumptions/SKILL.md delete mode 100644 .factory/skills/productize-feature-results-analysis-from-draft-to-final-report/SKILL.md delete mode 100644 .factory/skills/productize-features-reframing-and-projects-shape-up/SKILL.md delete mode 100644 .factory/skills/productize-finance-modeling-kernel/SKILL.md delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/apv.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/bond_math.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/cap_table.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/capital_structure.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/capm.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/convertible_notes.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/dcf.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/market_context.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/option_pools.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/preferred_stock.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/returns.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/risk.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/safes.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/time_value.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/validation.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/valuation.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/vc_method.py delete mode 100644 .factory/skills/productize-finance-modeling-kernel/finance-modeling-kernel/wacc.py delete mode 100644 .factory/skills/productize-financial-markets-context/SKILL.md delete mode 100644 .factory/skills/productize-fragmented-user-research-synthesis-into-coherent-insights/SKILL.md delete mode 100644 .factory/skills/productize-framework-application-to-product-challenges-from-user-input/SKILL.md delete mode 100644 .factory/skills/productize-frontend-design/SKILL.md delete mode 100644 .factory/skills/productize-future-product-opportunities-from-market-inflection-points/SKILL.md delete mode 100644 .factory/skills/productize-group-decision-making-quality-review/SKILL.md delete mode 100644 .factory/skills/productize-grow/SKILL.md delete mode 100644 .factory/skills/productize-growth-loops/SKILL.md delete mode 100644 .factory/skills/productize-growth-project-generation-with-pioneer-migrator-settler/SKILL.md delete mode 100644 .factory/skills/productize-growth-strategy-synthesis-from-user-inputs/SKILL.md delete mode 100644 .factory/skills/productize-gtm-motions/SKILL.md delete mode 100644 .factory/skills/productize-gtm-strategy/SKILL.md delete mode 100644 .factory/skills/productize-ideal-customer-profile-icp-representative-for-x-product/SKILL.md delete mode 100644 .factory/skills/productize-ideal-customer-profile-icp-representative-for-x-product/references/pm-skills-main-merge.md delete mode 100644 .factory/skills/productize-ideas-for-affordances-and-signifiers-based-on-a-design-problem/SKILL.md delete mode 100644 .factory/skills/productize-implementation-notes/SKILL.md delete mode 100644 .factory/skills/productize-industry-trend-strategy/SKILL.md delete mode 100644 .factory/skills/productize-influence-strategies-from-cialdini-s-7-principles/SKILL.md delete mode 100644 .factory/skills/productize-innovation-decision-making-heuristics/SKILL.md delete mode 100644 .factory/skills/productize-innovative-idea-generation-from-project-parameters-and/SKILL.md delete mode 100644 .factory/skills/productize-innovative-idea-generation-from-structured-brainstorming/SKILL.md delete mode 100644 .factory/skills/productize-innovative-product-ideas-from-structured-brainstorming/SKILL.md delete mode 100644 .factory/skills/productize-interactive-intake-for-ost-inputs/SKILL.md delete mode 100644 .factory/skills/productize-lean-canvas/SKILL.md delete mode 100644 .factory/skills/productize-limit-based-product-strategy-from-problem-to-execution-plan/SKILL.md delete mode 100644 .factory/skills/productize-low-frequency-to-power-user-transition-strategy/SKILL.md delete mode 100644 .factory/skills/productize-managerial-finance-dcf/SKILL.md delete mode 100644 .factory/skills/productize-map-power-dynamics-before-meetings/SKILL.md delete mode 100644 .factory/skills/productize-market-opportunities-from-jobs-to-be-done-market-canvas/SKILL.md delete mode 100644 .factory/skills/productize-market-opportunity/SKILL.md delete mode 100644 .factory/skills/productize-market-opportunity/references/canonical-canvases.md delete mode 100644 .factory/skills/productize-market-opportunity/references/output-formats.md delete mode 100644 .factory/skills/productize-market-opportunity/references/rating-and-decision-rules.md delete mode 100644 .factory/skills/productize-market-orientation-audit/SKILL.md delete mode 100644 .factory/skills/productize-market-requirements-from-strategic-market-inputs/SKILL.md delete mode 100644 .factory/skills/productize-market-sizing/SKILL.md delete mode 100644 .factory/skills/productize-mece-analysis-and-logical-tree-from-list-items/SKILL.md delete mode 100644 .factory/skills/productize-meeting-agendas-from-meeting-descriptions/SKILL.md delete mode 100644 .factory/skills/productize-meeting-outcome-planning-and-stakeholder-alignment/SKILL.md delete mode 100644 .factory/skills/productize-meeting-summaries-from-meeting-transcript-ideas-framework/SKILL.md delete mode 100644 .factory/skills/productize-message-framing-and-comms-plan-designer/SKILL.md delete mode 100644 .factory/skills/productize-metric-drops-diagnosis-with-rigorous-stepwise-decomposition/SKILL.md delete mode 100644 .factory/skills/productize-metrics-review/SKILL.md delete mode 100644 .factory/skills/productize-monetization-strategy/SKILL.md delete mode 100644 .factory/skills/productize-multi-step-workflow-optimization/SKILL.md delete mode 100644 .factory/skills/productize-multiple-interface-descriptions-from-a-single-image/SKILL.md delete mode 100644 .factory/skills/productize-netmba-competitor-analysis/SKILL.md delete mode 100644 .factory/skills/productize-north-star-metric/SKILL.md delete mode 100644 .factory/skills/productize-now-next-later-vision-roadmap-from-interview-synthesis/SKILL.md delete mode 100644 .factory/skills/productize-nps-feedback-for-prioritized-customer-experience-initiatives/SKILL.md delete mode 100644 .factory/skills/productize-offbeat-question-generation-from-any-topic/SKILL.md delete mode 100644 .factory/skills/productize-office-politics-with-machiavellian-strategy/SKILL.md delete mode 100644 .factory/skills/productize-okr-planning-from-vision-statements/SKILL.md delete mode 100644 .factory/skills/productize-onboarding-flow-optimization-from-product-data-to-user-success/SKILL.md delete mode 100644 .factory/skills/productize-operate/SKILL.md delete mode 100644 .factory/skills/productize-opportunity-solution-tree-from-input/SKILL.md delete mode 100644 .factory/skills/productize-opportunity-solution-tree-from-input/references/pm-skills-main-merge.md delete mode 100644 .factory/skills/productize-outcome-roadmap/SKILL.md delete mode 100644 .factory/skills/productize-plg-growth-playbook/SKILL.md delete mode 100644 .factory/skills/productize-pm-context-and-design-constraints/SKILL.md delete mode 100644 .factory/skills/productize-pmf-review/SKILL.md delete mode 100644 .factory/skills/productize-positioning-statements-from-competitive-analysis-and-value/SKILL.md delete mode 100644 .factory/skills/productize-positioning-statements-from-competitive-analysis-and-value/references/pm-skills-main-merge.md delete mode 100644 .factory/skills/productize-post-launch-feedback-into-v2-improvements-synthesis/SKILL.md delete mode 100644 .factory/skills/productize-post-launch-feedback-loop/SKILL.md delete mode 100644 .factory/skills/productize-potential-hidden-agenda-identification/SKILL.md delete mode 100644 .factory/skills/productize-prds-from-industry-and-feature-specifications/SKILL.md delete mode 100644 .factory/skills/productize-prds-from-product-information-and-assumptions/SKILL.md delete mode 100644 .factory/skills/productize-pre-mortem/SKILL.md delete mode 100644 .factory/skills/productize-presentation-narratives-from-conversation-transcripts/SKILL.md delete mode 100644 .factory/skills/productize-presentations-from-5-step-storytelling-framework/SKILL.md delete mode 100644 .factory/skills/productize-presentations-from-structured-content-and-context/SKILL.md delete mode 100644 .factory/skills/productize-press-releases-from-product-vision-working-backwards/SKILL.md delete mode 100644 .factory/skills/productize-pricing-strategy/SKILL.md delete mode 100644 .factory/skills/productize-prioritization-frameworks/SKILL.md delete mode 100644 .factory/skills/productize-privacy-policy/SKILL.md delete mode 100644 .factory/skills/productize-problem-framing-before-jumping-to-solutions/SKILL.md delete mode 100644 .factory/skills/productize-problem-statement-framing-from-conversation-transcript/SKILL.md delete mode 100644 .factory/skills/productize-product-assumptions-from-core-strategy-inputs/SKILL.md delete mode 100644 .factory/skills/productize-product-brainstorming/SKILL.md delete mode 100644 .factory/skills/productize-product-decision-analysis-from-anthropological-research/SKILL.md delete mode 100644 .factory/skills/productize-product-design-analysis-from-context-and-screenshots/SKILL.md delete mode 100644 .factory/skills/productize-product-feature-impact-sizing-from-metrics-and-usage-data/SKILL.md delete mode 100644 .factory/skills/productize-product-ideas-from-user-responses/SKILL.md delete mode 100644 .factory/skills/productize-product-market-fit-cycle/SKILL.md delete mode 100644 .factory/skills/productize-product-refinement-session-planning/SKILL.md delete mode 100644 .factory/skills/productize-product-requirements-from-structured-analysis/SKILL.md delete mode 100644 .factory/skills/productize-product-review/SKILL.md delete mode 100644 .factory/skills/productize-product-simplification-via-via-negativa-analysis/SKILL.md delete mode 100644 .factory/skills/productize-product-strategy-review-from-draft-documents/SKILL.md delete mode 100644 .factory/skills/productize-product-vision/SKILL.md delete mode 100644 .factory/skills/productize-proto-persona-profiles-from-user-research-and-market-data/SKILL.md delete mode 100644 .factory/skills/productize-proto-persona-profiles-from-user-research-and-market-data/references/pm-skills-main-merge.md delete mode 100644 .factory/skills/productize-prototype-creation-from-image-descriptions-and-app-info/SKILL.md delete mode 100644 .factory/skills/productize-pyramid-structure-optimization-from-complex-text/SKILL.md delete mode 100644 .factory/skills/productize-qa/SKILL.md delete mode 100644 .factory/skills/productize-raw-interview-transcript-cleanup/SKILL.md delete mode 100644 .factory/skills/productize-realistic-jtbd-interview-transcripts/SKILL.md delete mode 100644 .factory/skills/productize-reinforcing-sequence-from-unstructured-items/SKILL.md delete mode 100644 .factory/skills/productize-release-notes/SKILL.md delete mode 100644 .factory/skills/productize-release/SKILL.md delete mode 100644 .factory/skills/productize-remote-miro-workshops-from-transcripts-and-specs/SKILL.md delete mode 100644 .factory/skills/productize-requirements-prioritization-with-p0-p1-p2-framework/SKILL.md delete mode 100644 .factory/skills/productize-research-into-durable-competitive-moats/SKILL.md delete mode 100644 .factory/skills/productize-risk-return-cost-of-capital/SKILL.md delete mode 100644 .factory/skills/productize-risky-assumption-prioritization-for-rapid-validation/SKILL.md delete mode 100644 .factory/skills/productize-roadmap-update/SKILL.md delete mode 100644 .factory/skills/productize-robust-experiment-design-from-goals-and-systems/SKILL.md delete mode 100644 .factory/skills/productize-role-identity-decision-making-map/SKILL.md delete mode 100644 .factory/skills/productize-root-cause-and-consequence-analysis-from-a-question/SKILL.md delete mode 100644 .factory/skills/productize-scope-defense-using-time-cost-tradeoff-analysis/SKILL.md delete mode 100644 .factory/skills/productize-sketch-descriptions-for-wireframes-from-product-ideas/SKILL.md delete mode 100644 .factory/skills/productize-skimmable-writing-transformation/SKILL.md delete mode 100644 .factory/skills/productize-slide-decks-from-problem-statements-and-context/SKILL.md delete mode 100644 .factory/skills/productize-solution-anti-patterns-from-customer-problem-analysis/SKILL.md delete mode 100644 .factory/skills/productize-solution-design-for-edge-cases-in-product-development/SKILL.md delete mode 100644 .factory/skills/productize-spec-writing/SKILL.md delete mode 100644 .factory/skills/productize-sprint-planning/SKILL.md delete mode 100644 .factory/skills/productize-sql-queries/SKILL.md delete mode 100644 .factory/skills/productize-sql-query-from-requirements-and-data-tables/SKILL.md delete mode 100644 .factory/skills/productize-stakeholder-brief-clarification-and-problem-definition/SKILL.md delete mode 100644 .factory/skills/productize-stakeholder-decision-making-using-toc-thinking-process/SKILL.md delete mode 100644 .factory/skills/productize-stakeholder-moo-objections-and-product-derailment-risks/SKILL.md delete mode 100644 .factory/skills/productize-stakeholder-power-interest-and-influence-map/SKILL.md delete mode 100644 .factory/skills/productize-stakeholder-power-interest-and-influence-map/references/pm-skills-main-merge.md delete mode 100644 .factory/skills/productize-stakeholder-risk-review-for-a-feature-or-prd/SKILL.md delete mode 100644 .factory/skills/productize-stakeholder-update/SKILL.md delete mode 100644 .factory/skills/productize-startup-canvas/SKILL.md delete mode 100644 .factory/skills/productize-statistical-analysis/SKILL.md delete mode 100644 .factory/skills/productize-strategic-crux-diagnosis-and-strategy-design/SKILL.md delete mode 100644 .factory/skills/productize-strategic-decision-making-quality-review/SKILL.md delete mode 100644 .factory/skills/productize-strategic-moves-from-swot-pairings/SKILL.md delete mode 100644 .factory/skills/productize-strategic-presentation-planning-from-topic-audience-and-time/SKILL.md delete mode 100644 .factory/skills/productize-strategy-curve-blue-ocean/SKILL.md delete mode 100644 .factory/skills/productize-strategy-kernel-extraction-from-context/SKILL.md delete mode 100644 .factory/skills/productize-strategy-to-execution-bridge-for-ux-decisions/SKILL.md delete mode 100644 .factory/skills/productize-structured-decision-journals-from-decisions-and-context/SKILL.md delete mode 100644 .factory/skills/productize-structured-insight-extraction-from-conversation-transcripts/SKILL.md delete mode 100644 .factory/skills/productize-structured-interview-notes-from-transcript-using-flexible/SKILL.md delete mode 100644 .factory/skills/productize-structured-interview-notes-from-transcript-using-flexible/references/pm-skills-main-merge.md delete mode 100644 .factory/skills/productize-structured-json-descriptions-from-ui-screenshots/SKILL.md delete mode 100644 .factory/skills/productize-structured-product-hypotheses-from-product-problems/SKILL.md delete mode 100644 .factory/skills/productize-structured-product-strategy-from-product-context/SKILL.md delete mode 100644 .factory/skills/productize-structured-requirements-from-conversation-transcripts/SKILL.md delete mode 100644 .factory/skills/productize-structured-requirements-from-design-assets/SKILL.md delete mode 100644 .factory/skills/productize-success-metrics-for-design-decisions/SKILL.md delete mode 100644 .factory/skills/productize-support-tickets-as-actionable-product-improvements/SKILL.md delete mode 100644 .factory/skills/productize-sustainable-business-model/SKILL.md delete mode 100644 .factory/skills/productize-sustainable-business-model/references/output-format.md delete mode 100644 .factory/skills/productize-sustainable-business-model/references/pattern-groups.md delete mode 100644 .factory/skills/productize-synthesize-research/SKILL.md delete mode 100644 .factory/skills/productize-systematic-debugging/SKILL.md delete mode 100644 .factory/skills/productize-target-opportunity-selection-from-ost/SKILL.md delete mode 100644 .factory/skills/productize-task-list-optimization-and-contingency-based-project-planning/SKILL.md delete mode 100644 .factory/skills/productize-task-specific-product-strategy-design/SKILL.md delete mode 100644 .factory/skills/productize-tdd/SKILL.md delete mode 100644 .factory/skills/productize-technical-architecture-brief-from-product-requirements-doc/SKILL.md delete mode 100644 .factory/skills/productize-technical-translation-and-stakeholder-communication/SKILL.md delete mode 100644 .factory/skills/productize-test-scenarios/SKILL.md delete mode 100644 .factory/skills/productize-thesis-review/SKILL.md delete mode 100644 .factory/skills/productize-trade-off-analysis-from-feature-priority-and-effort-data/SKILL.md delete mode 100644 .factory/skills/productize-user-stories-from-initiative-requirements/SKILL.md delete mode 100644 .factory/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/SKILL.md delete mode 100644 .factory/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/references/pm-skills-main-merge.md delete mode 100644 .factory/skills/productize-ux-edge-cases-from-product-briefs/SKILL.md delete mode 100644 .factory/skills/productize-ux-terminology-improvements-in-product-requirements/SKILL.md delete mode 100644 .factory/skills/productize-validate-data/SKILL.md delete mode 100644 .factory/skills/productize-valuation-and-deal-pricing/SKILL.md delete mode 100644 .factory/skills/productize-value-chain-mapping-from-end-user-needs-to-core-value/SKILL.md delete mode 100644 .factory/skills/productize-venture-capital-deal-modeling/SKILL.md delete mode 100644 .factory/skills/productize-verification/SKILL.md delete mode 100644 .factory/skills/productize-visual-decision-making-review/SKILL.md delete mode 100644 .factory/skills/productize-workshop-activity-design-from-problem-and-participant/SKILL.md delete mode 100644 .factory/skills/productize-write-query/SKILL.md delete mode 100644 .factory/skills/productize-write-query/references/pm-skills-main-merge.md delete mode 100644 .factory/skills/productize-write-spec/SKILL.md delete mode 100644 .factory/skills/productize-write-spec/references/pm-skills-main-merge.md delete mode 100644 .factory/skills/productize-writing-plans/SKILL.md delete mode 100644 .factory/skills/productize-wwas/SKILL.md delete mode 100644 .factory/skills/productize/SKILL.md delete mode 100644 .gitattributes create mode 100644 .github/CODEOWNERS create mode 100644 .github/actions/setup-bun/action.yml create mode 100644 .github/actions/setup-git-cliff/action.yml create mode 100644 .github/actions/setup-go/action.yml create mode 100644 .github/actions/setup-node/action.yml create mode 100644 .github/actions/setup-release/action.yml create mode 100644 .github/codeql/codeql-config.yml create mode 100644 .github/versions.yml create mode 100644 .github/workflows/auto-docs.yml create mode 100644 .github/workflows/claude.yml delete mode 100644 .github/workflows/evals-periodic.yml delete mode 100644 .github/workflows/evals.yml create mode 100644 .github/workflows/release.yml delete mode 100644 .github/workflows/skill-docs.yml delete mode 100644 .github/workflows/version-gate.yml create mode 100644 .golangci.yml create mode 100644 .goreleaser.release-footer.md.tmpl create mode 100644 .goreleaser.release-header.md.tmpl create mode 100644 .goreleaser.yml create mode 100644 .husky/commit-msg create mode 100644 .husky/pre-commit delete mode 100644 .opencode/productize-runtime.json delete mode 100644 .opencode/skills/productize-0-1/SKILL.md delete mode 100644 .opencode/skills/productize-aarrr-growth-diagnostics/SKILL.md delete mode 100644 .opencode/skills/productize-ab-test-analysis/SKILL.md delete mode 100644 .opencode/skills/productize-acceptance-criteria-for-ui/SKILL.md delete mode 100644 .opencode/skills/productize-accessibility-review/SKILL.md delete mode 100644 .opencode/skills/productize-actionable-customer-interview-guides-from-research-topics/SKILL.md delete mode 100644 .opencode/skills/productize-actionable-job-stories-from-interview-transcripts/SKILL.md delete mode 100644 .opencode/skills/productize-actionable-product-improvements-from-survey-responses/SKILL.md delete mode 100644 .opencode/skills/productize-actionable-research-briefs-from-problem-statements-and/SKILL.md delete mode 100644 .opencode/skills/productize-actionable-user-profiles-with-tasks-and-constraints-from/SKILL.md delete mode 100644 .opencode/skills/productize-actionable-user-research-decisions-from-project-insights/SKILL.md delete mode 100644 .opencode/skills/productize-adaptive-planning-from-scenarios-to-strategic-actions/SKILL.md delete mode 100644 .opencode/skills/productize-aging-research-insight-validation-before-reusing/SKILL.md delete mode 100644 .opencode/skills/productize-ai-product-evaluation-from-recommendation-canvas-framework/SKILL.md delete mode 100644 .opencode/skills/productize-analyze-feature-requests/SKILL.md delete mode 100644 .opencode/skills/productize-analyze/SKILL.md delete mode 100644 .opencode/skills/productize-app-aha-moment-identification-from-user-data-and-app/SKILL.md delete mode 100644 .opencode/skills/productize-app-design-from-project-requirements/SKILL.md delete mode 100644 .opencode/skills/productize-autoplan/SKILL.md delete mode 100644 .opencode/skills/productize-backend-design/SKILL.md delete mode 100644 .opencode/skills/productize-beachhead-segment/SKILL.md delete mode 100644 .opencode/skills/productize-behavioral-guidelines/SKILL.md delete mode 100644 .opencode/skills/productize-brainstorm/SKILL.md delete mode 100644 .opencode/skills/productize-brand-archetype-strategy/SKILL.md delete mode 100644 .opencode/skills/productize-brand-equity-diagnostics/SKILL.md delete mode 100644 .opencode/skills/productize-bug-prioritization-against-work-in-progress/SKILL.md delete mode 100644 .opencode/skills/productize-build-dashboard/SKILL.md delete mode 100644 .opencode/skills/productize-business-flywheel-from-company-successes-and-failures/SKILL.md delete mode 100644 .opencode/skills/productize-business-model-blindspots/SKILL.md delete mode 100644 .opencode/skills/productize-business-model-blindspots/references/diagnostic-questions.md delete mode 100644 .opencode/skills/productize-business-model-blindspots/references/output-format.md delete mode 100644 .opencode/skills/productize-business-model-design/SKILL.md delete mode 100644 .opencode/skills/productize-business-model-design/assets/lean-business-model-canvas.html delete mode 100644 .opencode/skills/productize-business-model-design/assets/platform-business-model-canvas.html delete mode 100644 .opencode/skills/productize-business-model-design/assets/standard-business-model-canvas.html delete mode 100644 .opencode/skills/productize-business-model-design/references/business-model-output-rules.md delete mode 100644 .opencode/skills/productize-business-model-design/references/canvas-selection.md delete mode 100644 .opencode/skills/productize-business-model-design/references/canvas-templates.md delete mode 100644 .opencode/skills/productize-business-model-design/references/pm-skills-main-merge.md delete mode 100644 .opencode/skills/productize-business-strategy-creation-from-expert-strategic-thinking/SKILL.md delete mode 100644 .opencode/skills/productize-capital-structure-financing/SKILL.md delete mode 100644 .opencode/skills/productize-challenging-meeting-with-stakeholders/SKILL.md delete mode 100644 .opencode/skills/productize-churn-reduction-from-customer-data-and-exit-survey-analysis/SKILL.md delete mode 100644 .opencode/skills/productize-clustered-jtbd-forces-from-interview-data/SKILL.md delete mode 100644 .opencode/skills/productize-cohort-analysis/SKILL.md delete mode 100644 .opencode/skills/productize-comms-review/SKILL.md delete mode 100644 .opencode/skills/productize-competitive-advantage-diagnostics-and-moat-strategy/SKILL.md delete mode 100644 .opencode/skills/productize-competitive-analysis-to-winning-positioning-strategy/SKILL.md delete mode 100644 .opencode/skills/productize-competitive-brief/SKILL.md delete mode 100644 .opencode/skills/productize-competitive-brief/references/pm-skills-main-merge.md delete mode 100644 .opencode/skills/productize-competitive-parity-and-strategic-differentiation/SKILL.md delete mode 100644 .opencode/skills/productize-complex-problem-structuring-into-actionable-recommendations/SKILL.md delete mode 100644 .opencode/skills/productize-comprehensive-use-cases-from-user-input-for-product-strategy/SKILL.md delete mode 100644 .opencode/skills/productize-conflicting-stakeholder-requirements-to-balanced-design/SKILL.md delete mode 100644 .opencode/skills/productize-conversation-summaries-from-meeting-transcripts/SKILL.md delete mode 100644 .opencode/skills/productize-create-viz/SKILL.md delete mode 100644 .opencode/skills/productize-creative-solution-generation-from-de-bono-s-lateral-thinking/SKILL.md delete mode 100644 .opencode/skills/productize-creative-solution-generation-from-metaphorical-thinking/SKILL.md delete mode 100644 .opencode/skills/productize-crisis-communication-plan-from-outage-details-and-company/SKILL.md delete mode 100644 .opencode/skills/productize-critical-flaws-in-product-requirements-tough-and-unreasonable/SKILL.md delete mode 100644 .opencode/skills/productize-ctas-from-copywriting-strategies/SKILL.md delete mode 100644 .opencode/skills/productize-customer-insights-extraction-from-interview-transcript-using/SKILL.md delete mode 100644 .opencode/skills/productize-customer-journey-map-based-on-user-behavior-data/SKILL.md delete mode 100644 .opencode/skills/productize-data-context-extractor/SKILL.md delete mode 100644 .opencode/skills/productize-data-context-extractor/references/domain-template.md delete mode 100644 .opencode/skills/productize-data-context-extractor/references/example-generated-skill.md delete mode 100644 .opencode/skills/productize-data-context-extractor/references/skill-template.md delete mode 100644 .opencode/skills/productize-data-context-extractor/references/sql-dialects.md delete mode 100644 .opencode/skills/productize-data-context-extractor/references/tables/README.md delete mode 100755 .opencode/skills/productize-data-context-extractor/scripts/package_data_skill.py delete mode 100644 .opencode/skills/productize-data-driven-research-plans-from-leadership-intuition/SKILL.md delete mode 100644 .opencode/skills/productize-data-visualization/SKILL.md delete mode 100644 .opencode/skills/productize-decision-making-with-the-gut-check-protocol/SKILL.md delete mode 100644 .opencode/skills/productize-decision-reversibility-classification-from-first-principles/SKILL.md delete mode 100644 .opencode/skills/productize-decision-rights-using-davci/SKILL.md delete mode 100644 .opencode/skills/productize-defining-the-niche-from-user-input/SKILL.md delete mode 100644 .opencode/skills/productize-demo-narratives-showing-user-goals/SKILL.md delete mode 100644 .opencode/skills/productize-design-critique/SKILL.md delete mode 100644 .opencode/skills/productize-design-handoff/SKILL.md delete mode 100644 .opencode/skills/productize-design-review/SKILL.md delete mode 100644 .opencode/skills/productize-design-system/SKILL.md delete mode 100644 .opencode/skills/productize-detailed-project-plans-from-project-briefs/SKILL.md delete mode 100644 .opencode/skills/productize-difficult-conversation-script-5-step-framework/SKILL.md delete mode 100644 .opencode/skills/productize-disruptive-strategy-generation-from-what-if-questions/SKILL.md delete mode 100644 .opencode/skills/productize-docs/SKILL.md delete mode 100644 .opencode/skills/productize-dogfood/SKILL.md delete mode 100644 .opencode/skills/productize-dogfood/references/issue-taxonomy.md delete mode 100644 .opencode/skills/productize-dogfood/templates/dogfood-report-template.md delete mode 100644 .opencode/skills/productize-draft-nda/SKILL.md delete mode 100644 .opencode/skills/productize-dual-mode-ai-coding-assistant-staff-eng-intern/SKILL.md delete mode 100644 .opencode/skills/productize-dx-review/SKILL.md delete mode 100644 .opencode/skills/productize-easy-signal-identification-from-product-assumption/SKILL.md delete mode 100644 .opencode/skills/productize-effective-customer-interview-guides-for-any-topic/SKILL.md delete mode 100644 .opencode/skills/productize-effective-customer-interview-guides-for-any-topic/references/pm-skills-main-merge.md delete mode 100644 .opencode/skills/productize-empathy-maps/SKILL.md delete mode 100644 .opencode/skills/productize-eng-review/SKILL.md delete mode 100644 .opencode/skills/productize-engineering-problem-solving-and-solution-structuring/SKILL.md delete mode 100644 .opencode/skills/productize-event-tracking-schemas-from-ui-and-metrics-requirements/SKILL.md delete mode 100644 .opencode/skills/productize-exec-feedback-without-context-to-actionable-design-requirements/SKILL.md delete mode 100644 .opencode/skills/productize-executive-and-update-review/SKILL.md delete mode 100644 .opencode/skills/productize-executive-decks-from-quick-dirty-test-analysis/SKILL.md delete mode 100644 .opencode/skills/productize-explore-data/SKILL.md delete mode 100644 .opencode/skills/productize-feature-impact-models-from-kpis-and-assumptions/SKILL.md delete mode 100644 .opencode/skills/productize-feature-results-analysis-from-draft-to-final-report/SKILL.md delete mode 100644 .opencode/skills/productize-features-reframing-and-projects-shape-up/SKILL.md delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/SKILL.md delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/apv.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/bond_math.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/cap_table.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/capital_structure.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/capm.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/convertible_notes.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/dcf.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/market_context.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/option_pools.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/preferred_stock.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/returns.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/risk.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/safes.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/time_value.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/validation.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/valuation.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/vc_method.py delete mode 100644 .opencode/skills/productize-finance-modeling-kernel/finance-modeling-kernel/wacc.py delete mode 100644 .opencode/skills/productize-financial-markets-context/SKILL.md delete mode 100644 .opencode/skills/productize-fragmented-user-research-synthesis-into-coherent-insights/SKILL.md delete mode 100644 .opencode/skills/productize-framework-application-to-product-challenges-from-user-input/SKILL.md delete mode 100644 .opencode/skills/productize-frontend-design/SKILL.md delete mode 100644 .opencode/skills/productize-future-product-opportunities-from-market-inflection-points/SKILL.md delete mode 100644 .opencode/skills/productize-group-decision-making-quality-review/SKILL.md delete mode 100644 .opencode/skills/productize-grow/SKILL.md delete mode 100644 .opencode/skills/productize-growth-loops/SKILL.md delete mode 100644 .opencode/skills/productize-growth-project-generation-with-pioneer-migrator-settler/SKILL.md delete mode 100644 .opencode/skills/productize-growth-strategy-synthesis-from-user-inputs/SKILL.md delete mode 100644 .opencode/skills/productize-gtm-motions/SKILL.md delete mode 100644 .opencode/skills/productize-gtm-strategy/SKILL.md delete mode 100644 .opencode/skills/productize-ideal-customer-profile-icp-representative-for-x-product/SKILL.md delete mode 100644 .opencode/skills/productize-ideal-customer-profile-icp-representative-for-x-product/references/pm-skills-main-merge.md delete mode 100644 .opencode/skills/productize-ideas-for-affordances-and-signifiers-based-on-a-design-problem/SKILL.md delete mode 100644 .opencode/skills/productize-implementation-notes/SKILL.md delete mode 100644 .opencode/skills/productize-industry-trend-strategy/SKILL.md delete mode 100644 .opencode/skills/productize-influence-strategies-from-cialdini-s-7-principles/SKILL.md delete mode 100644 .opencode/skills/productize-innovation-decision-making-heuristics/SKILL.md delete mode 100644 .opencode/skills/productize-innovative-idea-generation-from-project-parameters-and/SKILL.md delete mode 100644 .opencode/skills/productize-innovative-idea-generation-from-structured-brainstorming/SKILL.md delete mode 100644 .opencode/skills/productize-innovative-product-ideas-from-structured-brainstorming/SKILL.md delete mode 100644 .opencode/skills/productize-interactive-intake-for-ost-inputs/SKILL.md delete mode 100644 .opencode/skills/productize-lean-canvas/SKILL.md delete mode 100644 .opencode/skills/productize-limit-based-product-strategy-from-problem-to-execution-plan/SKILL.md delete mode 100644 .opencode/skills/productize-low-frequency-to-power-user-transition-strategy/SKILL.md delete mode 100644 .opencode/skills/productize-managerial-finance-dcf/SKILL.md delete mode 100644 .opencode/skills/productize-map-power-dynamics-before-meetings/SKILL.md delete mode 100644 .opencode/skills/productize-market-opportunities-from-jobs-to-be-done-market-canvas/SKILL.md delete mode 100644 .opencode/skills/productize-market-opportunity/SKILL.md delete mode 100644 .opencode/skills/productize-market-opportunity/references/canonical-canvases.md delete mode 100644 .opencode/skills/productize-market-opportunity/references/output-formats.md delete mode 100644 .opencode/skills/productize-market-opportunity/references/rating-and-decision-rules.md delete mode 100644 .opencode/skills/productize-market-orientation-audit/SKILL.md delete mode 100644 .opencode/skills/productize-market-requirements-from-strategic-market-inputs/SKILL.md delete mode 100644 .opencode/skills/productize-market-sizing/SKILL.md delete mode 100644 .opencode/skills/productize-mece-analysis-and-logical-tree-from-list-items/SKILL.md delete mode 100644 .opencode/skills/productize-meeting-agendas-from-meeting-descriptions/SKILL.md delete mode 100644 .opencode/skills/productize-meeting-outcome-planning-and-stakeholder-alignment/SKILL.md delete mode 100644 .opencode/skills/productize-meeting-summaries-from-meeting-transcript-ideas-framework/SKILL.md delete mode 100644 .opencode/skills/productize-message-framing-and-comms-plan-designer/SKILL.md delete mode 100644 .opencode/skills/productize-metric-drops-diagnosis-with-rigorous-stepwise-decomposition/SKILL.md delete mode 100644 .opencode/skills/productize-metrics-review/SKILL.md delete mode 100644 .opencode/skills/productize-monetization-strategy/SKILL.md delete mode 100644 .opencode/skills/productize-multi-step-workflow-optimization/SKILL.md delete mode 100644 .opencode/skills/productize-multiple-interface-descriptions-from-a-single-image/SKILL.md delete mode 100644 .opencode/skills/productize-netmba-competitor-analysis/SKILL.md delete mode 100644 .opencode/skills/productize-north-star-metric/SKILL.md delete mode 100644 .opencode/skills/productize-now-next-later-vision-roadmap-from-interview-synthesis/SKILL.md delete mode 100644 .opencode/skills/productize-nps-feedback-for-prioritized-customer-experience-initiatives/SKILL.md delete mode 100644 .opencode/skills/productize-offbeat-question-generation-from-any-topic/SKILL.md delete mode 100644 .opencode/skills/productize-office-politics-with-machiavellian-strategy/SKILL.md delete mode 100644 .opencode/skills/productize-okr-planning-from-vision-statements/SKILL.md delete mode 100644 .opencode/skills/productize-onboarding-flow-optimization-from-product-data-to-user-success/SKILL.md delete mode 100644 .opencode/skills/productize-operate/SKILL.md delete mode 100644 .opencode/skills/productize-opportunity-solution-tree-from-input/SKILL.md delete mode 100644 .opencode/skills/productize-opportunity-solution-tree-from-input/references/pm-skills-main-merge.md delete mode 100644 .opencode/skills/productize-outcome-roadmap/SKILL.md delete mode 100644 .opencode/skills/productize-plg-growth-playbook/SKILL.md delete mode 100644 .opencode/skills/productize-pm-context-and-design-constraints/SKILL.md delete mode 100644 .opencode/skills/productize-pmf-review/SKILL.md delete mode 100644 .opencode/skills/productize-positioning-statements-from-competitive-analysis-and-value/SKILL.md delete mode 100644 .opencode/skills/productize-positioning-statements-from-competitive-analysis-and-value/references/pm-skills-main-merge.md delete mode 100644 .opencode/skills/productize-post-launch-feedback-into-v2-improvements-synthesis/SKILL.md delete mode 100644 .opencode/skills/productize-post-launch-feedback-loop/SKILL.md delete mode 100644 .opencode/skills/productize-potential-hidden-agenda-identification/SKILL.md delete mode 100644 .opencode/skills/productize-prds-from-industry-and-feature-specifications/SKILL.md delete mode 100644 .opencode/skills/productize-prds-from-product-information-and-assumptions/SKILL.md delete mode 100644 .opencode/skills/productize-pre-mortem/SKILL.md delete mode 100644 .opencode/skills/productize-presentation-narratives-from-conversation-transcripts/SKILL.md delete mode 100644 .opencode/skills/productize-presentations-from-5-step-storytelling-framework/SKILL.md delete mode 100644 .opencode/skills/productize-presentations-from-structured-content-and-context/SKILL.md delete mode 100644 .opencode/skills/productize-press-releases-from-product-vision-working-backwards/SKILL.md delete mode 100644 .opencode/skills/productize-pricing-strategy/SKILL.md delete mode 100644 .opencode/skills/productize-prioritization-frameworks/SKILL.md delete mode 100644 .opencode/skills/productize-privacy-policy/SKILL.md delete mode 100644 .opencode/skills/productize-problem-framing-before-jumping-to-solutions/SKILL.md delete mode 100644 .opencode/skills/productize-problem-statement-framing-from-conversation-transcript/SKILL.md delete mode 100644 .opencode/skills/productize-product-assumptions-from-core-strategy-inputs/SKILL.md delete mode 100644 .opencode/skills/productize-product-brainstorming/SKILL.md delete mode 100644 .opencode/skills/productize-product-decision-analysis-from-anthropological-research/SKILL.md delete mode 100644 .opencode/skills/productize-product-design-analysis-from-context-and-screenshots/SKILL.md delete mode 100644 .opencode/skills/productize-product-feature-impact-sizing-from-metrics-and-usage-data/SKILL.md delete mode 100644 .opencode/skills/productize-product-ideas-from-user-responses/SKILL.md delete mode 100644 .opencode/skills/productize-product-market-fit-cycle/SKILL.md delete mode 100644 .opencode/skills/productize-product-refinement-session-planning/SKILL.md delete mode 100644 .opencode/skills/productize-product-requirements-from-structured-analysis/SKILL.md delete mode 100644 .opencode/skills/productize-product-review/SKILL.md delete mode 100644 .opencode/skills/productize-product-simplification-via-via-negativa-analysis/SKILL.md delete mode 100644 .opencode/skills/productize-product-strategy-review-from-draft-documents/SKILL.md delete mode 100644 .opencode/skills/productize-product-vision/SKILL.md delete mode 100644 .opencode/skills/productize-proto-persona-profiles-from-user-research-and-market-data/SKILL.md delete mode 100644 .opencode/skills/productize-proto-persona-profiles-from-user-research-and-market-data/references/pm-skills-main-merge.md delete mode 100644 .opencode/skills/productize-prototype-creation-from-image-descriptions-and-app-info/SKILL.md delete mode 100644 .opencode/skills/productize-pyramid-structure-optimization-from-complex-text/SKILL.md delete mode 100644 .opencode/skills/productize-qa/SKILL.md delete mode 100644 .opencode/skills/productize-raw-interview-transcript-cleanup/SKILL.md delete mode 100644 .opencode/skills/productize-realistic-jtbd-interview-transcripts/SKILL.md delete mode 100644 .opencode/skills/productize-reinforcing-sequence-from-unstructured-items/SKILL.md delete mode 100644 .opencode/skills/productize-release-notes/SKILL.md delete mode 100644 .opencode/skills/productize-release/SKILL.md delete mode 100644 .opencode/skills/productize-remote-miro-workshops-from-transcripts-and-specs/SKILL.md delete mode 100644 .opencode/skills/productize-requirements-prioritization-with-p0-p1-p2-framework/SKILL.md delete mode 100644 .opencode/skills/productize-research-into-durable-competitive-moats/SKILL.md delete mode 100644 .opencode/skills/productize-risk-return-cost-of-capital/SKILL.md delete mode 100644 .opencode/skills/productize-risky-assumption-prioritization-for-rapid-validation/SKILL.md delete mode 100644 .opencode/skills/productize-roadmap-update/SKILL.md delete mode 100644 .opencode/skills/productize-robust-experiment-design-from-goals-and-systems/SKILL.md delete mode 100644 .opencode/skills/productize-role-identity-decision-making-map/SKILL.md delete mode 100644 .opencode/skills/productize-root-cause-and-consequence-analysis-from-a-question/SKILL.md delete mode 100644 .opencode/skills/productize-scope-defense-using-time-cost-tradeoff-analysis/SKILL.md delete mode 100644 .opencode/skills/productize-sketch-descriptions-for-wireframes-from-product-ideas/SKILL.md delete mode 100644 .opencode/skills/productize-skimmable-writing-transformation/SKILL.md delete mode 100644 .opencode/skills/productize-slide-decks-from-problem-statements-and-context/SKILL.md delete mode 100644 .opencode/skills/productize-solution-anti-patterns-from-customer-problem-analysis/SKILL.md delete mode 100644 .opencode/skills/productize-solution-design-for-edge-cases-in-product-development/SKILL.md delete mode 100644 .opencode/skills/productize-spec-writing/SKILL.md delete mode 100644 .opencode/skills/productize-sprint-planning/SKILL.md delete mode 100644 .opencode/skills/productize-sql-queries/SKILL.md delete mode 100644 .opencode/skills/productize-sql-query-from-requirements-and-data-tables/SKILL.md delete mode 100644 .opencode/skills/productize-stakeholder-brief-clarification-and-problem-definition/SKILL.md delete mode 100644 .opencode/skills/productize-stakeholder-decision-making-using-toc-thinking-process/SKILL.md delete mode 100644 .opencode/skills/productize-stakeholder-moo-objections-and-product-derailment-risks/SKILL.md delete mode 100644 .opencode/skills/productize-stakeholder-power-interest-and-influence-map/SKILL.md delete mode 100644 .opencode/skills/productize-stakeholder-power-interest-and-influence-map/references/pm-skills-main-merge.md delete mode 100644 .opencode/skills/productize-stakeholder-risk-review-for-a-feature-or-prd/SKILL.md delete mode 100644 .opencode/skills/productize-stakeholder-update/SKILL.md delete mode 100644 .opencode/skills/productize-startup-canvas/SKILL.md delete mode 100644 .opencode/skills/productize-statistical-analysis/SKILL.md delete mode 100644 .opencode/skills/productize-strategic-crux-diagnosis-and-strategy-design/SKILL.md delete mode 100644 .opencode/skills/productize-strategic-decision-making-quality-review/SKILL.md delete mode 100644 .opencode/skills/productize-strategic-moves-from-swot-pairings/SKILL.md delete mode 100644 .opencode/skills/productize-strategic-presentation-planning-from-topic-audience-and-time/SKILL.md delete mode 100644 .opencode/skills/productize-strategy-curve-blue-ocean/SKILL.md delete mode 100644 .opencode/skills/productize-strategy-kernel-extraction-from-context/SKILL.md delete mode 100644 .opencode/skills/productize-strategy-to-execution-bridge-for-ux-decisions/SKILL.md delete mode 100644 .opencode/skills/productize-structured-decision-journals-from-decisions-and-context/SKILL.md delete mode 100644 .opencode/skills/productize-structured-insight-extraction-from-conversation-transcripts/SKILL.md delete mode 100644 .opencode/skills/productize-structured-interview-notes-from-transcript-using-flexible/SKILL.md delete mode 100644 .opencode/skills/productize-structured-interview-notes-from-transcript-using-flexible/references/pm-skills-main-merge.md delete mode 100644 .opencode/skills/productize-structured-json-descriptions-from-ui-screenshots/SKILL.md delete mode 100644 .opencode/skills/productize-structured-product-hypotheses-from-product-problems/SKILL.md delete mode 100644 .opencode/skills/productize-structured-product-strategy-from-product-context/SKILL.md delete mode 100644 .opencode/skills/productize-structured-requirements-from-conversation-transcripts/SKILL.md delete mode 100644 .opencode/skills/productize-structured-requirements-from-design-assets/SKILL.md delete mode 100644 .opencode/skills/productize-success-metrics-for-design-decisions/SKILL.md delete mode 100644 .opencode/skills/productize-support-tickets-as-actionable-product-improvements/SKILL.md delete mode 100644 .opencode/skills/productize-sustainable-business-model/SKILL.md delete mode 100644 .opencode/skills/productize-sustainable-business-model/references/output-format.md delete mode 100644 .opencode/skills/productize-sustainable-business-model/references/pattern-groups.md delete mode 100644 .opencode/skills/productize-synthesize-research/SKILL.md delete mode 100644 .opencode/skills/productize-systematic-debugging/SKILL.md delete mode 100644 .opencode/skills/productize-target-opportunity-selection-from-ost/SKILL.md delete mode 100644 .opencode/skills/productize-task-list-optimization-and-contingency-based-project-planning/SKILL.md delete mode 100644 .opencode/skills/productize-task-specific-product-strategy-design/SKILL.md delete mode 100644 .opencode/skills/productize-tdd/SKILL.md delete mode 100644 .opencode/skills/productize-technical-architecture-brief-from-product-requirements-doc/SKILL.md delete mode 100644 .opencode/skills/productize-technical-translation-and-stakeholder-communication/SKILL.md delete mode 100644 .opencode/skills/productize-test-scenarios/SKILL.md delete mode 100644 .opencode/skills/productize-thesis-review/SKILL.md delete mode 100644 .opencode/skills/productize-trade-off-analysis-from-feature-priority-and-effort-data/SKILL.md delete mode 100644 .opencode/skills/productize-user-stories-from-initiative-requirements/SKILL.md delete mode 100644 .opencode/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/SKILL.md delete mode 100644 .opencode/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/references/pm-skills-main-merge.md delete mode 100644 .opencode/skills/productize-ux-edge-cases-from-product-briefs/SKILL.md delete mode 100644 .opencode/skills/productize-ux-terminology-improvements-in-product-requirements/SKILL.md delete mode 100644 .opencode/skills/productize-validate-data/SKILL.md delete mode 100644 .opencode/skills/productize-valuation-and-deal-pricing/SKILL.md delete mode 100644 .opencode/skills/productize-value-chain-mapping-from-end-user-needs-to-core-value/SKILL.md delete mode 100644 .opencode/skills/productize-venture-capital-deal-modeling/SKILL.md delete mode 100644 .opencode/skills/productize-verification/SKILL.md delete mode 100644 .opencode/skills/productize-visual-decision-making-review/SKILL.md delete mode 100644 .opencode/skills/productize-workshop-activity-design-from-problem-and-participant/SKILL.md delete mode 100644 .opencode/skills/productize-write-query/SKILL.md delete mode 100644 .opencode/skills/productize-write-query/references/pm-skills-main-merge.md delete mode 100644 .opencode/skills/productize-write-spec/SKILL.md delete mode 100644 .opencode/skills/productize-write-spec/references/pm-skills-main-merge.md delete mode 100644 .opencode/skills/productize-writing-plans/SKILL.md delete mode 100644 .opencode/skills/productize-wwas/SKILL.md delete mode 100644 .opencode/skills/productize/SKILL.md create mode 100644 .oxfmtrc.json create mode 100644 .oxlintrc.json create mode 100644 .pre-commit-config.yaml create mode 100644 .prettierignore create mode 100644 .release-notes/.gitkeep create mode 100644 .release-notes/archive/v0.2.0/daemon-architecture-1777593047.md create mode 100644 .release-notes/archive/v0.2.0/daemon-web-ui-1777593047.md create mode 100644 .release-notes/archive/v0.2.0/global-config-defaults-1776266427.md create mode 100644 .release-notes/archive/v0.2.0/harden-runtime-activity-version-1777593047.md create mode 100644 .release-notes/archive/v0.2.0/migrate-infer-task-type-1777593047.md create mode 100644 .release-notes/archive/v0.2.0/optional-sound-notifications-on-run-lifecycle-events-1776266427.md create mode 100644 .release-notes/archive/v0.2.0/per-task-runtime-overrides-1777593047.md create mode 100644 .release-notes/archive/v0.2.0/review-watch-mode-1777593047.md create mode 100644 .release-notes/archive/v0.2.2/force-archive-confirmation-1777919380.md create mode 100644 .release-notes/archive/v0.2.2/qa-workflow-extension-1777919380.md create mode 100644 .release-notes/archive/v0.2.2/workspace-register-path-fix-1777919380.md create mode 100644 .yamlfix.toml create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 CONTRIBUTING.md create mode 100644 Makefile delete mode 100644 RELEASE.md create mode 100644 RELEASE_BODY.md delete mode 100644 SKILL.md delete mode 100644 SKILL.md.tmpl delete mode 100644 UPGRADE.md delete mode 100644 VERSION create mode 100644 agents/README.md create mode 100644 agents/embed.go delete mode 100644 assets/productize.png create mode 100644 aur-pkg/PKGBUILD create mode 100644 aur-pkg/PKGBUILD-src create mode 100644 aur-pkg/README.md create mode 100644 aur-pkg/TODO.md delete mode 100755 bin/productize-artifact-log delete mode 100755 bin/productize-completion-status delete mode 100755 bin/productize-config delete mode 100755 bin/productize-context-restore delete mode 100755 bin/productize-context-save delete mode 100755 bin/productize-registry-search delete mode 100644 bin/productize-routing.mjs delete mode 100644 bin/productize-runtime.mjs delete mode 100755 bin/productize-session-log delete mode 100755 bin/productize-skill-router delete mode 100755 bin/productize-team-init delete mode 100755 bin/productize-update-check delete mode 100755 bin/productize-upgrade delete mode 100755 bin/productize-workflow create mode 100644 bun.lock create mode 100644 cliff.toml create mode 100644 cmd/productize/main.go create mode 100644 cmd/productize/main_test.go create mode 100644 docs/design/daemon-mockup/Productize Daemon Workspace.html create mode 100644 docs/design/daemon-mockup/assets/productize-icon.png create mode 100644 docs/design/daemon-mockup/assets/providers/claude-code.svg create mode 100644 docs/design/daemon-mockup/assets/providers/codex.svg create mode 100644 docs/design/daemon-mockup/assets/providers/gemini.svg create mode 100644 docs/design/daemon-mockup/assets/providers/ollama.svg create mode 100644 docs/design/daemon-mockup/assets/providers/opencode.svg create mode 100644 docs/design/daemon-mockup/colors_and_type.css create mode 100644 docs/design/daemon-mockup/fonts/Disket-Mono-Bold.ttf create mode 100644 docs/design/daemon-mockup/fonts/Disket-Mono-Regular.ttf create mode 100644 docs/design/daemon-mockup/fonts/Nippo-Variable.woff2 create mode 100644 docs/design/daemon-mockup/src/dashboard.jsx create mode 100644 docs/design/daemon-mockup/src/data.jsx create mode 100644 docs/design/daemon-mockup/src/icons.jsx create mode 100644 docs/design/daemon-mockup/src/memory.jsx create mode 100644 docs/design/daemon-mockup/src/reviews.jsx create mode 100644 docs/design/daemon-mockup/src/runs.jsx create mode 100644 docs/design/daemon-mockup/src/shell.jsx create mode 100644 docs/design/daemon-mockup/src/spec.jsx create mode 100644 docs/design/daemon-mockup/src/task_detail.jsx create mode 100644 docs/design/daemon-mockup/src/tasks.jsx create mode 100644 docs/design/daemon-mockup/src/workflows.jsx create mode 100644 docs/events.md create mode 100644 docs/examples/agents/repo-copilot/AGENT.md create mode 100644 docs/examples/agents/repo-copilot/mcp.json create mode 100644 docs/examples/agents/reviewer/AGENT.md create mode 100644 docs/extensibility/architecture.md create mode 100644 docs/extensibility/capability-reference.md create mode 100644 docs/extensibility/getting-started.md create mode 100644 docs/extensibility/hello-world-go.md create mode 100644 docs/extensibility/hello-world-ts.md create mode 100644 docs/extensibility/hook-reference.md create mode 100644 docs/extensibility/host-api-reference.md create mode 100644 docs/extensibility/index.md create mode 100644 docs/extensibility/migration-guide.md create mode 100644 docs/extensibility/testing.md create mode 100644 docs/extensibility/trust-and-enablement.md create mode 100644 docs/plans/2026-04-17-productize-daemon-design.md create mode 100644 docs/plans/2026-04-21-hot-reload-dev-design.md create mode 100644 docs/reader-library.md create mode 100644 docs/reusable-agents.md delete mode 100644 evals/ai-builder-router-cases.json delete mode 100644 evals/decision-making-router-cases.json delete mode 100644 evals/e2e-cases.json delete mode 100644 evals/executive-product-ops-router-cases.json delete mode 100644 evals/existing-product-router-cases.json delete mode 100644 evals/finance-router-cases.json delete mode 100644 evals/llm-cases.json delete mode 100644 evals/qa-router-cases.json delete mode 100644 evals/zero-to-one-router-cases.json create mode 100644 extensions/idea-factory/agents/architect-advisor/AGENT.md create mode 100644 extensions/idea-factory/agents/devils-advocate/AGENT.md create mode 100644 extensions/idea-factory/agents/pragmatic-engineer/AGENT.md create mode 100644 extensions/idea-factory/agents/product-mind/AGENT.md create mode 100644 extensions/idea-factory/agents/security-advocate/AGENT.md create mode 100644 extensions/idea-factory/agents/the-thinker/AGENT.md create mode 100644 extensions/idea-factory/extension.toml create mode 100644 extensions/idea-factory/skills/idea-factory/SKILL.md create mode 100644 extensions/idea-factory/skills/idea-factory/references/adr-template.md create mode 100644 extensions/idea-factory/skills/idea-factory/references/business-analyst.md create mode 100644 extensions/idea-factory/skills/idea-factory/references/council.md create mode 100644 extensions/idea-factory/skills/idea-factory/references/idea-template.md create mode 100644 extensions/idea-factory/skills/idea-factory/references/product-strategist.md create mode 100644 extensions/idea-factory/skills/idea-factory/references/question-protocol.md create mode 100644 extensions/productize/README.md create mode 100644 extensions/productize/extension.toml rename {.agents => extensions/productize}/skills/productize-0-1/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-0-1/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-aarrr-growth-diagnostics/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-aarrr-growth-diagnostics/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-ab-test-analysis/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-ab-test-analysis/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-acceptance-criteria-for-ui/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-acceptance-criteria-for-ui/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-accessibility-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-accessibility-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-actionable-customer-interview-guides-from-research-topics/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-actionable-customer-interview-guides-from-research-topics/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-actionable-job-stories-from-interview-transcripts/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-actionable-job-stories-from-interview-transcripts/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-actionable-product-improvements-from-survey-responses/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-actionable-product-improvements-from-survey-responses/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-actionable-research-briefs-from-problem-statements-and/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-actionable-research-briefs-from-problem-statements-and/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-actionable-user-profiles-with-tasks-and-constraints-from/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-actionable-user-profiles-with-tasks-and-constraints-from/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-actionable-user-research-decisions-from-project-insights/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-actionable-user-research-decisions-from-project-insights/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-adaptive-planning-from-scenarios-to-strategic-actions/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-adaptive-planning-from-scenarios-to-strategic-actions/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-aging-research-insight-validation-before-reusing/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-aging-research-insight-validation-before-reusing/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-ai-product-evaluation-from-recommendation-canvas-framework/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-ai-product-evaluation-from-recommendation-canvas-framework/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-analyze-feature-requests/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-analyze-feature-requests/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-analyze/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-analyze/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-app-aha-moment-identification-from-user-data-and-app/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-app-aha-moment-identification-from-user-data-and-app/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-app-design-from-project-requirements/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-app-design-from-project-requirements/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-autoplan/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-autoplan/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-backend-design/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-backend-design/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-beachhead-segment/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-beachhead-segment/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-behavioral-guidelines/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-behavioral-guidelines/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-brainstorm/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-brainstorm/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-brand-archetype-strategy/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-brand-archetype-strategy/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-brand-equity-diagnostics/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-brand-equity-diagnostics/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-bug-prioritization-against-work-in-progress/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-bug-prioritization-against-work-in-progress/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-build-dashboard/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-build-dashboard/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-business-flywheel-from-company-successes-and-failures/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-business-flywheel-from-company-successes-and-failures/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-business-model-blindspots/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-business-model-blindspots/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-business-model-blindspots/references/diagnostic-questions.md (100%) rename {.agents => extensions/productize}/skills/productize-business-model-blindspots/references/output-format.md (100%) rename {.agents => extensions/productize}/skills/productize-business-model-design/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-business-model-design/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-business-model-design/assets/lean-business-model-canvas.html (100%) rename {.agents => extensions/productize}/skills/productize-business-model-design/assets/platform-business-model-canvas.html (100%) rename {.agents => extensions/productize}/skills/productize-business-model-design/assets/standard-business-model-canvas.html (100%) rename {.agents => extensions/productize}/skills/productize-business-model-design/references/business-model-output-rules.md (100%) rename {.agents => extensions/productize}/skills/productize-business-model-design/references/canvas-selection.md (100%) rename {.agents => extensions/productize}/skills/productize-business-model-design/references/canvas-templates.md (100%) rename {.agents => extensions/productize}/skills/productize-business-model-design/references/pm-skills-main-merge.md (100%) rename {.agents => extensions/productize}/skills/productize-business-strategy-creation-from-expert-strategic-thinking/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-business-strategy-creation-from-expert-strategic-thinking/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-capital-structure-financing/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-capital-structure-financing/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-challenging-meeting-with-stakeholders/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-challenging-meeting-with-stakeholders/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-churn-reduction-from-customer-data-and-exit-survey-analysis/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-churn-reduction-from-customer-data-and-exit-survey-analysis/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-clustered-jtbd-forces-from-interview-data/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-clustered-jtbd-forces-from-interview-data/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-cohort-analysis/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-cohort-analysis/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-comms-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-comms-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-competitive-advantage-diagnostics-and-moat-strategy/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-competitive-advantage-diagnostics-and-moat-strategy/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-competitive-analysis-to-winning-positioning-strategy/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-competitive-analysis-to-winning-positioning-strategy/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-competitive-brief/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-competitive-brief/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-competitive-brief/references/pm-skills-main-merge.md (100%) rename {.agents => extensions/productize}/skills/productize-competitive-parity-and-strategic-differentiation/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-competitive-parity-and-strategic-differentiation/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-complex-problem-structuring-into-actionable-recommendations/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-complex-problem-structuring-into-actionable-recommendations/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-comprehensive-use-cases-from-user-input-for-product-strategy/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-comprehensive-use-cases-from-user-input-for-product-strategy/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-conflicting-stakeholder-requirements-to-balanced-design/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-conflicting-stakeholder-requirements-to-balanced-design/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-conversation-summaries-from-meeting-transcripts/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-conversation-summaries-from-meeting-transcripts/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-create-viz/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-create-viz/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-creative-solution-generation-from-de-bono-s-lateral-thinking/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-creative-solution-generation-from-de-bono-s-lateral-thinking/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-creative-solution-generation-from-metaphorical-thinking/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-creative-solution-generation-from-metaphorical-thinking/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-crisis-communication-plan-from-outage-details-and-company/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-crisis-communication-plan-from-outage-details-and-company/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-critical-flaws-in-product-requirements-tough-and-unreasonable/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-critical-flaws-in-product-requirements-tough-and-unreasonable/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-ctas-from-copywriting-strategies/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-ctas-from-copywriting-strategies/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-customer-insights-extraction-from-interview-transcript-using/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-customer-insights-extraction-from-interview-transcript-using/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-customer-journey-map-based-on-user-behavior-data/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-customer-journey-map-based-on-user-behavior-data/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-data-context-extractor/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-data-context-extractor/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-data-context-extractor/references/domain-template.md (100%) rename {.agents => extensions/productize}/skills/productize-data-context-extractor/references/example-generated-skill.md (100%) rename {.agents => extensions/productize}/skills/productize-data-context-extractor/references/skill-template.md (100%) rename {.agents => extensions/productize}/skills/productize-data-context-extractor/references/sql-dialects.md (100%) rename {.agents => extensions/productize}/skills/productize-data-context-extractor/references/tables/README.md (100%) rename {.agents => extensions/productize}/skills/productize-data-context-extractor/scripts/package_data_skill.py (100%) rename {.agents => extensions/productize}/skills/productize-data-driven-research-plans-from-leadership-intuition/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-data-driven-research-plans-from-leadership-intuition/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-data-visualization/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-data-visualization/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-decision-making-with-the-gut-check-protocol/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-decision-making-with-the-gut-check-protocol/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-decision-reversibility-classification-from-first-principles/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-decision-reversibility-classification-from-first-principles/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-decision-rights-using-davci/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-decision-rights-using-davci/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-defining-the-niche-from-user-input/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-defining-the-niche-from-user-input/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-demo-narratives-showing-user-goals/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-demo-narratives-showing-user-goals/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-design-critique/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-design-critique/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-design-handoff/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-design-handoff/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-design-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-design-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-design-system/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-design-system/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-detailed-project-plans-from-project-briefs/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-detailed-project-plans-from-project-briefs/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-difficult-conversation-script-5-step-framework/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-difficult-conversation-script-5-step-framework/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-disruptive-strategy-generation-from-what-if-questions/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-disruptive-strategy-generation-from-what-if-questions/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-docs/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-docs/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-dogfood/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-dogfood/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-dogfood/references/issue-taxonomy.md (100%) rename {.agents => extensions/productize}/skills/productize-dogfood/templates/dogfood-report-template.md (100%) rename {.agents => extensions/productize}/skills/productize-draft-nda/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-draft-nda/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-dual-mode-ai-coding-assistant-staff-eng-intern/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-dual-mode-ai-coding-assistant-staff-eng-intern/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-dx-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-dx-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-easy-signal-identification-from-product-assumption/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-easy-signal-identification-from-product-assumption/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-effective-customer-interview-guides-for-any-topic/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-effective-customer-interview-guides-for-any-topic/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-effective-customer-interview-guides-for-any-topic/references/pm-skills-main-merge.md (100%) rename {.agents => extensions/productize}/skills/productize-empathy-maps/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-empathy-maps/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-eng-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-eng-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-engineering-problem-solving-and-solution-structuring/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-engineering-problem-solving-and-solution-structuring/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-event-tracking-schemas-from-ui-and-metrics-requirements/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-event-tracking-schemas-from-ui-and-metrics-requirements/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-exec-feedback-without-context-to-actionable-design-requirements/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-exec-feedback-without-context-to-actionable-design-requirements/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-executive-and-update-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-executive-and-update-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-executive-decks-from-quick-dirty-test-analysis/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-executive-decks-from-quick-dirty-test-analysis/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-explore-data/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-explore-data/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-feature-impact-models-from-kpis-and-assumptions/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-feature-impact-models-from-kpis-and-assumptions/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-feature-results-analysis-from-draft-to-final-report/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-feature-results-analysis-from-draft-to-final-report/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-features-reframing-and-projects-shape-up/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-features-reframing-and-projects-shape-up/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/apv.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/bond_math.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/cap_table.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/capital_structure.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/capm.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/convertible_notes.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/dcf.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/market_context.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/option_pools.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/preferred_stock.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/returns.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/risk.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/safes.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/time_value.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/validation.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/valuation.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/vc_method.py (100%) rename {.agents => extensions/productize}/skills/productize-finance-modeling-kernel/finance-modeling-kernel/wacc.py (100%) rename {.agents => extensions/productize}/skills/productize-financial-markets-context/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-financial-markets-context/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-fragmented-user-research-synthesis-into-coherent-insights/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-fragmented-user-research-synthesis-into-coherent-insights/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-framework-application-to-product-challenges-from-user-input/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-framework-application-to-product-challenges-from-user-input/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-frontend-design/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-frontend-design/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-future-product-opportunities-from-market-inflection-points/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-future-product-opportunities-from-market-inflection-points/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-group-decision-making-quality-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-group-decision-making-quality-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-grow/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-grow/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-growth-loops/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-growth-loops/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-growth-project-generation-with-pioneer-migrator-settler/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-growth-project-generation-with-pioneer-migrator-settler/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-growth-strategy-synthesis-from-user-inputs/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-growth-strategy-synthesis-from-user-inputs/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-gtm-motions/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-gtm-motions/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-gtm-strategy/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-gtm-strategy/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-ideal-customer-profile-icp-representative-for-x-product/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-ideal-customer-profile-icp-representative-for-x-product/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-ideal-customer-profile-icp-representative-for-x-product/references/pm-skills-main-merge.md (100%) rename {.agents => extensions/productize}/skills/productize-ideas-for-affordances-and-signifiers-based-on-a-design-problem/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-ideas-for-affordances-and-signifiers-based-on-a-design-problem/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-implementation-notes/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-implementation-notes/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-industry-trend-strategy/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-industry-trend-strategy/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-influence-strategies-from-cialdini-s-7-principles/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-influence-strategies-from-cialdini-s-7-principles/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-innovation-decision-making-heuristics/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-innovation-decision-making-heuristics/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-innovative-idea-generation-from-project-parameters-and/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-innovative-idea-generation-from-project-parameters-and/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-innovative-idea-generation-from-structured-brainstorming/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-innovative-idea-generation-from-structured-brainstorming/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-innovative-product-ideas-from-structured-brainstorming/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-innovative-product-ideas-from-structured-brainstorming/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-interactive-intake-for-ost-inputs/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-interactive-intake-for-ost-inputs/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-lean-canvas/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-lean-canvas/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-limit-based-product-strategy-from-problem-to-execution-plan/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-limit-based-product-strategy-from-problem-to-execution-plan/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-low-frequency-to-power-user-transition-strategy/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-low-frequency-to-power-user-transition-strategy/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-managerial-finance-dcf/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-managerial-finance-dcf/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-map-power-dynamics-before-meetings/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-map-power-dynamics-before-meetings/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-market-opportunities-from-jobs-to-be-done-market-canvas/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-market-opportunities-from-jobs-to-be-done-market-canvas/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-market-opportunity/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-market-opportunity/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-market-opportunity/references/canonical-canvases.md (100%) rename {.agents => extensions/productize}/skills/productize-market-opportunity/references/output-formats.md (100%) rename {.agents => extensions/productize}/skills/productize-market-opportunity/references/rating-and-decision-rules.md (100%) rename {.agents => extensions/productize}/skills/productize-market-orientation-audit/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-market-orientation-audit/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-market-requirements-from-strategic-market-inputs/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-market-requirements-from-strategic-market-inputs/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-market-sizing/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-market-sizing/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-mece-analysis-and-logical-tree-from-list-items/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-mece-analysis-and-logical-tree-from-list-items/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-meeting-agendas-from-meeting-descriptions/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-meeting-agendas-from-meeting-descriptions/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-meeting-outcome-planning-and-stakeholder-alignment/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-meeting-outcome-planning-and-stakeholder-alignment/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-meeting-summaries-from-meeting-transcript-ideas-framework/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-meeting-summaries-from-meeting-transcript-ideas-framework/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-message-framing-and-comms-plan-designer/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-message-framing-and-comms-plan-designer/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-metric-drops-diagnosis-with-rigorous-stepwise-decomposition/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-metric-drops-diagnosis-with-rigorous-stepwise-decomposition/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-metrics-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-metrics-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-monetization-strategy/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-monetization-strategy/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-multi-step-workflow-optimization/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-multi-step-workflow-optimization/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-multiple-interface-descriptions-from-a-single-image/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-multiple-interface-descriptions-from-a-single-image/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-netmba-competitor-analysis/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-netmba-competitor-analysis/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-north-star-metric/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-north-star-metric/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-now-next-later-vision-roadmap-from-interview-synthesis/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-now-next-later-vision-roadmap-from-interview-synthesis/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-nps-feedback-for-prioritized-customer-experience-initiatives/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-nps-feedback-for-prioritized-customer-experience-initiatives/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-offbeat-question-generation-from-any-topic/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-offbeat-question-generation-from-any-topic/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-office-politics-with-machiavellian-strategy/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-office-politics-with-machiavellian-strategy/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-okr-planning-from-vision-statements/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-okr-planning-from-vision-statements/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-onboarding-flow-optimization-from-product-data-to-user-success/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-onboarding-flow-optimization-from-product-data-to-user-success/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-operate/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-operate/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-opportunity-solution-tree-from-input/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-opportunity-solution-tree-from-input/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-opportunity-solution-tree-from-input/references/pm-skills-main-merge.md (100%) rename {.agents => extensions/productize}/skills/productize-outcome-roadmap/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-outcome-roadmap/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-plg-growth-playbook/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-plg-growth-playbook/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-pm-context-and-design-constraints/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-pm-context-and-design-constraints/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-pmf-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-pmf-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-positioning-statements-from-competitive-analysis-and-value/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-positioning-statements-from-competitive-analysis-and-value/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-positioning-statements-from-competitive-analysis-and-value/references/pm-skills-main-merge.md (100%) rename {.agents => extensions/productize}/skills/productize-post-launch-feedback-into-v2-improvements-synthesis/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-post-launch-feedback-into-v2-improvements-synthesis/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-post-launch-feedback-loop/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-post-launch-feedback-loop/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-potential-hidden-agenda-identification/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-potential-hidden-agenda-identification/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-prds-from-industry-and-feature-specifications/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-prds-from-industry-and-feature-specifications/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-prds-from-product-information-and-assumptions/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-prds-from-product-information-and-assumptions/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-pre-mortem/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-pre-mortem/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-presentation-narratives-from-conversation-transcripts/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-presentation-narratives-from-conversation-transcripts/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-presentations-from-5-step-storytelling-framework/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-presentations-from-5-step-storytelling-framework/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-presentations-from-structured-content-and-context/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-presentations-from-structured-content-and-context/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-press-releases-from-product-vision-working-backwards/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-press-releases-from-product-vision-working-backwards/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-pricing-strategy/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-pricing-strategy/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-prioritization-frameworks/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-prioritization-frameworks/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-privacy-policy/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-privacy-policy/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-problem-framing-before-jumping-to-solutions/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-problem-framing-before-jumping-to-solutions/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-problem-statement-framing-from-conversation-transcript/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-problem-statement-framing-from-conversation-transcript/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-assumptions-from-core-strategy-inputs/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-assumptions-from-core-strategy-inputs/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-brainstorming/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-brainstorming/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-decision-analysis-from-anthropological-research/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-decision-analysis-from-anthropological-research/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-design-analysis-from-context-and-screenshots/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-design-analysis-from-context-and-screenshots/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-feature-impact-sizing-from-metrics-and-usage-data/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-feature-impact-sizing-from-metrics-and-usage-data/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-ideas-from-user-responses/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-ideas-from-user-responses/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-market-fit-cycle/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-market-fit-cycle/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-refinement-session-planning/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-refinement-session-planning/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-requirements-from-structured-analysis/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-requirements-from-structured-analysis/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-simplification-via-via-negativa-analysis/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-simplification-via-via-negativa-analysis/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-strategy-review-from-draft-documents/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-strategy-review-from-draft-documents/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-product-vision/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-product-vision/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-proto-persona-profiles-from-user-research-and-market-data/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-proto-persona-profiles-from-user-research-and-market-data/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-proto-persona-profiles-from-user-research-and-market-data/references/pm-skills-main-merge.md (100%) rename {.agents => extensions/productize}/skills/productize-prototype-creation-from-image-descriptions-and-app-info/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-prototype-creation-from-image-descriptions-and-app-info/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-pyramid-structure-optimization-from-complex-text/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-pyramid-structure-optimization-from-complex-text/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-qa/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-qa/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-raw-interview-transcript-cleanup/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-raw-interview-transcript-cleanup/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-realistic-jtbd-interview-transcripts/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-realistic-jtbd-interview-transcripts/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-reinforcing-sequence-from-unstructured-items/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-reinforcing-sequence-from-unstructured-items/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-release-notes/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-release-notes/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-release/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-release/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-remote-miro-workshops-from-transcripts-and-specs/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-remote-miro-workshops-from-transcripts-and-specs/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-requirements-prioritization-with-p0-p1-p2-framework/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-requirements-prioritization-with-p0-p1-p2-framework/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-research-into-durable-competitive-moats/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-research-into-durable-competitive-moats/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-risk-return-cost-of-capital/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-risk-return-cost-of-capital/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-risky-assumption-prioritization-for-rapid-validation/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-risky-assumption-prioritization-for-rapid-validation/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-roadmap-update/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-roadmap-update/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-robust-experiment-design-from-goals-and-systems/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-robust-experiment-design-from-goals-and-systems/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-role-identity-decision-making-map/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-role-identity-decision-making-map/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-root-cause-and-consequence-analysis-from-a-question/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-root-cause-and-consequence-analysis-from-a-question/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-scope-defense-using-time-cost-tradeoff-analysis/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-scope-defense-using-time-cost-tradeoff-analysis/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-sketch-descriptions-for-wireframes-from-product-ideas/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-sketch-descriptions-for-wireframes-from-product-ideas/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-skimmable-writing-transformation/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-skimmable-writing-transformation/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-slide-decks-from-problem-statements-and-context/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-slide-decks-from-problem-statements-and-context/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-solution-anti-patterns-from-customer-problem-analysis/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-solution-anti-patterns-from-customer-problem-analysis/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-solution-design-for-edge-cases-in-product-development/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-solution-design-for-edge-cases-in-product-development/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-spec-writing/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-spec-writing/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-sprint-planning/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-sprint-planning/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-sql-queries/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-sql-queries/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-sql-query-from-requirements-and-data-tables/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-sql-query-from-requirements-and-data-tables/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-brief-clarification-and-problem-definition/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-brief-clarification-and-problem-definition/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-decision-making-using-toc-thinking-process/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-decision-making-using-toc-thinking-process/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-moo-objections-and-product-derailment-risks/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-moo-objections-and-product-derailment-risks/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-power-interest-and-influence-map/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-power-interest-and-influence-map/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-power-interest-and-influence-map/references/pm-skills-main-merge.md (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-risk-review-for-a-feature-or-prd/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-risk-review-for-a-feature-or-prd/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-update/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-stakeholder-update/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-startup-canvas/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-startup-canvas/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-statistical-analysis/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-statistical-analysis/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-strategic-crux-diagnosis-and-strategy-design/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-strategic-crux-diagnosis-and-strategy-design/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-strategic-decision-making-quality-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-strategic-decision-making-quality-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-strategic-moves-from-swot-pairings/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-strategic-moves-from-swot-pairings/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-strategic-presentation-planning-from-topic-audience-and-time/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-strategic-presentation-planning-from-topic-audience-and-time/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-strategy-curve-blue-ocean/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-strategy-curve-blue-ocean/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-strategy-kernel-extraction-from-context/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-strategy-kernel-extraction-from-context/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-strategy-to-execution-bridge-for-ux-decisions/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-strategy-to-execution-bridge-for-ux-decisions/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-structured-decision-journals-from-decisions-and-context/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-structured-decision-journals-from-decisions-and-context/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-structured-insight-extraction-from-conversation-transcripts/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-structured-insight-extraction-from-conversation-transcripts/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-structured-interview-notes-from-transcript-using-flexible/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-structured-interview-notes-from-transcript-using-flexible/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-structured-interview-notes-from-transcript-using-flexible/references/pm-skills-main-merge.md (100%) rename {.agents => extensions/productize}/skills/productize-structured-json-descriptions-from-ui-screenshots/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-structured-json-descriptions-from-ui-screenshots/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-structured-product-hypotheses-from-product-problems/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-structured-product-hypotheses-from-product-problems/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-structured-product-strategy-from-product-context/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-structured-product-strategy-from-product-context/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-structured-requirements-from-conversation-transcripts/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-structured-requirements-from-conversation-transcripts/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-structured-requirements-from-design-assets/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-structured-requirements-from-design-assets/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-success-metrics-for-design-decisions/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-success-metrics-for-design-decisions/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-support-tickets-as-actionable-product-improvements/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-support-tickets-as-actionable-product-improvements/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-sustainable-business-model/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-sustainable-business-model/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-sustainable-business-model/references/output-format.md (100%) rename {.agents => extensions/productize}/skills/productize-sustainable-business-model/references/pattern-groups.md (100%) rename {.agents => extensions/productize}/skills/productize-synthesize-research/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-synthesize-research/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-systematic-debugging/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-systematic-debugging/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-target-opportunity-selection-from-ost/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-target-opportunity-selection-from-ost/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-task-list-optimization-and-contingency-based-project-planning/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-task-list-optimization-and-contingency-based-project-planning/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-task-specific-product-strategy-design/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-task-specific-product-strategy-design/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-tdd/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-tdd/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-technical-architecture-brief-from-product-requirements-doc/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-technical-architecture-brief-from-product-requirements-doc/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-technical-translation-and-stakeholder-communication/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-technical-translation-and-stakeholder-communication/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-test-scenarios/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-test-scenarios/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-thesis-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-thesis-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-trade-off-analysis-from-feature-priority-and-effort-data/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-trade-off-analysis-from-feature-priority-and-effort-data/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-user-stories-from-initiative-requirements/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-user-stories-from-initiative-requirements/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/references/pm-skills-main-merge.md (100%) rename {.agents => extensions/productize}/skills/productize-ux-edge-cases-from-product-briefs/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-ux-edge-cases-from-product-briefs/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-ux-terminology-improvements-in-product-requirements/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-ux-terminology-improvements-in-product-requirements/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-validate-data/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-validate-data/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-valuation-and-deal-pricing/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-valuation-and-deal-pricing/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-value-chain-mapping-from-end-user-needs-to-core-value/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-value-chain-mapping-from-end-user-needs-to-core-value/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-venture-capital-deal-modeling/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-venture-capital-deal-modeling/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-verification/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-verification/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-visual-decision-making-review/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-visual-decision-making-review/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-workshop-activity-design-from-problem-and-participant/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-workshop-activity-design-from-problem-and-participant/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-write-query/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-write-query/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-write-query/references/pm-skills-main-merge.md (100%) rename {.agents => extensions/productize}/skills/productize-write-spec/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-write-spec/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-write-spec/references/pm-skills-main-merge.md (100%) rename {.agents => extensions/productize}/skills/productize-writing-plans/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-writing-plans/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize-wwas/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize-wwas/agents/openai.yaml (100%) rename {.agents => extensions/productize}/skills/productize/SKILL.md (100%) rename {.agents => extensions/productize}/skills/productize/agents/openai.yaml (100%) create mode 100644 extensions/qa-workflow/extension.toml create mode 100644 extensions/qa-workflow/main.go create mode 100644 extensions/qa-workflow/main_test.go create mode 100644 go.mod create mode 100644 go.sum delete mode 100644 hosts/claude.mjs delete mode 100644 hosts/claude.ts delete mode 100644 hosts/codex.mjs delete mode 100644 hosts/codex.ts delete mode 100644 hosts/cursor.mjs delete mode 100644 hosts/cursor.ts delete mode 100644 hosts/factory.mjs delete mode 100644 hosts/factory.ts delete mode 100644 hosts/index.mjs delete mode 100644 hosts/opencode.mjs delete mode 100644 hosts/opencode.ts delete mode 100644 hosts/shared.mjs create mode 100644 imgs/how-it-works-flow.png create mode 100644 imgs/how-it-works-flow.svg create mode 100644 imgs/how-it-works.drawio create mode 100644 imgs/screenshot.png create mode 100644 internal/api/client/client.go create mode 100644 internal/api/client/client_contract_test.go create mode 100644 internal/api/client/client_transport_test.go create mode 100644 internal/api/client/operator.go create mode 100644 internal/api/client/reviews_exec.go create mode 100644 internal/api/client/reviews_exec_test.go create mode 100644 internal/api/client/runs.go create mode 100644 internal/api/client/runs_test.go create mode 100644 internal/api/contract/compatibility.go create mode 100644 internal/api/contract/contract_integration_test.go create mode 100644 internal/api/contract/contract_test.go create mode 100644 internal/api/contract/doc.go create mode 100644 internal/api/contract/errors.go create mode 100644 internal/api/contract/routes.go create mode 100644 internal/api/contract/sse.go create mode 100644 internal/api/contract/timeout.go create mode 100644 internal/api/contract/types.go create mode 100644 internal/api/core/errors.go create mode 100644 internal/api/core/handlers.go create mode 100644 internal/api/core/handlers_contract_test.go create mode 100644 internal/api/core/handlers_error_paths_test.go create mode 100644 internal/api/core/handlers_service_errors_test.go create mode 100644 internal/api/core/handlers_smoke_test.go create mode 100644 internal/api/core/handlers_test.go create mode 100644 internal/api/core/interfaces.go create mode 100644 internal/api/core/internal_helpers_test.go create mode 100644 internal/api/core/middleware.go create mode 100644 internal/api/core/routes.go create mode 100644 internal/api/core/sse.go create mode 100644 internal/api/core/sse_test.go create mode 100644 internal/api/core/workspace_socket.go create mode 100644 internal/api/httpapi/browser_middleware.go create mode 100644 internal/api/httpapi/browser_middleware_test.go create mode 100644 internal/api/httpapi/openapi_contract_test.go create mode 100644 internal/api/httpapi/routes.go create mode 100644 internal/api/httpapi/security_headers.go create mode 100644 internal/api/httpapi/security_headers_test.go create mode 100644 internal/api/httpapi/server.go create mode 100644 internal/api/httpapi/transport_integration_test.go create mode 100644 internal/api/testutil/sse.go create mode 100644 internal/api/udsapi/routes.go create mode 100644 internal/api/udsapi/server.go create mode 100644 internal/charmtheme/theme.go create mode 100644 internal/charmtheme/theme_test.go create mode 100644 internal/cli/.productize/catalog/skills.json create mode 100644 internal/cli/agents_commands.go create mode 100644 internal/cli/agents_commands_test.go create mode 100644 internal/cli/archive_command_integration_test.go create mode 100644 internal/cli/command_context.go create mode 100644 internal/cli/command_context_test.go create mode 100644 internal/cli/commands.go create mode 100644 internal/cli/commands_simple.go create mode 100644 internal/cli/commands_test.go create mode 100644 internal/cli/daemon.go create mode 100644 internal/cli/daemon_commands.go create mode 100644 internal/cli/daemon_commands_test.go create mode 100644 internal/cli/daemon_exec_test_helpers_test.go create mode 100644 internal/cli/daemon_launch_other.go create mode 100644 internal/cli/daemon_launch_unix.go create mode 100644 internal/cli/dispatch_adapters.go create mode 100644 internal/cli/exit.go create mode 100644 internal/cli/exit_test.go create mode 100644 internal/cli/extension/display.go create mode 100644 internal/cli/extension/display_test.go create mode 100644 internal/cli/extension/doctor.go create mode 100644 internal/cli/extension/doctor_test.go create mode 100644 internal/cli/extension/enablement.go create mode 100644 internal/cli/extension/install.go create mode 100644 internal/cli/extension/install_source.go create mode 100644 internal/cli/extension/install_source_test.go create mode 100644 internal/cli/extension/root.go create mode 100644 internal/cli/extensions_bootstrap.go create mode 100644 internal/cli/extensions_bootstrap_test.go create mode 100644 internal/cli/form.go create mode 100644 internal/cli/form_daemon_overrides_test.go create mode 100644 internal/cli/form_test.go create mode 100644 internal/cli/kernel_dispatch_test.go create mode 100644 internal/cli/makefile_publish_test.go create mode 100644 internal/cli/migrate_command_test.go create mode 100644 internal/cli/operator_commands_integration_test.go create mode 100644 internal/cli/operator_output.go create mode 100644 internal/cli/operator_transport_integration_test.go create mode 100644 internal/cli/reusable_agents_doc_examples_test.go create mode 100644 internal/cli/reviews_exec_daemon.go create mode 100644 internal/cli/reviews_exec_daemon_additional_test.go create mode 100644 internal/cli/root.go create mode 100644 internal/cli/root_command_execution_test.go create mode 100644 internal/cli/root_test.go create mode 100644 internal/cli/run.go create mode 100644 internal/cli/run_observe.go create mode 100644 internal/cli/runs.go create mode 100644 internal/cli/setup.go create mode 100644 internal/cli/setup_assets.go create mode 100644 internal/cli/setup_test.go create mode 100644 internal/cli/skills_preflight.go create mode 100644 internal/cli/skills_preflight_test.go create mode 100644 internal/cli/state.go create mode 100644 internal/cli/task_runtime_flag.go create mode 100644 internal/cli/task_runtime_flag_test.go create mode 100644 internal/cli/task_runtime_form.go create mode 100644 internal/cli/testdata/exec_help.golden create mode 100644 internal/cli/testdata/tasks_run_help.golden create mode 100644 internal/cli/theme.go create mode 100644 internal/cli/theme_test.go create mode 100644 internal/cli/upgrade.go create mode 100644 internal/cli/validate_tasks.go create mode 100644 internal/cli/validate_tasks_test.go create mode 100644 internal/cli/workspace_commands.go create mode 100644 internal/cli/workspace_config.go create mode 100644 internal/cli/workspace_config_test.go create mode 100644 internal/config/home.go create mode 100644 internal/config/home_test.go create mode 100644 internal/contentblock/engine.go create mode 100644 internal/contentblock/engine_test.go create mode 100644 internal/core/agent/acp_convert.go create mode 100644 internal/core/agent/client.go create mode 100644 internal/core/agent/client_test.go create mode 100644 internal/core/agent/codex_live_test.go create mode 100644 internal/core/agent/hooks.go create mode 100644 internal/core/agent/registry_compat.go create mode 100644 internal/core/agent/registry_launch.go create mode 100644 internal/core/agent/registry_overlay.go create mode 100644 internal/core/agent/registry_overlay_test.go create mode 100644 internal/core/agent/registry_specs.go create mode 100644 internal/core/agent/registry_test.go create mode 100644 internal/core/agent/registry_validate.go create mode 100644 internal/core/agent/session.go create mode 100644 internal/core/agent/session_helpers_test.go create mode 100644 internal/core/agent/session_test.go create mode 100644 internal/core/agent/terminal.go create mode 100644 internal/core/agent/tool_call_input.go create mode 100644 internal/core/agent/tool_call_name.go create mode 100644 internal/core/agent/tool_call_name_test.go create mode 100644 internal/core/agents/agents.go create mode 100644 internal/core/agents/agents_test.go create mode 100644 internal/core/agents/doc_examples_test.go create mode 100644 internal/core/agents/execution.go create mode 100644 internal/core/agents/execution_test.go create mode 100644 internal/core/agents/mcpserver/engine.go create mode 100644 internal/core/agents/mcpserver/engine_test.go create mode 100644 internal/core/agents/mcpserver/server.go create mode 100644 internal/core/agents/mcpserver/server_test.go create mode 100644 internal/core/agents/reasons.go create mode 100644 internal/core/agents/session_mcp.go create mode 100644 internal/core/agents/session_mcp_test.go create mode 100644 internal/core/api.go create mode 100644 internal/core/api_test.go create mode 100644 internal/core/archive.go create mode 100644 internal/core/archive_test.go create mode 100644 internal/core/contentconv/contentconv.go create mode 100644 internal/core/contentconv/contentconv_test.go create mode 100644 internal/core/extension/assets.go create mode 100644 internal/core/extension/assets_test.go create mode 100644 internal/core/extension/audit.go create mode 100644 internal/core/extension/audit_test.go create mode 100644 internal/core/extension/builtin/doc.go create mode 100644 internal/core/extension/capability.go create mode 100644 internal/core/extension/capability_test.go create mode 100644 internal/core/extension/chain.go create mode 100644 internal/core/extension/daemon_bridge.go create mode 100644 internal/core/extension/discovery.go create mode 100644 internal/core/extension/discovery_bundled.go create mode 100644 internal/core/extension/discovery_test.go create mode 100644 internal/core/extension/dispatcher.go create mode 100644 internal/core/extension/dispatcher_test.go create mode 100644 internal/core/extension/doc.go create mode 100644 internal/core/extension/enablement.go create mode 100644 internal/core/extension/enablement_test.go create mode 100644 internal/core/extension/hooks_integration_test.go create mode 100644 internal/core/extension/host_api.go create mode 100644 internal/core/extension/host_api_errors.go create mode 100644 internal/core/extension/host_api_test.go create mode 100644 internal/core/extension/host_helpers.go create mode 100644 internal/core/extension/host_helpers_test.go create mode 100644 internal/core/extension/host_reads.go create mode 100644 internal/core/extension/host_reads_test.go create mode 100644 internal/core/extension/host_writes.go create mode 100644 internal/core/extension/host_writes_test.go create mode 100644 internal/core/extension/manager.go create mode 100644 internal/core/extension/manager_active.go create mode 100644 internal/core/extension/manager_constants.go create mode 100644 internal/core/extension/manager_events.go create mode 100644 internal/core/extension/manager_health.go create mode 100644 internal/core/extension/manager_shutdown.go create mode 100644 internal/core/extension/manager_spawn.go create mode 100644 internal/core/extension/manager_test.go create mode 100644 internal/core/extension/manifest.go create mode 100644 internal/core/extension/manifest_load.go create mode 100644 internal/core/extension/manifest_test.go create mode 100644 internal/core/extension/manifest_validate.go create mode 100644 internal/core/extension/origin.go create mode 100644 internal/core/extension/origin_test.go create mode 100644 internal/core/extension/provider_entry.go create mode 100644 internal/core/extension/review_provider_bridge.go create mode 100644 internal/core/extension/review_provider_bridge_integration_test.go create mode 100644 internal/core/extension/review_provider_runtime.go create mode 100644 internal/core/extension/review_provider_runtime_test.go create mode 100644 internal/core/extension/runtime.go create mode 100644 internal/core/extension/runtime_test.go create mode 100644 internal/core/extension/sdk_manager_integration_test.go create mode 100644 internal/core/extension/testdata/mock_extension/main.go create mode 100644 internal/core/extension/testdata/sdk_extension/main.go create mode 100644 internal/core/extension/testdata/sdk_review_extension/main.go create mode 100644 internal/core/extension/ts_template_manager_integration_test.go create mode 100644 internal/core/fetch.go create mode 100644 internal/core/fetch_test.go create mode 100644 internal/core/frontmatter/frontmatter.go create mode 100644 internal/core/frontmatter/frontmatter_test.go create mode 100644 internal/core/kernel/commands/commands_test.go create mode 100644 internal/core/kernel/commands/doc.go create mode 100644 internal/core/kernel/commands/reviews_fetch.go create mode 100644 internal/core/kernel/commands/run_start.go create mode 100644 internal/core/kernel/commands/runtime_config.go create mode 100644 internal/core/kernel/commands/workflow_archive.go create mode 100644 internal/core/kernel/commands/workflow_prepare.go create mode 100644 internal/core/kernel/commands/workflow_sync.go create mode 100644 internal/core/kernel/commands/workspace_migrate.go create mode 100644 internal/core/kernel/core_adapters.go create mode 100644 internal/core/kernel/core_adapters_test.go create mode 100644 internal/core/kernel/deps.go create mode 100644 internal/core/kernel/deps_test.go create mode 100644 internal/core/kernel/dispatcher.go create mode 100644 internal/core/kernel/dispatcher_test.go create mode 100644 internal/core/kernel/doc.go create mode 100644 internal/core/kernel/handlers.go create mode 100644 internal/core/kernel/handlers_extensions_test.go create mode 100644 internal/core/kernel/run_scope_cancellation_integration_test.go create mode 100644 internal/core/kernel/run_scope_integration_test.go create mode 100644 internal/core/memory/store.go create mode 100644 internal/core/memory/store_test.go create mode 100644 internal/core/migrate.go create mode 100644 internal/core/migration/migrate.go create mode 100644 internal/core/migration/migrate_test.go create mode 100644 internal/core/migration/workflow_target.go create mode 100644 internal/core/migration/workflow_target_test.go create mode 100644 internal/core/model/artifacts.go create mode 100644 internal/core/model/constants.go create mode 100644 internal/core/model/content.go create mode 100644 internal/core/model/content_test.go create mode 100644 internal/core/model/hook_types.go create mode 100644 internal/core/model/hooks.go create mode 100644 internal/core/model/mcp.go create mode 100644 internal/core/model/model_test.go create mode 100644 internal/core/model/preparation.go create mode 100644 internal/core/model/preparation_test.go create mode 100644 internal/core/model/run_scope.go create mode 100644 internal/core/model/run_scope_internal_test.go create mode 100644 internal/core/model/runtime_config.go create mode 100644 internal/core/model/task_review.go create mode 100644 internal/core/model/task_runtime.go create mode 100644 internal/core/model/workflow_ops.go create mode 100644 internal/core/model/workspace_paths.go create mode 100644 internal/core/modelprovider/overlay.go create mode 100644 internal/core/modelprovider/overlay_test.go create mode 100644 internal/core/plan/input.go create mode 100644 internal/core/plan/journal.go create mode 100644 internal/core/plan/prepare.go create mode 100644 internal/core/plan/prepare_test.go create mode 100644 internal/core/prompt/common.go create mode 100644 internal/core/prompt/prd.go create mode 100644 internal/core/prompt/prompt_test.go create mode 100644 internal/core/prompt/prompts/claude-reasoning-high.txt create mode 100644 internal/core/prompt/prompts/claude-reasoning-low.txt create mode 100644 internal/core/prompt/prompts/claude-reasoning-medium.txt create mode 100644 internal/core/prompt/prompts/claude-reasoning-xhigh.txt create mode 100644 internal/core/prompt/review.go create mode 100644 internal/core/prompt/templates.go create mode 100644 internal/core/provider/coderabbit/coderabbit.go create mode 100644 internal/core/provider/coderabbit/coderabbit_test.go create mode 100644 internal/core/provider/coderabbit/nitpicks.go create mode 100644 internal/core/provider/coderabbit/nitpicks_test.go create mode 100644 internal/core/provider/overlay.go create mode 100644 internal/core/provider/overlay_test.go create mode 100644 internal/core/provider/provider.go create mode 100644 internal/core/provider/provider_test.go create mode 100644 internal/core/provider/registry.go create mode 100644 internal/core/provider/registry_test.go create mode 100644 internal/core/providerdefaults/defaults.go create mode 100644 internal/core/providerdefaults/defaults_test.go create mode 100644 internal/core/reviews/parser.go create mode 100644 internal/core/reviews/parser_test.go create mode 100644 internal/core/reviews/store.go create mode 100644 internal/core/reviews/store_test.go create mode 100644 internal/core/run/exec/aliases.go create mode 100644 internal/core/run/exec/exec.go create mode 100644 internal/core/run/exec/exec_integration_test.go create mode 100644 internal/core/run/exec/exec_test.go create mode 100644 internal/core/run/exec/hooks.go create mode 100644 internal/core/run/exec/prompt_exec.go create mode 100644 internal/core/run/exec/run_agent_engine_integration_test.go create mode 100644 internal/core/run/exec/test_helpers_test.go create mode 100644 internal/core/run/exec_facade.go create mode 100644 internal/core/run/executor/aliases.go create mode 100644 internal/core/run/executor/event_stream.go create mode 100644 internal/core/run/executor/event_stream_test.go create mode 100644 internal/core/run/executor/execution.go create mode 100644 internal/core/run/executor/execution_acp_integration_test.go create mode 100644 internal/core/run/executor/execution_acp_test.go create mode 100644 internal/core/run/executor/execution_test.go create mode 100644 internal/core/run/executor/execution_ui_test.go create mode 100644 internal/core/run/executor/format_helpers.go create mode 100644 internal/core/run/executor/hooks.go create mode 100644 internal/core/run/executor/lifecycle.go create mode 100644 internal/core/run/executor/result.go create mode 100644 internal/core/run/executor/result_test.go create mode 100644 internal/core/run/executor/review_hooks.go create mode 100644 internal/core/run/executor/runner.go create mode 100644 internal/core/run/executor/runtime_guard_test.go create mode 100644 internal/core/run/executor/shutdown.go create mode 100644 internal/core/run/executor/test_helpers_test.go create mode 100644 internal/core/run/internal/acpshared/aliases.go create mode 100644 internal/core/run/internal/acpshared/command_io.go create mode 100644 internal/core/run/internal/acpshared/command_io_test.go create mode 100644 internal/core/run/internal/acpshared/compat_test.go create mode 100644 internal/core/run/internal/acpshared/reusable_agent_lifecycle.go create mode 100644 internal/core/run/internal/acpshared/session_exec.go create mode 100644 internal/core/run/internal/acpshared/session_handler.go create mode 100644 internal/core/run/internal/acpshared/session_handler_test.go create mode 100644 internal/core/run/internal/runshared/buffers.go create mode 100644 internal/core/run/internal/runshared/buffers_test.go create mode 100644 internal/core/run/internal/runshared/config.go create mode 100644 internal/core/run/internal/runshared/config_test.go create mode 100644 internal/core/run/internal/runshared/logging.go create mode 100644 internal/core/run/internal/runshared/shutdown.go create mode 100644 internal/core/run/internal/runshared/types.go create mode 100644 internal/core/run/internal/runtimeevents/events.go create mode 100644 internal/core/run/internal/worktree/snapshot.go create mode 100644 internal/core/run/internal/worktree/snapshot_test.go create mode 100644 internal/core/run/journal/journal.go create mode 100644 internal/core/run/journal/journal_test.go create mode 100644 internal/core/run/preflight.go create mode 100644 internal/core/run/preflight/preflight.go create mode 100644 internal/core/run/preflight/preflight_test.go create mode 100644 internal/core/run/preflight/preflight_test_helpers_test.go create mode 100644 internal/core/run/run.go create mode 100644 internal/core/run/run_test.go create mode 100644 internal/core/run/test_hooks.go create mode 100644 internal/core/run/transcript/compat_test.go create mode 100644 internal/core/run/transcript/model.go create mode 100644 internal/core/run/transcript/model_test.go create mode 100644 internal/core/run/transcript/render.go create mode 100644 internal/core/run/transcript/tool_use_summary.go create mode 100644 internal/core/run/ui/adapter_test.go create mode 100644 internal/core/run/ui/aliases.go create mode 100644 internal/core/run/ui/bench_test.go create mode 100644 internal/core/run/ui/layout.go create mode 100644 internal/core/run/ui/model.go create mode 100644 internal/core/run/ui/model_test.go create mode 100644 internal/core/run/ui/remote.go create mode 100644 internal/core/run/ui/remote_test.go create mode 100644 internal/core/run/ui/sidebar.go create mode 100644 internal/core/run/ui/styles.go create mode 100644 internal/core/run/ui/summary.go create mode 100644 internal/core/run/ui/timeline.go create mode 100644 internal/core/run/ui/types.go create mode 100644 internal/core/run/ui/update.go create mode 100644 internal/core/run/ui/update_test.go create mode 100644 internal/core/run/ui/validation_form.go create mode 100644 internal/core/run/ui/validation_form_test.go create mode 100644 internal/core/run/ui/view.go create mode 100644 internal/core/run/ui/view_test.go create mode 100644 internal/core/sound/player.go create mode 100644 internal/core/sound/player_test.go create mode 100644 internal/core/sound/player_unix.go create mode 100644 internal/core/sound/player_windows.go create mode 100644 internal/core/sound/presets.go create mode 100644 internal/core/sound/presets_test.go create mode 100644 internal/core/sound/runner.go create mode 100644 internal/core/sound/subscriber.go create mode 100644 internal/core/sound/subscriber_test.go create mode 100644 internal/core/subprocess/handshake.go create mode 100644 internal/core/subprocess/process.go create mode 100644 internal/core/subprocess/process_unix.go create mode 100644 internal/core/subprocess/process_unix_test.go create mode 100644 internal/core/subprocess/process_windows.go create mode 100644 internal/core/subprocess/transport.go create mode 100644 internal/core/subprocess/transport_test.go create mode 100644 internal/core/sync.go create mode 100644 internal/core/sync_test.go create mode 100644 internal/core/tasks/fix_prompt.go create mode 100644 internal/core/tasks/fix_prompt_test.go create mode 100644 internal/core/tasks/parser.go create mode 100644 internal/core/tasks/parser_test.go create mode 100644 internal/core/tasks/store.go create mode 100644 internal/core/tasks/store_test.go create mode 100644 internal/core/tasks/testdata/fix_prompt.golden create mode 100644 internal/core/tasks/testdata/validate_title_h1.golden create mode 100644 internal/core/tasks/title.go create mode 100644 internal/core/tasks/type_remap.go create mode 100644 internal/core/tasks/type_remap_test.go create mode 100644 internal/core/tasks/types.go create mode 100644 internal/core/tasks/types_test.go create mode 100644 internal/core/tasks/validate.go create mode 100644 internal/core/tasks/validate_test.go create mode 100644 internal/core/tasks/walker.go create mode 100644 internal/core/tasks/walker_test.go create mode 100644 internal/core/workflow_target.go create mode 100644 internal/core/workflow_target_test.go create mode 100644 internal/core/workspace/config.go create mode 100644 internal/core/workspace/config_merge.go create mode 100644 internal/core/workspace/config_test.go create mode 100644 internal/core/workspace/config_types.go create mode 100644 internal/core/workspace/config_validate.go create mode 100644 internal/core/workspace_paths_test.go create mode 100644 internal/daemon/boot.go create mode 100644 internal/daemon/boot_integration_test.go create mode 100644 internal/daemon/boot_test.go create mode 100644 internal/daemon/extension_bridge.go create mode 100644 internal/daemon/host.go create mode 100644 internal/daemon/host_runtime_test.go create mode 100644 internal/daemon/info.go create mode 100644 internal/daemon/info_lock_test.go create mode 100644 internal/daemon/lock.go create mode 100644 internal/daemon/process_unix.go create mode 100644 internal/daemon/process_windows.go create mode 100644 internal/daemon/purge_test.go create mode 100644 internal/daemon/query_documents.go create mode 100644 internal/daemon/query_helpers_test.go create mode 100644 internal/daemon/query_kinds.go create mode 100644 internal/daemon/query_models.go create mode 100644 internal/daemon/query_service.go create mode 100644 internal/daemon/query_service_test.go create mode 100644 internal/daemon/reconcile.go create mode 100644 internal/daemon/reconcile_test.go create mode 100644 internal/daemon/review_exec_transport_service.go create mode 100644 internal/daemon/review_exec_transport_service_test.go create mode 100644 internal/daemon/review_watch.go create mode 100644 internal/daemon/review_watch_git.go create mode 100644 internal/daemon/review_watch_git_test.go create mode 100644 internal/daemon/review_watch_hooks.go create mode 100644 internal/daemon/review_watch_test.go create mode 100644 internal/daemon/run_integrity.go create mode 100644 internal/daemon/run_integrity_test.go create mode 100644 internal/daemon/run_manager.go create mode 100644 internal/daemon/run_manager_bench_test.go create mode 100644 internal/daemon/run_manager_test.go create mode 100644 internal/daemon/run_snapshot.go create mode 100644 internal/daemon/run_snapshot_compact.go create mode 100644 internal/daemon/run_snapshot_test.go create mode 100644 internal/daemon/run_transcript.go create mode 100644 internal/daemon/run_transcript_test.go create mode 100644 internal/daemon/runtime.go create mode 100644 internal/daemon/runtime_test.go create mode 100644 internal/daemon/service.go create mode 100644 internal/daemon/service_test.go create mode 100644 internal/daemon/shutdown.go create mode 100644 internal/daemon/shutdown_test.go create mode 100644 internal/daemon/signal_other.go create mode 100644 internal/daemon/signal_unix.go create mode 100644 internal/daemon/sync_transport_service.go create mode 100644 internal/daemon/sync_transport_service_test.go create mode 100644 internal/daemon/task_transport_service.go create mode 100644 internal/daemon/transport_mappers.go create mode 100644 internal/daemon/transport_read_models_test.go create mode 100644 internal/daemon/transport_service_test.go create mode 100644 internal/daemon/watcher_error_test.go create mode 100644 internal/daemon/watchers.go create mode 100644 internal/daemon/watchers_test.go create mode 100644 internal/daemon/workspace_events.go create mode 100644 internal/daemon/workspace_refresh.go create mode 100644 internal/daemon/workspace_transport_service.go create mode 100644 internal/logger/logger.go create mode 100644 internal/logger/logger_test.go create mode 100644 internal/setup/agents.go create mode 100644 internal/setup/agents_test.go create mode 100644 internal/setup/bundle.go create mode 100644 internal/setup/bundle_test.go create mode 100644 internal/setup/catalog.go create mode 100644 internal/setup/catalog_effective.go create mode 100644 internal/setup/catalog_effective_test.go create mode 100644 internal/setup/catalog_export.go create mode 100644 internal/setup/catalog_export_test.go create mode 100644 internal/setup/catalog_helpers.go create mode 100644 internal/setup/catalog_test.go create mode 100644 internal/setup/extensions.go create mode 100644 internal/setup/extensions_test.go create mode 100644 internal/setup/install.go create mode 100644 internal/setup/install_test.go create mode 100644 internal/setup/legacy_cleanup.go create mode 100644 internal/setup/legacy_cleanup_test.go create mode 100644 internal/setup/reusable_agent_sources.go create mode 100644 internal/setup/reusable_agent_sources_test.go create mode 100644 internal/setup/reusable_agents.go create mode 100644 internal/setup/reusable_agents_test_helpers_test.go create mode 100644 internal/setup/runtime_agents.go create mode 100644 internal/setup/select.go create mode 100644 internal/setup/skills_selected.go create mode 100644 internal/setup/types.go create mode 100644 internal/setup/verify.go create mode 100644 internal/setup/verify_test.go create mode 100644 internal/store/globaldb/archive.go create mode 100644 internal/store/globaldb/archive_test.go create mode 100644 internal/store/globaldb/close_test.go create mode 100644 internal/store/globaldb/global_db.go create mode 100644 internal/store/globaldb/migrations.go create mode 100644 internal/store/globaldb/migrations_test.go create mode 100644 internal/store/globaldb/query_coverage_test.go create mode 100644 internal/store/globaldb/read_queries.go create mode 100644 internal/store/globaldb/read_queries_test.go create mode 100644 internal/store/globaldb/registry.go create mode 100644 internal/store/globaldb/registry_integration_test.go create mode 100644 internal/store/globaldb/registry_test.go create mode 100644 internal/store/globaldb/reviews.go create mode 100644 internal/store/globaldb/run_status.go create mode 100644 internal/store/globaldb/runs.go create mode 100644 internal/store/globaldb/runs_test.go create mode 100644 internal/store/globaldb/sync.go create mode 100644 internal/store/globaldb/sync_test.go create mode 100644 internal/store/rundb/close_test.go create mode 100644 internal/store/rundb/migrations.go create mode 100644 internal/store/rundb/migrations_test.go create mode 100644 internal/store/rundb/run_db.go create mode 100644 internal/store/rundb/run_db_bench_test.go create mode 100644 internal/store/rundb/run_db_test.go create mode 100644 internal/store/schema.go create mode 100644 internal/store/sqlite.go create mode 100644 internal/store/sqlite_test.go create mode 100644 internal/store/store.go create mode 100644 internal/store/values.go create mode 100644 internal/update/check.go create mode 100644 internal/update/check_test.go create mode 100644 internal/update/install.go create mode 100644 internal/update/install_test.go create mode 100644 internal/update/state.go create mode 100644 internal/update/state_test.go create mode 100644 internal/version/version.go create mode 100644 openapi/productize-daemon.json create mode 100644 pkg/productize/events/bus.go create mode 100644 pkg/productize/events/bus_integration_test.go create mode 100644 pkg/productize/events/bus_test.go create mode 100644 pkg/productize/events/doc.go create mode 100644 pkg/productize/events/docs_test.go create mode 100644 pkg/productize/events/event.go create mode 100644 pkg/productize/events/event_test.go create mode 100644 pkg/productize/events/kinds/content_block.go create mode 100644 pkg/productize/events/kinds/doc.go create mode 100644 pkg/productize/events/kinds/extension.go create mode 100644 pkg/productize/events/kinds/job.go create mode 100644 pkg/productize/events/kinds/payload_compat_test.go create mode 100644 pkg/productize/events/kinds/provider.go create mode 100644 pkg/productize/events/kinds/reusable_agent.go create mode 100644 pkg/productize/events/kinds/reusable_agent_test.go create mode 100644 pkg/productize/events/kinds/review.go create mode 100644 pkg/productize/events/kinds/run.go create mode 100644 pkg/productize/events/kinds/session.go create mode 100644 pkg/productize/events/kinds/session_test.go create mode 100644 pkg/productize/events/kinds/shutdown.go create mode 100644 pkg/productize/events/kinds/task.go create mode 100644 pkg/productize/events/kinds/tool_call.go create mode 100644 pkg/productize/events/kinds/usage.go create mode 100644 pkg/productize/runs/channels.go create mode 100644 pkg/productize/runs/doc.go create mode 100644 pkg/productize/runs/examples_test.go create mode 100644 pkg/productize/runs/helpers_test.go create mode 100644 pkg/productize/runs/integration_test.go create mode 100644 pkg/productize/runs/layout/layout.go create mode 100644 pkg/productize/runs/layout/layout_test.go create mode 100644 pkg/productize/runs/list_test.go create mode 100644 pkg/productize/runs/remote_watch.go create mode 100644 pkg/productize/runs/remote_watch_test.go create mode 100644 pkg/productize/runs/replay.go create mode 100644 pkg/productize/runs/run.go create mode 100644 pkg/productize/runs/run_test.go create mode 100644 pkg/productize/runs/status.go create mode 100644 pkg/productize/runs/summary.go create mode 100644 pkg/productize/runs/tail.go create mode 100644 pkg/productize/runs/tail_test.go create mode 100644 pkg/productize/runs/test_helpers_test.go create mode 100644 pkg/productize/runs/transport_test.go create mode 100644 pkg/productize/runs/watch.go create mode 100644 pkg/productize/runs/watch_test.go delete mode 100644 plugins/productize-ai-execution/.codex-plugin/plugin.json delete mode 100644 plugins/productize-ai-execution/skills/productize-backend-design/SKILL.md delete mode 100644 plugins/productize-ai-execution/skills/productize-dual-mode-ai-coding-assistant-staff-eng-intern/SKILL.md delete mode 100644 plugins/productize-ai-execution/skills/productize-dx-review/SKILL.md delete mode 100644 plugins/productize-ai-execution/skills/productize-eng-review/SKILL.md delete mode 100644 plugins/productize-ai-execution/skills/productize-engineering-problem-solving-and-solution-structuring/SKILL.md delete mode 100644 plugins/productize-ai-execution/skills/productize-features-reframing-and-projects-shape-up/SKILL.md delete mode 100644 plugins/productize-ai-execution/skills/productize-implementation-notes/SKILL.md delete mode 100644 plugins/productize-ai-execution/skills/productize-spec-writing/SKILL.md delete mode 100644 plugins/productize-ai-execution/skills/productize-systematic-debugging/SKILL.md delete mode 100644 plugins/productize-ai-execution/skills/productize-tdd/SKILL.md delete mode 100644 plugins/productize-ai-execution/skills/productize-technical-architecture-brief-from-product-requirements-doc/SKILL.md delete mode 100644 plugins/productize-ai-execution/skills/productize-verification/SKILL.md delete mode 100644 plugins/productize-ai-execution/skills/productize-writing-plans/SKILL.md delete mode 100644 plugins/productize-all/.codex-plugin/plugin.json delete mode 100644 plugins/productize-all/skills/productize-0-1/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-0-1/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-aarrr-growth-diagnostics/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-aarrr-growth-diagnostics/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-ab-test-analysis/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-ab-test-analysis/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-acceptance-criteria-for-ui/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-acceptance-criteria-for-ui/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-accessibility-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-accessibility-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-actionable-customer-interview-guides-from-research-topics/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-actionable-customer-interview-guides-from-research-topics/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-actionable-job-stories-from-interview-transcripts/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-actionable-job-stories-from-interview-transcripts/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-actionable-product-improvements-from-survey-responses/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-actionable-product-improvements-from-survey-responses/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-actionable-research-briefs-from-problem-statements-and/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-actionable-research-briefs-from-problem-statements-and/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-actionable-user-profiles-with-tasks-and-constraints-from/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-actionable-user-profiles-with-tasks-and-constraints-from/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-actionable-user-research-decisions-from-project-insights/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-actionable-user-research-decisions-from-project-insights/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-adaptive-planning-from-scenarios-to-strategic-actions/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-adaptive-planning-from-scenarios-to-strategic-actions/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-aging-research-insight-validation-before-reusing/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-aging-research-insight-validation-before-reusing/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-ai-product-evaluation-from-recommendation-canvas-framework/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-ai-product-evaluation-from-recommendation-canvas-framework/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-analyze-feature-requests/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-analyze-feature-requests/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-analyze/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-analyze/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-app-aha-moment-identification-from-user-data-and-app/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-app-aha-moment-identification-from-user-data-and-app/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-app-design-from-project-requirements/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-app-design-from-project-requirements/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-autoplan/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-autoplan/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-backend-design/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-backend-design/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-beachhead-segment/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-beachhead-segment/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-behavioral-guidelines/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-behavioral-guidelines/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-brainstorm/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-brainstorm/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-brand-archetype-strategy/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-brand-archetype-strategy/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-brand-equity-diagnostics/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-brand-equity-diagnostics/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-bug-prioritization-against-work-in-progress/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-bug-prioritization-against-work-in-progress/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-build-dashboard/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-build-dashboard/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-business-flywheel-from-company-successes-and-failures/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-business-flywheel-from-company-successes-and-failures/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-business-model-blindspots/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-business-model-blindspots/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-business-model-blindspots/references/diagnostic-questions.md delete mode 100644 plugins/productize-all/skills/productize-business-model-blindspots/references/output-format.md delete mode 100644 plugins/productize-all/skills/productize-business-model-design/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-business-model-design/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-business-model-design/assets/lean-business-model-canvas.html delete mode 100644 plugins/productize-all/skills/productize-business-model-design/assets/platform-business-model-canvas.html delete mode 100644 plugins/productize-all/skills/productize-business-model-design/assets/standard-business-model-canvas.html delete mode 100644 plugins/productize-all/skills/productize-business-model-design/references/business-model-output-rules.md delete mode 100644 plugins/productize-all/skills/productize-business-model-design/references/canvas-selection.md delete mode 100644 plugins/productize-all/skills/productize-business-model-design/references/canvas-templates.md delete mode 100644 plugins/productize-all/skills/productize-business-model-design/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-all/skills/productize-business-strategy-creation-from-expert-strategic-thinking/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-business-strategy-creation-from-expert-strategic-thinking/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-capital-structure-financing/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-capital-structure-financing/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-challenging-meeting-with-stakeholders/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-challenging-meeting-with-stakeholders/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-churn-reduction-from-customer-data-and-exit-survey-analysis/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-churn-reduction-from-customer-data-and-exit-survey-analysis/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-clustered-jtbd-forces-from-interview-data/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-clustered-jtbd-forces-from-interview-data/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-cohort-analysis/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-cohort-analysis/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-comms-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-comms-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-competitive-advantage-diagnostics-and-moat-strategy/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-competitive-advantage-diagnostics-and-moat-strategy/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-competitive-analysis-to-winning-positioning-strategy/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-competitive-analysis-to-winning-positioning-strategy/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-competitive-brief/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-competitive-brief/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-competitive-brief/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-all/skills/productize-competitive-parity-and-strategic-differentiation/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-competitive-parity-and-strategic-differentiation/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-complex-problem-structuring-into-actionable-recommendations/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-complex-problem-structuring-into-actionable-recommendations/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-comprehensive-use-cases-from-user-input-for-product-strategy/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-comprehensive-use-cases-from-user-input-for-product-strategy/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-conflicting-stakeholder-requirements-to-balanced-design/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-conflicting-stakeholder-requirements-to-balanced-design/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-conversation-summaries-from-meeting-transcripts/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-conversation-summaries-from-meeting-transcripts/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-create-viz/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-create-viz/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-creative-solution-generation-from-de-bono-s-lateral-thinking/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-creative-solution-generation-from-de-bono-s-lateral-thinking/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-creative-solution-generation-from-metaphorical-thinking/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-creative-solution-generation-from-metaphorical-thinking/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-crisis-communication-plan-from-outage-details-and-company/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-crisis-communication-plan-from-outage-details-and-company/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-critical-flaws-in-product-requirements-tough-and-unreasonable/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-critical-flaws-in-product-requirements-tough-and-unreasonable/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-ctas-from-copywriting-strategies/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-ctas-from-copywriting-strategies/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-customer-insights-extraction-from-interview-transcript-using/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-customer-insights-extraction-from-interview-transcript-using/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-customer-journey-map-based-on-user-behavior-data/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-customer-journey-map-based-on-user-behavior-data/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-data-context-extractor/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-data-context-extractor/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-data-context-extractor/references/domain-template.md delete mode 100644 plugins/productize-all/skills/productize-data-context-extractor/references/example-generated-skill.md delete mode 100644 plugins/productize-all/skills/productize-data-context-extractor/references/skill-template.md delete mode 100644 plugins/productize-all/skills/productize-data-context-extractor/references/sql-dialects.md delete mode 100644 plugins/productize-all/skills/productize-data-context-extractor/references/tables/README.md delete mode 100755 plugins/productize-all/skills/productize-data-context-extractor/scripts/package_data_skill.py delete mode 100644 plugins/productize-all/skills/productize-data-driven-research-plans-from-leadership-intuition/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-data-driven-research-plans-from-leadership-intuition/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-data-visualization/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-decision-making-with-the-gut-check-protocol/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-decision-making-with-the-gut-check-protocol/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-decision-reversibility-classification-from-first-principles/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-decision-reversibility-classification-from-first-principles/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-decision-rights-using-davci/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-decision-rights-using-davci/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-defining-the-niche-from-user-input/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-defining-the-niche-from-user-input/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-demo-narratives-showing-user-goals/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-demo-narratives-showing-user-goals/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-design-critique/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-design-critique/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-design-handoff/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-design-handoff/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-design-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-design-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-design-system/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-design-system/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-detailed-project-plans-from-project-briefs/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-detailed-project-plans-from-project-briefs/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-difficult-conversation-script-5-step-framework/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-difficult-conversation-script-5-step-framework/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-disruptive-strategy-generation-from-what-if-questions/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-disruptive-strategy-generation-from-what-if-questions/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-docs/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-docs/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-dogfood/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-dogfood/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-dogfood/references/issue-taxonomy.md delete mode 100644 plugins/productize-all/skills/productize-dogfood/templates/dogfood-report-template.md delete mode 100644 plugins/productize-all/skills/productize-draft-nda/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-draft-nda/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-dual-mode-ai-coding-assistant-staff-eng-intern/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-dual-mode-ai-coding-assistant-staff-eng-intern/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-dx-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-dx-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-easy-signal-identification-from-product-assumption/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-easy-signal-identification-from-product-assumption/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-effective-customer-interview-guides-for-any-topic/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-effective-customer-interview-guides-for-any-topic/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-effective-customer-interview-guides-for-any-topic/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-all/skills/productize-empathy-maps/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-empathy-maps/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-eng-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-eng-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-engineering-problem-solving-and-solution-structuring/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-engineering-problem-solving-and-solution-structuring/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-event-tracking-schemas-from-ui-and-metrics-requirements/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-event-tracking-schemas-from-ui-and-metrics-requirements/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-exec-feedback-without-context-to-actionable-design-requirements/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-exec-feedback-without-context-to-actionable-design-requirements/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-executive-and-update-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-executive-and-update-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-executive-decks-from-quick-dirty-test-analysis/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-executive-decks-from-quick-dirty-test-analysis/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-explore-data/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-explore-data/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-feature-impact-models-from-kpis-and-assumptions/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-feature-impact-models-from-kpis-and-assumptions/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-feature-results-analysis-from-draft-to-final-report/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-feature-results-analysis-from-draft-to-final-report/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-features-reframing-and-projects-shape-up/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-features-reframing-and-projects-shape-up/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/apv.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/bond_math.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/cap_table.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/capital_structure.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/capm.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/convertible_notes.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/dcf.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/market_context.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/option_pools.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/preferred_stock.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/returns.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/risk.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/safes.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/time_value.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/validation.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/valuation.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/vc_method.py delete mode 100644 plugins/productize-all/skills/productize-finance-modeling-kernel/finance-modeling-kernel/wacc.py delete mode 100644 plugins/productize-all/skills/productize-financial-markets-context/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-financial-markets-context/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-fragmented-user-research-synthesis-into-coherent-insights/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-fragmented-user-research-synthesis-into-coherent-insights/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-framework-application-to-product-challenges-from-user-input/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-framework-application-to-product-challenges-from-user-input/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-frontend-design/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-frontend-design/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-future-product-opportunities-from-market-inflection-points/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-future-product-opportunities-from-market-inflection-points/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-group-decision-making-quality-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-group-decision-making-quality-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-grow/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-grow/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-growth-loops/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-growth-loops/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-growth-project-generation-with-pioneer-migrator-settler/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-growth-project-generation-with-pioneer-migrator-settler/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-growth-strategy-synthesis-from-user-inputs/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-growth-strategy-synthesis-from-user-inputs/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-gtm-motions/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-gtm-motions/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-gtm-strategy/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-gtm-strategy/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-ideal-customer-profile-icp-representative-for-x-product/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-ideal-customer-profile-icp-representative-for-x-product/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-ideal-customer-profile-icp-representative-for-x-product/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-all/skills/productize-ideas-for-affordances-and-signifiers-based-on-a-design-problem/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-ideas-for-affordances-and-signifiers-based-on-a-design-problem/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-implementation-notes/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-implementation-notes/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-industry-trend-strategy/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-industry-trend-strategy/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-influence-strategies-from-cialdini-s-7-principles/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-influence-strategies-from-cialdini-s-7-principles/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-innovation-decision-making-heuristics/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-innovation-decision-making-heuristics/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-innovative-idea-generation-from-project-parameters-and/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-innovative-idea-generation-from-project-parameters-and/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-innovative-idea-generation-from-structured-brainstorming/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-innovative-idea-generation-from-structured-brainstorming/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-innovative-product-ideas-from-structured-brainstorming/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-innovative-product-ideas-from-structured-brainstorming/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-interactive-intake-for-ost-inputs/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-interactive-intake-for-ost-inputs/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-lean-canvas/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-lean-canvas/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-limit-based-product-strategy-from-problem-to-execution-plan/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-limit-based-product-strategy-from-problem-to-execution-plan/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-low-frequency-to-power-user-transition-strategy/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-low-frequency-to-power-user-transition-strategy/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-managerial-finance-dcf/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-managerial-finance-dcf/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-map-power-dynamics-before-meetings/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-map-power-dynamics-before-meetings/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-market-opportunities-from-jobs-to-be-done-market-canvas/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-market-opportunities-from-jobs-to-be-done-market-canvas/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-market-opportunity/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-market-opportunity/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-market-opportunity/references/canonical-canvases.md delete mode 100644 plugins/productize-all/skills/productize-market-opportunity/references/output-formats.md delete mode 100644 plugins/productize-all/skills/productize-market-opportunity/references/rating-and-decision-rules.md delete mode 100644 plugins/productize-all/skills/productize-market-orientation-audit/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-market-orientation-audit/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-market-requirements-from-strategic-market-inputs/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-market-requirements-from-strategic-market-inputs/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-market-sizing/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-market-sizing/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-mece-analysis-and-logical-tree-from-list-items/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-mece-analysis-and-logical-tree-from-list-items/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-meeting-agendas-from-meeting-descriptions/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-meeting-agendas-from-meeting-descriptions/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-meeting-outcome-planning-and-stakeholder-alignment/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-meeting-outcome-planning-and-stakeholder-alignment/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-meeting-summaries-from-meeting-transcript-ideas-framework/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-meeting-summaries-from-meeting-transcript-ideas-framework/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-message-framing-and-comms-plan-designer/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-message-framing-and-comms-plan-designer/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-metric-drops-diagnosis-with-rigorous-stepwise-decomposition/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-metric-drops-diagnosis-with-rigorous-stepwise-decomposition/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-metrics-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-metrics-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-monetization-strategy/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-monetization-strategy/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-multi-step-workflow-optimization/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-multi-step-workflow-optimization/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-multiple-interface-descriptions-from-a-single-image/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-multiple-interface-descriptions-from-a-single-image/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-netmba-competitor-analysis/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-netmba-competitor-analysis/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-north-star-metric/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-north-star-metric/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-now-next-later-vision-roadmap-from-interview-synthesis/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-now-next-later-vision-roadmap-from-interview-synthesis/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-nps-feedback-for-prioritized-customer-experience-initiatives/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-nps-feedback-for-prioritized-customer-experience-initiatives/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-offbeat-question-generation-from-any-topic/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-offbeat-question-generation-from-any-topic/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-office-politics-with-machiavellian-strategy/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-office-politics-with-machiavellian-strategy/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-okr-planning-from-vision-statements/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-okr-planning-from-vision-statements/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-onboarding-flow-optimization-from-product-data-to-user-success/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-onboarding-flow-optimization-from-product-data-to-user-success/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-operate/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-operate/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-opportunity-solution-tree-from-input/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-opportunity-solution-tree-from-input/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-opportunity-solution-tree-from-input/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-all/skills/productize-outcome-roadmap/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-outcome-roadmap/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-plg-growth-playbook/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-plg-growth-playbook/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-pm-context-and-design-constraints/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-pm-context-and-design-constraints/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-pmf-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-pmf-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-positioning-statements-from-competitive-analysis-and-value/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-positioning-statements-from-competitive-analysis-and-value/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-positioning-statements-from-competitive-analysis-and-value/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-all/skills/productize-post-launch-feedback-into-v2-improvements-synthesis/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-post-launch-feedback-into-v2-improvements-synthesis/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-post-launch-feedback-loop/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-post-launch-feedback-loop/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-potential-hidden-agenda-identification/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-potential-hidden-agenda-identification/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-prds-from-industry-and-feature-specifications/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-prds-from-industry-and-feature-specifications/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-prds-from-product-information-and-assumptions/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-prds-from-product-information-and-assumptions/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-pre-mortem/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-pre-mortem/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-presentation-narratives-from-conversation-transcripts/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-presentation-narratives-from-conversation-transcripts/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-presentations-from-5-step-storytelling-framework/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-presentations-from-5-step-storytelling-framework/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-presentations-from-structured-content-and-context/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-presentations-from-structured-content-and-context/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-press-releases-from-product-vision-working-backwards/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-press-releases-from-product-vision-working-backwards/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-pricing-strategy/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-pricing-strategy/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-prioritization-frameworks/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-prioritization-frameworks/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-privacy-policy/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-privacy-policy/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-problem-framing-before-jumping-to-solutions/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-problem-framing-before-jumping-to-solutions/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-problem-statement-framing-from-conversation-transcript/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-problem-statement-framing-from-conversation-transcript/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-assumptions-from-core-strategy-inputs/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-assumptions-from-core-strategy-inputs/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-brainstorming/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-brainstorming/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-decision-analysis-from-anthropological-research/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-decision-analysis-from-anthropological-research/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-design-analysis-from-context-and-screenshots/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-design-analysis-from-context-and-screenshots/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-feature-impact-sizing-from-metrics-and-usage-data/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-feature-impact-sizing-from-metrics-and-usage-data/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-ideas-from-user-responses/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-ideas-from-user-responses/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-market-fit-cycle/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-market-fit-cycle/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-refinement-session-planning/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-refinement-session-planning/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-requirements-from-structured-analysis/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-requirements-from-structured-analysis/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-simplification-via-via-negativa-analysis/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-simplification-via-via-negativa-analysis/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-strategy-review-from-draft-documents/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-strategy-review-from-draft-documents/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-product-vision/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-product-vision/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-proto-persona-profiles-from-user-research-and-market-data/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-proto-persona-profiles-from-user-research-and-market-data/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-proto-persona-profiles-from-user-research-and-market-data/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-all/skills/productize-prototype-creation-from-image-descriptions-and-app-info/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-prototype-creation-from-image-descriptions-and-app-info/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-pyramid-structure-optimization-from-complex-text/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-pyramid-structure-optimization-from-complex-text/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-qa/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-qa/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-raw-interview-transcript-cleanup/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-raw-interview-transcript-cleanup/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-realistic-jtbd-interview-transcripts/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-realistic-jtbd-interview-transcripts/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-reinforcing-sequence-from-unstructured-items/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-reinforcing-sequence-from-unstructured-items/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-release-notes/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-release-notes/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-release/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-release/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-remote-miro-workshops-from-transcripts-and-specs/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-remote-miro-workshops-from-transcripts-and-specs/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-requirements-prioritization-with-p0-p1-p2-framework/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-requirements-prioritization-with-p0-p1-p2-framework/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-research-into-durable-competitive-moats/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-research-into-durable-competitive-moats/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-risk-return-cost-of-capital/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-risk-return-cost-of-capital/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-risky-assumption-prioritization-for-rapid-validation/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-risky-assumption-prioritization-for-rapid-validation/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-roadmap-update/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-roadmap-update/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-robust-experiment-design-from-goals-and-systems/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-robust-experiment-design-from-goals-and-systems/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-role-identity-decision-making-map/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-role-identity-decision-making-map/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-root-cause-and-consequence-analysis-from-a-question/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-root-cause-and-consequence-analysis-from-a-question/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-scope-defense-using-time-cost-tradeoff-analysis/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-scope-defense-using-time-cost-tradeoff-analysis/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-sketch-descriptions-for-wireframes-from-product-ideas/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-sketch-descriptions-for-wireframes-from-product-ideas/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-skimmable-writing-transformation/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-skimmable-writing-transformation/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-slide-decks-from-problem-statements-and-context/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-slide-decks-from-problem-statements-and-context/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-solution-anti-patterns-from-customer-problem-analysis/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-solution-anti-patterns-from-customer-problem-analysis/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-solution-design-for-edge-cases-in-product-development/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-solution-design-for-edge-cases-in-product-development/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-spec-writing/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-spec-writing/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-sprint-planning/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-sprint-planning/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-sql-queries/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-sql-query-from-requirements-and-data-tables/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-sql-query-from-requirements-and-data-tables/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-stakeholder-brief-clarification-and-problem-definition/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-stakeholder-brief-clarification-and-problem-definition/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-stakeholder-decision-making-using-toc-thinking-process/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-stakeholder-decision-making-using-toc-thinking-process/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-stakeholder-moo-objections-and-product-derailment-risks/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-stakeholder-moo-objections-and-product-derailment-risks/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-stakeholder-power-interest-and-influence-map/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-stakeholder-power-interest-and-influence-map/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-stakeholder-power-interest-and-influence-map/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-all/skills/productize-stakeholder-risk-review-for-a-feature-or-prd/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-stakeholder-risk-review-for-a-feature-or-prd/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-stakeholder-update/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-stakeholder-update/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-startup-canvas/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-startup-canvas/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-statistical-analysis/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-strategic-crux-diagnosis-and-strategy-design/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-strategic-crux-diagnosis-and-strategy-design/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-strategic-decision-making-quality-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-strategic-decision-making-quality-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-strategic-moves-from-swot-pairings/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-strategic-moves-from-swot-pairings/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-strategic-presentation-planning-from-topic-audience-and-time/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-strategic-presentation-planning-from-topic-audience-and-time/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-strategy-curve-blue-ocean/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-strategy-curve-blue-ocean/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-strategy-kernel-extraction-from-context/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-strategy-kernel-extraction-from-context/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-strategy-to-execution-bridge-for-ux-decisions/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-strategy-to-execution-bridge-for-ux-decisions/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-structured-decision-journals-from-decisions-and-context/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-structured-decision-journals-from-decisions-and-context/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-structured-insight-extraction-from-conversation-transcripts/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-structured-insight-extraction-from-conversation-transcripts/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-structured-interview-notes-from-transcript-using-flexible/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-structured-interview-notes-from-transcript-using-flexible/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-structured-interview-notes-from-transcript-using-flexible/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-all/skills/productize-structured-json-descriptions-from-ui-screenshots/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-structured-json-descriptions-from-ui-screenshots/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-structured-product-hypotheses-from-product-problems/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-structured-product-hypotheses-from-product-problems/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-structured-product-strategy-from-product-context/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-structured-product-strategy-from-product-context/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-structured-requirements-from-conversation-transcripts/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-structured-requirements-from-conversation-transcripts/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-structured-requirements-from-design-assets/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-structured-requirements-from-design-assets/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-success-metrics-for-design-decisions/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-success-metrics-for-design-decisions/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-support-tickets-as-actionable-product-improvements/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-support-tickets-as-actionable-product-improvements/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-sustainable-business-model/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-sustainable-business-model/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-sustainable-business-model/references/output-format.md delete mode 100644 plugins/productize-all/skills/productize-sustainable-business-model/references/pattern-groups.md delete mode 100644 plugins/productize-all/skills/productize-synthesize-research/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-synthesize-research/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-systematic-debugging/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-systematic-debugging/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-target-opportunity-selection-from-ost/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-target-opportunity-selection-from-ost/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-task-list-optimization-and-contingency-based-project-planning/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-task-list-optimization-and-contingency-based-project-planning/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-task-specific-product-strategy-design/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-task-specific-product-strategy-design/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-tdd/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-tdd/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-technical-architecture-brief-from-product-requirements-doc/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-technical-architecture-brief-from-product-requirements-doc/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-technical-translation-and-stakeholder-communication/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-technical-translation-and-stakeholder-communication/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-test-scenarios/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-test-scenarios/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-thesis-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-thesis-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-trade-off-analysis-from-feature-priority-and-effort-data/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-trade-off-analysis-from-feature-priority-and-effort-data/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-user-stories-from-initiative-requirements/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-user-stories-from-initiative-requirements/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-all/skills/productize-ux-edge-cases-from-product-briefs/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-ux-edge-cases-from-product-briefs/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-ux-terminology-improvements-in-product-requirements/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-ux-terminology-improvements-in-product-requirements/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-validate-data/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-validate-data/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-valuation-and-deal-pricing/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-valuation-and-deal-pricing/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-value-chain-mapping-from-end-user-needs-to-core-value/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-value-chain-mapping-from-end-user-needs-to-core-value/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-venture-capital-deal-modeling/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-venture-capital-deal-modeling/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-verification/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-verification/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-visual-decision-making-review/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-visual-decision-making-review/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-workshop-activity-design-from-problem-and-participant/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-workshop-activity-design-from-problem-and-participant/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-write-query/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-write-query/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-write-query/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-all/skills/productize-write-spec/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-write-spec/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-write-spec/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-all/skills/productize-writing-plans/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-writing-plans/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize-wwas/SKILL.md delete mode 100644 plugins/productize-all/skills/productize-wwas/agents/openai.yaml delete mode 100644 plugins/productize-all/skills/productize/SKILL.md delete mode 100644 plugins/productize-all/skills/productize/agents/openai.yaml delete mode 100644 plugins/productize-analytics/.codex-plugin/plugin.json delete mode 100644 plugins/productize-analytics/skills/productize-ab-test-analysis/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-analyze/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-build-dashboard/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-cohort-analysis/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-create-viz/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-customer-journey-map-based-on-user-behavior-data/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-data-context-extractor/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-data-context-extractor/references/domain-template.md delete mode 100644 plugins/productize-analytics/skills/productize-data-context-extractor/references/example-generated-skill.md delete mode 100644 plugins/productize-analytics/skills/productize-data-context-extractor/references/skill-template.md delete mode 100644 plugins/productize-analytics/skills/productize-data-context-extractor/references/sql-dialects.md delete mode 100644 plugins/productize-analytics/skills/productize-data-context-extractor/references/tables/README.md delete mode 100755 plugins/productize-analytics/skills/productize-data-context-extractor/scripts/package_data_skill.py delete mode 100644 plugins/productize-analytics/skills/productize-data-visualization/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-data-visualization/agents/openai.yaml delete mode 100644 plugins/productize-analytics/skills/productize-event-tracking-schemas-from-ui-and-metrics-requirements/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-explore-data/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-feature-results-analysis-from-draft-to-final-report/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-metric-drops-diagnosis-with-rigorous-stepwise-decomposition/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-metrics-review/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-north-star-metric/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-product-feature-impact-sizing-from-metrics-and-usage-data/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-sql-queries/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-sql-queries/agents/openai.yaml delete mode 100644 plugins/productize-analytics/skills/productize-sql-query-from-requirements-and-data-tables/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-statistical-analysis/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-statistical-analysis/agents/openai.yaml delete mode 100644 plugins/productize-analytics/skills/productize-success-metrics-for-design-decisions/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-trade-off-analysis-from-feature-priority-and-effort-data/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-validate-data/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-write-query/SKILL.md delete mode 100644 plugins/productize-analytics/skills/productize-write-query/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-business-model/.codex-plugin/plugin.json delete mode 100644 plugins/productize-business-model/skills/productize-business-flywheel-from-company-successes-and-failures/SKILL.md delete mode 100644 plugins/productize-business-model/skills/productize-business-model-blindspots/SKILL.md delete mode 100644 plugins/productize-business-model/skills/productize-business-model-blindspots/references/diagnostic-questions.md delete mode 100644 plugins/productize-business-model/skills/productize-business-model-blindspots/references/output-format.md delete mode 100644 plugins/productize-business-model/skills/productize-business-model-design/SKILL.md delete mode 100644 plugins/productize-business-model/skills/productize-business-model-design/assets/lean-business-model-canvas.html delete mode 100644 plugins/productize-business-model/skills/productize-business-model-design/assets/platform-business-model-canvas.html delete mode 100644 plugins/productize-business-model/skills/productize-business-model-design/assets/standard-business-model-canvas.html delete mode 100644 plugins/productize-business-model/skills/productize-business-model-design/references/business-model-output-rules.md delete mode 100644 plugins/productize-business-model/skills/productize-business-model-design/references/canvas-selection.md delete mode 100644 plugins/productize-business-model/skills/productize-business-model-design/references/canvas-templates.md delete mode 100644 plugins/productize-business-model/skills/productize-business-model-design/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-business-model/skills/productize-lean-canvas/SKILL.md delete mode 100644 plugins/productize-business-model/skills/productize-monetization-strategy/SKILL.md delete mode 100644 plugins/productize-business-model/skills/productize-pricing-strategy/SKILL.md delete mode 100644 plugins/productize-business-model/skills/productize-sustainable-business-model/SKILL.md delete mode 100644 plugins/productize-business-model/skills/productize-sustainable-business-model/references/output-format.md delete mode 100644 plugins/productize-business-model/skills/productize-sustainable-business-model/references/pattern-groups.md delete mode 100644 plugins/productize-decision-making/.codex-plugin/plugin.json delete mode 100644 plugins/productize-decision-making/skills/productize-decision-making-with-the-gut-check-protocol/SKILL.md delete mode 100644 plugins/productize-decision-making/skills/productize-group-decision-making-quality-review/SKILL.md delete mode 100644 plugins/productize-decision-making/skills/productize-innovation-decision-making-heuristics/SKILL.md delete mode 100644 plugins/productize-decision-making/skills/productize-meeting-outcome-planning-and-stakeholder-alignment/SKILL.md delete mode 100644 plugins/productize-decision-making/skills/productize-pre-mortem/SKILL.md delete mode 100644 plugins/productize-decision-making/skills/productize-role-identity-decision-making-map/SKILL.md delete mode 100644 plugins/productize-decision-making/skills/productize-stakeholder-decision-making-using-toc-thinking-process/SKILL.md delete mode 100644 plugins/productize-decision-making/skills/productize-stakeholder-power-interest-and-influence-map/SKILL.md delete mode 100644 plugins/productize-decision-making/skills/productize-stakeholder-power-interest-and-influence-map/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-decision-making/skills/productize-strategic-decision-making-quality-review/SKILL.md delete mode 100644 plugins/productize-decision-making/skills/productize-structured-decision-journals-from-decisions-and-context/SKILL.md delete mode 100644 plugins/productize-decision-making/skills/productize-visual-decision-making-review/SKILL.md delete mode 100644 plugins/productize-delivery/.codex-plugin/plugin.json delete mode 100644 plugins/productize-delivery/skills/productize-analyze-feature-requests/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-bug-prioritization-against-work-in-progress/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-critical-flaws-in-product-requirements-tough-and-unreasonable/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-detailed-project-plans-from-project-briefs/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-docs/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-dogfood/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-dogfood/references/issue-taxonomy.md delete mode 100644 plugins/productize-delivery/skills/productize-dogfood/templates/dogfood-report-template.md delete mode 100644 plugins/productize-delivery/skills/productize-nps-feedback-for-prioritized-customer-experience-initiatives/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-outcome-roadmap/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-prds-from-industry-and-feature-specifications/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-prds-from-product-information-and-assumptions/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-prioritization-frameworks/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-product-requirements-from-structured-analysis/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-product-review/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-qa/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-release-notes/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-release/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-requirements-prioritization-with-p0-p1-p2-framework/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-scope-defense-using-time-cost-tradeoff-analysis/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-sprint-planning/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-stakeholder-risk-review-for-a-feature-or-prd/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-structured-requirements-from-conversation-transcripts/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-structured-requirements-from-design-assets/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-test-scenarios/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-user-stories-from-initiative-requirements/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-delivery/skills/productize-write-spec/SKILL.md delete mode 100644 plugins/productize-delivery/skills/productize-write-spec/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-delivery/skills/productize-wwas/SKILL.md delete mode 100644 plugins/productize-design/.codex-plugin/plugin.json delete mode 100644 plugins/productize-design/skills/productize-acceptance-criteria-for-ui/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-accessibility-review/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-app-design-from-project-requirements/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-behavioral-guidelines/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-conflicting-stakeholder-requirements-to-balanced-design/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-design-critique/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-design-handoff/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-design-review/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-design-system/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-exec-feedback-without-context-to-actionable-design-requirements/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-executive-decks-from-quick-dirty-test-analysis/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-frontend-design/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-ideas-for-affordances-and-signifiers-based-on-a-design-problem/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-multi-step-workflow-optimization/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-multiple-interface-descriptions-from-a-single-image/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-pm-context-and-design-constraints/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-product-design-analysis-from-context-and-screenshots/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-prototype-creation-from-image-descriptions-and-app-info/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-sketch-descriptions-for-wireframes-from-product-ideas/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-solution-design-for-edge-cases-in-product-development/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-structured-json-descriptions-from-ui-screenshots/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-ux-edge-cases-from-product-briefs/SKILL.md delete mode 100644 plugins/productize-design/skills/productize-ux-terminology-improvements-in-product-requirements/SKILL.md delete mode 100644 plugins/productize-discovery/.codex-plugin/plugin.json delete mode 100644 plugins/productize-discovery/skills/productize-actionable-customer-interview-guides-from-research-topics/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-actionable-job-stories-from-interview-transcripts/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-actionable-product-improvements-from-survey-responses/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-actionable-research-briefs-from-problem-statements-and/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-actionable-user-profiles-with-tasks-and-constraints-from/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-actionable-user-research-decisions-from-project-insights/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-aging-research-insight-validation-before-reusing/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-app-aha-moment-identification-from-user-data-and-app/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-brainstorm/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-clustered-jtbd-forces-from-interview-data/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-comprehensive-use-cases-from-user-input-for-product-strategy/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-creative-solution-generation-from-de-bono-s-lateral-thinking/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-creative-solution-generation-from-metaphorical-thinking/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-customer-insights-extraction-from-interview-transcript-using/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-data-driven-research-plans-from-leadership-intuition/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-easy-signal-identification-from-product-assumption/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-effective-customer-interview-guides-for-any-topic/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-effective-customer-interview-guides-for-any-topic/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-discovery/skills/productize-empathy-maps/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-feature-impact-models-from-kpis-and-assumptions/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-fragmented-user-research-synthesis-into-coherent-insights/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-ideal-customer-profile-icp-representative-for-x-product/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-ideal-customer-profile-icp-representative-for-x-product/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-discovery/skills/productize-innovative-idea-generation-from-project-parameters-and/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-innovative-idea-generation-from-structured-brainstorming/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-innovative-product-ideas-from-structured-brainstorming/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-interactive-intake-for-ost-inputs/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-market-requirements-from-strategic-market-inputs/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-now-next-later-vision-roadmap-from-interview-synthesis/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-offbeat-question-generation-from-any-topic/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-opportunity-solution-tree-from-input/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-opportunity-solution-tree-from-input/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-discovery/skills/productize-post-launch-feedback-into-v2-improvements-synthesis/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-post-launch-feedback-loop/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-problem-framing-before-jumping-to-solutions/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-problem-statement-framing-from-conversation-transcript/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-product-assumptions-from-core-strategy-inputs/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-product-brainstorming/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-product-decision-analysis-from-anthropological-research/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-proto-persona-profiles-from-user-research-and-market-data/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-proto-persona-profiles-from-user-research-and-market-data/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-discovery/skills/productize-raw-interview-transcript-cleanup/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-realistic-jtbd-interview-transcripts/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-research-into-durable-competitive-moats/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-risky-assumption-prioritization-for-rapid-validation/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-robust-experiment-design-from-goals-and-systems/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-structured-interview-notes-from-transcript-using-flexible/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-structured-interview-notes-from-transcript-using-flexible/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-discovery/skills/productize-structured-product-hypotheses-from-product-problems/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-support-tickets-as-actionable-product-improvements/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-synthesize-research/SKILL.md delete mode 100644 plugins/productize-discovery/skills/productize-target-opportunity-selection-from-ost/SKILL.md delete mode 100644 plugins/productize-finance/.codex-plugin/plugin.json delete mode 100644 plugins/productize-finance/skills/productize-capital-structure-financing/SKILL.md delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/SKILL.md delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/apv.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/bond_math.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/cap_table.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/capital_structure.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/capm.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/convertible_notes.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/dcf.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/market_context.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/option_pools.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/preferred_stock.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/returns.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/risk.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/safes.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/time_value.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/validation.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/valuation.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/vc_method.py delete mode 100644 plugins/productize-finance/skills/productize-finance-modeling-kernel/finance-modeling-kernel/wacc.py delete mode 100644 plugins/productize-finance/skills/productize-financial-markets-context/SKILL.md delete mode 100644 plugins/productize-finance/skills/productize-managerial-finance-dcf/SKILL.md delete mode 100644 plugins/productize-finance/skills/productize-risk-return-cost-of-capital/SKILL.md delete mode 100644 plugins/productize-finance/skills/productize-valuation-and-deal-pricing/SKILL.md delete mode 100644 plugins/productize-finance/skills/productize-venture-capital-deal-modeling/SKILL.md delete mode 100644 plugins/productize-growth/.codex-plugin/plugin.json delete mode 100644 plugins/productize-growth/skills/productize-aarrr-growth-diagnostics/SKILL.md delete mode 100644 plugins/productize-growth/skills/productize-churn-reduction-from-customer-data-and-exit-survey-analysis/SKILL.md delete mode 100644 plugins/productize-growth/skills/productize-grow/SKILL.md delete mode 100644 plugins/productize-growth/skills/productize-growth-loops/SKILL.md delete mode 100644 plugins/productize-growth/skills/productize-growth-project-generation-with-pioneer-migrator-settler/SKILL.md delete mode 100644 plugins/productize-growth/skills/productize-growth-strategy-synthesis-from-user-inputs/SKILL.md delete mode 100644 plugins/productize-growth/skills/productize-gtm-motions/SKILL.md delete mode 100644 plugins/productize-growth/skills/productize-gtm-strategy/SKILL.md delete mode 100644 plugins/productize-growth/skills/productize-low-frequency-to-power-user-transition-strategy/SKILL.md delete mode 100644 plugins/productize-growth/skills/productize-onboarding-flow-optimization-from-product-data-to-user-success/SKILL.md delete mode 100644 plugins/productize-growth/skills/productize-plg-growth-playbook/SKILL.md delete mode 100644 plugins/productize-growth/skills/productize-product-market-fit-cycle/SKILL.md delete mode 100644 plugins/productize-marketing/.codex-plugin/plugin.json delete mode 100644 plugins/productize-marketing/skills/productize-brand-archetype-strategy/SKILL.md delete mode 100644 plugins/productize-marketing/skills/productize-brand-equity-diagnostics/SKILL.md delete mode 100644 plugins/productize-marketing/skills/productize-competitive-analysis-to-winning-positioning-strategy/SKILL.md delete mode 100644 plugins/productize-marketing/skills/productize-competitive-brief/SKILL.md delete mode 100644 plugins/productize-marketing/skills/productize-competitive-brief/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-marketing/skills/productize-ctas-from-copywriting-strategies/SKILL.md delete mode 100644 plugins/productize-marketing/skills/productize-demo-narratives-showing-user-goals/SKILL.md delete mode 100644 plugins/productize-marketing/skills/productize-disruptive-strategy-generation-from-what-if-questions/SKILL.md delete mode 100644 plugins/productize-marketing/skills/productize-industry-trend-strategy/SKILL.md delete mode 100644 plugins/productize-marketing/skills/productize-market-orientation-audit/SKILL.md delete mode 100644 plugins/productize-marketing/skills/productize-message-framing-and-comms-plan-designer/SKILL.md delete mode 100644 plugins/productize-marketing/skills/productize-positioning-statements-from-competitive-analysis-and-value/SKILL.md delete mode 100644 plugins/productize-marketing/skills/productize-positioning-statements-from-competitive-analysis-and-value/references/pm-skills-main-merge.md delete mode 100644 plugins/productize-marketing/skills/productize-press-releases-from-product-vision-working-backwards/SKILL.md delete mode 100644 plugins/productize-marketing/skills/productize-strategy-curve-blue-ocean/SKILL.md delete mode 100644 plugins/productize-operations/.codex-plugin/plugin.json delete mode 100644 plugins/productize-operations/skills/productize-autoplan/SKILL.md delete mode 100644 plugins/productize-operations/skills/productize-conversation-summaries-from-meeting-transcripts/SKILL.md delete mode 100644 plugins/productize-operations/skills/productize-decision-rights-using-davci/SKILL.md delete mode 100644 plugins/productize-operations/skills/productize-draft-nda/SKILL.md delete mode 100644 plugins/productize-operations/skills/productize-meeting-agendas-from-meeting-descriptions/SKILL.md delete mode 100644 plugins/productize-operations/skills/productize-meeting-summaries-from-meeting-transcript-ideas-framework/SKILL.md delete mode 100644 plugins/productize-operations/skills/productize-operate/SKILL.md delete mode 100644 plugins/productize-operations/skills/productize-privacy-policy/SKILL.md delete mode 100644 plugins/productize-operations/skills/productize-product-refinement-session-planning/SKILL.md delete mode 100644 plugins/productize-operations/skills/productize-reinforcing-sequence-from-unstructured-items/SKILL.md delete mode 100644 plugins/productize-operations/skills/productize-remote-miro-workshops-from-transcripts-and-specs/SKILL.md delete mode 100644 plugins/productize-operations/skills/productize-task-list-optimization-and-contingency-based-project-planning/SKILL.md delete mode 100644 plugins/productize-operations/skills/productize-workshop-activity-design-from-problem-and-participant/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/.codex-plugin/plugin.json delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-challenging-meeting-with-stakeholders/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-comms-review/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-crisis-communication-plan-from-outage-details-and-company/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-difficult-conversation-script-5-step-framework/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-executive-and-update-review/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-influence-strategies-from-cialdini-s-7-principles/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-map-power-dynamics-before-meetings/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-office-politics-with-machiavellian-strategy/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-potential-hidden-agenda-identification/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-presentation-narratives-from-conversation-transcripts/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-presentations-from-5-step-storytelling-framework/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-presentations-from-structured-content-and-context/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-product-strategy-review-from-draft-documents/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-product-vision/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-pyramid-structure-optimization-from-complex-text/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-roadmap-update/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-skimmable-writing-transformation/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-slide-decks-from-problem-statements-and-context/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-stakeholder-brief-clarification-and-problem-definition/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-stakeholder-moo-objections-and-product-derailment-risks/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-stakeholder-update/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-strategic-presentation-planning-from-topic-audience-and-time/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-structured-insight-extraction-from-conversation-transcripts/SKILL.md delete mode 100644 plugins/productize-stakeholder-communication/skills/productize-technical-translation-and-stakeholder-communication/SKILL.md delete mode 100644 plugins/productize-strategy/.codex-plugin/plugin.json delete mode 100644 plugins/productize-strategy/skills/productize-adaptive-planning-from-scenarios-to-strategic-actions/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-ai-product-evaluation-from-recommendation-canvas-framework/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-business-strategy-creation-from-expert-strategic-thinking/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-competitive-advantage-diagnostics-and-moat-strategy/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-competitive-parity-and-strategic-differentiation/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-complex-problem-structuring-into-actionable-recommendations/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-decision-reversibility-classification-from-first-principles/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-framework-application-to-product-challenges-from-user-input/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-future-product-opportunities-from-market-inflection-points/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-limit-based-product-strategy-from-problem-to-execution-plan/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-mece-analysis-and-logical-tree-from-list-items/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-netmba-competitor-analysis/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-okr-planning-from-vision-statements/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-pmf-review/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-product-simplification-via-via-negativa-analysis/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-root-cause-and-consequence-analysis-from-a-question/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-solution-anti-patterns-from-customer-problem-analysis/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-strategic-crux-diagnosis-and-strategy-design/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-strategic-moves-from-swot-pairings/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-strategy-kernel-extraction-from-context/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-strategy-to-execution-bridge-for-ux-decisions/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-structured-product-strategy-from-product-context/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-task-specific-product-strategy-design/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-thesis-review/SKILL.md delete mode 100644 plugins/productize-strategy/skills/productize-value-chain-mapping-from-end-user-needs-to-core-value/SKILL.md delete mode 100644 plugins/productize-venture-0-1/.codex-plugin/plugin.json delete mode 100644 plugins/productize-venture-0-1/skills/productize-0-1/SKILL.md delete mode 100644 plugins/productize-venture-0-1/skills/productize-beachhead-segment/SKILL.md delete mode 100644 plugins/productize-venture-0-1/skills/productize-defining-the-niche-from-user-input/SKILL.md delete mode 100644 plugins/productize-venture-0-1/skills/productize-market-opportunities-from-jobs-to-be-done-market-canvas/SKILL.md delete mode 100644 plugins/productize-venture-0-1/skills/productize-market-opportunity/SKILL.md delete mode 100644 plugins/productize-venture-0-1/skills/productize-market-opportunity/references/canonical-canvases.md delete mode 100644 plugins/productize-venture-0-1/skills/productize-market-opportunity/references/output-formats.md delete mode 100644 plugins/productize-venture-0-1/skills/productize-market-opportunity/references/rating-and-decision-rules.md delete mode 100644 plugins/productize-venture-0-1/skills/productize-market-sizing/SKILL.md delete mode 100644 plugins/productize-venture-0-1/skills/productize-product-ideas-from-user-responses/SKILL.md delete mode 100644 plugins/productize-venture-0-1/skills/productize-startup-canvas/SKILL.md create mode 100644 productize.go delete mode 100644 registry/categories.json delete mode 100644 registry/lifecycle.json delete mode 100644 registry/plugins.json delete mode 100644 registry/site-index.json delete mode 100644 registry/skills.json delete mode 100644 scripts/audit-skills.mjs delete mode 100644 scripts/build-plugins.mjs delete mode 100644 scripts/build-site-index.mjs delete mode 100644 scripts/check-repo-hygiene.mjs create mode 100644 scripts/codegen.mjs delete mode 100644 scripts/eval-llm-offline.mjs delete mode 100644 scripts/eval-productize.mjs delete mode 100644 scripts/gen-skill-docs.mjs delete mode 100644 scripts/import-pm-skills.mjs delete mode 100644 scripts/index-skills.mjs create mode 100644 scripts/inspect-acp-toolcalls.go delete mode 100644 scripts/install-claude-skills.mjs delete mode 100644 scripts/install-codex-plugins.mjs delete mode 100644 scripts/install-smoke-test.mjs delete mode 100644 scripts/lib/distribution.mjs delete mode 100644 scripts/lib/metadata-quality.mjs delete mode 100644 scripts/lib/productize.mjs create mode 100755 scripts/link-skills.sh delete mode 100644 scripts/normalize-skills.mjs delete mode 100644 scripts/release-check.mjs delete mode 100644 scripts/release.mjs delete mode 100644 scripts/report-eval-results.mjs delete mode 100644 scripts/setup-host.mjs delete mode 100644 scripts/test-skill-parser.mjs delete mode 100644 scripts/validate-skills.mjs create mode 100644 sdk/create-extension/README.md create mode 100644 sdk/create-extension/package.json create mode 100644 sdk/create-extension/scripts/copy-templates.mjs create mode 100644 sdk/create-extension/src/index.ts create mode 100644 sdk/create-extension/test/create-extension.test.ts create mode 100644 sdk/create-extension/tsconfig.json create mode 100644 sdk/extension-sdk-ts/README.md create mode 100644 sdk/extension-sdk-ts/package.json create mode 100644 sdk/extension-sdk-ts/src/extension.ts create mode 100644 sdk/extension-sdk-ts/src/handlers.ts create mode 100644 sdk/extension-sdk-ts/src/host_api.ts create mode 100644 sdk/extension-sdk-ts/src/index.ts create mode 100644 sdk/extension-sdk-ts/src/testing/index.ts create mode 100644 sdk/extension-sdk-ts/src/testing/mock_transport.ts create mode 100644 sdk/extension-sdk-ts/src/testing/test_harness.ts create mode 100644 sdk/extension-sdk-ts/src/transport.ts create mode 100644 sdk/extension-sdk-ts/src/types.ts create mode 100644 sdk/extension-sdk-ts/templates/lifecycle-observer/README.md create mode 100644 sdk/extension-sdk-ts/templates/lifecycle-observer/extension.toml create mode 100644 sdk/extension-sdk-ts/templates/lifecycle-observer/package.json create mode 100644 sdk/extension-sdk-ts/templates/lifecycle-observer/src/extension.ts create mode 100644 sdk/extension-sdk-ts/templates/lifecycle-observer/src/index.ts create mode 100644 sdk/extension-sdk-ts/templates/lifecycle-observer/test/lifecycle-observer.test.ts create mode 100644 sdk/extension-sdk-ts/templates/lifecycle-observer/tsconfig.json create mode 100644 sdk/extension-sdk-ts/templates/prompt-decorator/README.md create mode 100644 sdk/extension-sdk-ts/templates/prompt-decorator/extension.toml create mode 100644 sdk/extension-sdk-ts/templates/prompt-decorator/package.json create mode 100644 sdk/extension-sdk-ts/templates/prompt-decorator/src/extension.ts create mode 100644 sdk/extension-sdk-ts/templates/prompt-decorator/src/index.ts create mode 100644 sdk/extension-sdk-ts/templates/prompt-decorator/test/prompt-decorator.test.ts create mode 100644 sdk/extension-sdk-ts/templates/prompt-decorator/tsconfig.json create mode 100644 sdk/extension-sdk-ts/templates/review-provider/README.md create mode 100644 sdk/extension-sdk-ts/templates/review-provider/extension.toml create mode 100644 sdk/extension-sdk-ts/templates/review-provider/package.json create mode 100644 sdk/extension-sdk-ts/templates/review-provider/src/extension.ts create mode 100644 sdk/extension-sdk-ts/templates/review-provider/src/index.ts create mode 100644 sdk/extension-sdk-ts/templates/review-provider/test/review-provider.test.ts create mode 100644 sdk/extension-sdk-ts/templates/review-provider/tsconfig.json create mode 100644 sdk/extension-sdk-ts/templates/skill-pack/README.md create mode 100644 sdk/extension-sdk-ts/templates/skill-pack/extension.toml create mode 100644 sdk/extension-sdk-ts/templates/skill-pack/package.json create mode 100644 sdk/extension-sdk-ts/templates/skill-pack/skills/announce-run/SKILL.md create mode 100644 sdk/extension-sdk-ts/templates/skill-pack/test/skill-pack.test.js create mode 100644 sdk/extension-sdk-ts/test/extension.test.ts create mode 100644 sdk/extension-sdk-ts/test/fluent_hooks.test.ts create mode 100644 sdk/extension-sdk-ts/test/handlers.test.ts create mode 100644 sdk/extension-sdk-ts/test/host_api.test.ts create mode 100644 sdk/extension-sdk-ts/test/templates.test.ts create mode 100644 sdk/extension-sdk-ts/test/transport.test.ts create mode 100644 sdk/extension-sdk-ts/tsconfig.json create mode 100644 sdk/extension/README.md create mode 100644 sdk/extension/compat_test.go create mode 100644 sdk/extension/doc.go create mode 100644 sdk/extension/extension.go create mode 100644 sdk/extension/extension_test.go create mode 100644 sdk/extension/handlers.go create mode 100644 sdk/extension/hooks.go create mode 100644 sdk/extension/host_api.go create mode 100644 sdk/extension/host_api_test.go create mode 100644 sdk/extension/internal_test.go create mode 100644 sdk/extension/smoke_test.go create mode 100644 sdk/extension/testing/doc.go create mode 100644 sdk/extension/testing/harness.go create mode 100644 sdk/extension/testing/harness_test.go create mode 100644 sdk/extension/testing/mock_transport.go create mode 100644 sdk/extension/testing/mock_transport_test.go create mode 100644 sdk/extension/transport.go create mode 100644 sdk/extension/types.go create mode 100644 sdk/extension/types_test.go delete mode 100755 setup delete mode 100644 skills/0-1/SKILL.md delete mode 100644 skills/0-1/SKILL.md.tmpl delete mode 100644 skills/0-1/agents/openai.yaml delete mode 100644 skills/0-1/productize.json delete mode 100644 skills/README.md delete mode 100644 skills/aarrr-growth-diagnostics/SKILL.md delete mode 100644 skills/aarrr-growth-diagnostics/SKILL.md.tmpl delete mode 100644 skills/aarrr-growth-diagnostics/agents/openai.yaml delete mode 100644 skills/aarrr-growth-diagnostics/productize.json delete mode 100644 skills/ab-test-analysis/SKILL.md delete mode 100644 skills/ab-test-analysis/SKILL.md.tmpl delete mode 100644 skills/ab-test-analysis/agents/openai.yaml delete mode 100644 skills/ab-test-analysis/productize.json delete mode 100644 skills/acceptance-criteria-for-ui/SKILL.md delete mode 100644 skills/acceptance-criteria-for-ui/SKILL.md.tmpl delete mode 100644 skills/acceptance-criteria-for-ui/agents/openai.yaml delete mode 100644 skills/acceptance-criteria-for-ui/productize.json delete mode 100644 skills/accessibility-review/SKILL.md delete mode 100644 skills/accessibility-review/SKILL.md.tmpl delete mode 100644 skills/accessibility-review/agents/openai.yaml delete mode 100644 skills/accessibility-review/productize.json delete mode 100644 skills/actionable-customer-interview-guides-from-research-topics/SKILL.md delete mode 100644 skills/actionable-customer-interview-guides-from-research-topics/SKILL.md.tmpl delete mode 100644 skills/actionable-customer-interview-guides-from-research-topics/agents/openai.yaml delete mode 100644 skills/actionable-customer-interview-guides-from-research-topics/productize.json delete mode 100644 skills/actionable-job-stories-from-interview-transcripts/SKILL.md delete mode 100644 skills/actionable-job-stories-from-interview-transcripts/SKILL.md.tmpl delete mode 100644 skills/actionable-job-stories-from-interview-transcripts/agents/openai.yaml delete mode 100644 skills/actionable-job-stories-from-interview-transcripts/productize.json delete mode 100644 skills/actionable-product-improvements-from-survey-responses/SKILL.md delete mode 100644 skills/actionable-product-improvements-from-survey-responses/SKILL.md.tmpl delete mode 100644 skills/actionable-product-improvements-from-survey-responses/agents/openai.yaml delete mode 100644 skills/actionable-product-improvements-from-survey-responses/productize.json delete mode 100644 skills/actionable-research-briefs-from-problem-statements-and/SKILL.md delete mode 100644 skills/actionable-research-briefs-from-problem-statements-and/SKILL.md.tmpl delete mode 100644 skills/actionable-research-briefs-from-problem-statements-and/agents/openai.yaml delete mode 100644 skills/actionable-research-briefs-from-problem-statements-and/productize.json delete mode 100644 skills/actionable-user-profiles-with-tasks-and-constraints-from/SKILL.md delete mode 100644 skills/actionable-user-profiles-with-tasks-and-constraints-from/SKILL.md.tmpl delete mode 100644 skills/actionable-user-profiles-with-tasks-and-constraints-from/agents/openai.yaml delete mode 100644 skills/actionable-user-profiles-with-tasks-and-constraints-from/productize.json delete mode 100644 skills/actionable-user-research-decisions-from-project-insights/SKILL.md delete mode 100644 skills/actionable-user-research-decisions-from-project-insights/SKILL.md.tmpl delete mode 100644 skills/actionable-user-research-decisions-from-project-insights/agents/openai.yaml delete mode 100644 skills/actionable-user-research-decisions-from-project-insights/productize.json delete mode 100644 skills/adaptive-planning-from-scenarios-to-strategic-actions/SKILL.md delete mode 100644 skills/adaptive-planning-from-scenarios-to-strategic-actions/SKILL.md.tmpl delete mode 100644 skills/adaptive-planning-from-scenarios-to-strategic-actions/agents/openai.yaml delete mode 100644 skills/adaptive-planning-from-scenarios-to-strategic-actions/productize.json delete mode 100644 skills/aging-research-insight-validation-before-reusing/SKILL.md delete mode 100644 skills/aging-research-insight-validation-before-reusing/SKILL.md.tmpl delete mode 100644 skills/aging-research-insight-validation-before-reusing/agents/openai.yaml delete mode 100644 skills/aging-research-insight-validation-before-reusing/productize.json delete mode 100644 skills/ai-product-evaluation-from-recommendation-canvas-framework/SKILL.md delete mode 100644 skills/ai-product-evaluation-from-recommendation-canvas-framework/SKILL.md.tmpl delete mode 100644 skills/ai-product-evaluation-from-recommendation-canvas-framework/agents/openai.yaml delete mode 100644 skills/ai-product-evaluation-from-recommendation-canvas-framework/productize.json delete mode 100644 skills/analyze-feature-requests/SKILL.md delete mode 100644 skills/analyze-feature-requests/SKILL.md.tmpl delete mode 100644 skills/analyze-feature-requests/agents/openai.yaml delete mode 100644 skills/analyze-feature-requests/productize.json delete mode 100644 skills/analyze/SKILL.md delete mode 100644 skills/analyze/SKILL.md.tmpl delete mode 100644 skills/analyze/agents/openai.yaml delete mode 100644 skills/analyze/productize.json delete mode 100644 skills/app-aha-moment-identification-from-user-data-and-app/SKILL.md delete mode 100644 skills/app-aha-moment-identification-from-user-data-and-app/SKILL.md.tmpl delete mode 100644 skills/app-aha-moment-identification-from-user-data-and-app/agents/openai.yaml delete mode 100644 skills/app-aha-moment-identification-from-user-data-and-app/productize.json delete mode 100644 skills/app-design-from-project-requirements/SKILL.md delete mode 100644 skills/app-design-from-project-requirements/SKILL.md.tmpl delete mode 100644 skills/app-design-from-project-requirements/agents/openai.yaml delete mode 100644 skills/app-design-from-project-requirements/productize.json delete mode 100644 skills/autoplan/SKILL.md delete mode 100644 skills/autoplan/SKILL.md.tmpl delete mode 100644 skills/autoplan/agents/openai.yaml delete mode 100644 skills/autoplan/productize.json delete mode 100644 skills/backend-design/SKILL.md delete mode 100644 skills/backend-design/SKILL.md.tmpl delete mode 100644 skills/backend-design/agents/openai.yaml delete mode 100644 skills/backend-design/productize.json delete mode 100644 skills/beachhead-segment/SKILL.md delete mode 100644 skills/beachhead-segment/SKILL.md.tmpl delete mode 100644 skills/beachhead-segment/agents/openai.yaml delete mode 100644 skills/beachhead-segment/productize.json delete mode 100644 skills/behavioral-guidelines/SKILL.md delete mode 100644 skills/behavioral-guidelines/SKILL.md.tmpl delete mode 100644 skills/behavioral-guidelines/agents/openai.yaml delete mode 100644 skills/behavioral-guidelines/productize.json delete mode 100644 skills/brainstorm/SKILL.md delete mode 100644 skills/brainstorm/SKILL.md.tmpl delete mode 100644 skills/brainstorm/agents/openai.yaml delete mode 100644 skills/brainstorm/productize.json delete mode 100644 skills/brand-archetype-strategy/SKILL.md delete mode 100644 skills/brand-archetype-strategy/SKILL.md.tmpl delete mode 100644 skills/brand-archetype-strategy/agents/openai.yaml delete mode 100644 skills/brand-archetype-strategy/productize.json delete mode 100644 skills/brand-equity-diagnostics/SKILL.md delete mode 100644 skills/brand-equity-diagnostics/SKILL.md.tmpl delete mode 100644 skills/brand-equity-diagnostics/agents/openai.yaml delete mode 100644 skills/brand-equity-diagnostics/productize.json delete mode 100644 skills/bug-prioritization-against-work-in-progress/SKILL.md delete mode 100644 skills/bug-prioritization-against-work-in-progress/SKILL.md.tmpl delete mode 100644 skills/bug-prioritization-against-work-in-progress/agents/openai.yaml delete mode 100644 skills/bug-prioritization-against-work-in-progress/productize.json delete mode 100644 skills/build-dashboard/SKILL.md delete mode 100644 skills/build-dashboard/SKILL.md.tmpl delete mode 100644 skills/build-dashboard/agents/openai.yaml delete mode 100644 skills/build-dashboard/productize.json delete mode 100644 skills/business-flywheel-from-company-successes-and-failures/SKILL.md delete mode 100644 skills/business-flywheel-from-company-successes-and-failures/SKILL.md.tmpl delete mode 100644 skills/business-flywheel-from-company-successes-and-failures/agents/openai.yaml delete mode 100644 skills/business-flywheel-from-company-successes-and-failures/productize.json delete mode 100644 skills/business-model-blindspots/SKILL.md delete mode 100644 skills/business-model-blindspots/SKILL.md.tmpl delete mode 100644 skills/business-model-blindspots/agents/openai.yaml delete mode 100644 skills/business-model-blindspots/productize.json delete mode 100644 skills/business-model-blindspots/references/diagnostic-questions.md delete mode 100644 skills/business-model-blindspots/references/output-format.md delete mode 100644 skills/business-model-design/SKILL.md delete mode 100644 skills/business-model-design/SKILL.md.tmpl delete mode 100644 skills/business-model-design/agents/openai.yaml delete mode 100644 skills/business-model-design/assets/lean-business-model-canvas.html delete mode 100644 skills/business-model-design/assets/platform-business-model-canvas.html delete mode 100644 skills/business-model-design/assets/standard-business-model-canvas.html delete mode 100644 skills/business-model-design/productize.json delete mode 100644 skills/business-model-design/references/business-model-output-rules.md delete mode 100644 skills/business-model-design/references/canvas-selection.md delete mode 100644 skills/business-model-design/references/canvas-templates.md delete mode 100644 skills/business-model-design/references/pm-skills-main-merge.md delete mode 100644 skills/business-strategy-creation-from-expert-strategic-thinking/SKILL.md delete mode 100644 skills/business-strategy-creation-from-expert-strategic-thinking/SKILL.md.tmpl delete mode 100644 skills/business-strategy-creation-from-expert-strategic-thinking/agents/openai.yaml delete mode 100644 skills/business-strategy-creation-from-expert-strategic-thinking/productize.json delete mode 100644 skills/capital-structure-financing/SKILL.md delete mode 100644 skills/capital-structure-financing/SKILL.md.tmpl delete mode 100644 skills/capital-structure-financing/agents/openai.yaml delete mode 100644 skills/capital-structure-financing/productize.json delete mode 100644 skills/challenging-meeting-with-stakeholders/SKILL.md delete mode 100644 skills/challenging-meeting-with-stakeholders/SKILL.md.tmpl delete mode 100644 skills/challenging-meeting-with-stakeholders/agents/openai.yaml delete mode 100644 skills/challenging-meeting-with-stakeholders/productize.json delete mode 100644 skills/churn-reduction-from-customer-data-and-exit-survey-analysis/SKILL.md delete mode 100644 skills/churn-reduction-from-customer-data-and-exit-survey-analysis/SKILL.md.tmpl delete mode 100644 skills/churn-reduction-from-customer-data-and-exit-survey-analysis/agents/openai.yaml delete mode 100644 skills/churn-reduction-from-customer-data-and-exit-survey-analysis/productize.json delete mode 100644 skills/clustered-jtbd-forces-from-interview-data/SKILL.md delete mode 100644 skills/clustered-jtbd-forces-from-interview-data/SKILL.md.tmpl delete mode 100644 skills/clustered-jtbd-forces-from-interview-data/agents/openai.yaml delete mode 100644 skills/clustered-jtbd-forces-from-interview-data/productize.json delete mode 100644 skills/cohort-analysis/SKILL.md delete mode 100644 skills/cohort-analysis/SKILL.md.tmpl delete mode 100644 skills/cohort-analysis/agents/openai.yaml delete mode 100644 skills/cohort-analysis/productize.json delete mode 100644 skills/comms-review/SKILL.md delete mode 100644 skills/comms-review/SKILL.md.tmpl delete mode 100644 skills/comms-review/agents/openai.yaml delete mode 100644 skills/comms-review/productize.json delete mode 100644 skills/competitive-advantage-diagnostics-and-moat-strategy/SKILL.md delete mode 100644 skills/competitive-advantage-diagnostics-and-moat-strategy/SKILL.md.tmpl delete mode 100644 skills/competitive-advantage-diagnostics-and-moat-strategy/agents/openai.yaml delete mode 100644 skills/competitive-advantage-diagnostics-and-moat-strategy/productize.json delete mode 100644 skills/competitive-analysis-to-winning-positioning-strategy/SKILL.md delete mode 100644 skills/competitive-analysis-to-winning-positioning-strategy/SKILL.md.tmpl delete mode 100644 skills/competitive-analysis-to-winning-positioning-strategy/agents/openai.yaml delete mode 100644 skills/competitive-analysis-to-winning-positioning-strategy/productize.json delete mode 100644 skills/competitive-brief/SKILL.md delete mode 100644 skills/competitive-brief/SKILL.md.tmpl delete mode 100644 skills/competitive-brief/agents/openai.yaml delete mode 100644 skills/competitive-brief/productize.json delete mode 100644 skills/competitive-brief/references/pm-skills-main-merge.md delete mode 100644 skills/competitive-parity-and-strategic-differentiation/SKILL.md delete mode 100644 skills/competitive-parity-and-strategic-differentiation/SKILL.md.tmpl delete mode 100644 skills/competitive-parity-and-strategic-differentiation/agents/openai.yaml delete mode 100644 skills/competitive-parity-and-strategic-differentiation/productize.json delete mode 100644 skills/complex-problem-structuring-into-actionable-recommendations/SKILL.md delete mode 100644 skills/complex-problem-structuring-into-actionable-recommendations/SKILL.md.tmpl delete mode 100644 skills/complex-problem-structuring-into-actionable-recommendations/agents/openai.yaml delete mode 100644 skills/complex-problem-structuring-into-actionable-recommendations/productize.json delete mode 100644 skills/comprehensive-use-cases-from-user-input-for-product-strategy/SKILL.md delete mode 100644 skills/comprehensive-use-cases-from-user-input-for-product-strategy/SKILL.md.tmpl delete mode 100644 skills/comprehensive-use-cases-from-user-input-for-product-strategy/agents/openai.yaml delete mode 100644 skills/comprehensive-use-cases-from-user-input-for-product-strategy/productize.json delete mode 100644 skills/conflicting-stakeholder-requirements-to-balanced-design/SKILL.md delete mode 100644 skills/conflicting-stakeholder-requirements-to-balanced-design/SKILL.md.tmpl delete mode 100644 skills/conflicting-stakeholder-requirements-to-balanced-design/agents/openai.yaml delete mode 100644 skills/conflicting-stakeholder-requirements-to-balanced-design/productize.json delete mode 100644 skills/conversation-summaries-from-meeting-transcripts/SKILL.md delete mode 100644 skills/conversation-summaries-from-meeting-transcripts/SKILL.md.tmpl delete mode 100644 skills/conversation-summaries-from-meeting-transcripts/agents/openai.yaml delete mode 100644 skills/conversation-summaries-from-meeting-transcripts/productize.json create mode 100644 skills/create-prd/SKILL.md create mode 100644 skills/create-prd/references/adr-template.md create mode 100644 skills/create-prd/references/prd-template.md create mode 100644 skills/create-prd/references/question-protocol.md create mode 100644 skills/create-tasks/SKILL.md create mode 100644 skills/create-tasks/references/task-context-schema.md create mode 100644 skills/create-tasks/references/task-template.md create mode 100644 skills/create-techspec/SKILL.md create mode 100644 skills/create-techspec/references/adr-template.md create mode 100644 skills/create-techspec/references/techspec-template.md delete mode 100644 skills/create-viz/SKILL.md delete mode 100644 skills/create-viz/SKILL.md.tmpl delete mode 100644 skills/create-viz/agents/openai.yaml delete mode 100644 skills/create-viz/productize.json delete mode 100644 skills/creative-solution-generation-from-de-bono-s-lateral-thinking/SKILL.md delete mode 100644 skills/creative-solution-generation-from-de-bono-s-lateral-thinking/SKILL.md.tmpl delete mode 100644 skills/creative-solution-generation-from-de-bono-s-lateral-thinking/agents/openai.yaml delete mode 100644 skills/creative-solution-generation-from-de-bono-s-lateral-thinking/productize.json delete mode 100644 skills/creative-solution-generation-from-metaphorical-thinking/SKILL.md delete mode 100644 skills/creative-solution-generation-from-metaphorical-thinking/SKILL.md.tmpl delete mode 100644 skills/creative-solution-generation-from-metaphorical-thinking/agents/openai.yaml delete mode 100644 skills/creative-solution-generation-from-metaphorical-thinking/productize.json delete mode 100644 skills/crisis-communication-plan-from-outage-details-and-company/SKILL.md delete mode 100644 skills/crisis-communication-plan-from-outage-details-and-company/SKILL.md.tmpl delete mode 100644 skills/crisis-communication-plan-from-outage-details-and-company/agents/openai.yaml delete mode 100644 skills/crisis-communication-plan-from-outage-details-and-company/productize.json delete mode 100644 skills/critical-flaws-in-product-requirements-tough-and-unreasonable/SKILL.md delete mode 100644 skills/critical-flaws-in-product-requirements-tough-and-unreasonable/SKILL.md.tmpl delete mode 100644 skills/critical-flaws-in-product-requirements-tough-and-unreasonable/agents/openai.yaml delete mode 100644 skills/critical-flaws-in-product-requirements-tough-and-unreasonable/productize.json delete mode 100644 skills/ctas-from-copywriting-strategies/SKILL.md delete mode 100644 skills/ctas-from-copywriting-strategies/SKILL.md.tmpl delete mode 100644 skills/ctas-from-copywriting-strategies/agents/openai.yaml delete mode 100644 skills/ctas-from-copywriting-strategies/productize.json delete mode 100644 skills/customer-insights-extraction-from-interview-transcript-using/SKILL.md delete mode 100644 skills/customer-insights-extraction-from-interview-transcript-using/SKILL.md.tmpl delete mode 100644 skills/customer-insights-extraction-from-interview-transcript-using/agents/openai.yaml delete mode 100644 skills/customer-insights-extraction-from-interview-transcript-using/productize.json delete mode 100644 skills/customer-journey-map-based-on-user-behavior-data/SKILL.md delete mode 100644 skills/customer-journey-map-based-on-user-behavior-data/SKILL.md.tmpl delete mode 100644 skills/customer-journey-map-based-on-user-behavior-data/agents/openai.yaml delete mode 100644 skills/customer-journey-map-based-on-user-behavior-data/productize.json delete mode 100644 skills/data-context-extractor/SKILL.md delete mode 100644 skills/data-context-extractor/SKILL.md.tmpl delete mode 100644 skills/data-context-extractor/agents/openai.yaml delete mode 100644 skills/data-context-extractor/productize.json delete mode 100644 skills/data-context-extractor/references/domain-template.md delete mode 100644 skills/data-context-extractor/references/example-generated-skill.md delete mode 100644 skills/data-context-extractor/references/skill-template.md delete mode 100644 skills/data-context-extractor/references/sql-dialects.md delete mode 100644 skills/data-context-extractor/references/tables/README.md delete mode 100755 skills/data-context-extractor/scripts/package_data_skill.py delete mode 100644 skills/data-driven-research-plans-from-leadership-intuition/SKILL.md delete mode 100644 skills/data-driven-research-plans-from-leadership-intuition/SKILL.md.tmpl delete mode 100644 skills/data-driven-research-plans-from-leadership-intuition/agents/openai.yaml delete mode 100644 skills/data-driven-research-plans-from-leadership-intuition/productize.json delete mode 100644 skills/data-visualization/SKILL.md delete mode 100644 skills/data-visualization/SKILL.md.tmpl delete mode 100644 skills/data-visualization/agents/openai.yaml delete mode 100644 skills/data-visualization/productize.json delete mode 100644 skills/decision-making-with-the-gut-check-protocol/SKILL.md delete mode 100644 skills/decision-making-with-the-gut-check-protocol/SKILL.md.tmpl delete mode 100644 skills/decision-making-with-the-gut-check-protocol/agents/openai.yaml delete mode 100644 skills/decision-making-with-the-gut-check-protocol/productize.json delete mode 100644 skills/decision-reversibility-classification-from-first-principles/SKILL.md delete mode 100644 skills/decision-reversibility-classification-from-first-principles/SKILL.md.tmpl delete mode 100644 skills/decision-reversibility-classification-from-first-principles/agents/openai.yaml delete mode 100644 skills/decision-reversibility-classification-from-first-principles/productize.json delete mode 100644 skills/decision-rights-using-davci/SKILL.md delete mode 100644 skills/decision-rights-using-davci/SKILL.md.tmpl delete mode 100644 skills/decision-rights-using-davci/agents/openai.yaml delete mode 100644 skills/decision-rights-using-davci/productize.json delete mode 100644 skills/defining-the-niche-from-user-input/SKILL.md delete mode 100644 skills/defining-the-niche-from-user-input/SKILL.md.tmpl delete mode 100644 skills/defining-the-niche-from-user-input/agents/openai.yaml delete mode 100644 skills/defining-the-niche-from-user-input/productize.json delete mode 100644 skills/demo-narratives-showing-user-goals/SKILL.md delete mode 100644 skills/demo-narratives-showing-user-goals/SKILL.md.tmpl delete mode 100644 skills/demo-narratives-showing-user-goals/agents/openai.yaml delete mode 100644 skills/demo-narratives-showing-user-goals/productize.json delete mode 100644 skills/design-critique/SKILL.md delete mode 100644 skills/design-critique/SKILL.md.tmpl delete mode 100644 skills/design-critique/agents/openai.yaml delete mode 100644 skills/design-critique/productize.json delete mode 100644 skills/design-handoff/SKILL.md delete mode 100644 skills/design-handoff/SKILL.md.tmpl delete mode 100644 skills/design-handoff/agents/openai.yaml delete mode 100644 skills/design-handoff/productize.json delete mode 100644 skills/design-review/SKILL.md delete mode 100644 skills/design-review/SKILL.md.tmpl delete mode 100644 skills/design-review/agents/openai.yaml delete mode 100644 skills/design-review/productize.json delete mode 100644 skills/design-system/SKILL.md delete mode 100644 skills/design-system/SKILL.md.tmpl delete mode 100644 skills/design-system/agents/openai.yaml delete mode 100644 skills/design-system/productize.json delete mode 100644 skills/detailed-project-plans-from-project-briefs/SKILL.md delete mode 100644 skills/detailed-project-plans-from-project-briefs/SKILL.md.tmpl delete mode 100644 skills/detailed-project-plans-from-project-briefs/agents/openai.yaml delete mode 100644 skills/detailed-project-plans-from-project-briefs/productize.json delete mode 100644 skills/difficult-conversation-script-5-step-framework/SKILL.md delete mode 100644 skills/difficult-conversation-script-5-step-framework/SKILL.md.tmpl delete mode 100644 skills/difficult-conversation-script-5-step-framework/agents/openai.yaml delete mode 100644 skills/difficult-conversation-script-5-step-framework/productize.json delete mode 100644 skills/disruptive-strategy-generation-from-what-if-questions/SKILL.md delete mode 100644 skills/disruptive-strategy-generation-from-what-if-questions/SKILL.md.tmpl delete mode 100644 skills/disruptive-strategy-generation-from-what-if-questions/agents/openai.yaml delete mode 100644 skills/disruptive-strategy-generation-from-what-if-questions/productize.json delete mode 100644 skills/docs/SKILL.md delete mode 100644 skills/docs/SKILL.md.tmpl delete mode 100644 skills/docs/agents/openai.yaml delete mode 100644 skills/docs/productize.json delete mode 100644 skills/dogfood/SKILL.md delete mode 100644 skills/dogfood/SKILL.md.tmpl delete mode 100644 skills/dogfood/agents/openai.yaml delete mode 100644 skills/dogfood/productize.json delete mode 100644 skills/dogfood/references/issue-taxonomy.md delete mode 100644 skills/dogfood/templates/dogfood-report-template.md delete mode 100644 skills/draft-nda/SKILL.md delete mode 100644 skills/draft-nda/SKILL.md.tmpl delete mode 100644 skills/draft-nda/agents/openai.yaml delete mode 100644 skills/draft-nda/productize.json delete mode 100644 skills/dual-mode-ai-coding-assistant-staff-eng-intern/SKILL.md delete mode 100644 skills/dual-mode-ai-coding-assistant-staff-eng-intern/SKILL.md.tmpl delete mode 100644 skills/dual-mode-ai-coding-assistant-staff-eng-intern/agents/openai.yaml delete mode 100644 skills/dual-mode-ai-coding-assistant-staff-eng-intern/productize.json delete mode 100644 skills/dx-review/SKILL.md delete mode 100644 skills/dx-review/SKILL.md.tmpl delete mode 100644 skills/dx-review/agents/openai.yaml delete mode 100644 skills/dx-review/productize.json delete mode 100644 skills/easy-signal-identification-from-product-assumption/SKILL.md delete mode 100644 skills/easy-signal-identification-from-product-assumption/SKILL.md.tmpl delete mode 100644 skills/easy-signal-identification-from-product-assumption/agents/openai.yaml delete mode 100644 skills/easy-signal-identification-from-product-assumption/productize.json delete mode 100644 skills/effective-customer-interview-guides-for-any-topic/SKILL.md delete mode 100644 skills/effective-customer-interview-guides-for-any-topic/SKILL.md.tmpl delete mode 100644 skills/effective-customer-interview-guides-for-any-topic/agents/openai.yaml delete mode 100644 skills/effective-customer-interview-guides-for-any-topic/productize.json delete mode 100644 skills/effective-customer-interview-guides-for-any-topic/references/pm-skills-main-merge.md create mode 100644 skills/embed.go delete mode 100644 skills/empathy-maps/SKILL.md delete mode 100644 skills/empathy-maps/SKILL.md.tmpl delete mode 100644 skills/empathy-maps/agents/openai.yaml delete mode 100644 skills/empathy-maps/productize.json delete mode 100644 skills/eng-review/SKILL.md delete mode 100644 skills/eng-review/SKILL.md.tmpl delete mode 100644 skills/eng-review/agents/openai.yaml delete mode 100644 skills/eng-review/productize.json delete mode 100644 skills/engineering-problem-solving-and-solution-structuring/SKILL.md delete mode 100644 skills/engineering-problem-solving-and-solution-structuring/SKILL.md.tmpl delete mode 100644 skills/engineering-problem-solving-and-solution-structuring/agents/openai.yaml delete mode 100644 skills/engineering-problem-solving-and-solution-structuring/productize.json delete mode 100644 skills/event-tracking-schemas-from-ui-and-metrics-requirements/SKILL.md delete mode 100644 skills/event-tracking-schemas-from-ui-and-metrics-requirements/SKILL.md.tmpl delete mode 100644 skills/event-tracking-schemas-from-ui-and-metrics-requirements/agents/openai.yaml delete mode 100644 skills/event-tracking-schemas-from-ui-and-metrics-requirements/productize.json delete mode 100644 skills/exec-feedback-without-context-to-actionable-design-requirements/SKILL.md delete mode 100644 skills/exec-feedback-without-context-to-actionable-design-requirements/SKILL.md.tmpl delete mode 100644 skills/exec-feedback-without-context-to-actionable-design-requirements/agents/openai.yaml delete mode 100644 skills/exec-feedback-without-context-to-actionable-design-requirements/productize.json create mode 100644 skills/execute-task/SKILL.md create mode 100644 skills/execute-task/references/tracking-checklist.md delete mode 100644 skills/executive-and-update-review/SKILL.md delete mode 100644 skills/executive-and-update-review/SKILL.md.tmpl delete mode 100644 skills/executive-and-update-review/agents/openai.yaml delete mode 100644 skills/executive-and-update-review/productize.json delete mode 100644 skills/executive-decks-from-quick-dirty-test-analysis/SKILL.md delete mode 100644 skills/executive-decks-from-quick-dirty-test-analysis/SKILL.md.tmpl delete mode 100644 skills/executive-decks-from-quick-dirty-test-analysis/agents/openai.yaml delete mode 100644 skills/executive-decks-from-quick-dirty-test-analysis/productize.json delete mode 100644 skills/explore-data/SKILL.md delete mode 100644 skills/explore-data/SKILL.md.tmpl delete mode 100644 skills/explore-data/agents/openai.yaml delete mode 100644 skills/explore-data/productize.json delete mode 100644 skills/feature-impact-models-from-kpis-and-assumptions/SKILL.md delete mode 100644 skills/feature-impact-models-from-kpis-and-assumptions/SKILL.md.tmpl delete mode 100644 skills/feature-impact-models-from-kpis-and-assumptions/agents/openai.yaml delete mode 100644 skills/feature-impact-models-from-kpis-and-assumptions/productize.json delete mode 100644 skills/feature-results-analysis-from-draft-to-final-report/SKILL.md delete mode 100644 skills/feature-results-analysis-from-draft-to-final-report/SKILL.md.tmpl delete mode 100644 skills/feature-results-analysis-from-draft-to-final-report/agents/openai.yaml delete mode 100644 skills/feature-results-analysis-from-draft-to-final-report/productize.json delete mode 100644 skills/features-reframing-and-projects-shape-up/SKILL.md delete mode 100644 skills/features-reframing-and-projects-shape-up/SKILL.md.tmpl delete mode 100644 skills/features-reframing-and-projects-shape-up/agents/openai.yaml delete mode 100644 skills/features-reframing-and-projects-shape-up/productize.json create mode 100644 skills/final-verify/SKILL.md delete mode 100644 skills/finance-modeling-kernel/SKILL.md delete mode 100644 skills/finance-modeling-kernel/SKILL.md.tmpl delete mode 100644 skills/finance-modeling-kernel/agents/openai.yaml delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/apv.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/bond_math.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/cap_table.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/capital_structure.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/capm.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/convertible_notes.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/dcf.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/market_context.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/option_pools.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/preferred_stock.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/returns.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/risk.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/safes.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/time_value.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/validation.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/valuation.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/vc_method.py delete mode 100644 skills/finance-modeling-kernel/finance-modeling-kernel/wacc.py delete mode 100644 skills/finance-modeling-kernel/productize.json delete mode 100644 skills/financial-markets-context/SKILL.md delete mode 100644 skills/financial-markets-context/SKILL.md.tmpl delete mode 100644 skills/financial-markets-context/agents/openai.yaml delete mode 100644 skills/financial-markets-context/productize.json create mode 100644 skills/fix-reviews/SKILL.md delete mode 100644 skills/fragmented-user-research-synthesis-into-coherent-insights/SKILL.md delete mode 100644 skills/fragmented-user-research-synthesis-into-coherent-insights/SKILL.md.tmpl delete mode 100644 skills/fragmented-user-research-synthesis-into-coherent-insights/agents/openai.yaml delete mode 100644 skills/fragmented-user-research-synthesis-into-coherent-insights/productize.json delete mode 100644 skills/framework-application-to-product-challenges-from-user-input/SKILL.md delete mode 100644 skills/framework-application-to-product-challenges-from-user-input/SKILL.md.tmpl delete mode 100644 skills/framework-application-to-product-challenges-from-user-input/agents/openai.yaml delete mode 100644 skills/framework-application-to-product-challenges-from-user-input/productize.json delete mode 100644 skills/frontend-design/SKILL.md delete mode 100644 skills/frontend-design/SKILL.md.tmpl delete mode 100644 skills/frontend-design/agents/openai.yaml delete mode 100644 skills/frontend-design/productize.json delete mode 100644 skills/future-product-opportunities-from-market-inflection-points/SKILL.md delete mode 100644 skills/future-product-opportunities-from-market-inflection-points/SKILL.md.tmpl delete mode 100644 skills/future-product-opportunities-from-market-inflection-points/agents/openai.yaml delete mode 100644 skills/future-product-opportunities-from-market-inflection-points/productize.json delete mode 100644 skills/group-decision-making-quality-review/SKILL.md delete mode 100644 skills/group-decision-making-quality-review/SKILL.md.tmpl delete mode 100644 skills/group-decision-making-quality-review/agents/openai.yaml delete mode 100644 skills/group-decision-making-quality-review/productize.json delete mode 100644 skills/grow/SKILL.md delete mode 100644 skills/grow/SKILL.md.tmpl delete mode 100644 skills/grow/agents/openai.yaml delete mode 100644 skills/grow/productize.json delete mode 100644 skills/growth-loops/SKILL.md delete mode 100644 skills/growth-loops/SKILL.md.tmpl delete mode 100644 skills/growth-loops/agents/openai.yaml delete mode 100644 skills/growth-loops/productize.json delete mode 100644 skills/growth-project-generation-with-pioneer-migrator-settler/SKILL.md delete mode 100644 skills/growth-project-generation-with-pioneer-migrator-settler/SKILL.md.tmpl delete mode 100644 skills/growth-project-generation-with-pioneer-migrator-settler/agents/openai.yaml delete mode 100644 skills/growth-project-generation-with-pioneer-migrator-settler/productize.json delete mode 100644 skills/growth-strategy-synthesis-from-user-inputs/SKILL.md delete mode 100644 skills/growth-strategy-synthesis-from-user-inputs/SKILL.md.tmpl delete mode 100644 skills/growth-strategy-synthesis-from-user-inputs/agents/openai.yaml delete mode 100644 skills/growth-strategy-synthesis-from-user-inputs/productize.json delete mode 100644 skills/gtm-motions/SKILL.md delete mode 100644 skills/gtm-motions/SKILL.md.tmpl delete mode 100644 skills/gtm-motions/agents/openai.yaml delete mode 100644 skills/gtm-motions/productize.json delete mode 100644 skills/gtm-strategy/SKILL.md delete mode 100644 skills/gtm-strategy/SKILL.md.tmpl delete mode 100644 skills/gtm-strategy/agents/openai.yaml delete mode 100644 skills/gtm-strategy/productize.json delete mode 100644 skills/ideal-customer-profile-icp-representative-for-x-product/SKILL.md delete mode 100644 skills/ideal-customer-profile-icp-representative-for-x-product/SKILL.md.tmpl delete mode 100644 skills/ideal-customer-profile-icp-representative-for-x-product/agents/openai.yaml delete mode 100644 skills/ideal-customer-profile-icp-representative-for-x-product/productize.json delete mode 100644 skills/ideal-customer-profile-icp-representative-for-x-product/references/pm-skills-main-merge.md delete mode 100644 skills/ideas-for-affordances-and-signifiers-based-on-a-design-problem/SKILL.md delete mode 100644 skills/ideas-for-affordances-and-signifiers-based-on-a-design-problem/SKILL.md.tmpl delete mode 100644 skills/ideas-for-affordances-and-signifiers-based-on-a-design-problem/agents/openai.yaml delete mode 100644 skills/ideas-for-affordances-and-signifiers-based-on-a-design-problem/productize.json delete mode 100644 skills/implementation-notes/SKILL.md delete mode 100644 skills/implementation-notes/SKILL.md.tmpl delete mode 100644 skills/implementation-notes/agents/openai.yaml delete mode 100644 skills/implementation-notes/productize.json delete mode 100644 skills/industry-trend-strategy/SKILL.md delete mode 100644 skills/industry-trend-strategy/SKILL.md.tmpl delete mode 100644 skills/industry-trend-strategy/agents/openai.yaml delete mode 100644 skills/industry-trend-strategy/productize.json delete mode 100644 skills/influence-strategies-from-cialdini-s-7-principles/SKILL.md delete mode 100644 skills/influence-strategies-from-cialdini-s-7-principles/SKILL.md.tmpl delete mode 100644 skills/influence-strategies-from-cialdini-s-7-principles/agents/openai.yaml delete mode 100644 skills/influence-strategies-from-cialdini-s-7-principles/productize.json delete mode 100644 skills/innovation-decision-making-heuristics/SKILL.md delete mode 100644 skills/innovation-decision-making-heuristics/SKILL.md.tmpl delete mode 100644 skills/innovation-decision-making-heuristics/agents/openai.yaml delete mode 100644 skills/innovation-decision-making-heuristics/productize.json delete mode 100644 skills/innovative-idea-generation-from-project-parameters-and/SKILL.md delete mode 100644 skills/innovative-idea-generation-from-project-parameters-and/SKILL.md.tmpl delete mode 100644 skills/innovative-idea-generation-from-project-parameters-and/agents/openai.yaml delete mode 100644 skills/innovative-idea-generation-from-project-parameters-and/productize.json delete mode 100644 skills/innovative-idea-generation-from-structured-brainstorming/SKILL.md delete mode 100644 skills/innovative-idea-generation-from-structured-brainstorming/SKILL.md.tmpl delete mode 100644 skills/innovative-idea-generation-from-structured-brainstorming/agents/openai.yaml delete mode 100644 skills/innovative-idea-generation-from-structured-brainstorming/productize.json delete mode 100644 skills/innovative-product-ideas-from-structured-brainstorming/SKILL.md delete mode 100644 skills/innovative-product-ideas-from-structured-brainstorming/SKILL.md.tmpl delete mode 100644 skills/innovative-product-ideas-from-structured-brainstorming/agents/openai.yaml delete mode 100644 skills/innovative-product-ideas-from-structured-brainstorming/productize.json delete mode 100644 skills/interactive-intake-for-ost-inputs/SKILL.md delete mode 100644 skills/interactive-intake-for-ost-inputs/SKILL.md.tmpl delete mode 100644 skills/interactive-intake-for-ost-inputs/agents/openai.yaml delete mode 100644 skills/interactive-intake-for-ost-inputs/productize.json delete mode 100644 skills/lean-canvas/SKILL.md delete mode 100644 skills/lean-canvas/SKILL.md.tmpl delete mode 100644 skills/lean-canvas/agents/openai.yaml delete mode 100644 skills/lean-canvas/productize.json delete mode 100644 skills/limit-based-product-strategy-from-problem-to-execution-plan/SKILL.md delete mode 100644 skills/limit-based-product-strategy-from-problem-to-execution-plan/SKILL.md.tmpl delete mode 100644 skills/limit-based-product-strategy-from-problem-to-execution-plan/agents/openai.yaml delete mode 100644 skills/limit-based-product-strategy-from-problem-to-execution-plan/productize.json delete mode 100644 skills/low-frequency-to-power-user-transition-strategy/SKILL.md delete mode 100644 skills/low-frequency-to-power-user-transition-strategy/SKILL.md.tmpl delete mode 100644 skills/low-frequency-to-power-user-transition-strategy/agents/openai.yaml delete mode 100644 skills/low-frequency-to-power-user-transition-strategy/productize.json delete mode 100644 skills/managerial-finance-dcf/SKILL.md delete mode 100644 skills/managerial-finance-dcf/SKILL.md.tmpl delete mode 100644 skills/managerial-finance-dcf/agents/openai.yaml delete mode 100644 skills/managerial-finance-dcf/productize.json delete mode 100644 skills/map-power-dynamics-before-meetings/SKILL.md delete mode 100644 skills/map-power-dynamics-before-meetings/SKILL.md.tmpl delete mode 100644 skills/map-power-dynamics-before-meetings/agents/openai.yaml delete mode 100644 skills/map-power-dynamics-before-meetings/productize.json delete mode 100644 skills/market-opportunities-from-jobs-to-be-done-market-canvas/SKILL.md delete mode 100644 skills/market-opportunities-from-jobs-to-be-done-market-canvas/SKILL.md.tmpl delete mode 100644 skills/market-opportunities-from-jobs-to-be-done-market-canvas/agents/openai.yaml delete mode 100644 skills/market-opportunities-from-jobs-to-be-done-market-canvas/productize.json delete mode 100644 skills/market-opportunity/SKILL.md delete mode 100644 skills/market-opportunity/SKILL.md.tmpl delete mode 100644 skills/market-opportunity/agents/openai.yaml delete mode 100644 skills/market-opportunity/productize.json delete mode 100644 skills/market-opportunity/references/canonical-canvases.md delete mode 100644 skills/market-opportunity/references/output-formats.md delete mode 100644 skills/market-opportunity/references/rating-and-decision-rules.md delete mode 100644 skills/market-orientation-audit/SKILL.md delete mode 100644 skills/market-orientation-audit/SKILL.md.tmpl delete mode 100644 skills/market-orientation-audit/agents/openai.yaml delete mode 100644 skills/market-orientation-audit/productize.json delete mode 100644 skills/market-requirements-from-strategic-market-inputs/SKILL.md delete mode 100644 skills/market-requirements-from-strategic-market-inputs/SKILL.md.tmpl delete mode 100644 skills/market-requirements-from-strategic-market-inputs/agents/openai.yaml delete mode 100644 skills/market-requirements-from-strategic-market-inputs/productize.json delete mode 100644 skills/market-sizing/SKILL.md delete mode 100644 skills/market-sizing/SKILL.md.tmpl delete mode 100644 skills/market-sizing/agents/openai.yaml delete mode 100644 skills/market-sizing/productize.json delete mode 100644 skills/mece-analysis-and-logical-tree-from-list-items/SKILL.md delete mode 100644 skills/mece-analysis-and-logical-tree-from-list-items/SKILL.md.tmpl delete mode 100644 skills/mece-analysis-and-logical-tree-from-list-items/agents/openai.yaml delete mode 100644 skills/mece-analysis-and-logical-tree-from-list-items/productize.json delete mode 100644 skills/meeting-agendas-from-meeting-descriptions/SKILL.md delete mode 100644 skills/meeting-agendas-from-meeting-descriptions/SKILL.md.tmpl delete mode 100644 skills/meeting-agendas-from-meeting-descriptions/agents/openai.yaml delete mode 100644 skills/meeting-agendas-from-meeting-descriptions/productize.json delete mode 100644 skills/meeting-outcome-planning-and-stakeholder-alignment/SKILL.md delete mode 100644 skills/meeting-outcome-planning-and-stakeholder-alignment/SKILL.md.tmpl delete mode 100644 skills/meeting-outcome-planning-and-stakeholder-alignment/agents/openai.yaml delete mode 100644 skills/meeting-outcome-planning-and-stakeholder-alignment/productize.json delete mode 100644 skills/meeting-summaries-from-meeting-transcript-ideas-framework/SKILL.md delete mode 100644 skills/meeting-summaries-from-meeting-transcript-ideas-framework/SKILL.md.tmpl delete mode 100644 skills/meeting-summaries-from-meeting-transcript-ideas-framework/agents/openai.yaml delete mode 100644 skills/meeting-summaries-from-meeting-transcript-ideas-framework/productize.json delete mode 100644 skills/message-framing-and-comms-plan-designer/SKILL.md delete mode 100644 skills/message-framing-and-comms-plan-designer/SKILL.md.tmpl delete mode 100644 skills/message-framing-and-comms-plan-designer/agents/openai.yaml delete mode 100644 skills/message-framing-and-comms-plan-designer/productize.json delete mode 100644 skills/metric-drops-diagnosis-with-rigorous-stepwise-decomposition/SKILL.md delete mode 100644 skills/metric-drops-diagnosis-with-rigorous-stepwise-decomposition/SKILL.md.tmpl delete mode 100644 skills/metric-drops-diagnosis-with-rigorous-stepwise-decomposition/agents/openai.yaml delete mode 100644 skills/metric-drops-diagnosis-with-rigorous-stepwise-decomposition/productize.json delete mode 100644 skills/metrics-review/SKILL.md delete mode 100644 skills/metrics-review/SKILL.md.tmpl delete mode 100644 skills/metrics-review/agents/openai.yaml delete mode 100644 skills/metrics-review/productize.json delete mode 100644 skills/monetization-strategy/SKILL.md delete mode 100644 skills/monetization-strategy/SKILL.md.tmpl delete mode 100644 skills/monetization-strategy/agents/openai.yaml delete mode 100644 skills/monetization-strategy/productize.json delete mode 100644 skills/multi-step-workflow-optimization/SKILL.md delete mode 100644 skills/multi-step-workflow-optimization/SKILL.md.tmpl delete mode 100644 skills/multi-step-workflow-optimization/agents/openai.yaml delete mode 100644 skills/multi-step-workflow-optimization/productize.json delete mode 100644 skills/multiple-interface-descriptions-from-a-single-image/SKILL.md delete mode 100644 skills/multiple-interface-descriptions-from-a-single-image/SKILL.md.tmpl delete mode 100644 skills/multiple-interface-descriptions-from-a-single-image/agents/openai.yaml delete mode 100644 skills/multiple-interface-descriptions-from-a-single-image/productize.json delete mode 100644 skills/netmba-competitor-analysis/SKILL.md delete mode 100644 skills/netmba-competitor-analysis/SKILL.md.tmpl delete mode 100644 skills/netmba-competitor-analysis/agents/openai.yaml delete mode 100644 skills/netmba-competitor-analysis/productize.json delete mode 100644 skills/north-star-metric/SKILL.md delete mode 100644 skills/north-star-metric/SKILL.md.tmpl delete mode 100644 skills/north-star-metric/agents/openai.yaml delete mode 100644 skills/north-star-metric/productize.json delete mode 100644 skills/now-next-later-vision-roadmap-from-interview-synthesis/SKILL.md delete mode 100644 skills/now-next-later-vision-roadmap-from-interview-synthesis/SKILL.md.tmpl delete mode 100644 skills/now-next-later-vision-roadmap-from-interview-synthesis/agents/openai.yaml delete mode 100644 skills/now-next-later-vision-roadmap-from-interview-synthesis/productize.json delete mode 100644 skills/nps-feedback-for-prioritized-customer-experience-initiatives/SKILL.md delete mode 100644 skills/nps-feedback-for-prioritized-customer-experience-initiatives/SKILL.md.tmpl delete mode 100644 skills/nps-feedback-for-prioritized-customer-experience-initiatives/agents/openai.yaml delete mode 100644 skills/nps-feedback-for-prioritized-customer-experience-initiatives/productize.json delete mode 100644 skills/offbeat-question-generation-from-any-topic/SKILL.md delete mode 100644 skills/offbeat-question-generation-from-any-topic/SKILL.md.tmpl delete mode 100644 skills/offbeat-question-generation-from-any-topic/agents/openai.yaml delete mode 100644 skills/offbeat-question-generation-from-any-topic/productize.json delete mode 100644 skills/office-politics-with-machiavellian-strategy/SKILL.md delete mode 100644 skills/office-politics-with-machiavellian-strategy/SKILL.md.tmpl delete mode 100644 skills/office-politics-with-machiavellian-strategy/agents/openai.yaml delete mode 100644 skills/office-politics-with-machiavellian-strategy/productize.json delete mode 100644 skills/okr-planning-from-vision-statements/SKILL.md delete mode 100644 skills/okr-planning-from-vision-statements/SKILL.md.tmpl delete mode 100644 skills/okr-planning-from-vision-statements/agents/openai.yaml delete mode 100644 skills/okr-planning-from-vision-statements/productize.json delete mode 100644 skills/onboarding-flow-optimization-from-product-data-to-user-success/SKILL.md delete mode 100644 skills/onboarding-flow-optimization-from-product-data-to-user-success/SKILL.md.tmpl delete mode 100644 skills/onboarding-flow-optimization-from-product-data-to-user-success/agents/openai.yaml delete mode 100644 skills/onboarding-flow-optimization-from-product-data-to-user-success/productize.json delete mode 100644 skills/operate/SKILL.md delete mode 100644 skills/operate/SKILL.md.tmpl delete mode 100644 skills/operate/agents/openai.yaml delete mode 100644 skills/operate/productize.json delete mode 100644 skills/opportunity-solution-tree-from-input/SKILL.md delete mode 100644 skills/opportunity-solution-tree-from-input/SKILL.md.tmpl delete mode 100644 skills/opportunity-solution-tree-from-input/agents/openai.yaml delete mode 100644 skills/opportunity-solution-tree-from-input/productize.json delete mode 100644 skills/opportunity-solution-tree-from-input/references/pm-skills-main-merge.md delete mode 100644 skills/outcome-roadmap/SKILL.md delete mode 100644 skills/outcome-roadmap/SKILL.md.tmpl delete mode 100644 skills/outcome-roadmap/agents/openai.yaml delete mode 100644 skills/outcome-roadmap/productize.json delete mode 100644 skills/plg-growth-playbook/SKILL.md delete mode 100644 skills/plg-growth-playbook/SKILL.md.tmpl delete mode 100644 skills/plg-growth-playbook/agents/openai.yaml delete mode 100644 skills/plg-growth-playbook/productize.json delete mode 100644 skills/pm-context-and-design-constraints/SKILL.md delete mode 100644 skills/pm-context-and-design-constraints/SKILL.md.tmpl delete mode 100644 skills/pm-context-and-design-constraints/agents/openai.yaml delete mode 100644 skills/pm-context-and-design-constraints/productize.json delete mode 100644 skills/pmf-review/SKILL.md delete mode 100644 skills/pmf-review/SKILL.md.tmpl delete mode 100644 skills/pmf-review/agents/openai.yaml delete mode 100644 skills/pmf-review/productize.json delete mode 100644 skills/positioning-statements-from-competitive-analysis-and-value/SKILL.md delete mode 100644 skills/positioning-statements-from-competitive-analysis-and-value/SKILL.md.tmpl delete mode 100644 skills/positioning-statements-from-competitive-analysis-and-value/agents/openai.yaml delete mode 100644 skills/positioning-statements-from-competitive-analysis-and-value/productize.json delete mode 100644 skills/positioning-statements-from-competitive-analysis-and-value/references/pm-skills-main-merge.md delete mode 100644 skills/post-launch-feedback-into-v2-improvements-synthesis/SKILL.md delete mode 100644 skills/post-launch-feedback-into-v2-improvements-synthesis/SKILL.md.tmpl delete mode 100644 skills/post-launch-feedback-into-v2-improvements-synthesis/agents/openai.yaml delete mode 100644 skills/post-launch-feedback-into-v2-improvements-synthesis/productize.json delete mode 100644 skills/post-launch-feedback-loop/SKILL.md delete mode 100644 skills/post-launch-feedback-loop/SKILL.md.tmpl delete mode 100644 skills/post-launch-feedback-loop/agents/openai.yaml delete mode 100644 skills/post-launch-feedback-loop/productize.json delete mode 100644 skills/potential-hidden-agenda-identification/SKILL.md delete mode 100644 skills/potential-hidden-agenda-identification/SKILL.md.tmpl delete mode 100644 skills/potential-hidden-agenda-identification/agents/openai.yaml delete mode 100644 skills/potential-hidden-agenda-identification/productize.json delete mode 100644 skills/prds-from-industry-and-feature-specifications/SKILL.md delete mode 100644 skills/prds-from-industry-and-feature-specifications/SKILL.md.tmpl delete mode 100644 skills/prds-from-industry-and-feature-specifications/agents/openai.yaml delete mode 100644 skills/prds-from-industry-and-feature-specifications/productize.json delete mode 100644 skills/prds-from-product-information-and-assumptions/SKILL.md delete mode 100644 skills/prds-from-product-information-and-assumptions/SKILL.md.tmpl delete mode 100644 skills/prds-from-product-information-and-assumptions/agents/openai.yaml delete mode 100644 skills/prds-from-product-information-and-assumptions/productize.json delete mode 100644 skills/pre-mortem/SKILL.md delete mode 100644 skills/pre-mortem/SKILL.md.tmpl delete mode 100644 skills/pre-mortem/agents/openai.yaml delete mode 100644 skills/pre-mortem/productize.json delete mode 100644 skills/presentation-narratives-from-conversation-transcripts/SKILL.md delete mode 100644 skills/presentation-narratives-from-conversation-transcripts/SKILL.md.tmpl delete mode 100644 skills/presentation-narratives-from-conversation-transcripts/agents/openai.yaml delete mode 100644 skills/presentation-narratives-from-conversation-transcripts/productize.json delete mode 100644 skills/presentations-from-5-step-storytelling-framework/SKILL.md delete mode 100644 skills/presentations-from-5-step-storytelling-framework/SKILL.md.tmpl delete mode 100644 skills/presentations-from-5-step-storytelling-framework/agents/openai.yaml delete mode 100644 skills/presentations-from-5-step-storytelling-framework/productize.json delete mode 100644 skills/presentations-from-structured-content-and-context/SKILL.md delete mode 100644 skills/presentations-from-structured-content-and-context/SKILL.md.tmpl delete mode 100644 skills/presentations-from-structured-content-and-context/agents/openai.yaml delete mode 100644 skills/presentations-from-structured-content-and-context/productize.json delete mode 100644 skills/press-releases-from-product-vision-working-backwards/SKILL.md delete mode 100644 skills/press-releases-from-product-vision-working-backwards/SKILL.md.tmpl delete mode 100644 skills/press-releases-from-product-vision-working-backwards/agents/openai.yaml delete mode 100644 skills/press-releases-from-product-vision-working-backwards/productize.json delete mode 100644 skills/pricing-strategy/SKILL.md delete mode 100644 skills/pricing-strategy/SKILL.md.tmpl delete mode 100644 skills/pricing-strategy/agents/openai.yaml delete mode 100644 skills/pricing-strategy/productize.json delete mode 100644 skills/prioritization-frameworks/SKILL.md delete mode 100644 skills/prioritization-frameworks/SKILL.md.tmpl delete mode 100644 skills/prioritization-frameworks/agents/openai.yaml delete mode 100644 skills/prioritization-frameworks/productize.json delete mode 100644 skills/privacy-policy/SKILL.md delete mode 100644 skills/privacy-policy/SKILL.md.tmpl delete mode 100644 skills/privacy-policy/agents/openai.yaml delete mode 100644 skills/privacy-policy/productize.json delete mode 100644 skills/problem-framing-before-jumping-to-solutions/SKILL.md delete mode 100644 skills/problem-framing-before-jumping-to-solutions/SKILL.md.tmpl delete mode 100644 skills/problem-framing-before-jumping-to-solutions/agents/openai.yaml delete mode 100644 skills/problem-framing-before-jumping-to-solutions/productize.json delete mode 100644 skills/problem-statement-framing-from-conversation-transcript/SKILL.md delete mode 100644 skills/problem-statement-framing-from-conversation-transcript/SKILL.md.tmpl delete mode 100644 skills/problem-statement-framing-from-conversation-transcript/agents/openai.yaml delete mode 100644 skills/problem-statement-framing-from-conversation-transcript/productize.json delete mode 100644 skills/product-assumptions-from-core-strategy-inputs/SKILL.md delete mode 100644 skills/product-assumptions-from-core-strategy-inputs/SKILL.md.tmpl delete mode 100644 skills/product-assumptions-from-core-strategy-inputs/agents/openai.yaml delete mode 100644 skills/product-assumptions-from-core-strategy-inputs/productize.json delete mode 100644 skills/product-brainstorming/SKILL.md delete mode 100644 skills/product-brainstorming/SKILL.md.tmpl delete mode 100644 skills/product-brainstorming/agents/openai.yaml delete mode 100644 skills/product-brainstorming/productize.json delete mode 100644 skills/product-decision-analysis-from-anthropological-research/SKILL.md delete mode 100644 skills/product-decision-analysis-from-anthropological-research/SKILL.md.tmpl delete mode 100644 skills/product-decision-analysis-from-anthropological-research/agents/openai.yaml delete mode 100644 skills/product-decision-analysis-from-anthropological-research/productize.json delete mode 100644 skills/product-design-analysis-from-context-and-screenshots/SKILL.md delete mode 100644 skills/product-design-analysis-from-context-and-screenshots/SKILL.md.tmpl delete mode 100644 skills/product-design-analysis-from-context-and-screenshots/agents/openai.yaml delete mode 100644 skills/product-design-analysis-from-context-and-screenshots/productize.json delete mode 100644 skills/product-feature-impact-sizing-from-metrics-and-usage-data/SKILL.md delete mode 100644 skills/product-feature-impact-sizing-from-metrics-and-usage-data/SKILL.md.tmpl delete mode 100644 skills/product-feature-impact-sizing-from-metrics-and-usage-data/agents/openai.yaml delete mode 100644 skills/product-feature-impact-sizing-from-metrics-and-usage-data/productize.json delete mode 100644 skills/product-ideas-from-user-responses/SKILL.md delete mode 100644 skills/product-ideas-from-user-responses/SKILL.md.tmpl delete mode 100644 skills/product-ideas-from-user-responses/agents/openai.yaml delete mode 100644 skills/product-ideas-from-user-responses/productize.json delete mode 100644 skills/product-market-fit-cycle/SKILL.md delete mode 100644 skills/product-market-fit-cycle/SKILL.md.tmpl delete mode 100644 skills/product-market-fit-cycle/agents/openai.yaml delete mode 100644 skills/product-market-fit-cycle/productize.json delete mode 100644 skills/product-refinement-session-planning/SKILL.md delete mode 100644 skills/product-refinement-session-planning/SKILL.md.tmpl delete mode 100644 skills/product-refinement-session-planning/agents/openai.yaml delete mode 100644 skills/product-refinement-session-planning/productize.json delete mode 100644 skills/product-requirements-from-structured-analysis/SKILL.md delete mode 100644 skills/product-requirements-from-structured-analysis/SKILL.md.tmpl delete mode 100644 skills/product-requirements-from-structured-analysis/agents/openai.yaml delete mode 100644 skills/product-requirements-from-structured-analysis/productize.json delete mode 100644 skills/product-review/SKILL.md delete mode 100644 skills/product-review/SKILL.md.tmpl delete mode 100644 skills/product-review/agents/openai.yaml delete mode 100644 skills/product-review/productize.json delete mode 100644 skills/product-simplification-via-via-negativa-analysis/SKILL.md delete mode 100644 skills/product-simplification-via-via-negativa-analysis/SKILL.md.tmpl delete mode 100644 skills/product-simplification-via-via-negativa-analysis/agents/openai.yaml delete mode 100644 skills/product-simplification-via-via-negativa-analysis/productize.json delete mode 100644 skills/product-strategy-review-from-draft-documents/SKILL.md delete mode 100644 skills/product-strategy-review-from-draft-documents/SKILL.md.tmpl delete mode 100644 skills/product-strategy-review-from-draft-documents/agents/openai.yaml delete mode 100644 skills/product-strategy-review-from-draft-documents/productize.json delete mode 100644 skills/product-vision/SKILL.md delete mode 100644 skills/product-vision/SKILL.md.tmpl delete mode 100644 skills/product-vision/agents/openai.yaml delete mode 100644 skills/product-vision/productize.json rename {.cursor/skills => skills}/productize-0-1/SKILL.md (100%) rename {plugins/productize-venture-0-1/skills => skills}/productize-0-1/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-aarrr-growth-diagnostics/SKILL.md (100%) rename {plugins/productize-growth/skills => skills}/productize-aarrr-growth-diagnostics/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-ab-test-analysis/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-ab-test-analysis/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-acceptance-criteria-for-ui/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-acceptance-criteria-for-ui/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-accessibility-review/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-accessibility-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-actionable-customer-interview-guides-from-research-topics/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-actionable-customer-interview-guides-from-research-topics/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-actionable-job-stories-from-interview-transcripts/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-actionable-job-stories-from-interview-transcripts/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-actionable-product-improvements-from-survey-responses/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-actionable-product-improvements-from-survey-responses/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-actionable-research-briefs-from-problem-statements-and/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-actionable-research-briefs-from-problem-statements-and/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-actionable-user-profiles-with-tasks-and-constraints-from/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-actionable-user-profiles-with-tasks-and-constraints-from/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-actionable-user-research-decisions-from-project-insights/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-actionable-user-research-decisions-from-project-insights/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-adaptive-planning-from-scenarios-to-strategic-actions/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-adaptive-planning-from-scenarios-to-strategic-actions/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-aging-research-insight-validation-before-reusing/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-aging-research-insight-validation-before-reusing/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-ai-product-evaluation-from-recommendation-canvas-framework/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-ai-product-evaluation-from-recommendation-canvas-framework/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-analyze-feature-requests/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-analyze-feature-requests/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-analyze/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-analyze/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-app-aha-moment-identification-from-user-data-and-app/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-app-aha-moment-identification-from-user-data-and-app/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-app-design-from-project-requirements/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-app-design-from-project-requirements/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-autoplan/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-autoplan/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-backend-design/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-backend-design/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-beachhead-segment/SKILL.md (100%) rename {plugins/productize-venture-0-1/skills => skills}/productize-beachhead-segment/agents/openai.yaml (100%) create mode 100644 skills/productize-behavioral-guidelines/SKILL.md rename {plugins/productize-design/skills => skills}/productize-behavioral-guidelines/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-brainstorm/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-brainstorm/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-brand-archetype-strategy/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-brand-archetype-strategy/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-brand-equity-diagnostics/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-brand-equity-diagnostics/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-bug-prioritization-against-work-in-progress/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-bug-prioritization-against-work-in-progress/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-build-dashboard/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-build-dashboard/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-business-flywheel-from-company-successes-and-failures/SKILL.md (100%) rename {plugins/productize-business-model/skills => skills}/productize-business-flywheel-from-company-successes-and-failures/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-business-model-blindspots/SKILL.md (100%) rename {plugins/productize-business-model/skills => skills}/productize-business-model-blindspots/agents/openai.yaml (100%) rename {.claude/skills/business-model-blindspots => skills/productize-business-model-blindspots}/references/diagnostic-questions.md (100%) rename {.claude/skills/business-model-blindspots => skills/productize-business-model-blindspots}/references/output-format.md (100%) rename {.cursor/skills => skills}/productize-business-model-design/SKILL.md (100%) rename {plugins/productize-business-model/skills => skills}/productize-business-model-design/agents/openai.yaml (100%) rename {.claude/skills/business-model-design => skills/productize-business-model-design}/assets/lean-business-model-canvas.html (100%) rename {.claude/skills/business-model-design => skills/productize-business-model-design}/assets/platform-business-model-canvas.html (100%) rename {.claude/skills/business-model-design => skills/productize-business-model-design}/assets/standard-business-model-canvas.html (100%) rename {.claude/skills/business-model-design => skills/productize-business-model-design}/references/business-model-output-rules.md (100%) rename {.claude/skills/business-model-design => skills/productize-business-model-design}/references/canvas-selection.md (100%) rename {.claude/skills/business-model-design => skills/productize-business-model-design}/references/canvas-templates.md (100%) rename {.claude/skills/business-model-design => skills/productize-business-model-design}/references/pm-skills-main-merge.md (100%) rename {.cursor/skills => skills}/productize-business-strategy-creation-from-expert-strategic-thinking/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-business-strategy-creation-from-expert-strategic-thinking/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-capital-structure-financing/SKILL.md (100%) rename {plugins/productize-finance/skills => skills}/productize-capital-structure-financing/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-challenging-meeting-with-stakeholders/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-challenging-meeting-with-stakeholders/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-churn-reduction-from-customer-data-and-exit-survey-analysis/SKILL.md (100%) rename {plugins/productize-growth/skills => skills}/productize-churn-reduction-from-customer-data-and-exit-survey-analysis/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-clustered-jtbd-forces-from-interview-data/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-clustered-jtbd-forces-from-interview-data/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-cohort-analysis/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-cohort-analysis/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-comms-review/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-comms-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-competitive-advantage-diagnostics-and-moat-strategy/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-competitive-advantage-diagnostics-and-moat-strategy/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-competitive-analysis-to-winning-positioning-strategy/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-competitive-analysis-to-winning-positioning-strategy/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-competitive-brief/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-competitive-brief/agents/openai.yaml (100%) rename {.claude/skills/competitive-brief => skills/productize-competitive-brief}/references/pm-skills-main-merge.md (100%) rename {.cursor/skills => skills}/productize-competitive-parity-and-strategic-differentiation/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-competitive-parity-and-strategic-differentiation/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-complex-problem-structuring-into-actionable-recommendations/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-complex-problem-structuring-into-actionable-recommendations/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-comprehensive-use-cases-from-user-input-for-product-strategy/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-comprehensive-use-cases-from-user-input-for-product-strategy/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-conflicting-stakeholder-requirements-to-balanced-design/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-conflicting-stakeholder-requirements-to-balanced-design/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-conversation-summaries-from-meeting-transcripts/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-conversation-summaries-from-meeting-transcripts/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-create-viz/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-create-viz/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-creative-solution-generation-from-de-bono-s-lateral-thinking/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-creative-solution-generation-from-de-bono-s-lateral-thinking/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-creative-solution-generation-from-metaphorical-thinking/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-creative-solution-generation-from-metaphorical-thinking/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-crisis-communication-plan-from-outage-details-and-company/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-crisis-communication-plan-from-outage-details-and-company/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-critical-flaws-in-product-requirements-tough-and-unreasonable/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-critical-flaws-in-product-requirements-tough-and-unreasonable/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-ctas-from-copywriting-strategies/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-ctas-from-copywriting-strategies/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-customer-insights-extraction-from-interview-transcript-using/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-customer-insights-extraction-from-interview-transcript-using/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-customer-journey-map-based-on-user-behavior-data/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-customer-journey-map-based-on-user-behavior-data/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-data-context-extractor/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-data-context-extractor/agents/openai.yaml (100%) rename {.claude/skills/data-context-extractor => skills/productize-data-context-extractor}/references/domain-template.md (100%) rename {.claude/skills/data-context-extractor => skills/productize-data-context-extractor}/references/example-generated-skill.md (100%) rename {.claude/skills/data-context-extractor => skills/productize-data-context-extractor}/references/skill-template.md (100%) rename {.claude/skills/data-context-extractor => skills/productize-data-context-extractor}/references/sql-dialects.md (100%) rename {.claude/skills/data-context-extractor => skills/productize-data-context-extractor}/references/tables/README.md (100%) rename {.claude/skills/data-context-extractor => skills/productize-data-context-extractor}/scripts/package_data_skill.py (100%) rename {.cursor/skills => skills}/productize-data-driven-research-plans-from-leadership-intuition/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-data-driven-research-plans-from-leadership-intuition/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-data-visualization/SKILL.md (100%) rename {plugins/productize-all/skills => skills}/productize-data-visualization/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-decision-making-with-the-gut-check-protocol/SKILL.md (100%) rename {plugins/productize-decision-making/skills => skills}/productize-decision-making-with-the-gut-check-protocol/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-decision-reversibility-classification-from-first-principles/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-decision-reversibility-classification-from-first-principles/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-decision-rights-using-davci/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-decision-rights-using-davci/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-defining-the-niche-from-user-input/SKILL.md (100%) rename {plugins/productize-venture-0-1/skills => skills}/productize-defining-the-niche-from-user-input/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-demo-narratives-showing-user-goals/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-demo-narratives-showing-user-goals/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-design-critique/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-design-critique/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-design-handoff/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-design-handoff/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-design-review/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-design-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-design-system/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-design-system/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-detailed-project-plans-from-project-briefs/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-detailed-project-plans-from-project-briefs/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-difficult-conversation-script-5-step-framework/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-difficult-conversation-script-5-step-framework/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-disruptive-strategy-generation-from-what-if-questions/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-disruptive-strategy-generation-from-what-if-questions/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-docs/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-docs/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-dogfood/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-dogfood/agents/openai.yaml (100%) rename {.claude/skills/dogfood => skills/productize-dogfood}/references/issue-taxonomy.md (100%) rename {.claude/skills/dogfood => skills/productize-dogfood}/templates/dogfood-report-template.md (100%) rename {.cursor/skills => skills}/productize-draft-nda/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-draft-nda/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-dual-mode-ai-coding-assistant-staff-eng-intern/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-dual-mode-ai-coding-assistant-staff-eng-intern/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-dx-review/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-dx-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-easy-signal-identification-from-product-assumption/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-easy-signal-identification-from-product-assumption/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-effective-customer-interview-guides-for-any-topic/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-effective-customer-interview-guides-for-any-topic/agents/openai.yaml (100%) rename {.claude/skills/effective-customer-interview-guides-for-any-topic => skills/productize-effective-customer-interview-guides-for-any-topic}/references/pm-skills-main-merge.md (100%) rename {.cursor/skills => skills}/productize-empathy-maps/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-empathy-maps/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-eng-review/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-eng-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-engineering-problem-solving-and-solution-structuring/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-engineering-problem-solving-and-solution-structuring/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-event-tracking-schemas-from-ui-and-metrics-requirements/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-event-tracking-schemas-from-ui-and-metrics-requirements/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-exec-feedback-without-context-to-actionable-design-requirements/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-exec-feedback-without-context-to-actionable-design-requirements/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-executive-and-update-review/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-executive-and-update-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-executive-decks-from-quick-dirty-test-analysis/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-executive-decks-from-quick-dirty-test-analysis/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-explore-data/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-explore-data/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-feature-impact-models-from-kpis-and-assumptions/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-feature-impact-models-from-kpis-and-assumptions/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-feature-results-analysis-from-draft-to-final-report/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-feature-results-analysis-from-draft-to-final-report/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-features-reframing-and-projects-shape-up/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-features-reframing-and-projects-shape-up/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-finance-modeling-kernel/SKILL.md (100%) rename {plugins/productize-finance/skills => skills}/productize-finance-modeling-kernel/agents/openai.yaml (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/apv.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/bond_math.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/cap_table.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/capital_structure.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/capm.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/convertible_notes.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/dcf.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/market_context.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/option_pools.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/preferred_stock.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/returns.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/risk.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/safes.py (100%) rename skills/{finance-modeling-kernel => productize-finance-modeling-kernel}/finance-modeling-kernel/tests/test_acceptance.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/time_value.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/validation.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/valuation.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/vc_method.py (100%) rename {.claude/skills/finance-modeling-kernel => skills/productize-finance-modeling-kernel}/finance-modeling-kernel/wacc.py (100%) rename {.cursor/skills => skills}/productize-financial-markets-context/SKILL.md (100%) rename {plugins/productize-finance/skills => skills}/productize-financial-markets-context/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-fragmented-user-research-synthesis-into-coherent-insights/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-fragmented-user-research-synthesis-into-coherent-insights/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-framework-application-to-product-challenges-from-user-input/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-framework-application-to-product-challenges-from-user-input/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-frontend-design/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-frontend-design/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-future-product-opportunities-from-market-inflection-points/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-future-product-opportunities-from-market-inflection-points/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-group-decision-making-quality-review/SKILL.md (100%) rename {plugins/productize-decision-making/skills => skills}/productize-group-decision-making-quality-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-grow/SKILL.md (100%) rename {plugins/productize-growth/skills => skills}/productize-grow/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-growth-loops/SKILL.md (100%) rename {plugins/productize-growth/skills => skills}/productize-growth-loops/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-growth-project-generation-with-pioneer-migrator-settler/SKILL.md (100%) rename {plugins/productize-growth/skills => skills}/productize-growth-project-generation-with-pioneer-migrator-settler/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-growth-strategy-synthesis-from-user-inputs/SKILL.md (100%) rename {plugins/productize-growth/skills => skills}/productize-growth-strategy-synthesis-from-user-inputs/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-gtm-motions/SKILL.md (100%) rename {plugins/productize-growth/skills => skills}/productize-gtm-motions/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-gtm-strategy/SKILL.md (100%) rename {plugins/productize-growth/skills => skills}/productize-gtm-strategy/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-ideal-customer-profile-icp-representative-for-x-product/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-ideal-customer-profile-icp-representative-for-x-product/agents/openai.yaml (100%) rename {.claude/skills/ideal-customer-profile-icp-representative-for-x-product => skills/productize-ideal-customer-profile-icp-representative-for-x-product}/references/pm-skills-main-merge.md (100%) rename {.cursor/skills => skills}/productize-ideas-for-affordances-and-signifiers-based-on-a-design-problem/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-ideas-for-affordances-and-signifiers-based-on-a-design-problem/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-implementation-notes/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-implementation-notes/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-industry-trend-strategy/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-industry-trend-strategy/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-influence-strategies-from-cialdini-s-7-principles/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-influence-strategies-from-cialdini-s-7-principles/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-innovation-decision-making-heuristics/SKILL.md (100%) rename {plugins/productize-decision-making/skills => skills}/productize-innovation-decision-making-heuristics/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-innovative-idea-generation-from-project-parameters-and/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-innovative-idea-generation-from-project-parameters-and/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-innovative-idea-generation-from-structured-brainstorming/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-innovative-idea-generation-from-structured-brainstorming/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-innovative-product-ideas-from-structured-brainstorming/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-innovative-product-ideas-from-structured-brainstorming/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-interactive-intake-for-ost-inputs/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-interactive-intake-for-ost-inputs/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-lean-canvas/SKILL.md (100%) rename {plugins/productize-business-model/skills => skills}/productize-lean-canvas/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-limit-based-product-strategy-from-problem-to-execution-plan/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-limit-based-product-strategy-from-problem-to-execution-plan/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-low-frequency-to-power-user-transition-strategy/SKILL.md (100%) rename {plugins/productize-growth/skills => skills}/productize-low-frequency-to-power-user-transition-strategy/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-managerial-finance-dcf/SKILL.md (100%) rename {plugins/productize-finance/skills => skills}/productize-managerial-finance-dcf/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-map-power-dynamics-before-meetings/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-map-power-dynamics-before-meetings/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-market-opportunities-from-jobs-to-be-done-market-canvas/SKILL.md (100%) rename {plugins/productize-venture-0-1/skills => skills}/productize-market-opportunities-from-jobs-to-be-done-market-canvas/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-market-opportunity/SKILL.md (100%) rename {plugins/productize-venture-0-1/skills => skills}/productize-market-opportunity/agents/openai.yaml (100%) rename {.claude/skills/market-opportunity => skills/productize-market-opportunity}/references/canonical-canvases.md (100%) rename {.claude/skills/market-opportunity => skills/productize-market-opportunity}/references/output-formats.md (100%) rename {.claude/skills/market-opportunity => skills/productize-market-opportunity}/references/rating-and-decision-rules.md (100%) rename {.cursor/skills => skills}/productize-market-orientation-audit/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-market-orientation-audit/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-market-requirements-from-strategic-market-inputs/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-market-requirements-from-strategic-market-inputs/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-market-sizing/SKILL.md (100%) rename {plugins/productize-venture-0-1/skills => skills}/productize-market-sizing/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-mece-analysis-and-logical-tree-from-list-items/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-mece-analysis-and-logical-tree-from-list-items/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-meeting-agendas-from-meeting-descriptions/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-meeting-agendas-from-meeting-descriptions/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-meeting-outcome-planning-and-stakeholder-alignment/SKILL.md (100%) rename {plugins/productize-decision-making/skills => skills}/productize-meeting-outcome-planning-and-stakeholder-alignment/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-meeting-summaries-from-meeting-transcript-ideas-framework/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-meeting-summaries-from-meeting-transcript-ideas-framework/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-message-framing-and-comms-plan-designer/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-message-framing-and-comms-plan-designer/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-metric-drops-diagnosis-with-rigorous-stepwise-decomposition/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-metric-drops-diagnosis-with-rigorous-stepwise-decomposition/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-metrics-review/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-metrics-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-monetization-strategy/SKILL.md (100%) rename {plugins/productize-business-model/skills => skills}/productize-monetization-strategy/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-multi-step-workflow-optimization/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-multi-step-workflow-optimization/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-multiple-interface-descriptions-from-a-single-image/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-multiple-interface-descriptions-from-a-single-image/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-netmba-competitor-analysis/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-netmba-competitor-analysis/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-north-star-metric/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-north-star-metric/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-now-next-later-vision-roadmap-from-interview-synthesis/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-now-next-later-vision-roadmap-from-interview-synthesis/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-nps-feedback-for-prioritized-customer-experience-initiatives/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-nps-feedback-for-prioritized-customer-experience-initiatives/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-offbeat-question-generation-from-any-topic/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-offbeat-question-generation-from-any-topic/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-office-politics-with-machiavellian-strategy/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-office-politics-with-machiavellian-strategy/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-okr-planning-from-vision-statements/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-okr-planning-from-vision-statements/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-onboarding-flow-optimization-from-product-data-to-user-success/SKILL.md (100%) rename {plugins/productize-growth/skills => skills}/productize-onboarding-flow-optimization-from-product-data-to-user-success/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-operate/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-operate/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-opportunity-solution-tree-from-input/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-opportunity-solution-tree-from-input/agents/openai.yaml (100%) rename {.claude/skills/opportunity-solution-tree-from-input => skills/productize-opportunity-solution-tree-from-input}/references/pm-skills-main-merge.md (100%) rename {.cursor/skills => skills}/productize-outcome-roadmap/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-outcome-roadmap/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-plg-growth-playbook/SKILL.md (100%) rename {plugins/productize-growth/skills => skills}/productize-plg-growth-playbook/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-pm-context-and-design-constraints/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-pm-context-and-design-constraints/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-pmf-review/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-pmf-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-positioning-statements-from-competitive-analysis-and-value/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-positioning-statements-from-competitive-analysis-and-value/agents/openai.yaml (100%) rename {.claude/skills/positioning-statements-from-competitive-analysis-and-value => skills/productize-positioning-statements-from-competitive-analysis-and-value}/references/pm-skills-main-merge.md (100%) rename {.cursor/skills => skills}/productize-post-launch-feedback-into-v2-improvements-synthesis/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-post-launch-feedback-into-v2-improvements-synthesis/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-post-launch-feedback-loop/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-post-launch-feedback-loop/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-potential-hidden-agenda-identification/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-potential-hidden-agenda-identification/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-prds-from-industry-and-feature-specifications/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-prds-from-industry-and-feature-specifications/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-prds-from-product-information-and-assumptions/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-prds-from-product-information-and-assumptions/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-pre-mortem/SKILL.md (100%) rename {plugins/productize-decision-making/skills => skills}/productize-pre-mortem/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-presentation-narratives-from-conversation-transcripts/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-presentation-narratives-from-conversation-transcripts/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-presentations-from-5-step-storytelling-framework/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-presentations-from-5-step-storytelling-framework/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-presentations-from-structured-content-and-context/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-presentations-from-structured-content-and-context/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-press-releases-from-product-vision-working-backwards/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-press-releases-from-product-vision-working-backwards/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-pricing-strategy/SKILL.md (100%) rename {plugins/productize-business-model/skills => skills}/productize-pricing-strategy/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-prioritization-frameworks/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-prioritization-frameworks/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-privacy-policy/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-privacy-policy/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-problem-framing-before-jumping-to-solutions/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-problem-framing-before-jumping-to-solutions/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-problem-statement-framing-from-conversation-transcript/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-problem-statement-framing-from-conversation-transcript/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-assumptions-from-core-strategy-inputs/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-product-assumptions-from-core-strategy-inputs/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-brainstorming/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-product-brainstorming/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-decision-analysis-from-anthropological-research/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-product-decision-analysis-from-anthropological-research/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-design-analysis-from-context-and-screenshots/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-product-design-analysis-from-context-and-screenshots/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-feature-impact-sizing-from-metrics-and-usage-data/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-product-feature-impact-sizing-from-metrics-and-usage-data/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-ideas-from-user-responses/SKILL.md (100%) rename {plugins/productize-venture-0-1/skills => skills}/productize-product-ideas-from-user-responses/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-market-fit-cycle/SKILL.md (100%) rename {plugins/productize-growth/skills => skills}/productize-product-market-fit-cycle/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-refinement-session-planning/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-product-refinement-session-planning/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-requirements-from-structured-analysis/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-product-requirements-from-structured-analysis/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-review/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-product-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-simplification-via-via-negativa-analysis/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-product-simplification-via-via-negativa-analysis/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-strategy-review-from-draft-documents/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-product-strategy-review-from-draft-documents/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-product-vision/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-product-vision/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-proto-persona-profiles-from-user-research-and-market-data/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-proto-persona-profiles-from-user-research-and-market-data/agents/openai.yaml (100%) rename {.claude/skills/proto-persona-profiles-from-user-research-and-market-data => skills/productize-proto-persona-profiles-from-user-research-and-market-data}/references/pm-skills-main-merge.md (100%) rename {.cursor/skills => skills}/productize-prototype-creation-from-image-descriptions-and-app-info/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-prototype-creation-from-image-descriptions-and-app-info/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-pyramid-structure-optimization-from-complex-text/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-pyramid-structure-optimization-from-complex-text/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-qa/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-qa/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-raw-interview-transcript-cleanup/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-raw-interview-transcript-cleanup/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-realistic-jtbd-interview-transcripts/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-realistic-jtbd-interview-transcripts/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-reinforcing-sequence-from-unstructured-items/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-reinforcing-sequence-from-unstructured-items/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-release-notes/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-release-notes/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-release/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-release/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-remote-miro-workshops-from-transcripts-and-specs/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-remote-miro-workshops-from-transcripts-and-specs/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-requirements-prioritization-with-p0-p1-p2-framework/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-requirements-prioritization-with-p0-p1-p2-framework/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-research-into-durable-competitive-moats/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-research-into-durable-competitive-moats/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-risk-return-cost-of-capital/SKILL.md (100%) rename {plugins/productize-finance/skills => skills}/productize-risk-return-cost-of-capital/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-risky-assumption-prioritization-for-rapid-validation/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-risky-assumption-prioritization-for-rapid-validation/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-roadmap-update/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-roadmap-update/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-robust-experiment-design-from-goals-and-systems/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-robust-experiment-design-from-goals-and-systems/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-role-identity-decision-making-map/SKILL.md (100%) rename {plugins/productize-decision-making/skills => skills}/productize-role-identity-decision-making-map/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-root-cause-and-consequence-analysis-from-a-question/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-root-cause-and-consequence-analysis-from-a-question/agents/openai.yaml (100%) create mode 100644 skills/productize-runtime/SKILL.md create mode 100644 skills/productize-runtime/references/cli-reference.md create mode 100644 skills/productize-runtime/references/config-reference.md create mode 100644 skills/productize-runtime/references/skills-reference.md create mode 100644 skills/productize-runtime/references/workflow-guide.md rename {.cursor/skills => skills}/productize-scope-defense-using-time-cost-tradeoff-analysis/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-scope-defense-using-time-cost-tradeoff-analysis/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-sketch-descriptions-for-wireframes-from-product-ideas/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-sketch-descriptions-for-wireframes-from-product-ideas/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-skimmable-writing-transformation/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-skimmable-writing-transformation/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-slide-decks-from-problem-statements-and-context/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-slide-decks-from-problem-statements-and-context/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-solution-anti-patterns-from-customer-problem-analysis/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-solution-anti-patterns-from-customer-problem-analysis/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-solution-design-for-edge-cases-in-product-development/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-solution-design-for-edge-cases-in-product-development/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-spec-writing/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-spec-writing/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-sprint-planning/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-sprint-planning/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-sql-queries/SKILL.md (100%) rename {plugins/productize-all/skills => skills}/productize-sql-queries/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-sql-query-from-requirements-and-data-tables/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-sql-query-from-requirements-and-data-tables/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-stakeholder-brief-clarification-and-problem-definition/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-stakeholder-brief-clarification-and-problem-definition/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-stakeholder-decision-making-using-toc-thinking-process/SKILL.md (100%) rename {plugins/productize-decision-making/skills => skills}/productize-stakeholder-decision-making-using-toc-thinking-process/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-stakeholder-moo-objections-and-product-derailment-risks/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-stakeholder-moo-objections-and-product-derailment-risks/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-stakeholder-power-interest-and-influence-map/SKILL.md (100%) rename {plugins/productize-decision-making/skills => skills}/productize-stakeholder-power-interest-and-influence-map/agents/openai.yaml (100%) rename {.claude/skills/stakeholder-power-interest-and-influence-map => skills/productize-stakeholder-power-interest-and-influence-map}/references/pm-skills-main-merge.md (100%) rename {.cursor/skills => skills}/productize-stakeholder-risk-review-for-a-feature-or-prd/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-stakeholder-risk-review-for-a-feature-or-prd/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-stakeholder-update/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-stakeholder-update/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-startup-canvas/SKILL.md (100%) rename {plugins/productize-venture-0-1/skills => skills}/productize-startup-canvas/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-statistical-analysis/SKILL.md (100%) rename {plugins/productize-all/skills => skills}/productize-statistical-analysis/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-strategic-crux-diagnosis-and-strategy-design/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-strategic-crux-diagnosis-and-strategy-design/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-strategic-decision-making-quality-review/SKILL.md (100%) rename {plugins/productize-decision-making/skills => skills}/productize-strategic-decision-making-quality-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-strategic-moves-from-swot-pairings/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-strategic-moves-from-swot-pairings/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-strategic-presentation-planning-from-topic-audience-and-time/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-strategic-presentation-planning-from-topic-audience-and-time/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-strategy-curve-blue-ocean/SKILL.md (100%) rename {plugins/productize-marketing/skills => skills}/productize-strategy-curve-blue-ocean/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-strategy-kernel-extraction-from-context/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-strategy-kernel-extraction-from-context/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-strategy-to-execution-bridge-for-ux-decisions/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-strategy-to-execution-bridge-for-ux-decisions/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-structured-decision-journals-from-decisions-and-context/SKILL.md (100%) rename {plugins/productize-decision-making/skills => skills}/productize-structured-decision-journals-from-decisions-and-context/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-structured-insight-extraction-from-conversation-transcripts/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-structured-insight-extraction-from-conversation-transcripts/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-structured-interview-notes-from-transcript-using-flexible/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-structured-interview-notes-from-transcript-using-flexible/agents/openai.yaml (100%) rename {.claude/skills/structured-interview-notes-from-transcript-using-flexible => skills/productize-structured-interview-notes-from-transcript-using-flexible}/references/pm-skills-main-merge.md (100%) rename {.cursor/skills => skills}/productize-structured-json-descriptions-from-ui-screenshots/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-structured-json-descriptions-from-ui-screenshots/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-structured-product-hypotheses-from-product-problems/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-structured-product-hypotheses-from-product-problems/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-structured-product-strategy-from-product-context/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-structured-product-strategy-from-product-context/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-structured-requirements-from-conversation-transcripts/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-structured-requirements-from-conversation-transcripts/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-structured-requirements-from-design-assets/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-structured-requirements-from-design-assets/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-success-metrics-for-design-decisions/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-success-metrics-for-design-decisions/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-support-tickets-as-actionable-product-improvements/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-support-tickets-as-actionable-product-improvements/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-sustainable-business-model/SKILL.md (100%) rename {plugins/productize-business-model/skills => skills}/productize-sustainable-business-model/agents/openai.yaml (100%) rename {.claude/skills/sustainable-business-model => skills/productize-sustainable-business-model}/references/output-format.md (100%) rename {.claude/skills/sustainable-business-model => skills/productize-sustainable-business-model}/references/pattern-groups.md (100%) rename {.cursor/skills => skills}/productize-synthesize-research/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-synthesize-research/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-systematic-debugging/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-systematic-debugging/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-target-opportunity-selection-from-ost/SKILL.md (100%) rename {plugins/productize-discovery/skills => skills}/productize-target-opportunity-selection-from-ost/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-task-list-optimization-and-contingency-based-project-planning/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-task-list-optimization-and-contingency-based-project-planning/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-task-specific-product-strategy-design/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-task-specific-product-strategy-design/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-tdd/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-tdd/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-technical-architecture-brief-from-product-requirements-doc/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-technical-architecture-brief-from-product-requirements-doc/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-technical-translation-and-stakeholder-communication/SKILL.md (100%) rename {plugins/productize-stakeholder-communication/skills => skills}/productize-technical-translation-and-stakeholder-communication/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-test-scenarios/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-test-scenarios/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-thesis-review/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-thesis-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-trade-off-analysis-from-feature-priority-and-effort-data/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-trade-off-analysis-from-feature-priority-and-effort-data/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-user-stories-from-initiative-requirements/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-user-stories-from-initiative-requirements/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements/agents/openai.yaml (100%) rename {.claude/skills/user-stories-with-gherkin-acceptance-criteria-from-requirements => skills/productize-user-stories-with-gherkin-acceptance-criteria-from-requirements}/references/pm-skills-main-merge.md (100%) rename {.cursor/skills => skills}/productize-ux-edge-cases-from-product-briefs/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-ux-edge-cases-from-product-briefs/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-ux-terminology-improvements-in-product-requirements/SKILL.md (100%) rename {plugins/productize-design/skills => skills}/productize-ux-terminology-improvements-in-product-requirements/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-validate-data/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-validate-data/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-valuation-and-deal-pricing/SKILL.md (100%) rename {plugins/productize-finance/skills => skills}/productize-valuation-and-deal-pricing/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-value-chain-mapping-from-end-user-needs-to-core-value/SKILL.md (100%) rename {plugins/productize-strategy/skills => skills}/productize-value-chain-mapping-from-end-user-needs-to-core-value/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-venture-capital-deal-modeling/SKILL.md (100%) rename {plugins/productize-finance/skills => skills}/productize-venture-capital-deal-modeling/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-verification/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-verification/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-visual-decision-making-review/SKILL.md (100%) rename {plugins/productize-decision-making/skills => skills}/productize-visual-decision-making-review/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-workshop-activity-design-from-problem-and-participant/SKILL.md (100%) rename {plugins/productize-operations/skills => skills}/productize-workshop-activity-design-from-problem-and-participant/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-write-query/SKILL.md (100%) rename {plugins/productize-analytics/skills => skills}/productize-write-query/agents/openai.yaml (100%) rename {.claude/skills/write-query => skills/productize-write-query}/references/pm-skills-main-merge.md (100%) rename {.cursor/skills => skills}/productize-write-spec/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-write-spec/agents/openai.yaml (100%) rename {.claude/skills/write-spec => skills/productize-write-spec}/references/pm-skills-main-merge.md (100%) rename {.cursor/skills => skills}/productize-writing-plans/SKILL.md (100%) rename {plugins/productize-ai-execution/skills => skills}/productize-writing-plans/agents/openai.yaml (100%) rename {.cursor/skills => skills}/productize-wwas/SKILL.md (100%) rename {plugins/productize-delivery/skills => skills}/productize-wwas/agents/openai.yaml (100%) rename {.claude/skills => skills}/productize/SKILL.md (100%) rename {agents => skills/productize/agents}/openai.yaml (100%) delete mode 100644 skills/proto-persona-profiles-from-user-research-and-market-data/SKILL.md delete mode 100644 skills/proto-persona-profiles-from-user-research-and-market-data/SKILL.md.tmpl delete mode 100644 skills/proto-persona-profiles-from-user-research-and-market-data/agents/openai.yaml delete mode 100644 skills/proto-persona-profiles-from-user-research-and-market-data/productize.json delete mode 100644 skills/proto-persona-profiles-from-user-research-and-market-data/references/pm-skills-main-merge.md delete mode 100644 skills/prototype-creation-from-image-descriptions-and-app-info/SKILL.md delete mode 100644 skills/prototype-creation-from-image-descriptions-and-app-info/SKILL.md.tmpl delete mode 100644 skills/prototype-creation-from-image-descriptions-and-app-info/agents/openai.yaml delete mode 100644 skills/prototype-creation-from-image-descriptions-and-app-info/productize.json delete mode 100644 skills/pyramid-structure-optimization-from-complex-text/SKILL.md delete mode 100644 skills/pyramid-structure-optimization-from-complex-text/SKILL.md.tmpl delete mode 100644 skills/pyramid-structure-optimization-from-complex-text/agents/openai.yaml delete mode 100644 skills/pyramid-structure-optimization-from-complex-text/productize.json delete mode 100644 skills/qa/SKILL.md delete mode 100644 skills/qa/SKILL.md.tmpl delete mode 100644 skills/qa/agents/openai.yaml delete mode 100644 skills/qa/productize.json delete mode 100644 skills/raw-interview-transcript-cleanup/SKILL.md delete mode 100644 skills/raw-interview-transcript-cleanup/SKILL.md.tmpl delete mode 100644 skills/raw-interview-transcript-cleanup/agents/openai.yaml delete mode 100644 skills/raw-interview-transcript-cleanup/productize.json delete mode 100644 skills/realistic-jtbd-interview-transcripts/SKILL.md delete mode 100644 skills/realistic-jtbd-interview-transcripts/SKILL.md.tmpl delete mode 100644 skills/realistic-jtbd-interview-transcripts/agents/openai.yaml delete mode 100644 skills/realistic-jtbd-interview-transcripts/productize.json delete mode 100644 skills/reinforcing-sequence-from-unstructured-items/SKILL.md delete mode 100644 skills/reinforcing-sequence-from-unstructured-items/SKILL.md.tmpl delete mode 100644 skills/reinforcing-sequence-from-unstructured-items/agents/openai.yaml delete mode 100644 skills/reinforcing-sequence-from-unstructured-items/productize.json delete mode 100644 skills/release-notes/SKILL.md delete mode 100644 skills/release-notes/SKILL.md.tmpl delete mode 100644 skills/release-notes/agents/openai.yaml delete mode 100644 skills/release-notes/productize.json delete mode 100644 skills/release/SKILL.md delete mode 100644 skills/release/SKILL.md.tmpl delete mode 100644 skills/release/agents/openai.yaml delete mode 100644 skills/release/productize.json delete mode 100644 skills/remote-miro-workshops-from-transcripts-and-specs/SKILL.md delete mode 100644 skills/remote-miro-workshops-from-transcripts-and-specs/SKILL.md.tmpl delete mode 100644 skills/remote-miro-workshops-from-transcripts-and-specs/agents/openai.yaml delete mode 100644 skills/remote-miro-workshops-from-transcripts-and-specs/productize.json delete mode 100644 skills/requirements-prioritization-with-p0-p1-p2-framework/SKILL.md delete mode 100644 skills/requirements-prioritization-with-p0-p1-p2-framework/SKILL.md.tmpl delete mode 100644 skills/requirements-prioritization-with-p0-p1-p2-framework/agents/openai.yaml delete mode 100644 skills/requirements-prioritization-with-p0-p1-p2-framework/productize.json delete mode 100644 skills/research-into-durable-competitive-moats/SKILL.md delete mode 100644 skills/research-into-durable-competitive-moats/SKILL.md.tmpl delete mode 100644 skills/research-into-durable-competitive-moats/agents/openai.yaml delete mode 100644 skills/research-into-durable-competitive-moats/productize.json create mode 100644 skills/review-round/SKILL.md create mode 100644 skills/review-round/references/issue-template.md create mode 100644 skills/review-round/references/review-criteria.md delete mode 100644 skills/risk-return-cost-of-capital/SKILL.md delete mode 100644 skills/risk-return-cost-of-capital/SKILL.md.tmpl delete mode 100644 skills/risk-return-cost-of-capital/agents/openai.yaml delete mode 100644 skills/risk-return-cost-of-capital/productize.json delete mode 100644 skills/risky-assumption-prioritization-for-rapid-validation/SKILL.md delete mode 100644 skills/risky-assumption-prioritization-for-rapid-validation/SKILL.md.tmpl delete mode 100644 skills/risky-assumption-prioritization-for-rapid-validation/agents/openai.yaml delete mode 100644 skills/risky-assumption-prioritization-for-rapid-validation/productize.json delete mode 100644 skills/roadmap-update/SKILL.md delete mode 100644 skills/roadmap-update/SKILL.md.tmpl delete mode 100644 skills/roadmap-update/agents/openai.yaml delete mode 100644 skills/roadmap-update/productize.json delete mode 100644 skills/robust-experiment-design-from-goals-and-systems/SKILL.md delete mode 100644 skills/robust-experiment-design-from-goals-and-systems/SKILL.md.tmpl delete mode 100644 skills/robust-experiment-design-from-goals-and-systems/agents/openai.yaml delete mode 100644 skills/robust-experiment-design-from-goals-and-systems/productize.json delete mode 100644 skills/role-identity-decision-making-map/SKILL.md delete mode 100644 skills/role-identity-decision-making-map/SKILL.md.tmpl delete mode 100644 skills/role-identity-decision-making-map/agents/openai.yaml delete mode 100644 skills/role-identity-decision-making-map/productize.json delete mode 100644 skills/root-cause-and-consequence-analysis-from-a-question/SKILL.md delete mode 100644 skills/root-cause-and-consequence-analysis-from-a-question/SKILL.md.tmpl delete mode 100644 skills/root-cause-and-consequence-analysis-from-a-question/agents/openai.yaml delete mode 100644 skills/root-cause-and-consequence-analysis-from-a-question/productize.json delete mode 100644 skills/scope-defense-using-time-cost-tradeoff-analysis/SKILL.md delete mode 100644 skills/scope-defense-using-time-cost-tradeoff-analysis/SKILL.md.tmpl delete mode 100644 skills/scope-defense-using-time-cost-tradeoff-analysis/agents/openai.yaml delete mode 100644 skills/scope-defense-using-time-cost-tradeoff-analysis/productize.json delete mode 100644 skills/sketch-descriptions-for-wireframes-from-product-ideas/SKILL.md delete mode 100644 skills/sketch-descriptions-for-wireframes-from-product-ideas/SKILL.md.tmpl delete mode 100644 skills/sketch-descriptions-for-wireframes-from-product-ideas/agents/openai.yaml delete mode 100644 skills/sketch-descriptions-for-wireframes-from-product-ideas/productize.json delete mode 100644 skills/skimmable-writing-transformation/SKILL.md delete mode 100644 skills/skimmable-writing-transformation/SKILL.md.tmpl delete mode 100644 skills/skimmable-writing-transformation/agents/openai.yaml delete mode 100644 skills/skimmable-writing-transformation/productize.json delete mode 100644 skills/slide-decks-from-problem-statements-and-context/SKILL.md delete mode 100644 skills/slide-decks-from-problem-statements-and-context/SKILL.md.tmpl delete mode 100644 skills/slide-decks-from-problem-statements-and-context/agents/openai.yaml delete mode 100644 skills/slide-decks-from-problem-statements-and-context/productize.json delete mode 100644 skills/solution-anti-patterns-from-customer-problem-analysis/SKILL.md delete mode 100644 skills/solution-anti-patterns-from-customer-problem-analysis/SKILL.md.tmpl delete mode 100644 skills/solution-anti-patterns-from-customer-problem-analysis/agents/openai.yaml delete mode 100644 skills/solution-anti-patterns-from-customer-problem-analysis/productize.json delete mode 100644 skills/solution-design-for-edge-cases-in-product-development/SKILL.md delete mode 100644 skills/solution-design-for-edge-cases-in-product-development/SKILL.md.tmpl delete mode 100644 skills/solution-design-for-edge-cases-in-product-development/agents/openai.yaml delete mode 100644 skills/solution-design-for-edge-cases-in-product-development/productize.json delete mode 100644 skills/spec-writing/SKILL.md delete mode 100644 skills/spec-writing/SKILL.md.tmpl delete mode 100644 skills/spec-writing/agents/openai.yaml delete mode 100644 skills/spec-writing/productize.json delete mode 100644 skills/sprint-planning/SKILL.md delete mode 100644 skills/sprint-planning/SKILL.md.tmpl delete mode 100644 skills/sprint-planning/agents/openai.yaml delete mode 100644 skills/sprint-planning/productize.json delete mode 100644 skills/sql-queries/SKILL.md delete mode 100644 skills/sql-queries/SKILL.md.tmpl delete mode 100644 skills/sql-queries/agents/openai.yaml delete mode 100644 skills/sql-queries/productize.json delete mode 100644 skills/sql-query-from-requirements-and-data-tables/SKILL.md delete mode 100644 skills/sql-query-from-requirements-and-data-tables/SKILL.md.tmpl delete mode 100644 skills/sql-query-from-requirements-and-data-tables/agents/openai.yaml delete mode 100644 skills/sql-query-from-requirements-and-data-tables/productize.json delete mode 100644 skills/stakeholder-brief-clarification-and-problem-definition/SKILL.md delete mode 100644 skills/stakeholder-brief-clarification-and-problem-definition/SKILL.md.tmpl delete mode 100644 skills/stakeholder-brief-clarification-and-problem-definition/agents/openai.yaml delete mode 100644 skills/stakeholder-brief-clarification-and-problem-definition/productize.json delete mode 100644 skills/stakeholder-decision-making-using-toc-thinking-process/SKILL.md delete mode 100644 skills/stakeholder-decision-making-using-toc-thinking-process/SKILL.md.tmpl delete mode 100644 skills/stakeholder-decision-making-using-toc-thinking-process/agents/openai.yaml delete mode 100644 skills/stakeholder-decision-making-using-toc-thinking-process/productize.json delete mode 100644 skills/stakeholder-moo-objections-and-product-derailment-risks/SKILL.md delete mode 100644 skills/stakeholder-moo-objections-and-product-derailment-risks/SKILL.md.tmpl delete mode 100644 skills/stakeholder-moo-objections-and-product-derailment-risks/agents/openai.yaml delete mode 100644 skills/stakeholder-moo-objections-and-product-derailment-risks/productize.json delete mode 100644 skills/stakeholder-power-interest-and-influence-map/SKILL.md delete mode 100644 skills/stakeholder-power-interest-and-influence-map/SKILL.md.tmpl delete mode 100644 skills/stakeholder-power-interest-and-influence-map/agents/openai.yaml delete mode 100644 skills/stakeholder-power-interest-and-influence-map/productize.json delete mode 100644 skills/stakeholder-power-interest-and-influence-map/references/pm-skills-main-merge.md delete mode 100644 skills/stakeholder-risk-review-for-a-feature-or-prd/SKILL.md delete mode 100644 skills/stakeholder-risk-review-for-a-feature-or-prd/SKILL.md.tmpl delete mode 100644 skills/stakeholder-risk-review-for-a-feature-or-prd/agents/openai.yaml delete mode 100644 skills/stakeholder-risk-review-for-a-feature-or-prd/productize.json delete mode 100644 skills/stakeholder-update/SKILL.md delete mode 100644 skills/stakeholder-update/SKILL.md.tmpl delete mode 100644 skills/stakeholder-update/agents/openai.yaml delete mode 100644 skills/stakeholder-update/productize.json delete mode 100644 skills/startup-canvas/SKILL.md delete mode 100644 skills/startup-canvas/SKILL.md.tmpl delete mode 100644 skills/startup-canvas/agents/openai.yaml delete mode 100644 skills/startup-canvas/productize.json delete mode 100644 skills/statistical-analysis/SKILL.md delete mode 100644 skills/statistical-analysis/SKILL.md.tmpl delete mode 100644 skills/statistical-analysis/agents/openai.yaml delete mode 100644 skills/statistical-analysis/productize.json delete mode 100644 skills/strategic-crux-diagnosis-and-strategy-design/SKILL.md delete mode 100644 skills/strategic-crux-diagnosis-and-strategy-design/SKILL.md.tmpl delete mode 100644 skills/strategic-crux-diagnosis-and-strategy-design/agents/openai.yaml delete mode 100644 skills/strategic-crux-diagnosis-and-strategy-design/productize.json delete mode 100644 skills/strategic-decision-making-quality-review/SKILL.md delete mode 100644 skills/strategic-decision-making-quality-review/SKILL.md.tmpl delete mode 100644 skills/strategic-decision-making-quality-review/agents/openai.yaml delete mode 100644 skills/strategic-decision-making-quality-review/productize.json delete mode 100644 skills/strategic-moves-from-swot-pairings/SKILL.md delete mode 100644 skills/strategic-moves-from-swot-pairings/SKILL.md.tmpl delete mode 100644 skills/strategic-moves-from-swot-pairings/agents/openai.yaml delete mode 100644 skills/strategic-moves-from-swot-pairings/productize.json delete mode 100644 skills/strategic-presentation-planning-from-topic-audience-and-time/SKILL.md delete mode 100644 skills/strategic-presentation-planning-from-topic-audience-and-time/SKILL.md.tmpl delete mode 100644 skills/strategic-presentation-planning-from-topic-audience-and-time/agents/openai.yaml delete mode 100644 skills/strategic-presentation-planning-from-topic-audience-and-time/productize.json delete mode 100644 skills/strategy-curve-blue-ocean/SKILL.md delete mode 100644 skills/strategy-curve-blue-ocean/SKILL.md.tmpl delete mode 100644 skills/strategy-curve-blue-ocean/agents/openai.yaml delete mode 100644 skills/strategy-curve-blue-ocean/productize.json delete mode 100644 skills/strategy-kernel-extraction-from-context/SKILL.md delete mode 100644 skills/strategy-kernel-extraction-from-context/SKILL.md.tmpl delete mode 100644 skills/strategy-kernel-extraction-from-context/agents/openai.yaml delete mode 100644 skills/strategy-kernel-extraction-from-context/productize.json delete mode 100644 skills/strategy-to-execution-bridge-for-ux-decisions/SKILL.md delete mode 100644 skills/strategy-to-execution-bridge-for-ux-decisions/SKILL.md.tmpl delete mode 100644 skills/strategy-to-execution-bridge-for-ux-decisions/agents/openai.yaml delete mode 100644 skills/strategy-to-execution-bridge-for-ux-decisions/productize.json delete mode 100644 skills/structured-decision-journals-from-decisions-and-context/SKILL.md delete mode 100644 skills/structured-decision-journals-from-decisions-and-context/SKILL.md.tmpl delete mode 100644 skills/structured-decision-journals-from-decisions-and-context/agents/openai.yaml delete mode 100644 skills/structured-decision-journals-from-decisions-and-context/productize.json delete mode 100644 skills/structured-insight-extraction-from-conversation-transcripts/SKILL.md delete mode 100644 skills/structured-insight-extraction-from-conversation-transcripts/SKILL.md.tmpl delete mode 100644 skills/structured-insight-extraction-from-conversation-transcripts/agents/openai.yaml delete mode 100644 skills/structured-insight-extraction-from-conversation-transcripts/productize.json delete mode 100644 skills/structured-interview-notes-from-transcript-using-flexible/SKILL.md delete mode 100644 skills/structured-interview-notes-from-transcript-using-flexible/SKILL.md.tmpl delete mode 100644 skills/structured-interview-notes-from-transcript-using-flexible/agents/openai.yaml delete mode 100644 skills/structured-interview-notes-from-transcript-using-flexible/productize.json delete mode 100644 skills/structured-interview-notes-from-transcript-using-flexible/references/pm-skills-main-merge.md delete mode 100644 skills/structured-json-descriptions-from-ui-screenshots/SKILL.md delete mode 100644 skills/structured-json-descriptions-from-ui-screenshots/SKILL.md.tmpl delete mode 100644 skills/structured-json-descriptions-from-ui-screenshots/agents/openai.yaml delete mode 100644 skills/structured-json-descriptions-from-ui-screenshots/productize.json delete mode 100644 skills/structured-product-hypotheses-from-product-problems/SKILL.md delete mode 100644 skills/structured-product-hypotheses-from-product-problems/SKILL.md.tmpl delete mode 100644 skills/structured-product-hypotheses-from-product-problems/agents/openai.yaml delete mode 100644 skills/structured-product-hypotheses-from-product-problems/productize.json delete mode 100644 skills/structured-product-strategy-from-product-context/SKILL.md delete mode 100644 skills/structured-product-strategy-from-product-context/SKILL.md.tmpl delete mode 100644 skills/structured-product-strategy-from-product-context/agents/openai.yaml delete mode 100644 skills/structured-product-strategy-from-product-context/productize.json delete mode 100644 skills/structured-requirements-from-conversation-transcripts/SKILL.md delete mode 100644 skills/structured-requirements-from-conversation-transcripts/SKILL.md.tmpl delete mode 100644 skills/structured-requirements-from-conversation-transcripts/agents/openai.yaml delete mode 100644 skills/structured-requirements-from-conversation-transcripts/productize.json delete mode 100644 skills/structured-requirements-from-design-assets/SKILL.md delete mode 100644 skills/structured-requirements-from-design-assets/SKILL.md.tmpl delete mode 100644 skills/structured-requirements-from-design-assets/agents/openai.yaml delete mode 100644 skills/structured-requirements-from-design-assets/productize.json delete mode 100644 skills/success-metrics-for-design-decisions/SKILL.md delete mode 100644 skills/success-metrics-for-design-decisions/SKILL.md.tmpl delete mode 100644 skills/success-metrics-for-design-decisions/agents/openai.yaml delete mode 100644 skills/success-metrics-for-design-decisions/productize.json delete mode 100644 skills/support-tickets-as-actionable-product-improvements/SKILL.md delete mode 100644 skills/support-tickets-as-actionable-product-improvements/SKILL.md.tmpl delete mode 100644 skills/support-tickets-as-actionable-product-improvements/agents/openai.yaml delete mode 100644 skills/support-tickets-as-actionable-product-improvements/productize.json delete mode 100644 skills/sustainable-business-model/SKILL.md delete mode 100644 skills/sustainable-business-model/SKILL.md.tmpl delete mode 100644 skills/sustainable-business-model/agents/openai.yaml delete mode 100644 skills/sustainable-business-model/productize.json delete mode 100644 skills/sustainable-business-model/references/output-format.md delete mode 100644 skills/sustainable-business-model/references/pattern-groups.md delete mode 100644 skills/synthesize-research/SKILL.md delete mode 100644 skills/synthesize-research/SKILL.md.tmpl delete mode 100644 skills/synthesize-research/agents/openai.yaml delete mode 100644 skills/synthesize-research/productize.json delete mode 100644 skills/systematic-debugging/SKILL.md delete mode 100644 skills/systematic-debugging/SKILL.md.tmpl delete mode 100644 skills/systematic-debugging/agents/openai.yaml delete mode 100644 skills/systematic-debugging/productize.json delete mode 100644 skills/target-opportunity-selection-from-ost/SKILL.md delete mode 100644 skills/target-opportunity-selection-from-ost/SKILL.md.tmpl delete mode 100644 skills/target-opportunity-selection-from-ost/agents/openai.yaml delete mode 100644 skills/target-opportunity-selection-from-ost/productize.json delete mode 100644 skills/task-list-optimization-and-contingency-based-project-planning/SKILL.md delete mode 100644 skills/task-list-optimization-and-contingency-based-project-planning/SKILL.md.tmpl delete mode 100644 skills/task-list-optimization-and-contingency-based-project-planning/agents/openai.yaml delete mode 100644 skills/task-list-optimization-and-contingency-based-project-planning/productize.json delete mode 100644 skills/task-specific-product-strategy-design/SKILL.md delete mode 100644 skills/task-specific-product-strategy-design/SKILL.md.tmpl delete mode 100644 skills/task-specific-product-strategy-design/agents/openai.yaml delete mode 100644 skills/task-specific-product-strategy-design/productize.json delete mode 100644 skills/tdd/SKILL.md delete mode 100644 skills/tdd/SKILL.md.tmpl delete mode 100644 skills/tdd/agents/openai.yaml delete mode 100644 skills/tdd/productize.json delete mode 100644 skills/technical-architecture-brief-from-product-requirements-doc/SKILL.md delete mode 100644 skills/technical-architecture-brief-from-product-requirements-doc/SKILL.md.tmpl delete mode 100644 skills/technical-architecture-brief-from-product-requirements-doc/agents/openai.yaml delete mode 100644 skills/technical-architecture-brief-from-product-requirements-doc/productize.json delete mode 100644 skills/technical-translation-and-stakeholder-communication/SKILL.md delete mode 100644 skills/technical-translation-and-stakeholder-communication/SKILL.md.tmpl delete mode 100644 skills/technical-translation-and-stakeholder-communication/agents/openai.yaml delete mode 100644 skills/technical-translation-and-stakeholder-communication/productize.json delete mode 100644 skills/test-scenarios/SKILL.md delete mode 100644 skills/test-scenarios/SKILL.md.tmpl delete mode 100644 skills/test-scenarios/agents/openai.yaml delete mode 100644 skills/test-scenarios/productize.json delete mode 100644 skills/thesis-review/SKILL.md delete mode 100644 skills/thesis-review/SKILL.md.tmpl delete mode 100644 skills/thesis-review/agents/openai.yaml delete mode 100644 skills/thesis-review/productize.json delete mode 100644 skills/trade-off-analysis-from-feature-priority-and-effort-data/SKILL.md delete mode 100644 skills/trade-off-analysis-from-feature-priority-and-effort-data/SKILL.md.tmpl delete mode 100644 skills/trade-off-analysis-from-feature-priority-and-effort-data/agents/openai.yaml delete mode 100644 skills/trade-off-analysis-from-feature-priority-and-effort-data/productize.json delete mode 100644 skills/user-stories-from-initiative-requirements/SKILL.md delete mode 100644 skills/user-stories-from-initiative-requirements/SKILL.md.tmpl delete mode 100644 skills/user-stories-from-initiative-requirements/agents/openai.yaml delete mode 100644 skills/user-stories-from-initiative-requirements/productize.json delete mode 100644 skills/user-stories-with-gherkin-acceptance-criteria-from-requirements/SKILL.md delete mode 100644 skills/user-stories-with-gherkin-acceptance-criteria-from-requirements/SKILL.md.tmpl delete mode 100644 skills/user-stories-with-gherkin-acceptance-criteria-from-requirements/agents/openai.yaml delete mode 100644 skills/user-stories-with-gherkin-acceptance-criteria-from-requirements/productize.json delete mode 100644 skills/user-stories-with-gherkin-acceptance-criteria-from-requirements/references/pm-skills-main-merge.md delete mode 100644 skills/ux-edge-cases-from-product-briefs/SKILL.md delete mode 100644 skills/ux-edge-cases-from-product-briefs/SKILL.md.tmpl delete mode 100644 skills/ux-edge-cases-from-product-briefs/agents/openai.yaml delete mode 100644 skills/ux-edge-cases-from-product-briefs/productize.json delete mode 100644 skills/ux-terminology-improvements-in-product-requirements/SKILL.md delete mode 100644 skills/ux-terminology-improvements-in-product-requirements/SKILL.md.tmpl delete mode 100644 skills/ux-terminology-improvements-in-product-requirements/agents/openai.yaml delete mode 100644 skills/ux-terminology-improvements-in-product-requirements/productize.json delete mode 100644 skills/validate-data/SKILL.md delete mode 100644 skills/validate-data/SKILL.md.tmpl delete mode 100644 skills/validate-data/agents/openai.yaml delete mode 100644 skills/validate-data/productize.json delete mode 100644 skills/valuation-and-deal-pricing/SKILL.md delete mode 100644 skills/valuation-and-deal-pricing/SKILL.md.tmpl delete mode 100644 skills/valuation-and-deal-pricing/agents/openai.yaml delete mode 100644 skills/valuation-and-deal-pricing/productize.json delete mode 100644 skills/value-chain-mapping-from-end-user-needs-to-core-value/SKILL.md delete mode 100644 skills/value-chain-mapping-from-end-user-needs-to-core-value/SKILL.md.tmpl delete mode 100644 skills/value-chain-mapping-from-end-user-needs-to-core-value/agents/openai.yaml delete mode 100644 skills/value-chain-mapping-from-end-user-needs-to-core-value/productize.json delete mode 100644 skills/venture-capital-deal-modeling/SKILL.md delete mode 100644 skills/venture-capital-deal-modeling/SKILL.md.tmpl delete mode 100644 skills/venture-capital-deal-modeling/agents/openai.yaml delete mode 100644 skills/venture-capital-deal-modeling/productize.json delete mode 100644 skills/verification/SKILL.md delete mode 100644 skills/verification/SKILL.md.tmpl delete mode 100644 skills/verification/agents/openai.yaml delete mode 100644 skills/verification/productize.json delete mode 100644 skills/visual-decision-making-review/SKILL.md delete mode 100644 skills/visual-decision-making-review/SKILL.md.tmpl delete mode 100644 skills/visual-decision-making-review/agents/openai.yaml delete mode 100644 skills/visual-decision-making-review/productize.json create mode 100644 skills/workflow-memory/SKILL.md create mode 100644 skills/workflow-memory/references/memory-guidelines.md delete mode 100644 skills/workshop-activity-design-from-problem-and-participant/SKILL.md delete mode 100644 skills/workshop-activity-design-from-problem-and-participant/SKILL.md.tmpl delete mode 100644 skills/workshop-activity-design-from-problem-and-participant/agents/openai.yaml delete mode 100644 skills/workshop-activity-design-from-problem-and-participant/productize.json delete mode 100644 skills/write-query/SKILL.md delete mode 100644 skills/write-query/SKILL.md.tmpl delete mode 100644 skills/write-query/agents/openai.yaml delete mode 100644 skills/write-query/productize.json delete mode 100644 skills/write-query/references/pm-skills-main-merge.md delete mode 100644 skills/write-spec/SKILL.md delete mode 100644 skills/write-spec/SKILL.md.tmpl delete mode 100644 skills/write-spec/agents/openai.yaml delete mode 100644 skills/write-spec/productize.json delete mode 100644 skills/write-spec/references/pm-skills-main-merge.md delete mode 100644 skills/writing-plans/SKILL.md delete mode 100644 skills/writing-plans/SKILL.md.tmpl delete mode 100644 skills/writing-plans/agents/openai.yaml delete mode 100644 skills/writing-plans/productize.json delete mode 100644 skills/wwas/SKILL.md delete mode 100644 skills/wwas/SKILL.md.tmpl delete mode 100644 skills/wwas/agents/openai.yaml delete mode 100644 skills/wwas/productize.json create mode 100644 test/codegen-script.test.ts delete mode 100644 test/dogfood.test.mjs delete mode 100644 test/eval-runner.test.mjs delete mode 100644 test/fixtures/fake-llm-eval.mjs delete mode 100644 test/generator.test.mjs create mode 100644 test/helpers_test.go delete mode 100644 test/metadata-quality.test.mjs delete mode 100644 test/plugin-distribution.test.mjs create mode 100644 test/public_api_test.go delete mode 100644 test/registry.test.mjs delete mode 100644 test/release.test.mjs create mode 100644 test/release_config_test.go delete mode 100644 test/repo-hygiene.test.mjs delete mode 100644 test/route-regression.test.mjs delete mode 100644 test/runtime-workflow.test.mjs delete mode 100644 test/setup-host.test.mjs delete mode 100644 test/setup-script.test.mjs create mode 100644 test/skills_bundle_test.go create mode 100644 tsconfig.base.json create mode 100644 tsconfig.json create mode 100644 turbo.json create mode 100644 vitest.config.ts create mode 100644 zsh/productize-completion/README.md create mode 100644 zsh/productize-completion/productize-completion.plugin.zsh diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json deleted file mode 100644 index 9e84cad8..00000000 --- a/.agents/plugins/marketplace.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "name": "productize-agent-skills", - "version": "1.1.2", - "metadata": { - "version": "1.1.2" - }, - "interface": { - "displayName": "Productize AI" - }, - "plugins": [ - { - "name": "productize-discovery", - "source": { - "source": "local", - "path": "./plugins/productize-discovery" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-strategy", - "source": { - "source": "local", - "path": "./plugins/productize-strategy" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-decision-making", - "source": { - "source": "local", - "path": "./plugins/productize-decision-making" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-growth", - "source": { - "source": "local", - "path": "./plugins/productize-growth" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-analytics", - "source": { - "source": "local", - "path": "./plugins/productize-analytics" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-finance", - "source": { - "source": "local", - "path": "./plugins/productize-finance" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-delivery", - "source": { - "source": "local", - "path": "./plugins/productize-delivery" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-design", - "source": { - "source": "local", - "path": "./plugins/productize-design" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-marketing", - "source": { - "source": "local", - "path": "./plugins/productize-marketing" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-operations", - "source": { - "source": "local", - "path": "./plugins/productize-operations" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-stakeholder-communication", - "source": { - "source": "local", - "path": "./plugins/productize-stakeholder-communication" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-ai-execution", - "source": { - "source": "local", - "path": "./plugins/productize-ai-execution" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-business-model", - "source": { - "source": "local", - "path": "./plugins/productize-business-model" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-venture-0-1", - "source": { - "source": "local", - "path": "./plugins/productize-venture-0-1" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - }, - { - "name": "productize-all", - "source": { - "source": "local", - "path": "./plugins/productize-all" - }, - "policy": { - "installation": "AVAILABLE", - "authentication": "ON_INSTALL" - }, - "category": "Productivity" - } - ] -} diff --git a/.agents/productize-runtime.json b/.agents/productize-runtime.json deleted file mode 100644 index e7d0b542..00000000 --- a/.agents/productize-runtime.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "generated": true, - "host": "codex", - "display_name": "OpenAI Codex", - "adapter_source": "hosts/codex.mjs", - "generated_skill_path": ".agents/skills/{skill}", - "sidecars": [ - { - "source": "bin/productize-artifact-log", - "install_name": "productize-artifact-log" - }, - { - "source": "bin/productize-completion-status", - "install_name": "productize-completion-status" - }, - { - "source": "bin/productize-config", - "install_name": "productize-config" - }, - { - "source": "bin/productize-context-restore", - "install_name": "productize-context-restore" - }, - { - "source": "bin/productize-context-save", - "install_name": "productize-context-save" - }, - { - "source": "bin/productize-registry-search", - "install_name": "productize-registry-search" - }, - { - "source": "bin/productize-routing.mjs", - "install_name": "productize-routing.mjs" - }, - { - "source": "bin/productize-runtime.mjs", - "install_name": "productize-runtime.mjs" - }, - { - "source": "bin/productize-session-log", - "install_name": "productize-session-log" - }, - { - "source": "bin/productize-skill-router", - "install_name": "productize-skill-router" - }, - { - "source": "bin/productize-update-check", - "install_name": "productize-update-check" - }, - { - "source": "bin/productize-workflow", - "install_name": "productize-workflow" - } - ] -} diff --git a/.agents/skills/adversarial-review/SKILL.md b/.agents/skills/adversarial-review/SKILL.md new file mode 100644 index 00000000..d4915e14 --- /dev/null +++ b/.agents/skills/adversarial-review/SKILL.md @@ -0,0 +1,140 @@ +--- +name: adversarial-review +description: >- + Adversarial code review using the opposite model. Spawns 1–3 reviewers on the + opposing model (Claude spawns Codex, Codex spawns Claude) to challenge work from + distinct critical lenses. Triggers: "adversarial review". +schedule: "After cook sessions that produce large diffs (200+ lines), implement plan phases, or complete a planning session" +--- + +# Adversarial Review + +Spawn reviewers on the **opposite model** to challenge work. Reviewers attack from distinct +lenses grounded in brain principles. The deliverable is a synthesized verdict — do NOT make +changes. + +**Hard constraint:** Reviewers MUST run via the opposite model's CLI (`codex exec` or +`claude -p`). Do NOT use subagents, the Agent tool, or any internal delegation mechanism as +reviewers — those run on _your own_ model, which defeats the purpose. + +## Step 1 — Load Principles + +Read `brain/principles.md`. Follow every `[[wikilink]]` and read each linked principle file. +These govern reviewer judgments. + +## Step 2 — Determine Scope and Intent + +Identify what to review from context (recent diffs, referenced plans, user message). + +Determine the **intent** — what the author is trying to achieve. This is critical: reviewers +challenge whether the work _achieves the intent well_, not whether the intent is correct. +State the intent explicitly before proceeding. + +Assess change size: + +| Size | Threshold | Reviewers | +| ------ | ----------------------- | ------------------------------------ | +| Small | < 50 lines, 1–2 files | 1 (Skeptic) | +| Medium | 50–200 lines, 3–5 files | 2 (Skeptic + Architect) | +| Large | 200+ lines or 5+ files | 3 (Skeptic + Architect + Minimalist) | + +Read `references/reviewer-lenses.md` for lens definitions. + +## Step 3 — Detect Model and Spawn Reviewers + +Create a temp directory for reviewer output: + +```sh +REVIEW_DIR=$(mktemp -d /tmp/adversarial-review.XXXXXX) +``` + +Determine which model you are, then spawn reviewers on the opposite: + +**If you are Claude** → spawn Codex reviewers via `codex exec`: + +```sh +codex exec --skip-git-repo-check -o "$REVIEW_DIR/skeptic.md" "prompt" 2>/dev/null +``` + +Use `--profile edit` only if the reviewer needs to run tests. Default to read-only. +Run with `run_in_background: true`, monitor via `TaskOutput` with `block: true, timeout: 600000`. + +**If you are Codex** → spawn Claude reviewers via `claude` CLI: + +```sh +claude -p "prompt" > "$REVIEW_DIR/skeptic.md" 2>/dev/null +``` + +Run with `run_in_background: true`. + +Name each output file after the lens: `skeptic.md`, `architect.md`, `minimalist.md`. + +### Reviewer prompt template + +Each reviewer gets a single prompt containing: + +1. The stated intent (from Step 2) +2. Their assigned lens (full text from references/reviewer-lenses.md) +3. The principles relevant to their lens (file contents, not summaries) +4. The code or diff to review +5. Instructions: "You are an adversarial reviewer. Your job is to find real problems, not + validate the work. Be specific — cite files, lines, and concrete failure scenarios. + Rate each finding: high (blocks ship), medium (should fix), low (worth noting). + Write findings as a numbered markdown list to your output file." + +Spawn all reviewers in parallel. + +## Step 4 — Verify and Synthesize Verdict + +Before reading reviewer output, log which CLI was used and confirm the output files exist: + +```sh +echo "reviewer_cli=codex|claude" +ls "$REVIEW_DIR"/*.md +``` + +If any output file is missing or empty, note the failure in the verdict — do not silently skip +a reviewer. + +Read each reviewer's output file from `$REVIEW_DIR/`. Deduplicate overlapping findings. +Produce a single verdict: + +``` +## Intent + + +## Verdict: PASS | CONTESTED | REJECT + + +## Findings + + +For each finding: +- **[severity]** Description with file:line references +- Lens: which reviewer raised it +- Principle: which brain principle it maps to +- Recommendation: concrete action, not vague advice + +## What Went Well +<1–3 things the reviewers found no issue with — acknowledge good work> +``` + +**Verdict logic:** + +- **PASS** — no high-severity findings +- **CONTESTED** — high-severity findings but reviewers disagree on them +- **REJECT** — high-severity findings with reviewer consensus + +## Step 5 — Render Judgment + +After synthesizing the reviewers, apply your own judgment. Using the stated intent and brain +principles as your frame, state which findings you would accept and which you would reject — +and why. Reviewers are adversarial by design; not every finding warrants action. Call out +false positives, overreach, and findings that mistake style for substance. + +Append to the verdict: + +``` +## Lead Judgment + +``` diff --git a/.agents/skills/adversarial-review/references/reviewer-lenses.md b/.agents/skills/adversarial-review/references/reviewer-lenses.md new file mode 100644 index 00000000..53cc6cf1 --- /dev/null +++ b/.agents/skills/adversarial-review/references/reviewer-lenses.md @@ -0,0 +1,38 @@ +# Reviewer Lenses + +Three distinct adversarial perspectives. Each reviewer adopts one lens exclusively. + +## Architect + +Challenge structural fitness. Ask: + +- Does the design actually serve the stated goal, or does it serve a goal the author assumed? +- Where are the coupling points that will hurt when requirements shift? +- What boundary violations exist? Where does responsibility leak between components? +- What implicit assumptions about scale, concurrency, or ordering will break first? + +Map findings to: boundary-discipline, foundational-thinking, redesign-from-first-principles. + +## Skeptic + +Challenge correctness and completeness. Ask: + +- What inputs, states, or sequences will break this? +- What error paths are unhandled or silently swallowed? +- What race conditions or ordering dependencies exist? +- What does the author believe is true that isn't proven? +- Where is "it works on my machine" masquerading as verification? + +Map findings to: prove-it-works, fix-root-causes, serialize-shared-state-mutations. + +## Minimalist + +Challenge necessity and complexity. Ask: + +- What can be deleted without losing the stated goal? +- Where is the author solving problems they don't have yet? +- What abstractions exist for a single call site? +- Where is configuration or flexibility added without a concrete second use case? +- Is this the simplest possible path to the outcome, or is it the path that felt most thorough? + +Map findings to: subtract-before-you-add, outcome-oriented-execution, cost-aware-delegation. diff --git a/.agents/skills/ai-sdk/SKILL.md b/.agents/skills/ai-sdk/SKILL.md new file mode 100644 index 00000000..d66587b5 --- /dev/null +++ b/.agents/skills/ai-sdk/SKILL.md @@ -0,0 +1,53 @@ +--- +name: ai-sdk +description: 'Answer questions about the AI SDK and help build AI-powered features. Use when developers: (1) Ask about AI SDK functions like generateText, streamText, ToolLoopAgent, or tools, (2) Want to build AI agents, chatbots, or text generation features, (3) Have questions about AI providers (OpenAI, Anthropic, etc.), streaming, tool calling, or structured output.' +metadata: + author: Vercel Inc. + version: '1.0' +--- + +## AI SDK Documentation + +When you need up-to-date information about the AI SDK: + +### If using ai@6.0.34 or above + +Search the bundled documentation and source code in `node_modules/ai/`: + +1. **Documentation**: `grep "your query" node_modules/ai/docs/` +2. **Source code**: `grep "your query" node_modules/ai/src/` + +To find specific files: + +- `glob "node_modules/ai/docs/**/*.mdx"` for documentation files +- `glob "node_modules/ai/src/**/*.ts"` for source files + +Provider packages (`@ai-sdk/openai`, `@ai-sdk/anthropic`, etc.) also include bundled docs in their respective `node_modules/@ai-sdk//docs/` directories. + +**When in doubt, update to the latest version of the AI SDK.** + +### Otherwise + +1. Search the docs: `https://ai-sdk.dev/api/search-docs?q=your_query` +2. The response includes matches with links ending in `.md` +3. Fetch those `.md` URLs directly to get plain text content (e.g. `https://ai-sdk.dev/docs/agents/building-agents.md`) + +Use these resources for current API details, examples, and usage patterns. + +For common errors and troubleshooting, see [Common Errors Reference](references/common-errors.md). + +For using Vercel AI Gateway, see [AI Gateway Reference](references/ai-gateway.md). + +## Provider-Specific Information (ai@6.0.34+) + +For questions about specific providers (OpenAI, Anthropic, Google, etc.), search their dedicated packages: + +1. **Provider documentation**: `grep "your query" node_modules/@ai-sdk//docs/` +2. **Provider source code**: `grep "your query" node_modules/@ai-sdk//src/` + +To find provider files: + +- `glob "node_modules/@ai-sdk//docs/**/*.mdx"` for provider documentation +- `glob "node_modules/@ai-sdk//src/**/*.ts"` for provider source files + +This is especially important for `providerOptions`, which are provider-specific settings passed to model calls. Each provider has unique options documented in their package. diff --git a/.agents/skills/ai-sdk/references/ai-gateway.md b/.agents/skills/ai-sdk/references/ai-gateway.md new file mode 100644 index 00000000..0777a0e7 --- /dev/null +++ b/.agents/skills/ai-sdk/references/ai-gateway.md @@ -0,0 +1,41 @@ +--- +title: Vercel AI Gateway +description: Reference for using Vercel AI Gateway with the AI SDK. +--- + +# Vercel AI Gateway + +The Vercel AI Gateway is the fastest way to get started with the AI SDK. It provides access to models from OpenAI, Anthropic, Google, and other providers through a single API. + +## Authentication + +Authenticate with OIDC (for Vercel deployments) or an [AI Gateway API key](https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai-gateway%2Fapi-keys&title=AI+Gateway+API+Keys): + +```env filename=".env.local" +AI_GATEWAY_API_KEY=your_api_key_here +``` + +## Usage + +The AI Gateway is the default global provider, so you can access models using a simple string: + +```ts +import { generateText } from 'ai'; + +const { text } = await generateText({ + model: 'anthropic/claude-sonnet-4.5', + prompt: 'What is love?', +}); +``` + +You can also explicitly import and use the gateway provider: + +```ts +// Option 1: Import from 'ai' package (included by default) +import { gateway } from 'ai'; +model: gateway('anthropic/claude-sonnet-4.5'); + +// Option 2: Install and import from '@ai-sdk/gateway' package +import { gateway } from '@ai-sdk/gateway'; +model: gateway('anthropic/claude-sonnet-4.5'); +``` diff --git a/.agents/skills/ai-sdk/references/common-errors.md b/.agents/skills/ai-sdk/references/common-errors.md new file mode 100644 index 00000000..25ae5add --- /dev/null +++ b/.agents/skills/ai-sdk/references/common-errors.md @@ -0,0 +1,167 @@ +--- +title: Common Errors +description: Reference for common AI SDK errors and how to resolve them. +--- + +# Common Errors + +## `maxTokens` → `maxOutputTokens` + +```typescript +// ❌ Incorrect +const result = await generateText({ + model: 'anthropic/claude-opus-4.5', + maxTokens: 512, + prompt: 'Write a short story', +}); + +// ✅ Correct +const result = await generateText({ + model: 'anthropic/claude-opus-4.5', + maxOutputTokens: 512, + prompt: 'Write a short story', +}); +``` + +## `maxSteps` → `stopWhen: stepCountIs(n)` + +```typescript +// ❌ Incorrect +const result = await generateText({ + model: 'anthropic/claude-opus-4.5', + tools: { weather }, + maxSteps: 5, + prompt: 'What is the weather in NYC?', +}); + +// ✅ Correct +import { generateText, stepCountIs } from 'ai'; + +const result = await generateText({ + model: 'anthropic/claude-opus-4.5', + tools: { weather }, + stopWhen: stepCountIs(5), + prompt: 'What is the weather in NYC?', +}); +``` + +## `parameters` → `inputSchema` (in tool definition) + +```typescript +// ❌ Incorrect +const weatherTool = tool({ + description: 'Get weather for a location', + parameters: z.object({ + location: z.string(), + }), + execute: async ({ location }) => ({ location, temp: 72 }), +}); + +// ✅ Correct +const weatherTool = tool({ + description: 'Get weather for a location', + inputSchema: z.object({ + location: z.string(), + }), + execute: async ({ location }) => ({ location, temp: 72 }), +}); +``` + +## `generateObject` → `generateText` with `output` + +`generateObject` is deprecated. Use `generateText` with the `output` option instead. + +```typescript +// ❌ Deprecated +import { generateObject } from 'ai'; + +const result = await generateObject({ + model: 'anthropic/claude-opus-4.5', + schema: z.object({ + recipe: z.object({ + name: z.string(), + ingredients: z.array(z.string()), + }), + }), + prompt: 'Generate a recipe for chocolate cake', +}); + +// ✅ Correct +import { generateText, Output } from 'ai'; + +const result = await generateText({ + model: 'anthropic/claude-opus-4.5', + output: Output.object({ + schema: z.object({ + recipe: z.object({ + name: z.string(), + ingredients: z.array(z.string()), + }), + }), + }), + prompt: 'Generate a recipe for chocolate cake', +}); + +console.log(result.output); // typed object +``` + +## Manual JSON parsing → `generateText` with `output` + +```typescript +// ❌ Incorrect +const result = await generateText({ + model: 'anthropic/claude-opus-4.5', + prompt: `Extract the user info as JSON: { "name": string, "age": number } + + Input: John is 25 years old`, +}); +const parsed = JSON.parse(result.text); + +// ✅ Correct +import { generateText, Output } from 'ai'; + +const result = await generateText({ + model: 'anthropic/claude-opus-4.5', + output: Output.object({ + schema: z.object({ + name: z.string(), + age: z.number(), + }), + }), + prompt: 'Extract the user info: John is 25 years old', +}); + +console.log(result.output); // { name: 'John', age: 25 } +``` + +## Other `output` options + +```typescript +// Output.array - for generating arrays of items +const result = await generateText({ + model: 'anthropic/claude-opus-4.5', + output: Output.array({ + element: z.object({ + city: z.string(), + country: z.string(), + }), + }), + prompt: 'List 5 capital cities', +}); + +// Output.choice - for selecting from predefined options +const result = await generateText({ + model: 'anthropic/claude-opus-4.5', + output: Output.choice({ + options: ['positive', 'negative', 'neutral'] as const, + }), + prompt: 'Classify the sentiment: I love this product!', +}); + +// Output.json - for untyped JSON output +const result = await generateText({ + model: 'anthropic/claude-opus-4.5', + output: Output.json(), + prompt: 'Return some JSON data', +}); +``` diff --git a/.agents/skills/app-renderer-systems/SKILL.md b/.agents/skills/app-renderer-systems/SKILL.md new file mode 100644 index 00000000..03f3fb3a --- /dev/null +++ b/.agents/skills/app-renderer-systems/SKILL.md @@ -0,0 +1,208 @@ +--- +name: app-renderer-systems +description: Guides creation and modification of domain feature systems organized under a systems/ directory. Covers directory layout, API service layer patterns, TanStack Query hooks (queries, mutations, optimistic updates), React context and XState store conventions, hook organization, and public API barrel exports. Use when adding a new domain system, extending an existing one, or fixing bugs in a system-layer codebase. Don't use for generic React component work, backend API implementation, or codebases not organized around a systems/ domain pattern. +allowed-tools: Read, Grep, Glob +--- + +# Feature Systems Guide + +A "system" is a self-contained, domain-driven module that owns everything related to one domain: its API calls, query layer, hooks, components, and public API. Systems live under a `systems//` directory. + +Read `references/directory-layout.md` for the full directory structure and naming conventions. +Read `references/patterns.md` for annotated implementation patterns per layer. + +## Quick Reference + +### Mandatory Companion Skills + +Activate alongside this skill — systems span multiple technical domains: + +| Situation | Activate | +| --------------------- | ----------------------------------------- | +| Any hook or component | `react` + `tanstack-query-best-practices` | +| Data fetching/caching | `tanstack-query-best-practices` | +| Mutations | `tanstack-query-best-practices` | +| XState store | `xstate` | +| Utility functions | `es-toolkit` | +| Writing/fixing tests | `test-antipatterns` + `vitest` | +| Bug fix | `systematic-debugging` + `no-workarounds` | + +### System Directory at a Glance + +``` +systems// +├── index.ts # Public API barrel — required for every system +├── types.ts # TypeScript types for this domain +├── adapters/ # API service layer (HTTP calls, error types) +│ └── -api.ts +├── lib/ # Pure utilities, schemas, constants, query keys +│ ├── query-keys.ts # TanStack Query key factory +│ ├── query-options.ts # Reusable queryOptions / mutationOptions +│ ├── -schemas.ts +│ └── constants.ts +├── hooks/ # React hooks (queries, mutations, view-models) +│ ├── __tests__/ +│ ├── use-.ts # Query hooks +│ ├── use-create-.ts # Mutation hooks +│ ├── use-update-.ts +│ ├── use-delete-.ts +│ └── use--view-model.ts +├── contexts/ # React contexts + providers +│ └── -context.tsx +├── stores/ # XState stores (complex async state machines) +│ └── -store.ts +├── components/ # React UI components +│ ├── stories/ +│ └── index.ts +└── guards/ # Route guards / access checks +``` + +## Step-by-Step: Creating a New System + +### Step 1 — Define types.ts + +- Export clean domain types; never expose raw API response shapes. +- Derive from the project's API contract types when available. +- Document complex aggregated types with JSDoc explaining derivation rules and invariants. + +### Step 2 — Build the API service layer + +- Create `adapters/-api.ts`. +- Use the project's HTTP client for API calls. +- Export a single namespace object: `export const Api = { list, create, update, delete }`. +- Export a typed error class: `export class ApiError extends Error { ... }`. +- Accept `signal?: AbortSignal` on every function to support query cancellation. +- Keep all internal helpers (error extraction, response normalization) private to the module. + +### Step 3 — Add lib/query-keys.ts + +```ts +export const Keys = { + all: [""] as const, + lists: () => [...Keys.all, "list"] as const, + list: (scopeId: string | null) => [...Keys.lists(), scopeId] as const, + details: () => [...Keys.all, "detail"] as const, + detail: (id: string) => [...Keys.details(), id] as const, +}; +``` + +- Use hierarchical key structure for granular invalidation. +- Scope keys with any identifier (userId, orgId, etc.) that isolates the cache correctly. +- Use `as const` on every key tuple. + +### Step 4 — Add lib/query-options.ts + +```ts +import { queryOptions } from "@tanstack/react-query"; +import { Api } from "../adapters/-api"; +import { Keys } from "./query-keys"; + +export function ListOptions(scopeId: string | null) { + return queryOptions({ + queryKey: Keys.list(scopeId), + queryFn: ({ signal }) => Api.list(scopeId!, signal), + staleTime: 60_000, + enabled: Boolean(scopeId), + }); +} + +export function DetailOptions(id: string) { + return queryOptions({ + queryKey: Keys.detail(id), + queryFn: ({ signal }) => Api.get(id, signal), + enabled: Boolean(id), + }); +} +``` + +- Co-locate `queryKey` and `queryFn` via `queryOptions` for type safety and reuse. +- Export each option factory for use in hooks, prefetching, and route loaders. +- Always pass `signal` from the query context through to the API layer. + +### Step 5 — Write hooks + +- **Query hooks**: Wrap `useQuery` with the `queryOptions` factories; accept a scope ID + optional `{ enabled? }`. +- **Mutation hooks**: Use `useMutation` with proper `onMutate` / `onError` / `onSettled` callbacks for optimistic updates. +- **View-model hooks**: Compose multiple hooks for a page/shell component; return a flat object. +- Place tests in `hooks/__tests__/` or co-locate as `use-xxx.test.tsx`. + +Read `references/patterns.md` for complete mutation and optimistic update patterns. + +### Step 6 — (Optional) Add context + +Create `contexts/-context.tsx` when query data or combined state must be shared across a component subtree without prop-drilling. + +```ts +// Always nullable context — consumer hook throws if used outside provider +export const Context = createContext<ContextValue | null>(null); +``` + +- Export the context, provider component, and re-export consumer hooks from the same file. +- For performance-sensitive trees, split into Core / UI / Operations sub-contexts. + +### Step 7 — (Optional) Add an XState store + +Create `stores/-store.ts` for complex async state machines (multi-step flows, polling, event emission). + +```ts +export const Store = createStore({ + context: { ... } as Context, + emits: { ... }, + on: { + someEvent: (context, event, enqueue) => { + enqueue.effect(async () => { ... }); + return { ...context, isLoading: true }; + }, + }, +}); +``` + +### Step 8 — Wire up index.ts + +Organize the barrel with labeled sections and explicit named exports: + +```ts +// Types +export type { Type } from "./types"; + +// Hooks +export { useList, useDetail } from "./hooks"; +export { useCreate, useUpdate, useDelete } from "./hooks"; + +// Components +export { Component } from "./components"; + +// Utilities +export { HelperFn } from "./lib/-utils"; + +// Query Keys & Options +export { Keys } from "./lib/query-keys"; +export { ListOptions, DetailOptions } from "./lib/query-options"; + +// API +export { Api, ApiError } from "./adapters/-api"; +``` + +## Critical Rules + +1. **Use `queryOptions` for co-location.** Co-locate `queryKey` and `queryFn` in reusable option factories. Never scatter the same query key across multiple files. +2. **Unidirectional dependency flow.** `adapters -> lib -> hooks -> components`. Adapters never import from hooks or components. +3. **Scope query keys.** Any query depending on an authenticated scope (user, org, tenant) must include that scope ID in its key to prevent stale cross-scope data. +4. **Typed errors in the API layer.** Never throw raw errors from adapters. Use a typed error class so consumers can distinguish error types without inspecting message strings. +5. **AbortSignal propagation.** Pass `signal` from the `queryFn` context through to every API call for proper query cancellation. +6. **Always invalidate after mutations.** Use `queryClient.invalidateQueries` in `onSettled` to ensure eventual consistency with the server. +7. **Optimistic updates require rollback.** When using cache-based optimistic updates, snapshot previous data in `onMutate` and restore in `onError`. +8. **Cancel outgoing queries before optimistic updates.** Call `queryClient.cancelQueries` in `onMutate` to prevent refetches from overwriting optimistic state. +9. **Zod schemas in lib/.** Place all Zod schemas in `lib/-schemas.ts` for runtime validation at API boundaries. + +## Error Handling + +- **API layer throws typed error**: TanStack Query catches and exposes it via `query.error`. +- **Mutation fails with optimistic update**: `onError` callback rolls back the cache to the snapshot from `onMutate`, then `onSettled` invalidates to refetch fresh data. +- **Stale cross-scope data**: Add the scope ID to the query key and verify that `enabled` guards check `Boolean(scopeId)`. +- **Query cancellation on unmount**: TanStack Query automatically cancels in-flight queries via the `signal` when a component unmounts — ensure `signal` is propagated to the API layer. + +## Detailed References + +- `references/directory-layout.md` — Full directory structure, file naming, and barrel conventions +- `references/patterns.md` — Annotated code patterns for the API layer, query options, hooks, mutations, optimistic updates, contexts, and stores diff --git a/.agents/skills/app-renderer-systems/references/directory-layout.md b/.agents/skills/app-renderer-systems/references/directory-layout.md new file mode 100644 index 00000000..a9a37b8d --- /dev/null +++ b/.agents/skills/app-renderer-systems/references/directory-layout.md @@ -0,0 +1,119 @@ +# System Directory Layout + +## Canonical Structure + +``` +systems// +├── index.ts # REQUIRED — public API barrel +├── types.ts # Domain types +│ +├── adapters/ +│ ├── -api.ts # API service functions + error class +│ └── -api.test.ts +│ +├── lib/ +│ ├── query-keys.ts # TanStack Query key factory +│ ├── query-options.ts # Reusable queryOptions factories +│ ├── -schemas.ts # Zod schemas (API validation + forms) +│ ├── -utils.ts # Pure domain-specific utilities +│ └── constants.ts # Domain constants (timeouts, limits, etc.) +│ +├── hooks/ +│ ├── __tests__/ # Subdirectory for complex/integration tests +│ │ └── use-.test.tsx +│ ├── use-.ts # Query hooks (useQuery wrappers) +│ ├── use-create-.ts # Mutation hooks (useMutation wrappers) +│ ├── use-update-.ts +│ ├── use-delete-.ts +│ └── use--view-model.ts # Composed view-model hook for a page/shell +│ +├── contexts/ +│ ├── -context.tsx # Context + provider + re-exported consumer hooks +│ └── -context.test.tsx +│ +├── stores/ +│ ├── -store.ts # XState store +│ └── -store.test.ts +│ +├── components/ +│ ├── .tsx +│ ├── .test.tsx +│ ├── stories/ +│ │ └── .stories.tsx +│ └── index.ts # Component barrel +│ +└── guards/ + ├── .ts + └── .test.ts +``` + +## File Naming Rules + +| Layer | Pattern | Example | +| ------------- | ------------------------- | --------------------------- | +| API service | `-api.ts` | `issues-api.ts` | +| Types | `types.ts` | `types.ts` | +| Query keys | `query-keys.ts` | `query-keys.ts` | +| Query options | `query-options.ts` | `query-options.ts` | +| Zod schema | `-schemas.ts` | `issue-schemas.ts` | +| Hook | `use-kebab-case.ts` | `use-create-issue.ts` | +| Context | `-context.tsx` | `issue-details-context.tsx` | +| Store | `-store.ts` | `api-key-store.ts` | +| Component | `kebab-case.tsx` | `issue-list-item.tsx` | +| Story | `.stories.tsx` | `issue-list.stories.tsx` | +| Test | `.test.ts(x)` | `use-delete-issue.test.tsx` | + +## Folders That Are Optional + +Only create these when the system actually needs them: + +- `contexts/` — only when query data or state must be shared across a subtree without prop-drilling +- `stores/` — only for complex async state machines (multi-step flows, polling, event emission) +- `guards/` — only for route-level or access-control logic + +## Index Barrel Convention + +Use explicit named exports organized by labeled sections. No `export * from`: + +```ts +// Types +export type { FooType, FooStatus } from "./types"; + +// Hooks — Queries +export { useFooList } from "./hooks/use-foo-list"; +export { useFooDetail } from "./hooks/use-foo-detail"; + +// Hooks — Mutations +export { useCreateFoo } from "./hooks/use-create-foo"; +export { useUpdateFoo } from "./hooks/use-update-foo"; +export { useDeleteFoo } from "./hooks/use-delete-foo"; + +// Components +export { FooList, FooDetail } from "./components"; + +// Utilities +export { fooHelperFn } from "./lib/foo-utils"; + +// Query Keys & Options +export { fooKeys } from "./lib/query-keys"; +export { fooListOptions, fooDetailOptions } from "./lib/query-options"; + +// API +export { fooApi, FooApiError } from "./adapters/foo-api"; +``` + +## Component Barrel Convention + +`components/index.ts` exports all public components by name: + +```ts +export { FooCard } from "./foo-card"; +export { FooList } from "./foo-list"; +export { FooGuard } from "./foo-guard"; +``` + +## Cross-System Imports + +- Import from another system using its public barrel: `import { issuesApi } from "@/systems/issues"`. +- Never reach into another system's internals: `import { xxx } from "@/systems/issues/adapters/issues-api"` is forbidden. +- Shared utilities that multiple systems need belong in the project's shared `lib/` directory, not inside any system folder. diff --git a/.agents/skills/app-renderer-systems/references/patterns.md b/.agents/skills/app-renderer-systems/references/patterns.md new file mode 100644 index 00000000..16e32e0a --- /dev/null +++ b/.agents/skills/app-renderer-systems/references/patterns.md @@ -0,0 +1,544 @@ +# System Implementation Patterns + +> **Note on project-specific imports**: The patterns below use placeholder imports (`your-http-client`, `your-query-client`, etc.). Replace these with the actual paths used in the target project. Before writing code, read the existing systems in the codebase to confirm the exact import paths for the HTTP client, query client, error base class, and other shared utilities. + +--- + +## API Service Layer (`adapters/-api.ts`) + +The adapter owns all HTTP communication for the domain. It exports a single namespace object and a typed error class. All internal helpers stay private. + +```ts +import type { FooResponse, CreateFooBody, UpdateFooBody } from "../types"; + +// --- Typed error class --- +// Extend the project's base error class if one exists (e.g. AppError, ApiError). +// Otherwise extend Error directly. +export class FooApiError extends Error { + constructor( + message: string, + public readonly statusCode?: number, + public readonly code?: string + ) { + super(message); + this.name = "FooApiError"; + } +} + +// --- Private helpers --- +function extractErrorMessage(error: unknown, fallback: string): string { + if (!error || typeof error !== "object") return fallback; + const e = error as Record; + // Handle both flat { message } and nested { error: { message } } shapes + const nested = (e.error as Record | undefined)?.message; + const flat = e.message; + return (typeof nested === "string" ? nested : typeof flat === "string" ? flat : null) ?? fallback; +} + +async function handleResponse(response: Response, fallback: string): Promise { + if (!response.ok) { + let body: unknown; + try { + body = await response.json(); + } catch { + /* ignore */ + } + throw new FooApiError(extractErrorMessage(body, fallback), response.status); + } + if (response.status === 204) return null as T; + return response.json() as Promise; +} + +// --- API namespace --- +// Use the project's typed HTTP client (e.g. openapi-fetch, ky, axios, or raw fetch). +// The important contract: accept signal, throw FooApiError on failure. + +export const fooApi = { + list: async (scopeId: string, signal?: AbortSignal): Promise => { + const response = await fetch(`/api/foos?scopeId=${scopeId}`, { signal }); + return handleResponse(response, "Failed to fetch foos"); + }, + + get: async (fooId: string, signal?: AbortSignal): Promise => { + const response = await fetch(`/api/foos/${fooId}`, { signal }); + return handleResponse(response, "Failed to fetch foo"); + }, + + create: async (body: CreateFooBody): Promise => { + const response = await fetch("/api/foos", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + return handleResponse(response, "Failed to create foo"); + }, + + update: async (fooId: string, body: UpdateFooBody): Promise => { + const response = await fetch(`/api/foos/${fooId}`, { + method: "PATCH", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + return handleResponse(response, "Failed to update foo"); + }, + + delete: async (fooId: string, signal?: AbortSignal): Promise => { + const response = await fetch(`/api/foos/${fooId}`, { method: "DELETE", signal }); + await handleResponse(response, "Failed to delete foo"); + }, +}; +``` + +--- + +## Query Keys (`lib/query-keys.ts`) + +Use hierarchical key structure for granular invalidation. Each level enables broader or narrower cache operations. + +```ts +export const fooKeys = { + all: ["foo"] as const, + // Granular levels for targeted invalidation + lists: () => [...fooKeys.all, "list"] as const, + list: (scopeId: string | null) => [...fooKeys.lists(), scopeId] as const, + details: () => [...fooKeys.all, "detail"] as const, + detail: (fooId: string) => [...fooKeys.details(), fooId] as const, +}; + +// Invalidation examples: +// queryClient.invalidateQueries({ queryKey: fooKeys.all }) — invalidates everything +// queryClient.invalidateQueries({ queryKey: fooKeys.lists() }) — invalidates all lists +// queryClient.invalidateQueries({ queryKey: fooKeys.list("x") }) — invalidates one specific list +``` + +--- + +## Query Options (`lib/query-options.ts`) + +Co-locate `queryKey` and `queryFn` via `queryOptions` for type safety, reuse across hooks, prefetching, and route loaders. + +```ts +import { queryOptions } from "@tanstack/react-query"; +import { fooApi } from "../adapters/foo-api"; +import { fooKeys } from "./query-keys"; + +const STALE_TIME = 1000 * 60; // 1 min + +export function fooListOptions(scopeId: string | null) { + return queryOptions({ + queryKey: fooKeys.list(scopeId), + queryFn: ({ signal }) => fooApi.list(scopeId!, signal), + staleTime: STALE_TIME, + enabled: Boolean(scopeId), + }); +} + +export function fooDetailOptions(fooId: string) { + return queryOptions({ + queryKey: fooKeys.detail(fooId), + queryFn: ({ signal }) => fooApi.get(fooId, signal), + enabled: Boolean(fooId), + }); +} +``` + +Usage across the system: + +```ts +// In a hook +useQuery(fooListOptions(scopeId)); + +// In a route loader for prefetching +queryClient.ensureQueryData(fooListOptions(scopeId)); + +// For manual cache reads +queryClient.getQueryData(fooListOptions(scopeId).queryKey); +``` + +--- + +## Zod Schema (`lib/-schemas.ts`) + +```ts +import { z } from "zod"; + +const fooStatusSchema = z.enum(["pending", "active", "completed"]); + +export const fooSchema = z.object({ + id: z.string(), + title: z.string(), + status: fooStatusSchema, + createdAt: z.string().datetime(), + updatedAt: z.string().datetime(), +}); + +export type FooStatus = z.infer; +``` + +--- + +## Query Hook (`hooks/use-.ts`) + +Wrap `queryOptions` in a hook. Accept scope parameters and optional overrides. + +```ts +import { useQuery } from "@tanstack/react-query"; +import { fooListOptions, fooDetailOptions } from "../lib/query-options"; + +export function useFooList(scopeId: string | null, options?: { enabled?: boolean }) { + const enabled = Boolean(scopeId) && (options?.enabled ?? true); + return useQuery({ ...fooListOptions(scopeId), enabled }); +} + +export function useFooDetail(fooId: string) { + return useQuery(fooDetailOptions(fooId)); +} +``` + +--- + +## Mutation Hook — Simple (`hooks/use-create-.ts`) + +Use `useMutation` with `onSettled` invalidation. This is the standard pattern when optimistic updates are not needed. + +```ts +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { fooApi } from "../adapters/foo-api"; +import { fooKeys } from "../lib/query-keys"; +import type { CreateFooBody, FooResponse } from "../types"; + +export function useCreateFoo(scopeId: string) { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: body => fooApi.create(body), + onSuccess: () => { + // Invalidate the list to refetch fresh data + queryClient.invalidateQueries({ queryKey: fooKeys.list(scopeId) }); + }, + }); +} +``` + +--- + +## Mutation Hook — Optimistic via UI Variables (`hooks/use-update-.ts`) + +The simplest optimistic pattern. Use when the optimistic change is only visible in one place. No cache manipulation or rollback needed. + +```ts +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { fooApi } from "../adapters/foo-api"; +import { fooKeys } from "../lib/query-keys"; +import type { UpdateFooBody, FooResponse } from "../types"; + +export function useUpdateFoo(scopeId: string) { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: ({ fooId, body }) => fooApi.update(fooId, body), + onSettled: () => { + queryClient.invalidateQueries({ queryKey: fooKeys.list(scopeId) }); + }, + }); +} + +// In the component — use `variables` and `isPending` for optimistic UI: +// +// const { mutate, variables, isPending } = useUpdateFoo(scopeId); +// const displayTitle = isPending ? variables?.body.title : foo.title; +``` + +--- + +## Mutation Hook — Optimistic via Cache (`hooks/use-create--optimistic.ts`) + +Use cache-based optimistic updates when multiple components need to reflect the change immediately. + +```ts +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { fooApi } from "../adapters/foo-api"; +import { fooKeys } from "../lib/query-keys"; +import type { CreateFooBody, FooResponse } from "../types"; + +export function useCreateFooOptimistic(scopeId: string) { + const queryClient = useQueryClient(); + const listKey = fooKeys.list(scopeId); + + return useMutation< + FooResponse, + Error, + CreateFooBody, + { previousFoos: FooResponse[] | undefined } + >({ + mutationFn: body => fooApi.create(body), + + onMutate: async newFoo => { + // 1. Cancel outgoing refetches to prevent them from overwriting optimistic data + await queryClient.cancelQueries({ queryKey: listKey }); + + // 2. Snapshot previous data for rollback + const previousFoos = queryClient.getQueryData(listKey); + + // 3. Optimistically add the new item to the cache + queryClient.setQueryData(listKey, old => [ + ...(old ?? []), + { + id: crypto.randomUUID(), // Temporary ID + ...newFoo, + status: newFoo.status ?? "pending", + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + } as FooResponse, + ]); + + // 4. Return snapshot for rollback + return { previousFoos }; + }, + + onError: (_err, _newFoo, context) => { + // Roll back to the previous state on failure + if (context?.previousFoos) { + queryClient.setQueryData(listKey, context.previousFoos); + } + }, + + onSettled: () => { + // Always invalidate to sync with the server + queryClient.invalidateQueries({ queryKey: listKey }); + }, + }); +} +``` + +--- + +## Delete Mutation Hook (`hooks/use-delete-.ts`) + +```ts +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { fooApi } from "../adapters/foo-api"; +import { fooKeys } from "../lib/query-keys"; +import type { FooResponse } from "../types"; + +export function useDeleteFoo(scopeId: string) { + const queryClient = useQueryClient(); + const listKey = fooKeys.list(scopeId); + + return useMutation({ + mutationFn: fooId => fooApi.delete(fooId), + + onMutate: async fooId => { + await queryClient.cancelQueries({ queryKey: listKey }); + const previousFoos = queryClient.getQueryData(listKey); + + // Optimistically remove from the list + queryClient.setQueryData( + listKey, + old => old?.filter(item => item.id !== fooId) ?? [] + ); + + return { previousFoos }; + }, + + onError: (_err, _fooId, context) => { + if (context?.previousFoos) { + queryClient.setQueryData(listKey, context.previousFoos); + } + }, + + onSettled: () => { + queryClient.invalidateQueries({ queryKey: listKey }); + }, + }); +} +``` + +--- + +## Context (`contexts/-context.tsx`) + +Use context to share query data or domain state across a component subtree without prop-drilling. + +```ts +import { createContext, use, useMemo } from "react"; +import type { FooResponse } from "../types"; + +interface FooContextValue { + scopeId: string; + items: FooResponse[]; + isLoading: boolean; +} + +export const FooContext = createContext(null); + +export function FooProvider({ + scopeId, + items, + isLoading, + children, +}: FooContextValue & { children: React.ReactNode }) { + const value = useMemo(() => ({ scopeId, items, isLoading }), [scopeId, items, isLoading]); + return {children}; +} + +// Consumer hook — throws descriptively if used outside the provider +export function useFooContext(): FooContextValue { + const ctx = use(FooContext); + if (!ctx) throw new Error("useFooContext must be used within "); + return ctx; +} +``` + +For performance-sensitive trees with many consumers, split into focused sub-contexts: + +```ts +export const FooCoreContext = createContext(null); +export const FooUiContext = createContext(null); +export const FooActionsContext = createContext(null); + +export function FooProvider({ children, ...props }: FooProviderProps) { + const state = useFooProviderState(props); + return ( + + + + {children} + + + + ); +} +``` + +--- + +## XState Store (`stores/-store.ts`) + +Use for complex async state machines — multi-step flows, polling, event emission. + +```ts +import { createStore } from "@xstate/store"; +import { fooApi } from "../adapters/foo-api"; +import type { FooResponse } from "../types"; + +interface FooStoreContext { + data: FooResponse | null; + isLoading: boolean; + error: string | null; +} + +export const fooStore = createStore({ + context: { + data: null, + isLoading: false, + error: null, + } as FooStoreContext, + + emits: { + dataLoaded: (_payload: { data: FooResponse }) => {}, + loadFailed: (_payload: { error: string }) => {}, + }, + + on: { + load: (context, event: { id: string }, enqueue) => { + enqueue.effect(async () => { + try { + const data = await fooApi.get(event.id); + enqueue.emit.dataLoaded({ data }); + fooStore.trigger.setData({ data }); + } catch (err) { + const error = err instanceof Error ? err.message : "Failed to load"; + enqueue.emit.loadFailed({ error }); + fooStore.trigger.setError({ error }); + } + }); + return { ...context, isLoading: true, error: null }; + }, + + setData: (context, event: { data: FooResponse }) => ({ + ...context, + data: event.data, + isLoading: false, + error: null, + }), + + setError: (context, event: { error: string }) => ({ + ...context, + error: event.error, + isLoading: false, + }), + + reset: _context => ({ data: null, isLoading: false, error: null }), + }, +}); +``` + +--- + +## View-Model Hook + +Compose multiple hooks for a single page/shell component. Return a flat object. + +```ts +import { useFooList } from "./use-foo-list"; +import { useFooDetail } from "./use-foo-detail"; +import { useCreateFoo } from "./use-create-foo"; +import { useDeleteFoo } from "./use-delete-foo"; + +export function useFooDetailViewModel(fooId: string, scopeId: string) { + const list = useFooList(scopeId); + const { data: detail, isLoading, error } = useFooDetail(fooId); + const create = useCreateFoo(scopeId); + const remove = useDeleteFoo(scopeId); + + return { detail, isLoading, error, items: list.data, create, remove }; +} +``` + +--- + +## Types (`types.ts`) + +Export clean domain types. Derive from the project's API contract when available. + +```ts +// If the project has a generated API contract, derive from it: +// import type { OperationResponse } from "your-api-contract"; +// type FooContract = OperationResponse<"getFoo">; +// export type FooResponse = FooContract; + +// Otherwise define types directly: +export interface FooResponse { + id: string; + title: string; + status: FooStatus; + createdAt: string; + updatedAt: string; +} + +export type FooStatus = "pending" | "active" | "completed"; + +export interface CreateFooBody { + title: string; + status?: FooStatus; +} + +export interface UpdateFooBody { + title?: string; + status?: FooStatus; +} + +/** + * Aggregated UI state for the foo detail view. + * + * Derivation rules: + * - isActive: status === "active" + * - canEdit: isActive && !isDeleting + */ +export interface FooDetailState { + foo: FooResponse; + isActive: boolean; + canEdit: boolean; +} +``` diff --git a/.agents/skills/architectural-analysis/SKILL.md b/.agents/skills/architectural-analysis/SKILL.md new file mode 100644 index 00000000..af7f89ef --- /dev/null +++ b/.agents/skills/architectural-analysis/SKILL.md @@ -0,0 +1,645 @@ +--- +name: architectural-analysis +description: Deep architectural audit focused on finding dead code, duplicated functionality, architectural anti-patterns, type confusion, and code smells. Use when user asks for architectural analysis, find dead code, identify duplication, or assess codebase health. +--- + +# Architectural Analysis + +## Instructions + +Perform comprehensive architectural audit focused on structural issues, dead code, duplication, and systemic problems. + +### Phase 1: Discovery & Planning + +#### Step 1: Map Codebase Structure +```bash +# Get directory structure +find . -type d -not -path "*/node_modules/*" -not -path "*/.git/*" + +# Count files by type +find . -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" | wc -l +``` + +#### Step 2: Identify Entry Points +- Main application entry (`index.ts`, `main.ts`, `app.ts`) +- API routes/controllers +- Public exports (`index.ts` files) +- CLI entry points +- Test files + +#### Step 3: Create Comprehensive File List +Use Glob to find all source files. +Create todo list with one item per file to analyze. + +### Phase 2: Dead Code Detection + +For EACH file in the todo list: + +#### Step 1: Identify Exports +- What does this file export? +- Are exports functions, classes, types, constants? +- Is anything exported at all? + +#### Step 2: Search for Usage + +For each export, search if it's imported/used anywhere: +```bash +# Search for imports of this export +grep -r "import.*ExportName" . --include="*.ts" --include="*.tsx" +grep -r "from.*filename" . --include="*.ts" --include="*.tsx" + +# Search for direct usage +grep -r "ExportName" . --include="*.ts" --include="*.tsx" +``` + +#### Step 3: Categorize Code + +**Dead Code** (mark for removal): +- Exported but never imported +- Functions defined but never called +- Classes instantiated nowhere +- Types defined but never used +- Constants defined but never referenced +- Entire files with no imports from other files + +**Possibly Dead** (needs verification): +- Only used in commented-out code +- Only used in dead code +- Only used in other unused exports +- Used only in tests for deprecated features + +**Internal Dead Code**: +- Functions defined in file but never called (not exported) +- Variables assigned but never read +- Parameters accepted but never used + +#### Step 4: Check for False Positives + +Not dead if: +- Used in tests (may be public API) +- Dynamically imported/required +- Used via reflection/string references +- Part of public API (even if not used internally) +- Framework hooks (lifecycle methods, callbacks) +- Accessed via `window` or global scope + +#### Step 5: Record Findings +``` +File: path/to/file.ts +Status: [DEAD|POSSIBLY_DEAD|USED] +Exports: [list] +Dead Exports: + - ExportName - No imports found + - AnotherExport - Only used in test for deprecated feature +Confidence: [HIGH|MEDIUM|LOW] +``` + +#### Step 6: Mark Complete +Update todo list. + +### Phase 3: Duplication Detection + +#### Step 1: Identify Duplicated Logic Patterns + +Search for common patterns that suggest duplication: +- Similar function names across files +- Repeated code blocks +- Multiple implementations of same concept + +**Manual Pattern Recognition**: +- Read files in same directory +- Look for suspiciously similar code +- Compare utilities/helpers across modules +- Check for copy-pasted blocks + +**Grep-Based Detection**: +```bash +# Find similar function signatures +grep -r "function validateEmail" . --include="*.ts" +grep -r "async.*fetch.*api" . --include="*.ts" +grep -r "export.*UserForm" . --include="*.tsx" +``` + +#### Step 2: Analyze Duplicated Functionality + +For each potential duplication: +- Read both/all implementations +- Are they actually the same logic? +- Do they handle same cases? +- Could one replace the other? +- Are differences intentional or accidental? + +#### Step 3: Categorize Duplication + +**Exact Duplication** (CRITICAL): +- Identical or near-identical code in multiple places +- Copy-pasted functions +- Duplicated utility functions +- **Impact**: Bug fixes need multiple updates, maintenance burden + +**Similar Logic** (HIGH): +- Same algorithm, different implementation +- Slightly different parameter handling +- Different names, same purpose +- **Impact**: Inconsistency risk, harder to maintain + +**Conceptual Duplication** (MEDIUM): +- Multiple ways to do the same thing +- Competing implementations +- Overlapping utilities +- **Impact**: Confusion, decision paralysis + +**Type Duplication** (HIGH): +- Same interface/type defined multiple times +- Similar types that should be unified +- Duplicate constants/enums +- **Impact**: Type inconsistency, refactoring difficulty + +#### Step 4: Record Duplication +``` +Duplication Group: Email Validation +Type: Exact Duplication +Instances: + - src/utils/validators.ts:42 - validateEmail() + - src/lib/email.ts:15 - isValidEmail() + - src/components/forms/validation.ts:67 - checkEmailFormat() +Analysis: All three implement same regex check +Recommendation: Keep utils/validators.ts version, remove others +Impact: 3 places to update when logic changes +``` + +### Phase 4: Architectural Anti-Patterns + +#### Step 1: Identify God Objects/Classes + +Search for files that do too much: +- Files over 500 lines +- Classes with 10+ methods +- Files with many responsibilities +- Modules that import from everywhere + +```bash +# Find large files +find . -name "*.ts" -exec wc -l {} + | sort -rn | head -20 +``` + +Analyze large files: +- What does this file do? +- Does it have single responsibility? +- Should it be split? + +#### Step 2: Detect Circular Dependencies + +Look for: +- File A imports from B, B imports from A +- Circular chains: A → B → C → A +- Module coupling cycles + +Use grep to trace import chains: +```bash +# Check what file imports +grep "^import.*from" src/services/auth.ts + +# Check what imports this file +grep -r "from.*auth" src/ --include="*.ts" +``` + +#### Step 3: Find Tight Coupling + +Identify: +- High-level modules depending on low-level modules +- Business logic depending on infrastructure +- Core logic depending on framework specifics +- Modules that import from many other modules + +#### Step 4: Spot Layer Violations + +Check architecture layers: +- Do components import directly from database layer? +- Do models import from views? +- Do utilities import from business logic? +- Is there proper separation of concerns? + +#### Step 5: Identify Other Anti-Patterns + +**Singleton Abuse**: +- Global state everywhere +- Module-level mutable state +- Static class methods accessing shared state + +**Anemic Domain Models**: +- Data classes with no behavior +- All logic in services, models just have getters/setters + +**Shotgun Surgery**: +- Single feature change requires touching many files +- Indicates poor cohesion + +**Feature Envy**: +- Methods that use more data from other classes than their own + +### Phase 5: Type Issues Analysis + +#### Step 1: Find Type Abuse + +Search for problematic type usage: +```bash +# Find 'any' usage +grep -r ": any" . --include="*.ts" --include="*.tsx" -n + +# Find 'unknown' usage +grep -r ": unknown" . --include="*.ts" -n + +# Find type assertions +grep -r "as any" . --include="*.ts" -n +grep -r "as unknown" . --include="*.ts" -n + +# Find @ts-ignore +grep -r "@ts-ignore" . --include="*.ts" -n +grep -r "@ts-expect-error" . --include="*.ts" -n +``` + +#### Step 2: Analyze Type Confusion + +For each file with type issues: +- Why is `any` used? +- Could proper type be defined? +- Is type assertion hiding a real type error? +- Are @ts-ignore comments masking actual problems? + +#### Step 3: Find Type Duplication + +Look for: +- Same interface defined in multiple files +- Similar types that could be unified +- Types that could extend from common base +- Constants/enums duplicated across files + +#### Step 4: Identify Missing Types + +Check for: +- Implicit `any` from missing type annotations +- Functions without return type +- Callbacks without proper typing +- Generic types that should be specific + +### Phase 6: Code Smells Detection + +#### Step 1: Long Methods/Functions +```bash +# Find functions with many lines +# (manual inspection of large files) +``` + +Flag functions over 50 lines - likely doing too much. + +#### Step 2: Long Parameter Lists + +Search for functions with 4+ parameters: +- Could use object parameter instead? +- Are parameters related (should be grouped)? + +#### Step 3: Complex Conditionals + +Look for: +- Deeply nested if statements (3+ levels) +- Long boolean expressions +- Switch statements with 10+ cases +- Complex ternary operators + +#### Step 4: Magic Numbers/Strings + +Search for: +- Hardcoded numbers with unclear meaning +- String literals used repeatedly +- Unexplained constants + +Should be named constants. + +#### Step 5: Commented-Out Code + +```bash +# Find commented code blocks +grep -r "^[[:space:]]*//.*function\|class\|const" . --include="*.ts" +``` + +Commented code should be deleted (use git history). + +#### Step 6: Poor Naming + +Look for: +- Single letter variables (outside loops) +- Abbreviations without context (`usr`, `msg`, `tmp`) +- Misleading names +- Names that don't reflect purpose + +### Phase 7: Generate Report + +Create report at `.audits/architectural-analysis-[timestamp].md`: + +```markdown +# Architectural Analysis Report +**Date**: [timestamp] +**Files Analyzed**: X +**Dead Code Files**: Y +**Duplication Groups**: Z + +--- + +## Executive Summary +- **Dead Code**: X files, Y exports completely unused +- **Duplicated Functionality**: Z duplication groups +- **Architectural Anti-Patterns**: W issues +- **Type Issues**: V problematic usages +- **Code Smells**: U instances + +**Estimated Cleanup**: Remove ~X lines of dead code, consolidate Y duplications + +--- + +## Dead Code + +### Completely Dead Files (DELETE) +| File | Reason | Confidence | +|------|--------|------------| +| `src/old/legacy-processor.ts` | No imports found | HIGH | +| `src/utils/unused-helper.ts` | Exported but never used | HIGH | +| `src/temp/temp-service.ts` | Temporary file left behind | HIGH | + +**Total Lines**: X,XXX lines can be deleted + +### Dead Exports (REMOVE) +| File | Export | Reason | +|------|--------|--------| +| `src/utils/format.ts` | `formatOldDate()` | Replaced by `formatDate()`, no usage | +| `src/services/auth.ts` | `oldLogin()` | Deprecated, no usage found | + +### Possibly Dead (VERIFY) +| File | Export | Reason | Verification Needed | +|------|--------|--------|---------------------| +| `src/lib/api.ts` | `fetchOldApi()` | Only used in commented code | Check if truly deprecated | + +### Internal Dead Code +- `src/services/user.ts:125` - Private method `_validateLegacy()` never called +- `src/components/form.tsx:89` - Variable `tempData` assigned but never read + +--- + +## Duplicated Functionality + +### CRITICAL: Exact Duplicates + +#### Duplication Group 1: Email Validation +**Instances**: 3 +**Files**: +- `src/utils/validators.ts:42` - `validateEmail(email: string)` +- `src/lib/email.ts:15` - `isValidEmail(email: string)` +- `src/components/forms/validation.ts:67` - `checkEmailFormat(email: string)` + +**Analysis**: All three use identical regex pattern `/^[^\s@]+@[^\s@]+\.[^\s@]+$/` +**Lines Duplicated**: ~15 lines × 3 = 45 lines +**Recommendation**: +- Keep: `src/utils/validators.ts:validateEmail()` +- Remove: Other two implementations +- Update: All imports to use validators version + +#### Duplication Group 2: API Error Handling +**Instances**: 4 +**Files**: [list] +**Analysis**: [similar] + +### HIGH: Similar Logic + +#### Duplication Group: Date Formatting +**Instances**: 2 +**Files**: +- `src/utils/date.ts:30` - `formatDate()` - Uses date-fns +- `src/lib/format.ts:45` - `formatDateTime()` - Uses native Date + +**Analysis**: Both format dates but use different libraries +**Recommendation**: Standardize on date-fns, remove native version + +### Type Duplication + +#### Type Group: User Interface +**Instances**: 3 +**Files**: +- `src/types/user.ts` - `User` interface +- `src/models/user.ts` - `UserModel` interface (identical fields) +- `src/api/types.ts` - `UserData` interface (identical fields) + +**Recommendation**: Use single `User` type from `src/types/user.ts` + +--- + +## Architectural Anti-Patterns + +### God Objects + +#### `src/services/application-manager.ts` (850 lines) +**Responsibilities**: Database, auth, config, logging, caching, validation +**Issue**: Violates SRP, does everything +**Recommendation**: Split into: +- `database.service.ts` +- `auth.service.ts` +- `config.service.ts` +- `logging.service.ts` + +### Circular Dependencies + +#### Cycle 1: `auth.ts` ↔ `user.ts` +- `auth.ts` imports `getUserById` from `user.ts` +- `user.ts` imports `validateToken` from `auth.ts` +**Issue**: Creates tight coupling, makes testing hard +**Recommendation**: Extract shared types to separate file + +### Tight Coupling + +#### `components/UserForm.tsx` → `services/database.ts` +**Issue**: UI component directly importing database layer +**Recommendation**: Use service layer abstraction + +### Layer Violations + +#### `models/User.ts` imports from `components/` +**Issue**: Model layer should not know about view layer +**Recommendation**: Remove dependency, pass data via props + +--- + +## Type Issues + +### `any` Usage (X instances) + +| File | Line | Context | Severity | +|------|------|---------|----------| +| `src/api/client.ts` | 45 | `response: any` | HIGH | +| `src/utils/parse.ts` | 23 | `data: any` | HIGH | + +**Total `any` usages**: X +**Recommendation**: Define proper types for all cases + +### Type Assertions (Y instances) + +| File | Line | Assertion | Issue | +|------|------|-----------|-------| +| `src/lib/api.ts` | 67 | `as User` | Unsafe cast, no validation | +| `src/utils/parse.ts` | 89 | `as unknown as T` | Double cast to bypass types | + +**Issue**: Type safety bypassed, runtime errors possible + +### @ts-ignore Comments (Z instances) + +| File | Line | Reason | Should Fix | +|------|------|--------|------------| +| `src/legacy/old.ts` | 34 | "Type error in legacy code" | Refactor or remove file | + +--- + +## Code Smells + +### Long Functions (>50 lines) + +| File | Function | Lines | Issue | +|------|----------|-------|-------| +| `src/services/processor.ts` | `processData()` | 127 | Does too much, hard to test | + +**Recommendation**: Extract smaller functions + +### Complex Conditionals + +| File | Line | Issue | +|------|------|-------| +| `src/utils/validator.ts` | 45 | Nested 4 levels deep | +| `src/lib/parser.ts` | 89 | Boolean expression spans 3 lines | + +### Magic Numbers + +| File | Line | Magic Value | Should Be | +|------|------|-------------|-----------| +| `src/config/limits.ts` | 12 | `86400` | `SECONDS_PER_DAY` | +| `src/utils/format.ts` | 34 | `1000` | `MS_PER_SECOND` | + +### Commented-Out Code + +**Files with commented code**: X +- `src/old/legacy.ts` - 45 lines of commented code +- `src/services/auth.ts` - Old implementation commented out + +**Recommendation**: Delete all commented code (use git history) + +--- + +## Statistics + +**Dead Code**: +- Files: X +- Exports: Y +- Lines: Z (estimated) + +**Duplication**: +- Groups: X +- Files affected: Y +- Duplicated lines: ~Z + +**Architectural Issues**: +- God objects: X +- Circular dependencies: Y +- Layer violations: Z + +**Type Issues**: +- `any` usage: X +- Type assertions: Y +- @ts-ignore: Z + +**Code Smells**: +- Long functions: X +- Complex conditionals: Y +- Magic numbers: Z + +--- + +## Impact Assessment + +### Code Cleanup Potential +- **Dead code removal**: ~X,XXX lines +- **Duplication consolidation**: ~Y,YYY lines +- **Total reduction**: ~Z,ZZZ lines (AA% of codebase) + +### Maintainability Improvement +- Fewer places to update when fixing bugs +- Clearer code responsibilities +- Better type safety +- Reduced cognitive load + +### Risk Areas +- High coupling in `services/` directory +- Type safety compromised in `api/` layer +- Architectural violations in `components/` +``` + +### Phase 8: Summary for User + +Provide concise summary: + +```markdown +# Architectural Analysis Complete + +## Dead Code Found +- **X completely dead files** - Can be deleted immediately +- **Y unused exports** - Can be removed +- **~Z,ZZZ lines** of dead code identified + +## Top Dead Files +1. `src/old/legacy-processor.ts` - No imports +2. `src/temp/temp-service.ts` - Temporary file +3. `src/utils/unused-helper.ts` - Exported but never used + +## Duplication Found +- **X duplication groups** identified +- **Most duplicated**: Email validation (3 copies) +- **~Y,YYY lines** of duplicated code + +## Architectural Issues +- **Z god objects** doing too much +- **W circular dependencies** found +- **V layer violations** detected + +## Type Issues +- **X `any` usages** - Should have proper types +- **Y type assertions** - Bypassing type safety +- **Z @ts-ignore comments** - Masking errors + +## Code Smells +- **X long functions** (>50 lines) +- **Y complex conditionals** (3+ nesting) +- **Z magic numbers** - Should be constants + +## Cleanup Potential +Removing dead code and consolidating duplication could eliminate **~X,XXX lines** (Y% of codebase) + +**Full Report**: `.audits/architectural-analysis-[timestamp].md` +``` + +## Critical Principles + +- **NEVER EDIT FILES** - This is analysis only, not cleanup +- **NEVER SKIP FILES** - Analyze entire codebase systematically +- **BE THOROUGH** - Dead code detection requires checking all imports +- **VERIFY DUPLICATES** - Don't just match names, check if logic is same +- **UNDERSTAND ARCHITECTURE** - See the big picture, not just individual files +- **QUANTIFY IMPACT** - Count lines, estimate cleanup potential +- **BE CONFIDENT** - Mark confidence level (HIGH/MEDIUM/LOW) for findings +- **TRACK PROGRESS** - Use todo list for file-by-file analysis + +## Success Criteria + +A complete architectural analysis includes: +- All files analyzed for dead code +- All exports checked for usage +- Duplication groups identified and cataloged +- Architectural anti-patterns found and explained +- Type issues located and categorized +- Code smells flagged +- Impact assessment quantified +- Structured report generated diff --git a/.agents/skills/autoresearch/SKILL.md b/.agents/skills/autoresearch/SKILL.md new file mode 100644 index 00000000..d8b1eff3 --- /dev/null +++ b/.agents/skills/autoresearch/SKILL.md @@ -0,0 +1,329 @@ +--- +name: autoresearch +description: "Autonomously optimize any Claude Code skill by running it repeatedly, scoring outputs against binary evals, mutating the prompt, and keeping improvements. Based on Karpathy's autoresearch methodology. Use when: optimize this skill, improve this skill, run autoresearch on, make this skill better, self-improve skill, benchmark skill, eval my skill, run evals on. Outputs: an improved SKILL.md, a results log, and a changelog of every mutation tried." +--- + +# Autoresearch for Skills + +Most skills work about 70% of the time. The other 30% you get garbage. The fix isn't to rewrite the skill from scratch. It's to let an agent run it dozens of times, score every output, and tighten the prompt until that 30% disappears. + +This skill adapts Andrej Karpathy's autoresearch methodology (autonomous experimentation loops) to Claude Code skills. Instead of optimizing ML training code, we optimize skill prompts. + +--- + +## the core job + +Take any existing skill, define what "good output" looks like as binary yes/no checks, then run an autonomous loop that: + +1. Generates outputs from the skill using test inputs +2. Scores every output against the eval criteria +3. Mutates the skill prompt to fix failures +4. Keeps mutations that improve the score, discards the rest +5. Repeats until the score ceiling is hit or the user stops it + +**Output:** An improved SKILL.md + `results.tsv` log + `changelog.md` of every mutation attempted + a live HTML dashboard you can watch in your browser. + +--- + +## before starting: gather context + +**STOP. Do not run any experiments until all fields below are confirmed with the user. Ask for any missing fields before proceeding.** + +1. **Target skill** — Which skill do you want to optimize? (need the exact path to SKILL.md) +2. **Test inputs** — What 3-5 different prompts/scenarios should we test the skill with? (variety matters — pick inputs that cover different use cases so we don't overfit to one scenario) +3. **Eval criteria** — What 3-6 binary yes/no checks define a good output? (these are your "test questions" — see [references/eval-guide.md](references/eval-guide.md) for how to write good evals) +4. **Runs per experiment** — How many times should we run the skill per mutation? Default: 5. (more runs = more reliable scores, but slower and more expensive. 5 is the sweet spot for most skills.) +5. **Run interval** — How often should experiments cycle? Default: every 2 minutes. (shorter = faster iteration, but costs more) +6. **Budget cap** — Optional. Max number of experiment cycles before stopping. Default: no cap (runs until you stop it). + +--- + +## step 1: read the skill + +Before changing anything, read and understand the target skill completely. + +1. Read the full SKILL.md file +2. Read any files in `references/` that the skill links to +3. Identify the skill's core job, process steps, and output format +4. Note any existing quality checks or anti-patterns already in the skill + +Do NOT skip this. You need to understand what the skill does before you can improve it. + +--- + +## step 2: build the eval suite + +Convert the user's eval criteria into a structured test. Every check must be binary — pass or fail, no scales. + +**Format each eval as:** + +``` +EVAL [number]: [Short name] +Question: [Yes/no question about the output] +Pass condition: [What "yes" looks like — be specific] +Fail condition: [What triggers a "no"] +``` + +**Rules for good evals:** +- Binary only. Yes or no. No "rate 1-7" scales. Scales compound variability and give unreliable results. +- Specific enough to be consistent. "Is the text readable?" is too vague. "Are all words spelled correctly with no truncated sentences?" is testable. +- Not so narrow that the skill games the eval. "Contains fewer than 200 words" will make the skill optimize for brevity at the expense of everything else. +- 3-6 evals is the sweet spot. More than that and the skill starts parroting eval criteria back instead of actually improving. + +See [references/eval-guide.md](references/eval-guide.md) for detailed examples of good vs bad evals. + +**Max score calculation:** +``` +max_score = [number of evals] × [runs per experiment] +``` + +Example: 4 evals × 5 runs = max score of 20. + +--- + +## step 3: generate the live dashboard + +Before running any experiments, create a live HTML dashboard at `autoresearch-[skill-name]/dashboard.html` and open it in the browser. + +The dashboard must: +- Auto-refresh every 10 seconds (reads from results.tsv) +- Show a score progression line chart (experiment number on X axis, pass rate % on Y axis) +- Show a colored bar for each experiment: green = keep, red = discard, blue = baseline +- Show a table of all experiments with: experiment #, score, pass rate, status, description +- Show per-eval breakdown: which evals pass most/least across all runs +- Show current status: "Running experiment [N]..." or "Idle" +- Use clean styling with soft colors (white background, pastel accents, clean sans-serif font) + +Generate the dashboard as a single self-contained HTML file with inline CSS and JavaScript. Use Chart.js loaded from CDN for the line chart. The JS should fetch `results.json` (which you update after each experiment alongside results.tsv) and re-render. + +**Open it immediately** after creating it: `open dashboard.html` (macOS) so the user can see it in their browser. + +**Update `results.json`** after every experiment so the dashboard stays current. The JSON format: + +```json +{ + "skill_name": "[name]", + "status": "running", + "current_experiment": 3, + "baseline_score": 70.0, + "best_score": 90.0, + "experiments": [ + { + "id": 0, + "score": 14, + "max_score": 20, + "pass_rate": 70.0, + "status": "baseline", + "description": "original skill — no changes" + } + ], + "eval_breakdown": [ + {"name": "Text legibility", "pass_count": 8, "total": 10}, + {"name": "Pastel colors", "pass_count": 9, "total": 10} + ] +} +``` + +When the run finishes (user stops it or ceiling hit), update `status` to `"complete"` so the dashboard shows a "Done" state with final summary. + +--- + +## step 4: establish baseline + +Run the skill AS-IS before changing anything. This is experiment #0. + +1. Create a working directory: `autoresearch-[skill-name]/` inside the skill's folder +2. Create `results.tsv` with the header row +3. Create `results.json` and `dashboard.html`, then open the dashboard in the browser +4. Back up the original SKILL.md as `SKILL.md.baseline` +5. Run the skill [N] times using the test inputs +6. Score every output against every eval +7. Record the baseline score and update both results.tsv and results.json + +**results.tsv format (tab-separated):** + +``` +experiment score max_score pass_rate status description +0 14 20 70.0% baseline original skill — no changes +``` + +**IMPORTANT:** After establishing baseline, confirm the score with the user before proceeding. If baseline is already 90%+, the skill may not need optimization — ask the user if they want to continue. + +--- + +## step 5: run the experiment loop + +This is the core autoresearch loop. Once started, run autonomously until stopped. + +**LOOP:** + +1. **Analyze failures.** Look at which evals are failing most. Read the actual outputs that failed. Identify the pattern — is it a formatting issue? A missing instruction? An ambiguous directive? + +2. **Form a hypothesis.** Pick ONE thing to change. Don't change 5 things at once — you won't know what helped. + + Good mutations: + - Add a specific instruction that addresses the most common failure + - Reword an ambiguous instruction to be more explicit + - Add an anti-pattern ("Do NOT do X") for a recurring mistake + - Move a buried instruction higher in the skill (priority = position) + - Add or improve an example that shows the correct behavior + - Remove an instruction that's causing the skill to over-optimize for one thing at the expense of others + + Bad mutations: + - Rewriting the entire skill from scratch + - Adding 10 new rules at once + - Making the skill longer without a specific reason + - Adding vague instructions like "make it better" or "be more creative" + +3. **Make the change.** Edit SKILL.md with ONE targeted mutation. + +4. **Run the experiment.** Execute the skill [N] times with the same test inputs. + +5. **Score it.** Run every output through every eval. Calculate total score. + +6. **Decide: keep or discard.** + - Score improved → **KEEP.** Log it. This is the new baseline. + - Score stayed the same → **DISCARD.** Revert SKILL.md to previous version. The change added complexity without improvement. + - Score got worse → **DISCARD.** Revert SKILL.md to previous version. + +7. **Log the result** in results.tsv. + +8. **Repeat.** Go back to step 1 of the loop. + +**NEVER STOP.** Once the loop starts, do not pause to ask the user if you should continue. They may be away from the computer. Run autonomously until: +- The user manually stops you +- You hit the budget cap (if one was set) +- You hit 95%+ pass rate for 3 consecutive experiments (diminishing returns) + +**If you run out of ideas:** Re-read the failing outputs. Try combining two previous near-miss mutations. Try a completely different approach to the same problem. Try removing things instead of adding them. Simplification that maintains the score is a win. + +--- + +## step 6: write the changelog + +After each experiment (whether kept or discarded), append to `changelog.md`: + +```markdown +## Experiment [N] — [keep/discard] + +**Score:** [X]/[max] ([percent]%) +**Change:** [One sentence describing what was changed] +**Reasoning:** [Why this change was expected to help] +**Result:** [What actually happened — which evals improved/declined] +**Failing outputs:** [Brief description of what still fails, if anything] +``` + +This changelog is the most valuable artifact. It's a research log that any future agent (or smarter future model) can pick up and continue from. + +--- + +## step 7: deliver results + +When the user returns or the loop stops, present: + +1. **Score summary:** Baseline score → Final score (percent improvement) +2. **Total experiments run:** How many mutations were tried +3. **Keep rate:** How many mutations were kept vs discarded +4. **Top 3 changes that helped most** (from the changelog) +5. **Remaining failure patterns** (what the skill still gets wrong, if anything) +6. **The improved SKILL.md** (already saved in place) +7. **Location of results.tsv and changelog.md** for reference + +--- + +## output format + +The skill produces four files in `autoresearch-[skill-name]/`: + +``` +autoresearch-[skill-name]/ +├── dashboard.html # live browser dashboard (auto-refreshes) +├── results.json # data file powering the dashboard +├── results.tsv # score log for every experiment +├── changelog.md # detailed mutation log +└── SKILL.md.baseline # original skill before optimization +``` + +Plus the improved SKILL.md saved back to its original location. + +**results.tsv example:** + +``` +experiment score max_score pass_rate status description +0 14 20 70.0% baseline original skill — no changes +1 16 20 80.0% keep added explicit instruction to avoid numbering in diagrams +2 16 20 80.0% discard tried enforcing left-to-right layout — no improvement +3 18 20 90.0% keep added color palette hex codes instead of vague "pastel" description +4 18 20 90.0% discard added anti-pattern for neon colors — no improvement +5 19 20 95.0% keep added worked example showing correct label formatting +``` + +--- + +## example: optimizing a diagram-generator skill + +**Context gathered:** +- Target skill: `~/.claude/skills/diagram-generator/SKILL.md` +- Test inputs: "OAuth flow diagram", "CI/CD pipeline", "microservices architecture", "user onboarding funnel", "database schema relationships" +- Evals: (1) All text legible and spelled correctly? (2) Uses only pastel/soft colors? (3) Linear layout — left-to-right or top-to-bottom? (4) Free of numbers, ordinals, and ordering? +- Runs per experiment: 10 +- Max score: 40 + +**Baseline run (experiment 0):** +Generated 10 diagrams. Scored each against 4 evals. Result: 32/40 (80%). +Common failures: 3 diagrams had numbered steps, 2 had bright red elements, 3 had illegible small text. + +**Experiment 1 — KEEP (35/40, 87.5%):** +Change: Added "NEVER include step numbers, ordinal numbers (1st, 2nd), or any numerical ordering in diagrams" to the anti-patterns section. +Result: Numbering failures dropped from 3 to 1. Other evals held steady. + +**Experiment 2 — DISCARD (34/40, 85%):** +Change: Added "All text must be minimum 14px font size." +Result: Legibility improved by 1, but color compliance dropped by 2. Reverted. + +**Experiment 3 — KEEP (37/40, 92.5%):** +Change: Replaced vague "pastel colors" instruction with specific hex codes: `#A8D8EA, #AA96DA, #FCBAD3, #FFFFD2, #B5EAD7`. +Result: Color eval went from 8/10 to 10/10. Other evals held. + +**Experiment 4 — DISCARD (37/40, 92.5%):** +Change: Added anti-pattern "Do NOT use red (#FF0000), orange (#FF8C00), or neon green (#39FF14)." +Result: No change. The hex codes from experiment 3 already solved the color problem. Reverted to keep skill simpler. + +**Experiment 5 — KEEP (39/40, 97.5%):** +Change: Added a worked example showing a correct diagram with properly formatted labels (no numbers, pastel fills, left-to-right flow, legible text). +Result: Hit 39/40. One remaining failure: a complex diagram with overlapping labels. Diminishing returns — stopped. + +**Final delivery:** +- Baseline: 32/40 (80%) → Final: 39/40 (97.5%) +- 5 experiments, 3 kept, 2 discarded +- Top changes: specific hex codes for colors, explicit anti-numbering rule, worked example +- Remaining issue: very complex diagrams occasionally get overlapping labels (1/40 failure rate) + +--- + +## how this connects to other skills + +**What feeds into autoresearch:** +- Any existing skill that needs optimization +- User-defined eval criteria (or help them define evals using the eval guide) + +**What autoresearch feeds into:** +- The improved skill replaces the original +- The changelog can be passed to future models for continued optimization +- The eval suite can be reused whenever the skill is updated + +--- + +## the test + +A good autoresearch run: + +1. **Started with a baseline** — never changed anything before measuring the starting point +2. **Used binary evals only** — no scales, no vibes, no "rate this 1-10" +3. **Changed one thing at a time** — so you know exactly what helped +4. **Kept a complete log** — every experiment recorded, kept or discarded +5. **Improved the score** — measurable improvement from baseline to final +6. **Didn't overfit** — the skill got better at the actual job, not just at passing the specific test inputs +7. **Ran autonomously** — didn't stop to ask permission between experiments + +If the skill "passes" all evals but the actual output quality hasn't improved — the evals are bad, not the skill. Go back to step 2 and write better evals. diff --git a/.agents/skills/autoresearch/eval-guide.md b/.agents/skills/autoresearch/eval-guide.md new file mode 100644 index 00000000..a28d69fd --- /dev/null +++ b/.agents/skills/autoresearch/eval-guide.md @@ -0,0 +1,121 @@ +# Eval Guide + +How to write eval criteria that actually improve your skills instead of giving you false confidence. + +--- + +## the golden rule + +Every eval must be a yes/no question. Not a scale. Not a vibe check. Binary. + +Why: Scales compound variability. If you have 4 evals scored 1-7, your total score has massive variance across runs. Binary evals give you a reliable signal. + +--- + +## good evals vs bad evals + +### Text/copy skills (newsletters, tweets, emails, landing pages) + +**Bad evals:** +- "Is the writing good?" (too vague — what's "good"?) +- "Rate the engagement potential 1-10" (scale = unreliable) +- "Does it sound like a human?" (subjective, inconsistent scoring) + +**Good evals:** +- "Does the output contain zero phrases from this banned list: [game-changer, here's the kicker, the best part, level up]?" (binary, specific) +- "Does the opening sentence reference a specific time, place, or sensory detail?" (binary, checkable) +- "Is the output between 150-400 words?" (binary, measurable) +- "Does it end with a specific CTA that tells the reader exactly what to do next?" (binary, structural) + +### Visual/design skills (diagrams, images, slides) + +**Bad evals:** +- "Does it look professional?" (subjective) +- "Rate the visual quality 1-5" (scale) +- "Is the layout good?" (vague) + +**Good evals:** +- "Is all text in the image legible with no truncated or overlapping words?" (binary, specific) +- "Does the color palette use only soft/pastel tones with no neon, bright red, or high-saturation colors?" (binary, checkable) +- "Is the layout linear — flowing either left-to-right or top-to-bottom with no scattered elements?" (binary, structural) +- "Is the image free of numbered steps, ordinals, or sequential numbering?" (binary, specific) + +### Code/technical skills (code generation, configs, scripts) + +**Bad evals:** +- "Is the code clean?" (subjective) +- "Does it follow best practices?" (vague, which best practices?) + +**Good evals:** +- "Does the code run without errors?" (binary, testable — actually execute it) +- "Does the output contain zero TODO or placeholder comments?" (binary, greppable) +- "Are all function and variable names descriptive (no single-letter names except loop counters)?" (binary, checkable) +- "Does the code include error handling for all external calls (API, file I/O, network)?" (binary, structural) + +### Document skills (proposals, reports, decks) + +**Bad evals:** +- "Is it comprehensive?" (compared to what?) +- "Does it address the client's needs?" (too open-ended) + +**Good evals:** +- "Does the document contain all required sections: [list them]?" (binary, structural) +- "Is every claim backed by a specific number, date, or source?" (binary, checkable) +- "Is the document under [X] pages/words?" (binary, measurable) +- "Does the executive summary fit in one paragraph of 3 sentences or fewer?" (binary, countable) + +--- + +## common mistakes + +### 1. Too many evals +More than 6 evals and the skill starts gaming them — it optimizes for passing the test instead of producing good output. Like a student who memorizes answers without understanding the material. + +**Fix:** Pick the 3-6 checks that matter most. If everything passes those, the output is probably good. + +### 2. Too narrow/rigid +"Must contain exactly 3 bullet points" or "Must use the word 'because' at least twice" — these create skills that technically pass but produce weird, stilted output. + +**Fix:** Evals should check for qualities you care about, not arbitrary structural constraints. + +### 3. Overlapping evals +If eval 1 is "Is the text grammatically correct?" and eval 4 is "Are there any spelling errors?" — these overlap. A grammar fail often includes spelling. You're double-counting. + +**Fix:** Each eval should test something distinct. + +### 4. Unmeasurable by an agent +"Would a human find this engaging?" — an agent can't reliably answer this. It'll say "yes" almost every time. + +**Fix:** Translate subjective qualities into observable signals. "Engaging" might mean: "Does the first sentence contain a specific claim, story, or question (not a generic statement)?" + +--- + +## writing your evals: the 3-question test + +Before finalizing an eval, ask: + +1. **Could two different agents score the same output and agree?** If not, the eval is too subjective. Rewrite it. +2. **Could a skill game this eval without actually improving?** If yes, the eval is too narrow. Broaden it. +3. **Does this eval test something the user actually cares about?** If not, drop it. Every eval that doesn't matter dilutes the signal from evals that do. + +--- + +## template + +Copy this for each eval: + +``` +EVAL [N]: [Short name] +Question: [Yes/no question] +Pass: [What "yes" looks like — one sentence, specific] +Fail: [What triggers "no" — one sentence, specific] +``` + +Example: + +``` +EVAL 1: Text legibility +Question: Is all text in the output fully legible with no truncated, overlapping, or cut-off words? +Pass: Every word is complete and readable without squinting or guessing +Fail: Any word is partially hidden, overlapping another element, or cut off at the edge +``` diff --git a/.agents/skills/brainstorming/SKILL.md b/.agents/skills/brainstorming/SKILL.md new file mode 100644 index 00000000..24c264de --- /dev/null +++ b/.agents/skills/brainstorming/SKILL.md @@ -0,0 +1,107 @@ +--- +name: brainstorming +description: "You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation." +--- + +# Brainstorming Ideas Into Designs + +## Overview + +Help turn ideas into fully formed designs and specs through natural collaborative dialogue. + +Start by understanding the current project context, then ask questions one at a time to refine the idea. Once you understand what you're building, present the design and get user approval. + + +Do NOT invoke any implementation skill, write any code, scaffold any project, or take any implementation action until you have presented a design and the user has approved it. This applies to EVERY project regardless of perceived simplicity. + + +## Asking Questions + +When this skill instructs you to ask the user a question, you MUST use your runtime's dedicated interactive question tool — the tool or function that presents a question to the user and **pauses execution until the user responds**. Do not output questions as plain assistant text and continue generating; always use the mechanism that blocks until the user has answered. + +If your runtime does not provide such a tool, present the question as your complete message and stop generating. Do not answer your own question or proceed without user input. + +## Anti-Pattern: "This Is Too Simple To Need A Design" + +Every project goes through this process. A todo list, a single-function utility, a config change — all of them. "Simple" projects are where unexamined assumptions cause the most wasted work. The design can be short (a few sentences for truly simple projects), but you MUST present it and get approval. + +## Checklist + +You MUST create a task for each of these items and complete them in order: + +1. **Explore project context** — check files, docs, recent commits +2. **Ask clarifying questions** — one at a time, understand purpose/constraints/success criteria +3. **Propose 2-3 approaches** — with trade-offs and your recommendation +4. **Present design** — in sections scaled to their complexity, get user approval after each section +5. **Write design doc** — save to `docs/plans/YYYY-MM-DD--design.md` and commit +6. **Transition to implementation** — invoke writing-plans skill to create implementation plan + +## Process Flow + +```dot +digraph brainstorming { + "Explore project context" [shape=box]; + "Ask clarifying questions" [shape=box]; + "Propose 2-3 approaches" [shape=box]; + "Present design sections" [shape=box]; + "User approves design?" [shape=diamond]; + "Write design doc" [shape=box]; + "Invoke writing-plans skill" [shape=doublecircle]; + + "Explore project context" -> "Ask clarifying questions"; + "Ask clarifying questions" -> "Propose 2-3 approaches"; + "Propose 2-3 approaches" -> "Present design sections"; + "Present design sections" -> "User approves design?"; + "User approves design?" -> "Present design sections" [label="no, revise"]; + "User approves design?" -> "Write design doc" [label="yes"]; + "Write design doc" -> "Invoke writing-plans skill"; +} +``` + +**The terminal state is invoking writing-plans.** Do NOT invoke frontend-design, mcp-builder, or any other implementation skill. The ONLY skill you invoke after brainstorming is writing-plans. + +## The Process + +**Understanding the idea:** + +- Check out the current project state first (files, docs, recent commits) +- Ask questions one at a time to refine the idea +- Prefer multiple choice questions when possible, but open-ended is fine too +- Only one question per message - if a topic needs more exploration, break it into multiple questions +- Focus on understanding: purpose, constraints, success criteria + +**Exploring approaches:** + +- Propose 2-3 different approaches with trade-offs +- Present options conversationally with your recommendation and reasoning +- Lead with your recommended option and explain why + +**Presenting the design:** + +- Once you believe you understand what you're building, present the design +- Scale each section to its complexity: a few sentences if straightforward, up to 200-300 words if nuanced +- Ask after each section whether it looks right so far +- Cover: architecture, components, data flow, error handling, testing +- Be ready to go back and clarify if something doesn't make sense + +## After the Design + +**Documentation:** + +- Write the validated design to `docs/plans/YYYY-MM-DD--design.md` +- Use elements-of-style:writing-clearly-and-concisely skill if available +- Commit the design document to git + +**Implementation:** + +- Invoke the writing-plans skill to create a detailed implementation plan +- Do NOT invoke any other skill. writing-plans is the next step. + +## Key Principles + +- **One question at a time** - Don't overwhelm with multiple questions +- **Multiple choice preferred** - Easier to answer than open-ended when possible +- **YAGNI ruthlessly** - Remove unnecessary features from all designs +- **Explore alternatives** - Always propose 2-3 approaches before settling +- **Incremental validation** - Present design, get approval before moving on +- **Be flexible** - Go back and clarify when something doesn't make sense diff --git a/.agents/skills/bubbletea/SKILL.md b/.agents/skills/bubbletea/SKILL.md new file mode 100644 index 00000000..4fdbafe8 --- /dev/null +++ b/.agents/skills/bubbletea/SKILL.md @@ -0,0 +1,277 @@ +--- +name: bubbletea +description: Build terminal user interfaces with Go and Bubbletea framework. Use for creating TUI apps with the Elm architecture, dual-pane layouts, accordion modes, mouse/keyboard handling, Lipgloss styling, and reusable components. Includes production-ready templates, effects library, and battle-tested layout patterns from real projects. +license: MIT +--- + +# Bubbletea TUI Development + +Production-ready skill for building beautiful terminal user interfaces with Go, Bubbletea, and Lipgloss. + +## When to Use This Skill + +Use this skill when: +- Creating new TUI applications with Go +- Adding Bubbletea components to existing apps +- Fixing layout/rendering issues (borders, alignment, overflow) +- Implementing mouse/keyboard interactions +- Building dual-pane or multi-panel layouts +- Adding visual effects (metaballs, waves, rainbow text) +- Troubleshooting TUI rendering problems + +## Core Principles + +**CRITICAL**: Before implementing ANY layout, consult `references/golden-rules.md` for the 4 Golden Rules. These rules prevent the most common and frustrating TUI layout bugs. + +### The 4 Golden Rules (Summary) + +1. **Always Account for Borders** - Subtract 2 from height calculations BEFORE rendering panels +2. **Never Auto-Wrap in Bordered Panels** - Always truncate text explicitly +3. **Match Mouse Detection to Layout** - Use X coords for horizontal, Y coords for vertical +4. **Use Weights, Not Pixels** - Proportional layouts scale perfectly + +Full details and examples in `references/golden-rules.md`. + +## Creating New Projects + +This project includes a production-ready template system. When this skill is bundled with a new project (via `new_project.sh`), use the existing template structure as the starting point. + +### Project Structure + +All new projects follow this architecture: +``` +your-app/ +├── main.go # Entry point (minimal, ~21 lines) +├── types.go # Type definitions, structs, enums +├── model.go # Model initialization & layout calculation +├── update.go # Message dispatcher +├── update_keyboard.go # Keyboard handling +├── update_mouse.go # Mouse handling +├── view.go # View rendering & layouts +├── styles.go # Lipgloss style definitions +├── config.go # Configuration management +└── .claude/skills/bubbletea/ # This skill (bundled) +``` + +### Architecture Guidelines + +- Keep `main.go` minimal (entry point only, ~21 lines) +- All types in `types.go` (structs, enums, constants) +- Separate keyboard and mouse handling into dedicated files +- One file, one responsibility +- Maximum file size: 800 lines (ideally <500) +- Configuration via YAML with hot-reload support + +## Available Components + +See `references/components.md` for the complete catalog of reusable components: + +- **Panel System**: Single, dual-pane, multi-panel, tabbed layouts +- **Lists**: Simple list, filtered list, tree view +- **Input**: Text input, multiline, forms, autocomplete +- **Dialogs**: Confirm, input, progress, modal +- **Menus**: Context menu, command palette, menu bar +- **Status**: Status bar, title bar, breadcrumbs +- **Preview**: Text, markdown, syntax highlighting, images, hex +- **Tables**: Simple and interactive tables + +## Effects Library + +Beautiful physics-based animations available in the template: + +- 🔮 **Metaballs** - Lava lamp-style floating blobs +- 🌊 **Wave Effects** - Sine wave distortions +- 🌈 **Rainbow Cycling** - Animated color gradients +- 🎭 **Layer Compositor** - ANSI-aware multi-layer rendering + +See `references/effects.md` for usage examples and integration patterns. + +## Layout Implementation Pattern + +When implementing layouts, follow this sequence: + +### 1. Calculate Available Space +```go +func (m model) calculateLayout() (int, int) { + contentWidth := m.width + contentHeight := m.height + + // Subtract UI elements + if m.config.UI.ShowTitle { + contentHeight -= 3 // title bar (3 lines) + } + if m.config.UI.ShowStatus { + contentHeight -= 1 // status bar + } + + // CRITICAL: Account for panel borders + contentHeight -= 2 // top + bottom borders + + return contentWidth, contentHeight +} +``` + +### 2. Use Weight-Based Panel Sizing +```go +// Calculate weights based on focus/accordion mode +leftWeight, rightWeight := 1, 1 +if m.accordionMode && m.focusedPanel == "left" { + leftWeight = 2 // Focused panel gets 2x weight +} + +// Calculate actual widths from weights +totalWeight := leftWeight + rightWeight +leftWidth := (availableWidth * leftWeight) / totalWeight +rightWidth := availableWidth - leftWidth +``` + +### 3. Truncate Text to Prevent Wrapping +```go +// Calculate max text width to prevent wrapping +maxTextWidth := panelWidth - 4 // -2 borders, -2 padding + +// Truncate ALL text before rendering +title = truncateString(title, maxTextWidth) +subtitle = truncateString(subtitle, maxTextWidth) + +func truncateString(s string, maxLen int) string { + if len(s) <= maxLen { + return s + } + return s[:maxLen-1] + "…" +} +``` + +## Mouse Interaction Pattern + +Always check layout mode before processing mouse events: + +```go +func (m model) handleLeftClick(msg tea.MouseMsg) (tea.Model, tea.Cmd) { + if m.shouldUseVerticalStack() { + // Vertical stack mode: use Y coordinates + topHeight, _ := m.calculateVerticalStackLayout() + relY := msg.Y - contentStartY + + if relY < topHeight { + m.focusedPanel = "left" // Top panel + } else { + m.focusedPanel = "right" // Bottom panel + } + } else { + // Side-by-side mode: use X coordinates + leftWidth, _ := m.calculateDualPaneLayout() + + if msg.X < leftWidth { + m.focusedPanel = "left" + } else { + m.focusedPanel = "right" + } + } + + return m, nil +} +``` + +## Common Pitfalls to Avoid + +See `references/troubleshooting.md` for detailed solutions to common issues: + +### ❌ DON'T: Set explicit Height() on bordered panels +```go +// BAD: Can cause misalignment +panelStyle := lipgloss.NewStyle(). + Border(border). + Height(height) // Don't do this! +``` + +### ✅ DO: Fill content to exact height +```go +// GOOD: Fill content lines to exact height +for len(lines) < innerHeight { + lines = append(lines, "") +} +panelStyle := lipgloss.NewStyle().Border(border) +``` + +## Testing and Debugging + +When panels don't align or render incorrectly: + +1. **Check height accounting** - Verify contentHeight calculation subtracts all UI elements + borders +2. **Check text wrapping** - Ensure all strings are truncated to maxTextWidth +3. **Check mouse detection** - Verify X/Y coordinate usage matches layout orientation +4. **Check border consistency** - Use same border style for all panels + +See `references/troubleshooting.md` for the complete debugging decision tree. + +## Configuration System + +All projects support YAML configuration with hot-reload: + +```yaml +theme: "dark" +keybindings: "default" + +layout: + type: "dual_pane" + split_ratio: 0.5 + accordion_mode: true + +ui: + show_title: true + show_status: true + mouse_enabled: true + show_icons: true +``` + +Configuration files are loaded from: +1. `~/.config/your-app/config.yaml` (user config) +2. `./config.yaml` (local override) + +## Dependencies + +**Required:** +``` +charm.land/bubbletea/v2 +charm.land/lipgloss/v2 +charm.land/bubbles/v2 +gopkg.in/yaml.v3 +``` + +**Optional** (uncomment in go.mod as needed): +``` +github.com/charmbracelet/glamour # Markdown rendering +charm.land/huh/v2 # Forms +github.com/alecthomas/chroma/v2 # Syntax highlighting +github.com/evertras/bubble-table # Interactive tables +github.com/koki-develop/go-fzf # Fuzzy finder +``` + +## Reference Documentation + +All reference files are loaded progressively as needed: + +- **golden-rules.md** - Critical layout patterns and anti-patterns +- **components.md** - Complete catalog of reusable components +- **troubleshooting.md** - Common issues and debugging decision tree +- **emoji-width-fix.md** - Battle-tested solution for emoji alignment across terminals (xterm, WezTerm, Termux, Windows Terminal) + +## External Resources + +- [Bubble Tea Documentation](https://charm.land/bubbletea) +- [Lip Gloss Documentation](https://charm.land/lipgloss) +- [Bubbles Components](https://charm.land/bubbles) +- [Charm Ecosystem](https://charm.land/) + +## Best Practices Summary + +1. **Always** consult golden-rules.md before implementing layouts +2. **Always** use weight-based sizing for flexible layouts +3. **Always** truncate text explicitly (never rely on auto-wrap) +4. **Always** match mouse detection to layout orientation +5. **Always** account for borders in height calculations +6. **Never** set explicit Height() on bordered Lipgloss styles +7. **Never** assume layout orientation in mouse handlers + +Follow these patterns and you'll avoid 90% of TUI layout bugs. diff --git a/.agents/skills/bubbletea/references/components.md b/.agents/skills/bubbletea/references/components.md new file mode 100644 index 00000000..29501c9d --- /dev/null +++ b/.agents/skills/bubbletea/references/components.md @@ -0,0 +1,647 @@ +# Bubbletea Components Catalog + +Reusable components for building TUI applications. All components follow the Elm architecture pattern (Init, Update, View). + +## Panel System + +Pre-built panel layouts for different UI arrangements. + +### Single Panel + +Full-screen single view with optional title and status bars. + +**Use for:** +- Simple focused interfaces +- Full-screen text editors +- Single-purpose tools + +**Implementation:** +```go +func (m model) renderSinglePanel() string { + contentWidth, contentHeight := m.calculateLayout() + + // Create panel with full available space + panel := m.styles.Panel. + Width(contentWidth). + Render(content) + + return panel +} +``` + +### Dual Pane + +Side-by-side panels with configurable split ratio and accordion mode. + +**Use for:** +- File browsers with preview +- Split editors +- Source/destination views + +**Features:** +- Dynamic split ratio (50/50, 66/33, 75/25) +- Accordion mode (focused panel expands) +- Responsive (stacks vertically on narrow terminals) +- Weight-based sizing for smooth resizing + +**Implementation:** +```go +func (m model) renderDualPane() string { + contentWidth, contentHeight := m.calculateLayout() + + // Calculate weights based on focus/accordion + leftWeight, rightWeight := 1, 1 + if m.accordionMode && m.focusedPanel == "left" { + leftWeight = 2 + } + + // Calculate actual widths from weights + totalWeight := leftWeight + rightWeight + leftWidth := (contentWidth * leftWeight) / totalWeight + rightWidth := contentWidth - leftWidth + + // Render panels + leftPanel := m.renderPanel("left", leftWidth, contentHeight) + rightPanel := m.renderPanel("right", rightWidth, contentHeight) + + return lipgloss.JoinHorizontal(lipgloss.Top, leftPanel, rightPanel) +} +``` + +**Keyboard shortcuts:** +- `Tab` - Switch focus between panels +- `a` - Toggle accordion mode +- Arrow keys - Focus panel in direction + +**Mouse support:** +- Click panel to focus +- Works in both horizontal and vertical stack modes + +### Multi-Panel + +3+ panels with configurable sizes and arrangements. + +**Use for:** +- IDEs (file tree, editor, terminal, output) +- Dashboard views +- Complex workflows + +**Common layouts:** +- Three-column (25/50/25) +- Three-row +- Grid (2x2, 3x3) +- Sidebar + main + inspector + +**Implementation:** +```go +// Three-column example +mainWeight, leftWeight, rightWeight := 2, 1, 1 // 50/25/25 +totalWeight := mainWeight + leftWeight + rightWeight + +leftWidth := (contentWidth * leftWeight) / totalWeight +mainWidth := (contentWidth * mainWeight) / totalWeight +rightWidth := contentWidth - leftWidth - mainWidth +``` + +### Tabbed + +Multiple views with tab switching. + +**Use for:** +- Multiple documents +- Settings pages +- Different data views + +**Features:** +- Tab bar with active indicator +- Keyboard shortcuts (`1-9`, `Ctrl+Tab`) +- Mouse click to switch tabs +- Close tab support + +## Lists + +### Simple List + +Basic scrollable list of items. + +**Use for:** +- File listings +- Menu options +- Search results + +**Features:** +- Keyboard navigation (Up/Down, Home/End, PgUp/PgDn) +- Mouse scrolling and selection +- Visual selection indicator +- Viewport scrolling (only visible items rendered) + +**Integration:** +```go +import "charm.land/bubbles/v2/list" + +type model struct { + list list.Model +} + +func (m model) Init() tea.Cmd { + items := []list.Item{ + item{title: "Item 1", desc: "Description 1"}, + item{title: "Item 2", desc: "Description 2"}, + } + m.list = list.New(items, list.NewDefaultDelegate(), 0, 0) + return nil +} +``` + +### Filtered List + +List with fuzzy search/filter. + +**Use for:** +- Quick file finder +- Command palette +- Searchable settings + +**Features:** +- Real-time filtering as you type +- Fuzzy matching +- Highlighted matches + +**Dependencies:** +```go +github.com/koki-develop/go-fzf +``` + +### Tree View + +Hierarchical list with expand/collapse. + +**Use for:** +- Directory trees +- Nested data structures +- Outline views + +**Features:** +- Expand/collapse nodes +- Indentation levels +- Parent/child relationships +- Recursive rendering + +## Input Components + +### Text Input + +Single-line text field. + +**Use for:** +- Forms +- Search boxes +- Prompts + +**Integration:** +```go +import "charm.land/bubbles/v2/textinput" + +type model struct { + input textinput.Model +} + +func (m model) Init() tea.Cmd { + m.input = textinput.New() + m.input.Placeholder = "Enter text..." + m.input.Focus() + return textinput.Blink +} +``` + +### Multiline Input + +Text area for longer content. + +**Use for:** +- Commit messages +- Notes +- Configuration editing + +**Integration:** +```go +import "charm.land/bubbles/v2/textarea" + +type model struct { + textarea textarea.Model +} +``` + +### Forms + +Structured input with multiple fields. + +**Use for:** +- Settings dialogs +- User registration +- Multi-field input + +**Integration:** +```go +import "charm.land/huh/v2" + +form := huh.NewForm( + huh.NewGroup( + huh.NewInput(). + Title("Name"). + Value(&name), + huh.NewInput(). + Title("Email"). + Value(&email), + ), +) +``` + +### Autocomplete + +Text input with suggestions. + +**Use for:** +- Command entry +- File paths +- Tag selection + +**Features:** +- Real-time suggestions +- Keyboard navigation of suggestions +- Tab completion + +## Dialogs + +### Confirm Dialog + +Yes/No confirmation. + +**Use for:** +- Delete confirmations +- Save prompts +- Destructive actions + +**Example:** +``` +┌─────────────────────────────┐ +│ Delete this file? │ +│ │ +│ [Yes] [No] │ +└─────────────────────────────┘ +``` + +### Input Dialog + +Prompt for single value. + +**Use for:** +- Quick input +- Rename operations +- New file creation + +### Progress Dialog + +Show long-running operations. + +**Use for:** +- File uploads +- Build processes +- Data processing + +**Integration:** +```go +import "charm.land/bubbles/v2/progress" + +type model struct { + progress progress.Model +} +``` + +### Modal + +Full overlay dialog. + +**Use for:** +- Settings +- Help screens +- Complex forms + +## Menus + +### Context Menu + +Right-click or keyboard-triggered menu. + +**Use for:** +- File operations +- Quick actions +- Tool integration + +**Example:** +``` +┌─────────────┐ +│ Open │ +│ Copy │ +│ Delete │ +│ Properties │ +└─────────────┘ +``` + +### Command Palette + +Fuzzy searchable command list. + +**Use for:** +- Command discovery +- Keyboard-first workflows +- Power user features + +**Keyboard:** +- `Ctrl+P` or `Ctrl+Shift+P` to open +- Type to filter +- Enter to execute + +### Menu Bar + +Top-level menu system. + +**Use for:** +- Traditional application menus +- Organized commands +- Discoverability + +**Example:** +``` +File Edit View Help +``` + +## Status Components + +### Status Bar + +Bottom bar showing state and help. + +**Use for:** +- Current mode/state +- Keyboard hints +- File info + +**Example:** +``` +┌────────────────────────────────────┐ +│ │ +│ Content area │ +│ │ +├────────────────────────────────────┤ +│ Normal | file.txt | Line 10/100 │ +└────────────────────────────────────┘ +``` + +**Pattern:** +```go +func (m model) renderStatusBar() string { + left := fmt.Sprintf("%s | %s", m.mode, m.filename) + right := fmt.Sprintf("Line %d/%d", m.cursor, m.lineCount) + + width := m.width + gap := width - lipgloss.Width(left) - lipgloss.Width(right) + + return left + strings.Repeat(" ", gap) + right +} +``` + +### Title Bar + +Top bar with app title and context. + +**Use for:** +- Application name +- Current path/document +- Action buttons + +### Breadcrumbs + +Path navigation component. + +**Use for:** +- Directory navigation +- Nested views +- History trail + +**Example:** +``` +Home > Projects > TUITemplate > components +``` + +## Preview Components + +### Text Preview + +Rendered text with syntax highlighting. + +**Use for:** +- File preview +- Code display +- Log viewing + +**Integration:** +```go +import "github.com/alecthomas/chroma/v2/quick" + +func renderCode(code, language string) string { + var buf bytes.Buffer + quick.Highlight(&buf, code, language, "terminal256", "monokai") + return buf.String() +} +``` + +### Markdown Preview + +Rendered markdown. + +**Integration:** +```go +import "github.com/charmbracelet/glamour" + +func renderMarkdown(md string) (string, error) { + renderer, _ := glamour.NewTermRenderer( + glamour.WithAutoStyle(), + glamour.WithWordWrap(80), + ) + return renderer.Render(md) +} +``` + +### Image Preview + +ASCII/Unicode art from images. + +**Use for:** +- Image thumbnails +- Visual file preview +- Logos/artwork + +**External tools:** +- `catimg` - Convert images to 256-color ASCII +- `viu` - View images in terminal with full color + +### Hex Preview + +Binary file viewer. + +**Use for:** +- Binary file inspection +- Debugging +- Data analysis + +**Example:** +``` +00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............ +00000010: 0200 3e00 0100 0000 6009 4000 0000 0000 ..>.....`.@..... +``` + +## Tables + +### Simple Table + +Static data display. + +**Use for:** +- Data display +- Reports +- Comparison views + +### Interactive Table + +Navigable table with selection. + +**Use for:** +- Database browsers +- CSV viewers +- Process lists + +**Integration:** +```go +import "github.com/evertras/bubble-table/table" + +type model struct { + table table.Model +} + +func (m model) Init() tea.Cmd { + m.table = table.New([]table.Column{ + table.NewColumn("id", "ID", 10), + table.NewColumn("name", "Name", 20), + }) + return nil +} +``` + +**Features:** +- Sort by column +- Row selection +- Keyboard navigation +- Column resize + +## Component Integration Patterns + +### Composing Components + +```go +type model struct { + // Multiple components in one view + list list.Model + preview string + input textinput.Model + focused string // which component has focus +} + +func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case tea.KeyPressMsg: + // Route to focused component + switch m.focused { + case "list": + var cmd tea.Cmd + m.list, cmd = m.list.Update(msg) + return m, cmd + case "input": + var cmd tea.Cmd + m.input, cmd = m.input.Update(msg) + return m, cmd + } + } + return m, nil +} +``` + +### Lazy Loading Components + +Only initialize components when needed: + +```go +type model struct { + preview *PreviewComponent // nil until needed + previewPath string +} + +func (m *model) showPreview(path string) { + if m.preview == nil { + m.preview = NewPreviewComponent() + } + m.preview.Load(path) +} +``` + +### Component Communication + +Use Bubbletea commands to communicate between components: + +```go +type fileSelectedMsg struct { + path string +} + +// In list component Update +case tea.KeyPressMsg: + if key.Matches(msg, m.keymap.Enter) { + selectedFile := m.list.SelectedItem() + return m, func() tea.Msg { + return fileSelectedMsg{path: selectedFile.Path()} + } + } + +// In main model Update +case fileSelectedMsg: + m.preview.Load(msg.path) + return m, nil +``` + +## Best Practices + +1. **Keep components focused** - Each component should have one responsibility +2. **Use bubbles package** - Don't reinvent standard components +3. **Lazy initialization** - Create components when needed, not upfront +4. **Proper sizing** - Always pass explicit width/height to components +5. **Clean interfaces** - Components should expose minimal, clear APIs + +## External Dependencies + +**Core Charm libraries:** +``` +charm.land/bubbletea/v2 # Framework +charm.land/lipgloss/v2 # Styling +charm.land/bubbles/v2 # Standard components +``` + +**Extended functionality:** +``` +github.com/charmbracelet/glamour # Markdown rendering +charm.land/huh/v2 # Forms +github.com/alecthomas/chroma/v2 # Syntax highlighting +github.com/evertras/bubble-table # Interactive tables +github.com/koki-develop/go-fzf # Fuzzy finder +``` + +See `go.mod` in template for complete list of optional dependencies. diff --git a/.agents/skills/bubbletea/references/emoji-width-fix.md b/.agents/skills/bubbletea/references/emoji-width-fix.md new file mode 100644 index 00000000..637f70c9 --- /dev/null +++ b/.agents/skills/bubbletea/references/emoji-width-fix.md @@ -0,0 +1,295 @@ +# Emoji Width Alignment Fix for Terminal UIs + +**Date:** 2025-10-27 +**Source:** TFE project debugging session +**Issue:** Emoji alignment breaks in WezTerm/Termux but works in Windows Terminal + +--- + +## The Problem + +Some emojis with variation selectors (U+FE0F) render inconsistently across terminals: + +| Emoji | Windows Terminal | WezTerm/Termux | Result | +|-------|------------------|----------------|--------| +| ⬆️ (U+2B06 + U+FE0F) | 2 cells | 1 cell | Misalignment | +| ⚙️ (U+2699 + U+FE0F) | 2 cells | 1 cell | Misalignment | +| 🗜️ (U+1F5DC + U+FE0F) | 2 cells | 1 cell | Misalignment | +| 📦 (U+1F4E6) | 2 cells | 2 cells | ✅ Aligned | + +**Symptom:** File names with narrow emojis shift left by 1 space, breaking column alignment. + +--- + +## Root Causes + +### 0. XTerm Terminals Require unicode11 + +**For xterm-based terminals:** Must configure go-runewidth properly: + +```go +import "github.com/mattn/go-runewidth" + +// Required initialization for xterm terminals +// Without this, xterm won't handle emoji widths correctly +``` + +### 1. go-runewidth Bug #76 (Open since Feb 2024) + +**Issue:** Variation Selectors incorrectly report width = 1 instead of 0 + +```go +// WRONG: go-runewidth bug +runewidth.StringWidth("⬆️") // Returns 2 (base=1 + VS=1) +// Should return 1 (base=1 + VS=0) +``` + +This causes padding calculations to fail: +- Code thinks "⬆️" is already 2 cells wide +- No padding added +- Terminal renders as 1 cell +- Result: 1 space misalignment + +### 2. Terminal Rendering Differences + +Different terminals handle emoji + variation selector differently: +- **Windows Terminal:** Honors VS-16 → renders as 2 cells (colorful, wide) - slightly different handling +- **WezTerm/Termux:** Ignores VS-16 for width → renders as 1 cell - **need identical fixes** +- **xterm:** Requires unicode11 configuration (see above) +- **Kitty:** Actively adjusts width based on VS + +**No standard exists** - Unicode only defines width at codepoint level, not grapheme level. + +--- + +## The Fix + +**Strategy:** Strip variation selectors before width calculation AND before display in affected terminals. + +### Implementation + +```go +// In your width calculation function (strips ANSI codes first) +func visualWidth(s string) int { + // Strip ANSI codes first + stripped := stripANSI(s) + + // Strip variation selectors to work around go-runewidth bug #76 + // VS incorrectly reports width=1 instead of width=0 + stripped = strings.ReplaceAll(stripped, "\uFE0F", "") // VS-16 (emoji presentation) + stripped = strings.ReplaceAll(stripped, "\uFE0E", "") // VS-15 (text presentation) + + // Now use StringWidth on the whole stripped string + return runewidth.StringWidth(stripped) +} + +// In your icon padding function +func (m model) padIconToWidth(icon string) string { + // Strip variation selectors for terminals that render emoji+VS as 1 cell + if m.terminalType == terminalWezTerm || m.terminalType == terminalTermux { + icon = strings.ReplaceAll(icon, "\uFE0F", "") + icon = strings.ReplaceAll(icon, "\uFE0E", "") + } + + return padToVisualWidth(icon, 2) +} +``` + +### Terminal Type Detection + +```go +// Detect terminal type early in initialization +func detectTerminalType() terminalType { + // Check for Termux (Android) - BEFORE xterm check + // Termux sets TERM=xterm-256color, so check PREFIX first + if strings.Contains(os.Getenv("PREFIX"), "com.termux") { + return terminalTermux + } + + // Check for WezTerm + if os.Getenv("TERM_PROGRAM") == "WezTerm" { + return terminalWezTerm + } + + // Check for Windows Terminal + if os.Getenv("WT_SESSION") != "" { + return terminalWindowsTerminal + } + + // Check for Kitty + if strings.Contains(os.Getenv("TERM"), "kitty") { + return terminalKitty + } + + // Fallback + return terminalGeneric +} +``` + +--- + +## Results + +**Before fix:** +``` + ⬆️ parent_dir <-- shifted left by 1 space + 📦 package.tar <-- correct alignment + ⚙️ config.ini <-- shifted left by 1 space +``` + +**After fix:** +``` + ⬆ parent_dir <-- aligned (VS stripped, emoji less colorful) + 📦 package.tar <-- aligned + ⚙ config.ini <-- aligned (VS stripped, emoji less colorful) +``` + +**Trade-off:** Emojis may appear slightly different (less colorful, more text-like) in WezTerm/Termux, but alignment is perfect. + +--- + +## Alternative Approaches (Not Recommended) + +### ❌ Emoji Replacement Map +```go +// Replace narrow emojis with always-wide alternatives +replacements := map[string]string{ + "⬆️": "⏫", // Up arrow → double up + "⚙️": "🔧", // Gear → wrench +} +``` +**Issue:** Loses semantic meaning, doesn't solve the root problem. + +### ❌ Manual Space Addition +```go +// Add extra space after problematic emojis +icon := "⚙️ " +``` +**Issue:** Doesn't work reliably - Lipgloss may re-measure width. + +### ❌ Zero-Width Joiners (ZWJ) +**Issue:** Makes problems worse, poor terminal support. + +--- + +## Key Takeaways + +1. **Always use `StringWidth()`, never `RuneWidth()` for display width** + - `RuneWidth()` breaks multi-rune emoji like flags, skin tones, emoji+VS + +2. **Strip ANSI codes before width calculation** + ```go + stripped := stripANSI(text) + width := runewidth.StringWidth(stripped) + ``` + +3. **Terminal-specific compensation is necessary** + - No universal solution exists + - Different terminals render emoji differently + - Detect terminal type and adjust accordingly + +4. **Accept the trade-off** + - Emoji appearance vs. alignment consistency + - Most users prefer proper alignment + +5. **This is a known ecosystem problem** + - lazygit: Issue #3514 (still open) + - k9s: Provides `noIcons` config option + - Lipgloss: PR #563 (still open, trying to improve) + - go-runewidth: Issue #76 (VS width bug, unfixed) + +--- + +## Related Issues + +- **go-runewidth #76** - Variation Selector width bug (OPEN) +- **go-runewidth #59** - "First non-zero width" heuristic limitation +- **Lipgloss #55** - Emoji width causing incorrect borders +- **Lipgloss #563** - PR to improve Unicode width (OPEN, not merged) +- **WezTerm #4223** - Terminal rendering differences discussion + +--- + +## When to Use This Fix + +Apply this fix when: +- ✅ Your TUI uses emoji icons for files/folders +- ✅ You support multiple terminal emulators +- ✅ Users report alignment issues in specific terminals +- ✅ You're using `github.com/mattn/go-runewidth` for width calculations + +--- + +## Testing Checklist + +When implementing this fix, test in: +- [ ] Windows Terminal (should maintain perfect alignment) +- [ ] WezTerm (should fix alignment, emoji may look different) +- [ ] Termux (Android) (should fix alignment) +- [ ] Kitty (should maintain good alignment) +- [ ] iTerm2 (macOS) (should maintain good alignment) +- [ ] Generic xterm (baseline compatibility) + +Test all view modes: +- [ ] List/table views +- [ ] Tree views +- [ ] Split pane layouts +- [ ] Full-screen views + +--- + +## Code Location Reference + +From TFE project (reference implementation): +- **file_operations.go:936-968** - `visualWidth()` function +- **file_operations.go:969-983** - `visualWidthCompensated()` function +- **file_operations.go:1237-1246** - `padIconToWidth()` function +- **model.go:187-197** - Terminal type detection + +Full debugging session: `TFE/docs/EMOJI_DEBUG_SESSION_2.md` + +--- + +## Quick Reference Code Snippet + +```go +// Complete minimal implementation +func visualWidth(s string) int { + // Strip ANSI escape codes + stripped := stripANSI(s) + + // Work around go-runewidth bug #76 + stripped = strings.ReplaceAll(stripped, "\uFE0F", "") + stripped = strings.ReplaceAll(stripped, "\uFE0E", "") + + return runewidth.StringWidth(stripped) +} + +func stripANSI(s string) string { + stripped := "" + inAnsi := false + + for _, ch := range s { + if ch == '\033' { + inAnsi = true + continue + } + if inAnsi { + if (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') { + inAnsi = false + } + continue + } + stripped += string(ch) + } + + return stripped +} +``` + +--- + +**Status:** ✅ Tested and working in TFE project (2025-10-27) +**Affected Terminals:** WezTerm, Termux (Android) +**Fix Complexity:** Low (2 function changes) +**Success Rate:** 100% (alignment fixed, acceptable emoji appearance change) diff --git a/.agents/skills/bubbletea/references/golden-rules.md b/.agents/skills/bubbletea/references/golden-rules.md new file mode 100644 index 00000000..c2660108 --- /dev/null +++ b/.agents/skills/bubbletea/references/golden-rules.md @@ -0,0 +1,393 @@ +# The 4 Golden Rules for TUI Layout + +These rules prevent the most common and frustrating TUI layout bugs. They were discovered through trial-and-error on real projects and will save you hours of debugging. + +## Rule #1: Always Account for Borders + +**Subtract 2 from height calculations BEFORE rendering panels.** + +### The Problem + +Lipgloss borders add height to your content. If you calculate content height without accounting for borders, panels will overflow and cover other UI elements. + +### The Math + +``` +WRONG: +contentHeight = totalHeight - 3 (title) - 1 (status) = totalHeight - 4 +Panel renders with borders = contentHeight + 2 (borders) +Actual height used = totalHeight - 4 + 2 = totalHeight - 2 (TOO TALL!) + +CORRECT: +contentHeight = totalHeight - 3 (title) - 1 (status) - 2 (borders) = totalHeight - 6 +Panel renders with borders = contentHeight + 2 +Actual height used = totalHeight - 6 + 2 = totalHeight - 4 ✓ +``` + +### Visual Layout + +``` +┌─────────────────────────────────┐ ← Title Bar (3 lines) +│ App Title │ +│ Subtitle/Info │ +├─────────────────────────────────┤ ─┐ +│ ┌─────────────┬───────────────┐ │ │ +│ │ │ │ │ │ +│ │ Left │ Right │ │ │ Content Height +│ │ Panel │ Panel │ │ │ (minus borders) +│ │ │ │ │ │ +│ └─────────────┴───────────────┘ │ │ +├─────────────────────────────────┤ ─┘ +│ Status Bar: Help text here │ ← Status Bar (1 line) +└─────────────────────────────────┘ + +Panel borders (┌─┐ └─┘) = 2 lines total (top + bottom) +``` + +### Correct Implementation + +```go +func (m model) calculateLayout() (int, int) { + contentWidth := m.width + contentHeight := m.height + + if m.config.UI.ShowTitle { + contentHeight -= 3 // title bar (3 lines) + } + if m.config.UI.ShowStatus { + contentHeight -= 1 // status bar + } + + // CRITICAL: Account for panel borders + contentHeight -= 2 // top + bottom borders + + return contentWidth, contentHeight +} +``` + +### Height Calculation Example + +``` +Total Terminal Height: 25 +- Title Bar: -3 +- Status Bar: -1 +- Panel Borders: -2 +───────────────────────── +Content Height: 19 ✓ +``` + +## Rule #2: Never Auto-Wrap in Bordered Panels + +**Always truncate text explicitly to prevent wrapping.** + +### The Problem + +When text wraps inside a bordered panel, it can cause: +- Panels to become different heights (misalignment) +- Content to overflow panel boundaries +- Inconsistent rendering across different terminal widths + +### Why This Happens + +Lipgloss auto-wraps text that exceeds the panel width. In bordered panels, this creates extra lines you didn't account for in your height calculations. + +### The Solution + +Calculate the maximum text width and truncate ALL strings before rendering: + +```go +// Calculate max text width to prevent wrapping +maxTextWidth := panelWidth - 4 // -2 for borders, -2 for padding + +// Truncate ALL text before rendering +title = truncateString(title, maxTextWidth) +subtitle = truncateString(subtitle, maxTextWidth) + +// Truncate content lines too +for i := 0; i < availableContentLines && i < len(content); i++ { + line := truncateString(content[i], maxTextWidth) + lines = append(lines, line) +} + +// Helper function +func truncateString(s string, maxLen int) string { + if len(s) <= maxLen { + return s + } + return s[:maxLen-1] + "…" +} +``` + +### Real-World Example + +Without truncation, this subtitle wraps: +``` +┌─────────────┐ +│Weight: 2 | │ +│Size: 80x25 │ ← Wrapped to 2 lines! +└─────────────┘ +``` + +With truncation: +``` +┌─────────────┐ +│Weight: 2 | …│ ← Truncated, stays 1 line +└─────────────┘ +``` + +## Rule #3: Match Mouse Detection to Layout + +**Use X coordinates for horizontal layouts, Y coordinates for vertical layouts.** + +### The Problem + +If your layout orientation changes (side-by-side vs stacked), but your mouse detection logic doesn't, clicks won't work correctly. + +### The Solution + +Check layout mode before processing mouse events: + +```go +func (m model) handleLeftClick(msg tea.MouseMsg) (tea.Model, tea.Cmd) { + // ... boundary checks ... + + if m.shouldUseVerticalStack() { + // Vertical stack mode: use Y coordinates + topHeight, _ := m.calculateVerticalStackLayout() + relY := msg.Y - contentStartY + + if relY < topHeight { + m.focusedPanel = "left" // Top panel + } else if relY > topHeight { + m.focusedPanel = "right" // Bottom panel + } + } else { + // Side-by-side mode: use X coordinates + leftWidth, _ := m.calculateDualPaneLayout() + + if msg.X < leftWidth { + m.focusedPanel = "left" + } else if msg.X > leftWidth { + m.focusedPanel = "right" + } + } + + return m, nil +} +``` + +### Visual Guide + +**Horizontal Layout (use X coordinates):** +``` +┌────────┬────────┐ +│ Left │ Right │ +│ │ │ +└────────┴────────┘ + ↑ msg.X determines which panel +``` + +**Vertical Layout (use Y coordinates):** +``` +┌────────────────┐ +│ Top │ ↑ +├────────────────┤ msg.Y determines +│ Bottom │ which panel +└────────────────┘ +``` + +## Rule #4: Use Weights, Not Pixels + +**Proportional layouts scale perfectly across all terminal sizes.** + +### The Problem + +Fixed pixel widths break when: +- Terminal is resized +- Different monitors have different dimensions +- Users have portrait vs landscape terminals + +### The Solution: Weight-Based Layout (LazyGit Pattern) + +Instead of calculating pixel widths, assign **weights** to panels: + +```go +// Calculate weights based on focus +leftWeight, rightWeight := 1, 1 + +if m.accordionMode && m.focusedPanel == "left" { + leftWeight = 2 // Focused panel gets 2x weight +} + +// Calculate actual widths from weights +totalWeight := leftWeight + rightWeight +leftWidth := (availableWidth * leftWeight) / totalWeight +rightWidth := availableWidth - leftWidth +``` + +### Weight Examples + +**Equal weights (1:1) = 50/50 split:** +``` +Total width: 80 +leftWeight: 1, rightWeight: 1 +totalWeight: 2 + +leftWidth = (80 * 1) / 2 = 40 +rightWidth = 80 - 40 = 40 + +┌──────────────────────┬──────────────────────┐ +│ │ │ +│ 50% │ 50% │ +│ │ │ +└──────────────────────┴──────────────────────┘ +``` + +**Focused weight (2:1) = 66/33 split:** +``` +Total width: 80 +leftWeight: 2, rightWeight: 1 +totalWeight: 3 + +leftWidth = (80 * 2) / 3 = 53 +rightWidth = 80 - 53 = 27 + +┌────────────────────────────────┬─────────────┐ +│ │ │ +│ 66% │ 33% │ +│ │ │ +└────────────────────────────────┴─────────────┘ +``` + +### Why This Works + +1. **Proportional** - Always maintains exact ratios +2. **Simple** - No complex formulas, just division +3. **Immediate** - No animations needed, instant resize +4. **Flexible** - Change weight = instant layout change +5. **Scalable** - Works at any terminal size + +### Common Weight Patterns + +```go +// Equal split +leftWeight, rightWeight := 1, 1 // 50/50 + +// Accordion mode (focused panel larger) +if focusedPanel == "left" { + leftWeight, rightWeight = 2, 1 // 66/33 +} else { + leftWeight, rightWeight = 1, 2 // 33/66 +} + +// Three panels +mainWeight, leftWeight, rightWeight := 2, 1, 1 // 50/25/25 + +// Preview mode (main content larger) +contentWeight, previewWeight := 3, 1 // 75/25 +``` + +## Common Pitfalls + +### ❌ DON'T: Set explicit Height() on bordered styles + +```go +// BAD: Can cause misalignment +panelStyle := lipgloss.NewStyle(). + Border(border). + Height(height) // Don't do this! +``` + +**Why it's bad:** The height includes borders, making calculations confusing and error-prone. + +### ✅ DO: Fill content to exact height, let borders add naturally + +```go +// GOOD: Fill content lines to exact height +for len(lines) < innerHeight { + lines = append(lines, "") +} +panelStyle := lipgloss.NewStyle().Border(border) +// No Height() - let content determine it +``` + +### ❌ DON'T: Assume layout orientation in mouse handlers + +```go +// BAD: Always using X coordinate +if msg.X < leftWidth { + // This breaks in vertical stack! +} +``` + +### ✅ DO: Check layout mode first + +```go +// GOOD: Different logic per orientation +if m.shouldUseVerticalStack() { + // Use Y coordinates +} else { + // Use X coordinates +} +``` + +## Debugging Checklist + +When panels don't align or render incorrectly, check in this order: + +1. **Height accounting (Rule #1)** + - Did you subtract 2 for borders? + - Formula: `totalHeight - titleLines - statusLines - 2` + +2. **Text wrapping (Rule #2)** + - Is text wrapping to multiple lines? + - `maxWidth = panelWidth - 4` + - Truncate ALL strings explicitly + +3. **Mouse detection (Rule #3)** + - Vertical stack? → Use `msg.Y` + - Horizontal? → Use `msg.X` + - Match detection to layout mode + +4. **Weight calculations (Rule #4)** + - Using weights instead of pixels? + - Formula: `(totalWidth * weight) / totalWeights` + +## Decision Tree + +``` +Panel Layout Problem? +│ +├─ Panels covering title/status bar? +│ └─> Check height accounting (Rule #1) +│ - Did you subtract 2 for borders? +│ - Formula: totalHeight - titleLines - statusLines - 2 +│ +├─ Panels misaligned (different heights)? +│ └─> Check text wrapping (Rule #2) +│ - Is text wrapping to multiple lines? +│ - maxWidth = panelWidth - 4 +│ - Truncate ALL strings explicitly +│ +├─ Mouse clicks not working? +│ └─> Check mouse detection (Rule #3) +│ - Vertical stack? → Use msg.Y +│ - Horizontal? → Use msg.X +│ - Match detection to layout mode +│ +└─ Accordion/resize janky? + └─> Check weight calculations (Rule #4) + - Using weights instead of pixels? + - Formula: (totalWidth * weight) / totalWeights +``` + +## Summary + +Follow these 4 rules and you'll avoid 90% of TUI layout bugs: + +1. ✅ **Always account for borders** - Subtract 2 before rendering +2. ✅ **Never auto-wrap** - Truncate explicitly +3. ✅ **Match mouse to layout** - X for horizontal, Y for vertical +4. ✅ **Use weights** - Proportional scaling + +These patterns are battle-tested and will save you hours of debugging frustration. diff --git a/.agents/skills/bubbletea/references/troubleshooting.md b/.agents/skills/bubbletea/references/troubleshooting.md new file mode 100644 index 00000000..90f04a76 --- /dev/null +++ b/.agents/skills/bubbletea/references/troubleshooting.md @@ -0,0 +1,705 @@ +# TUI Troubleshooting Guide + +Common issues and their solutions when building Bubbletea applications. + +## Layout Issues + +### Panels Covering Header/Status Bar + +**Symptom:** +Panels overflow and cover the title bar or status bar, especially on portrait/vertical monitors. + +**Root Cause:** +Height calculation doesn't account for panel borders. + +**Solution:** +Always subtract 2 for borders in height calculations. See [Golden Rules #1](golden-rules.md#rule-1-always-account-for-borders). + +```go +// WRONG +contentHeight := totalHeight - titleLines - statusLines + +// CORRECT +contentHeight := totalHeight - titleLines - statusLines - 2 // -2 for borders +``` + +**Quick Fix:** +```go +func (m model) calculateLayout() (int, int) { + contentHeight := m.height + if m.config.UI.ShowTitle { + contentHeight -= 3 // title bar + } + if m.config.UI.ShowStatus { + contentHeight -= 1 // status bar + } + contentHeight -= 2 // CRITICAL: borders + return m.width, contentHeight +} +``` + +### Panels Misaligned (Different Heights) + +**Symptom:** +One panel appears one or more rows higher/lower than adjacent panels. + +**Root Cause:** +Text wrapping. Long strings wrap to multiple lines in narrower panels, making them taller. + +**Solution:** +Never rely on auto-wrapping. Truncate all text explicitly. See [Golden Rules #2](golden-rules.md#rule-2-never-auto-wrap-in-bordered-panels). + +```go +maxTextWidth := panelWidth - 4 // -2 borders, -2 padding + +// Truncate everything +title = truncateString(title, maxTextWidth) +subtitle = truncateString(subtitle, maxTextWidth) + +for i := range contentLines { + contentLines[i] = truncateString(contentLines[i], maxTextWidth) +} +``` + +**Helper function:** +```go +func truncateString(s string, maxLen int) string { + if len(s) <= maxLen { + return s + } + if maxLen < 1 { + return "" + } + return s[:maxLen-1] + "…" +} +``` + +### Borders Not Rendering + +**Symptom:** +Panel borders missing or showing weird characters. + +**Possible Causes:** + +1. **Terminal doesn't support Unicode box drawing** + ```go + // Use ASCII fallback + border := lipgloss.NormalBorder() // Uses +-| instead of ┌─┐ + ``` + +2. **Terminal encoding issue** + ```bash + export LANG=en_US.UTF-8 + export LC_ALL=en_US.UTF-8 + ``` + +3. **Wrong border style** + ```go + // Make sure you're using a valid border + import "charm.land/lipgloss/v2" + + border := lipgloss.RoundedBorder() // ╭─╮ + // or + border := lipgloss.NormalBorder() // ┌─┐ + // or + border := lipgloss.DoubleBorder() // ╔═╗ + ``` + +### Content Overflows Panel + +**Symptom:** +Text or content extends beyond panel boundaries. + +**Solutions:** + +1. **For text content:** + ```go + // Truncate to fit + maxWidth := panelWidth - 4 + content = truncateString(content, maxWidth) + ``` + +2. **For multi-line content:** + ```go + // Limit both width and height + maxWidth := panelWidth - 4 + maxHeight := panelHeight - 2 + + lines := strings.Split(content, "\n") + for i := 0; i < maxHeight && i < len(lines); i++ { + displayLines = append(displayLines, + truncateString(lines[i], maxWidth)) + } + ``` + +3. **For wrapped content:** + ```go + // Use lipgloss MaxWidth + content := lipgloss.NewStyle(). + MaxWidth(panelWidth - 4). + Render(text) + ``` + +## Mouse Issues + +### Mouse Clicks Not Working + +**Symptom:** +Clicking panels doesn't change focus or trigger actions. + +**Possible Causes:** + +1. **Mouse not enabled in program** + ```go + p := tea.NewProgram(initialModel()) + + func (m model) View() tea.View { + v := tea.NewView(m.render()) + v.AltScreen = true + v.MouseMode = tea.MouseModeCellMotion + return v + } + ``` + +2. **Not handling MouseMsg** + ```go + func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case tea.MouseMsg: + return m.handleMouse(msg) + } + } + ``` + +3. **Wrong coordinate system** + See [Mouse Detection Not Matching Layout](#mouse-detection-not-matching-layout). + +### Mouse Detection Not Matching Layout + +**Symptom:** +Clicks work in horizontal layout but break when terminal is resized to vertical stack (or vice versa). + +**Root Cause:** +Using X coordinates when layout is vertical, or Y coordinates when horizontal. + +**Solution:** +Check layout mode before processing mouse events. See [Golden Rules #3](golden-rules.md#rule-3-match-mouse-detection-to-layout). + +```go +func (m model) handleLeftClick(msg tea.MouseMsg) (tea.Model, tea.Cmd) { + if m.shouldUseVerticalStack() { + // Vertical: use Y coordinates + if msg.Y < topPanelHeight { + m.focusedPanel = "top" + } else { + m.focusedPanel = "bottom" + } + } else { + // Horizontal: use X coordinates + if msg.X < leftPanelWidth { + m.focusedPanel = "left" + } else { + m.focusedPanel = "right" + } + } + return m, nil +} +``` + +### Mouse Scrolling Not Working + +**Symptom:** +Mouse wheel doesn't scroll content. + +**Solution:** +```go +case tea.MouseMsg: + switch msg.Type { + case tea.MouseWheelUp: + m.scroll -= 3 + if m.scroll < 0 { + m.scroll = 0 + } + case tea.MouseWheelDown: + m.scroll += 3 + maxScroll := len(m.content) - m.visibleLines + if m.scroll > maxScroll { + m.scroll = maxScroll + } + } +``` + +## Rendering Issues + +### Flickering/Jittering + +**Symptom:** +Screen flickers or elements jump around during updates. + +**Causes & Solutions:** + +1. **Updating too frequently** + ```go + // Don't update on every tick + case tickMsg: + if m.needsUpdate { + m.needsUpdate = false + return m, nil + } + return m, tick() // Skip render + ``` + +2. **Inconsistent dimensions** + ```go + // Cache dimensions, don't recalculate every frame + type model struct { + width, height int + cachedLayout string + layoutDirty bool + } + + func (m model) View() tea.View { + if m.layoutDirty { + m.cachedLayout = m.renderLayout() + m.layoutDirty = false + } + v := tea.NewView(m.cachedLayout) + v.AltScreen = true + return v + } + ``` + +3. **Using alt screen incorrectly** + ```go + func (m model) View() tea.View { + v := tea.NewView(m.render()) + v.AltScreen = true + return v + } + ``` + +### Colors Not Showing + +**Symptom:** +Colors appear as plain text or wrong colors. + +**Possible Causes:** + +1. **Terminal doesn't support colors** + ```bash + # Check color support + echo $COLORTERM # Should show "truecolor" or "24bit" + tput colors # Should show 256 or more + ``` + +2. **Not using lipgloss properly** + ```go + // Use lipgloss for color + import "charm.land/lipgloss/v2" + + style := lipgloss.NewStyle(). + Foreground(lipgloss.Color("#FF0000")). + Background(lipgloss.Color("#000000")) + ``` + +3. **Environment variables** + ```bash + export TERM=xterm-256color + export COLORTERM=truecolor + ``` + +### Emojis/Unicode Wrong Width + +**Symptom:** +Emojis cause text misalignment, borders broken, columns don't line up. + +**Root Cause:** +Different terminals calculate emoji width differently (1 vs 2 cells). + +**Solutions:** + +1. **Detect and adjust** + ```go + import "github.com/mattn/go-runewidth" + + // Get actual display width + width := runewidth.StringWidth(text) + ``` + +2. **Avoid emojis in structural elements** + ```go + // DON'T use emojis in borders, tables, or aligned content + // DO use emojis in content that doesn't need precise alignment + ``` + +3. **Use icons from fixed-width sets** + ```go + // Use Nerd Fonts or similar fixed-width icon fonts instead + // 󰈙 (vs 📁 emoji) + ``` + +4. **Terminal-specific settings** + For WezTerm, see project's `docs/EMOJI_WIDTH_FIX.md`. + +## Keyboard Issues + +### Keyboard Shortcuts Not Working + +**Symptom:** +Key presses don't trigger expected actions. + +**Debugging Steps:** + +1. **Log the key events** + ```go + case tea.KeyPressMsg: + log.Printf("Key: %s, Keystroke: %s", msg.String(), msg.Keystroke()) + ``` + +2. **Check key matching** + ```go + import "charm.land/bubbles/v2/key" + + type keyMap struct { + Quit key.Binding + } + + var keys = keyMap{ + Quit: key.NewBinding( + key.WithKeys("q", "ctrl+c"), + key.WithHelp("q", "quit"), + ), + } + + // In Update + case tea.KeyPressMsg: + if key.Matches(msg, keys.Quit) { + return m, tea.Quit + } + ``` + +3. **Check focus state** + ```go + // Make sure the right component has focus + case tea.KeyPressMsg: + switch m.focused { + case "input": + // Route to input + case "list": + // Route to list + } + ``` + +### Special Keys Not Detected + +**Symptom:** +Function keys, Ctrl combinations, or other special keys don't work. + +**Solution:** +Use `msg.Key().Code` and `msg.Key().Text`: + +```go +case tea.KeyPressMsg: + switch key := msg.Key(); key.Code { + case tea.KeyCtrlC: + return m, tea.Quit + case tea.KeyTab: + m.nextPanel() + case tea.KeyF1: + m.showHelp() + case tea.KeyEnter: + m.confirm() + } +``` + +Common keys: +- `tea.KeyTab` +- `tea.KeyEnter` +- `tea.KeyEsc` +- `tea.KeyCtrlC` +- `tea.KeyUp/Down/Left/Right` +- `tea.KeyF1` through `tea.KeyF12` + +## Performance Issues + +### Slow Rendering + +**Symptom:** +Noticeable lag when updating the display. + +**Solutions:** + +1. **Only render visible content** + ```go + // Don't render 1000 lines when only 20 are visible + visibleStart := m.scroll + visibleEnd := min(m.scroll + m.height, len(m.lines)) + + for i := visibleStart; i < visibleEnd; i++ { + rendered = append(rendered, m.lines[i]) + } + ``` + +2. **Cache expensive computations** + ```go + type model struct { + content []string + renderedCache string + contentDirty bool + } + + func (m *model) View() tea.View { + if m.contentDirty { + m.renderedCache = m.renderContent() + m.contentDirty = false + } + return tea.NewView(m.renderedCache) + } + ``` + +3. **Avoid string concatenation in loops** + ```go + // SLOW + var s string + for _, line := range lines { + s += line + "\n" // Creates new string each iteration + } + + // FAST + var b strings.Builder + for _, line := range lines { + b.WriteString(line) + b.WriteString("\n") + } + s := b.String() + ``` + +4. **Lazy load data** + ```go + // Don't load all files upfront + type model struct { + fileList []string + fileContent map[string]string // Load on demand + } + + func (m *model) getFileContent(path string) string { + if content, ok := m.fileContent[path]; ok { + return content + } + content := loadFile(path) + m.fileContent[path] = content + return content + } + ``` + +### High Memory Usage + +**Symptom:** +Application uses excessive memory. + +**Solutions:** + +1. **Limit cache size** + ```go + const maxCacheEntries = 100 + + func (m *model) addToCache(key, value string) { + if len(m.cache) >= maxCacheEntries { + // Evict oldest entry + for k := range m.cache { + delete(m.cache, k) + break + } + } + m.cache[key] = value + } + ``` + +2. **Stream large files** + ```go + // Don't load entire file into memory + func readLines(path string, start, count int) ([]string, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + + scanner := bufio.NewScanner(f) + var lines []string + lineNum := 0 + + for scanner.Scan() { + if lineNum >= start && lineNum < start+count { + lines = append(lines, scanner.Text()) + } + lineNum++ + if lineNum >= start+count { + break + } + } + + return lines, scanner.Err() + } + ``` + +## Configuration Issues + +### Config File Not Loading + +**Symptom:** +Application doesn't respect config file settings. + +**Common Locations:** +```go +configPaths := []string{ + "./config.yaml", // Current directory + "~/.config/yourapp/config.yaml", // XDG config + "/etc/yourapp/config.yaml", // System-wide +} + +for _, path := range configPaths { + if fileExists(expandPath(path)) { + return loadConfig(path) + } +} +``` + +**Debug config loading:** +```go +func loadConfig(path string) (*Config, error) { + log.Printf("Attempting to load config from: %s", path) + + data, err := os.ReadFile(path) + if err != nil { + log.Printf("Failed to read config: %v", err) + return nil, err + } + + var cfg Config + if err := yaml.Unmarshal(data, &cfg); err != nil { + log.Printf("Failed to parse config: %v", err) + return nil, err + } + + log.Printf("Successfully loaded config: %+v", cfg) + return &cfg, nil +} +``` + +## Debugging Decision Tree + +``` +Problem? +│ +├─ Layout issue? +│ ├─ Panels covering title/status? → Check border accounting (Rule #1) +│ ├─ Panels misaligned? → Check text wrapping (Rule #2) +│ ├─ Borders missing? → Check terminal Unicode support +│ └─ Content overflow? → Check truncation +│ +├─ Mouse issue? +│ ├─ Clicks not working? → Check mouse enabled + MouseMsg handling +│ ├─ Wrong panel focused? → Check layout orientation (Rule #3) +│ └─ Scrolling broken? → Check MouseWheel handling +│ +├─ Rendering issue? +│ ├─ Flickering? → Check update frequency + alt screen +│ ├─ No colors? → Check terminal support + TERM variable +│ └─ Emoji alignment? → Check terminal emoji width settings +│ +├─ Keyboard issue? +│ ├─ Shortcuts not working? → Log key events, check key.Matches +│ ├─ Special keys broken? → Use msg.Key().Code +│ └─ Wrong component responding? → Check focus state +│ +└─ Performance issue? + ├─ Slow rendering? → Cache, virtual scrolling, visible-only + └─ High memory? → Limit cache, stream data + +``` + +## General Debugging Tips + +### 1. Enable Debug Logging + +```go +// Create debug log file +func setupDebugLog() *os.File { + f, err := os.OpenFile("debug.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) + if err != nil { + return nil + } + log.SetOutput(f) + return f +} + +// In main() +logFile := setupDebugLog() +if logFile != nil { + defer logFile.Close() +} +``` + +### 2. Log All Messages + +```go +func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + log.Printf("Update: %T %+v", msg, msg) + // ... rest of update logic +} +``` + +### 3. Inspect Terminal Capabilities + +```bash +# Check terminal type +echo $TERM + +# Check color support +tput colors + +# Check dimensions +tput cols +tput lines + +# Check capabilities +infocmp $TERM +``` + +### 4. Test in Different Terminals + +Try your app in multiple terminals: +- iTerm2 (macOS) +- Alacritty (cross-platform) +- kitty (cross-platform) +- WezTerm (cross-platform) +- Windows Terminal (Windows) +- Termux (Android) + +### 5. Use Alt Screen + +Always use alt screen for full-screen TUIs: + +```go +p := tea.NewProgram(initialModel()) + +func (m model) View() tea.View { + v := tea.NewView(m.render()) + v.AltScreen = true + v.MouseMode = tea.MouseModeCellMotion + return v +} +``` + +This prevents messing up the user's terminal when your app exits. + +## Getting Help + +If you're still stuck: + +1. Check the [Golden Rules](golden-rules.md) - 90% of issues are layout-related +2. Review the [Components Guide](components.md) for proper component usage +3. Check the Bubble Tea v2 examples and upgrade guide in the installed module cache after `go get charm.land/bubbletea/v2` +4. Ask in Charm Discord: https://charm.sh/discord +5. Search upstream Bubble Tea issues/discussions for the exact terminal behavior you're seeing diff --git a/.agents/skills/context7/SKILL.md b/.agents/skills/context7/SKILL.md new file mode 100644 index 00000000..a03c3072 --- /dev/null +++ b/.agents/skills/context7/SKILL.md @@ -0,0 +1,160 @@ +--- +name: context7 +description: >- + Retrieves authoritative, up-to-date technical documentation, API references, + configuration details, and code examples for any developer technology. + + Use this skill whenever answering technical questions or writing code that + interacts with external technologies. This includes libraries, frameworks, + programming languages, SDKs, APIs, CLI tools, cloud services, infrastructure + tools, and developer platforms. + + Common scenarios: + - looking up API endpoints, classes, functions, or method parameters + - checking configuration options or CLI commands + - answering "how do I" technical questions + - generating code that uses a specific library or service + - debugging issues related to frameworks, SDKs, or APIs + - retrieving setup instructions, examples, or migration guides + - verifying version-specific behavior or breaking changes + + Prefer this skill whenever documentation accuracy matters or when model + knowledge may be outdated. +--- + +# Documentation Lookup + +Retrieve current documentation and code examples for any library using the Context7 CLI. + +Make sure the CLI is up to date before running commands: + +```bash +npm install -g ctx7@latest +``` + +Or run directly without installing: + +```bash +npx ctx7@latest +``` + +## Workflow + +Two-step process: resolve the library name to an ID, then query docs with that ID. + +```bash +# Step 1: Resolve library ID +ctx7 library + +# Step 2: Query documentation +ctx7 docs +``` + +You MUST call `ctx7 library` first to obtain a valid library ID UNLESS the user explicitly provides a library ID in the format `/org/project` or `/org/project/version`. + +IMPORTANT: Do not run these commands more than 3 times per question. If you cannot find what you need after 3 attempts, use the best result you have. + +## Step 1: Resolve a Library + +Resolves a package/product name to a Context7-compatible library ID and returns matching libraries. + +```bash +ctx7 library react "How to clean up useEffect with async operations" +ctx7 library nextjs "How to set up app router with middleware" +ctx7 library prisma "How to define one-to-many relations with cascade delete" +``` + +Always pass a `query` argument — it is required and directly affects result ranking. Use the user's intent to form the query, which helps disambiguate when multiple libraries share a similar name. Do not include any sensitive or confidential information such as API keys, passwords, credentials, personal data, or proprietary code in your query. + +### Result fields + +Each result includes: + +- **Library ID** — Context7-compatible identifier (format: `/org/project`) +- **Name** — Library or package name +- **Description** — Short summary +- **Code Snippets** — Number of available code examples +- **Source Reputation** — Authority indicator (High, Medium, Low, or Unknown) +- **Benchmark Score** — Quality indicator (100 is the highest score) +- **Versions** — List of versions if available. Use one of those versions if the user provides a version in their query. The format is `/org/project/version`. + +### Selection process + +1. Analyze the query to understand what library/package the user is looking for +2. Select the most relevant match based on: + - Name similarity to the query (exact matches prioritized) + - Description relevance to the query's intent + - Documentation coverage (prioritize libraries with higher Code Snippet counts) + - Source reputation (consider libraries with High or Medium reputation more authoritative) + - Benchmark score (higher is better, 100 is the maximum) +3. If multiple good matches exist, acknowledge this but proceed with the most relevant one +4. If no good matches exist, clearly state this and suggest query refinements +5. For ambiguous queries, request clarification before proceeding with a best-guess match + +### Version-specific IDs + +If the user mentions a specific version, use a version-specific library ID: + +```bash +# General (latest indexed) +ctx7 docs /vercel/next.js "How to set up app router" + +# Version-specific +ctx7 docs /vercel/next.js/v14.3.0-canary.87 "How to set up app router" +``` + +The available versions are listed in the `ctx7 library` output. Use the closest match to what the user specified. + +## Step 2: Query Documentation + +Retrieves up-to-date documentation and code examples for the resolved library. + +```bash +ctx7 docs /facebook/react "How to clean up useEffect with async operations" +ctx7 docs /vercel/next.js "How to add authentication middleware to app router" +ctx7 docs /prisma/prisma "How to define one-to-many relations with cascade delete" +``` + +### Writing good queries + +The query directly affects the quality of results. Be specific and include relevant details. Do not include any sensitive or confidential information such as API keys, passwords, credentials, personal data, or proprietary code in your query. + +| Quality | Example | +| ------- | ---------------------------------------------------------- | +| Good | `"How to set up authentication with JWT in Express.js"` | +| Good | `"React useEffect cleanup function with async operations"` | +| Bad | `"auth"` | +| Bad | `"hooks"` | + +Use the user's full question as the query when possible, vague one-word queries return generic results. + +The output contains two types of content: **code snippets** (titled, with language-tagged blocks) and **info snippets** (prose explanations with breadcrumb context). + +## Authentication + +Works without authentication. For higher rate limits: + +```bash +# Option A: environment variable +export CONTEXT7_API_KEY=your_key + +# Option B: OAuth login +ctx7 login +``` + +## Error Handling + +If a command fails with a quota error ("Monthly quota reached" or "quota exceeded"): + +1. Inform the user their Context7 quota is exhausted +2. Suggest they authenticate for higher limits: `ctx7 login` +3. If they cannot or choose not to authenticate, answer from training knowledge and clearly note it may be outdated + +Do not silently fall back to training data — always tell the user why Context7 was not used. + +## Common Mistakes + +- Library IDs require a `/` prefix — `/facebook/react` not `facebook/react` +- Always run `ctx7 library` first — `ctx7 docs react "hooks"` will fail without a valid ID +- Use descriptive queries, not single words — `"React useEffect cleanup function"` not `"hooks"` +- Do not include sensitive information (API keys, passwords, credentials) in queries diff --git a/.agents/skills/council/SKILL.md b/.agents/skills/council/SKILL.md new file mode 100644 index 00000000..5013ad3b --- /dev/null +++ b/.agents/skills/council/SKILL.md @@ -0,0 +1,97 @@ +--- +name: council +description: Orchestrates multi-advisor council debates on high-impact architecture, technology, or product decisions. Dispatches 3-5 domain archetype subagents (pragmatic-engineer, architect-advisor, security-advocate, product-mind, devils-advocate, the-thinker) through opening statements, tensions, position evolution, and synthesis phases. Preserves dissent and delivers actionable recommendations with captured risks. Use when evaluating trade-offs, stress-testing a PRD or tech spec, resolving dilemmas with multiple viable options, or when a decision needs diverse expert perspectives. Don't use for simple yes/no questions, factual lookups, creative brainstorming without tradeoffs, or tasks where a single expert perspective suffices. +--- + +# Council Facilitator + +## Role + +Facilitate a multi-advisor roundtable by dispatching archetype subagents, surfacing tensions, tracking position evolution, and synthesizing actionable recommendations. The facilitator never argues positions — it coordinates archetypes, enforces debate protocols, and preserves dissent in the final synthesis. + +## Procedures + +**Step 1: Confirm Scope and Mode** + +1. Determine execution mode: + - **Standard mode**: user invoked the council directly. Run all 6 phases. + - **Embedded mode**: a parent skill invoked the council as a sub-step. Skip Phase 1 (context confirmation) and Phase 6 (decision capture). Return synthesis output for the parent to extract. +2. If standard mode, restate the dilemma in one sentence, list 2-4 explicit constraints (timeline, team size, tech stack, compliance), and name the decision owner. If anything is ambiguous, ask the user to clarify before proceeding. +3. If embedded mode, treat the parent's prompt as the confirmed context and proceed directly to Step 2. + +**Step 2: Select Advisors** + +1. Read `references/archetypes.md` to review the full archetype catalog and selection heuristics. +2. Treat each selected advisor as a canonical reusable agent id. The standard roster is provisioned by `productize setup` under `~/.productize/agents//` and can be overridden per workspace under `.productize/agents//`. +3. Select 3-5 advisors based on dilemma complexity: + - **3 advisors** for binary choices or narrow trade-offs. + - **4 advisors** for multi-factor decisions. + - **5 advisors** for complex multi-faceted decisions. +4. Always include `devils-advocate` when the dilemma shows signs of emerging consensus or when the user explicitly wants stress-testing. +5. Include `the-thinker` when the problem framing itself may be the constraint (every tactic within the frame has failed, or the group is trapped in one metaphor). +6. Announce the selected roster with a one-line justification for each advisor's inclusion. + +**Step 3: Dispatch Opening Statements (Parallel)** + +1. Dispatch all selected archetypes through the host-owned `run_agent` tool. Use the canonical advisor ids directly (`pragmatic-engineer`, `architect-advisor`, `security-advocate`, `product-mind`, `devils-advocate`, `the-thinker`) rather than driver-specific agent paths. +2. Run the opening statements in parallel when the runtime supports parallel tool calls. +3. Each dispatched agent receives: + - The confirmed dilemma and constraints from Step 1 + - The roster of other advisors (so they know who they're debating) + - The instruction: "Deliver your opening statement (2-3 paragraphs) ending with a one-line **Key Point**." +4. Collect all opening statements. Render them under the heading `## Opening Statements` using the format in `assets/synthesis-template.md`. + +**Step 4: Extract Tensions and Run Rebuttals** + +1. Read all opening statements and identify 2-4 core disagreements between advisors. A genuine tension has Side A, Side B, and real stakes — not surface-level phrasing differences. +2. Read `references/debate-protocols.md` to apply steel-manning, evidence-requirement, and concession rules. +3. For each tension, dispatch the two opposing archetypes again through `run_agent` (in parallel per tension when supported) with the instruction: "Steel-man [opponent]'s position in 1-2 sentences, then deliver your rebuttal (1 paragraph). State whether you concede, partially concede, or hold firm, and why." +4. Record results in a tensions table with columns: Tension | Side A (Advisor) | Side B (Advisor) | Facilitator Note. +5. Document key concessions beneath the table: who conceded what and why, who held firm and why. + +**Step 5: Track Position Evolution** + +1. Compare each advisor's opening statement to their rebuttal/concession. +2. Build a position-evolution table: Advisor | Initial Position | Final Position | Changed? +3. Flag shifts explicitly — who moved, what moved them, and whether the shift reflects genuine updating or surface accommodation. + +**Step 6: Synthesize and Output** + +1. Read `assets/synthesis-template.md` to structure the final output. +2. Write synthesis sections in this order: + - **Points of Consensus** — claims all advisors agree on (may be empty) + - **Unresolved Tensions** — disagreements that survived debate + - **Recommended Path Forward** — primary recommendation with rationale + - **Dissenting View** — the strongest minority position, attributed to specific advisors (never omit) + - **Risk Mitigation** — concrete controls that address the dissenting view's concerns +3. If in embedded mode, stop here and return the synthesis to the parent skill. + +**Step 7: Capture Decision (Standard Mode Only)** + +1. Ask the user: "Which path are you taking, and what triggers would cause you to revisit this decision?" +2. Record the user's answer verbatim at the end of the output under `## Decision Captured`. + +## Debate Protocols (enforced throughout) + +- **Steel-Man First**: every rebuttal begins by presenting the strongest version of the opposing view. +- **Evidence Required**: claims need reasoning or examples, not bare assertions. +- **Authenticity**: each archetype argues from its genuine priorities — the Security Advocate never dismisses risk for convenience; the Pragmatic Engineer never prioritizes theoretical purity over shipping. +- **No False Consensus**: disagreement that remains after debate is preserved in synthesis, not smoothed over. +- **Concession Protocol**: advisors who concede state *what* they concede and *why*; advisors who hold firm state what would change their mind. + +If any dispatched archetype violates these protocols (e.g., Security Advocate agrees to ship without controls for convenience), reject the response and re-dispatch with the protocol reminder. + +## Facilitator Responsibilities + +- Ensure every advisor gets adequate voice in every phase. +- Call out when advisors talk past each other (different definitions of the same term, different scopes). +- Identify hidden assumptions and false dichotomies in the framing itself. +- Synthesize without forcing agreement — diversity of positions is the output, not a bug. + +## Error Handling + +- **Archetype dispatch fails or returns out-of-character content**: re-dispatch with explicit protocol reminder and roster context. If failure repeats, note the failure in the synthesis and proceed with remaining advisors. +- **`run_agent` is unavailable or the council archetypes are missing**: stop and tell the user to run `productize setup` so the global council agents are provisioned under `~/.productize/agents`. +- **Fewer than 2 genuine tensions emerge**: the dilemma may be lower-stakes than assumed. Report this observation to the user and ask whether to continue with a condensed synthesis or abort the council. +- **Consensus forms too quickly across all advisors**: add `devils-advocate` to the roster (if not already included) and re-run Step 4 against the emerging consensus. +- **User asks for an archetype not in the standard catalog**: read `references/archetypes.md` for custom-council guidance, or propose the closest standard archetype and confirm with the user before proceeding. diff --git a/.agents/skills/council/assets/synthesis-template.md b/.agents/skills/council/assets/synthesis-template.md new file mode 100644 index 00000000..355c908b --- /dev/null +++ b/.agents/skills/council/assets/synthesis-template.md @@ -0,0 +1,85 @@ +# Council Session: [Dilemma One-Liner] + +**Mode:** [Standard | Embedded] +**Advisors:** [advisor-1, advisor-2, advisor-3, ...] +**Constraints:** [timeline, team, tech-stack, compliance, other] + +--- + +## Opening Statements + +### [Advisor Name] — [Archetype] + +[Position paragraph 1: stance grounded in archetype priorities] + +[Position paragraph 2: concrete reasoning, costs, trade-offs identified] + +[Position paragraph 3 (optional): alternative or concrete proposal] + +**Key Point:** [One-line summary of stance] + +--- + +### [Next Advisor] — [Archetype] + +[... same structure ...] + +**Key Point:** [One-line summary] + +--- + +## Core Tensions + +| Tension | Side A ([Advisor]) | Side B ([Advisor]) | Facilitator Note | +| ------- | ------------------ | ------------------ | ---------------- | +| [e.g., Timing of security controls] | [Summary of A's position] | [Summary of B's position] | [Scope/definition alignment, hidden assumptions, or false-dichotomy observation] | + +### Key Concessions + +- **[Advisor A]** concedes to **[Advisor B]** on [specific point] because [reasoning that moved them] +- **[Advisor C]** partially concedes on [point] but maintains [sub-claim] because [reasoning] +- **[Advisor D]** holds firm on [point] because [what would change their mind] + +--- + +## Position Evolution + +| Advisor | Initial Position | Final Position | Changed? | +| ------- | ---------------- | -------------- | -------- | +| [Name] | [One-line initial stance] | [One-line final stance] | [No / Partial shift: what moved / Yes: what moved] | + +--- + +## Council Synthesis + +### Points of Consensus + +- [Claim all advisors agree on, with one-line rationale] +- [Next claim] +- (This section may be empty. Do not invent consensus.) + +### Unresolved Tensions + +- [Tension that survived debate, and which advisors hold which side] +- [Next unresolved tension] + +### Recommended Path Forward + +**Primary Recommendation:** [Concrete action or decision] + +**Rationale:** [Why this path, grounded in the consensus points and the strongest debate arguments] + +**Dissenting View:** [The strongest minority position, attributed to specific advisor(s). Never omit.] + +### Risk Mitigation + +- [Control #1 that addresses the dissenting concern] +- [Control #2] +- [Trigger conditions that should cause the team to revisit this decision] + +--- + +## Decision Captured (Standard mode only) + +**Path chosen:** [User's stated choice, verbatim] +**Revisit triggers:** [Conditions the user named for re-evaluating] diff --git a/.agents/skills/council/references/archetypes.md b/.agents/skills/council/references/archetypes.md new file mode 100644 index 00000000..7a093cff --- /dev/null +++ b/.agents/skills/council/references/archetypes.md @@ -0,0 +1,67 @@ +# Archetype Catalog + +Each archetype is a canonical reusable agent resolved by name from `.productize/agents//` or `~/.productize/agents//`. `productize setup` provisions the standard council roster globally under `~/.productize/agents/`. Dispatch these archetypes through the host-owned `run_agent` tool. Do not summarize or reinvent their priorities — dispatch the actual reusable agent so its authentic voice is preserved. + +## Standard Tech Council (default) + +### pragmatic-engineer +- **Priorities**: what works today, maintenance burden, team velocity, incremental delivery, boring technology +- **Voice**: execution reality, "who maintains this in 2 years?", push back on rewrites and premature abstraction +- **Will not**: prioritize theoretical purity, dismiss maintenance concerns, agree to shiny tech without execution analysis +- **Include when**: the debate involves new frameworks, rewrites, migration cost, or team ramp-up + +### architect-advisor +- **Priorities**: system boundaries, coupling and cohesion, patterns and consistency, technical debt, scalability (10x/100x) +- **Voice**: 3-5 year horizons, trace data flows, "what does this couple us to?", defend architectural integrity +- **Will not**: accept load-bearing hacks, ignore coupling for convenience, allow "we'll refactor later" without a plan +- **Include when**: service boundaries, data ownership, long-term coupling, or scaling are at stake + +### security-advocate +- **Priorities**: threat modeling, attack surface, blast radius, compliance and data protection, defense in depth +- **Voice**: assume breach, "what does an attacker do with this?", never trade security for convenience without explicit risk acceptance +- **Will not**: dismiss risks as inconvenient, accept "security later" without owner/deadline, treat compliance as optional +- **Include when**: auth, data handling, PII, regulatory requirements, or external attack surface are involved + +### product-mind +- **Priorities**: user impact, business value, time-to-market, opportunity cost, validated learning +- **Voice**: "what's the hypothesis?", opportunity cost, every yes is a no to something else, ship the smallest test +- **Will not**: approve work without a value hypothesis, let perfect be the enemy of shipped, ignore opportunity cost +- **Include when**: roadmap trade-offs, user-facing features, timeline/revenue pressure, or scope decisions are debated + +### devils-advocate +- **Priorities**: surface hidden assumptions, find edge cases, stress-test reasoning, identify failure modes, prevent false consensus +- **Voice**: informed skepticism (not reflexive contrarianism), attack strongest form, celebrate when attacks fail +- **Will not**: contradict for sport, make arguments they don't believe, attack strawmen +- **Include when**: consensus is forming too quickly, a plan looks solid, or the group is over-aligned + +### the-thinker +- **Priorities**: reveal hidden assumptions, import structural patterns from distant domains, surface governing metaphors, hold paradoxes open, load-bearing analogies only +- **Voice**: defamiliarize problems, "what kind of problem is this, actually?", bisociation, structured strangeness +- **Will not**: offer shallow novelty, name-drop domains without mechanisms, resist convergence indefinitely, produce decorative analogies +- **Include when**: every tactic within a frame has failed, the group is trapped in one metaphor, or the problem's framing itself may be the constraint + +## Selection Heuristics + +| Dilemma Shape | Recommended Roster | +| -------------------------------------- | --------------------------------------------------------------------------- | +| Binary tech choice (3 advisors) | pragmatic-engineer, architect-advisor, product-mind | +| Security-sensitive decision (3-4) | security-advocate, architect-advisor, pragmatic-engineer (+ product-mind) | +| Rewrite vs. refactor (4) | pragmatic-engineer, architect-advisor, product-mind, devils-advocate | +| PRD/tech spec stress-test (5) | all five standard archetypes | +| Stuck problem, every tactic tried (4) | the-thinker, devils-advocate, + 2 domain archetypes from above | +| Complex multi-faceted (5) | all five standard archetypes, optionally swap one for the-thinker | + +## Custom Councils + +If the user requests a non-tech council (Strategy, Innovation, Design), propose a custom roster by mapping the dilemma's concerns to the closest available archetypes, or confirm with the user which archetypes to use. Do not invent new archetype subagents within a session — work with the catalog above. + +## Dispatch Format + +When dispatching an archetype via `run_agent`, always provide: + +1. The confirmed dilemma and explicit constraints +2. The roster of other advisors in the session (so they can name and engage with peers) +3. The specific phase instruction (opening statement, rebuttal, concession, final position) +4. Any prior statements from other advisors that are relevant to the current phase + +Each archetype subagent already encodes its own voice and protocols — do not re-specify priorities or restrictions in the dispatch prompt. diff --git a/.agents/skills/council/references/debate-protocols.md b/.agents/skills/council/references/debate-protocols.md new file mode 100644 index 00000000..d7ddc2c0 --- /dev/null +++ b/.agents/skills/council/references/debate-protocols.md @@ -0,0 +1,70 @@ +# Debate Protocols + +These protocols govern every phase of a council session. Enforce them on every dispatched archetype response. Reject and re-dispatch responses that violate them. + +## Steel-Man First + +Every rebuttal, concession, or challenge begins by presenting the **strongest plausible version** of the opposing argument in 1-2 sentences. + +- **Pass**: "The Architect's strongest case is that today's coupling will cost 3+ weeks on every migration for the next 2 years, which dwarfs the one-quarter split cost." +- **Fail**: "The Architect wants to do a big rewrite." (strawman — dismissive, weakens the opposing case before engaging it) + +If an advisor cannot steel-man the opposing view, they are not qualified to critique it. + +## Evidence Required + +Claims need reasoning, concrete examples, or explicit trade-off analysis — not bare assertions. + +- **Pass**: "Token revocation is broken for JWT because the server cannot invalidate a token it didn't store; compromise requires waiting for TTL expiry." +- **Fail**: "JWT is insecure." + +If a response contains only assertions, re-dispatch asking for the specific mechanism, scenario, or evidence. + +## Authenticity + +Each archetype argues from its **genuine priorities** — documented in `archetypes.md`. They do not drift toward whichever position sounds diplomatic. + +- **Pass (Security Advocate)**: "I'll concede the theoretical risk is small, but compliance requires audit trails regardless — that's not optional." +- **Fail (Security Advocate)**: "Sure, we can ship without the audit trail this quarter and add it later." + +Authenticity violations usually look like: +- Security Advocate agreeing to skip controls for velocity +- Pragmatic Engineer championing a rewrite over incremental delivery +- Architect accepting "we'll refactor it later" without a plan +- Product Mind approving work with no value hypothesis +- Devil's Advocate attacking strawmen instead of strongest forms +- The Thinker offering decorative analogies that don't predict new moves + +Reject authenticity violations and re-dispatch with a reminder of the archetype's priorities. + +## Concession Protocol + +Advisors who concede must state: +- **What** they concede (the specific claim or position) +- **Why** they concede (the argument or evidence that moved them) + +Advisors who hold firm must state: +- **What would change their mind** (a concrete scenario, evidence, or mitigation) + +- **Pass**: "I concede the split can ship incrementally, because the Architect's phased-extraction proposal addresses the 'big-bang rewrite' concern I had. I still hold firm on requiring the oncall runbook before merge." +- **Fail**: "Good points all around." (no concession content, no held-firm content, no signal of genuine engagement) + +## No False Consensus + +Disagreement that survives debate is **preserved** in synthesis. Never smooth over tensions for a cleaner recommendation. + +- **Pass**: "The council reached no consensus on timing; Security Advocate holds that controls must ship before the feature, while Product Mind maintains that a post-launch controls sprint is acceptable. This dissent is captured in the Dissenting View section." +- **Fail**: "After discussion, advisors agreed the feature should ship with security controls eventually." (papers over the timing disagreement, which is the load-bearing tension) + +## Productive Conflict + +Disagreement is a **feature**, not a bug. The council's value comes from exploring tensions, not reaching unanimous agreement. If all advisors agree after Phase 3, that is a signal of: +1. A lower-stakes dilemma than assumed, or +2. Missing perspective (add `devils-advocate` if not present), or +3. Archetypes drifting out of character (re-dispatch with authenticity reminder) + +## Avoid Talking Past Each Other + +Two advisors can appear to disagree while defining the same term differently, or scoping the decision differently. When this happens, the facilitator **names it explicitly** in the Tensions table's Facilitator Note column and asks both advisors to align on definition/scope before the rebuttal round continues. + +Example Facilitator Note: "Both advisors use 'split' but the Architect means 'service-level boundary split' while the Pragmatic Engineer means 'module-level package split'. Re-aligning scope." diff --git a/.agents/skills/crafting-effective-readmes/README.md b/.agents/skills/crafting-effective-readmes/README.md new file mode 100644 index 00000000..d926f075 --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/README.md @@ -0,0 +1,180 @@ +# Crafting Effective READMEs + +A skill for Claude Code that helps you write, update, and improve README files tailored to your specific project type and audience. + +## Purpose + +Not all READMEs are the same. An open-source library needs different documentation than a personal project or an internal tool. This skill provides: + +- **Audience-aware guidance** - Different readers need different information +- **Project-type templates** - Ready-to-use structures for OSS, personal, internal, and config projects +- **Task-specific workflows** - Whether creating, updating, adding to, or reviewing READMEs +- **Quality checks** - Style guidance and section checklists to avoid common mistakes + +## When to Use + +Use this skill when you need to: + +- Create a README for a new project +- Add a new section to an existing README +- Update stale documentation after changes +- Review and refresh README content +- Choose the right sections for your project type + +**Trigger phrases:** + +- "Write a README for this project" +- "Help me document this" +- "Create documentation for..." +- "Update the README" +- "Review my README" +- "What sections should my README have?" + +## How It Works + +The skill follows a three-step process: + +### Step 1: Identify the Task + +The skill determines what README task you are working on: + +| Task | When to Use | +|------|-------------| +| **Creating** | New project with no README yet | +| **Adding** | Need to document something new in existing README | +| **Updating** | Capabilities changed, content is stale | +| **Reviewing** | Checking if README is still accurate | + +### Step 2: Gather Context + +Based on the task, the skill asks targeted questions: + +- **Creating**: What type of project? What problem does it solve? What is the quickest path to "it works"? +- **Adding**: What needs documenting? Where should it go? Who needs this info most? +- **Updating**: What changed? Which sections are stale? +- **Reviewing**: Compares README against actual project state (package.json, main files, etc.) + +### Step 3: Generate and Refine + +The skill uses the appropriate template and follows up with: "Anything else to highlight or include that I might have missed?" + +## Key Features + +### Project Type Templates + +| Type | Audience | Template | +|------|----------|----------| +| **Open Source** | Contributors, users worldwide | `templates/oss.md` | +| **Personal** | Future you, portfolio viewers | `templates/personal.md` | +| **Internal** | Teammates, new hires | `templates/internal.md` | +| **Config** | Future you (confused) | `templates/xdg-config.md` | + +### Section Checklist by Project Type + +| Section | OSS | Personal | Internal | Config | +|---------|-----|----------|----------|--------| +| Name/Description | Yes | Yes | Yes | Yes | +| Badges | Yes | Optional | No | No | +| Installation | Yes | Yes | Yes | No | +| Usage/Examples | Yes | Yes | Yes | Brief | +| What's Here | No | No | No | Yes | +| How to Extend | No | No | Optional | Yes | +| Contributing | Yes | Optional | Yes | No | +| License | Yes | Optional | No | No | +| Architecture | Optional | No | Yes | No | +| Gotchas/Notes | Optional | Optional | Yes | Yes | +| Last Reviewed | No | No | Optional | Yes | + +### Reference Materials + +The skill includes curated reference materials for deeper understanding: + +- **art-of-readme.md** - Philosophy behind great READMEs, cognitive funneling +- **make-a-readme.md** - Practical, section-by-section guidance +- **standard-readme-spec.md** - Formal specification for OSS consistency + +## Usage Examples + +### Creating a New README + +``` +User: I need a README for my new CLI tool + +Claude: What type of project is this - open source, personal, or internal? + +User: Open source, it's a Node.js package + +Claude: [Uses OSS template, asks about installation, usage, and contributing] +``` + +### Updating an Existing README + +``` +User: Update my README, I added a new feature + +Claude: [Reads current README, identifies where to add the new feature, + proposes specific edits] +``` + +### Reviewing for Accuracy + +``` +User: Check if my README is still accurate + +Claude: [Compares README against package.json, main files, etc. + Flags outdated sections and suggests updates] +``` + +## Best Practices + +1. **Always ask about audience** - Don't assume OSS defaults for everything +2. **Show, don't just tell** - Include examples and code samples +3. **Use structure** - Headers, tables, and lists improve scannability +4. **Keep it current** - Add "last reviewed" dates for internal/config projects +5. **Include installation steps** - Never assume setup is obvious +6. **Write for YOUR audience** - Avoid generic tone + +## Common Mistakes to Avoid + +- No installation steps (never assume setup is obvious) +- No examples (show, don't just tell) +- Wall of text (use headers, tables, lists) +- Stale content (add "last reviewed" date) +- Generic tone (write for YOUR audience) + +## Essential Sections (All Types) + +Every README needs at minimum: + +1. **Name** - Self-explanatory title +2. **Description** - What + why in 1-2 sentences +3. **Usage** - How to use it (examples help) + +## Directory Structure + +``` +crafting-effective-readmes/ + SKILL.md # Skill definition + section-checklist.md # Quick reference for sections by project type + style-guide.md # Common mistakes and prose guidance + using-references.md # Guide to reference materials + templates/ + oss.md # Open source project template + personal.md # Personal/portfolio project template + internal.md # Internal/team project template + xdg-config.md # Configuration directory template + references/ + art-of-readme.md # README philosophy + make-a-readme.md # Section-by-section guidance + standard-readme-spec.md # Formal specification + standard-readme-example-minimal.md # Minimal compliant example + standard-readme-example-maximal.md # Full-featured example +``` + +## Related Skills + +- `writing-clearly-and-concisely` - For general prose quality, clear writing, and avoiding AI patterns + +## Attribution + +- Original skill by @joshuadavidthomas from [joshuadavidthomas/agent-skills](https://github.com/joshuadavidthomas/agent-skills) (MIT) diff --git a/.agents/skills/crafting-effective-readmes/SKILL.md b/.agents/skills/crafting-effective-readmes/SKILL.md new file mode 100644 index 00000000..a6c30d95 --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/SKILL.md @@ -0,0 +1,78 @@ +--- +name: crafting-effective-readmes +description: Use when writing or improving README files. Not all READMEs are the same — provides templates and guidance matched to your audience and project type. +--- + +# Crafting Effective READMEs + +## Overview + +READMEs answer questions your audience will have. Different audiences need different information - a contributor to an OSS project needs different context than future-you opening a config folder. + +**Always ask:** Who will read this, and what do they need to know? + +## Process + +### Step 1: Identify the Task + +**Ask:** "What README task are you working on?" + +| Task | When | +|------|------| +| **Creating** | New project, no README yet | +| **Adding** | Need to document something new | +| **Updating** | Capabilities changed, content is stale | +| **Reviewing** | Checking if README is still accurate | + +### Step 2: Task-Specific Questions + +**Creating initial README:** +1. What type of project? (see Project Types below) +2. What problem does this solve in one sentence? +3. What's the quickest path to "it works"? +4. Anything notable to highlight? + +**Adding a section:** +1. What needs documenting? +2. Where should it go in the existing structure? +3. Who needs this info most? + +**Updating existing content:** +1. What changed? +2. Read current README, identify stale sections +3. Propose specific edits + +**Reviewing/refreshing:** +1. Read current README +2. Check against actual project state (package.json, main files, etc.) +3. Flag outdated sections +4. Update "Last reviewed" date if present + +### Step 3: Always Ask + +After drafting, ask: **"Anything else to highlight or include that I might have missed?"** + +## Project Types + +| Type | Audience | Key Sections | Template | +|------|----------|--------------|----------| +| **Open Source** | Contributors, users worldwide | Install, Usage, Contributing, License | `templates/oss.md` | +| **Personal** | Future you, portfolio viewers | What it does, Tech stack, Learnings | `templates/personal.md` | +| **Internal** | Teammates, new hires | Setup, Architecture, Runbooks | `templates/internal.md` | +| **Config** | Future you (confused) | What's here, Why, How to extend, Gotchas | `templates/xdg-config.md` | + +**Ask the user** if unclear. Don't assume OSS defaults for everything. + +## Essential Sections (All Types) + +Every README needs at minimum: + +1. **Name** - Self-explanatory title +2. **Description** - What + why in 1-2 sentences +3. **Usage** - How to use it (examples help) + +## References + +- `section-checklist.md` - Which sections to include by project type +- `style-guide.md` - Common README mistakes and prose guidance +- `using-references.md` - Guide to deeper reference materials diff --git a/.agents/skills/crafting-effective-readmes/references/art-of-readme.md b/.agents/skills/crafting-effective-readmes/references/art-of-readme.md new file mode 100644 index 00000000..4bf5cb93 --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/references/art-of-readme.md @@ -0,0 +1,536 @@ +# Art of README + +> Source: [hackergrrl/art-of-readme](https://github.com/hackergrrl/art-of-readme) + +*This article can also be read in [Chinese](README-zh.md), +[Japanese](README-ja-JP.md), +[Brazilian Portuguese](README-pt-BR.md), [Spanish](README-es-ES.md), +[German](README-de-DE.md), [French](README-fr.md) and [Traditional Chinese](README-zh-TW.md).* + +## Etymology + +Where does the term "README" come from? + +The nomenclature dates back to *at least* the 1970s [and the +PDP-10](http://pdp-10.trailing-edge.com/decuslib10-04/01/43,50322/read.me.html), +though it may even harken back to the days of informative paper notes placed atop +stacks of punchcards, "READ ME!" scrawled on them, describing their use. + +A reader[1](#footnote-1) suggested that the title README may be a playful nudge toward Lewis +Carroll's *Alice's Adventures in Wonderland*, which features a potion and a cake +labelled *"DRINK ME"* and *"EAT ME"*, respectively. + +The pattern of README appearing in all-caps is a consistent facet throughout +history. In addition to the visual strikingness of using all-caps, UNIX systems +would sort capitals before lower case letters, conveniently putting the README +before the rest of the directory's content[2](#footnote-2). + +The intent is clear: *"This is important information for the user to read before +proceeding."* Let's explore together what constitutes "important information" in +this modern age. + + +## For creators, for consumers + +This is an article about READMEs. About what they do, why they are an absolute +necessity, and how to craft them well. + +This is written for module creators, for as a builder of modules, your job is to +create something that will last. This is an inherent motivation, even if the +author has no intent of sharing their work. Once 6 months pass, a module without +documentation begins to look new and unfamiliar. + +This is also written for module consumers, for every module author is also a +module consumer. Node has a very healthy degree of interdependency: no one lives +at the bottom of the dependency tree. + +Despite being focused on Node, the author contends that its lessons apply +equally well to other programming ecosystems, as well. + + +## Many modules: some good, some bad + +The Node ecosystem is powered by its modules. [npm](https://npmjs.org) is the +magic that makes it all *go*. In the course of a week, Node developers evaluate +dozens of modules for inclusion in their projects. This is a great deal of power +being churned out on a daily basis, ripe for the plucking, just as fast as one +can write `npm install`. + +Like any ecosystem that is extremely accessible, the quality bar varies. npm +does its best to nicely pack away all of these modules and ship them far and +wide. However, the tools found are widely varied: some are shining and new, +others broken and rusty, and still others are somewhere in between. There are +even some that we don't know what they do! + +For modules, this can take the form of inaccurate or unhelpful names (any +guesses what the `fudge` module does?), no documentation, no tests, no source +code comments, or incomprehensible function names. + +Many don't have an active maintainer. If a module has no human available to +answer questions and explain what a module does, combined with no remnants of +documentation left behind, a module becomes a bizarre alien artifact, unusable +and incomprehensible by the archaeologist-hackers of tomorrow. + +For those modules that do have documentation, where do they fall on the quality +spectrum? Maybe it's just a one-liner description: `"sorts numbers by their hex +value"`. Maybe it's a snippet of example code. These are both improvements upon +nothing, but they tend to result in the worst-case scenario for a modern day +module spelunker: digging into the source code to try and understand how it +actually works. Writing excellent documentation is all about keeping the users +*out* of the source code by providing instructions sufficient to enjoy the +wonderful abstractions that your module brings. + +Node has a "wide" ecosystem: it's largely made up of a very long list of +independent do-one-thing-well modules flying no flags but their own. There are +[exceptions](https://github.com/lodash/lodash), but despite these minor fiefdoms, +it is the single-purpose commoners who, given their larger numbers, truly rule the +Node kingdom. + +This situation has a natural consequence: it can be hard to find *quality* modules +that do exactly what you want. + +**This is okay**. Truly. A low bar to entry and a discoverability problem is +infinitely better than a culture problem, where only the privileged few may +participate. + +Plus, discoverability -- as it turns out -- is easier to address. + + +## All roads lead to README.md + +The Node community has responded to the challenge of discoverability in +different ways. + +Some experienced Node developers band together to create [curated +lists](https://github.com/sindresorhus/awesome-nodejs) of quality modules. +Developers leverage their many years examining hundreds of different modules to +share with newcomers the *crème de la crème*: the best modules in each category. +This might also take the form of RSS feeds and mailing lists of new modules deemed +to be useful by trusted community members. + +How about the social graph? This idea spurred the creation of +[node-modules.com](http://node-modules.com/), a npm search replacement that +leverages your GitHub social graph to find modules your friends like or have +made. + +Of course there is also npm's built-in [search](https://npmjs.org) +functionality: a safe default, and the usual port of entry for new developers. + +No matter your approach, regardless whether a module spelunker enters the module +underground at [npmjs.org](https://npmjs.org), +[github.com](https://github.com), or somewhere else, this would-be user will +eventually end up staring your README square in the face. Since your users +will inevitably find themselves here, what can be done to make their first +impressions maximally effective? + + +## Professional module spelunking + +### The README: Your one-stop shop + +A README is a module consumer's first -- and maybe only -- look into your +creation. The consumer wants a module to fulfill their need, so you must explain +exactly what need your module fills, and how effectively it does so. + +Your job is to + +1. tell them what it is (with context) +2. show them what it looks like in action +3. show them how they use it +4. tell them any other relevant details + +This is *your* job. It's up to the module creator to prove that their work is a +shining gem in the sea of slipshod modules. Since so many developers' eyes will +find their way to your README before anything else, quality here is your +public-facing measure of your work. + + +### Brevity + +The lack of a README is a powerful red flag, but even a lengthy README is not +indicative of there being high quality. The ideal README is as short as it can +be without being any shorter. Detailed documentation is good -- make separate +pages for it! -- but keep your README succinct. + + +### Learn from the past + +It is said that those who do not study their history are doomed to make its +mistakes again. Developers have been writing documentation for quite some number +of years. It would be wasteful to not look back a little bit and see what people +did right before Node. + +Perl, for all of the flak it receives, is in some ways the spiritual grandparent +of Node. Both are high-level scripting languages, adopt many UNIX idioms, fuel +much of the internet, and both feature a wide module ecosystem. + +It so turns out that the [monks](http://perlmonks.org) of the Perl community +indeed have a great deal of experience in writing [quality +READMEs](http://search.cpan.org/~kane/Archive-Tar/lib/Archive/Tar.pm). CPAN is a +wonderful resource that is worth reading through to learn more about a community +that wrote consistently high-calibre documentation. + + +### No README? No abstraction + +No README means developers will need to delve into your code in order to +understand it. + +The Perl monks have wisdom to share on the matter: + +> Your documentation is complete when someone can use your module without ever +> having to look at its code. This is very important. This makes it possible for +> you to separate your module's documented interface from its internal +> implementation (guts). This is good because it means that you are free to +> change the module's internals as long as the interface remains the same. +> +> Remember: the documentation, not the code, defines what a module does. +-- [Ken Williams](http://mathforum.org/ken/perl_modules.html#document) + + +### Key elements + +Once a README is located, the brave module spelunker must scan it to discern if +it matches the developer's needs. This becomes essentially a series of pattern +matching problems for their brain to solve, where each step takes them deeper +into the module and its details. + +Let's say, for example, my search for a 2D collision detection module leads me +to [`collide-2d-aabb-aabb`](https://github.com/hackergrrl/collide-2d-aabb-aabb). I +begin to examine it from top to bottom: + +1. *Name* -- self-explanatory names are best. `collide-2d-aabb-aabb` sounds + promising, though it assumes I know what an "aabb" is. If the name sounds too + vague or unrelated, it may be a signal to move on. + +2. *One-liner* -- having a one-liner that describes the module is useful for + getting an idea of what the module does in slightly greater detail. + `collide-2d-aabb-aabb` says it + + > Determines whether a moving axis-aligned bounding box (AABB) collides with + > other AABBs. + + Awesome: it defines what an AABB is, and what the module does. Now to gauge how + well it'd fit into my code: + +3. *Usage* -- rather than starting to delve into the API docs, it'd be great to + see what the module looks like in action. I can quickly determine whether the + example JS fits the desired style and problem. People have lots of opinions + on things like promises/callbacks and ES6. If it does fit the bill, then I + can proceed to greater detail. + +4. *API* -- the name, description, and usage of this module all sound appealing + to me. I'm very likely to use this module at this point. I just need to scan + the API to make sure it does exactly what I need and that it will integrate + easily into my codebase. The API section ought to detail the module's objects + and functions, their signatures, return types, callbacks, and events in + detail. Types should be included where they aren't obvious. Caveats should be + made clear. + +5. *Installation* -- if I've read this far down, then I'm sold on trying out the + module. If there are nonstandard installation notes, here's where they'd go, + but even if it's just a regular `npm install`, I'd like to see that mentioned, + too. New users start using Node all the time, so having a link to npmjs.org + and an install command provides them the resources to figure out how Node + modules work. + +6. *License* -- most modules put this at the very bottom, but this might + actually be better to have higher up; you're likely to exclude a module VERY + quickly if it has a license incompatible with your work. I generally stick to + the MIT/BSD/X11/ISC flavours. If you have a non-permissive license, stick it + at the very top of the module to prevent any confusion. + + +## Cognitive funneling + +The ordering of the above was not chosen at random. + +Module consumers use many modules, and need to look at many modules. + +Once you've looked at hundreds of modules, you begin to notice that the mind +benefits from predictable patterns. + +You also start to build out your own personal heuristic for what information you +want, and what red flags disqualify modules quickly. + +Thus, it follows that in a README it is desirable to have: + +1. a predictable format +2. certain key elements present + +You don't need to use *this* format, but try to be consistent to save your users +precious cognitive cycles. + +The ordering presented here is lovingly referred to as "cognitive funneling," +and can be imagined as a funnel held upright, where the widest end contains the +broadest more pertinent details, and moving deeper down into the funnel presents +more specific details that are pertinent for only a reader who is interested +enough in your work to have reached that deeply in the document. Finally, the +bottom can be reserved for details only for those intrigued by the deeper +context of the work (background, credits, biblio, etc.). + +Once again, the Perl monks have wisdom to share on the subject: + +> The level of detail in Perl module documentation generally goes from +> less detailed to more detailed. Your SYNOPSIS section should +> contain a minimal example of use (perhaps as little as one line of +> code; skip the unusual use cases or anything not needed by most +> users); the DESCRIPTION should describe your module in broad terms, +> generally in just a few paragraphs; more detail of the module's +> routines or methods, lengthy code examples, or other in-depth +> material should be given in subsequent sections. +> +> Ideally, someone who's slightly familiar with your module should be +> able to refresh their memory without hitting "page down". As your +> reader continues through the document, they should receive a +> progressively greater amount of knowledge. +> -- from `perlmodstyle` + + +## Care about people's time + +Awesome; the ordering of these key elements should be decided by how quickly +they let someone 'short circuit' and bail on your module. + +This sounds bleak, doesn't it? But think about it: your job, when you're doing +it with optimal altruism in mind, isn't to "sell" people on your work. It's to +let them evaluate what your creation does as objectively as possible, and decide +whether it meets their needs or not -- not to, say, maximize your downloads or +userbase. + +This mindset doesn't appeal to everyone; it requires checking your ego at the +door and letting the work speak for itself as much as possible. Your only job is +to describe its promise as succinctly as you can, so module spelunkers can +either use your work when it's a fit, or move on to something else that does. + + +## Call to arms! + +Go forth, brave module spelunker, and make your work discoverable and usable +through excellent documentation! + + +## Bonus: other good practices + +Outside of the key points of the article, there are other practices you can +follow (or not follow) to raise your README's quality bar even further and +maximize its usefulness to others: + +1. Consider including a **Background** section if your module depends on + important but not widely known abstractions or other ecosystems. The function + of [`bisecting-between`](https://github.com/hackergrrl/bisecting-between) is not + immediately obvious from its name, so it has a detailed *Background* section + to define and link to the big concepts and abstractions one needs to + understand to use and grok it. This is also a great place to explain the + module's motivation if similar modules already exist on npm. + +2. Aggressively linkify! If you talk about other modules, ideas, or people, make + that reference text a link so that visitors can more easily grok your module + and the ideas it builds on. Few modules exist in a vacuum: all work comes + from other work, so it pays to help users follow your module's history and + inspiration. + +3. Include information on types of arguments and return parameters if it's not + obvious. Prefer convention wherever possible (`cb` probably means callback + function, `num` probably means a `Number`, etc.). + +4. Include the example code in **Usage** as a file in your repo -- maybe as + `example.js`. It's great to have README code that users can actually run if + they clone the repository. + +5. Be judicious in your use of badges. They're easy to + [abuse](https://github.com/angular/angular). They can also be a breeding + ground for bikeshedding and endless debate. They add visual noise to your + README and generally only function if the user is reading your Markdown in a + browser online, since the images are often hosted elsewhere on the + internet. For each badge, consider: "what real value is this badge providing + to the typical viewer of this README?" Do you have a CI badge to show build/test + status? This signal would better reach important parties by emailing + maintainers or automatically creating an issue. Always consider the + audience of the data in your README and ask yourself if there's a flow for + that data that can better reach its intended audience. + +6. API formatting is highly bikesheddable. Use whatever format you think is + clearest, but make sure your format expresses important subtleties: + + a. which parameters are optional, and their defaults + + b. type information, where it is not obvious from convention + + c. for `opts` object parameters, all keys and values that are accepted + + d. don't shy away from providing a tiny example of an API function's use if + it is not obvious or fully covered in the **Usage** section. + However, this can also be a strong signal that the function is too complex + and needs to be refactored, broken into smaller functions, or removed + altogether + + e. aggressively linkify specialized terminology! In markdown you can keep + [footnotes](https://daringfireball.net/projects/markdown/syntax#link) at + the bottom of your document, so referring to them several times throughout + becomes cheap. Some of my personal preferences on API formatting can be + found + [here](https://github.com/hackergrrl/common-readme/blob/master/api_formatting.md) + +7. If your module is a small collection of stateless functions, having a + **Usage** section as a [Node REPL + session](https://github.com/hackergrrl/bisecting-between#example) of function + calls and results might communicate usage more clearly than a source code + file to run. + +8. If your module provides a CLI (command line interface) instead of (or in + addition to) a programmatic API, show usage examples as command invocations + and their output. If you create or modify a file, `cat` it to demonstrate + the change before and after. + +9. Don't forget to use `package.json` + [keywords](https://docs.npmjs.com/files/package.json#keywords) to direct + module spelunkers to your doorstep. + +10. The more you change your API, the more work you need to exert updating + documentation -- the implication here is that you should keep your APIs + small and concretely defined early on. Requirements change over time, but + instead of front-loading assumptions into the APIs of your modules, load + them up one level of abstraction: the module set itself. If the requirements + *do* change and 'do-one-concrete-thing' no longer makes sense, then simply + write a new module that does the thing you need. The 'do-one-concrete-thing' + module remains a valid and valuable model for the npm ecosystem, and your + course correction cost you nothing but a simple substitution of one module for + another. + +11. Finally, please remember that your version control repository and its + embedded README will outlive your [repository host](https://github.com) and + any of the things you hyperlink to -- especially images -- so *inline* anything + that is essential to future users grokking your work. + + +## Bonus: *common-readme* + +Not coincidentally, this is also the format used by +[**common-readme**](https://github.com/hackergrrl/common-readme), a set of README +guidelines and handy command-line generator. If you like what's written here, +you may save some time writing READMEs with `common-readme`. You'll find +real module examples with this format, too. + +You may also enjoy +[standard-readme](https://github.com/richardlitt/standard-readme), which is a +more structured, lintable take on a common README format. + + +## Bonus: Exemplars + +Theory is well and good, but what do excellent READMEs look like? Here are some +that I think embody the principles of this article well: + +- https://github.com/hackergrrl/ice-box +- https://github.com/substack/quote-stream +- https://github.com/feross/bittorrent-dht +- https://github.com/mikolalysenko/box-intersect +- https://github.com/freeman-lab/pixel-grid +- https://github.com/mafintosh/torrent-stream +- https://github.com/pull-stream/pull-stream +- https://github.com/substack/tape +- https://github.com/yoshuawuyts/vmd + + +## Bonus: The README Checklist + +A helpful checklist to gauge how your README is coming along: + +- [ ] One-liner explaining the purpose of the module +- [ ] Necessary background context & links +- [ ] Potentially unfamiliar terms link to informative sources +- [ ] Clear, *runnable* example of usage +- [ ] Installation instructions +- [ ] Extensive API documentation +- [ ] Performs [cognitive funneling](https://github.com/hackergrrl/art-of-readme#cognitive-funneling) +- [ ] Caveats and limitations mentioned up-front +- [ ] Doesn't rely on images to relay critical information +- [ ] License + + +## The author + +Hi, I'm [Kira](http://kira.solar). + +This little project began back in May in Berlin at squatconf, where I was +digging into how Perl monks write their documentation and also lamenting the +state of READMEs in the Node ecosystem. It spurred me to create +[common-readme](https://github.com/hackergrrl/common-readme). The "README Tips" +section overflowed with tips though, which I decided could be usefully collected +into an article about writing READMEs. Thus, Art of README was born! + + +## Further Reading + +- [README-Driven Development](http://tom.preston-werner.com/2010/08/23/readme-driven-development.html) +- [Documentation First](http://joeyh.name/blog/entry/documentation_first/) + + +## Footnotes + +1. Thanks, + [Sixes666](https://www.reddit.com/r/node/comments/55eto9/nodejs_the_art_of_readme/d8akpz6)! + +2. See [The Jargon File](http://catb.org/~esr/jargon/html/R/README-file.html). + However, most systems today will not sort capitals before all lowercase + characters, reducing this convention's usefulness to just the visual + strikingness of all-caps. + + +## Credits + +A heartfelt thank you to [@mafintosh](https://github.com/mafintosh) and +[@feross](https://github.com/feross) for the encouragement I needed to get this +idea off the ground and start writing! + +Thank you to the following awesome readers for noticing errors and sending me +PRs :heart: : + +- [@ungoldman](https://github.com/ungoldman) +- [@boidolr](https://github.com/boidolr) +- [@imjoehaines](https://github.com/imjoehaines) +- [@radarhere](https://github.com/radarhere) +- [@joshmanders](https://github.com/joshmanders) +- [@ddbeck](https://github.com/ddbeck) +- [@RichardLitt](https://github.com/RichardLitt) +- [@StevenMaude](https://github.com/StevenMaude) +- [@KrishMunot](https://github.com/KrishMunot) +- [@chesterhow](https://github.com/chesterhow) +- [@sjsyrek](https://github.com/sjsyrek) +- [@thenickcox](https://github.com/thenickcox) + +Thank you to [@qihaiyan](https://github.com/qihaiyan) for translating Art of +README to Chinese! The following users also made contributions: + +- [@BrettDong](https://github.com/brettdong) for revising punctuation in Chinese version. +- [@Alex-fun](https://github.com/Alex-fun) +- [@HmyBmny](https://github.com/HmyBmny) +- [@vra](https://github.com/vra) + +Thank you to [@lennonjesus](https://github.com/lennonjesus) for translating Art +of README to Brazilian Portuguese! The following users also made contributions: + +- [@rectius](https://github.com/rectius) + +Thank you to [@jabiinfante](https://github.com/jabiinfante) for translating Art +of README to Spanish! + +Thank you to [@Ryuno-Ki](https://github.com/Ryuno-Ki) for translating Art of +README to German! The following users also made contributions: + +- [@randomC0der](https://github.com/randomC0der) + +Thank you to [@Manfred Madelaine](https://github.com/Manfred-Madelaine-pro) and +[@Ruben Madelaine](https://github.com/Ruben-Madelaine) +for translating Art of README to French! + +## Other Resources +Some readers have suggested other useful resources for README composition: +- [Software Release Practice](https://tldp.org/HOWTO/Software-Release-Practice-HOWTO/distpractice.html#readme) +- [GNU Releases](https://www.gnu.org/prep/standards/html_node/Releases.html#index-README-file) + + +## License + +[Creative Commons Attribution License](http://creativecommons.org/licenses/by/2.0/) diff --git a/.agents/skills/crafting-effective-readmes/references/make-a-readme.md b/.agents/skills/crafting-effective-readmes/references/make-a-readme.md new file mode 100644 index 00000000..6b0d7cd1 --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/references/make-a-readme.md @@ -0,0 +1,119 @@ +# Make a README + +> Source: [makeareadme.com](https://www.makeareadme.com) by Danny Guo +> +> "Because no one can read your mind (yet)" + +## README 101 + +### What is it? + +A README is a text file that introduces and explains a project. It contains information that is commonly required to understand what the project is about. + +### Why should I make it? + +It's an easy way to answer questions that your audience will likely have regarding how to install and use your project and also how to collaborate with you. + +### Who should make it? + +Anyone who is working on a programming project, especially if you want others to use it or contribute. + +### When should I make it? + +Definitely before you show a project to other people or make it public. You might want to get into the habit of making it the first file you create in a new project. + +### Where should I put it? + +In the top level directory of the project. This is where someone who is new to your project will start out. Code hosting services such as GitHub, Bitbucket, and GitLab will also look for your README and display it along with the list of files and directories in your project. + +### How should I make it? + +While READMEs can be written in any text file format, the most common one that is used nowadays is Markdown. It allows you to add some lightweight formatting. You can learn more about it at the [CommonMark website](https://commonmark.org/). + +## Suggestions for a Good README + +Every project is different, so consider which of these sections apply to yours. Also keep in mind that while a README can be too long and detailed, **too long is better than too short**. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. + +### Name + +Choose a self-explaining name for your project. + +### Description + +Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of **Features** or a **Background** subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. + +### Badges + +On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use [Shields.io](http://shields.io/) to add some to your README. Many services also have instructions for adding a badge. + +### Visuals + +Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like [ttygif](https://github.com/icholy/ttygif) can help, but check out [Asciinema](https://asciinema.org/) for a more sophisticated method. + +### Installation + +Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a **Requirements** subsection. + +### Usage + +Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. + +### Support + +Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. + +### Roadmap + +If you have ideas for releases in the future, it is a good idea to list them in the README. + +### Contributing + +State if you are open to contributions and what your requirements are for accepting them. + +For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. + +You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. + +### Authors and Acknowledgment + +Show your appreciation to those who have contributed to the project. + +### License + +For open source projects, say how it is licensed. + +### Project Status + +If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. + +## FAQ + +### Is there a standard README format? + +Not all of the suggestions here will make sense for every project, so it's really up to the developers what information should be included in the README. + +### What should the README file be named? + +`README.md` (or a different file extension if you choose to use a non-Markdown file format). It is traditionally uppercase so that it is more prominent, but it's not a big deal if you think it looks better lowercase. + +## What's Next? + +### More Documentation + +A README is a crucial but basic way of documenting your project. While every project should at least have a README, more involved ones can also benefit from a wiki or a dedicated documentation website. Tools include: + +- [Docusaurus](https://docusaurus.io/) +- [GitBook](https://www.gitbook.com/) +- [MkDocs](https://www.mkdocs.org/) +- [Read the Docs](https://readthedocs.org/) +- [Docsify](https://docsify.js.org/) + +### Changelog + +A [changelog](https://en.wikipedia.org/wiki/Changelog) is another file that is very useful for programming projects. See [Keep a Changelog](http://keepachangelog.com/). + +### Contributing Guidelines + +Just having a "Contributing" section in your README is a good start. Another approach is to split off your guidelines into their own file (`CONTRIBUTING.md`). If you use GitHub and have this file, then anyone who creates an issue or opens a pull request will get a link to it. + +You can also create an issue template and a pull request template. These files give your users and collaborators templates to fill in with the information that you'll need to properly respond. diff --git a/.agents/skills/crafting-effective-readmes/references/standard-readme-example-maximal.md b/.agents/skills/crafting-effective-readmes/references/standard-readme-example-maximal.md new file mode 100644 index 00000000..4ccdf579 --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/references/standard-readme-example-maximal.md @@ -0,0 +1,68 @@ +# Title + +![banner](assets/text_wordmark_dark.png) + +![GitHub Created At](https://img.shields.io/github/created-at/RichardLitt/standard-readme?color=bright-green&style=flat-square) +![GitHub contributors](https://img.shields.io/github/contributors/RichardLitt/standard-readme?color=bright-green&style=flat-square) +[![license](https://img.shields.io/github/license/RichardLitt/standard-readme.svg?color=bright-green&style=flat-square)](LICENSE) +[![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) + +This is an example file with maximal choices selected. + +This is a long description. + +## Table of Contents + +- [Security](#security) +- [Background](#background) +- [Install](#install) +- [Usage](#usage) +- [API](#api) +- [Contributing](#contributing) +- [License](#license) + +## Security + +### Any optional sections + +## Background + +### Any optional sections + +## Install + +This module depends upon a knowledge of [Markdown](). + +``` +``` + +### Any optional sections + +## Usage + +``` +``` + +Note: The `license` badge image link at the top of this file should be updated with the correct `:user` and `:repo`. + +### Any optional sections + +## API + +### Any optional sections + +## More optional sections + +## Contributing + +See [the contributing file](CONTRIBUTING.md)! + +PRs accepted. + +Small note: If editing the Readme, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification. + +### Any optional sections + +## License + +[MIT © Richard McRichface.](../LICENSE) diff --git a/.agents/skills/crafting-effective-readmes/references/standard-readme-example-minimal.md b/.agents/skills/crafting-effective-readmes/references/standard-readme-example-minimal.md new file mode 100644 index 00000000..13d94b7a --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/references/standard-readme-example-minimal.md @@ -0,0 +1,21 @@ +# Title + +This is an example file with default selections. + +## Install + +``` +``` + +## Usage + +``` +``` + +## Contributing + +PRs accepted. + +## License + +MIT © Richard McRichface diff --git a/.agents/skills/crafting-effective-readmes/references/standard-readme-spec.md b/.agents/skills/crafting-effective-readmes/references/standard-readme-spec.md new file mode 100644 index 00000000..91a4961f --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/references/standard-readme-spec.md @@ -0,0 +1,242 @@ +# Standard README Specification + +> Source: [Standard Readme](https://github.com/RichardLitt/standard-readme) by Richard Litt + +A compliant README must satisfy all the requirements listed below. + +> Note: Standard Readme is designed for open source libraries. Although it's [historically](README.md#background) made for Node and npm projects, it also applies to libraries in other languages and package managers. + +**Requirements:** + - Be called README (with capitalization) and have a specific extension depending on its format (`.md` for Markdown, `.org` for Org Mode Markup syntax, `.html` for HTML, ...) + - If the project supports i18n, the file must be named accordingly: `README.de.md`, where `de` is the BCP 47 Language tag. For naming, prioritize non-regional subtags for languages. If there is only one README and the language is not English, then a different language in the text is permissible without needing to specify the BCP tag: e.g., `README.md` can be in German if there is no `README.md` in another language. Where there are multiple languages, `README.md` is reserved for English. + - Be a valid file in the selected format (Markdown, Org Mode, HTML, ...). + - Sections must appear in order given below. Optional sections may be omitted. + - Sections must have the titles listed below, unless otherwise specified. If the README is in another language, the titles must be translated into that language. + - Must not contain broken links. + - If there are code examples, they should be linted in the same way as the code is linted in the rest of the project. + +## Table of Contents + +_Note: This is only a navigation guide for the specification, and does not define or mandate terms for any specification-compliant documents._ + +- [Sections](#sections) + - [Title](#title) + - [Banner](#banner) + - [Badges](#badges) + - [Short Description](#short-description) + - [Long Description](#long-description) + - [Table of Contents](#table-of-contents-1) + - [Security](#security) + - [Background](#background) + - [Install](#install) + - [Usage](#usage) + - [Extra Sections](#extra-sections) + - [API](#api) + - [Maintainers](#maintainers) + - [Thanks](#thanks) + - [Contributing](#contributing) + - [License](#license) +- [Definitions](#definitions) + +## Sections + +### Title +**Status:** Required. + +**Requirements:** +- Title must match repository, folder and package manager names - or it may have another, relevant title with the repository, folder, and package manager title next to it in italics and in parentheses. For instance: + + ```markdown + # Standard Readme Style _(standard-readme)_ + ``` + + If any of the folder, repository, or package manager names do not match, there must be a note in the [Long Description](#long-description) explaining why. + +**Suggestions:** +- Should be self-evident. + +### Banner +**Status:** Optional. + +**Requirements:** +- Must not have its own title. +- Must link to local image in current repository. +- Must appear directly after the title. + +### Badges +**Status:** Optional. + +**Requirements:** +- Must not have its own title. +- Must be newline delimited. + +**Suggestions:** +- Use http://shields.io or a similar service to create and host the images. +- Add the [Standard Readme badge](https://github.com/RichardLitt/standard-readme#badge). + +### Short Description +**Status:** Required. + +**Requirements:** +- Must not have its own title. +- Must be less than 120 characters. +- Must not start with `> ` +- Must be on its own line. +- Must match the description in the packager manager's `description` field. +- Must match GitHub's description (if on GitHub). + +**Suggestions:** +- Use [gh-description](https://github.com/RichardLitt/gh-description) to set and get GitHub description. +- Use `npm show . description` to show the description from a local [npm](https://npmjs.com) package. + +### Long Description +**Status:** Optional. + +**Requirements:** +- Must not have its own title. +- If any of the folder, repository, or package manager names do not match, there must be a note here as to why. See [Title section](#title). + +**Suggestions:** +- If too long, consider moving to the [Background](#background) section. +- Cover the main reasons for building the repository. +- "This should describe your module in broad terms, +generally in just a few paragraphs; more detail of the module's +routines or methods, lengthy code examples, or other in-depth +material should be given in subsequent sections. + + Ideally, someone who's slightly familiar with your module should be +able to refresh their memory without hitting "page down". As your +reader continues through the document, they should receive a +progressively greater amount of knowledge." + + ~ [Kirrily "Skud" Robert, perlmodstyle](http://perldoc.perl.org/perlmodstyle.html) + +### Table of Contents +**Status:** Required; optional for READMEs shorter than 100 lines. + +**Requirements:** +- Must link to all sections in the file. +- Must start with the next section; do not include the title or Table of Contents headings. +- Must be at least one-depth: must capture all level two headings (e.g.: Markdown's `##` or Org Mode's `**` or HTML's `

` and so on). + +**Suggestions:** +- May capture third and fourth depth headings. If it is a long ToC, these are optional. + +### Security +**Status**: Optional. + +**Requirements:** +- May go here if it is important to highlight security concerns. Otherwise, it should be in [Extra Sections](#extra-sections). + +### Background +**Status:** Optional. + +**Requirements:** +- Cover motivation. +- Cover abstract dependencies. +- Cover intellectual provenance: A `See Also` section is also fitting. + +### Install +**Status:** Required by default, optional for [documentation repositories](#definitions). + +**Requirements:** +- Code block illustrating how to install. + +**Subsections:** +- `Dependencies`. Required if there are unusual dependencies or dependencies that must be manually installed. + +**Suggestions:** +- Link to prerequisite sites for programming language: [npmjs](https://npmjs.com), [godocs](https://godoc.org), etc. +- Include any system-specific information needed for installation. +- An `Updating` section would be useful for most packages, if there are multiple versions which the user may interface with. + +### Usage +**Status:** Required by default, optional for [documentation repositories](#definitions). + +**Requirements:** +- Code block illustrating common usage. +- If CLI compatible, code block indicating common usage. +- If importable, code block indicating both import functionality and usage. + +**Subsections:** +- `CLI`. Required if CLI functionality exists. + +**Suggestions:** +- Cover basic choices that may affect usage: for instance, if JavaScript, cover promises/callbacks, ES6 here. +- If relevant, point to a runnable file for the usage code. + +### Extra Sections +**Status**: Optional. + +**Requirements:** +- None. + +**Suggestions:** +- This should not be called `Extra Sections`. This is a space for 0 or more sections to be included, each of which must have their own titles. +- This should contain any other sections that are relevant, placed after [Usage](#usage) and before [API](#api). +- Specifically, the [Security](#security) section should be here if it wasn't important enough to be placed above. + +### API +**Status:** Optional. + +**Requirements:** +- Describe exported functions and objects. + +**Suggestions:** +- Describe signatures, return types, callbacks, and events. +- Cover types covered where not obvious. +- Describe caveats. +- If using an external API generator (like go-doc, js-doc, or so on), point to an external `API.md` file. This can be the only item in the section, if present. + +### Maintainer(s) +**Status**: Optional. + +**Requirements:** +- Must be called `Maintainer` or `Maintainers`. +- List maintainer(s) for a repository, along with one way of contacting them (e.g. GitHub link or email). + +**Suggestions:** +- This should be a small list of people in charge of the repo. This should not be everyone with access rights, such as an entire organization, but the people who should be pinged and who are in charge of the direction and maintenance of the repository. +- Listing past maintainers is good for attribution, and kind. + +### Thanks +**Status**: Optional. + +**Requirements:** +- Must be called `Thanks`, `Credits` or `Acknowledgements`. + +**Suggestions:** +- State anyone or anything that significantly helped with the development of your project. +- State public contact hyper-links if applicable. + +### Contributing +**Status**: Required. + +**Requirements:** +- State where users can ask questions. +- State whether PRs are accepted. +- List any requirements for contributing; for instance, having a sign-off on commits. + +**Suggestions:** +- Link to a CONTRIBUTING file -- if there is one. +- Be as friendly as possible. +- Link to the GitHub issues. +- Link to a Code of Conduct. A CoC is often in the Contributing section or document, or set elsewhere for an entire organization, so it may not be necessary to include the entire file in each repository. However, it is highly recommended to always link to the code, wherever it lives. +- A subsection for listing contributors is also welcome here. + +### License +**Status:** Required. + +**Requirements:** +- State license full name or identifier, as listed on the [SPDX](https://spdx.org/licenses/) license list. For unlicensed repositories, add `UNLICENSED`. For more details, add `SEE LICENSE IN ` and link to the license file. (These requirements were adapted from [npm](https://docs.npmjs.com/files/package.json#license)). +- State license owner. +- Must be last section. + +**Suggestions:** +- Link to longer License file in local repository. + +## Definitions + +_These definitions are provided to clarify any terms used above._ + +- **Documentation repositories**: Repositories without any functional code. For instance, [RichardLitt/knowledge](https://github.com/RichardLitt/knowledge). diff --git a/.agents/skills/crafting-effective-readmes/section-checklist.md b/.agents/skills/crafting-effective-readmes/section-checklist.md new file mode 100644 index 00000000..a6d08322 --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/section-checklist.md @@ -0,0 +1,17 @@ +# Section Checklist by Project Type + +Quick reference for which sections to include based on project type. + +| Section | OSS | Personal | Internal | Config | +|---------|-----|----------|----------|--------| +| Name/Description | Yes | Yes | Yes | Yes | +| Badges | Yes | Optional | No | No | +| Installation | Yes | Yes | Yes | No | +| Usage/Examples | Yes | Yes | Yes | Brief | +| What's Here | No | No | No | Yes | +| How to Extend | No | No | Optional | Yes | +| Contributing | Yes | Optional | Yes | No | +| License | Yes | Optional | No | No | +| Architecture | Optional | No | Yes | No | +| Gotchas/Notes | Optional | Optional | Yes | Yes | +| Last Reviewed | No | No | Optional | Yes | diff --git a/.agents/skills/crafting-effective-readmes/style-guide.md b/.agents/skills/crafting-effective-readmes/style-guide.md new file mode 100644 index 00000000..7df7fd71 --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/style-guide.md @@ -0,0 +1,13 @@ +# README Style Guide + +## Common Mistakes + +- **No install steps** - Never assume setup is obvious +- **No examples** - Show, don't just tell +- **Wall of text** - Use headers, tables, lists +- **Stale content** - Add "last reviewed" date +- **Generic tone** - Write for YOUR audience + +## Prose Quality + +For general writing advice — clear prose, Strunk's rules, and AI patterns to avoid — use the `writing-clearly-and-concisely` skill. diff --git a/.agents/skills/crafting-effective-readmes/templates/internal.md b/.agents/skills/crafting-effective-readmes/templates/internal.md new file mode 100644 index 00000000..449d57b2 --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/templates/internal.md @@ -0,0 +1,106 @@ +# Internal/Work Project README Template + +Use this template for team codebases, services, and internal tools. +Focus on onboarding new team members and operational knowledge. + +--- + +# [Service/Project Name] + +[One-line description of what this service does] + +**Team**: [Team name or slack channel] +**On-call**: [Rotation or contact info] + +## Overview + +[2-3 sentences on what this does, why it exists, and where it fits in the system architecture.] + +### Dependencies + +- **Upstream**: [Services this depends on] +- **Downstream**: [Services that depend on this] + +## Local Development Setup + +### Prerequisites + +- [Required tool 1 with version] +- [Required tool 2] +- Access to [internal system/VPN/etc] + +### Environment Variables + +| Variable | Description | Where to get it | +|----------|-------------|-----------------| +| `DATABASE_URL` | [Description] | [1Password/Vault/etc] | +| `API_KEY` | [Description] | [Where to find] | + +### Running Locally + +```bash +[Step-by-step commands to get running] +``` + +### Running Tests + +```bash +[Test commands] +``` + +## Architecture + +[Brief description of system design. Link to architecture diagrams if they exist.] + +``` +[Simple ASCII diagram if helpful] +``` + +### Key Files + +| Path | Purpose | +|------|---------| +| `src/[important-file]` | [What it does] | +| `config/` | [Configuration files] | + +## Deployment + +[How to deploy, or link to deployment docs] + +### Environments + +| Environment | URL | Notes | +|-------------|-----|-------| +| Development | [URL] | [Notes] | +| Staging | [URL] | [Notes] | +| Production | [URL] | [Notes] | + +## Runbooks + +### [Common Task 1] + +```bash +[Commands or steps] +``` + +### [Common Task 2] + +[Steps] + +## Troubleshooting + +### [Common Problem 1] + +**Symptom**: [What you see] +**Cause**: [Why it happens] +**Fix**: [How to resolve] + +## Contributing + +[Link to team contribution guidelines or PR process] + +## Related Docs + +- [Link to design doc] +- [Link to API docs] +- [Link to monitoring dashboard] diff --git a/.agents/skills/crafting-effective-readmes/templates/oss.md b/.agents/skills/crafting-effective-readmes/templates/oss.md new file mode 100644 index 00000000..82d850cd --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/templates/oss.md @@ -0,0 +1,77 @@ +# Open Source Project README Template + +Use this template for projects intended for public use and contribution. + +--- + +# [Project Name] + +[One-line description of what this project does] + +[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) +[![Build Status](https://img.shields.io/github/actions/workflow/status/[user]/[repo]/ci.yml)](https://github.com/[user]/[repo]/actions) +[![npm version](https://img.shields.io/npm/v/[package-name])](https://www.npmjs.com/package/[package-name]) + +## About + +[2-3 sentences explaining what problem this solves and why someone would use it. Include what makes it different from alternatives if relevant.] + +## Features + +- [Key feature 1] +- [Key feature 2] +- [Key feature 3] + +## Installation + +```bash +[package manager install command] +``` + +### Requirements + +- [Runtime requirement, e.g., Node.js >= 18] +- [Other dependencies if any] + +## Usage + +```[language] +[Minimal working example showing the most common use case] +``` + +### More Examples + +[Link to examples directory or additional code samples] + +## Documentation + +[Link to full docs if they exist separately, or expand this section] + +## Contributing + +Contributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines. + +### Development Setup + +```bash +[Commands to clone and set up for development] +``` + +### Running Tests + +```bash +[Test command] +``` + +## Roadmap + +- [ ] [Planned feature 1] +- [ ] [Planned feature 2] + +## Acknowledgments + +- [Credit to inspirations, contributors, or dependencies worth highlighting] + +## License + +[Project name] is licensed under the [License name] license. See the [`LICENSE`](LICENSE) file for more information. diff --git a/.agents/skills/crafting-effective-readmes/templates/personal.md b/.agents/skills/crafting-effective-readmes/templates/personal.md new file mode 100644 index 00000000..f569a5a1 --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/templates/personal.md @@ -0,0 +1,51 @@ +# Personal Project README Template + +Use this template for side projects, portfolio pieces, and experiments. +Balance between documenting for future-you and showcasing for others. + +--- + +# [Project Name] + +[One-line description] + +[Screenshot or demo GIF if visual] + +## What This Does + +[2-3 sentences explaining what it does and why you built it. Be specific about the problem it solves for you.] + +## Demo + +[Link to live demo, video, or screenshots] + +## Tech Stack + +- **[Category]**: [Technology] - [brief why you chose it] +- **[Category]**: [Technology] + +## Getting Started + +```bash +[Clone and run commands] +``` + +## How It Works + +[Brief explanation of the interesting parts - architecture, algorithms, or techniques worth noting. This is useful for portfolio viewers and future-you.] + +## What I Learned + +[Key takeaways from building this. Good for portfolios and personal reference.] + +- [Learning 1] +- [Learning 2] + +## Future Ideas + +- [ ] [Thing you might add] +- [ ] [Improvement you're considering] + +## License + +[License if you want one, or just "Personal project" if not sharing] diff --git a/.agents/skills/crafting-effective-readmes/templates/xdg-config.md b/.agents/skills/crafting-effective-readmes/templates/xdg-config.md new file mode 100644 index 00000000..97815d8e --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/templates/xdg-config.md @@ -0,0 +1,71 @@ +# Config Directory README Template + +Use this template for XDG config directories, dotfiles, script folders, +and any local directory you'll return to later wondering "what is this?" + +The audience is future-you, probably confused. + +--- + +# [Tool/Directory Name] Config + +> Last reviewed: [YYYY-MM-DD] + +[One sentence: what this directory configures and why you have custom config] + +## What's Here + +| Path | Purpose | +|------|---------| +| `[file-or-dir]` | [What it does] | +| `[file-or-dir]` | [What it does] | +| `[file-or-dir]` | [What it does] | + +### [Subdirectory 1] (if complex enough to warrant detail) + +[Brief explanation of what's in this subdirectory] + +### [Subdirectory 2] + +[Brief explanation] + +## Why This Setup + +[1-2 paragraphs explaining your philosophy or goals for this config. What problems were you solving? What workflow are you optimizing for?] + +## How to Extend + +### Adding a new [thing] + +1. [Step 1] +2. [Step 2] +3. [Step 3] + +### Adding a new [other thing] + +1. [Steps] + +## Dependencies + +[What needs to be installed for this config to work] + +```bash +[Install commands if applicable] +``` + +## Gotchas + +- [Thing that will confuse future-you] +- [Non-obvious behavior] +- [Files that shouldn't be edited directly] +- [Order dependencies or load sequences] + +## Sync/Backup + +[How this config is backed up or synced across machines, if applicable] + +## Related + +- [Link to tool's official docs] +- [Link to your dotfiles repo if this is part of it] +- [Other relevant resources] diff --git a/.agents/skills/crafting-effective-readmes/using-references.md b/.agents/skills/crafting-effective-readmes/using-references.md new file mode 100644 index 00000000..a25b81d7 --- /dev/null +++ b/.agents/skills/crafting-effective-readmes/using-references.md @@ -0,0 +1,35 @@ +# Using References + +Templates are your primary tool for writing READMEs. References provide depth - use them to refine your understanding or handle edge cases. + +**Tip:** Don't load all references at once. Pick the one most relevant to your situation. + +--- + +### art-of-readme.md +`references/art-of-readme.md` + +**Why:** The philosophy behind great READMEs - understanding how readers actually scan and evaluate projects +**What:** Cognitive funneling (broad → specific), brevity as a feature, README as the "one-stop shop" that keeps users out of source code + +--- + +### make-a-readme.md +`references/make-a-readme.md` + +**Why:** Practical, section-by-section guidance for what to include +**What:** Walks through each common section (Name, Description, Installation, Usage, etc.) with concrete suggestions. Good reminder: "too long is better than too short" + +--- + +### standard-readme-spec.md +`references/standard-readme-spec.md` + +**Why:** Formal specification when consistency or compliance matters +**What:** Required vs optional sections, exact ordering, formatting rules. Useful for OSS projects wanting a standardized format. + +Examples: +- `references/standard-readme-example-minimal.md` - Bare minimum compliant README +- `references/standard-readme-example-maximal.md` - Full-featured with badges, ToC, all optional sections + + diff --git a/.agents/skills/create-prd/SKILL.md b/.agents/skills/create-prd/SKILL.md new file mode 100644 index 00000000..62a51e36 --- /dev/null +++ b/.agents/skills/create-prd/SKILL.md @@ -0,0 +1,185 @@ +--- +name: create-prd +description: Creates a Product Requirements Document through interactive brainstorming with parallel codebase and web research. Use when starting a new feature or product, building a PRD, or brainstorming requirements. Do not use for technical specifications, task breakdowns, or code implementation. +argument-hint: "[feature-name-or-idea] [idea-file]" +--- + +# Create PRD + +Create a business-focused Product Requirements Document through structured brainstorming. + + +Do NOT write the PRD file until ALL phases are complete and the user has approved the final draft. +Do NOT skip the research phase — every PRD MUST be enriched with codebase and market context. +Do NOT skip user interactions — the user MUST participate in shaping the PRD at every decision point. +Do NOT require section-by-section approval — generate the complete draft, then let the user review it. +This applies to EVERY PRD regardless of perceived simplicity. + + +## Asking Questions + +When this skill instructs you to ask the user a question, you MUST use your runtime's dedicated interactive question tool — the tool or function that presents a question to the user and **pauses execution until the user responds**. Do not output questions as plain assistant text and continue generating; always use the mechanism that blocks until the user has answered. + +If your runtime does not provide such a tool, present the question as your complete message and stop generating. Do not answer your own question or proceed without user input. + +## Anti-Pattern: "This Feature Is Too Simple For Full Brainstorming" + +Every PRD goes through the full brainstorming process. A single button, a minor workflow tweak, a configuration option — all of them. "Simple" features are where unexamined business assumptions cause the most rework. The brainstorming can be brief for genuinely simple features, but you MUST ask clarifying questions and get approval on the product approach before writing the artifact. + +## Anti-Pattern: End-Of-Flow Bureaucracy + +Once the user has answered the clarifying questions and approved an approach, do not force them through a second approval loop for Overview, Goals, User Stories, or any other final document section. Synthesize the approved direction into the PRD directly. The user can review and request edits in the generated file afterward. + +## Anti-Pattern: Technical Drift On Technical-Sounding Features + +When the feature name sounds technical (e.g., "webhook notifications", "CSV export", "dark mode", "API rate limiting"), you will be tempted to discuss HOW to implement it. Resist this. Your job is the WHAT and WHY: + +- WRONG: "Should we use WebSockets or polling for notifications?" (implementation) +- WRONG: "What CSV library format should we target?" (implementation) +- RIGHT: "Which events should trigger a notification to the user?" (user need) +- RIGHT: "What information do users need in their exported reports?" (user need) + +Translate every technical-sounding feature into the user experience question behind it. + +## Required Inputs + +- Feature name or product idea. +- Optional: existing `_idea.md` file as primary input for context. +- Optional: existing `_prd.md` file for update mode. + +## Checklist + +You MUST create a task for each phase and complete them in order: + +1. **Determine project & directory** — derive slug, create `.productize/tasks//` and `adrs/` +2. **Discover context** — parallel codebase exploration and web research +3. **Understand the need** — ask 3-6 targeted questions to refine scope and intent +4. **Present product approaches** — offer 2-3 approaches with trade-offs, create ADR for the chosen one +5. **Draft the PRD** — write using the canonical template from `references/prd-template.md` +6. **Review with user** — present the draft, iterate until approved +7. **Save the file** — write to `.productize/tasks//_prd.md` + +## Workflow + +1. Determine the project name and working directory. + - Derive the slug from the feature name provided by the user. + - Use `.productize/tasks//` as the target directory. + - If `_idea.md` exists in the target directory, read it as primary context input. + - If `_prd.md` already exists in the target directory, read it and operate in update mode. + - If the directory does not exist, create it. + - Create `.productize/tasks//adrs/` directory if it does not exist. + +2. Discover context through parallel research. You MUST perform BOTH tracks before asking any questions. + + **Track A — Codebase exploration** (REQUIRED): + - Search the codebase for files, patterns, and features related to the user's request. + - Look for existing implementations, data models, and integration points that are relevant. + - Summarize what you found in 3-5 bullet points. + + **Track B — Market and user research** (REQUIRED): + - Perform 3-5 web searches for market trends, competitive products, and user needs related to the feature. + - Look for how similar products solve this problem and what users expect. + - Summarize what you found in 3-5 bullet points. + + Run both tracks in parallel (e.g., two Agent tool calls, two search batches, etc.). Present a brief merged summary of findings from BOTH tracks to the user before moving to questions. If web search tools are unavailable, note the limitation explicitly and proceed with codebase findings only. + +3. Ask clarifying questions following `references/question-protocol.md`. + - Focus exclusively on WHAT features users need, WHY it provides business value, and WHO the target users are. + - Ask about success criteria and constraints. + - Never ask technical implementation questions about databases, APIs, frameworks, or architecture. + - **ONE question per message — strictly enforced.** Your message must contain exactly one question mark. After asking the question, STOP. Do not add follow-up questions, "also" questions, or "additionally" prompts. If a topic needs more exploration, ask a follow-up in the NEXT message after the user responds. + + Anti-pattern (FORBIDDEN): + "What is the primary user persona? Also, what are the key success metrics?" + This is TWO questions. Split them into two separate messages. + + - Every question MUST be multiple-choice when reasonable options can be predetermined. Format as labeled options (A, B, C, etc.) so the user can respond with a single letter. Only use open-ended questions when the answer space is genuinely unbounded (e.g., "What problem are you trying to solve?"). + - Include a fallback option (e.g., "D) Other — describe") for flexibility. + - For complex features with many dimensions, decompose into sub-topics and ask about one dimension at a time. Each sub-topic usually has predeterminable options. Example: instead of the open-ended "What should the collaboration feature include?", ask "Which aspect of team collaboration is most important to start with? A) Shared workspaces B) Real-time presence C) Permission controls D) Activity feeds". + - Complete at least one full clarification round before presenting approaches. + +4. Present product approaches. + - Offer 2-3 product approaches with trade-offs for each. + - Lead with the recommended approach and explain why it is preferred. + - Wait for the user to select an approach before continuing. + - After the user selects an approach, create an ADR for this decision: + - Read `references/adr-template.md`. + - Determine the next ADR number by listing existing files in `.productize/tasks//adrs/`. + - Fill the template: the selected approach as "Decision", rejected approaches as "Alternatives Considered" with their trade-offs, and outcomes as "Consequences". Set Status to "Accepted" and Date to today. + - Write the ADR to `.productize/tasks//adrs/adr-NNN.md` (zero-padded 3-digit number, e.g., `adr-001.md`). + +5. Draft the PRD. + - After the user selects an approach, synthesize the final product design. Do not present each section for separate approval. + - If the user makes a significant scope decision during clarification or approach selection, create an additional ADR following the same process as step 4. + - Only pause before writing if a blocking ambiguity remains that would force guessing; otherwise proceed directly to document generation. + - Read `references/prd-template.md` and fill every section with gathered context. + - Include an "Architecture Decision Records" section listing all ADRs created during this session with their numbers, titles, and one-line summaries as links to the `adrs/` directory. + - Apply YAGNI ruthlessly: challenge every feature and remove anything the MVP does not need. + - The PRD must describe user capabilities and business outcomes only. + - No databases, APIs, code structure, frameworks, testing strategies, or architecture decisions. + - Mandatory sections (ALWAYS include): Overview, Goals, User Stories, Core Features, User Experience, Non-Goals, Phased Rollout Plan, Success Metrics, Risks and Mitigations, Architecture Decision Records, Open Questions. + - Optional sections (include when relevant): High-Level Technical Constraints. + - Prefer active voice, omit needless words, use definite and specific language over vague generalities. Every sentence should earn its place. + - Language: **English**. Tone: clear, technical, consistent with existing project artifacts. + - Present the complete draft to the user for review. + +6. Review with the user. + - Present the draft and ask using the interactive question tool: + - "Here is the PRD draft. Please review and let me know:" + - A) Approved — save as is + - B) Adjust specific sections (tell me which ones) + - C) Rewrite section X (tell me what to change) + - D) Discard and start over + - If B or C: make the changes and present again. + - If D: go back to step 3. + +7. Save the PRD file. + - Write the completed document to `.productize/tasks//_prd.md`. + - Confirm the file path to the user. + - Remind the user that the next step is to create a TechSpec using `create-techspec` from this PRD. + +## Process Flow + +```dot +digraph create_prd { + "Determine project & directory" [shape=box]; + "Discover context (codebase + web)" [shape=box]; + "Ask clarifying questions (one at a time)" [shape=box]; + "Present 2-3 product approaches" [shape=box]; + "User selects approach?" [shape=diamond]; + "Create ADR for approach decision" [shape=box]; + "Draft PRD (canonical template)" [shape=box]; + "User approves draft?" [shape=diamond]; + "Save _prd.md" [shape=doublecircle]; + + "Determine project & directory" -> "Discover context (codebase + web)"; + "Discover context (codebase + web)" -> "Ask clarifying questions (one at a time)"; + "Ask clarifying questions (one at a time)" -> "Present 2-3 product approaches"; + "Present 2-3 product approaches" -> "User selects approach?"; + "User selects approach?" -> "Present 2-3 product approaches" [label="no, revise"]; + "User selects approach?" -> "Create ADR for approach decision" [label="yes"]; + "Create ADR for approach decision" -> "Draft PRD (canonical template)"; + "Draft PRD (canonical template)" -> "User approves draft?"; + "User approves draft?" -> "Draft PRD (canonical template)" [label="no, revise"]; + "User approves draft?" -> "Save _prd.md" [label="approved"]; +} +``` + +## Error Handling + +- If the user provides insufficient context to complete a section, note it in the Open Questions section rather than guessing. +- If web research tools are unavailable, proceed with codebase exploration only and note the limitation. +- If the target directory cannot be created, stop and report the filesystem error. +- If operating in update mode, preserve sections the user has not asked to change. + +## Key Principles + +- **One question at a time** — Do not overwhelm with multiple questions in a single message +- **Multiple choice mandatory** — Every question MUST be multiple-choice (A/B/C) when options can be predetermined; open-ended only when the answer space is genuinely unbounded +- **YAGNI ruthlessly** — Challenge every feature; remove anything the MVP does not need +- **Draft then review** — Get approval on the product approach, generate the complete draft, then iterate with the user until approved +- **Business focus only** — Never ask about implementation; that belongs in TechSpec +- **Idea as input** — When `_idea.md` exists, use it as primary context to accelerate brainstorming +- **Pipeline awareness** — The PRD feeds into `create-techspec`; focus on WHAT and WHY, not HOW +- **Template compliance** — Every PRD MUST follow the canonical template +- **Language consistency** — Write all PRD content in English diff --git a/.agents/skills/create-prd/references/adr-template.md b/.agents/skills/create-prd/references/adr-template.md new file mode 100644 index 00000000..381ad3f2 --- /dev/null +++ b/.agents/skills/create-prd/references/adr-template.md @@ -0,0 +1,55 @@ +# ADR-XXX: [Title] + +## Status + +[Proposed | Accepted | Deprecated | Superseded by ADR-XXX] + +## Date + +YYYY-MM-DD + +## Context + +[Describe the issue or problem that motivates this decision. Include relevant technical context, constraints, and any forces at play.] + +## Decision + +[State the decision that was made. Be specific and clear about what will be done.] + +## Alternatives Considered + +### Alternative 1: [Name] + +- **Description**: [Brief description] +- **Pros**: [List advantages] +- **Cons**: [List disadvantages] +- **Why rejected**: [Reason] + +### Alternative 2: [Name] + +- **Description**: [Brief description] +- **Pros**: [List advantages] +- **Cons**: [List disadvantages] +- **Why rejected**: [Reason] + +## Consequences + +### Positive + +- [List positive outcomes] + +### Negative + +- [List negative outcomes or trade-offs] + +### Risks + +- [List risks and mitigation strategies] + +## Implementation Notes + +[Any specific implementation details, migration steps, or technical notes relevant to this decision.] + +## References + +- [Link to relevant documents, PRDs, tech specs, or external resources] diff --git a/.agents/skills/create-prd/references/prd-template.md b/.agents/skills/create-prd/references/prd-template.md new file mode 100644 index 00000000..e05ff46f --- /dev/null +++ b/.agents/skills/create-prd/references/prd-template.md @@ -0,0 +1,102 @@ +# PRD Template + +Use this template to structure every Product Requirements Document. Fill each section based on brainstorming outcomes. Leave placeholder guidance in sections where information is insufficient and note them in Open Questions. + +## Overview + +High-level overview of the feature or product. Describe: +- What problem it solves +- Who it is for +- Why it is valuable + +## Goals + +Specific, measurable objectives for this feature or product: +- Success metrics and key performance indicators +- Business objectives and expected outcomes +- Target timelines or milestones + +## User Stories + +User stories organized by persona: +- As a [type of user], I want [action] so that [benefit] +- Primary personas and their main flows +- Secondary personas and edge cases + +## Core Features + +Main features grouped by priority: +- Feature name: what it does, why it is important, high-level behavior +- Functional requirements for each feature +- Interaction between features + +## User Experience + +User journey from first contact to regular use: +- Key personas and their goals +- Primary user flows step by step +- UI/UX considerations and accessibility requirements +- Onboarding and discoverability + +## High-Level Technical Constraints + +Required boundaries that shape the product without prescribing implementation: +- Required integrations with existing systems +- Compliance mandates or regulatory requirements +- Performance targets from a user perspective +- Data privacy and security requirements + +Do NOT include implementation details such as specific databases, frameworks, API designs, or architecture patterns. + +## Non-Goals (Out of Scope) + +Explicitly excluded features and boundaries: +- Features intentionally deferred to future phases +- Adjacent problems that will not be addressed +- Boundaries of this effort + +## Phased Rollout Plan + +Incremental delivery plan with success criteria per phase: + +### MVP (Phase 1) +- Core features included +- Success criteria to proceed to Phase 2 + +### Phase 2 +- Additional features +- Success criteria to proceed to Phase 3 + +### Phase 3 +- Full feature set +- Long-term success criteria + +## Success Metrics + +Quantifiable measures of success: +- User engagement metrics +- Performance benchmarks from a user perspective +- Business impact indicators +- Quality attributes + +## Risks and Mitigations + +Non-technical risks that could affect the product: +- Adoption risks and mitigation strategies +- Competitive risks +- Timeline and resource constraints +- Dependency risks on external factors + +Do NOT include technical risks such as architectural complexity or technical debt. + +## Architecture Decision Records + +ADRs documenting key decisions made during brainstorming: +- [ADR-NNN: Title](adrs/adr-NNN.md) — One-line summary of the decision + +## Open Questions + +Remaining items that need clarification: +- Unclear requirements +- Edge cases requiring stakeholder input +- Dependencies on decisions not yet made diff --git a/.agents/skills/create-prd/references/question-protocol.md b/.agents/skills/create-prd/references/question-protocol.md new file mode 100644 index 00000000..647aa007 --- /dev/null +++ b/.agents/skills/create-prd/references/question-protocol.md @@ -0,0 +1,83 @@ +# Question Protocol + +Structured brainstorming protocol for PRD creation. Follow these phases and rules to guide the conversation from idea to document. + +## Phases + +### 1. Discovery + +Gather initial context about the idea or problem space. +- What is the core problem or opportunity? +- Who are the affected users? +- What prompted this initiative? + +### 2. Understanding + +Deepen knowledge of requirements and constraints. +- WHAT specific features do users need? +- WHY does this provide business value? +- WHO are the target users and what are their current workflows? +- What are the success criteria? +- What are the known constraints (timeline, budget, compliance)? + +### 3. Options + +Present product approaches for the user to evaluate. +- Offer 2-3 distinct approaches with clear trade-offs. +- Lead with the recommended approach and explain why. +- Each approach should differ meaningfully in scope, phasing, or strategy. +- Wait for the user to select before proceeding. + +### 4. Refinement + +Refine the selected approach with targeted follow-ups. +- Clarify scope boundaries for the chosen approach. +- Confirm phasing and priority of features. +- Validate success criteria and metrics. +- Resolve any remaining open questions. + +### 4b. Incremental Design Validation + +Present the product design section by section for user approval. +- Scale each section to its complexity: brief for straightforward topics, detailed for nuanced ones. +- Present one section at a time; ask whether it looks right before moving on. +- Apply YAGNI: challenge every feature against MVP necessity. +- Be ready to revise any section before proceeding to the next. + +### 5. Creation + +Generate the PRD document using the gathered context. +- Read and fill the PRD template. +- Every section should reflect confirmed decisions. +- Unresolved items go into Open Questions. + +## Rules + +### Interactive Question Enforcement +- Every question MUST be asked using the runtime's dedicated interactive question tool — the one that presents the question and pauses execution until the user responds. +- Do not output questions as plain text and continue generating. +- If no such tool is available, present the question as your complete message and stop generating. + +### Question Limits +- Ask only one question per message. If a topic needs deeper exploration, break it into a sequence of individual questions. +- Prefer multiple-choice questions when the options can be predetermined. +- Wait for the user's answer before asking the next question. + +### Progression Gates +- Must complete at least one full Understanding round before presenting Options. +- Must have clarity on purpose, constraints, and success criteria before presenting approaches. +- Must have user approval of an approach before entering Refinement. + +### Focus Boundaries +- Questions must focus on WHAT, WHY, and WHO. +- Never ask HOW, WHERE, or WHICH regarding technical implementation. +- Forbidden topics: databases, APIs, code structure, frameworks, testing strategies, architecture patterns, deployment infrastructure. + +### YAGNI Principle +- Ruthlessly remove non-essential features during refinement. +- Challenge every feature: does the MVP need this? +- Defer nice-to-have features to later phases. +- Prefer smaller, well-defined scope over ambitious breadth. + +### Anti-Pattern: Skipping Brainstorming For "Simple" Features +Every PRD goes through the full question protocol regardless of perceived simplicity. Simple features are where unexamined business assumptions cause the most rework. The brainstorming can be brief, but it must happen. diff --git a/.agents/skills/create-tasks/SKILL.md b/.agents/skills/create-tasks/SKILL.md new file mode 100644 index 00000000..bc80acfb --- /dev/null +++ b/.agents/skills/create-tasks/SKILL.md @@ -0,0 +1,111 @@ +--- +name: create-tasks +description: Decomposes PRDs and TechSpecs into detailed, independently implementable task files with enrichment from codebase exploration. Use when a PRD or TechSpec exists and needs to be broken down into executable tasks, or when task files need enrichment with implementation context. Do not use for PRD creation, TechSpec generation, or direct task execution. +argument-hint: "[feature-name] [prd-file]" +--- + +# Create Tasks + +Decompose requirements into detailed, actionable task files with codebase-informed enrichment. + +## Required Inputs + +- Feature name identifying the `.productize/tasks//` directory. +- At minimum, `_prd.md` or `_techspec.md` in that directory. + +## Workflow + +1. Load type registry. + - Read `.productize/config.toml`. + - If it contains `[tasks].types`, use that list as the allowed `type` values. + - Otherwise use the built-in defaults: `frontend`, `backend`, `docs`, `test`, `infra`, `refactor`, `chore`, `bugfix`. + +2. Load context. + - Read `_prd.md` and `_techspec.md` from `.productize/tasks//`. + - Read existing ADRs from `.productize/tasks//adrs/` to understand the decision context behind requirements and design choices. + - If `_techspec.md` is missing: + - Warn the user that tasks will be higher-level without TechSpec implementation guidance. + - Derive tasks from PRD functional requirements and user stories instead of TechSpec implementation sections. + - During enrichment, rely more heavily on codebase exploration to fill `## Implementation Details`, `### Relevant Files`, and `### Dependent Files`. + - Mark `` with PRD-derived behavioral requirements instead of TechSpec-derived technical requirements. + - Explicitly call out missing implementation detail gaps in the task body instead of inventing specifics. + - If both `_prd.md` and `_techspec.md` are missing, stop and ask the user to create at least one first. + - Spawn an Agent tool call to explore the codebase for files to create or modify, test patterns, and coding conventions. + +3. Break down into tasks. + - Decompose implementation sections from the TechSpec into granular, independently implementable tasks. + - **Each task MUST be independently implementable when all of its declared dependencies are met.** No task may require undeclared work from another task. If two tasks share a tight coupling, either merge them or extract the shared piece into a dependency task. + - **No circular dependencies.** If task A depends on task B, task B must NOT depend on task A (directly or transitively). + - Each task must have: title, type, complexity, and dependencies. + - Assign complexity using these criteria: + - `low`: Single file change, no new interfaces, no concurrency, straightforward logic. + - `medium`: 2-4 files, may introduce a new interface or struct, limited integration points. + - `high`: 5+ files, new subsystem or significant refactor, multiple integration points, concurrency involved. + - `critical`: Cross-cutting change affecting many packages, high risk of regression, requires coordination with other tasks. + - When a task directly implements or is constrained by a specific ADR, include the ADR reference in the task's "Related ADRs" section under Implementation Details. + - Embed test requirements in every task. Never create separate tasks dedicated solely to testing. + - Follow the structure defined in `references/task-template.md`. + - Refer to `references/task-context-schema.md` for metadata field definitions. + +4. Present task breakdown for interactive approval. + - Show all tasks with: titles, descriptions, complexity ratings, and dependency chains. + - Wait for user feedback before proceeding. + - If the user requests changes, revise the breakdown and present again. + - Iterate until the user explicitly approves. + +5. Generate task files. + - Write `_tasks.md` as the master task list using this exact markdown table format: + ```markdown + # [Feature Name] — Task List + + ## Tasks + + | # | Title | Status | Complexity | Dependencies | + |---|-------|--------|------------|--------------| + | 01 | [Task title] | pending | [low/medium/high/critical] | [task_NN, ... or —] | + ``` + - Write individual task files as `task_01.md`, `task_02.md`, through `task_N.md`. + - Task files use the `task_` prefix without a leading underscore. + - Each file must start with YAML frontmatter containing `status`, `title`, `type`, `complexity`, and `dependencies`. Use `dependencies: []` when there are no dependencies — do not omit the field. + - Task numbering must be sequential and consistent between `_tasks.md` and individual files. + +6. Enrich each task file. + - For each task file, check whether it already has `## Overview`, `## Deliverables`, and `## Tests` sections. If all three exist, skip enrichment for that file. + - Map the task to PRD requirements and TechSpec guidance. + - Spawn an Agent tool call to discover relevant files, dependent files, integration points, and project rules for this specific task. + - Fill ALL template sections from `references/task-template.md`. Every task file MUST contain each of the following sections — omitting any is a failure: + - `## Overview`: what the task accomplishes and why, in 2-3 sentences. + - `` block: the standard critical reminders block (read PRD/TechSpec, reference TechSpec, focus on WHAT, minimize code, tests required). + - `` block: specific, numbered technical requirements using MUST/SHOULD language. + - `## Subtasks`: 3-7 checklist items describing WHAT, not HOW. + - `## Implementation Details`: file paths to create or modify, integration points. Reference TechSpec for patterns. + - `### Relevant Files`: discovered paths from codebase exploration with brief reasons. + - `### Dependent Files`: files that will be affected by this task with brief reasons. + - `### Related ADRs`: links to relevant ADRs if any exist, or omit subsection if no ADRs apply. + - `## Deliverables`: concrete outputs with mandatory test items and at least 80% coverage target. + - `## Tests`: specific test cases as checklists, split into unit tests and integration tests categories. + - `## Success Criteria`: measurable outcomes including "All tests passing" and "Test coverage >=80%". + - Reassess complexity based on exploration findings and update if changed. + - Update the task file in place with enriched content. + - If enrichment fails for one task, continue to the next and report all failures at the end. + +7. Run task validation. + - Run `productize tasks validate --name `. + - If it exits non-zero, fix the reported issues and re-run. + - Do not mark the skill complete until it exits 0. + +## Anti-Patterns + +Do NOT produce tasks with these defects: + +- **Mega-tasks.** If a task touches more than 7 files or has more than 7 subtasks, it is too broad. Split it into smaller tasks with explicit dependencies between them. +- **TechSpec duplication.** Do NOT copy interface definitions, code snippets, or architectural diagrams from the TechSpec into task files. Reference the TechSpec section by name (e.g., "See TechSpec 'Core Interfaces' section") instead of reproducing its content. +- **Vague test cases.** Do NOT write test descriptions like "test the happy path" or "verify error handling." Each test case must name the specific input, condition, or behavior being verified (e.g., "POST /job/done with unknown job ID returns 404"). + +## Error Handling + +- If both `_prd.md` and `_techspec.md` are missing, stop and ask the user to create at least one first. +- If the user rejects the task breakdown, incorporate all feedback before presenting again. +- If codebase exploration reveals task boundaries that do not match the TechSpec, note the discrepancy and ask the user how to proceed. +- If the target directory does not exist, create it. +- If a task file already exists and is fully enriched, skip it and move to the next. diff --git a/.agents/skills/create-tasks/references/task-context-schema.md b/.agents/skills/create-tasks/references/task-context-schema.md new file mode 100644 index 00000000..531fbdd0 --- /dev/null +++ b/.agents/skills/create-tasks/references/task-context-schema.md @@ -0,0 +1,35 @@ +# Task Frontmatter Schema + +Task metadata is parsed from YAML frontmatter by Productize's `ParseTaskFile()` function in `internal/core/prompt/common.go`. + +## Required Fields + +- `status`: Task lifecycle state. +- `title`: Human-readable task title. It must match the first H1 in the task body. +- `type`: Allowed work type slug. Use `[tasks].types` from `.productize/config.toml` when configured; otherwise use the built-in defaults `frontend`, `backend`, `docs`, `test`, `infra`, `refactor`, `chore`, `bugfix`. +- `complexity`: Difficulty rating. Must be one of: `low`, `medium`, `high`, `critical`. +- `dependencies`: YAML list of task file names that must be completed before this task. Use `[]` when there are no dependencies. + +## Status Values + +Valid `status` values: + +- `pending` — task has not been started. +- `in_progress` — task is currently being worked on. +- `completed` — task is finished and verified. +- `done` — treated as completed. +- `finished` — treated as completed. + +## File Naming + +Task files must match the pattern `task_\d+\.md` with zero-padded numbers: +- `task_01.md`, `task_02.md`, `task_10.md`, `task_99.md` + +The leading underscore prefix is reserved for meta documents: +- `_prd.md` — Product Requirements Document +- `_techspec.md` — Technical Specification +- `_tasks.md` — Master task list + +## Parser Compatibility + +Productize reads task files matching the regex `^task_\d+\.md$`. Files with the old `_task_` prefix are not recognized. The file MUST start with YAML frontmatter for `ParseTaskFile()` to read the metadata. diff --git a/.agents/skills/create-tasks/references/task-template.md b/.agents/skills/create-tasks/references/task-template.md new file mode 100644 index 00000000..a6c1b94c --- /dev/null +++ b/.agents/skills/create-tasks/references/task-template.md @@ -0,0 +1,83 @@ +# Task File Template + +Use this structure for every individual task file. The file must start with YAML frontmatter containing the parseable metadata. + +```markdown +--- +status: pending +title: [Task title] +type: [one of frontend, backend, docs, test, infra, refactor, chore, bugfix, or a project-specific [tasks].types override] +complexity: [low, medium, high, critical] +dependencies: + - task_01 + - task_02 +--- + +# Task N: [Title] + +## Overview +[2-3 sentences: what the task accomplishes and why it matters in the context of the project.] + + +- ALWAYS READ the PRD and TechSpec before starting +- REFERENCE TECHSPEC for implementation details — do not duplicate here +- FOCUS ON "WHAT" — describe what needs to be accomplished, not how +- MINIMIZE CODE — show code only to illustrate current structure or problem areas +- TESTS REQUIRED — every task MUST include tests in deliverables + + + +- [Requirement 1 — specific technical requirement] +- [Requirement 2 — e.g., "MUST authenticate users via JWT tokens"] +- [Requirement 3] + + +## Subtasks +- [ ] N.1 [Subtask description — WHAT to accomplish] +- [ ] N.2 [Subtask description] +- [ ] N.3 [Subtask description] + +## Implementation Details +[File paths to create or modify, integration points, and dependencies. +Reference the TechSpec implementation section for code patterns and interface designs.] + +### Relevant Files +- `path/to/file` — [brief reason this file is relevant] + +### Dependent Files +- `path/to/dependency` — [brief reason this file is affected] + +### Related ADRs +- [ADR-NNN: Title](../adrs/adr-NNN.md) — Relevance to this task + +## Deliverables +- [Concrete output 1] +- [Concrete output 2] +- Unit tests with 80%+ coverage **(REQUIRED)** +- Integration tests for [feature] **(REQUIRED)** + +## Tests +- Unit tests: + - [ ] [Test case 1 — e.g., "Happy path: valid input returns expected output"] + - [ ] [Test case 2 — e.g., "Error path: invalid input returns descriptive error"] + - [ ] [Edge cases and boundary conditions] +- Integration tests: + - [ ] [Test case — e.g., "End-to-end flow from request to response"] +- Test coverage target: >=80% +- All tests must pass + +## Success Criteria +- All tests passing +- Test coverage >=80% +- [Measurable outcome 1] +- [Measurable outcome 2] +``` + +## Guidelines + +- Every task must be independently implementable when its dependencies are met. +- Every task MUST include a Tests section and test items in Deliverables. +- Never create separate tasks dedicated solely to testing. +- Subtasks describe WHAT needs to happen, not HOW to implement it. +- Minimize code in tasks. Show code only to illustrate current structure or problem areas. +- Implementation details should reference the TechSpec for patterns rather than duplicating them. diff --git a/.agents/skills/create-techspec/SKILL.md b/.agents/skills/create-techspec/SKILL.md new file mode 100644 index 00000000..1c1fe929 --- /dev/null +++ b/.agents/skills/create-techspec/SKILL.md @@ -0,0 +1,143 @@ +--- +name: create-techspec +description: Creates a Technical Specification by translating PRD business requirements into implementation designs through interactive technical clarification. Use when a PRD exists and needs a technical plan, or when technical architecture decisions need documentation. Do not use for PRD creation, task breakdown, or direct code implementation. +argument-hint: "[feature-name] [prd-file]" +--- + +# Create TechSpec + +Translate business requirements into a detailed technical specification. + + +Do NOT write the TechSpec file until ALL phases are complete and the user has approved the final draft. +Do NOT skip the codebase exploration — every TechSpec MUST be informed by existing architecture. +Do NOT skip user interactions — the user MUST participate in shaping the TechSpec at every decision point. +Do NOT require section-by-section approval — generate the complete draft, then let the user review it. +This applies to EVERY TechSpec regardless of perceived simplicity. + + +## Asking Questions + +When this skill instructs you to ask the user a question, you MUST use your runtime's dedicated interactive question tool — the tool or function that presents a question to the user and **pauses execution until the user responds**. Do not output questions as plain assistant text and continue generating; always use the mechanism that blocks until the user has answered. + +If your runtime does not provide such a tool, present the question as your complete message and stop generating. Do not answer your own question or proceed without user input. + +## Anti-Pattern: "This Is Too Simple To Need Technical Design Review" + +Every TechSpec goes through the full design review process. A single endpoint, a minor refactor, a configuration change — all of them. "Simple" technical changes are where unexamined assumptions about existing architecture cause the most integration failures. The design review can be brief for genuinely simple changes, but you MUST ask technical clarification questions and get approval on the technical approach before writing the artifact. + +## Anti-Pattern: End-Of-Flow Bureaucracy + +Once the user has answered the technical clarification questions and approved an approach, do not force them through a second approval loop for System Architecture, Data Models, API Design, or other final document sections. Synthesize the approved direction into the TechSpec directly. The user can review and request edits in the generated file afterward. + +## Required Inputs + +- Feature name identifying the `.productize/tasks//` directory. +- Optional: existing `_prd.md` as primary input. +- Optional: existing `_techspec.md` for update mode. + +## Checklist + +You MUST create a task for each phase and complete them in order: + +1. **Gather context** — read PRD, ADRs, and explore codebase architecture +2. **Ask technical questions** — 3-6 targeted questions on architecture, data models, APIs, testing +3. **Create ADRs** — record significant technical decisions (architecture pattern, technology choices, data model approach) +4. **Draft the TechSpec** — write using the canonical template from `references/techspec-template.md` +5. **Review with user** — present the draft, iterate until approved +6. **Save the file** — write to `.productize/tasks//_techspec.md` + +## Workflow + +1. Gather context. + - Check for `_prd.md` in `.productize/tasks//`. If it exists, read it as the primary input. + - If no PRD exists, ask the user for a description of what needs technical specification. + - Read existing ADRs from `.productize/tasks//adrs/` to understand decisions already made during PRD creation. + - Create `.productize/tasks//adrs/` directory if it does not exist. + - Spawn an Agent tool call to explore the codebase for architecture patterns, existing components, dependencies, and technology stack. + - If `_techspec.md` already exists, read it and operate in update mode. + +2. Ask technical clarification questions. + - Focus on HOW to implement, WHERE components live, and WHICH technologies to use. + - Cover architecture approach and component boundaries. + - Cover data models and storage choices. + - Cover API design and integration points. + - Cover testing strategy and performance requirements. + - Ask only one question per message. If a topic needs more exploration, break it into a sequence of individual questions. + - Prefer multiple-choice questions when the options can be predetermined. + - Include a fallback option (e.g., "D) Other — describe") for flexibility. + +3. Create ADRs for significant technical decisions. + - For each significant decision (architecture pattern chosen, technology selected, data model approach, etc.): + - Read `references/adr-template.md`. + - Determine the next ADR number by listing existing files in `.productize/tasks//adrs/`. + - Fill the template: the chosen design as "Decision", rejected alternatives as "Alternatives Considered", and trade-offs as "Consequences". Set Status to "Accepted" and Date to today. + - Write each ADR to `.productize/tasks//adrs/adr-NNN.md` (zero-padded 3-digit sequential number). + +4. Draft the TechSpec. + - Read `references/techspec-template.md` and fill every applicable section. + - **MANDATORY — Architecture Decision Records section:** The generated TechSpec MUST end with an "Architecture Decision Records" section listing every ADR created during this process. Each entry must include the ADR number (e.g., ADR-001), title, and a one-line summary formatted as a link to the `adrs/` directory. Even simple features require at least one ADR documenting the primary technical approach chosen and alternatives rejected. If no ADRs were created in step 3, go back and create at least one before generating the document. + - Apply YAGNI ruthlessly: remove any component, interface, or abstraction that is not strictly necessary. Do NOT propose new packages or directories when the feature can be implemented by adding a single file to an existing package. + - Every PRD goal and user story should map to a technical component. + - Reference PRD sections by name but do not duplicate business context. + - Include code examples only for core interfaces, limited to 20 lines each. The Core Interfaces section must contain at least one Go interface or struct definition as a code block, even for simple features — show the primary type that other components will depend on. + - The Development Sequencing section MUST include a numbered Build Order where every step after the first explicitly states which previous steps it depends on. + - Prefer active voice, omit needless words, use definite and specific language over vague generalities. Every sentence should earn its place. + - Language: **English**. Tone: clear, technical, consistent with existing project artifacts. + - Present the complete draft to the user for review. + +5. Review with the user. + - Present the draft and ask using the interactive question tool: + - "Here is the TechSpec draft. Please review and let me know:" + - A) Approved — save as is + - B) Adjust specific sections (tell me which ones) + - C) Rewrite section X (tell me what to change) + - D) Discard and start over + - If B or C: make the changes and present again. + - If D: go back to step 2. + +6. Save the TechSpec file. + - Write the completed document to `.productize/tasks//_techspec.md`. + - Confirm the file path to the user. + - Remind the user that the next step is to create tasks using `create-tasks` from this TechSpec. + +## Process Flow + +```dot +digraph create_techspec { + "Gather context (PRD + codebase)" [shape=box]; + "Ask technical questions (one at a time)" [shape=box]; + "Create ADRs for key decisions" [shape=box]; + "Draft TechSpec (canonical template)" [shape=box]; + "User approves draft?" [shape=diamond]; + "Save _techspec.md" [shape=doublecircle]; + + "Gather context (PRD + codebase)" -> "Ask technical questions (one at a time)"; + "Ask technical questions (one at a time)" -> "Create ADRs for key decisions"; + "Create ADRs for key decisions" -> "Draft TechSpec (canonical template)"; + "Draft TechSpec (canonical template)" -> "User approves draft?"; + "User approves draft?" -> "Draft TechSpec (canonical template)" [label="no, revise"]; + "User approves draft?" -> "Save _techspec.md" [label="approved"]; +} +``` + +## Error Handling + +- If the PRD is missing, proceed with user-provided context and note the absence in the Executive Summary. +- If codebase exploration reveals conflicting architectural patterns, document both and recommend one with rationale. +- If the user rejects the design proposal, incorporate all feedback and present a revised proposal. +- If the target directory does not exist, create it. +- If operating in update mode, preserve sections the user has not asked to change. + +## Key Principles + +- **One question at a time** — Do not overwhelm with multiple questions in a single message +- **Multiple choice preferred** — Easier for users to answer than open-ended when possible +- **YAGNI ruthlessly** — Remove unnecessary components, abstractions, and interfaces from all designs +- **Draft then review** — Generate the complete TechSpec draft first, then iterate with the user until approved +- **Technical focus only** — Never ask business questions; that belongs in the PRD +- **Trade-offs are mandatory** — Every Executive Summary must state the primary technical trade-off of the chosen approach +- **PRD as input** — When `_prd.md` exists, use it as primary context; every PRD goal should map to a technical component +- **Pipeline awareness** — The TechSpec feeds into `create-tasks`; focus on HOW, not WHAT or WHY +- **Template compliance** — Every TechSpec MUST follow the canonical template +- **Language consistency** — Write all TechSpec content in English diff --git a/.agents/skills/create-techspec/references/adr-template.md b/.agents/skills/create-techspec/references/adr-template.md new file mode 100644 index 00000000..381ad3f2 --- /dev/null +++ b/.agents/skills/create-techspec/references/adr-template.md @@ -0,0 +1,55 @@ +# ADR-XXX: [Title] + +## Status + +[Proposed | Accepted | Deprecated | Superseded by ADR-XXX] + +## Date + +YYYY-MM-DD + +## Context + +[Describe the issue or problem that motivates this decision. Include relevant technical context, constraints, and any forces at play.] + +## Decision + +[State the decision that was made. Be specific and clear about what will be done.] + +## Alternatives Considered + +### Alternative 1: [Name] + +- **Description**: [Brief description] +- **Pros**: [List advantages] +- **Cons**: [List disadvantages] +- **Why rejected**: [Reason] + +### Alternative 2: [Name] + +- **Description**: [Brief description] +- **Pros**: [List advantages] +- **Cons**: [List disadvantages] +- **Why rejected**: [Reason] + +## Consequences + +### Positive + +- [List positive outcomes] + +### Negative + +- [List negative outcomes or trade-offs] + +### Risks + +- [List risks and mitigation strategies] + +## Implementation Notes + +[Any specific implementation details, migration steps, or technical notes relevant to this decision.] + +## References + +- [Link to relevant documents, PRDs, tech specs, or external resources] diff --git a/.agents/skills/create-techspec/references/techspec-template.md b/.agents/skills/create-techspec/references/techspec-template.md new file mode 100644 index 00000000..9dfd0b00 --- /dev/null +++ b/.agents/skills/create-techspec/references/techspec-template.md @@ -0,0 +1,116 @@ +# TechSpec Template + +Use this template to structure every Technical Specification. Fill each section based on technical clarification outcomes and codebase exploration. Omit sections that do not apply and note the reason. + +## Executive Summary + +Brief technical overview in 1-2 paragraphs: +- Key architectural decisions +- Implementation strategy and approach +- Primary technical trade-offs + +## System Architecture + +### Component Overview + +Main components, their responsibilities, and relationships: +- Component name, purpose, and boundaries +- Data flow between components +- External system interactions + +## Implementation Design + +### Core Interfaces + +Key service interfaces with code examples. Limit each example to 20 lines or fewer: +- Interface definitions and contracts +- Method signatures with parameter and return types +- Error handling conventions + +### Data Models + +Core domain entities and their relationships: +- Entity definitions with field types +- Request and response types for APIs +- Database schemas or storage structures + +### API Endpoints + +API surface organized by resource: +- Method, path, and description +- Request format and required fields +- Response format and status codes + +## Integration Points + +External services and system boundaries. Include only when the design integrates with systems outside the codebase: +- Service name and purpose of integration +- Authentication and authorization approach +- Error handling and retry strategy + +## Impact Analysis + +Table of components affected by this implementation: + +| Component | Impact Type | Description and Risk | Required Action | +|-----------|-------------|---------------------|-----------------| +| [component] | [new/modified/deprecated] | [what changes and risk level] | [action needed] | + +## Testing Approach + +### Unit Tests + +- Strategy and key components to test +- Mock requirements and boundaries +- Critical scenarios and edge cases + +### Integration Tests + +- Components to test together +- Test data requirements and setup +- Environment dependencies + +## Development Sequencing + +### Build Order + +Ordered implementation sequence respecting dependencies: +1. [First component] - no dependencies +2. [Second component] - depends on step 1 +3. [Continue with dependency chain] + +### Technical Dependencies + +Blocking dependencies that must be resolved before implementation: +- Infrastructure requirements +- External service availability +- Team deliverables or shared components + +## Monitoring and Observability + +Operational visibility for the implementation: +- Key metrics to track +- Log events and structured fields +- Alerting thresholds and escalation + +## Technical Considerations + +### Key Decisions + +Significant technical choices with rationale: +- Decision: what was chosen +- Rationale: why this option +- Trade-offs: what was given up +- Alternatives rejected: what else was considered and why not + +### Known Risks + +Technical challenges and mitigation strategies: +- Risk description and likelihood +- Mitigation approach +- Areas requiring further research or prototyping + +## Architecture Decision Records + +ADRs documenting key decisions made during PRD brainstorming and technical design: +- [ADR-NNN: Title](adrs/adr-NNN.md) — One-line summary of the decision diff --git a/.agents/skills/design-taste-frontend/SKILL.md b/.agents/skills/design-taste-frontend/SKILL.md new file mode 100644 index 00000000..ccc3a2f8 --- /dev/null +++ b/.agents/skills/design-taste-frontend/SKILL.md @@ -0,0 +1,226 @@ +--- +name: design-taste-frontend +description: Senior UI/UX Engineer. Architect digital interfaces overriding default LLM biases. Enforces metric-based rules, strict component architecture, CSS hardware acceleration, and balanced design engineering. +--- + +# High-Agency Frontend Skill + +## 1. ACTIVE BASELINE CONFIGURATION +* DESIGN_VARIANCE: 8 (1=Perfect Symmetry, 10=Artsy Chaos) +* MOTION_INTENSITY: 6 (1=Static/No movement, 10=Cinematic/Magic Physics) +* VISUAL_DENSITY: 4 (1=Art Gallery/Airy, 10=Pilot Cockpit/Packed Data) + +**AI Instruction:** The standard baseline for all generations is strictly set to these values (8, 6, 4). Do not ask the user to edit this file. Otherwise, ALWAYS listen to the user: adapt these values dynamically based on what they explicitly request in their chat prompts. Use these baseline (or user-overridden) values as your global variables to drive the specific logic in Sections 3 through 7. + +## 2. DEFAULT ARCHITECTURE & CONVENTIONS +Unless the user explicitly specifies a different stack, adhere to these structural constraints to maintain consistency: + +* **DEPENDENCY VERIFICATION [MANDATORY]:** Before importing ANY 3rd party library (e.g. `framer-motion`, `lucide-react`, `zustand`), you MUST check `package.json`. If the package is missing, you MUST output the installation command (e.g. `npm install package-name`) before providing the code. **Never** assume a library exists. +* **Framework & Interactivity:** React or Next.js. Default to Server Components (`RSC`). + * **RSC SAFETY:** Global state works ONLY in Client Components. In Next.js, wrap providers in a `"use client"` component. + * **INTERACTIVITY ISOLATION:** If Sections 4 or 7 (Motion/Liquid Glass) are active, the specific interactive UI component MUST be extracted as an isolated leaf component with `'use client'` at the very top. Server Components must exclusively render static layouts. +* **State Management:** Use local `useState`/`useReducer` for isolated UI. Use global state strictly for deep prop-drilling avoidance. +* **Styling Policy:** Use Tailwind CSS (v3/v4) for 90% of styling. + * **TAILWIND VERSION LOCK:** Check `package.json` first. Do not use v4 syntax in v3 projects. + * **T4 CONFIG GUARD:** For v4, do NOT use `tailwindcss` plugin in `postcss.config.js`. Use `@tailwindcss/postcss` or the Vite plugin. +* **ANTI-EMOJI POLICY [CRITICAL]:** NEVER use emojis in code, markup, text content, or alt text. Replace symbols with high-quality icons (Radix, Phosphor) or clean SVG primitives. Emojis are BANNED. +* **Responsiveness & Spacing:** + * Standardize breakpoints (`sm`, `md`, `lg`, `xl`). + * Contain page layouts using `max-w-[1400px] mx-auto` or `max-w-7xl`. + * **Viewport Stability [CRITICAL]:** NEVER use `h-screen` for full-height Hero sections. ALWAYS use `min-h-[100dvh]` to prevent catastrophic layout jumping on mobile browsers (iOS Safari). + * **Grid over Flex-Math:** NEVER use complex flexbox percentage math (`w-[calc(33%-1rem)]`). ALWAYS use CSS Grid (`grid grid-cols-1 md:grid-cols-3 gap-6`) for reliable structures. +* **Icons:** You MUST use exactly `@phosphor-icons/react` or `@radix-ui/react-icons` as the import paths (check installed version). Standardize `strokeWidth` globally (e.g., exclusively use `1.5` or `2.0`). + + +## 3. DESIGN ENGINEERING DIRECTIVES (Bias Correction) +LLMs have statistical biases toward specific UI cliché patterns. Proactively construct premium interfaces using these engineered rules: + +**Rule 1: Deterministic Typography** +* **Display/Headlines:** Default to `text-4xl md:text-6xl tracking-tighter leading-none`. + * **ANTI-SLOP:** Discourage `Inter` for "Premium" or "Creative" vibes. Force unique character using `Geist`, `Outfit`, `Cabinet Grotesk`, or `Satoshi`. + * **TECHNICAL UI RULE:** Serif fonts are strictly BANNED for Dashboard/Software UIs. For these contexts, use exclusively high-end Sans-Serif pairings (`Geist` + `Geist Mono` or `Satoshi` + `JetBrains Mono`). +* **Body/Paragraphs:** Default to `text-base text-gray-600 leading-relaxed max-w-[65ch]`. + +**Rule 2: Color Calibration** +* **Constraint:** Max 1 Accent Color. Saturation < 80%. +* **THE LILA BAN:** The "AI Purple/Blue" aesthetic is strictly BANNED. No purple button glows, no neon gradients. Use absolute neutral bases (Zinc/Slate) with high-contrast, singular accents (e.g. Emerald, Electric Blue, or Deep Rose). +* **COLOR CONSISTENCY:** Stick to one palette for the entire output. Do not fluctuate between warm and cool grays within the same project. + +**Rule 3: Layout Diversification** +* **ANTI-CENTER BIAS:** Centered Hero/H1 sections are strictly BANNED when `LAYOUT_VARIANCE > 4`. Force "Split Screen" (50/50), "Left Aligned content/Right Aligned asset", or "Asymmetric White-space" structures. + +**Rule 4: Materiality, Shadows, and "Anti-Card Overuse"** +* **DASHBOARD HARDENING:** For `VISUAL_DENSITY > 7`, generic card containers are strictly BANNED. Use logic-grouping via `border-t`, `divide-y`, or purely negative space. Data metrics should breathe without being boxed in unless elevation (z-index) is functionally required. +* **Execution:** Use cards ONLY when elevation communicates hierarchy. When a shadow is used, tint it to the background hue. + +**Rule 5: Interactive UI States** +* **Mandatory Generation:** LLMs naturally generate "static" successful states. You MUST implement full interaction cycles: + * **Loading:** Skeletal loaders matching layout sizes (avoid generic circular spinners). + * **Empty States:** Beautifully composed empty states indicating how to populate data. + * **Error States:** Clear, inline error reporting (e.g., forms). + * **Tactile Feedback:** On `:active`, use `-translate-y-[1px]` or `scale-[0.98]` to simulate a physical push indicating success/action. + +**Rule 6: Data & Form Patterns** +* **Forms:** Label MUST sit above input. Helper text is optional but should exist in markup. Error text below input. Use a standard `gap-2` for input blocks. + +## 4. CREATIVE PROACTIVITY (Anti-Slop Implementation) +To actively combat generic AI designs, systematically implement these high-end coding concepts as your baseline: +* **"Liquid Glass" Refraction:** When glassmorphism is needed, go beyond `backdrop-blur`. Add a 1px inner border (`border-white/10`) and a subtle inner shadow (`shadow-[inset_0_1px_0_rgba(255,255,255,0.1)]`) to simulate physical edge refraction. +* **Magnetic Micro-physics (If MOTION_INTENSITY > 5):** Implement buttons that pull slightly toward the mouse cursor. **CRITICAL:** NEVER use React `useState` for magnetic hover or continuous animations. Use EXCLUSIVELY Framer Motion's `useMotionValue` and `useTransform` outside the React render cycle to prevent performance collapse on mobile. +* **Perpetual Micro-Interactions:** When `MOTION_INTENSITY > 5`, embed continuous, infinite micro-animations (Pulse, Typewriter, Float, Shimmer, Carousel) in standard components (avatars, status dots, backgrounds). Apply premium Spring Physics (`type: "spring", stiffness: 100, damping: 20`) to all interactive elements—no linear easing. +* **Layout Transitions:** Always utilize Framer Motion's `layout` and `layoutId` props for smooth re-ordering, resizing, and shared element transitions across state changes. +* **Staggered Orchestration:** Do not mount lists or grids instantly. Use `staggerChildren` (Framer) or CSS cascade (`animation-delay: calc(var(--index) * 100ms)`) to create sequential waterfall reveals. **CRITICAL:** For `staggerChildren`, the Parent (`variants`) and Children MUST reside in the identical Client Component tree. If data is fetched asynchronously, pass the data as props into a centralized Parent Motion wrapper. + +## 5. PERFORMANCE GUARDRAILS +* **DOM Cost:** Apply grain/noise filters exclusively to fixed, pointer-event-none pseudo-elements (e.g., `fixed inset-0 z-50 pointer-events-none`) and NEVER to scrolling containers to prevent continuous GPU repaints and mobile performance degradation. +* **Hardware Acceleration:** Never animate `top`, `left`, `width`, or `height`. Animate exclusively via `transform` and `opacity`. +* **Z-Index Restraint:** NEVER spam arbitrary `z-50` or `z-10` unprompted. Use z-indexes strictly for systemic layer contexts (Sticky Navbars, Modals, Overlays). + +## 6. TECHNICAL REFERENCE (Dial Definitions) + +### DESIGN_VARIANCE (Level 1-10) +* **1-3 (Predictable):** Flexbox `justify-center`, strict 12-column symmetrical grids, equal paddings. +* **4-7 (Offset):** Use `margin-top: -2rem` overlapping, varied image aspect ratios (e.g., 4:3 next to 16:9), left-aligned headers over center-aligned data. +* **8-10 (Asymmetric):** Masonry layouts, CSS Grid with fractional units (e.g., `grid-template-columns: 2fr 1fr 1fr`), massive empty zones (`padding-left: 20vw`). +* **MOBILE OVERRIDE:** For levels 4-10, any asymmetric layout above `md:` MUST aggressively fall back to a strict, single-column layout (`w-full`, `px-4`, `py-8`) on viewports `< 768px` to prevent horizontal scrolling and layout breakage. + +### MOTION_INTENSITY (Level 1-10) +* **1-3 (Static):** No automatic animations. CSS `:hover` and `:active` states only. +* **4-7 (Fluid CSS):** Use `transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1)`. Use `animation-delay` cascades for load-ins. Focus strictly on `transform` and `opacity`. Use `will-change: transform` sparingly. +* **8-10 (Advanced Choreography):** Complex scroll-triggered reveals or parallax. Use Framer Motion hooks. NEVER use `window.addEventListener('scroll')`. + +### VISUAL_DENSITY (Level 1-10) +* **1-3 (Art Gallery Mode):** Lots of white space. Huge section gaps. Everything feels very expensive and clean. +* **4-7 (Daily App Mode):** Normal spacing for standard web apps. +* **8-10 (Cockpit Mode):** Tiny paddings. No card boxes; just 1px lines to separate data. Everything is packed. **Mandatory:** Use Monospace (`font-mono`) for all numbers. + +## 7. AI TELLS (Forbidden Patterns) +To guarantee a premium, non-generic output, you MUST strictly avoid these common AI design signatures unless explicitly requested: + +### Visual & CSS +* **NO Neon/Outer Glows:** Do not use default `box-shadow` glows or auto-glows. Use inner borders or subtle tinted shadows. +* **NO Pure Black:** Never use `#000000`. Use Off-Black, Zinc-950, or Charcoal. +* **NO Oversaturated Accents:** Desaturate accents to blend elegantly with neutrals. +* **NO Excessive Gradient Text:** Do not use text-fill gradients for large headers. +* **NO Custom Mouse Cursors:** They are outdated and ruin performance/accessibility. + +### Typography +* **NO Inter Font:** Banned. Use `Geist`, `Outfit`, `Cabinet Grotesk`, or `Satoshi`. +* **NO Oversized H1s:** The first heading should not scream. Control hierarchy with weight and color, not just massive scale. +* **Serif Constraints:** Use Serif fonts ONLY for creative/editorial designs. **NEVER** use Serif on clean Dashboards. + +### Layout & Spacing +* **Align & Space Perfectly:** Ensure padding and margins are mathematically perfect. Avoid floating elements with awkward gaps. +* **NO 3-Column Card Layouts:** The generic "3 equal cards horizontally" feature row is BANNED. Use a 2-column Zig-Zag, asymmetric grid, or horizontal scrolling approach instead. + +### Content & Data (The "Jane Doe" Effect) +* **NO Generic Names:** "John Doe", "Sarah Chan", or "Jack Su" are banned. Use highly creative, realistic-sounding names. +* **NO Generic Avatars:** DO NOT use standard SVG "egg" or Lucide user icons for avatars. Use creative, believable photo placeholders or specific styling. +* **NO Fake Numbers:** Avoid predictable outputs like `99.99%`, `50%`, or basic phone numbers (`1234567`). Use organic, messy data (`47.2%`, `+1 (312) 847-1928`). +* **NO Startup Slop Names:** "Acme", "Nexus", "SmartFlow". Invent premium, contextual brand names. +* **NO Filler Words:** Avoid AI copywriting clichés like "Elevate", "Seamless", "Unleash", or "Next-Gen". Use concrete verbs. + +### External Resources & Components +* **NO Broken Unsplash Links:** Do not use Unsplash. Use absolute, reliable placeholders like `https://picsum.photos/seed/{random_string}/800/600` or SVG UI Avatars. +* **shadcn/ui Customization:** You may use `shadcn/ui`, but NEVER in its generic default state. You MUST customize the radii, colors, and shadows to match the high-end project aesthetic. +* **Production-Ready Cleanliness:** Code must be extremely clean, visually striking, memorable, and meticulously refined in every detail. + +## 8. THE CREATIVE ARSENAL (High-End Inspiration) +Do not default to generic UI. Pull from this library of advanced concepts to ensure the output is visually striking and memorable. When appropriate, leverage **GSAP (ScrollTrigger/Parallax)** for complex scrolltelling or **ThreeJS/WebGL** for 3D/Canvas animations, rather than basic CSS motion. **CRITICAL:** Never mix GSAP/ThreeJS with Framer Motion in the same component tree. Default to Framer Motion for UI/Bento interactions. Use GSAP/ThreeJS EXCLUSIVELY for isolated full-page scrolltelling or canvas backgrounds, wrapped in strict useEffect cleanup blocks. + +### The Standard Hero Paradigm +* Stop doing centered text over a dark image. Try asymmetric Hero sections: Text cleanly aligned to the left or right. The background should feature a high-quality, relevant image with a subtle stylistic fade (darkening or lightening gracefully into the background color depending on if it is Light or Dark mode). + +### Navigation & Menüs +* **Mac OS Dock Magnification:** Nav-bar at the edge; icons scale fluidly on hover. +* **Magnetic Button:** Buttons that physically pull toward the cursor. +* **Gooey Menu:** Sub-items detach from the main button like a viscous liquid. +* **Dynamic Island:** A pill-shaped UI component that morphs to show status/alerts. +* **Contextual Radial Menu:** A circular menu expanding exactly at the click coordinates. +* **Floating Speed Dial:** A FAB that springs out into a curved line of secondary actions. +* **Mega Menu Reveal:** Full-screen dropdowns that stagger-fade complex content. + +### Layout & Grids +* **Bento Grid:** Asymmetric, tile-based grouping (e.g., Apple Control Center). +* **Masonry Layout:** Staggered grid without fixed row heights (e.g., Pinterest). +* **Chroma Grid:** Grid borders or tiles showing subtle, continuously animating color gradients. +* **Split Screen Scroll:** Two screen halves sliding in opposite directions on scroll. +* **Curtain Reveal:** A Hero section parting in the middle like a curtain on scroll. + +### Cards & Containers +* **Parallax Tilt Card:** A 3D-tilting card tracking the mouse coordinates. +* **Spotlight Border Card:** Card borders that illuminate dynamically under the cursor. +* **Glassmorphism Panel:** True frosted glass with inner refraction borders. +* **Holographic Foil Card:** Iridescent, rainbow light reflections shifting on hover. +* **Tinder Swipe Stack:** A physical stack of cards the user can swipe away. +* **Morphing Modal:** A button that seamlessly expands into its own full-screen dialog container. + +### Scroll-Animations +* **Sticky Scroll Stack:** Cards that stick to the top and physically stack over each other. +* **Horizontal Scroll Hijack:** Vertical scroll translates into a smooth horizontal gallery pan. +* **Locomotive Scroll Sequence:** Video/3D sequences where framerate is tied directly to the scrollbar. +* **Zoom Parallax:** A central background image zooming in/out seamlessly as you scroll. +* **Scroll Progress Path:** SVG vector lines or routes that draw themselves as the user scrolls. +* **Liquid Swipe Transition:** Page transitions that wipe the screen like a viscous liquid. + +### Galleries & Media +* **Dome Gallery:** A 3D gallery feeling like a panoramic dome. +* **Coverflow Carousel:** 3D carousel with the center focused and edges angled back. +* **Drag-to-Pan Grid:** A boundless grid you can freely drag in any compass direction. +* **Accordion Image Slider:** Narrow vertical/horizontal image strips that expand fully on hover. +* **Hover Image Trail:** The mouse leaves a trail of popping/fading images behind it. +* **Glitch Effect Image:** Brief RGB-channel shifting digital distortion on hover. + +### Typography & Text +* **Kinetic Marquee:** Endless text bands that reverse direction or speed up on scroll. +* **Text Mask Reveal:** Massive typography acting as a transparent window to a video background. +* **Text Scramble Effect:** Matrix-style character decoding on load or hover. +* **Circular Text Path:** Text curved along a spinning circular path. +* **Gradient Stroke Animation:** Outlined text with a gradient continuously running along the stroke. +* **Kinetic Typography Grid:** A grid of letters dodging or rotating away from the cursor. + +### Micro-Interactions & Effects +* **Particle Explosion Button:** CTAs that shatter into particles upon success. +* **Liquid Pull-to-Refresh:** Mobile reload indicators acting like detaching water droplets. +* **Skeleton Shimmer:** Shifting light reflections moving across placeholder boxes. +* **Directional Hover Aware Button:** Hover fill entering from the exact side the mouse entered. +* **Ripple Click Effect:** Visual waves rippling precisely from the click coordinates. +* **Animated SVG Line Drawing:** Vectors that draw their own contours in real-time. +* **Mesh Gradient Background:** Organic, lava-lamp-like animated color blobs. +* **Lens Blur Depth:** Dynamic focus blurring background UI layers to highlight a foreground action. + +## 9. THE "MOTION-ENGINE" BENTO PARADIGM +When generating modern SaaS dashboards or feature sections, you MUST utilize the following "Bento 2.0" architecture and motion philosophy. This goes beyond static cards and enforces a "Vercel-core meets Dribbble-clean" aesthetic heavily reliant on perpetual physics. + +### A. Core Design Philosophy +* **Aesthetic:** High-end, minimal, and functional. +* **Palette:** Background in `#f9fafb`. Cards are pure white (`#ffffff`) with a 1px border of `border-slate-200/50`. +* **Surfaces:** Use `rounded-[2.5rem]` for all major containers. Apply a "diffusion shadow" (a very light, wide-spreading shadow, e.g., `shadow-[0_20px_40px_-15px_rgba(0,0,0,0.05)]`) to create depth without clutter. +* **Typography:** Strict `Geist`, `Satoshi`, or `Cabinet Grotesk` font stack. Use subtle tracking (`tracking-tight`) for headers. +* **Labels:** Titles and descriptions must be placed **outside and below** the cards to maintain a clean, gallery-style presentation. +* **Pixel-Perfection:** Use generous `p-8` or `p-10` padding inside cards. + +### B. The Animation Engine Specs (Perpetual Motion) +All cards must contain **"Perpetual Micro-Interactions."** Use the following Framer Motion principles: +* **Spring Physics:** No linear easing. Use `type: "spring", stiffness: 100, damping: 20` for a premium, weighty feel. +* **Layout Transitions:** Heavily utilize the `layout` and `layoutId` props to ensure smooth re-ordering, resizing, and shared element state transitions. +* **Infinite Loops:** Every card must have an "Active State" that loops infinitely (Pulse, Typewriter, Float, or Carousel) to ensure the dashboard feels "alive". +* **Performance:** Wrap dynamic lists in `` and optimize for 60fps. **PERFORMANCE CRITICAL:** Any perpetual motion or infinite loop MUST be memoized (React.memo) and completely isolated in its own microscopic Client Component. Never trigger re-renders in the parent layout. + +### C. The 5-Card Archetypes (Micro-Animation Specs) +Implement these specific micro-animations when constructing Bento grids (e.g., Row 1: 3 cols | Row 2: 2 cols split 70/30): +1. **The Intelligent List:** A vertical stack of items with an infinite auto-sorting loop. Items swap positions using `layoutId`, simulating an AI prioritizing tasks in real-time. +2. **The Command Input:** A search/AI bar with a multi-step Typewriter Effect. It cycles through complex prompts, including a blinking cursor and a "processing" state with a shimmering loading gradient. +3. **The Live Status:** A scheduling interface with "breathing" status indicators. Include a pop-up notification badge that emerges with an "Overshoot" spring effect, stays for 3 seconds, and vanishes. +4. **The Wide Data Stream:** A horizontal "Infinite Carousel" of data cards or metrics. Ensure the loop is seamless (using `x: ["0%", "-100%"]`) with a speed that feels effortless. +5. **The Contextual UI (Focus Mode):** A document view that animates a staggered highlight of a text block, followed by a "Float-in" of a floating action toolbar with micro-icons. + +## 10. FINAL PRE-FLIGHT CHECK +Evaluate your code against this matrix before outputting. This is the **last** filter you apply to your logic. +- [ ] Is global state used appropriately to avoid deep prop-drilling rather than arbitrarily? +- [ ] Is mobile layout collapse (`w-full`, `px-4`, `max-w-7xl mx-auto`) guaranteed for high-variance designs? +- [ ] Do full-height sections safely use `min-h-[100dvh]` instead of the bugged `h-screen`? +- [ ] Do `useEffect` animations contain strict cleanup functions? +- [ ] Are empty, loading, and error states provided? +- [ ] Are cards omitted in favor of spacing where possible? +- [ ] Did you strictly isolate CPU-heavy perpetual animations in their own Client Components? diff --git a/.agents/skills/drawio/SKILL.md b/.agents/skills/drawio/SKILL.md new file mode 100644 index 00000000..81639e1c --- /dev/null +++ b/.agents/skills/drawio/SKILL.md @@ -0,0 +1,184 @@ +--- +name: drawio +description: Always use when user asks to create, generate, draw, or design a diagram, flowchart, architecture diagram, ER diagram, sequence diagram, class diagram, network diagram, mockup, wireframe, or UI sketch, or mentions draw.io, drawio, drawoi, .drawio files, or diagram export to PNG/SVG/PDF. +--- + +# Draw.io Diagram Skill + +Generate draw.io diagrams as native `.drawio` files. Optionally export to PNG, SVG, or PDF with the diagram XML embedded (so the exported file remains editable in draw.io). + +## How to create a diagram + +1. **Generate draw.io XML** in mxGraphModel format for the requested diagram +2. **Write the XML** to a `.drawio` file in the current working directory using the Write tool +3. **If the user requested an export format** (png, svg, pdf), locate the draw.io CLI (see below), export with `--embed-diagram`, then delete the source `.drawio` file. If the CLI is not found, keep the `.drawio` file and tell the user they can install the draw.io desktop app to enable export, or open the `.drawio` file directly +4. **Open the result** — the exported file if exported, or the `.drawio` file otherwise. If the open command fails, print the file path so the user can open it manually + +## Choosing the output format + +Check the user's request for a format preference. Examples: + +- `/drawio create a flowchart` → `flowchart.drawio` +- `/drawio png flowchart for login` → `login-flow.drawio.png` +- `/drawio svg: ER diagram` → `er-diagram.drawio.svg` +- `/drawio pdf architecture overview` → `architecture-overview.drawio.pdf` + +If no format is mentioned, just write the `.drawio` file and open it in draw.io. The user can always ask to export later. + +### Supported export formats + +| Format | Embed XML | Notes | +|--------|-----------|-------| +| `png` | Yes (`-e`) | Viewable everywhere, editable in draw.io | +| `svg` | Yes (`-e`) | Scalable, editable in draw.io | +| `pdf` | Yes (`-e`) | Printable, editable in draw.io | +| `jpg` | No | Lossy, no embedded XML support | + +PNG, SVG, and PDF all support `--embed-diagram` — the exported file contains the full diagram XML, so opening it in draw.io recovers the editable diagram. + +## draw.io CLI + +The draw.io desktop app includes a command-line interface for exporting. + +### Locating the CLI + +First, detect the environment, then locate the CLI accordingly: + +#### WSL2 (Windows Subsystem for Linux) + +WSL2 is detected when `/proc/version` contains `microsoft` or `WSL`: + +```bash +grep -qi microsoft /proc/version 2>/dev/null && echo "WSL2" +``` + +On WSL2, use the Windows draw.io Desktop executable via `/mnt/c/...`: + +```bash +DRAWIO_CMD=`/mnt/c/Program Files/draw.io/draw.io.exe` +``` + +The backtick quoting is required to handle the space in `Program Files` in bash. + +If draw.io is installed in a non-default location, check common alternatives: + +```bash +# Default install path +`/mnt/c/Program Files/draw.io/draw.io.exe` + +# Per-user install (if the above does not exist) +`/mnt/c/Users/$WIN_USER/AppData/Local/Programs/draw.io/draw.io.exe` +``` + +#### macOS + +```bash +/Applications/draw.io.app/Contents/MacOS/draw.io +``` + +#### Linux (native) + +```bash +drawio # typically on PATH via snap/apt/flatpak +``` + +#### Windows (native, non-WSL2) + +``` +"C:\Program Files\draw.io\draw.io.exe" +``` + +Use `which drawio` (or `where drawio` on Windows) to check if it's on PATH before falling back to the platform-specific path. + +### Export command + +```bash +drawio -x -f -e -b 10 -o +``` + +**WSL2 example:** + +```bash +`/mnt/c/Program Files/draw.io/draw.io.exe` -x -f png -e -b 10 -o diagram.drawio.png diagram.drawio +``` + +Key flags: +- `-x` / `--export`: export mode +- `-f` / `--format`: output format (png, svg, pdf, jpg) +- `-e` / `--embed-diagram`: embed diagram XML in the output (PNG, SVG, PDF only) +- `-o` / `--output`: output file path +- `-b` / `--border`: border width around diagram (default: 0) +- `-t` / `--transparent`: transparent background (PNG only) +- `-s` / `--scale`: scale the diagram size +- `--width` / `--height`: fit into specified dimensions (preserves aspect ratio) +- `-a` / `--all-pages`: export all pages (PDF only) +- `-p` / `--page-index`: select a specific page (1-based) + +### Opening the result + +| Environment | Command | +|-------------|---------| +| macOS | `open ` | +| Linux (native) | `xdg-open ` | +| WSL2 | `cmd.exe /c start "" "$(wslpath -w )"` | +| Windows | `start ` | + +**WSL2 notes:** +- `wslpath -w ` converts a WSL2 path (e.g. `/home/user/diagram.drawio`) to a Windows path (e.g. `C:\Users\...`). This is required because `cmd.exe` cannot resolve `/mnt/c/...` style paths. +- The empty string `""` after `start` is required to prevent `start` from interpreting the filename as a window title. + +**WSL2 example:** + +```bash +cmd.exe /c start "" "$(wslpath -w diagram.drawio)" +``` + +## File naming + +- Use a descriptive filename based on the diagram content (e.g., `login-flow`, `database-schema`) +- Use lowercase with hyphens for multi-word names +- For export, use double extensions: `name.drawio.png`, `name.drawio.svg`, `name.drawio.pdf` — this signals the file contains embedded diagram XML +- After a successful export, delete the intermediate `.drawio` file — the exported file contains the full diagram + +## XML format + +A `.drawio` file is native mxGraphModel XML. Always generate XML directly — Mermaid and CSV formats require server-side conversion and cannot be saved as native files. + +### Basic structure + +Every diagram must have this structure: + +```xml + + + + + + + +``` + +- Cell `id="0"` is the root layer +- Cell `id="1"` is the default parent layer +- All diagram elements use `parent="1"` unless using multiple layers + +## XML reference + +For the complete draw.io XML reference including common styles, edge routing, containers, layers, tags, metadata, dark mode colors, and XML well-formedness rules, fetch and follow the instructions at: +https://raw.githubusercontent.com/jgraph/drawio-mcp/main/shared/xml-reference.md + +## Troubleshooting + +| Problem | Cause | Solution | +|---------|-------|----------| +| draw.io CLI not found | Desktop app not installed or not on PATH | Keep the `.drawio` file and tell the user to install the draw.io desktop app, or open the file manually | +| Export produces empty/corrupt file | Invalid XML (e.g. double hyphens in comments, unescaped special characters) | Validate XML well-formedness before writing; see the XML well-formedness section below | +| Diagram opens but looks blank | Missing root cells `id="0"` and `id="1"` | Ensure the basic mxGraphModel structure is complete | +| Edges not rendering | Edge mxCell is self-closing (no child mxGeometry element) | Every edge must have `` as a child element | +| File won't open after export | Incorrect file path or missing file association | Print the absolute file path so the user can open it manually | + +## CRITICAL: XML well-formedness + +- **NEVER include ANY XML comments (``) in the output.** XML comments are strictly forbidden — they waste tokens, can cause parse errors, and serve no purpose in diagram XML. +- Escape special characters in attribute values: `&`, `<`, `>`, `"` +- Always use unique `id` values for each `mxCell` diff --git a/.agents/skills/exa-web-search-free/SKILL.md b/.agents/skills/exa-web-search-free/SKILL.md new file mode 100644 index 00000000..a5985065 --- /dev/null +++ b/.agents/skills/exa-web-search-free/SKILL.md @@ -0,0 +1,96 @@ +--- +name: exa-web-search-free +description: Free AI search via Exa MCP. Web search for news/info, code search for docs/examples from GitHub/StackOverflow, company research for business intel. No API key needed. +metadata: { "clawdbot": { "emoji": "🔍", "requires": { "bins": ["mcporter"] } } } +--- + +# Exa Web Search (Free) + +Neural search for web, code, and company research. No API key required. + +## Setup + +Verify mcporter is configured: + +```bash +mcporter list exa +``` + +If not listed: + +```bash +mcporter config add exa https://mcp.exa.ai/mcp +``` + +## Core Tools + +### web_search_exa + +Search web for current info, news, or facts. + +```bash +mcporter call 'exa.web_search_exa(query: "latest AI news 2026", numResults: 5)' +``` + +**Parameters:** + +- `query` - Search query +- `numResults` (optional, default: 8) +- `type` (optional) - `"auto"`, `"fast"`, or `"deep"` + +### get_code_context_exa + +Find code examples and docs from GitHub, Stack Overflow. + +```bash +mcporter call 'exa.get_code_context_exa(query: "React hooks examples", tokensNum: 3000)' +``` + +**Parameters:** + +- `query` - Code/API search query +- `tokensNum` (optional, default: 5000) - Range: 1000-50000 + +### company_research_exa + +Research companies for business info and news. + +```bash +mcporter call 'exa.company_research_exa(companyName: "Anthropic", numResults: 3)' +``` + +**Parameters:** + +- `companyName` - Company name +- `numResults` (optional, default: 5) + +## Advanced Tools (Optional) + +Six additional tools available by updating config URL: + +- `web_search_advanced_exa` - Domain/date filters +- `deep_search_exa` - Query expansion +- `crawling_exa` - Full page extraction +- `people_search_exa` - Professional profiles +- `deep_researcher_start/check` - AI research agent + +**Enable all tools:** + +```bash +mcporter config add exa-full "https://mcp.exa.ai/mcp?tools=web_search_exa,web_search_advanced_exa,get_code_context_exa,deep_search_exa,crawling_exa,company_research_exa,people_search_exa,deep_researcher_start,deep_researcher_check" + +# Then use: +mcporter call 'exa-full.deep_search_exa(query: "AI safety research")' +``` + +## Tips + +- Web: Use `type: "fast"` for quick lookup, `"deep"` for thorough research +- Code: Lower `tokensNum` (1000-2000) for focused, higher (5000+) for comprehensive +- See [examples.md](references/examples.md) for more patterns + +## Resources + +- [GitHub](https://github.com/exa-labs/exa-mcp-server) +- [npm](https://www.npmjs.com/package/exa-mcp-server) +- [Docs](https://exa.ai/docs) diff --git a/.agents/skills/exa-web-search-free/references/examples.md b/.agents/skills/exa-web-search-free/references/examples.md new file mode 100644 index 00000000..8f40a0be --- /dev/null +++ b/.agents/skills/exa-web-search-free/references/examples.md @@ -0,0 +1,156 @@ +# Exa Search Examples + +## Web Search Examples + +### Latest News & Current Events + +```bash +mcporter call 'exa.web_search_exa(query: "latest AI breakthroughs 2026", numResults: 5)' +mcporter call 'exa.web_search_exa(query: "quantum computing news", type: "fast")' +``` + +### Research Topics + +```bash +mcporter call 'exa.web_search_exa(query: "how does RAG work in LLMs", type: "deep", numResults: 8)' +mcporter call 'exa.web_search_exa(query: "best practices for API design", numResults: 5)' +``` + +### Product Information + +```bash +mcporter call 'exa.web_search_exa(query: "M4 Mac Mini specifications and reviews")' +mcporter call 'exa.web_search_exa(query: "comparison of vector databases", type: "deep")' +``` + +## Code Context Search Examples + +### Programming Language Basics + +```bash +mcporter call 'exa.get_code_context_exa(query: "Python asyncio basics and examples", tokensNum: 3000)' +mcporter call 'exa.get_code_context_exa(query: "Rust ownership and borrowing tutorial")' +``` + +### Framework & Library Usage + +```bash +mcporter call 'exa.get_code_context_exa(query: "React useState and useEffect hooks examples", tokensNum: 2000)' +mcporter call 'exa.get_code_context_exa(query: "Next.js 14 app router authentication middleware")' +mcporter call 'exa.get_code_context_exa(query: "Express.js error handling best practices", tokensNum: 4000)' +``` + +### Specific API & SDK Documentation + +```bash +mcporter call 'exa.get_code_context_exa(query: "Stripe checkout session implementation", tokensNum: 5000)' +mcporter call 'exa.get_code_context_exa(query: "AWS S3 SDK upload examples Python")' +mcporter call 'exa.get_code_context_exa(query: "Discord.js bot slash commands")' +``` + +### Debugging & Solutions + +```bash +mcporter call 'exa.get_code_context_exa(query: "fixing CORS errors in Node.js Express")' +mcporter call 'exa.get_code_context_exa(query: "pandas dataframe memory optimization techniques", tokensNum: 4000)' +``` + +## Company Research Examples + +### Startups & Tech Companies + +```bash +mcporter call 'exa.company_research_exa(companyName: "Anthropic", numResults: 3)' +mcporter call 'exa.company_research_exa(companyName: "Perplexity AI")' +mcporter call 'exa.company_research_exa(companyName: "Scale AI", numResults: 5)' +``` + +### Public Companies + +```bash +mcporter call 'exa.company_research_exa(companyName: "Microsoft")' +mcporter call 'exa.company_research_exa(companyName: "NVIDIA", numResults: 5)' +``` + +### Research Queries + +```bash +# Find funding info +mcporter call 'exa.company_research_exa(companyName: "OpenAI", numResults: 5)' + +# Recent news +mcporter call 'exa.company_research_exa(companyName: "Tesla", numResults: 3)' +``` + +## Parameter Guidance + +### `type` parameter (web_search_exa) + +- `"auto"` - Balanced search (default) +- `"fast"` - Quick results, less comprehensive +- `"deep"` - Thorough research, slower but more complete + +### `tokensNum` parameter (get_code_context_exa) + +- `1000-2000` - Focused queries, specific examples +- `3000-5000` - Standard documentation lookup (default: 5000) +- `5000-10000` - Comprehensive guides and tutorials +- `10000-50000` - Deep dives, full API documentation + +### `numResults` parameter + +- `3-5` - Quick lookup, specific answer +- `5-8` - Standard research (default for web: 8, company: 5) +- `10+` - Comprehensive research, multiple perspectives + +## Advanced Tools Examples (Off by Default) + +### Deep Search + +```bash +# Comprehensive research +mcporter call 'exa-full.deep_search_exa(query: "AI safety alignment research comprehensive overview")' + +# Multi-perspective exploration +mcporter call 'exa-full.deep_search_exa(query: "climate change solutions technology innovation")' +``` + +### Advanced Web Search + +```bash +# Search with domain filters +mcporter call 'exa-full.web_search_advanced_exa(query: "machine learning tutorials", includeDomains: ["github.com", "arxiv.org"])' + +# Search with date range +mcporter call 'exa-full.web_search_advanced_exa(query: "AI developments", startPublishedDate: "2026-01-01")' +``` + +### Crawling + +```bash +# Extract content from specific URL +mcporter call 'exa-full.crawling_exa(url: "https://anthropic.com/news/claude-3-5-sonnet")' + +# Get clean text from article +mcporter call 'exa-full.crawling_exa(url: "https://example.com/article")' +``` + +### People Search + +```bash +# Find professional profiles +mcporter call 'exa-full.people_search_exa(query: "Yann LeCun AI researcher")' + +# Research individuals +mcporter call 'exa-full.people_search_exa(query: "Demis Hassabis DeepMind")' +``` + +### Deep Researcher + +```bash +# Start a research task +mcporter call 'exa-full.deep_researcher_start(topic: "quantum computing applications in cryptography", depth: "comprehensive")' + +# Check research status (use taskId from start response) +mcporter call 'exa-full.deep_researcher_check(taskId: "abc123")' +``` diff --git a/.agents/skills/execute-task/SKILL.md b/.agents/skills/execute-task/SKILL.md new file mode 100644 index 00000000..dfadd111 --- /dev/null +++ b/.agents/skills/execute-task/SKILL.md @@ -0,0 +1,65 @@ +--- +name: execute-task +description: Executes one PRD task end-to-end using a provided task file, PRD directory, tracking file paths, and auto-commit mode. Use when a prompt includes a task specification that must be implemented, validated, and reflected in task tracking files. Do not use for PR review batches, generic coding tasks without a PRD task file, or standalone verification-only work. +--- + +# Execute PRD Task + +Execute one PRD task from exploration through tracking updates. + +## Required Inputs + +- Task specification markdown. +- PRD directory path. +- Task file path. +- Master tasks file path. +- Auto-commit mode. +- Optional workflow memory directory path. +- Optional shared workflow memory path. +- Optional current task memory path. + +## Workflow + +1. Ground in repository and PRD context. + - Read the provided task specification. + - Read the repository guidance files named by the caller. + - Read the PRD documents under the provided directory, especially `_techspec.md` and `_tasks.md`. + - Read ADRs from the `adrs/` subdirectory of the PRD directory to understand the architectural decision context for this task. + - After reading all sources, check for conflicts between the task specification, techspec, and ADRs. If any requirements contradict each other, stop and report the conflict instead of guessing — do not proceed to step 2. + - If the caller provides workflow memory paths, use the installed `workflow-memory` skill before editing code. + - Reconcile the current workspace state before new edits. + +2. Build the execution checklist. + - Extract deliverables, acceptance criteria, and every explicit `Validation`, `Test Plan`, or `Testing` item into a numbered working checklist. + - Print the full checklist before starting implementation so it is visible and trackable. + - Capture the concrete pre-change signal that proves the task is not finished yet. + - Use this checklist as a gate: mark each item done as evidence is produced during implementation, and do not proceed to validation until every checklist item has been addressed. + +3. Implement the task. + - Keep scope tight to the task specification. + - Follow repository patterns and real dependency APIs. + - Record meaningful out-of-scope work as follow-up notes instead of silently expanding the task. + +4. Validate and self-review. + - Run every test and validation command listed in the task specification — not just the repository-wide verification. + - Use the installed `final-verify` skill. This step is mandatory regardless of auto-commit mode — always verify before claiming completion. + - Perform a self-review after verification and resolve every blocking issue before proceeding. + +5. Update task tracking. + - If workflow memory paths were provided, update the memory files first — record decisions, learnings, and touched surfaces before updating tracking status. + - Use the caller-provided task file path and master tasks file path. + - Mark subtasks complete only when the implementation and evidence are actually complete. + - Change task status to completed only after clean verification and self-review. + - Read `references/tracking-checklist.md` when applying status, checklist, or commit updates. + - Sequence: memory update (if applicable) -> task file checkboxes -> task status -> master tasks file -> commit (if applicable). + +6. Handle commit behavior. + - If auto-commit is enabled, create one local commit after clean verification, self-review, and tracking updates. + - If auto-commit is disabled, leave the diff ready for manual review and commit. + - Never push automatically. + +## Error Handling + +- If the pre-change signal cannot be reproduced directly, capture the strongest available baseline signal and state the limitation. +- If validation fails, keep the task status unchanged until the failure is resolved. +- If tracking files are missing, stop and report the missing path before marking completion. diff --git a/.agents/skills/execute-task/references/tracking-checklist.md b/.agents/skills/execute-task/references/tracking-checklist.md new file mode 100644 index 00000000..67cb9607 --- /dev/null +++ b/.agents/skills/execute-task/references/tracking-checklist.md @@ -0,0 +1,9 @@ +# Tracking Checklist + +Apply this checklist when updating PRD task tracking files. + +1. Update the current task file checkboxes that correspond to completed subtasks. +2. Change the task status to `completed` only after implementation, validation, and self-review are complete. +3. Update the master `_tasks.md` entry that points to the current task file. +4. Re-check the task specification and supporting PRD docs before marking anything complete. +5. Follow the caller's commit mode and repository staging rules when deciding whether tracking files belong in a commit. diff --git a/.agents/skills/extreme-software-optimization/SKILL.md b/.agents/skills/extreme-software-optimization/SKILL.md new file mode 100644 index 00000000..8e2a35ca --- /dev/null +++ b/.agents/skills/extreme-software-optimization/SKILL.md @@ -0,0 +1,150 @@ +--- +name: extreme-software-optimization +description: >- + Profile-driven performance optimization with behavior proofs. Use when: optimize, + slow, bottleneck, hotspot, profile, p95, latency, throughput, or algorithmic improvements. +--- + +# Extreme Software Optimization + +> **The One Rule:** Profile first. Prove behavior unchanged. One change at a time. + +## The Loop (Mandatory) + +``` +1. BASELINE → hyperfine --warmup 3 --runs 10 'command' +2. PROFILE → cargo flamegraph / py-spy / clinic flame +3. PROVE → Golden outputs + isomorphism proof per change +4. IMPLEMENT → Score ≥ 2.0 only, one lever per commit +5. VERIFY → sha256sum -c golden_checksums.txt +6. REPEAT → Re-profile (bottlenecks shift) +``` + +## Opportunity Matrix + +| Hotspot | Impact (1-5) | Confidence (1-5) | Effort (1-5) | Score | +|---------|--------------|------------------|--------------|-------| +| *func:line* | × | × | ÷ | Impact×Conf/Effort | + +**Rule:** Only implement Score ≥ 2.0 + +## Isomorphism Proof Template + +For EVERY change, document: +``` +## Change: [description] +- Ordering preserved: [yes/no + why] +- Tie-breaking unchanged: [yes/no + why] +- Floating-point: [identical/N/A] +- RNG seeds: [unchanged/N/A] +- Golden outputs: sha256sum -c golden_checksums.txt ✓ +``` + +--- + +## Pattern Tiers (Quick Reference) + +### Tier 1: Low-Hanging Fruit + +| Pattern | When | Isomorphism | +|---------|------|-------------| +| N+1 → Batch | Sequential fetches | Same results, fewer round-trips | +| Linear → HashMap | Keyed lookups | O(n)→O(1), order may change | +| Lazy eval | Maybe-unused values | Same final values | +| Memoization | Repeated pure calls | Cached = recomputed | +| Buffer reuse | Alloc per iteration | Zero-copy in loop | + +### Tier 2: Algorithmic + +| Pattern | Change | Check | +|---------|--------|-------| +| Binary search | O(n)→O(log n) | Sorted input | +| Two-pointer | O(n²)→O(n) | Structured input | +| Prefix sums | O(n)→O(1) query | Static data | +| Priority queue | O(n)→O(log n) | Top-k/scheduling | + +### Tier 3: Data Structures + +| Structure | Use Case | +|-----------|----------| +| HashMap | Point lookups | +| BTreeMap | Range queries | +| SmallVec | Usually-small collections | +| Arena | Many allocations, bulk free | +| Bloom filter | Membership pre-filter | + +**Full catalog:** [TECHNIQUES.md](references/TECHNIQUES.md) + +--- + +## Language Cheatsheet + +| Lang | CPU Profile | Trouble Spot Grep | +|------|-------------|-------------------| +| Rust | `cargo flamegraph` | `rg '\.clone\(\)' --type rust` | +| Go | `go tool pprof /debug/pprof/profile` | `rg 'interface\{\}' --type go` | +| TS | `clinic flame -- node app.js` | `rg 'JSON\.(parse\|stringify)' --type ts` | +| Python | `py-spy record -o flame.svg -- python script.py` | `rg '\.iterrows\(\)' --type py` | + +**Full language guides:** [LANGUAGE-SPECIFIC.md](references/LANGUAGE-SPECIFIC.md) + +--- + +## Anti-Patterns (Never Do) + +| ✗ | Why | +|---|-----| +| Optimize without profiling | Wastes effort on non-hotspots | +| Multiple changes per commit | Can't isolate regressions | +| Assume improvement | Must measure before/after | +| Change behavior "while we're here" | Breaks isomorphism guarantee | +| Skip golden output capture | No regression detection | + +--- + +## Checklist (Before Any Optimization) + +- [ ] Baseline captured (p50/p95/p99, throughput, memory) +- [ ] Profiled: hotspot in top 5 by % time +- [ ] Opportunity score ≥ 2.0 +- [ ] Golden outputs saved +- [ ] Isomorphism proof written +- [ ] Single lever only +- [ ] Rollback plan: `git revert ` + +--- + +## Tool Commands + +```bash +# Benchmark +hyperfine --warmup 3 --runs 10 'command' + +# Profile +cargo flamegraph # Rust CPU +heaptrack ./binary # Allocation +strace -c ./binary # Syscalls + +# Verify +sha256sum golden_outputs/* > golden_checksums.txt +sha256sum -c golden_checksums.txt # After changes +``` + +--- + +## References + +| Need | Reference | +|------|-----------| +| Complete technique catalog | [TECHNIQUES.md](references/TECHNIQUES.md) | +| Step-by-step methodology | [METHODOLOGY.md](references/METHODOLOGY.md) | +| Language-specific guides | [LANGUAGE-SPECIFIC.md](references/LANGUAGE-SPECIFIC.md) | +| Advanced (Round 2+) | [ADVANCED.md](references/ADVANCED.md) | + +## Iteration Rounds + +- **Round 1:** Standard (N+1, indexes, batching, memoization) +- **Round 2:** Algorithmic (DP, convex, semirings) → [ADVANCED.md](references/ADVANCED.md) +- **Round 3:** Exotic (suffix automata, link-cut trees) + +Each round: fresh profile → new hotspots → new matrix. diff --git a/.agents/skills/extreme-software-optimization/references/ADVANCED.md b/.agents/skills/extreme-software-optimization/references/ADVANCED.md new file mode 100644 index 00000000..03318de0 --- /dev/null +++ b/.agents/skills/extreme-software-optimization/references/ADVANCED.md @@ -0,0 +1,999 @@ +# Advanced Optimization Techniques + +> Round 2+ patterns for when standard techniques are exhausted. + +## Contents + +1. [Mathematical Recastings](#mathematical-recastings) +2. [Advanced DP](#advanced-dp) +3. [Exotic Data Structures](#exotic-data-structures) +4. [Streaming/Sublinear](#streamingsublinear) +5. [Algebraic Techniques](#algebraic-techniques) +6. [Graph Optimizations](#graph-optimizations) +7. [Cache-Oblivious Design](#cache-oblivious-design) +8. [Randomized Algorithms](#randomized-algorithms) +9. [Quick Reference](#quick-reference) + +--- + +## Mathematical Recastings + +### Convex Optimization + +**When:** Brute-forcing allocation/scheduling/fitting + +```rust +use minilp::{Problem, OptimizationDirection, ComparisonOp}; + +let mut problem = Problem::new(OptimizationDirection::Minimize); +let vars: Vec<_> = costs.iter().map(|&c| problem.add_var(c, (0.0, f64::INFINITY))).collect(); +for (row, &limit) in constraints.iter().zip(limits.iter()) { + problem.add_constraint(row.iter().zip(&vars).map(|(&a, &v)| (v, a)), ComparisonOp::Le, limit); +} +let solution = problem.solve().unwrap(); +``` +**Libraries:** `minilp`, `good_lp`, `osqp` + +### Submodular Greedy + +**When:** Diminishing returns set function (f(A∪{x})-f(A) ≥ f(B∪{x})-f(B) when A⊆B) + +```rust +fn greedy_submodular(n: usize, k: usize, f: F) -> Vec +where F: Fn(&[usize]) -> f64 { + let mut selected = Vec::with_capacity(k); + let mut remaining: Vec<_> = (0..n).collect(); + for _ in 0..k { + let (best_idx, _) = remaining.iter().enumerate() + .map(|(i, &e)| { let mut c = selected.clone(); c.push(e); (i, f(&c) - f(&selected)) }) + .max_by(|a, b| a.1.partial_cmp(&b.1).unwrap()).unwrap(); + selected.push(remaining.remove(best_idx)); + } + selected +} +``` +**Guarantee:** 63% of optimal for monotone submodular + +### Semiring Generalization + +**When:** Path computations (shortest path, transitive closure, dataflow) + +```rust +trait Semiring { + fn zero() -> Self; + fn one() -> Self; + fn add(&self, other: &Self) -> Self; // ⊕ + fn mul(&self, other: &Self) -> Self; // ⊗ +} + +// Tropical (shortest paths) +impl Semiring for MinPlus { + fn zero() -> Self { MinPlus(f64::INFINITY) } + fn one() -> Self { MinPlus(0.0) } + fn add(&self, other: &Self) -> Self { MinPlus(self.0.min(other.0)) } + fn mul(&self, other: &Self) -> Self { MinPlus(self.0 + other.0) } +} + +// Boolean (transitive closure) +impl Semiring for bool { + fn zero() -> Self { false } + fn one() -> Self { true } + fn add(&self, other: &Self) -> Self { *self || *other } + fn mul(&self, other: &Self) -> Self { *self && *other } +} +``` + +### Matroid Recognition + +**When:** Greedy is provably optimal + +**Recognition:** Independent sets satisfy hereditary property + exchange property + +**Examples:** +- Graphic matroids (spanning trees) +- Partition matroids (select k from each category) +- Linear matroids (linearly independent vectors) + +```rust +fn greedy_matroid(elements: &[Element], matroid: &I) -> Vec { + let mut result = Vec::new(); + let mut sorted: Vec<_> = elements.iter().collect(); + sorted.sort_by(|a, b| b.weight.cmp(&a.weight)); // Descending + for elem in sorted { + if matroid.is_independent(&result, elem) { + result.push(elem.clone()); + } + } + result +} +``` + +### Min-Cost Max-Flow + +**When:** Assignment, scheduling, resource allocation + +```rust +// Model as graph: +// Source → workers (cap 1, cost 0) +// Workers → tasks (cap 1, cost = -preference) +// Tasks → sink (cap 1, cost 0) +use pathfinding::prelude::*; +let (flow, cost, paths) = edmonds_karp(&graph, source, sink); +``` +**Libraries:** `pathfinding`, `petgraph` + +### 2-SAT Reduction + +**When:** Configuration validity, implication graphs, pairwise boolean constraints + +```rust +// (x ∨ y) becomes (¬x → y) ∧ (¬y → x) +fn solve_2sat(clauses: &[(Lit, Lit)]) -> Option> { + let n = /* number of variables */; + let mut graph = ImplicationGraph::new(n); + + for &(a, b) in clauses { + graph.add_implication(!a, b); + graph.add_implication(!b, a); + } + + let sccs = kosaraju(&graph); + + // Check: x and ¬x in same SCC = UNSAT + for var in 0..n { + if sccs[var] == sccs[var + n] { return None; } + } + + // Assign: choose literal whose SCC comes later in reverse topo order + Some((0..n).map(|var| sccs[var] > sccs[var + n]).collect()) +} +``` + +--- + +## Advanced DP + +### DP as Shortest Path in Implicit DAG + +**When:** DP with DAG structure, non-uniform transition costs + +```rust +fn dp_dijkstra(start: State, goal: State) -> Cost { + let mut dist = HashMap::new(); + let mut heap = BinaryHeap::new(); + dist.insert(start, 0); + heap.push(Reverse((0, start))); + + while let Some(Reverse((d, state))) = heap.pop() { + if state == goal { return d; } + if d > *dist.get(&state).unwrap_or(&Cost::MAX) { continue; } + + for (next_state, cost) in transitions(&state) { + let new_dist = d + cost; + if new_dist < *dist.get(&next_state).unwrap_or(&Cost::MAX) { + dist.insert(next_state, new_dist); + heap.push(Reverse((new_dist, next_state))); + } + } + } + Cost::MAX +} +``` + +### Convex Hull Trick + +**When:** DP recurrence dp[i] = min(m[j]·x[i] + c[j]) — O(n²) → O(n log n) + +```rust +struct CHT { lines: VecDeque<(i64, i64)> } +impl CHT { + fn add_line(&mut self, m: i64, c: i64) { + while self.lines.len() >= 2 { + let (m1, c1) = self.lines[self.lines.len() - 2]; + let (m2, c2) = self.lines[self.lines.len() - 1]; + if (c - c2) * (m1 - m2) <= (c2 - c1) * (m - m2) { self.lines.pop_back(); } + else { break; } + } + self.lines.push_back((m, c)); + } + fn query(&mut self, x: i64) -> i64 { + while self.lines.len() >= 2 { + let (m1, c1) = self.lines[0]; + let (m2, c2) = self.lines[1]; + if m1 * x + c1 >= m2 * x + c2 { self.lines.pop_front(); } + else { break; } + } + let (m, c) = self.lines[0]; + m * x + c + } +} +``` + +### Knuth's Optimization + +**When:** dp[i][j] = min(dp[i][k] + dp[k][j] + cost[i][j]), optimal split monotonic — O(n³) → O(n²) + +**Condition:** cost satisfies quadrangle inequality, opt[i][j-1] ≤ opt[i][j] ≤ opt[i+1][j] + +```rust +fn knuth_optimization(n: usize, cost: &[Vec]) -> Vec> { + let mut dp = vec![vec![0; n]; n]; + let mut opt = vec![vec![0; n]; n]; + + for i in 0..n { opt[i][i] = i; } + + for len in 2..=n { + for i in 0..=n-len { + let j = i + len - 1; + dp[i][j] = i64::MAX; + let lo = opt[i][j-1]; + let hi = if j + 1 < n { opt[i+1][j] } else { j }; + + for k in lo..=hi.min(j) { + let candidate = dp[i][k] + dp[k+1][j] + cost[i][j]; + if candidate < dp[i][j] { + dp[i][j] = candidate; + opt[i][j] = k; + } + } + } + } + dp +} +``` + +### Divide & Conquer DP + +**When:** Similar conditions, 1D DP — O(n²) → O(n log n) + +```rust +fn dc_dp(dp: &mut [i64], prev: &[i64], cost: impl Fn(usize, usize) -> i64, + lo: usize, hi: usize, opt_lo: usize, opt_hi: usize) { + if lo > hi { return; } + let mid = (lo + hi) / 2; + let mut best = (i64::MAX, opt_lo); + + for k in opt_lo..=opt_hi.min(mid) { + let candidate = prev[k] + cost(k, mid); + if candidate < best.0 { best = (candidate, k); } + } + + dp[mid] = best.0; + dc_dp(dp, prev, &cost, lo, mid.saturating_sub(1), opt_lo, best.1); + dc_dp(dp, prev, &cost, mid + 1, hi, best.1, opt_hi); +} +``` + +--- + +## Exotic Data Structures + +### Suffix Array + LCP + +**When:** Substring queries, longest common substring, pattern matching + +```rust +use suffix_array::SuffixArray; +let sa = SuffixArray::new(text); +let lcp = sa.lcp_array(); +let range = sa.search(pattern); // O(m log n) +``` +**Libraries:** `suffix_array`, `cdivsufsort` + +### Wavelet Trees + +**When:** Rank, select, quantile queries on sequences — O(log σ) + +```rust +// Operations: +// rank(c, i): count of c in prefix [0, i) +// select(c, k): position of k-th occurrence of c +// quantile(l, r, k): k-th smallest in range [l, r) +``` +**Libraries:** `wavelet-matrix` + +### Link-Cut Trees + +**When:** Dynamic tree connectivity, path queries on changing trees — O(log n) + +```rust +// Operations: +// link(u, v): Add edge +// cut(u, v): Remove edge +// path_query(u, v): Aggregate on u-v path +// find_root(u): Find tree root +``` +**Libraries:** `link_cut_tree` crate or implement from scratch + +### Heavy-Light Decomposition + +**When:** Path queries on static trees — O(log² n) per query + +```rust +struct HLD { + parent: Vec, + depth: Vec, + heavy: Vec>, + head: Vec, + pos: Vec, +} +// Decompose tree into heavy chains +// Path query = O(log n) chains × O(log n) segment tree +``` + +### Monotone Deque + +**When:** Sliding window min/max — O(1) amortized + +```rust +struct MonotoneDeque { deque: VecDeque<(i64, usize)> } +impl MonotoneDeque { + fn push(&mut self, val: i64, idx: usize) { + while self.deque.back().map_or(false, |&(v, _)| v >= val) { self.deque.pop_back(); } + self.deque.push_back((val, idx)); + } + fn pop_expired(&mut self, min_idx: usize) { + while self.deque.front().map_or(false, |&(_, i)| i < min_idx) { self.deque.pop_front(); } + } + fn min(&self) -> Option { self.deque.front().map(|&(v, _)| v) } +} +``` + +### Segment Tree + Lazy Propagation + +**When:** Range updates + range queries + +```rust +struct LazySegTree { + tree: Vec, + lazy: Vec, +} + +impl LazySegTree { + fn push_down(&mut self, node: usize) { + // Propagate lazy value to children + } + + fn update_range(&mut self, node: usize, l: usize, r: usize, ql: usize, qr: usize, val: L) { + if qr < l || r < ql { return; } + if ql <= l && r <= qr { + self.apply_lazy(node, val); + return; + } + self.push_down(node); + let mid = (l + r) / 2; + self.update_range(2*node, l, mid, ql, qr, val.clone()); + self.update_range(2*node+1, mid+1, r, ql, qr, val); + self.pull_up(node); + } +} +``` + +--- + +## Streaming/Sublinear + +### Bloom Filters + +**When:** Probabilistic membership, no false negatives + +```rust +use bloom::BloomFilter; +let mut filter = BloomFilter::new(expected_items, false_positive_rate); +filter.insert(&item); +if filter.may_contain(&item) { /* check authoritative source */ } +``` + +### Count-Min Sketch + +**When:** Frequency estimation — O(1) query, O(k) space + +```rust +struct CountMinSketch { counters: Vec>, hash_fns: Vec usize>> } +impl CountMinSketch { + fn insert(&mut self, item: &[u8]) { + for (i, hf) in self.hash_fns.iter().enumerate() { + self.counters[i][hf(item) % self.counters[i].len()] += 1; + } + } + fn estimate(&self, item: &[u8]) -> u64 { + self.hash_fns.iter().enumerate() + .map(|(i, hf)| self.counters[i][hf(item) % self.counters[i].len()]) + .min().unwrap() + } +} +``` + +### HyperLogLog + +**When:** Count distinct — O(log log n) space + +```rust +use hyperloglogplus::HyperLogLog; +let mut hll: HyperLogLog = HyperLogLog::new(14).unwrap(); // 2^14 registers +for item in stream { hll.insert(&item); } +let cardinality = hll.count(); +``` +**Libraries:** `hyperloglogplus` + +### Locality-Sensitive Hashing (LSH) + +**When:** Approximate nearest neighbor search + +```rust +// For cosine similarity: random hyperplane LSH +// For Jaccard similarity: MinHash + +use minhash::MinHash; +let mh1 = MinHash::new(128); // 128 hash functions +let sig1 = mh1.signature(&set1); +let sig2 = mh1.signature(&set2); +let approx_jaccard = mh1.similarity(&sig1, &sig2); +``` + +### Cuckoo Filter + +**When:** Membership with deletion (Bloom alternative), better space at low FP rates + +```rust +struct CuckooFilter { + buckets: Vec<[Fingerprint; 4]>, // 4 slots per bucket + num_items: usize, +} + +impl CuckooFilter { + fn fingerprint(item: &[u8]) -> Fingerprint { hash(item) as Fingerprint } + + fn bucket_indices(&self, item: &[u8]) -> (usize, usize) { + let fp = Self::fingerprint(item); + let i1 = hash(item) % self.buckets.len(); + let i2 = (i1 ^ hash(&fp.to_le_bytes())) % self.buckets.len(); + (i1, i2) + } + + fn insert(&mut self, item: &[u8]) -> bool { + let fp = Self::fingerprint(item); + let (i1, i2) = self.bucket_indices(item); + // Try both buckets, then cuckoo displacement + } + + fn contains(&self, item: &[u8]) -> bool { + let fp = Self::fingerprint(item); + let (i1, i2) = self.bucket_indices(item); + self.buckets[i1].contains(&fp) || self.buckets[i2].contains(&fp) + } + + fn delete(&mut self, item: &[u8]) -> bool { + // Find and remove fingerprint from either bucket + } +} +``` +**Libraries:** `cuckoofilter`, `xorf` + +### Minimal Perfect Hashing + +**When:** Static key set, guaranteed O(1), ~2-3 bits/key + +```rust +// CHD algorithm: n keys → [0, n) with no collisions +struct MinimalPerfectHash { + pilots: Vec, // Pilot values per bucket + values: Vec, // Direct-indexed values +} + +impl MinimalPerfectHash { + fn build(keys: &[Key]) -> Self { + // Group keys by initial hash + // Sort buckets by size (largest first) + // Find pilot for each bucket that avoids collisions + } + + fn get(&self, key: &Key) -> Option<&Value> { + let bucket = hash1(key) % self.pilots.len(); + let pilot = self.pilots[bucket]; + let pos = (hash1(key) ^ hash2(key).wrapping_mul(pilot as u64)) as usize % self.values.len(); + Some(&self.values[pos]) + } +} +``` +**Libraries:** `phf` (compile-time), `boomphf`, `ph` + +### Fractional Cascading + +**When:** Searching same value across multiple sorted lists — O(k log n) → O(log n + k) + +```rust +struct FractionalCascade { + augmented: Vec>, // (value, pointer to next list) +} + +impl FractionalCascade { + fn build(lists: Vec>) -> Self { + // Start from last list + // Build backwards, interleaving every other element from next list + // Each element has pointer to corresponding position in next list + } + + fn search(&self, x: i64) -> Vec { + // Binary search in first list + // Follow pointers for remaining lists (adjust by at most 2) + } +} +``` +**Use cases:** Computational geometry, database range queries + +--- + +## Algebraic Techniques + +### FFT/NTT Convolution + +**When:** Polynomial multiplication — O(n²) → O(n log n) + +```rust +use rustfft::{FftPlanner, num_complex::Complex}; + +fn convolve(a: &[f64], b: &[f64]) -> Vec { + let n = (a.len() + b.len() - 1).next_power_of_two(); + let mut planner = FftPlanner::new(); + let fft = planner.plan_fft_forward(n); + let ifft = planner.plan_fft_inverse(n); + + let mut a_fft: Vec<_> = a.iter().map(|&x| Complex::new(x, 0.0)).collect(); + let mut b_fft: Vec<_> = b.iter().map(|&x| Complex::new(x, 0.0)).collect(); + a_fft.resize(n, Complex::new(0.0, 0.0)); + b_fft.resize(n, Complex::new(0.0, 0.0)); + + fft.process(&mut a_fft); + fft.process(&mut b_fft); + + let mut result: Vec<_> = a_fft.iter().zip(&b_fft).map(|(a, b)| a * b).collect(); + ifft.process(&mut result); + + result.iter().map(|c| c.re / n as f64).take(a.len() + b.len() - 1).collect() +} +``` + +### Matrix Exponentiation + +**When:** Linear recurrence — O(n) → O(log n) + +```rust +type Matrix = [[i64; 2]; 2]; + +fn mat_mul(a: &Matrix, b: &Matrix, m: i64) -> Matrix { + let mut c = [[0; 2]; 2]; + for i in 0..2 { + for j in 0..2 { + for k in 0..2 { + c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % m; + } + } + } + c +} + +fn mat_pow(mut base: Matrix, mut exp: u64, m: i64) -> Matrix { + let mut result = [[1, 0], [0, 1]]; // Identity + while exp > 0 { + if exp & 1 == 1 { result = mat_mul(&result, &base, m); } + base = mat_mul(&base, &base, m); + exp >>= 1; + } + result +} + +fn fibonacci(n: u64, m: i64) -> i64 { + if n == 0 { return 0; } + mat_pow([[1, 1], [1, 0]], n, m)[0][1] +} +``` + +### Möbius Transform / Subset Convolution + +**When:** Sum over subsets, subset DP + +```rust +// Zeta transform: f'[S] = Σ_{T⊆S} f[T] +fn zeta_transform(f: &mut [i64]) { + let n = f.len().trailing_zeros() as usize; + for i in 0..n { + for mask in 0..f.len() { + if mask & (1 << i) != 0 { + f[mask] += f[mask ^ (1 << i)]; + } + } + } +} + +// Möbius transform (inverse): f[S] = Σ_{T⊆S} (-1)^{|S|-|T|} f'[T] +fn mobius_transform(f: &mut [i64]) { + let n = f.len().trailing_zeros() as usize; + for i in 0..n { + for mask in 0..f.len() { + if mask & (1 << i) != 0 { + f[mask] -= f[mask ^ (1 << i)]; + } + } + } +} +``` + +### Linear Algebra over GF(2) + +**When:** XOR systems, toggle problems, error correction + +```rust +// Solve Ax = b over GF(2) using Gaussian elimination +fn solve_gf2(mut a: Vec>, mut b: Vec) -> Option> { + let n = a.len(); + let m = a[0].len(); + let mut pivot_col = 0; + + for row in 0..n { + if pivot_col >= m { break; } + + // Find pivot + let pivot_row = (row..n).find(|&r| a[r][pivot_col])?; + a.swap(row, pivot_row); + b.swap(row, pivot_row); + + // Eliminate + for r in 0..n { + if r != row && a[r][pivot_col] { + for c in 0..m { a[r][c] ^= a[row][c]; } + b[r] ^= b[row]; + } + } + pivot_col += 1; + } + Some(b) +} +``` + +--- + +## Graph Optimizations + +### Bidirectional Search / Meet-in-the-Middle + +**When:** Exponential branching — O(b^d) → O(b^{d/2}) + +```rust +fn bidirectional_bfs(start: Node, goal: Node, graph: &Graph) -> Option { + let mut forward = HashMap::from([(start, 0)]); + let mut backward = HashMap::from([(goal, 0)]); + let mut forward_frontier = vec![start]; + let mut backward_frontier = vec![goal]; + + while !forward_frontier.is_empty() && !backward_frontier.is_empty() { + // Expand smaller frontier + if forward_frontier.len() <= backward_frontier.len() { + let mut next = Vec::new(); + for node in forward_frontier { + let dist = forward[&node]; + for neighbor in graph.neighbors(node) { + if let Some(&bd) = backward.get(&neighbor) { + return Some(dist + 1 + bd); // Found! + } + if !forward.contains_key(&neighbor) { + forward.insert(neighbor, dist + 1); + next.push(neighbor); + } + } + } + forward_frontier = next; + } else { + // Similar for backward + } + } + None +} +``` + +### Mo's Algorithm + +**When:** Offline range queries — O(qn) → O((n+q)√n) + +```rust +fn mo_algorithm(arr: &[i64], queries: &[(usize, usize)]) -> Vec { + let n = arr.len(); + let block = (n as f64).sqrt() as usize + 1; + + // Sort queries by (l/block, r) + let mut indexed: Vec<_> = queries.iter().enumerate() + .map(|(i, &(l, r))| (l / block, r, l, i)) + .collect(); + indexed.sort(); + + let mut results = vec![0; queries.len()]; + let mut current = 0i64; + let mut cur_l = 0; + let mut cur_r = 0; + + for (_, r, l, idx) in indexed { + while cur_r < r { current += add(arr[cur_r]); cur_r += 1; } + while cur_l > l { cur_l -= 1; current += add(arr[cur_l]); } + while cur_r > r { cur_r -= 1; current -= remove(arr[cur_r]); } + while cur_l < l { current -= remove(arr[cur_l]); cur_l += 1; } + results[idx] = current; + } + results +} +``` + +### Centroid Decomposition + +**When:** Path queries on trees, divide & conquer + +```rust +fn centroid_decomposition(tree: &Tree) -> CentroidTree { + fn find_centroid(tree: &Tree, root: usize, removed: &[bool]) -> usize { + let size = subtree_size(tree, root, removed); + let mut cur = root; + loop { + let heavy_child = tree.children(cur) + .filter(|&c| !removed[c]) + .find(|&c| subtree_size(tree, c, removed) > size / 2); + match heavy_child { + Some(c) => cur = c, + None => return cur, + } + } + } + + fn decompose(tree: &Tree, root: usize, removed: &mut [bool]) -> CentroidNode { + let centroid = find_centroid(tree, root, removed); + removed[centroid] = true; + let children: Vec<_> = tree.children(centroid) + .filter(|&c| !removed[c]) + .map(|c| decompose(tree, c, removed)) + .collect(); + CentroidNode { id: centroid, children } + } + + decompose(tree, 0, &mut vec![false; tree.len()]) +} +``` + +### Union-Find with Rollback + +**When:** Undo connectivity (no path compression for rollback) + +```rust +struct UFRollback { + parent: Vec, + rank: Vec, + history: Vec<(usize, usize, usize)>, // (node, old_parent, old_rank) +} + +impl UFRollback { + fn new(n: usize) -> Self { + Self { parent: (0..n).collect(), rank: vec![0; n], history: Vec::new() } + } + + fn find(&self, mut x: usize) -> usize { + while self.parent[x] != x { x = self.parent[x]; } + x + } + + fn union(&mut self, x: usize, y: usize) -> bool { + let (rx, ry) = (self.find(x), self.find(y)); + if rx == ry { return false; } + + let (small, large) = if self.rank[rx] < self.rank[ry] { (rx, ry) } else { (ry, rx) }; + self.history.push((small, self.parent[small], self.rank[large])); + + self.parent[small] = large; + if self.rank[rx] == self.rank[ry] { self.rank[large] += 1; } + true + } + + fn checkpoint(&self) -> usize { self.history.len() } + + fn rollback(&mut self, checkpoint: usize) { + while self.history.len() > checkpoint { + let (node, old_parent, old_rank) = self.history.pop().unwrap(); + let large = self.parent[node]; + self.parent[node] = old_parent; + self.rank[large] = old_rank; + } + } +} +``` + +--- + +## Cache-Oblivious Design + +### Principles + +1. **Recursive decomposition:** Problems splitting into n/2 subproblems naturally fit cache +2. **Van Emde Boas layout:** Recursive memory layout for trees +3. **Blocking without block size:** Algorithms that work for any cache size + +### Cache-Oblivious Matrix Transpose + +```rust +fn transpose_recursive( + src: &[f64], dst: &mut [f64], + n: usize, m: usize, + src_stride: usize, dst_stride: usize, + si: usize, sj: usize, di: usize, dj: usize, +) { + if n <= 32 && m <= 32 { + // Base case: fits in cache + for i in 0..n { + for j in 0..m { + dst[(di + j) * dst_stride + dj + i] = src[(si + i) * src_stride + sj + j]; + } + } + } else if n >= m { + // Split rows + let mid = n / 2; + transpose_recursive(src, dst, mid, m, src_stride, dst_stride, si, sj, di, dj); + transpose_recursive(src, dst, n - mid, m, src_stride, dst_stride, si + mid, sj, di, dj + mid); + } else { + // Split columns + let mid = m / 2; + transpose_recursive(src, dst, n, mid, src_stride, dst_stride, si, sj, di, dj); + transpose_recursive(src, dst, n, m - mid, src_stride, dst_stride, si, sj + mid, di + mid, dj); + } +} +``` + +--- + +## Randomized Algorithms + +### Reservoir Sampling + +**When:** Uniform random sample from stream of unknown size + +```rust +fn reservoir_sample(stream: impl Iterator, k: usize) -> Vec { + let mut reservoir = Vec::with_capacity(k); + let mut rng = rand::thread_rng(); + + for (i, item) in stream.enumerate() { + if i < k { + reservoir.push(item); + } else { + let j = rng.gen_range(0..=i); + if j < k { reservoir[j] = item; } + } + } + reservoir +} +``` + +### Randomized Quickselect + +**When:** Finding kth smallest element — O(n) expected + +```rust +fn quickselect(arr: &mut [T], k: usize) -> T { + let mut rng = rand::thread_rng(); + + fn partition(arr: &mut [T], pivot_idx: usize) -> usize { + arr.swap(pivot_idx, arr.len() - 1); + let mut i = 0; + for j in 0..arr.len() - 1 { + if arr[j] < arr[arr.len() - 1] { + arr.swap(i, j); + i += 1; + } + } + arr.swap(i, arr.len() - 1); + i + } + + let pivot_idx = rng.gen_range(0..arr.len()); + let pivot_pos = partition(arr, pivot_idx); + + match pivot_pos.cmp(&k) { + Ordering::Equal => arr[k].clone(), + Ordering::Greater => quickselect(&mut arr[..pivot_pos], k), + Ordering::Less => quickselect(&mut arr[pivot_pos + 1..], k - pivot_pos - 1), + } +} +``` + +### Amortized Analysis Patterns + +**Key insight:** Don't optimize operations that are already amortized O(1) + +**Examples:** +- **Dynamic array resize:** O(1) amortized push despite O(n) occasional resize +- **Union-Find path compression:** O(α(n)) amortized despite O(log n) worst case +- **Splay tree:** O(log n) amortized despite O(n) worst case + +**Potential method:** Expensive operations are rare and "pay" for future cheap operations + +### Hirschberg's Algorithm + +**When:** Sequence alignment when O(n²) space is prohibitive — O(nm) space → O(min(n,m)) + +```rust +fn hirschberg(a: &[u8], b: &[u8]) -> Vec { + if a.is_empty() { return b.iter().map(|&c| Edit::Insert(c)).collect(); } + if b.is_empty() { return a.iter().map(|_| Edit::Delete).collect(); } + if a.len() == 1 { return base_case(a, b); } + + let mid = a.len() / 2; + let (a1, a2) = a.split_at(mid); + + let score_l = nw_score_linear_space(a1, b); + let score_r = nw_score_linear_space_rev(a2, b); + + // Find optimal split point in b + let split = (0..=b.len()) + .max_by_key(|&j| score_l[j] + score_r[b.len() - j]) + .unwrap(); + + let (b1, b2) = b.split_at(split); + let mut result = hirschberg(a1, b1); + result.extend(hirschberg(a2, b2)); + result +} + +fn nw_score_linear_space(a: &[u8], b: &[u8]) -> Vec { + let mut prev = (0..=b.len() as i32).map(|i| -i).collect::>(); + let mut curr = vec![0; b.len() + 1]; + + for (i, &ca) in a.iter().enumerate() { + curr[0] = -(i as i32 + 1); + for (j, &cb) in b.iter().enumerate() { + let match_score = if ca == cb { 1 } else { -1 }; + curr[j + 1] = (prev[j] + match_score) + .max(prev[j + 1] - 1) + .max(curr[j] - 1); + } + std::mem::swap(&mut prev, &mut curr); + } + prev +} +``` +**Use cases:** Bioinformatics, diff algorithms, sequences >10K elements + +--- + +## Quick Reference + +| Technique | Recognition | Complexity Change | +|-----------|-------------|-------------------| +| Convex optimization | Continuous params + convex constraints | Brute → poly | +| Submodular greedy | Diminishing returns | Optimal (63%) | +| Matroid greedy | Hereditary + exchange property | Optimal | +| 2-SAT | Pairwise boolean constraints | O(n+m) | +| DP as shortest path | DAG + non-uniform costs | Dijkstra-style | +| CHT / Li Chao | Linear cost DP | O(n²) → O(n log n) | +| Knuth optimization | Monotonic optimal split | O(n³) → O(n²) | +| D&C DP | Similar to Knuth, 1D | O(n²) → O(n log n) | +| FFT convolution | Polynomial multiply | O(n²) → O(n log n) | +| Matrix exponentiation | Linear recurrence | O(n) → O(log n) | +| Möbius transform | Subset sums | O(3^n) → O(n·2^n) | +| GF(2) linear algebra | XOR systems | Gaussian elim | +| HyperLogLog | Count distinct | O(n) → O(log log n) space | +| LSH | Approximate NN | Sublinear query | +| Bidirectional search | Exponential branch | O(b^d) → O(b^{d/2}) | +| Mo's algorithm | Offline range queries | O(qn) → O((n+q)√n) | +| Fractional cascading | Multi-list search | O(k log n) → O(log n + k) | +| Cuckoo filter | Membership + delete | Better than Bloom | +| Minimal perfect hash | Static keys | O(1), 2-3 bits/key | +| Reservoir sampling | Stream sampling | O(n) time, O(k) space | +| Quickselect | kth element | O(n) expected | +| Hirschberg | Alignment | O(nm) time, O(n) space | +| Cache-oblivious | Any cache size | Recursive blocking | + +### Libraries + +| Category | Libraries | +|----------|-----------| +| LP/Optimization | `minilp`, `good_lp`, `osqp` | +| Graph | `pathfinding`, `petgraph` | +| Strings | `suffix_array`, `cdivsufsort` | +| Probabilistic | `hyperloglogplus`, `cuckoofilter`, `bloom` | +| FFT | `rustfft` | +| Perfect hash | `phf`, `boomphf` | +| Wavelets | `wavelet-matrix` | diff --git a/.agents/skills/extreme-software-optimization/references/LANGUAGE-SPECIFIC.md b/.agents/skills/extreme-software-optimization/references/LANGUAGE-SPECIFIC.md new file mode 100644 index 00000000..79915489 --- /dev/null +++ b/.agents/skills/extreme-software-optimization/references/LANGUAGE-SPECIFIC.md @@ -0,0 +1,513 @@ +# Language-Specific Profiling & Trouble Spots + +## Contents + +1. [Rust](#rust) +2. [Go](#go) +3. [TypeScript](#typescript) +4. [Python](#python) +5. [Universal Patterns](#universal-patterns) + +--- + +## Rust + +### Profiling + +```bash +# CPU flamegraph (best first tool) +cargo flamegraph --root -- ./target/release/binary + +# Allocation +heaptrack ./binary && heaptrack_gui heaptrack.binary.*.zst +# Or DHAT (add dhat to Cargo.toml with optional feature) +DHAT_LOG_FILE=dhat.out cargo run --release --features dhat-heap -- + +# perf (Linux) +perf record -g --call-graph dwarf ./binary && perf report + +# macOS +cargo instruments -t "Time Profiler" --release -- + +# Cache misses +valgrind --tool=cachegrind ./binary +``` + +### Trouble Spots + +| Pattern | Problem | Fix | +|---------|---------|-----| +| `.clone()` in loops | Allocs | Refs, `Cow`, `Rc` | +| `String` vs `&str` | Allocs | Accept `&str`, return `Cow` | +| `Vec::push` loop | Reallocations | `Vec::with_capacity(n)` | +| `Box` | Vtable + heap | Generics or enum dispatch | +| `Mutex` contention | Lock wait | `RwLock`, sharding, lock-free | +| `.collect::>()` | Materializes | Keep as iterator | +| `format!()` hot path | Allocs | Pre-alloc buffer, `write!()` | +| Default hasher | SipHash slow | `ahash`, `rustc-hash` | +| `async` overhead | Future alloc | Sync if not I/O bound | + +### Grep for Issues + +```bash +rg '\.clone\(\)' --type rust -c | sort -t: -k2 -rn | head -20 +rg '\.unwrap\(\)' src/ --type rust +rg 'String::from|\.to_string\(\)|format!' --type rust -c +rg 'Box = FxHashMap::default(); + +// Stack for small collections +use smallvec::SmallVec; +let items: SmallVec<[Item; 8]> = SmallVec::new(); + +// Conditional ownership +fn process(input: &str) -> Cow { + if needs_change { Cow::Owned(modify(input)) } + else { Cow::Borrowed(input) } +} + +// Pre-size +let mut results = Vec::with_capacity(items.len()); +let mut map = HashMap::with_capacity(expected_size); + +// Avoid format! in hot path +let mut buf = String::with_capacity(100); +write!(buf, "{}: {}", key, value)?; + +// Inline hot functions +#[inline] +fn hot_function() { /* ... */ } +``` + +### Profile-Guided Optimization (PGO) + +```bash +# Step 1: Build instrumented binary +RUSTFLAGS="-Cprofile-generate=/tmp/pgo-data" cargo build --release + +# Step 2: Run with representative workload +./target/release/binary +./target/release/binary + +# Step 3: Merge profile data +llvm-profdata merge -o /tmp/pgo-data/merged.profdata /tmp/pgo-data + +# Step 4: Build optimized binary +RUSTFLAGS="-Cprofile-use=/tmp/pgo-data/merged.profdata" cargo build --release +``` +**Typical gains:** 10-20% for hot paths +**When to use:** Production binaries, after other optimizations exhausted + +--- + +## Go + +### Profiling + +```bash +# Add to main.go +import _ "net/http/pprof" +go func() { http.ListenAndServe("localhost:6060", nil) }() + +# CPU +go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30 + +# Memory +go tool pprof http://localhost:6060/debug/pprof/heap + +# Goroutine/blocking +go tool pprof http://localhost:6060/debug/pprof/goroutine +go tool pprof http://localhost:6060/debug/pprof/block + +# Tracer +curl -o trace.out http://localhost:6060/debug/pprof/trace?seconds=5 +go tool trace trace.out + +# Escape analysis +go build -gcflags='-m -m' 2>&1 | grep "escapes to heap" +``` + +### Trouble Spots + +| Pattern | Problem | Fix | +|---------|---------|-----| +| `interface{}` | Boxing | Generics (1.18+), concrete | +| Small allocs in loops | GC pressure | `sync.Pool`, pre-allocate | +| `defer` in hot loops | Overhead | Move outside loop | +| String `+` | Allocs | `strings.Builder` | +| `[]byte` ↔ `string` | Copies | `unsafe` if safe | +| Slice append | Reallocations | `make([]T, 0, cap)` | +| Channel for single val | Overhead | Direct return or atomic | +| Mutex for read-heavy | Block all | `sync.RWMutex` | +| `fmt.Sprintf` hot path | Reflection | `strconv` functions | +| Goroutine per request | Scheduler | Worker pool | + +### Grep for Issues + +```bash +rg 'interface\{\}|any\b' --type go +rg '\+.*string|string.*\+' --type go +rg 'for.*\{' -A5 --type go | rg 'defer' +rg 'make\(chan.*,\s*[01]\)' --type go +rg 'var.*sync\.(Mutex|RWMutex)' --type go +rg 'fmt\.Sprintf' --type go +rg 'reflect\.' --type go +``` + +### Optimizations + +```go +// Pre-allocate +items := make([]Item, 0, expectedSize) + +// strings.Builder +var b strings.Builder +b.Grow(100) +b.WriteString(s1) +b.WriteString(s2) + +// sync.Pool +var bufPool = sync.Pool{New: func() interface{} { return new(bytes.Buffer) }} +buf := bufPool.Get().(*bytes.Buffer) +defer bufPool.Put(buf) +buf.Reset() + +// RWMutex for read-heavy +var mu sync.RWMutex +mu.RLock() +defer mu.RUnlock() + +// Atomic counters +var counter atomic.Int64 +counter.Add(1) + +// strconv over fmt +s := strconv.Itoa(n) // Not fmt.Sprintf("%d", n) +``` + +### GC Debugging + +```bash +# Trace GC activity +GODEBUG=gctrace=1 ./binary + +# Output format: +# gc 1 @0.012s 2%: 0.026+0.44+0.003 ms clock, 0.10+0.32/0.40/0+0.012 ms cpu, 4->4->0 MB, 5 MB goal, 4 P +# │ │ │ │ │ │ │ └── processors +# │ │ │ │ │ │ └── target heap +# │ │ │ │ │ └── heap before->after->live +# │ │ │ │ └── CPU times (assist/bg/idle mark) +# │ │ │ └── wall-clock times (sweep/mark/term) +# │ │ └── CPU % in GC +# │ └── time since start +# └── GC cycle number + +# Memory allocation tracking +GODEBUG=allocfreetrace=1 ./binary # Very verbose - every alloc/free + +# Schedule tracing (goroutine scheduling) +GODEBUG=schedtrace=1000 ./binary # Every 1000ms +``` +**Use when:** High GC pause times, memory pressure, allocation debugging + +### Race Detection + +```bash +# Build with race detector +go build -race ./... + +# Test with race detector (recommended) +go test -race ./... + +# Run with race detector +go run -race main.go +``` +**Note:** 10-20x slowdown, 5-10x memory overhead; use in CI, not production +**Finds:** Data races, concurrent map access, improper channel use + +--- + +## TypeScript + +### Profiling + +```bash +# V8 profiler +node --prof app.js && node --prof-process isolate-*.log > profile.txt + +# Chrome DevTools +node --inspect app.js +# Open chrome://inspect + +# clinic.js (best) +npm install -g clinic +clinic doctor -- node app.js +clinic flame -- node app.js +clinic bubbleprof -- node app.js + +# 0x flamegraphs +npm install -g 0x && 0x app.js + +# Event loop +const { monitorEventLoopDelay } = require('perf_hooks'); +const h = monitorEventLoopDelay({ resolution: 20 }); +h.enable(); +setInterval(() => console.log(h.percentile(99)), 1000); +``` + +### Trouble Spots + +| Pattern | Problem | Fix | +|---------|---------|-----| +| `JSON.parse/stringify` loop | CPU | Stream parsing, cache | +| Sync fs | Blocks event loop | `fs.promises` | +| `await` in loop | Sequential | `Promise.all()` | +| `.map().filter()` chain | Multiple passes | Single pass | +| `new Date()` hot path | Alloc | Cache timestamp | +| Regex without compile | Recompile | Const outside function | +| Object spread in loop | Copy | Mutate or pre-allocate | +| `console.log` production | I/O | Remove or log levels | +| `Array.includes` | O(n) | Use `Set` | + +### Grep for Issues + +```bash +rg 'fs\.(readFileSync|writeFileSync|existsSync)' --type ts +rg 'for.*await|while.*await' --type ts +rg 'JSON\.(parse|stringify)' --type ts +rg 'console\.(log|info|warn|error)' --type ts +rg 'new RegExp' --type ts +rg '\.(map|filter|reduce)\(.*\)\.(map|filter|reduce)' --type ts +``` + +### Optimizations + +```typescript +// Set for membership +const seen = new Set(); +if (seen.has(item)) { /* O(1) vs includes O(n) */ } + +// Parallel async +const results = await Promise.all(items.map(processAsync)); + +// Stream large JSON +import { createReadStream } from 'fs'; +import { parser } from 'stream-json'; +createReadStream('large.json').pipe(parser()).on('data', process); + +// Pre-compile regex +const PATTERN = /\d+/g; // Outside function + +// Map over object +const cache = new Map(); // Faster for dynamic keys + +// TypedArrays +const data = new Float64Array(1000); // Faster than number[] + +// Worker threads for CPU +import { Worker, isMainThread, parentPort } from 'worker_threads'; +``` + +--- + +## Python + +### Profiling + +```bash +# cProfile +python -m cProfile -s cumtime script.py > profile.txt + +# snakeviz (visual) +pip install snakeviz && python -m cProfile -o output.prof script.py && snakeviz output.prof + +# line_profiler (decorate with @profile) +pip install line_profiler && kernprof -l -v script.py + +# py-spy (no code changes, best) +pip install py-spy +py-spy record -o profile.svg -- python script.py +py-spy top --pid + +# memory_profiler +pip install memory_profiler && python -m memory_profiler script.py + +# scalene (CPU + memory + GPU) +pip install scalene && scalene script.py +``` + +### Trouble Spots + +| Pattern | Problem | Fix | +|---------|---------|-----| +| String `+=` in loop | O(n²) | `''.join()` | +| `list.append` loop | Resize | List comprehension | +| Global lookup | Slower | Cache in local | +| `in list` | O(n) | `set` | +| Attr access in loop | Dict lookup | Cache as local | +| `import` in function | Overhead | Module level | +| Object creation in loop | Allocs | Reuse or pool | +| `re.match()` | Recompiles | `re.compile()` | +| `pandas.iterrows()` | Extremely slow | Vectorize | + +### Grep for Issues + +```bash +rg 'for.*:' -A5 --type py | rg '\+=' # String concat +rg '\.append\(' --type py -c | sort -t: -k2 -rn +rg 'in \[|in list' --type py +rg '^\s+import |^\s+from .* import' --type py +rg 're\.(match|search|findall|sub)\(' --type py +rg '\.iterrows\(\)|\.itertuples\(\)' --type py +``` + +### Optimizations + +```python +# String join +result = ''.join(items) # Not += loop + +# List comprehension +result = [x * 2 for x in items] # Not append loop + +# Set for membership +valid = set(valid_items) +if item in valid: # O(1) + +# Local caching +def process(items): + local_func = expensive_module.func + for item in items: + local_func(item) + +# Generator for large data +def process_large(items): + for item in items: + yield transform(item) + +# Compile regex +PATTERN = re.compile(r'\d+') + +# __slots__ for many instances +class Point: + __slots__ = ['x', 'y'] + +# NumPy vectorize +np.arange(1000000) ** 2 # Not list comprehension + +# lru_cache +from functools import lru_cache +@lru_cache(maxsize=128) +def expensive(n): return compute(n) + +# Avoid pandas iteration +df['new'] = df['old'].apply(func) # Not iterrows +df['new'] = np.where(df['old'] > 0, df['old'] * 2, 0) # Better +``` + +### GC Debugging + +```python +import gc + +# Enable GC stats +gc.set_debug(gc.DEBUG_STATS) # Print collection stats + +# More verbose - show collectable objects +gc.set_debug(gc.DEBUG_COLLECTABLE) + +# Show uncollectable objects (reference cycles that can't be freed) +gc.set_debug(gc.DEBUG_UNCOLLECTABLE) + +# All debug flags +gc.set_debug(gc.DEBUG_STATS | gc.DEBUG_COLLECTABLE | gc.DEBUG_UNCOLLECTABLE) + +# Manual GC control +gc.disable() # Disable automatic GC +gc.collect() # Force collection +gc.enable() # Re-enable + +# Get GC stats +print(gc.get_stats()) # Generation stats +print(gc.get_count()) # Objects in each generation + +# Find reference cycles +gc.collect() # Collect first +print(gc.garbage) # Uncollectable objects (reference cycles with __del__) +``` +**Use when:** Memory leaks, high GC pause times, debugging reference cycles + +### objgraph (Visual Memory Debugging) + +```python +import objgraph + +# Find what's creating the most objects +objgraph.show_most_common_types(limit=20) + +# Find growth between two points +objgraph.show_growth() # Call multiple times to see delta + +# Find references to specific objects +objgraph.show_backrefs([obj], filename='refs.png') + +# Find reference chains (why isn't this GC'd?) +objgraph.find_backref_chain(obj, objgraph.is_proper_module) +``` +**Install:** `pip install objgraph` + +--- + +## Universal Patterns + +### Find Hot Loops + +```bash +rg 'for\s*\(|for\s+\w+\s+in|while\s*\(' --type-add 'code:*.{rs,go,ts,py}' -t code +``` + +### Nested Loops (O(n²)) + +```bash +rg 'for.*\{' -A20 | rg 'for.*\{' +``` + +### By Symptom + +| Symptom | Grep | +|---------|------| +| High CPU | `clone\|copy\|Clone\|deepcopy` | +| Memory growth | `append\|push\|Add\|\.add\(` | +| Lock contention | `Mutex\|Lock\|synchronized` | +| I/O bound | `read\|write\|fetch\|http` | +| GC pressure | `new \|make\(\|Box::new\|alloc` | +| Serialization | `JSON\|json\|serde\|marshal` | + +### Red Flags + +| Language | Red Flag | +|----------|----------| +| Rust | `.clone()` 50+ times, `Box` hot path, default hasher | +| Go | `interface{}` everywhere, no `sync.Pool`, `defer` in loops | +| TS | `JSON.parse` in handlers, `await` in loops, sync fs | +| Python | `+=` strings, `iterrows()`, `in list` | + +--- + +## Profiling Cheatsheet + +| Lang | CPU | Memory | Live | +|------|-----|--------|------| +| Rust | `cargo flamegraph` | `heaptrack` | `perf top` | +| Go | `pprof /profile` | `pprof /heap` | `pprof /goroutine` | +| TS | `clinic flame` | DevTools heap | `clinic doctor` | +| Python | `py-spy record` | `scalene` | `py-spy top` | diff --git a/.agents/skills/extreme-software-optimization/references/METHODOLOGY.md b/.agents/skills/extreme-software-optimization/references/METHODOLOGY.md new file mode 100644 index 00000000..53eb90c3 --- /dev/null +++ b/.agents/skills/extreme-software-optimization/references/METHODOLOGY.md @@ -0,0 +1,293 @@ +# Detailed Optimization Methodology + +> Step-by-step process for rigorous, provably correct performance optimization. + +## Phase A: Baseline + +### A1. Test Suite + +```bash +cargo test --release 2>&1 | tee baseline_tests.txt +grep -E "(FAILED|error)" baseline_tests.txt && echo "FIX TESTS FIRST" && exit 1 +``` + +### A2. Performance Metrics + +```bash +# Latency (p50/p95/p99) +hyperfine --warmup 3 --runs 30 --export-json baseline.json './binary ' +cat baseline.json | jq '.results[0].times | sort | + {p50: .[length/2], p95: .[length*0.95|floor], p99: .[length*0.99|floor]}' + +# Peak memory +/usr/bin/time -v ./binary 2>&1 | grep "Maximum resident" +``` + +### A3. Document + +```markdown +## Baseline (DATE) +| Metric | Value | +|--------|-------| +| p50 | X ms | +| p95 | X ms | +| p99 | X ms | +| Peak memory | X MB | +| Tests | PASS | +``` + +--- + +## Phase B: Profile + +### B1. CPU (Flamegraph) + +```bash +cargo flamegraph --root --release -- +# Alternative +perf record -g ./binary && perf script | inferno-collapse-perf | inferno-flamegraph > flame.svg +``` + +**Analysis:** Widest bars = most time. Deep stacks = call overhead. + +### B2. Allocation + +```bash +# DHAT +DHAT_LOG_FILE=dhat.out cargo +nightly run --release --features dhat-heap -- +dhat-viewer dhat.out + +# heaptrack +heaptrack ./binary +heaptrack_gui heaptrack.binary.*.zst +``` + +### B3. I/O + +```bash +strace -c ./binary +strace -T -e read,write,open,close ./binary 2>&1 | head -1000 +``` + +### B4. Hotspot Table + +```markdown +| Rank | Location | % Time | Category | +|------|----------|--------|----------| +| 1 | `file.rs:123` | 35% | CPU | +| 2 | `file.rs:456` | 22% | Alloc | +| 3 | `file.rs:789` | 15% | I/O | +``` + +--- + +## Phase C: Equivalence Oracle + +### C1. Golden Outputs + +```bash +for input in test_inputs/*; do + ./binary "$input" > "golden_outputs/$(basename $input).out" +done +sha256sum golden_outputs/* > golden_checksums.txt +``` + +### C2. Invariants + +Document: +1. **Ordering:** Results sorted by [field] +2. **Tie-breaking:** Equal items ordered by [secondary] +3. **Floating-point:** IEEE 754, no NaN +4. **RNG seeds:** Deterministic given seed X + +### C3. Property Tests + +```rust +use proptest::prelude::*; + +proptest! { + #[test] + fn deterministic(input in any::>()) { + assert_eq!(process(&input), process(&input)); + } + + #[test] + fn ordering_preserved(items in prop::collection::vec(any::(), 0..1000)) { + let result = process(&items); + assert!(result.windows(2).all(|w| w[0] <= w[1])); + } +} +``` + +--- + +## Phase D: Isomorphism Proof + +### Template + +```markdown +## Change: [description] + +### What Changes +- Before: [code/behavior] +- After: [code/behavior] + +### Proof +1. **I/O Equivalence:** Same inputs → same outputs because [reason] +2. **Ordering:** Preserved because [reason or N/A] +3. **Tie-breaking:** Unchanged because [reason or N/A] +4. **Floating-point:** [identical/N/A] +5. **RNG:** [unchanged/N/A] + +### Verification +- [ ] `sha256sum -c golden_checksums.txt` +- [ ] `cargo test` +- [ ] `diff <(./old input) <(./new input)` +``` + +### Common Proofs + +| Pattern | Proof | +|---------|-------| +| Memoization | Pure function, same results cached | +| Index lookup | Same data, different access pattern | +| Batching | Same operations, collected in order | +| Parallelization | Commutative/associative OR sorted merge | + +--- + +## Phase E: Opportunity Matrix + +### Scoring + +``` +Score = (Impact × Confidence) / Effort + +Impact (1-5): 5=>50%+, 4=25-50%, 3=10-25%, 2=5-10%, 1=<5% +Confidence (1-5): 5=profiler confirms, 3=likely, 1=speculative +Effort (1-5): 5=>1 day, 3=hours, 1=minutes +``` + +### Matrix + +| Opportunity | Impact | Conf | Effort | Score | +|-------------|--------|------|--------|-------| +| HashMap lookup | 4 | 5 | 2 | 10.0 | +| Memoize `expensive_fn` | 3 | 4 | 2 | 6.0 | +| Batch queries | 3 | 3 | 3 | 3.0 | + +**Rule:** Only implement Score ≥ 2.0 + +--- + +## Phase F: Implementation + +### One Lever Per Change + +```bash +git checkout -b perf/add-hashmap-index +# Make ONLY the optimization change +# NO: refactoring, cleanup, style +git diff --stat # Minimal files +``` + +### Checklist + +- [ ] Single technique applied +- [ ] No unrelated refactors +- [ ] Commit message explains perf rationale + +### Rollback Plan + +```markdown +## Rollback +- Command: `git revert ` +- Risk: None / Low / Medium +- Post-rollback tests: [list] +``` + +--- + +## Phase G: Regression Guardrails + +### Benchmarks + +```rust +use criterion::{criterion_group, criterion_main, Criterion}; + +fn bench_critical(c: &mut Criterion) { + let input = setup_input(); + c.bench_function("critical_function", |b| b.iter(|| critical_function(&input))); +} + +criterion_group!(benches, bench_critical); +criterion_main!(benches); +``` + +### CI Gate + +```yaml +- name: Check regression + run: | + cargo bench -- --baseline main --save-baseline current + cargo benchcmp main current --threshold 10 # Fail if >10% regression +``` + +### Monitoring + +```rust +use metrics::{histogram, counter}; + +fn critical_function(input: &Input) -> Output { + let start = Instant::now(); + let result = do_work(input); + histogram!("critical_function_ms", start.elapsed().as_millis() as f64); + result +} +``` + +--- + +## Iteration Protocol + +After each cycle: +1. **Re-baseline** → new metrics +2. **Re-profile** → new hotspots (bottlenecks shift) +3. **Update matrix** → recalculate scores +4. **Repeat** → until no Score ≥ 2.0 + +```markdown +## History +| Round | Change | p95 Before | p95 After | Δ | +|-------|--------|------------|-----------|---| +| 1 | HashMap | 50ms | 35ms | -30% | +| 2 | Memoize | 35ms | 28ms | -20% | +``` + +--- + +## Command Reference + +```bash +# Profile +cargo flamegraph --root --release -- +heaptrack ./binary +strace -c ./binary + +# Benchmark +hyperfine --warmup 3 --runs 30 './binary ' +cargo bench + +# Memory +/usr/bin/time -v ./binary +valgrind --tool=massif ./binary + +# Verify +sha256sum -c golden_checksums.txt +cargo test +diff <(./old input) <(./new input) + +# Git +git checkout -b perf/description +git revert +``` diff --git a/.agents/skills/extreme-software-optimization/references/TECHNIQUES.md b/.agents/skills/extreme-software-optimization/references/TECHNIQUES.md new file mode 100644 index 00000000..026042e2 --- /dev/null +++ b/.agents/skills/extreme-software-optimization/references/TECHNIQUES.md @@ -0,0 +1,488 @@ +# Optimization Techniques Catalog + +> Scan for applicable patterns after profiling identifies hotspots. + +## Contents + +1. [I/O & Network](#io--network) +2. [Memory & Allocation](#memory--allocation) +3. [Concurrency](#concurrency) +4. [Algorithms](#algorithms) +5. [Data Structures](#data-structures) +6. [Caching](#caching) +7. [Serialization](#serialization) +8. [Strings](#strings) + +--- + +## I/O & Network + +### N+1 Elimination + +```rust +// BAD: N round-trips +for id in ids { db.get(id).await; } + +// GOOD: 1 round-trip +let items = db.get_many(&ids).await; +``` +**Isomorphism:** Same results, order may change unless preserved. + +### Buffer Reuse + +```rust +// BAD +loop { let buf = vec![0u8; 4096]; file.read(&mut buf)?; } + +// GOOD +let mut buf = vec![0u8; 4096]; +loop { file.read(&mut buf)?; } +``` + +### Vectored I/O + +```rust +// BAD: Multiple syscalls +socket.write(&header)?; socket.write(&body)?; + +// GOOD: Single syscall +let iov = [IoSlice::new(&header), IoSlice::new(&body)]; +socket.write_vectored(&iov)?; +``` + +### Async Batching + +```rust +// BAD: Sequential +for item in items { process(item).await; } + +// GOOD: Parallel +futures::future::join_all(items.iter().map(process)).await; + +// BETTER: Bounded concurrency +futures::stream::iter(items).map(process).buffer_unordered(10).collect().await; +``` + +### Bounded Queues + +```rust +// BAD: Unbounded (memory blowup) +let (tx, rx) = mpsc::unbounded_channel(); + +// GOOD: Backpressure +let (tx, rx) = mpsc::channel(1000); +``` + +--- + +## Memory & Allocation + +### Pooling + +```rust +let pool = Pool::new(|| expensive_create(), 10); +let obj = pool.get(); // Reuse, don't create +``` +**Libraries:** `deadpool`, `bb8`, `r2d2` + +### Arena Allocation + +```rust +let arena = bumpalo::Bump::new(); +for _ in 0..1000 { arena.alloc_str("item"); } // Fast bump +// All freed when arena drops +``` +**Libraries:** `bumpalo`, `typed-arena` + +### SmallVec + +```rust +use smallvec::SmallVec; +let items: SmallVec<[Item; 8]> = SmallVec::new(); // Stack up to 8 +``` + +### Cow + +```rust +fn process(input: &str) -> Cow { + if needs_change(input) { Cow::Owned(modify(input)) } + else { Cow::Borrowed(input) } // Zero-copy +} +``` + +### SoA Layout + +```rust +// AoS - poor cache locality +struct Point { x: f32, y: f32, z: f32 } +let points: Vec; + +// SoA - excellent for field iteration +struct Points { xs: Vec, ys: Vec, zs: Vec } +``` + +--- + +## Concurrency + +### Sharded Locks + +```rust +// BAD: Single contention point +let map = Mutex::new(HashMap::new()); + +// GOOD: 16 shards +let shards: [Mutex>; 16]; +fn shard(key: &K) -> usize { hash(key) % 16 } +``` +**Libraries:** `dashmap`, `flurry` + +### Lock-Free + +```rust +use crossbeam::queue::SegQueue; +let queue = SegQueue::new(); // Lock-free MPMC +``` +**Libraries:** `crossbeam`, `parking_lot` + +### Work-Stealing + +```rust +rayon::scope(|s| { + s.spawn(|s| recursive_task(s)); // Automatic load balancing +}); +``` + +--- + +## Algorithms + +### Binary Search + +```rust +// On data +let idx = data.binary_search(&target); + +// On answer space (parametric) +let answer = (lo..hi).binary_search_by(|mid| { + if predicate(mid) { Ordering::Less } else { Ordering::Greater } +}); +``` +**O(n) → O(log n)** + +### Two-Pointer + +```rust +fn two_sum_sorted(arr: &[i32], target: i32) -> Option<(usize, usize)> { + let (mut lo, mut hi) = (0, arr.len() - 1); + while lo < hi { + match (arr[lo] + arr[hi]).cmp(&target) { + Ordering::Equal => return Some((lo, hi)), + Ordering::Less => lo += 1, + Ordering::Greater => hi -= 1, + } + } + None +} +``` +**O(n²) → O(n)** + +### Sliding Window + +```rust +fn max_sum_k(arr: &[i32], k: usize) -> i32 { + let mut sum: i32 = arr[..k].iter().sum(); + let mut max = sum; + for i in k..arr.len() { + sum += arr[i] - arr[i - k]; + max = max.max(sum); + } + max +} +``` + +### Prefix Sums + +```rust +// Build O(n), query O(1) +let prefix: Vec = arr.iter().scan(0, |acc, &x| { *acc += x; Some(*acc) }).collect(); +fn range_sum(prefix: &[i64], l: usize, r: usize) -> i64 { + prefix[r] - if l > 0 { prefix[l - 1] } else { 0 } +} +``` + +### Union-Find + +```rust +struct UnionFind { parent: Vec, rank: Vec } +impl UnionFind { + fn find(&mut self, x: usize) -> usize { + if self.parent[x] != x { self.parent[x] = self.find(self.parent[x]); } + self.parent[x] + } + fn union(&mut self, x: usize, y: usize) { + let (rx, ry) = (self.find(x), self.find(y)); + if rx != ry { + match self.rank[rx].cmp(&self.rank[ry]) { + Ordering::Less => self.parent[rx] = ry, + Ordering::Greater => self.parent[ry] = rx, + Ordering::Equal => { self.parent[ry] = rx; self.rank[rx] += 1; } + } + } + } +} +``` +**O(α(n)) per operation** + +### Dijkstra + +```rust +fn dijkstra(graph: &Graph, start: Node) -> HashMap { + let mut dist = HashMap::new(); + let mut heap = BinaryHeap::new(); + dist.insert(start, 0); + heap.push(Reverse((0, start))); + while let Some(Reverse((d, u))) = heap.pop() { + if d > *dist.get(&u).unwrap_or(&Cost::MAX) { continue; } + for (v, weight) in graph.edges(u) { + let new_dist = d + weight; + if new_dist < *dist.get(&v).unwrap_or(&Cost::MAX) { + dist.insert(v, new_dist); + heap.push(Reverse((new_dist, v))); + } + } + } + dist +} +``` + +### Topological Sort (Kahn's Algorithm) + +```rust +fn topological_sort(graph: &Graph) -> Option> { + let mut in_degree: HashMap = HashMap::new(); + for node in graph.nodes() { + in_degree.entry(node).or_insert(0); + for neighbor in graph.neighbors(node) { + *in_degree.entry(neighbor).or_insert(0) += 1; + } + } + + let mut queue: VecDeque = in_degree.iter() + .filter(|(_, &d)| d == 0) + .map(|(&n, _)| n) + .collect(); + + let mut result = Vec::with_capacity(graph.node_count()); + while let Some(node) = queue.pop_front() { + result.push(node); + for neighbor in graph.neighbors(node) { + let deg = in_degree.get_mut(&neighbor).unwrap(); + *deg -= 1; + if *deg == 0 { queue.push_back(neighbor); } + } + } + + if result.len() == graph.node_count() { Some(result) } else { None } // None = cycle +} +``` +**Use when:** DAG processing, dependency resolution, build systems +**O(V + E)** + +### Graph Traversal with Early Termination + +```rust +// BFS with early exit - find first match +fn bfs_find(graph: &Graph, start: Node, predicate: F) -> Option +where F: Fn(&Node) -> bool +{ + let mut visited = HashSet::new(); + let mut queue = VecDeque::new(); + queue.push_back(start); + visited.insert(start); + + while let Some(node) = queue.pop_front() { + if predicate(&node) { return Some(node); } // Early exit + for neighbor in graph.neighbors(node) { + if visited.insert(neighbor) { + queue.push_back(neighbor); + } + } + } + None +} + +// DFS with early exit - find any path +fn dfs_path(graph: &Graph, start: Node, goal: Node) -> Option> { + let mut visited = HashSet::new(); + let mut path = Vec::new(); + + fn dfs(graph: &Graph, node: Node, goal: Node, visited: &mut HashSet, path: &mut Vec) -> bool { + if node == goal { path.push(node); return true; } + if !visited.insert(node) { return false; } + path.push(node); + for neighbor in graph.neighbors(node) { + if dfs(graph, neighbor, goal, visited, path) { return true; } + } + path.pop(); + false + } + + if dfs(graph, start, goal, &mut visited, &mut path) { Some(path) } else { None } +} +``` +**Pattern:** Return early when condition met; avoid visiting entire graph +**Use when:** Finding existence, first match, any valid path + +--- + +## Data Structures + +### Selection Matrix + +| Access Pattern | Structure | Complexity | +|----------------|-----------|------------| +| Key → Value | `HashMap` | O(1) avg | +| Ordered iteration | `BTreeMap` | O(log n) | +| Range queries | `BTreeMap` | O(log n + k) | +| Prefix matching | Trie | O(key length) | +| Membership (approx) | Bloom filter | O(k) | +| Min/max extraction | `BinaryHeap` | O(log n) | +| FIFO | `VecDeque` | O(1) | +| Set operations | `HashSet` | O(n) | + +### Trie + +```rust +use radix_trie::Trie; +let mut trie = Trie::new(); +trie.insert("hello", 1); +for (k, v) in trie.iter_prefix("hel") { /* ... */ } +``` +**Libraries:** `radix_trie`, `fst` + +### Bloom Filter + +```rust +let mut filter = BloomFilter::new(1000, 0.01); // 1% false positive +filter.insert(&"item"); +if filter.contains(&"item") { /* maybe present */ } +``` +**Libraries:** `bloom`, `probabilistic-collections` + +--- + +## Caching + +### LRU + +```rust +use lru::LruCache; +let mut cache = LruCache::new(NonZeroUsize::new(100).unwrap()); +cache.put("key", expensive_compute()); +``` +**Libraries:** `lru`, `cached` + +### Memoization + +```rust +use cached::proc_macro::cached; +#[cached(size = 100, time = 60)] // 100 entries, 60s TTL +fn expensive(x: u64) -> u64 { heavy_computation(x) } +``` + +**Invalidation:** TTL, LRU, write-through, cache-aside + +--- + +## Serialization + +### Format Comparison + +| Format | Parse | Size | Schema | +|--------|-------|------|--------| +| bincode | Fastest | Small | No | +| MessagePack | Fast | Small | No | +| protobuf | Fast | Small | Yes | +| simd-json | Medium | Large | No | +| serde_json | Slow | Large | No | + +**Rule:** `bincode`/`rkyv` internal, JSON external only. + +### Zero-Copy + +```rust +use rkyv::{Archive, Deserialize, Serialize}; +#[derive(Archive, Deserialize, Serialize)] +struct Data { values: Vec } + +let archived = rkyv::check_archived_root::(&bytes).unwrap(); +println!("{}", archived.values[0]); // Direct memory access +``` +**Libraries:** `rkyv`, `zerocopy` + +--- + +## Strings + +### Interning + +```rust +use string_interner::{StringInterner, DefaultSymbol}; +let mut interner = StringInterner::default(); +let sym1 = interner.get_or_intern("hello"); +let sym2 = interner.get_or_intern("hello"); +assert_eq!(sym1, sym2); // O(1) comparison +``` + +### Regex + +```rust +// BAD: Compile per iteration +for line in lines { Regex::new(r"\d+").unwrap().find(line); } + +// GOOD: Compile once +lazy_static! { static ref RE: Regex = Regex::new(r"\d+").unwrap(); } +for line in lines { RE.find(line); } + +// BETTER: RegexSet for multiple patterns +let set = RegexSet::new(&[r"\d+", r"\w+", r"[a-z]+"]).unwrap(); +``` + +### SIMD Search + +```rust +use memchr::memmem; +let finder = memmem::Finder::new(b"pattern"); +if let Some(pos) = finder.find(haystack) { /* ... */ } +``` +**Libraries:** `memchr`, `aho-corasick` + +--- + +## Applicability Checks + +### DP +- [ ] Overlapping subproblems? → Memoize +- [ ] Optimal partitioning? → Interval DP +- [ ] DAG with repeated traversal? → Topological DP + +### Data Structure Selection +- [ ] Point lookups? → HashMap +- [ ] Range queries? → BTreeMap / Segment tree +- [ ] Prefix ops? → Trie +- [ ] Approximate membership? → Bloom filter + +--- + +## Library Quick Reference + +| Category | Libraries | +|----------|-----------| +| Hashing | `ahash`, `rustc-hash` | +| Concurrency | `rayon`, `crossbeam` | +| Serialization | `bincode`, `rkyv` | +| Strings | `memchr`, `aho-corasick` | +| Collections | `smallvec`, `indexmap` | +| Caching | `lru`, `cached` | +| Allocation | `bumpalo`, `typed-arena` | diff --git a/.agents/skills/final-verify/SKILL.md b/.agents/skills/final-verify/SKILL.md new file mode 100644 index 00000000..15943c67 --- /dev/null +++ b/.agents/skills/final-verify/SKILL.md @@ -0,0 +1,154 @@ +--- +name: final-verify +description: Enforces fresh verification evidence before any completion, fix, or passing claim, and before commits or PR creation. Use when an agent is about to report success, hand off work, or commit code. Do not use for early planning, brainstorming, or tasks that have not yet reached a concrete verification step. +--- + +# Verification Before Completion + +## Overview + +Claiming work is complete without verification is dishonesty, not efficiency. + +**Core principle:** Evidence before claims, always. + +**Violating the letter of this rule is violating the spirit of this rule.** + +## The Iron Law + +``` +NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE +``` + +If the verification command has not been run in the current message, the result cannot be claimed. + +## The Gate Function + +``` +BEFORE claiming any status or expressing satisfaction: + +1. IDENTIFY: What command proves this claim? +2. RUN: Execute the FULL command (fresh, complete) +3. READ: Full output, check exit code, count failures +4. VERIFY: Does output confirm the claim? + - If NO: State actual status with evidence + - If YES: State claim WITH evidence +5. ONLY THEN: Make the claim + +Skip any step = lying, not verifying +``` + +## Scope of Verification + +Match the verification scope to the claim scope: + +- **Narrow claim** (e.g., "this test passes"): Run the specific test. +- **Broad claim** (e.g., "task complete", "ready to commit"): Run the **full verification pipeline** — formatting, linting, all tests, and build. If the project defines a single gate command (e.g., `make verify`), run that. + +A narrow verification does not support a broad claim. Running `make test` alone does not justify "task complete." Running the linter alone does not justify "ready to commit." The verification scope must be equal to or broader than the claim scope. + +**If in doubt, run the full pipeline.** Over-verification wastes minutes. Under-verification wastes hours. + +**Passing pipeline != meeting requirements.** A green build proves the code compiles, lints, and passes existing tests. It does not prove the implementation matches the requirements. For "task complete" or "requirements met" claims, also verify the deliverables against the original specification — line by line, not by assumption. + +## Common Failures + +| Claim | Requires | Not Sufficient | +| --------------------- | ------------------------------- | ------------------------------ | +| Tests pass | Test command output: 0 failures | Previous run, "should pass" | +| Linter clean | Linter output: 0 errors | Partial check, extrapolation | +| Build succeeds | Build command: exit 0 | Linter passing, logs look good | +| Bug fixed | Test original symptom: passes | Code changed, assumed fixed | +| Regression test works | Red-green cycle verified | Test passes once | +| Agent completed | VCS diff shows changes | Agent reports "success" | +| Requirements met | Line-by-line checklist | Tests passing | + +## Red Flags + +- Using "should", "probably", or "seems to" +- Expressing satisfaction before verification +- About to commit, push, or open a PR without verification +- Trusting another agent's success report +- Relying on partial verification +- Thinking "just this once" +- Any wording that implies success without current evidence + +## Rationalization Prevention + +| Excuse | Reality | +| --------------------------------------- | ---------------------- | +| "Should work now" | Run the verification | +| "I'm confident" | Confidence ≠ evidence | +| "Just this once" | No exceptions | +| "Linter passed" | Linter ≠ compiler | +| "Agent said success" | Verify independently | +| "I'm tired" | Exhaustion ≠ excuse | +| "Partial check is enough" | Partial proves nothing | +| "Different words so rule doesn't apply" | Spirit over letter | + +## When To Apply + +Apply this skill before: + +- any success or completion claim +- any expression of satisfaction with the implementation state +- any commit or PR creation +- any handoff that implies correctness +- moving to the next task based on completion + +## Pre-Commit and Pre-PR Gate + +Commits and PRs are permanent artifacts. They require the highest verification standard. + +**Before `git commit`:** +1. Run the full verification pipeline (e.g., `make verify`). Not a subset. The full pipeline. +2. Confirm zero errors, zero warnings, zero test failures in the output. +3. Produce a Verification Report (see template below) with verdict PASS. +4. Only then run `git commit`. + +**Before creating a PR:** +1. All of the above, plus: +2. Verify the diff matches the intended changes (`git diff` review). +3. Confirm no unrelated files are staged. + +If the full pipeline has not passed in this session after the last code change, the commit or PR must not proceed. + +## Verification Report Template + +Verification is not complete until the agent **cites actual command output** in their response. "I ran it and it passed" is not evidence. If the verification output is not shown, the verification did not happen. + +Every verification must be reported using this structure. Do not deviate. + +``` +VERIFICATION REPORT +------------------- +Claim: [What is being claimed — e.g., "tests pass", "build succeeds", "task complete"] +Command: [Exact command run — e.g., `make verify`] +Executed: [Timestamp or "just now, after all changes"] +Exit code: [0 or non-zero] +Output summary: [Key lines from output — pass count, error count, build result] +Warnings: [Any warnings, or "none"] +Errors: [Any errors, or "none"] +Verdict: PASS or FAIL +``` + +If the verdict is FAIL, do not use completion language. State what failed and what remains. + +If the verdict is PASS, the claim may proceed — but only the specific claim supported by the evidence. "Tests pass" does not mean "build succeeds." + +## When Verification Fails + +Verification failure is not a dead end. It is information. Follow this protocol: + +1. **Read the failure.** Identify the exact error: which command failed, which test, which lint rule, which build error. Quote the relevant output lines. +2. **Diagnose the root cause.** Do not guess. Read the error message. Trace it to the source. If multiple things failed, address them one at a time starting with the first failure. +3. **Fix the root cause.** Apply the minimal change that addresses the actual error. Do not apply workarounds, suppress warnings, or skip checks. +4. **Re-verify from scratch.** Run the full verification command again. Do not assume the fix worked. Do not run only the previously-failing subset. +5. **Report with evidence.** Use the Verification Report Template. If it passes now, the claim may proceed. If it fails again, return to step 1. + +**Never:** +- Claim partial success ("3 of 4 checks pass, close enough") +- Skip re-verification after a fix ("I fixed the error, so it should pass now") +- Blame the tooling ("the linter is wrong") without evidence of a false positive +- Move on to the next task while verification is still failing + +If the correct verification command is unclear, identify it before making any completion claim. If only partial verification is available, state that limitation explicitly and avoid completion language. diff --git a/.agents/skills/find-skills/SKILL.md b/.agents/skills/find-skills/SKILL.md new file mode 100644 index 00000000..c797184e --- /dev/null +++ b/.agents/skills/find-skills/SKILL.md @@ -0,0 +1,133 @@ +--- +name: find-skills +description: Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill. +--- + +# Find Skills + +This skill helps you discover and install skills from the open agent skills ecosystem. + +## When to Use This Skill + +Use this skill when the user: + +- Asks "how do I do X" where X might be a common task with an existing skill +- Says "find a skill for X" or "is there a skill for X" +- Asks "can you do X" where X is a specialized capability +- Expresses interest in extending agent capabilities +- Wants to search for tools, templates, or workflows +- Mentions they wish they had help with a specific domain (design, testing, deployment, etc.) + +## What is the Skills CLI? + +The Skills CLI (`npx skills`) is the package manager for the open agent skills ecosystem. Skills are modular packages that extend agent capabilities with specialized knowledge, workflows, and tools. + +**Key commands:** + +- `npx skills find [query]` - Search for skills interactively or by keyword +- `npx skills add ` - Install a skill from GitHub or other sources +- `npx skills check` - Check for skill updates +- `npx skills update` - Update all installed skills + +**Browse skills at:** https://skills.sh/ + +## How to Help Users Find Skills + +### Step 1: Understand What They Need + +When a user asks for help with something, identify: + +1. The domain (e.g., React, testing, design, deployment) +2. The specific task (e.g., writing tests, creating animations, reviewing PRs) +3. Whether this is a common enough task that a skill likely exists + +### Step 2: Search for Skills + +Run the find command with a relevant query: + +```bash +npx skills find [query] +``` + +For example: + +- User asks "how do I make my React app faster?" → `npx skills find react performance` +- User asks "can you help me with PR reviews?" → `npx skills find pr review` +- User asks "I need to create a changelog" → `npx skills find changelog` + +The command will return results like: + +``` +Install with npx skills add + +vercel-labs/agent-skills@vercel-react-best-practices +└ https://skills.sh/vercel-labs/agent-skills/vercel-react-best-practices +``` + +### Step 3: Present Options to the User + +When you find relevant skills, present them to the user with: + +1. The skill name and what it does +2. The install command they can run +3. A link to learn more at skills.sh + +Example response: + +``` +I found a skill that might help! The "vercel-react-best-practices" skill provides +React and Next.js performance optimization guidelines from Vercel Engineering. + +To install it: +npx skills add vercel-labs/agent-skills@vercel-react-best-practices + +Learn more: https://skills.sh/vercel-labs/agent-skills/vercel-react-best-practices +``` + +### Step 4: Offer to Install + +If the user wants to proceed, you can install the skill for them: + +```bash +npx skills add -g -y +``` + +The `-g` flag installs globally (user-level) and `-y` skips confirmation prompts. + +## Common Skill Categories + +When searching, consider these common categories: + +| Category | Example Queries | +| --------------- | ---------------------------------------- | +| Web Development | react, nextjs, typescript, css, tailwind | +| Testing | testing, jest, playwright, e2e | +| DevOps | deploy, docker, kubernetes, ci-cd | +| Documentation | docs, readme, changelog, api-docs | +| Code Quality | review, lint, refactor, best-practices | +| Design | ui, ux, design-system, accessibility | +| Productivity | workflow, automation, git | + +## Tips for Effective Searches + +1. **Use specific keywords**: "react testing" is better than just "testing" +2. **Try alternative terms**: If "deploy" doesn't work, try "deployment" or "ci-cd" +3. **Check popular sources**: Many skills come from `vercel-labs/agent-skills` or `ComposioHQ/awesome-claude-skills` + +## When No Skills Are Found + +If no relevant skills exist: + +1. Acknowledge that no existing skill was found +2. Offer to help with the task directly using your general capabilities +3. Suggest the user could create their own skill with `npx skills init` + +Example: + +``` +I searched for skills related to "xyz" but didn't find any matches. +I can still help you with this task directly! Would you like me to proceed? + +If this is something you do often, you could create your own skill: +npx skills init my-xyz-skill +``` diff --git a/.agents/skills/fix-coderabbit-review/SKILL.md b/.agents/skills/fix-coderabbit-review/SKILL.md new file mode 100644 index 00000000..f92682de --- /dev/null +++ b/.agents/skills/fix-coderabbit-review/SKILL.md @@ -0,0 +1,116 @@ +--- +name: fix-coderabbit-review +description: End-to-end remediation workflow for PR review feedback by PR number. Use when Codex must export CodeRabbit issues for a PR, fix every issue completely, commit all fixes in a single commit, and resolve GitHub review threads afterward. +--- + +# Fix CodeRabbit Review + +Execute PR review remediation in a strict sequence: export issues, fix all issues, commit once, resolve threads. + +Core principle: evaluate each review item technically before changing code. Do not apply suggestions blindly. + +## Required Inputs + +- PR number (integer). +- `GITHUB_TOKEN` in environment. +- `gh` authenticated for the target repository. + +## Workflow + +1. Export review issues for the PR. +2. Triage and validate every unresolved issue. +3. Fix every validated issue completely. +4. Commit all remediation changes together in one commit. +5. Resolve review threads and mark exported issues resolved. + +Run commands from repository root. + +## Step 1: Export CodeRabbit Issues + +Use bundled exporter script: + +```bash +PR_NUMBER= +uv run .claude/skills/fix-coderabbit-review/scripts/pr_review.py "$PR_NUMBER" --hide-resolved +``` + +Read generated files in: + +- `ai-docs/reviews-pr-/_summary.md` +- `ai-docs/reviews-pr-/issues/*.md` + +If `_summary.md` shows unresolved issues, continue until all are addressed in code. + +## Step 2: Triage and Validate Issues + +Review each unresolved issue file before implementation. + +For each issue: + +1. Restate the concrete technical change required. +2. Verify against current codebase behavior and tests. +3. Decide one of: + - `VALID`: suggestion is correct and should be implemented. + - `INVALID`: suggestion is incorrect or not actionable for this codebase. + +Rules: + +- If an issue is ambiguous, treat it as `INVALID`, document rationale and assumptions in the issue file, and continue execution. +- If an issue is `INVALID`, document technical rationale directly in the issue file and do not force a bad change. +- Prefer technical evidence over agreement language. + +## Step 3: Fix Issues Completely + +Process all unresolved issue files under `ai-docs/reviews-pr-/issues/`. + +- Implement production-quality fixes in source code. +- Add or update tests so each fix is verified. +- Execute fixes one issue at a time and validate each before moving to the next. +- Do not leave partial fixes. +- Do not skip issues unless they are invalid; for invalid issues, keep rationale in the issue file. + +After finishing all issue fixes, run full verification before commit: + +```bash +pnpm run lint +pnpm run typecheck +pnpm run test +``` + +## Step 4: Commit All Fixes Together + +Create exactly one remediation commit containing all related code, test, and issue-tracking changes. + +```bash +git add -A +git commit -m "fix(repo): resolve PR # review issues" +``` + +Do not split fixes across multiple commits. + +## Step 5: Resolve Review Threads + +After the single commit is created, resolve exported issue threads. + +Determine the issue range from issue files (example: `001` to `018`) and run: + +```bash +uv run .claude/skills/fix-coderabbit-review/scripts/resolve_pr_issues.py \ + --pr-dir ai-docs/reviews-pr- \ + --from \ + --to +``` + +Re-open `ai-docs/reviews-pr-/_summary.md` and confirm unresolved count is `0`. + +If thread resolution fails for specific IDs, keep those issues marked unresolved and report exact failures instead of claiming completion. + +## Output Contract + +Deliver: + +- One commit containing all remediation changes. +- Per-issue technical disposition (`VALID` or `INVALID`) recorded during triage. +- Updated `ai-docs/reviews-pr-/issues/*.md` statuses. +- Updated `ai-docs/reviews-pr-/_summary.md` counts/checklist. +- Resolved review threads for addressed issues. diff --git a/.agents/skills/fix-coderabbit-review/agents/openai.yaml b/.agents/skills/fix-coderabbit-review/agents/openai.yaml new file mode 100644 index 00000000..fbe24ad3 --- /dev/null +++ b/.agents/skills/fix-coderabbit-review/agents/openai.yaml @@ -0,0 +1,3 @@ +display_name: Fix CodeRabbit Review +short_description: Export CodeRabbit issues, fix all, commit once, resolve threads. +default_prompt: Remediate PR #{pr_number}: export CodeRabbit review issues, fix every issue completely, commit all fixes in a single commit, and resolve review threads. diff --git a/.agents/skills/fix-coderabbit-review/scripts/pr_review.py b/.agents/skills/fix-coderabbit-review/scripts/pr_review.py new file mode 100755 index 00000000..920f69bd --- /dev/null +++ b/.agents/skills/fix-coderabbit-review/scripts/pr_review.py @@ -0,0 +1,994 @@ +#!/usr/bin/env python3 +# /// script +# requires-python = ">=3.10" +# dependencies = ["httpx", "python-dotenv"] +# /// +""" +PR Review Exporter — Python port of pr-review.ts + +Fetches CodeRabbit AI review comments from a GitHub PR and generates +markdown issue files for remediation workflows. + +Usage: + uv run pr_review.py [--hide-resolved] [--grouped] + [--skip-outdated] [--unresolve-missing-marker] + [--resolution-policy=github|strict] +""" + +from __future__ import annotations + +import argparse +import os +import re +import subprocess +import sys +import time +from dataclasses import dataclass, field +from datetime import datetime, timezone +from pathlib import Path +from zoneinfo import ZoneInfo + +import httpx +from dotenv import load_dotenv + +# ---------- Constants ---------- +CODERABBIT_BOT_LOGIN = "coderabbitai[bot]" +ADDRESSED_MARKER = "\u2705 Addressed in commit" +GITHUB_REST_BASE = "https://api.github.com" +GITHUB_GRAPHQL_URL = "https://api.github.com/graphql" +GQL_PAGE_SIZE = 100 + +DetailSection = str # "nitpick" | "outside" | "duplicate" + + +# ---------- Data classes ---------- +@dataclass +class ReviewComment: + id: int + node_id: str + body: str + user_login: str + created_at: str + path: str + line: int | None + position: int | None = None + original_position: int | None = None + outdated: bool | None = None + + +@dataclass +class IssueComment: + body: str + user_login: str + created_at: str + + +@dataclass +class SimpleReviewComment: + id: int + body: str + user_login: str + created_at: str + state: str + + +@dataclass +class ThreadComment: + id: str # GraphQL relay/global ID + database_id: int | None + body: str + author_login: str | None + created_at: str + + +@dataclass +class ReviewThread: + id: str + is_resolved: bool + comments: list[ThreadComment] = field(default_factory=list) + + +@dataclass +class GroupedFile: + file_path: str + relative_path: str + display_path: str + entries: list[str] = field(default_factory=list) + index: int = 0 + + +@dataclass +class ExtractedInfo: + file: str + resolved: bool + summary_path: str + section: DetailSection + + +# ---------- HTTP helpers ---------- +def _parse_next_link(link_header: str) -> str | None: + """Parse the 'next' URL from a GitHub Link header.""" + for part in link_header.split(","): + if 'rel="next"' in part: + m = re.search(r"<([^>]+)>", part) + if m: + return m.group(1) + return None + + +def paginate_rest(client: httpx.Client, url: str, params: dict | None = None) -> list[dict]: + """Fetch all pages from a GitHub REST endpoint following Link headers.""" + results: list[dict] = [] + params = dict(params or {}) + params.setdefault("per_page", 100) + next_url: str | None = url + next_params: dict | None = params + while next_url: + resp = client.get(next_url, params=next_params) + if resp.status_code == 429: + retry_after = int(resp.headers.get("Retry-After", "5")) + print(f" Rate limited, waiting {retry_after}s ...") + time.sleep(retry_after) + continue + resp.raise_for_status() + results.extend(resp.json()) + # After first request, params are embedded in the Link URL + next_params = None + link = resp.headers.get("link", "") + next_url = _parse_next_link(link) + return results + + +def graphql_request(client: httpx.Client, query: str, variables: dict) -> dict: + """Execute a GitHub GraphQL query/mutation.""" + resp = client.post( + GITHUB_GRAPHQL_URL, + json={"query": query, "variables": variables}, + ) + if resp.status_code == 429: + retry_after = int(resp.headers.get("Retry-After", "5")) + print(f" Rate limited, waiting {retry_after}s ...") + time.sleep(retry_after) + return graphql_request(client, query, variables) + resp.raise_for_status() + data = resp.json() + if "errors" in data: + raise RuntimeError(f"GraphQL errors: {data['errors']}") + return data["data"] + + +# ---------- Repo info ---------- +def get_repo_info() -> tuple[str, str]: + """Get owner/repo from git remote origin URL.""" + try: + result = subprocess.run( + ["git", "config", "--get", "remote.origin.url"], + capture_output=True, text=True, check=True, + ) + remote_url = result.stdout.strip() + m = re.search(r"github\.com[/:]([^/]+)/([^/.]+)", remote_url) + if m: + return m.group(1), m.group(2) + raise ValueError("Could not parse repository information from git remote") + except Exception as e: + print("Error getting repository info. Ensure you're in a git repository with a GitHub remote.", file=sys.stderr) + raise e + + +# ---------- Data fetchers ---------- +def fetch_all_review_comments(client: httpx.Client, owner: str, repo: str, pr_number: int) -> list[ReviewComment]: + try: + url = f"{GITHUB_REST_BASE}/repos/{owner}/{repo}/pulls/{pr_number}/comments" + raw = paginate_rest(client, url) + return [ + ReviewComment( + id=c["id"], + node_id=c.get("node_id", ""), + body=c.get("body", ""), + user_login=(c.get("user") or {}).get("login", ""), + created_at=c.get("created_at", ""), + path=c.get("path", ""), + line=c.get("line"), + position=c.get("position"), + original_position=c.get("original_position"), + outdated=c.get("outdated"), + ) + for c in raw + ] + except Exception as e: + print(f"Warning: Could not fetch review comments: {e}", file=sys.stderr) + return [] + + +def fetch_all_issue_comments(client: httpx.Client, owner: str, repo: str, pr_number: int) -> list[IssueComment]: + try: + url = f"{GITHUB_REST_BASE}/repos/{owner}/{repo}/issues/{pr_number}/comments" + raw = paginate_rest(client, url) + return [ + IssueComment( + body=c.get("body", ""), + user_login=(c.get("user") or {}).get("login", ""), + created_at=c.get("created_at", ""), + ) + for c in raw + ] + except Exception as e: + print(f"Warning: Could not fetch issue comments: {e}", file=sys.stderr) + return [] + + +def fetch_all_pull_request_reviews(client: httpx.Client, owner: str, repo: str, pr_number: int) -> list[SimpleReviewComment]: + try: + url = f"{GITHUB_REST_BASE}/repos/{owner}/{repo}/pulls/{pr_number}/reviews" + raw = paginate_rest(client, url) + return [ + SimpleReviewComment( + id=r["id"], + body=r.get("body", ""), + user_login=(r.get("user") or {}).get("login", ""), + created_at=r.get("submitted_at") or r.get("created_at", ""), + state=r.get("state", ""), + ) + for r in raw + ] + except Exception as e: + print(f"Warning: Could not fetch pull request reviews: {e}", file=sys.stderr) + return [] + + +def fetch_review_threads(client: httpx.Client, owner: str, repo: str, pr_number: int) -> list[ReviewThread]: + try: + threads_query = """ + query($owner: String!, $repo: String!, $number: Int!, $cursor: String) { + repository(owner: $owner, name: $repo) { + pullRequest(number: $number) { + reviewThreads(first: 100, after: $cursor) { + nodes { + id + isResolved + comments(first: 100) { + nodes { id databaseId body author { login } createdAt } + pageInfo { hasNextPage endCursor } + } + } + pageInfo { hasNextPage endCursor } + } + } + } + } + """ + thread_comments_query = """ + query($id: ID!, $cursor: String) { + node(id: $id) { + ... on PullRequestReviewThread { + id isResolved + comments(first: 100, after: $cursor) { + nodes { id databaseId body author { login } createdAt } + pageInfo { hasNextPage endCursor } + } + } + } + } + """ + + all_threads: dict[str, ReviewThread] = {} + cursor: str | None = None + has_next = True + + while has_next: + data = graphql_request(client, threads_query, { + "owner": owner, "repo": repo, "number": pr_number, "cursor": cursor, + }) + rt = data["repository"]["pullRequest"]["reviewThreads"] + + for node in rt["nodes"]: + thread_id = node["id"] + comments = [ + ThreadComment( + id=c["id"], + database_id=c.get("databaseId"), + body=c.get("body", ""), + author_login=(c.get("author") or {}).get("login"), + created_at=c.get("createdAt", ""), + ) + for c in node["comments"]["nodes"] + ] + + if thread_id not in all_threads: + all_threads[thread_id] = ReviewThread( + id=thread_id, + is_resolved=node["isResolved"], + comments=comments, + ) + else: + existing = all_threads[thread_id] + existing.is_resolved = node["isResolved"] + existing.comments.extend(comments) + + # Paginate comments for this thread if needed + c_has_next = node["comments"]["pageInfo"]["hasNextPage"] + c_cursor = node["comments"]["pageInfo"]["endCursor"] + while c_has_next: + c_data = graphql_request(client, thread_comments_query, { + "id": thread_id, "cursor": c_cursor, + }) + n = c_data.get("node") + if not n: + break + entry = all_threads[n["id"]] + entry.is_resolved = n["isResolved"] + extra_comments = [ + ThreadComment( + id=c["id"], + database_id=c.get("databaseId"), + body=c.get("body", ""), + author_login=(c.get("author") or {}).get("login"), + created_at=c.get("createdAt", ""), + ) + for c in n["comments"]["nodes"] + ] + entry.comments.extend(extra_comments) + c_has_next = n["comments"]["pageInfo"]["hasNextPage"] + c_cursor = n["comments"]["pageInfo"]["endCursor"] + + has_next = rt["pageInfo"]["hasNextPage"] + cursor = rt["pageInfo"]["endCursor"] + + return list(all_threads.values()) + except Exception as e: + print(f"Warning: Could not fetch review threads: {e}", file=sys.stderr) + return [] + + +# ---------- Resolution logic ---------- +def is_comment_resolved_by_policy( + comment: ReviewComment, + review_threads: list[ReviewThread], + policy: str = "strict", +) -> bool: + for thread in review_threads: + match = any( + (tc.database_id is not None and tc.database_id == comment.id) + or (comment.node_id and tc.id == comment.node_id) + for tc in thread.comments + ) + if match: + if policy == "github": + return thread.is_resolved + # strict policy: require marker + has_addressed = any(ADDRESSED_MARKER in (tc.body or "") for tc in thread.comments) + return thread.is_resolved and has_addressed + return False + + +def find_thread_for_review_comment( + comment: ReviewComment, + review_threads: list[ReviewThread], +) -> ReviewThread | None: + for thread in review_threads: + match = any( + (tc.database_id is not None and tc.database_id == comment.id) + or (comment.node_id and tc.id == comment.node_id) + for tc in thread.comments + ) + if match: + return thread + return None + + +# ---------- Rendering ---------- +def format_index(index: int) -> str: + return f"{index:03d}" + + +def sanitize_path(p: str) -> str: + return re.sub(r"[^a-zA-Z0-9._-]+", "_", p) + + +def cleanup_html_text(s: str) -> str: + no_tags = re.sub(r"<[^>]+>", "", s) + return re.sub(r"\s+", " ", no_tags).strip() + + +def get_configured_timezone() -> str: + env = os.environ.get("PR_REVIEW_TZ", "") + if not env or env.lower() == "local": + try: + return str(datetime.now().astimezone().tzinfo) + except Exception: + return "UTC" + return env + + +def format_date(date_string: str) -> str: + try: + tz_name = get_configured_timezone() + try: + tz = ZoneInfo(tz_name) + except Exception: + tz = timezone.utc + tz_name = "UTC" + # Parse ISO format, handle Z suffix + cleaned = date_string.replace("Z", "+00:00") + dt = datetime.fromisoformat(cleaned) + local = dt.astimezone(tz) + return f"{local:%Y-%m-%d %H:%M:%S} {tz_name}" + except Exception: + return date_string + + +def render_issue_content( + issue_number: int, + comment: ReviewComment, + review_threads: list[ReviewThread], + resolution_policy: str, + heading_level: int = 1, +) -> str: + formatted_date = format_date(comment.created_at) + is_resolved = is_comment_resolved_by_policy(comment, review_threads, resolution_policy) + resolved_status = "- [x] RESOLVED \u2713" if is_resolved else "- [ ] UNRESOLVED" + thread = find_thread_for_review_comment(comment, review_threads) + thread_id = thread.id if thread else "" + heading = f"{'#' * heading_level} Issue {issue_number} - Review Thread Comment" + + return f"""{heading} + +**File:** `{comment.path}:{comment.line}` +**Date:** {formatted_date} +**Status:** {resolved_status} + +## Body + +{comment.body} + +## Resolve + +Thread ID: {f'`{thread_id}`' if thread_id else '(not found)'} + +```bash +gh api graphql -f query='mutation($id:ID!){{resolveReviewThread(input:{{threadId:$id}}){{thread{{isResolved}}}}}}' -F id={thread_id or ''} +``` + +--- +*Generated from PR review - CodeRabbit AI* +""" + + +def render_detail_content( + section: DetailSection, + comment_number: int, + formatted_date: str, + summary_path: str, + resolved: bool, + details_html: str, + heading_level: int = 1, +) -> str: + heading_prefix = "#" * heading_level + title_map = {"outside": "Outside-of-diff", "duplicate": "Duplicate", "nitpick": "Nitpick"} + title = title_map.get(section, "Nitpick") + status = "- [x] RESOLVED \u2713" if resolved else "- [ ] UNRESOLVED" + return f"""{heading_prefix} {title} from Comment {comment_number} + +**File:** `{summary_path}` +**Date:** {formatted_date} +**Status:** {status} + +## Details + +{details_html} +""" + + +# ---------- File creation ---------- +def build_grouped_issue_filename(comment: ReviewComment) -> str: + raw_path = comment.path or "unknown_file" + sanitized = sanitize_path(raw_path) + return f"{sanitized or 'unknown_file'}.md" + + +def build_grouped_detail_filename(section: DetailSection, summary_path: str) -> str: + prefix_map = {"outside": "outside", "duplicate": "duplicate", "nitpick": "nitpick"} + prefix = prefix_map.get(section, "nitpick") + sanitized = sanitize_path(summary_path or "unknown_detail") + return f"{prefix}_{sanitized or 'unknown_detail'}.md" + + +def ensure_group(collection: dict[str, GroupedFile], key: str, factory) -> GroupedFile: + if key not in collection: + collection[key] = factory() + return collection[key] + + +def write_grouped_files(collection: dict[str, GroupedFile], header_builder) -> None: + groups = sorted(collection.values(), key=lambda g: g.index) + for group in groups: + header = header_builder(group.display_path or "unknown") + if not header.endswith("\n"): + header += "\n" + content = f"{header}\n" + "\n\n---\n\n".join(group.entries) + Path(group.file_path).write_text(content, encoding="utf-8") + print(f" Created {group.file_path}") + + +def create_issue_file( + output_dir: str, + issue_number: int, + comment: ReviewComment, + review_threads: list[ReviewThread], + resolution_policy: str, +) -> str: + file_name = f"{format_index(issue_number)}-issue.md" + file_path = os.path.join(output_dir, file_name) + content = render_issue_content(issue_number, comment, review_threads, resolution_policy) + Path(file_path).write_text(content, encoding="utf-8") + print(f" Created {file_path}") + return f"issues/{file_name}" + + +# ---------- Nitpick / outside extraction ---------- +def match_details_range_from_open(body: str, open_idx: int) -> tuple[int, int] | None: + length = len(body) + if body[open_idx:open_idx + 8].lower() != "", pos) + if next_close == -1: + return None + if next_open != -1 and next_open < next_close: + depth += 1 + pos = next_open + 8 + continue + depth -= 1 + pos = next_close + len("") + if depth == 0: + return (open_idx, pos) + return None + + +def find_allowed_section_ranges(body: str) -> list[dict]: + ranges: list[dict] = [] + lower = body.lower() + + def add(section: DetailSection, pattern: re.Pattern): + m = pattern.search(lower) + if not m: + return + title_idx = m.start() + details_open_idx = lower.rfind("]*>[^<]*nitpick\s+comments[^<]*", re.I)) + add("outside", re.compile(r"]*>[^<]*(outside\s*(?:-?of\s*diff|diff\s*range\s*comments))[^<]*", re.I)) + add("duplicate", re.compile(r"]*>[^<]*duplicate\s+comments[^<]*", re.I)) + return ranges + + +def is_within_any_range(index: int, ranges: list[dict]) -> bool: + return any(r["start"] < index < r["end"] for r in ranges) + + +def infer_section(body: str, before_index: int) -> DetailSection: + prefix = body[:before_index].lower() + idx_outside = max( + prefix.rfind("outside diff range comments"), + prefix.rfind("outside of diff"), + ) + idx_nitpick = prefix.rfind("nitpick comments") + idx_duplicate = prefix.rfind("duplicate comments") + max_idx = max(idx_outside, idx_nitpick, idx_duplicate) + if max_idx == idx_outside: + return "outside" + if max_idx == idx_duplicate: + return "duplicate" + return "nitpick" + + +def dedupe_by_content(items: list[dict]) -> list[dict]: + seen: set[str] = set() + out: list[dict] = [] + for it in items: + key = it["summary_path"] + "\n" + it["details_html"] + if key in seen: + continue + seen.add(key) + out.append(it) + return out + + +def extract_per_file_details_from_markdown(body: str) -> list[dict]: + if not body: + return [] + allowed_ranges = find_allowed_section_ranges(body) + out: list[dict] = [] + for m in re.finditer(r"]*>([\s\S]*?)", body, re.I): + raw_summary = m.group(1) or "" + clean_summary = cleanup_html_text(raw_summary) + path_match = re.match(r"(.+?)\s*\((\d+)\)\s*$", clean_summary) + if not path_match: + continue + path_like = (path_match.group(1) or "").strip() + if "/" not in path_like: + continue + sum_idx = m.start() + if not is_within_any_range(sum_idx, allowed_ranges): + continue + details_open_idx = body.rfind(" bool: + if not details_html: + return False + return ADDRESSED_MARKER.lower() in details_html.lower() + + +# ---------- Outside files ---------- +def create_outside_files_from_simple_comment( + comment_number: int, + item: dict, + outside_dir: str, + grouped: bool, + grouped_map: dict[str, GroupedFile], + grouped_counter: list[int], +) -> list[ExtractedInfo]: + body = item["body"] + created_at = item["created_at"] + formatted_date = format_date(created_at) + per_file = extract_per_file_details_from_markdown(body) + created_files: list[ExtractedInfo] = [] + + for i, entry in enumerate(per_file): + details_html = entry["details_html"] + summary_path = entry["summary_path"] + section: DetailSection = entry["section"] + if section != "outside": + continue + resolved = is_nitpick_resolved(details_html) + base = sanitize_path(summary_path) + + if grouped and grouped_map is not None: + group_key = summary_path or "unknown_detail" + file_base = build_grouped_detail_filename(section, summary_path) + + def make_group(): + grouped_counter[0] += 1 + file_name = f"{format_index(grouped_counter[0])}-{file_base}" + return GroupedFile( + file_path=os.path.join(outside_dir, file_name), + relative_path=f"outside/{file_name}", + display_path=summary_path, + entries=[], + index=grouped_counter[0], + ) + + grouped_file = ensure_group(grouped_map, group_key, make_group) + grouped_file.entries.append( + render_detail_content(section, comment_number, formatted_date, summary_path, resolved, details_html, 2) + ) + created_files.append(ExtractedInfo(file=grouped_file.file_path, resolved=resolved, summary_path=summary_path, section=section)) + continue + + nit_file_name = f"{format_index(comment_number)}-outside_{(i + 1):02d}_{base}.md" + nit_file = os.path.join(outside_dir, nit_file_name) + nit_content = render_detail_content(section, comment_number, formatted_date, summary_path, resolved, details_html) + Path(nit_file).write_text(nit_content, encoding="utf-8") + created_files.append(ExtractedInfo(file=nit_file, resolved=resolved, summary_path=summary_path, section=section)) + print(f" \u21b3 Outside-of-diff {i + 1}: {nit_file}") + + return created_files + + +# ---------- Summary ---------- +def create_summary_file( + summary_file: str, + pr_number: int, + review_comments: list[ReviewComment], + issue_files: list[str], + resolved_count: int, + unresolved_count: int, + review_threads: list[ReviewThread], + resolution_policy: str, + extracted: list[ExtractedInfo], + created_issue_count: int, + hide_resolved: bool, + skip_outdated: bool, + skipped_outdated_count: int, + original_review_comments_count: int, +) -> None: + now = datetime.now(timezone.utc).isoformat() + filtered_note_parts: list[str] = [] + if skip_outdated and skipped_outdated_count > 0: + filtered_note_parts.append(f"{skipped_outdated_count} outdated skipped") + if hide_resolved: + filtered_note_parts.append(f"filtered from {original_review_comments_count} total") + filtered_note = f" ({', '.join(filtered_note_parts)})" if filtered_note_parts else "" + + outside_entries = [e for e in extracted if e.section == "outside"] + + content = f"""# PR Review #{pr_number} - CodeRabbit AI Export + +This folder contains exported issues (resolvable review threads) and outside-of-diff details for PR #{pr_number}. + +## Summary + +- **Issues (resolvable review comments):** {created_issue_count}{filtered_note} +- **Outside-of-diff entries:** {len(outside_entries)} + - **Resolved issues:** {resolved_count} \u2713 + - **Unresolved issues:** {unresolved_count} + +**Generated on:** {format_date(now)} + +## Issues + +""" + + issue_index = 0 + for comment in review_comments: + is_resolved = is_comment_resolved_by_policy(comment, review_threads, resolution_policy) + if hide_resolved and is_resolved: + continue + issue_index += 1 + checked = "x" if is_resolved else " " + issue_file = issue_files[issue_index - 1] if issue_index - 1 < len(issue_files) else f"issues/{format_index(issue_index)}-issue.md" + loc = f" {comment.path}:{comment.line}" + content += f"- [{checked}] [Issue {issue_index}]({issue_file}) -{loc}\n" + + if outside_entries: + resolved_outside_count = sum(1 for e in outside_entries if e.resolved) + unresolved_outside_count = len(outside_entries) - resolved_outside_count + content += f"\n## Outside-of-diff\n\n" + content += f"- Resolved: {resolved_outside_count} \u2713\n" + content += f"- Unresolved: {unresolved_outside_count}\n\n" + for entry in outside_entries: + rel = f"outside/{os.path.basename(entry.file)}" + checked = "x" if entry.resolved else " " + content += f"- [{checked}] [{entry.summary_path}]({rel})\n" + + Path(summary_file).write_text(content, encoding="utf-8") + print(f" Created summary file: {summary_file}") + + +# ---------- Unresolve enforcement ---------- +def unresolve_review_thread(client: httpx.Client, thread_id: str) -> bool: + mutation = """ + mutation($threadId: ID!) { + unresolveReviewThread(input: { threadId: $threadId }) { + thread { id isResolved } + } + } + """ + try: + result = graphql_request(client, mutation, {"threadId": thread_id}) + return result["unresolveReviewThread"]["thread"]["isResolved"] is False + except Exception as e: + print(f" Warning: GraphQL failed to unresolve thread {thread_id[:12]}... {e}", file=sys.stderr) + return False + + +def unresolve_threads_missing_marker( + client: httpx.Client, + threads: list[ReviewThread], +) -> tuple[int, int]: + attempted = 0 + changed = 0 + for t in threads: + has_marker = any(ADDRESSED_MARKER in (tc.body or "") for tc in t.comments) + if t.is_resolved and not has_marker: + attempted += 1 + try: + if unresolve_review_thread(client, t.id): + changed += 1 + except Exception as e: + print(f" Warning: failed to unresolve thread {t.id[:12]}... {e}", file=sys.stderr) + return attempted, changed + + +# ---------- Main ---------- +def main() -> None: + parser = argparse.ArgumentParser(description="Export CodeRabbit AI review comments from a GitHub PR") + parser.add_argument("pr_number", type=int, help="PR number") + parser.add_argument("--unresolve-missing-marker", action="store_true", + help="Un-resolve threads that lack the ADDRESSED_MARKER") + parser.add_argument("--hide-resolved", action="store_true", + help="Skip generating files for resolved issues") + parser.add_argument("--grouped", action="store_true", + help="Generate files per file path instead of per issue") + parser.add_argument("--skip-outdated", action="store_true", + help="Exclude outdated review comments") + parser.add_argument("--resolution-policy", choices=["github", "strict"], default="github", + help="Resolution policy (default: github)") + args = parser.parse_args() + + # Load .env from current working directory + load_dotenv(Path.cwd() / ".env") + + token = os.environ.get("GITHUB_TOKEN") + if not token: + print("Error: GITHUB_TOKEN environment variable is not set.", file=sys.stderr) + sys.exit(1) + + owner, repo = get_repo_info() + pr_number = args.pr_number + + print(f"Fetching PR #{pr_number} from {owner}/{repo} ...") + + client = httpx.Client( + headers={"Authorization": f"token {token}", "Accept": "application/vnd.github.v3+json"}, + timeout=30.0, + ) + + try: + # Fetch data + print(" \u2192 review comments (REST) ...") + all_review_comments = fetch_all_review_comments(client, owner, repo, pr_number) + + print(" \u2192 issue comments (REST) ...") + all_issue_comments = fetch_all_issue_comments(client, owner, repo, pr_number) + + print(" \u2192 review threads (GraphQL) ...") + review_threads = fetch_review_threads(client, owner, repo, pr_number) + + if args.unresolve_missing_marker: + print(" \u2192 enforcing policy by unresolving threads missing the ADDRESSED_MARKER ...") + attempted, changed = unresolve_threads_missing_marker(client, review_threads) + print(f" Unresolve attempts: {attempted} \u2022 actually changed: {changed}") + + print(" \u2192 pull request reviews (REST) ...") + all_simple_reviews = fetch_all_pull_request_reviews(client, owner, repo, pr_number) + + # Filter to CodeRabbit bot comments only + coderabbit_review_comments = [c for c in all_review_comments if c.user_login == CODERABBIT_BOT_LOGIN] + + original_review_comments_count = len(coderabbit_review_comments) + skipped_outdated_count = 0 + + if args.skip_outdated: + before_count = len(coderabbit_review_comments) + coderabbit_review_comments = [ + c for c in coderabbit_review_comments + if c.outdated is not True and c.position is not None + ] + skipped_outdated_count = before_count - len(coderabbit_review_comments) + if skipped_outdated_count > 0: + print(f" Skipped {skipped_outdated_count} outdated comment(s)") + + coderabbit_issue_comments = [c for c in all_issue_comments if c.user_login == CODERABBIT_BOT_LOGIN] + coderabbit_simple_reviews = [ + r for r in all_simple_reviews + if r.user_login == CODERABBIT_BOT_LOGIN and (r.body or "").strip() + ] + + total_comments = len(coderabbit_review_comments) + len(coderabbit_issue_comments) + len(coderabbit_simple_reviews) + if total_comments == 0: + print(f"No CodeRabbit AI comments found for PR #{pr_number}.") + return + + output_dir = f"./ai-docs/reviews-pr-{pr_number}" + issues_dir = os.path.join(output_dir, "issues") + outside_dir = os.path.join(output_dir, "outside") + summary_file = os.path.join(output_dir, "_summary.md") + os.makedirs(issues_dir, exist_ok=True) + os.makedirs(outside_dir, exist_ok=True) + + grouped_issues: dict[str, GroupedFile] = {} + grouped_outside: dict[str, GroupedFile] = {} + grouped_outside_counter = [0] + grouped_issue_counter = [0] + + issue_file_paths: list[str] = [] + + # Sort each category chronologically + review_comments = sorted(coderabbit_review_comments, key=lambda c: c.created_at) + issue_comments = sorted(coderabbit_issue_comments, key=lambda c: c.created_at) + simple_review_comments = sorted(coderabbit_simple_reviews, key=lambda c: c.created_at) + + # Count resolution by policy + resolved_count = sum( + 1 for c in review_comments + if is_comment_resolved_by_policy(c, review_threads, args.resolution_policy) + ) + unresolved_count = len(review_comments) - resolved_count + + print("Creating issue files (resolvable review threads) in issues/ ...") + created_issue_count = 0 + for i, comment in enumerate(review_comments): + is_resolved = is_comment_resolved_by_policy(comment, review_threads, args.resolution_policy) + if args.hide_resolved and is_resolved: + print(f" Skipped resolved issue {i + 1}: {comment.path}:{comment.line}") + continue + + created_issue_count += 1 + if args.grouped: + group_key = comment.path or "unknown" + + def make_issue_group(c=comment): + grouped_issue_counter[0] += 1 + file_base = build_grouped_issue_filename(c) + file_name = f"{format_index(grouped_issue_counter[0])}-{file_base}" + return GroupedFile( + file_path=os.path.join(issues_dir, file_name), + relative_path=f"issues/{file_name}", + display_path=group_key, + entries=[], + index=grouped_issue_counter[0], + ) + + grouped = ensure_group(grouped_issues, group_key, make_issue_group) + grouped.entries.append( + render_issue_content(created_issue_count, comment, review_threads, args.resolution_policy, 2) + ) + issue_relative_path = grouped.relative_path + else: + issue_relative_path = create_issue_file( + issues_dir, created_issue_count, comment, review_threads, args.resolution_policy + ) + issue_file_paths.append(issue_relative_path) + + if args.grouped: + write_grouped_files(grouped_issues, lambda p: f"# Issues for `{p}`") + + print("Extracting outside-of-diff details from simple comments into outside/ ...") + # Merge general PR comments and simple PR review bodies into one sequence + simple_items: list[dict] = [] + for c in issue_comments: + simple_items.append({"kind": "issue_comment", "body": c.body, "created_at": c.created_at}) + for r in simple_review_comments: + simple_items.append({"kind": "review", "body": r.body, "created_at": r.created_at}) + simple_items.sort(key=lambda x: x["created_at"]) + + all_extracted: list[ExtractedInfo] = [] + for i, item in enumerate(simple_items): + created = create_outside_files_from_simple_comment( + i + 1, item, outside_dir, args.grouped, grouped_outside, grouped_outside_counter + ) + all_extracted.extend(created) + + if args.grouped: + write_grouped_files(grouped_outside, lambda p: f"# Outside-of-diff for `{p}`") + + create_summary_file( + summary_file, pr_number, review_comments, issue_file_paths, + resolved_count, unresolved_count, review_threads, args.resolution_policy, + all_extracted, created_issue_count, args.hide_resolved, + args.skip_outdated, skipped_outdated_count, original_review_comments_count, + ) + + generated_outside_file_count = len({e.file for e in all_extracted}) + total_generated = created_issue_count + generated_outside_file_count + hidden_resolved_count = 0 + if args.hide_resolved: + hidden_resolved_count = max( + 0, + original_review_comments_count - created_issue_count - (skipped_outdated_count if args.skip_outdated else 0), + ) + hidden_note_parts: list[str] = [] + if args.skip_outdated and skipped_outdated_count > 0: + hidden_note_parts.append(f"{skipped_outdated_count} outdated comments skipped") + if args.hide_resolved and hidden_resolved_count > 0: + hidden_note_parts.append(f"{hidden_resolved_count} resolved issues hidden") + hidden_note = f" ({', '.join(hidden_note_parts)})" if hidden_note_parts else "" + + print(f"\n\u2705 Done. {total_generated} files in {output_dir}{hidden_note}") + print(f"\u2139\ufe0f Threads resolved: {resolved_count} \u2022 unresolved: {unresolved_count}") + finally: + client.close() + + +if __name__ == "__main__": + main() diff --git a/.agents/skills/fix-coderabbit-review/scripts/resolve_pr_issues.py b/.agents/skills/fix-coderabbit-review/scripts/resolve_pr_issues.py new file mode 100755 index 00000000..f4bbd5de --- /dev/null +++ b/.agents/skills/fix-coderabbit-review/scripts/resolve_pr_issues.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python3 +# /// script +# requires-python = ">=3.10" +# dependencies = ["httpx"] +# /// +""" +resolve_pr_issues.py — Mark exported PR review issues as resolved. + +Given a PR export directory (ai-docs/reviews-pr-XXX) and an inclusive range +of issue numbers, this script: + 1. Updates each issue markdown file to mark the status as resolved. + 2. Resolves the corresponding GitHub review threads via GraphQL API. + 3. Updates the _summary.md checklist to reflect the resolved issues and + refreshes the resolved/unresolved counters. + +Usage: + uv run resolve_pr_issues.py \\ + --pr-dir ai-docs/reviews-pr-277 \\ + --from 11 \\ + --to 22 \\ + [--dry-run] + +Requirements: + - GITHUB_TOKEN environment variable set (unless --dry-run) +""" + +from __future__ import annotations + +import argparse +import os +import re +import sys +from pathlib import Path + +import httpx + +GITHUB_GRAPHQL_URL = "https://api.github.com/graphql" + + +def graphql_request(client: httpx.Client, query: str, variables: dict) -> dict: + """Execute a GitHub GraphQL query/mutation.""" + resp = client.post( + GITHUB_GRAPHQL_URL, + json={"query": query, "variables": variables}, + ) + resp.raise_for_status() + data = resp.json() + if "errors" in data: + raise RuntimeError(f"GraphQL errors: {data['errors']}") + return data["data"] + + +def find_issue_file(issues_dir: Path, padded: str) -> Path | None: + """Locate an issue file by padded index, handling legacy and grouped formats.""" + # Legacy format: issue_001.md + legacy = issues_dir / f"issue_{padded}.md" + if legacy.exists(): + return legacy + + # Grouped format: 001-*.md + matches = sorted(issues_dir.glob(f"{padded}-*.md")) + if len(matches) == 1: + return matches[0] + if len(matches) > 1: + print(f"Warning: multiple grouped files match index {padded}. Using first match: {matches[0]}", file=sys.stderr) + return matches[0] + + return None + + +def extract_thread_ids(file_path: Path) -> list[str]: + """Extract all thread IDs from an issue file.""" + text = file_path.read_text(encoding="utf-8") + ids: set[str] = set() + # Pattern: Thread ID: `` + for m in re.finditer(r"Thread ID: `([^`]+)`", text): + ids.add(m.group(1)) + # Pattern: threadId='' + for m in re.finditer(r"threadId='([^']+)'", text): + ids.add(m.group(1)) + return sorted(ids) + + +def mark_issue_resolved(file_path: Path) -> None: + """Update issue file status from UNRESOLVED to RESOLVED.""" + text = file_path.read_text(encoding="utf-8") + new_text, count = re.subn( + r"(\*\*Status:\*\*\s*-\s*)\[[xX ]\]\s*(?:UNRESOLVED|RESOLVED(?:\s*\u2713)?)", + r"\1[x] RESOLVED", + text, + count=1, + ) + if count: + file_path.write_text(new_text, encoding="utf-8") + + +def update_summary_checkbox(summary_path: Path, issue_num: int, padded: str) -> None: + """Mark an issue as checked in the summary checklist.""" + text = summary_path.read_text(encoding="utf-8") + pattern = rf"(- \[)[ xX](\] \[Issue {issue_num}\]\(issues/(?:issue_{padded}|{padded}-[^)]+)\.md\))" + new_text = re.sub(pattern, r"\1x\2", text, count=1) + if new_text != text: + summary_path.write_text(new_text, encoding="utf-8") + + +def refresh_summary_counts(summary_path: Path) -> None: + """Recount resolved/unresolved issues in the summary file.""" + text = summary_path.read_text(encoding="utf-8") + pattern_resolved = r"- \[[xX]\] \[Issue \d+\]\(issues/(?:issue_\d+|\d+-[^)]+)\.md\)" + pattern_unresolved = r"- \[ \] \[Issue \d+\]\(issues/(?:issue_\d+|\d+-[^)]+)\.md\)" + resolved = len(re.findall(pattern_resolved, text)) + unresolved = len(re.findall(pattern_unresolved, text)) + text = re.sub( + r"(\*\*Resolved issues:\*\*\s*)(\d+)", + lambda m: m.group(1) + str(resolved), + text, + ) + text = re.sub( + r"(\*\*Unresolved issues:\*\*\s*)(\d+)", + lambda m: m.group(1) + str(unresolved), + text, + ) + summary_path.write_text(text, encoding="utf-8") + + +def resolve_threads(client: httpx.Client | None, issue_file: Path, dry_run: bool) -> None: + """Resolve GitHub review threads referenced in an issue file.""" + thread_ids = extract_thread_ids(issue_file) + if not thread_ids: + print(f" \u26a0\ufe0f No thread IDs found in {issue_file.name}") + return + + mutation = """ + mutation($threadId: ID!) { + resolveReviewThread(input: { threadId: $threadId }) { + thread { isResolved } + } + } + """ + + for tid in thread_ids: + print(f" \U0001f4e1 Resolving thread {tid}") + if dry_run: + print(" (dry-run) skipping API call") + continue + if client is None: + print(" \u26a0\ufe0f No client available (missing GITHUB_TOKEN?)") + continue + try: + graphql_request(client, mutation, {"threadId": tid}) + except Exception as e: + print(f" \u26a0\ufe0f Failed to resolve thread {tid} (may already be resolved or deleted): {e}") + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Mark exported PR review issues as resolved", + ) + parser.add_argument("--pr-dir", required=True, help="PR export directory (e.g., ai-docs/reviews-pr-277)") + parser.add_argument("--from", dest="from_issue", required=True, type=int, help="First issue number (inclusive)") + parser.add_argument("--to", dest="to_issue", required=True, type=int, help="Last issue number (inclusive)") + parser.add_argument("--dry-run", action="store_true", help="Preview without making changes to GitHub") + return parser.parse_args() + + +def main() -> None: + args = parse_args() + + pr_dir = Path(args.pr_dir) + from_issue: int = args.from_issue + to_issue: int = args.to_issue + dry_run: bool = args.dry_run + + # Validate + if from_issue > to_issue: + print("Error: --from cannot be greater than --to", file=sys.stderr) + sys.exit(1) + if not pr_dir.is_dir(): + print(f"Error: PR directory not found: {pr_dir}", file=sys.stderr) + sys.exit(1) + + summary_file = pr_dir / "_summary.md" + issues_dir = pr_dir / "issues" + + if not summary_file.exists(): + print(f"Error: Summary file not found in {pr_dir}", file=sys.stderr) + sys.exit(1) + if not issues_dir.is_dir(): + print(f"Error: Issues directory not found in {pr_dir}", file=sys.stderr) + sys.exit(1) + + # Set up HTTP client for GitHub API (if not dry-run) + client: httpx.Client | None = None + if not dry_run: + token = os.environ.get("GITHUB_TOKEN") + if not token: + print("Error: GITHUB_TOKEN environment variable is not set.", file=sys.stderr) + sys.exit(1) + client = httpx.Client( + headers={"Authorization": f"token {token}"}, + timeout=30.0, + ) + + print(f"\U0001f4c1 PR dir: {pr_dir}") + print(f"\U0001f522 Range: {from_issue}-{to_issue}") + print(f"\U0001f9ea Dry run: {dry_run}") + + try: + for num in range(from_issue, to_issue + 1): + padded = f"{num:03d}" + issue_file = find_issue_file(issues_dir, padded) + if issue_file is None: + print(f"\u274c Missing issue file for index {padded}") + continue + + print(f"\u27a1\ufe0f Processing {issue_file.name}") + mark_issue_resolved(issue_file) + update_summary_checkbox(summary_file, num, padded) + resolve_threads(client, issue_file, dry_run) + + refresh_summary_counts(summary_file) + print("\u2705 Completed.") + finally: + if client: + client.close() + + +if __name__ == "__main__": + main() diff --git a/.agents/skills/fix-reviews/SKILL.md b/.agents/skills/fix-reviews/SKILL.md new file mode 100644 index 00000000..e779f57e --- /dev/null +++ b/.agents/skills/fix-reviews/SKILL.md @@ -0,0 +1,50 @@ +--- +name: fix-reviews +description: Executes provider-agnostic PR review remediation using existing review round files under .productize/tasks//reviews-NNN/. Use when resolving batched review issues, updating issue markdown files, implementing fixes, and verifying the result. Do not use for PRD task execution, review export/fetch, or generic coding tasks without review issue files. +--- + +# Fix Reviews + +Execute the review remediation workflow in a strict sequence. The review files already exist and define the full scope for the run. + +## Required Inputs + +- The scoped issue files listed in ``. +- The PRD review round directory and issue-file frontmatter. +- The repository verification workflow required by `final-verify`. + +## Workflow + +1. Gather round context. + - Read the scoped issue file frontmatter to understand the provider, round number, and issue status/severity. If multiple issue files are in scope, verify their `provider`, `pr`, `round`, and `round_created_at` values agree. + - Read `` to identify the PRD name, review round, code files in scope, and conditional flags such as auto-commit. + +2. Read and triage the scoped issue files. + - Read every listed issue file completely before editing code. + - Update each issue file frontmatter `status` from `pending` to `valid` or `invalid`. + - Record concrete technical reasoning in `## Triage`: state why the issue is valid or invalid, identify the root cause if valid, and outline the intended fix approach. + +3. Fix valid issues completely. + - Fix issues in severity order: critical first, then high, medium, low. This ensures the most impactful fixes land even if the batch is interrupted. + - Implement production-quality fixes for every `valid` issue in scope. + - Add or update tests when behavior changes or regressions are possible. Test file edits are always in scope when they validate a fix. + - Keep code changes constrained to the files listed in `` code files. If a fix absolutely requires touching a file not listed there, limit the change to the minimum needed and document why in the issue file's `## Triage` section. + - Do not refactor, clean up, or improve code that is unrelated to the issues being fixed. + +4. Close out issue files correctly. + - For a `valid` issue, set frontmatter `status: resolved` only after the code and verification are done. + - For an `invalid` issue, document why it is invalid and then set frontmatter `status: resolved` once the analysis is complete. + +5. Verify before completion. + - Use `final-verify` before any completion claim or automatic commit. + - Run the repository’s real verification commands; do not stop at partial checks. + - If verification fails, fix the failing checks in the code you changed. Do not revert your fixes to pass verification -- find the root cause of the failure and address it. If the failure is in pre-existing code unrelated to your changes, document it in the relevant issue file’s `## Triage` section and proceed. If two fixes conflict with each other and verification cannot pass after two attempts, document the conflict in both issue files and report the situation rather than looping indefinitely. + - If all issues in the batch are invalid and no code was changed, skip the commit step entirely -- do not create an empty commit. Still run verification to confirm no regressions. + - Leave the diff ready for manual review unless `` shows "Automatic commits: enabled". + +## Critical Rules + +- Do not fetch or export reviews inside this workflow. `productize reviews fetch` already produced the round files. +- Do not call provider-specific scripts or `gh` mutations. Productize resolves provider threads after the batch succeeds. +- Do not modify issue files outside the scoped batch. +- Do not mark an issue `resolved` before the underlying work and verification are actually complete. diff --git a/.agents/skills/frontend-design/SKILL.md b/.agents/skills/frontend-design/SKILL.md new file mode 100644 index 00000000..dd7c5dd4 --- /dev/null +++ b/.agents/skills/frontend-design/SKILL.md @@ -0,0 +1,147 @@ +--- +name: frontend-design +description: Create distinctive, production-grade frontend interfaces with high design quality. Generates creative, polished code that avoids generic AI aesthetics. Use when the user asks to build web components, pages, artifacts, posters, or applications, or when any design skill requires project context. +license: Apache 2.0. Based on Anthropic's frontend-design skill. See NOTICE.md for attribution. +--- + +This skill guides creation of distinctive, production-grade frontend interfaces that avoid generic "AI slop" aesthetics. Implement real working code with exceptional attention to aesthetic details and creative choices. + +## Context Gathering Protocol + +Design skills produce generic output without project context. You MUST have confirmed design context before doing any design work. + +**Required context** — every design skill needs at minimum: +- **Target audience**: Who uses this product and in what context? +- **Use cases**: What jobs are they trying to get done? +- **Brand personality/tone**: How should the interface feel? + +Individual skills may require additional context — check the skill's preparation section for specifics. + +**CRITICAL**: You cannot infer this context by reading the codebase. Code tells you what was built, not who it's for or what it should feel like. Only the creator can provide this context. + +**Gathering order:** +1. **Check current instructions (instant)**: If your loaded instructions already contain a **Design Context** section, proceed immediately. +2. **Check .impeccable.md (fast)**: If not in instructions, read `.impeccable.md` from the project root. If it exists and contains the required context, proceed. +3. **Run teach-impeccable (REQUIRED)**: If neither source has context, you MUST run /teach-impeccable NOW before doing anything else. Do NOT skip this step. Do NOT attempt to infer context from the codebase instead. + +--- + +## Design Direction + +Commit to a BOLD aesthetic direction: +- **Purpose**: What problem does this interface solve? Who uses it? +- **Tone**: Pick an extreme: brutally minimal, maximalist chaos, retro-futuristic, organic/natural, luxury/refined, playful/toy-like, editorial/magazine, brutalist/raw, art deco/geometric, soft/pastel, industrial/utilitarian, etc. There are so many flavors to choose from. Use these for inspiration but design one that is true to the aesthetic direction. +- **Constraints**: Technical requirements (framework, performance, accessibility). +- **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? + +**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work—the key is intentionality, not intensity. + +Then implement working code that is: +- Production-grade and functional +- Visually striking and memorable +- Cohesive with a clear aesthetic point-of-view +- Meticulously refined in every detail + +## Frontend Aesthetics Guidelines + +### Typography +→ *Consult [typography reference](reference/typography.md) for scales, pairing, and loading strategies.* + +Choose fonts that are beautiful, unique, and interesting. Pair a distinctive display font with a refined body font. + +**DO**: Use a modular type scale with fluid sizing (clamp) +**DO**: Vary font weights and sizes to create clear visual hierarchy +**DON'T**: Use overused fonts—Inter, Roboto, Arial, Open Sans, system defaults +**DON'T**: Use monospace typography as lazy shorthand for "technical/developer" vibes +**DON'T**: Put large icons with rounded corners above every heading—they rarely add value and make sites look templated + +### Color & Theme +→ *Consult [color reference](reference/color-and-contrast.md) for OKLCH, palettes, and dark mode.* + +Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. + +**DO**: Use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes +**DO**: Tint your neutrals toward your brand hue—even a subtle hint creates subconscious cohesion +**DON'T**: Use gray text on colored backgrounds—it looks washed out; use a shade of the background color instead +**DON'T**: Use pure black (#000) or pure white (#fff)—always tint; pure black/white never appears in nature +**DON'T**: Use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds +**DON'T**: Use gradient text for "impact"—especially on metrics or headings; it's decorative rather than meaningful +**DON'T**: Default to dark mode with glowing accents—it looks "cool" without requiring actual design decisions + +### Layout & Space +→ *Consult [spatial reference](reference/spatial-design.md) for grids, rhythm, and container queries.* + +Create visual rhythm through varied spacing—not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. + +**DO**: Create visual rhythm through varied spacing—tight groupings, generous separations +**DO**: Use fluid spacing with clamp() that breathes on larger screens +**DO**: Use asymmetry and unexpected compositions; break the grid intentionally for emphasis +**DON'T**: Wrap everything in cards—not everything needs a container +**DON'T**: Nest cards inside cards—visual noise, flatten the hierarchy +**DON'T**: Use identical card grids—same-sized cards with icon + heading + text, repeated endlessly +**DON'T**: Use the hero metric layout template—big number, small label, supporting stats, gradient accent +**DON'T**: Center everything—left-aligned text with asymmetric layouts feels more designed +**DON'T**: Use the same spacing everywhere—without rhythm, layouts feel monotonous + +### Visual Details +**DO**: Use intentional, purposeful decorative elements that reinforce brand +**DON'T**: Use glassmorphism everywhere—blur effects, glass cards, glow borders used decoratively rather than purposefully +**DON'T**: Use rounded elements with thick colored border on one side—a lazy accent that almost never looks intentional +**DON'T**: Use sparklines as decoration—tiny charts that look sophisticated but convey nothing meaningful +**DON'T**: Use rounded rectangles with generic drop shadows—safe, forgettable, could be any AI output +**DON'T**: Use modals unless there's truly no better alternative—modals are lazy + +### Motion +→ *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* + +Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. + +**DO**: Use motion to convey state changes—entrances, exits, feedback +**DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration +**DO**: For height animations, use grid-template-rows transitions instead of animating height directly +**DON'T**: Animate layout properties (width, height, padding, margin)—use transform and opacity only +**DON'T**: Use bounce or elastic easing—they feel dated and tacky; real objects decelerate smoothly + +### Interaction +→ *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* + +Make interactions feel fast. Use optimistic UI—update immediately, sync later. + +**DO**: Use progressive disclosure—start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) +**DO**: Design empty states that teach the interface, not just say "nothing here" +**DO**: Make every interactive surface feel intentional and responsive +**DON'T**: Repeat the same information—redundant headers, intros that restate the heading +**DON'T**: Make every button primary—use ghost buttons, text links, secondary styles; hierarchy matters + +### Responsive +→ *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* + +**DO**: Use container queries (@container) for component-level responsiveness +**DO**: Adapt the interface for different contexts—don't just shrink it +**DON'T**: Hide critical functionality on mobile—adapt the interface, don't amputate it + +### UX Writing +→ *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* + +**DO**: Make every word earn its place +**DON'T**: Repeat information users can already see + +--- + +## The AI Slop Test + +**Critical quality check**: If you showed this interface to someone and said "AI made this," would they believe you immediately? If yes, that's the problem. + +A distinctive interface should make someone ask "how was this made?" not "which AI made this?" + +Review the DON'T guidelines above—they are the fingerprints of AI-generated work from 2024-2025. + +--- + +## Implementation Principles + +Match implementation complexity to the aesthetic vision. Maximalist designs need elaborate code with extensive animations and effects. Minimalist or refined designs need restraint, precision, and careful attention to spacing, typography, and subtle details. + +Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. + +Remember: the model is capable of extraordinary creative work. Don't hold back—show what can truly be created when thinking outside the box and committing fully to a distinctive vision. \ No newline at end of file diff --git a/.agents/skills/frontend-design/reference/color-and-contrast.md b/.agents/skills/frontend-design/reference/color-and-contrast.md new file mode 100644 index 00000000..77aaf032 --- /dev/null +++ b/.agents/skills/frontend-design/reference/color-and-contrast.md @@ -0,0 +1,132 @@ +# Color & Contrast + +## Color Spaces: Use OKLCH + +**Stop using HSL.** Use OKLCH (or LCH) instead. It's perceptually uniform, meaning equal steps in lightness *look* equal—unlike HSL where 50% lightness in yellow looks bright while 50% in blue looks dark. + +```css +/* OKLCH: lightness (0-100%), chroma (0-0.4+), hue (0-360) */ +--color-primary: oklch(60% 0.15 250); /* Blue */ +--color-primary-light: oklch(85% 0.08 250); /* Same hue, lighter */ +--color-primary-dark: oklch(35% 0.12 250); /* Same hue, darker */ +``` + +**Key insight**: As you move toward white or black, reduce chroma (saturation). High chroma at extreme lightness looks garish. A light blue at 85% lightness needs ~0.08 chroma, not the 0.15 of your base color. + +## Building Functional Palettes + +### The Tinted Neutral Trap + +**Pure gray is dead.** Add a subtle hint of your brand hue to all neutrals: + +```css +/* Dead grays */ +--gray-100: oklch(95% 0 0); /* No personality */ +--gray-900: oklch(15% 0 0); + +/* Warm-tinted grays (add brand warmth) */ +--gray-100: oklch(95% 0.01 60); /* Hint of warmth */ +--gray-900: oklch(15% 0.01 60); + +/* Cool-tinted grays (tech, professional) */ +--gray-100: oklch(95% 0.01 250); /* Hint of blue */ +--gray-900: oklch(15% 0.01 250); +``` + +The chroma is tiny (0.01) but perceptible. It creates subconscious cohesion between your brand color and your UI. + +### Palette Structure + +A complete system needs: + +| Role | Purpose | Example | +|------|---------|---------| +| **Primary** | Brand, CTAs, key actions | 1 color, 3-5 shades | +| **Neutral** | Text, backgrounds, borders | 9-11 shade scale | +| **Semantic** | Success, error, warning, info | 4 colors, 2-3 shades each | +| **Surface** | Cards, modals, overlays | 2-3 elevation levels | + +**Skip secondary/tertiary unless you need them.** Most apps work fine with one accent color. Adding more creates decision fatigue and visual noise. + +### The 60-30-10 Rule (Applied Correctly) + +This rule is about **visual weight**, not pixel count: + +- **60%**: Neutral backgrounds, white space, base surfaces +- **30%**: Secondary colors—text, borders, inactive states +- **10%**: Accent—CTAs, highlights, focus states + +The common mistake: using the accent color everywhere because it's "the brand color." Accent colors work *because* they're rare. Overuse kills their power. + +## Contrast & Accessibility + +### WCAG Requirements + +| Content Type | AA Minimum | AAA Target | +|--------------|------------|------------| +| Body text | 4.5:1 | 7:1 | +| Large text (18px+ or 14px bold) | 3:1 | 4.5:1 | +| UI components, icons | 3:1 | 4.5:1 | +| Non-essential decorations | None | None | + +**The gotcha**: Placeholder text still needs 4.5:1. That light gray placeholder you see everywhere? Usually fails WCAG. + +### Dangerous Color Combinations + +These commonly fail contrast or cause readability issues: + +- Light gray text on white (the #1 accessibility fail) +- **Gray text on any colored background**—gray looks washed out and dead on color. Use a darker shade of the background color, or transparency +- Red text on green background (or vice versa)—8% of men can't distinguish these +- Blue text on red background (vibrates visually) +- Yellow text on white (almost always fails) +- Thin light text on images (unpredictable contrast) + +### Never Use Pure Gray or Pure Black + +Pure gray (`oklch(50% 0 0)`) and pure black (`#000`) don't exist in nature—real shadows and surfaces always have a color cast. Even a chroma of 0.005-0.01 is enough to feel natural without being obviously tinted. (See tinted neutrals example above.) + +### Testing + +Don't trust your eyes. Use tools: + +- [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/) +- Browser DevTools → Rendering → Emulate vision deficiencies +- [Polypane](https://polypane.app/) for real-time testing + +## Theming: Light & Dark Mode + +### Dark Mode Is Not Inverted Light Mode + +You can't just swap colors. Dark mode requires different design decisions: + +| Light Mode | Dark Mode | +|------------|-----------| +| Shadows for depth | Lighter surfaces for depth (no shadows) | +| Dark text on light | Light text on dark (reduce font weight) | +| Vibrant accents | Desaturate accents slightly | +| White backgrounds | Never pure black—use dark gray (oklch 12-18%) | + +```css +/* Dark mode depth via surface color, not shadow */ +:root[data-theme="dark"] { + --surface-1: oklch(15% 0.01 250); + --surface-2: oklch(20% 0.01 250); /* "Higher" = lighter */ + --surface-3: oklch(25% 0.01 250); + + /* Reduce text weight slightly */ + --body-weight: 350; /* Instead of 400 */ +} +``` + +### Token Hierarchy + +Use two layers: primitive tokens (`--blue-500`) and semantic tokens (`--color-primary: var(--blue-500)`). For dark mode, only redefine the semantic layer—primitives stay the same. + +## Alpha Is A Design Smell + +Heavy use of transparency (rgba, hsla) usually means an incomplete palette. Alpha creates unpredictable contrast, performance overhead, and inconsistency. Define explicit overlay colors for each context instead. Exception: focus rings and interactive states where see-through is needed. + +--- + +**Avoid**: Relying on color alone to convey information. Creating palettes without clear roles for each color. Using pure black (#000) for large areas. Skipping color blindness testing (8% of men affected). diff --git a/.agents/skills/frontend-design/reference/interaction-design.md b/.agents/skills/frontend-design/reference/interaction-design.md new file mode 100644 index 00000000..19d6809a --- /dev/null +++ b/.agents/skills/frontend-design/reference/interaction-design.md @@ -0,0 +1,195 @@ +# Interaction Design + +## The Eight Interactive States + +Every interactive element needs these states designed: + +| State | When | Visual Treatment | +|-------|------|------------------| +| **Default** | At rest | Base styling | +| **Hover** | Pointer over (not touch) | Subtle lift, color shift | +| **Focus** | Keyboard/programmatic focus | Visible ring (see below) | +| **Active** | Being pressed | Pressed in, darker | +| **Disabled** | Not interactive | Reduced opacity, no pointer | +| **Loading** | Processing | Spinner, skeleton | +| **Error** | Invalid state | Red border, icon, message | +| **Success** | Completed | Green check, confirmation | + +**The common miss**: Designing hover without focus, or vice versa. They're different. Keyboard users never see hover states. + +## Focus Rings: Do Them Right + +**Never `outline: none` without replacement.** It's an accessibility violation. Instead, use `:focus-visible` to show focus only for keyboard users: + +```css +/* Hide focus ring for mouse/touch */ +button:focus { + outline: none; +} + +/* Show focus ring for keyboard */ +button:focus-visible { + outline: 2px solid var(--color-accent); + outline-offset: 2px; +} +``` + +**Focus ring design**: +- High contrast (3:1 minimum against adjacent colors) +- 2-3px thick +- Offset from element (not inside it) +- Consistent across all interactive elements + +## Form Design: The Non-Obvious + +**Placeholders aren't labels**—they disappear on input. Always use visible `