@soleur/opencode 0.0.0-stage → 3.354.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (832) hide show
  1. package/.claude-plugin/agents.manifest.json +476 -0
  2. package/.claude-plugin/plugin.json +42 -0
  3. package/README.md +44 -2
  4. package/agents/community/.gitkeep +0 -0
  5. package/agents/engineering/cto.md +87 -0
  6. package/agents/engineering/design/ddd-architect.md +95 -0
  7. package/agents/engineering/discovery/agent-finder.md +214 -0
  8. package/agents/engineering/discovery/functional-discovery.md +182 -0
  9. package/agents/engineering/infra/infra-security.md +151 -0
  10. package/agents/engineering/infra/platform-strategist.md +109 -0
  11. package/agents/engineering/infra/terraform-architect.md +171 -0
  12. package/agents/engineering/prompt-engineer.md +37 -0
  13. package/agents/engineering/research/best-practices-researcher.md +115 -0
  14. package/agents/engineering/research/framework-docs-researcher.md +93 -0
  15. package/agents/engineering/research/git-history-analyzer.md +53 -0
  16. package/agents/engineering/research/learnings-researcher.md +285 -0
  17. package/agents/engineering/research/repo-research-analyst.md +118 -0
  18. package/agents/engineering/review/agent-native-reviewer.md +279 -0
  19. package/agents/engineering/review/architecture-strategist.md +61 -0
  20. package/agents/engineering/review/code-quality-analyst.md +92 -0
  21. package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
  22. package/agents/engineering/review/data-integrity-guardian.md +82 -0
  23. package/agents/engineering/review/data-migration-expert.md +98 -0
  24. package/agents/engineering/review/deployment-verification-agent.md +183 -0
  25. package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
  26. package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
  27. package/agents/engineering/review/legacy-code-expert.md +55 -0
  28. package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
  29. package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
  30. package/agents/engineering/review/performance-oracle.md +130 -0
  31. package/agents/engineering/review/security-sentinel.md +167 -0
  32. package/agents/engineering/review/semgrep-sast.md +36 -0
  33. package/agents/engineering/review/test-design-reviewer.md +150 -0
  34. package/agents/engineering/review/user-impact-reviewer.md +70 -0
  35. package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
  36. package/agents/finance/budget-analyst.md +29 -0
  37. package/agents/finance/cfo.md +44 -0
  38. package/agents/finance/financial-reporter.md +30 -0
  39. package/agents/finance/revenue-analyst.md +30 -0
  40. package/agents/legal/clo.md +115 -0
  41. package/agents/legal/legal-compliance-auditor.md +110 -0
  42. package/agents/legal/legal-document-generator.md +134 -0
  43. package/agents/marketing/analytics-analyst.md +25 -0
  44. package/agents/marketing/brand-architect.md +181 -0
  45. package/agents/marketing/cmo.md +76 -0
  46. package/agents/marketing/conversion-optimizer.md +19 -0
  47. package/agents/marketing/copywriter.md +20 -0
  48. package/agents/marketing/fact-checker.md +70 -0
  49. package/agents/marketing/growth-strategist.md +145 -0
  50. package/agents/marketing/paid-media-strategist.md +28 -0
  51. package/agents/marketing/pricing-strategist.md +17 -0
  52. package/agents/marketing/programmatic-seo-specialist.md +25 -0
  53. package/agents/marketing/retention-strategist.md +23 -0
  54. package/agents/marketing/seo-aeo-analyst.md +164 -0
  55. package/agents/operations/coo.md +50 -0
  56. package/agents/operations/ops-advisor.md +78 -0
  57. package/agents/operations/ops-provisioner.md +101 -0
  58. package/agents/operations/ops-research.md +52 -0
  59. package/agents/operations/service-automator.md +278 -0
  60. package/agents/product/business-validator.md +206 -0
  61. package/agents/product/competitive-intelligence.md +89 -0
  62. package/agents/product/cpo.md +63 -0
  63. package/agents/product/design/ux-design-lead.md +209 -0
  64. package/agents/product/spec-flow-analyzer.md +122 -0
  65. package/agents/sales/cro.md +44 -0
  66. package/agents/sales/deal-architect.md +29 -0
  67. package/agents/sales/outbound-strategist.md +29 -0
  68. package/agents/sales/pipeline-analyst.md +29 -0
  69. package/agents/support/cco.md +48 -0
  70. package/agents/support/community-manager.md +570 -0
  71. package/agents/support/ticket-triage.md +70 -0
  72. package/bin/soleur-opencode.js +29 -0
  73. package/commands/go.md +660 -0
  74. package/commands/help.md +273 -0
  75. package/commands/sync.md +977 -0
  76. package/commands/version.md +103 -0
  77. package/hooks/antigravity-hooks.json +84 -0
  78. package/hooks/antigravity-session-start.sh +15 -0
  79. package/hooks/bare-root-cwd-guard.sh +131 -0
  80. package/hooks/browser-snapshot-credential-guard.sh +200 -0
  81. package/hooks/codex-session-start.sh +9 -0
  82. package/hooks/compaction-state.sh +525 -0
  83. package/hooks/destructive-command-guard.sh +1387 -0
  84. package/hooks/devin-session-start.sh +90 -0
  85. package/hooks/ext-filter-detect.sh +171 -0
  86. package/hooks/hooks.json +133 -0
  87. package/hooks/lib/hook-tool-kind.sh +24 -0
  88. package/hooks/lib/log-rotation.sh +176 -0
  89. package/hooks/lib/shell-argv.pl +576 -0
  90. package/hooks/memory-backstop.sh +1114 -0
  91. package/hooks/operator-stage-approval.sh +391 -0
  92. package/hooks/stop-hook.sh +367 -0
  93. package/hooks/unkept-promise-hook.sh +383 -0
  94. package/hooks/version-banner.sh +127 -0
  95. package/hooks/welcome-hook.sh +50 -0
  96. package/install.js +29 -0
  97. package/lib/agent-registry.ts +154 -0
  98. package/lib/c4-canonical-cli.mjs +34 -0
  99. package/lib/c4-canonical.mjs +46 -0
  100. package/lib/c4-from-components.ts +554 -0
  101. package/lib/go-routing.ts +81 -0
  102. package/lib/grok-inspect-contract.ts +311 -0
  103. package/lib/harness-model-map.ts +101 -0
  104. package/lib/harness-parity.ts +726 -0
  105. package/lib/harness-tool-map.ts +180 -0
  106. package/lib/harness.ts +716 -0
  107. package/lib/heartbeat-live-reconcile.ts +1153 -0
  108. package/lib/heartbeat-manifest.ts +361 -0
  109. package/lib/kb-coverage.ts +252 -0
  110. package/lib/pr-merge-poll.ts +103 -0
  111. package/lib/workflow-fidelity.ts +388 -0
  112. package/opencode/INSTRUCTIONS.md +171 -0
  113. package/opencode/agents/engineering/cto.md +10 -0
  114. package/opencode/agents/engineering/design/ddd-architect.md +10 -0
  115. package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
  116. package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
  117. package/opencode/agents/engineering/infra/infra-security.md +10 -0
  118. package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
  119. package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
  120. package/opencode/agents/engineering/prompt-engineer.md +10 -0
  121. package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
  122. package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
  123. package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
  124. package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
  125. package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
  126. package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
  127. package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
  128. package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
  129. package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
  130. package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
  131. package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
  132. package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
  133. package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
  134. package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
  135. package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
  136. package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
  137. package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
  138. package/opencode/agents/engineering/review/performance-oracle.md +10 -0
  139. package/opencode/agents/engineering/review/security-sentinel.md +10 -0
  140. package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
  141. package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
  142. package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
  143. package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
  144. package/opencode/agents/finance/budget-analyst.md +10 -0
  145. package/opencode/agents/finance/cfo.md +10 -0
  146. package/opencode/agents/finance/financial-reporter.md +10 -0
  147. package/opencode/agents/finance/revenue-analyst.md +10 -0
  148. package/opencode/agents/legal/clo.md +10 -0
  149. package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
  150. package/opencode/agents/legal/legal-document-generator.md +10 -0
  151. package/opencode/agents/marketing/analytics-analyst.md +10 -0
  152. package/opencode/agents/marketing/brand-architect.md +10 -0
  153. package/opencode/agents/marketing/cmo.md +10 -0
  154. package/opencode/agents/marketing/conversion-optimizer.md +10 -0
  155. package/opencode/agents/marketing/copywriter.md +10 -0
  156. package/opencode/agents/marketing/fact-checker.md +10 -0
  157. package/opencode/agents/marketing/growth-strategist.md +10 -0
  158. package/opencode/agents/marketing/paid-media-strategist.md +10 -0
  159. package/opencode/agents/marketing/pricing-strategist.md +10 -0
  160. package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
  161. package/opencode/agents/marketing/retention-strategist.md +10 -0
  162. package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
  163. package/opencode/agents/operations/coo.md +10 -0
  164. package/opencode/agents/operations/ops-advisor.md +10 -0
  165. package/opencode/agents/operations/ops-provisioner.md +10 -0
  166. package/opencode/agents/operations/ops-research.md +10 -0
  167. package/opencode/agents/operations/service-automator.md +10 -0
  168. package/opencode/agents/product/business-validator.md +10 -0
  169. package/opencode/agents/product/competitive-intelligence.md +10 -0
  170. package/opencode/agents/product/cpo.md +10 -0
  171. package/opencode/agents/product/design/ux-design-lead.md +10 -0
  172. package/opencode/agents/product/spec-flow-analyzer.md +10 -0
  173. package/opencode/agents/sales/cro.md +10 -0
  174. package/opencode/agents/sales/deal-architect.md +10 -0
  175. package/opencode/agents/sales/outbound-strategist.md +10 -0
  176. package/opencode/agents/sales/pipeline-analyst.md +10 -0
  177. package/opencode/agents/support/cco.md +10 -0
  178. package/opencode/agents/support/community-manager.md +10 -0
  179. package/opencode/agents/support/ticket-triage.md +10 -0
  180. package/opencode/commands/go.md +10 -0
  181. package/opencode/commands/help.md +10 -0
  182. package/opencode/commands/sync.md +10 -0
  183. package/opencode/commands/version.md +11 -0
  184. package/opencode/opencode.json +8 -0
  185. package/opencode/plugin.ts +818 -0
  186. package/package.json +36 -4
  187. package/scripts/admin-merge-ready.sh +545 -0
  188. package/scripts/admin-merge-ready.test.sh +753 -0
  189. package/scripts/affected-tests.sh +908 -0
  190. package/scripts/affected-tests.test.sh +1797 -0
  191. package/scripts/alpha-metrics.sh +78 -0
  192. package/scripts/alpha-metrics.test.sh +115 -0
  193. package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
  194. package/scripts/audit-flag-flip.sh +107 -0
  195. package/scripts/check-red-on-main.sh +316 -0
  196. package/scripts/ci-head-verdict.sh +411 -0
  197. package/scripts/cloud-detect.sh +193 -0
  198. package/scripts/delegation-verify.sh +657 -0
  199. package/scripts/delegation-verify.test.sh +1424 -0
  200. package/scripts/deploy-arm.sh +475 -0
  201. package/scripts/domain-model-drift.sh +419 -0
  202. package/scripts/emit-decision.sh +144 -0
  203. package/scripts/emit-decision.test.sh +144 -0
  204. package/scripts/ext-filter-divergence-corpus.txt +15 -0
  205. package/scripts/ext-filter-divergence.sh +189 -0
  206. package/scripts/generate-c4-from-components.ts +442 -0
  207. package/scripts/grok-fidelity-gate.sh +68 -0
  208. package/scripts/grok-pre-push-gate.sh +232 -0
  209. package/scripts/harness-discovery-smoke.ts +906 -0
  210. package/scripts/harness-parity-census.ts +92 -0
  211. package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
  212. package/scripts/install-opencode-adapter.ts +509 -0
  213. package/scripts/lib/affected-tests/common.sh +365 -0
  214. package/scripts/lib/affected-tests/go.sh +157 -0
  215. package/scripts/lib/affected-tests/js.sh +188 -0
  216. package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
  217. package/scripts/lib/affected-tests/python.sh +185 -0
  218. package/scripts/lib/context-sanitize.sh +49 -0
  219. package/scripts/lib/domain-model-lib.sh +180 -0
  220. package/scripts/lib/ext-filter-grammar.tsv +34 -0
  221. package/scripts/lib/operator-script.sh +1236 -0
  222. package/scripts/lib/proc.sh +580 -0
  223. package/scripts/lib/session-state.sh +748 -0
  224. package/scripts/lib/tmp-classify.sh +843 -0
  225. package/scripts/lib/wrapper-boundary.sh +47 -0
  226. package/scripts/lint-ratchet.py +1547 -0
  227. package/scripts/monitor-pr-checks.sh +441 -0
  228. package/scripts/pipeline-tally.sh +756 -0
  229. package/scripts/pipeline-tally.test.sh +740 -0
  230. package/scripts/plugin-version.sh +528 -0
  231. package/scripts/precommit-guard.sh +115 -0
  232. package/scripts/precommit-guard.test.sh +254 -0
  233. package/scripts/reconcile-live-heartbeats.ts +705 -0
  234. package/scripts/render-c4-model.sh +217 -0
  235. package/scripts/resolve-git-root.sh +55 -0
  236. package/scripts/resolve-regenerable-conflicts.sh +363 -0
  237. package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
  238. package/scripts/ruff-requirements.txt +22 -0
  239. package/scripts/run-in-pid-namespace.sh +98 -0
  240. package/scripts/run-in-pid-namespace.test.sh +290 -0
  241. package/scripts/scan-ancestor-signal-helpers.py +556 -0
  242. package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
  243. package/scripts/setup-ralph-loop.sh +238 -0
  244. package/scripts/sync-cursor-name-map.ts +316 -0
  245. package/scripts/sync-grok-agent-compat.ts +188 -0
  246. package/scripts/sync-npm-package.ts +165 -0
  247. package/scripts/sync-opencode-adapter.ts +498 -0
  248. package/scripts/sync-pr-behind.sh +647 -0
  249. package/scripts/sync-pr-behind.test.sh +252 -0
  250. package/scripts/taste-profile-update.sh +180 -0
  251. package/scripts/taste-profile-update.test.sh +167 -0
  252. package/scripts/write-budget-marker.sh +23 -0
  253. package/scripts/write-kb-coverage.ts +113 -0
  254. package/skills/admin-ip-refresh/SKILL.md +81 -0
  255. package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
  256. package/skills/agent-browser/SKILL.md +698 -0
  257. package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
  258. package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
  259. package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
  260. package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
  261. package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
  262. package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
  263. package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
  264. package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
  265. package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
  266. package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
  267. package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
  268. package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
  269. package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
  270. package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
  271. package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
  272. package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
  273. package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
  274. package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
  275. package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
  276. package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
  277. package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
  278. package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
  279. package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
  280. package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
  281. package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
  282. package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
  283. package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
  284. package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
  285. package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
  286. package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
  287. package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
  288. package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
  289. package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
  290. package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
  291. package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
  292. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
  293. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
  294. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
  295. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
  296. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
  297. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
  298. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
  299. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
  300. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
  301. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
  302. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
  303. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
  304. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
  305. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
  306. package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
  307. package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
  308. package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
  309. package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
  310. package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
  311. package/skills/agent-native-architecture/SKILL.md +479 -0
  312. package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
  313. package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
  314. package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
  315. package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
  316. package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
  317. package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
  318. package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
  319. package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
  320. package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
  321. package/skills/agent-native-architecture/references/product-implications.md +478 -0
  322. package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
  323. package/skills/agent-native-architecture/references/self-modification.md +294 -0
  324. package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
  325. package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
  326. package/skills/agent-native-audit/SKILL.md +300 -0
  327. package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
  328. package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
  329. package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
  330. package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
  331. package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
  332. package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
  333. package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
  334. package/skills/architecture/SKILL.md +436 -0
  335. package/skills/architecture/references/adr-template.md +154 -0
  336. package/skills/architecture/references/likec4-reference.md +136 -0
  337. package/skills/architecture/references/nfr-reference.md +126 -0
  338. package/skills/archive-kb/SKILL.md +86 -0
  339. package/skills/archive-kb/scripts/archive-kb.sh +300 -0
  340. package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
  341. package/skills/atdd-developer/SKILL.md +65 -0
  342. package/skills/brainstorm/SKILL.md +701 -0
  343. package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
  344. package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
  345. package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
  346. package/skills/brainstorm/references/ui-surface-terms.md +42 -0
  347. package/skills/brainstorm-techniques/SKILL.md +231 -0
  348. package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
  349. package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
  350. package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
  351. package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
  352. package/skills/campaign-calendar/SKILL.md +145 -0
  353. package/skills/cf-token-scope/SKILL.md +164 -0
  354. package/skills/cf-token-scope/references/widen-playbook.md +114 -0
  355. package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
  356. package/skills/changelog/SKILL.md +142 -0
  357. package/skills/code-to-prd/SKILL.md +66 -0
  358. package/skills/code-to-prd/references/banner-template.md +12 -0
  359. package/skills/code-to-prd/references/prd-template.md +41 -0
  360. package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
  361. package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
  362. package/skills/code-to-prd/test/fixture/.env.example +7 -0
  363. package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
  364. package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
  365. package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
  366. package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
  367. package/skills/code-to-prd/test/fixture/package.json +6 -0
  368. package/skills/cohort-status/SKILL.md +62 -0
  369. package/skills/community/SKILL.md +210 -0
  370. package/skills/community/scripts/bsky-community.sh +644 -0
  371. package/skills/community/scripts/bsky-setup.sh +631 -0
  372. package/skills/community/scripts/community-router.sh +93 -0
  373. package/skills/community/scripts/discord-community.sh +487 -0
  374. package/skills/community/scripts/discord-setup.sh +784 -0
  375. package/skills/community/scripts/github-community.sh +706 -0
  376. package/skills/community/scripts/hn-community.sh +233 -0
  377. package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
  378. package/skills/community/scripts/linkedin-community.sh +750 -0
  379. package/skills/community/scripts/linkedin-setup.sh +758 -0
  380. package/skills/community/scripts/x-community.sh +890 -0
  381. package/skills/community/scripts/x-setup.sh +713 -0
  382. package/skills/community/test/community-argv.test.sh +2922 -0
  383. package/skills/community/test/github-community.test.sh +981 -0
  384. package/skills/competitive-analysis/SKILL.md +69 -0
  385. package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
  386. package/skills/compound/SKILL.md +673 -0
  387. package/skills/compound/scripts/token-efficiency-report.sh +334 -0
  388. package/skills/compound/test/phase-16.test.sh +379 -0
  389. package/skills/compound-capture/SKILL.md +791 -0
  390. package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
  391. package/skills/compound-capture/assets/resolution-template.md +116 -0
  392. package/skills/compound-capture/references/yaml-schema.md +67 -0
  393. package/skills/compound-capture/schema.yaml +181 -0
  394. package/skills/constraint-scaffold/SKILL.md +175 -0
  395. package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
  396. package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
  397. package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
  398. package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
  399. package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
  400. package/skills/constraint-scaffold/references/shared-runner.template +135 -0
  401. package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
  402. package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
  403. package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
  404. package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
  405. package/skills/constraint-scaffold/test/generator.test.sh +93 -0
  406. package/skills/constraint-scaffold/test/parity.test.sh +285 -0
  407. package/skills/content-writer/SKILL.md +242 -0
  408. package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
  409. package/skills/cron-delete/SKILL.md +56 -0
  410. package/skills/cron-list/SKILL.md +54 -0
  411. package/skills/deepen-plan/SKILL.md +937 -0
  412. package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
  413. package/skills/deploy/SKILL.md +115 -0
  414. package/skills/deploy/references/hetzner-setup.md +67 -0
  415. package/skills/deploy/scripts/deploy.sh +37 -0
  416. package/skills/deploy-docs/SKILL.md +95 -0
  417. package/skills/dhh-rails-style/SKILL.md +203 -0
  418. package/skills/dhh-rails-style/references/architecture.md +717 -0
  419. package/skills/dhh-rails-style/references/controllers.md +323 -0
  420. package/skills/dhh-rails-style/references/frontend.md +556 -0
  421. package/skills/dhh-rails-style/references/gems.md +316 -0
  422. package/skills/dhh-rails-style/references/models.md +388 -0
  423. package/skills/dhh-rails-style/references/testing.md +354 -0
  424. package/skills/discord-content/SKILL.md +126 -0
  425. package/skills/docs-site/SKILL.md +214 -0
  426. package/skills/drain-labeled-backlog/SKILL.md +203 -0
  427. package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
  428. package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
  429. package/skills/drain-prs/SKILL.md +143 -0
  430. package/skills/drain-prs/scripts/triage-prs.sh +192 -0
  431. package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
  432. package/skills/dspy-ruby/SKILL.md +634 -0
  433. package/skills/dspy-ruby/assets/config-template.rb +359 -0
  434. package/skills/dspy-ruby/assets/module-template.rb +326 -0
  435. package/skills/dspy-ruby/assets/signature-template.rb +143 -0
  436. package/skills/dspy-ruby/references/core-concepts.md +268 -0
  437. package/skills/dspy-ruby/references/optimization.md +623 -0
  438. package/skills/dspy-ruby/references/providers.md +335 -0
  439. package/skills/eval-harness/README.md +194 -0
  440. package/skills/eval-harness/SKILL.md +157 -0
  441. package/skills/eval-harness/enums/go-routes.json +13 -0
  442. package/skills/eval-harness/enums/incident-threshold.json +5 -0
  443. package/skills/eval-harness/enums/lane.json +5 -0
  444. package/skills/eval-harness/enums/tool-selection.json +20 -0
  445. package/skills/eval-harness/enums/triage-levels.json +5 -0
  446. package/skills/eval-harness/gated-skills.json +34 -0
  447. package/skills/eval-harness/models.generated.json +5 -0
  448. package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
  449. package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
  450. package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
  451. package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
  452. package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
  453. package/skills/eval-harness/prompts/go-baseline.txt +6 -0
  454. package/skills/eval-harness/prompts/go-skill.txt +21 -0
  455. package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
  456. package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
  457. package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
  458. package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
  459. package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
  460. package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
  461. package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
  462. package/skills/eval-harness/prompts/triage-skill.txt +10 -0
  463. package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
  464. package/skills/eval-harness/scripts/extract-block.cjs +87 -0
  465. package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
  466. package/skills/eval-harness/scripts/gen-models.sh +41 -0
  467. package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
  468. package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
  469. package/skills/eval-harness/scripts/parse-label.cjs +93 -0
  470. package/skills/eval-harness/scripts/verdict.cjs +132 -0
  471. package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
  472. package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
  473. package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
  474. package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
  475. package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
  476. package/skills/eval-harness/test/eval-gate.test.sh +132 -0
  477. package/skills/eval-harness/test/extract-block.test.sh +87 -0
  478. package/skills/eval-harness/test/gate-classification.test.sh +77 -0
  479. package/skills/eval-harness/test/gen-models.test.sh +75 -0
  480. package/skills/eval-harness/test/measure-classification.test.sh +74 -0
  481. package/skills/eval-harness/test/parse-label.test.sh +129 -0
  482. package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
  483. package/skills/eval-harness/test/verdict.test.sh +123 -0
  484. package/skills/every-style-editor/SKILL.md +142 -0
  485. package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
  486. package/skills/feature-tweet/SKILL.md +199 -0
  487. package/skills/feature-video/SKILL.md +412 -0
  488. package/skills/feature-video/scripts/check_deps.sh +281 -0
  489. package/skills/file-todos/SKILL.md +267 -0
  490. package/skills/file-todos/assets/todo-template.md +166 -0
  491. package/skills/fix-issue/SKILL.md +278 -0
  492. package/skills/fix-issue/references/agent-authored-exclusion.md +120 -0
  493. package/skills/fix-issue/references/exclude-label-jq-snippet.md +97 -0
  494. package/skills/flag-bootstrap/SETUP.md +142 -0
  495. package/skills/flag-create/SKILL.md +145 -0
  496. package/skills/flag-create/scripts/create.sh +273 -0
  497. package/skills/flag-delete/SKILL.md +167 -0
  498. package/skills/flag-delete/scripts/delete.sh +288 -0
  499. package/skills/flag-list/SKILL.md +99 -0
  500. package/skills/flag-list/scripts/list.sh +275 -0
  501. package/skills/flag-set-role/SKILL.md +229 -0
  502. package/skills/flag-set-role/scripts/flip.sh +774 -0
  503. package/skills/frontend-anti-slop/SKILL.md +106 -0
  504. package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
  505. package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
  506. package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
  507. package/skills/frontend-design/SKILL.md +77 -0
  508. package/skills/gdpr-gate/NOTICE +136 -0
  509. package/skills/gdpr-gate/SKILL.md +341 -0
  510. package/skills/gdpr-gate/references/fields.md +160 -0
  511. package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
  512. package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
  513. package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
  514. package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
  515. package/skills/gdpr-gate/references/layers/frontend.md +249 -0
  516. package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
  517. package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
  518. package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
  519. package/skills/gdpr-gate/references/legal-consent.md +140 -0
  520. package/skills/gdpr-gate/references/non-negotiables.md +60 -0
  521. package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
  522. package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
  523. package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
  524. package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
  525. package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
  526. package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
  527. package/skills/gemini-imagegen/SKILL.md +283 -0
  528. package/skills/gemini-imagegen/requirements.txt +5 -0
  529. package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
  530. package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
  531. package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
  532. package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
  533. package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
  534. package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
  535. package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
  536. package/skills/git-worktree/SKILL.md +534 -0
  537. package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
  538. package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
  539. package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
  540. package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
  541. package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
  542. package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
  543. package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
  544. package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
  545. package/skills/go/SKILL.md +54 -0
  546. package/skills/growth/SKILL.md +164 -0
  547. package/skills/harvest-debt/SKILL.md +78 -0
  548. package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
  549. package/skills/heal-skill/SKILL.md +173 -0
  550. package/skills/help/SKILL.md +46 -0
  551. package/skills/incident/NOTICE +39 -0
  552. package/skills/incident/SKILL.md +395 -0
  553. package/skills/incident/scripts/dry-run.sh +448 -0
  554. package/skills/incident/scripts/redact-engine.py +412 -0
  555. package/skills/incident/scripts/redact-sentinel.sh +44 -0
  556. package/skills/incident/templates/pir.md +139 -0
  557. package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
  558. package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
  559. package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
  560. package/skills/incident/test/fixtures/positive-corpus.md +87 -0
  561. package/skills/incident/test/redact-sentinel.test.sh +1420 -0
  562. package/skills/invoice/SKILL.md +206 -0
  563. package/skills/kb-glossary/SKILL.md +71 -0
  564. package/skills/kb-glossary/references/glossary-format.md +111 -0
  565. package/skills/kb-glossary/references/rejected-request-register.md +115 -0
  566. package/skills/kb-search/SKILL.md +276 -0
  567. package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
  568. package/skills/legal-audit/SKILL.md +161 -0
  569. package/skills/legal-generate/NOTICE +242 -0
  570. package/skills/legal-generate/SKILL.md +244 -0
  571. package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
  572. package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
  573. package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
  574. package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
  575. package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
  576. package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
  577. package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
  578. package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
  579. package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
  580. package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
  581. package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
  582. package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
  583. package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
  584. package/skills/linear-fetch/SKILL.md +247 -0
  585. package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
  586. package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
  587. package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
  588. package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
  589. package/skills/linear-fetch/test/parity.test.sh +112 -0
  590. package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
  591. package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
  592. package/skills/merge-pr/SKILL.md +670 -0
  593. package/skills/model-launch-review/SKILL.md +255 -0
  594. package/skills/model-launch-review/scripts/audit-models.sh +501 -0
  595. package/skills/one-shot/SKILL.md +316 -0
  596. package/skills/one-shot/references/token-discipline.md +74 -0
  597. package/skills/operator-bootstrap/SKILL.md +412 -0
  598. package/skills/operator-bootstrap/template.sh +439 -0
  599. package/skills/operator-digest/SKILL.md +287 -0
  600. package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
  601. package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
  602. package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
  603. package/skills/operator-rephrase/SKILL.md +98 -0
  604. package/skills/pencil-setup/SKILL.md +201 -0
  605. package/skills/pencil-setup/scripts/check_deps.sh +556 -0
  606. package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
  607. package/skills/pencil-setup/scripts/package-lock.json +1172 -0
  608. package/skills/pencil-setup/scripts/package.json +14 -0
  609. package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
  610. package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
  611. package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
  612. package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
  613. package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
  614. package/skills/plan/SKILL.md +1140 -0
  615. package/skills/plan/references/differential-migration-testing.md +185 -0
  616. package/skills/plan/references/plan-community-discovery.md +42 -0
  617. package/skills/plan/references/plan-founder-check.md +137 -0
  618. package/skills/plan/references/plan-functional-overlap.md +25 -0
  619. package/skills/plan/references/plan-host-fanout.md +51 -0
  620. package/skills/plan/references/plan-issue-templates.md +779 -0
  621. package/skills/plan/references/plan-network-outage-checklist.md +131 -0
  622. package/skills/plan/references/plan-scope-check.md +126 -0
  623. package/skills/plan/references/plan-sharp-edges.md +331 -0
  624. package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
  625. package/skills/plan/references/webapp-cwv-observability.md +143 -0
  626. package/skills/plan-review/SKILL.md +91 -0
  627. package/skills/plan-review/lib/named-panel.mjs +58 -0
  628. package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
  629. package/skills/postmerge/SKILL.md +642 -0
  630. package/skills/postmerge/references/deploy-status-debugging.md +141 -0
  631. package/skills/postmerge/references/graceful-degradation.md +20 -0
  632. package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
  633. package/skills/preflight/SKILL.md +1553 -0
  634. package/skills/preflight/references/check-13-founder-check.md +286 -0
  635. package/skills/preflight/scripts/founder-check.py +1640 -0
  636. package/skills/preflight/scripts/parse-form-a.awk +107 -0
  637. package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
  638. package/skills/product-roadmap/SKILL.md +357 -0
  639. package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
  640. package/skills/provision-cloudflare/SKILL.md +67 -0
  641. package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
  642. package/skills/provision-doppler/SKILL.md +58 -0
  643. package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
  644. package/skills/provision-github/SKILL.md +59 -0
  645. package/skills/provision-github/scripts/provision-github.sh +300 -0
  646. package/skills/provision-hetzner/SKILL.md +76 -0
  647. package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
  648. package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
  649. package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
  650. package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
  651. package/skills/qa/SKILL.md +263 -0
  652. package/skills/qa/references/browser-preflight.md +22 -0
  653. package/skills/questionnaire-generate/SKILL.md +328 -0
  654. package/skills/questionnaire-generate/references/questionnaire.template +60 -0
  655. package/skills/rclone/SKILL.md +162 -0
  656. package/skills/rclone/scripts/check_setup.sh +63 -0
  657. package/skills/release-announce/SKILL.md +65 -0
  658. package/skills/release-docs/SKILL.md +92 -0
  659. package/skills/reproduce-bug/SKILL.md +358 -0
  660. package/skills/resolve-debt/SKILL.md +85 -0
  661. package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
  662. package/skills/resolve-parallel/SKILL.md +45 -0
  663. package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
  664. package/skills/resolve-pr-parallel/SKILL.md +68 -0
  665. package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
  666. package/skills/resolve-todo-parallel/SKILL.md +57 -0
  667. package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
  668. package/skills/review/SKILL.md +1620 -0
  669. package/skills/review/references/anti-slop-scanner-hook.md +40 -0
  670. package/skills/review/references/defect-classes-migrations.md +9 -0
  671. package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
  672. package/skills/review/references/review-e2e-testing.md +116 -0
  673. package/skills/review/references/review-evidence-comment.md +36 -0
  674. package/skills/review/references/review-todo-structure.md +165 -0
  675. package/skills/review/references/risk-tier-and-fix-rounds.md +97 -0
  676. package/skills/review/references/semgrep-custom-rules.yaml +174 -0
  677. package/skills/review/references/ultrathink-phases.md +98 -0
  678. package/skills/review/references/wfs.md +6 -0
  679. package/skills/review/scripts/emit-review-trailer.sh +499 -0
  680. package/skills/review/scripts/ensure-semgrep.sh +99 -0
  681. package/skills/review/scripts/fix-round-seats.sh +197 -0
  682. package/skills/review/test/emit-review-trailer.test.sh +387 -0
  683. package/skills/review/test/ensure-semgrep.test.sh +111 -0
  684. package/skills/review/test/fix-round-seats.test.sh +237 -0
  685. package/skills/review/workflows/README.md +147 -0
  686. package/skills/review/workflows/review.workflow.js +667 -0
  687. package/skills/schedule/SKILL.md +796 -0
  688. package/skills/seo-aeo/SKILL.md +139 -0
  689. package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
  690. package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
  691. package/skills/ship/SKILL.md +3023 -0
  692. package/skills/ship/references/adr-ordinal-collision.md +47 -0
  693. package/skills/ship/references/affected-gate-contract.md +115 -0
  694. package/skills/ship/references/ci-run-diagnosis.md +29 -0
  695. package/skills/ship/references/ci-workflow-authoring.md +68 -0
  696. package/skills/ship/references/cleanup-merged-archival.md +39 -0
  697. package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
  698. package/skills/ship/references/cto-ruling-armed-push.md +5 -0
  699. package/skills/ship/references/decision-challenges-render.md +71 -0
  700. package/skills/ship/references/delegated-act-authoring-form.md +7 -0
  701. package/skills/ship/references/detached-battery-verdict.md +13 -0
  702. package/skills/ship/references/epic-close-sweep.md +62 -0
  703. package/skills/ship/references/feature-tweet-draft.md +42 -0
  704. package/skills/ship/references/followthrough-issue-body-template.md +47 -0
  705. package/skills/ship/references/followthrough-stub-template.sh +92 -0
  706. package/skills/ship/references/merge-queue-dequeue.md +39 -0
  707. package/skills/ship/references/operator-holds.md +179 -0
  708. package/skills/ship/references/pipeline-tally-render.md +43 -0
  709. package/skills/ship/references/pr-overlap.md +153 -0
  710. package/skills/ship/references/queue-mode.md +7 -0
  711. package/skills/ship/references/ready-run-wait.md +36 -0
  712. package/skills/ship/references/red-on-main-quarantine.md +110 -0
  713. package/skills/ship/references/register-update-pr-pattern.md +88 -0
  714. package/skills/ship/references/settle-then-admin-merge.md +130 -0
  715. package/skills/ship/references/supabase-column-probe.md +13 -0
  716. package/skills/ship/scripts/auto-close-scan.sh +76 -0
  717. package/skills/ship/scripts/battery-owed.sh +403 -0
  718. package/skills/ship/scripts/hold-gate-eval.sh +410 -0
  719. package/skills/ship/scripts/net-issue-flow.sh +665 -0
  720. package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
  721. package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
  722. package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
  723. package/skills/skill-creator/SKILL.md +299 -0
  724. package/skills/skill-creator/references/api-security.md +248 -0
  725. package/skills/skill-creator/references/authoring-levers.md +110 -0
  726. package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
  727. package/skills/skill-creator/references/best-practices.md +431 -0
  728. package/skills/skill-creator/references/common-patterns.md +639 -0
  729. package/skills/skill-creator/references/core-principles.md +193 -0
  730. package/skills/skill-creator/references/executable-code.md +188 -0
  731. package/skills/skill-creator/references/iteration-and-testing.md +509 -0
  732. package/skills/skill-creator/references/official-spec.md +193 -0
  733. package/skills/skill-creator/references/recommended-structure.md +180 -0
  734. package/skills/skill-creator/references/skill-structure.md +396 -0
  735. package/skills/skill-creator/references/using-scripts.md +122 -0
  736. package/skills/skill-creator/references/using-templates.md +120 -0
  737. package/skills/skill-creator/references/workflows-and-validation.md +541 -0
  738. package/skills/skill-creator/scripts/init_skill.py +322 -0
  739. package/skills/skill-creator/scripts/package_skill.py +110 -0
  740. package/skills/skill-creator/scripts/quick_validate.py +64 -0
  741. package/skills/skill-creator/templates/router-skill.md +73 -0
  742. package/skills/skill-creator/templates/simple-skill.md +34 -0
  743. package/skills/skill-creator/workflows/add-reference.md +96 -0
  744. package/skills/skill-creator/workflows/add-script.md +104 -0
  745. package/skills/skill-creator/workflows/add-template.md +83 -0
  746. package/skills/skill-creator/workflows/add-workflow.md +128 -0
  747. package/skills/skill-creator/workflows/audit-skill.md +159 -0
  748. package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
  749. package/skills/skill-creator/workflows/create-new-skill.md +207 -0
  750. package/skills/skill-creator/workflows/get-guidance.md +134 -0
  751. package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
  752. package/skills/skill-creator/workflows/verify-skill.md +226 -0
  753. package/skills/skill-security-scan/SKILL.md +145 -0
  754. package/skills/skill-security-scan/references/disclaimer.md +21 -0
  755. package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
  756. package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
  757. package/skills/skill-security-scan/references/override-mechanism.md +171 -0
  758. package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
  759. package/skills/skill-security-scan/references/regex-patterns.md +136 -0
  760. package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
  761. package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
  762. package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
  763. package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
  764. package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
  765. package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
  766. package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
  767. package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
  768. package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
  769. package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
  770. package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
  771. package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
  772. package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
  773. package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
  774. package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
  775. package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
  776. package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
  777. package/skills/skill-security-scan/scripts/lib.sh +197 -0
  778. package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
  779. package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
  780. package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
  781. package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
  782. package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
  783. package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
  784. package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
  785. package/skills/social-distribute/SKILL.md +485 -0
  786. package/skills/spec-templates/SKILL.md +274 -0
  787. package/skills/sync/SKILL.md +49 -0
  788. package/skills/test-browser/SKILL.md +464 -0
  789. package/skills/test-browser/references/feature-map.md +161 -0
  790. package/skills/test-fix-loop/SKILL.md +159 -0
  791. package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
  792. package/skills/triage/SKILL.md +402 -0
  793. package/skills/trigger-cron/SKILL.md +136 -0
  794. package/skills/trigger-cron/scripts/trigger.sh +198 -0
  795. package/skills/user-set-role/SKILL.md +147 -0
  796. package/skills/user-set-role/scripts/set-role.sh +218 -0
  797. package/skills/user-story-writer/SKILL.md +77 -0
  798. package/skills/ux-audit/SKILL.md +251 -0
  799. package/skills/ux-audit/references/finding.schema.json +62 -0
  800. package/skills/ux-audit/references/route-list.yaml +95 -0
  801. package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
  802. package/skills/ux-audit/scripts/bot-signin.ts +135 -0
  803. package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
  804. package/skills/verification-scaffold/SKILL.md +73 -0
  805. package/skills/verification-scaffold/references/gitleaks.toml.template +13 -0
  806. package/skills/verification-scaffold/references/guardrail-audit.md +156 -0
  807. package/skills/verification-scaffold/references/guards/block-stash-hook.sh.template +72 -0
  808. package/skills/verification-scaffold/references/guards/commit-on-main-hook.sh.template +82 -0
  809. package/skills/verification-scaffold/references/guards/orphan-test-check.sh.template +102 -0
  810. package/skills/verification-scaffold/references/guards/precommit-guard.sh.template +115 -0
  811. package/skills/verification-scaffold/references/guards/secret-scan-hook.sh.template +176 -0
  812. package/skills/verification-scaffold/references/guards/verification-gates.yml.template +49 -0
  813. package/skills/verification-scaffold/references/guards/wrapper-boundary.sh.template +47 -0
  814. package/skills/verification-scaffold/references/guards.tsv +21 -0
  815. package/skills/verification-scaffold/references/verification-readme.template +55 -0
  816. package/skills/verification-scaffold/scripts/verification-scaffold.sh +785 -0
  817. package/skills/verification-scaffold/test/bite-proof.test.sh +159 -0
  818. package/skills/verification-scaffold/test/generator.test.sh +319 -0
  819. package/skills/verification-scaffold/test/manifest.test.sh +144 -0
  820. package/skills/work/SKILL.md +1480 -0
  821. package/skills/work/references/end-of-work-resume.md +7 -0
  822. package/skills/work/references/hook-test-main-cwd.md +24 -0
  823. package/skills/work/references/key-principles.md +83 -0
  824. package/skills/work/references/property-testing.md +122 -0
  825. package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
  826. package/skills/work/references/work-agent-teams.md +97 -0
  827. package/skills/work/references/work-lifecycle-parallel.md +147 -0
  828. package/skills/work/references/work-lockfile-bumps.md +97 -0
  829. package/skills/work/references/work-scratch-sandboxes.md +212 -0
  830. package/skills/work/references/work-subagent-fanout.md +61 -0
  831. package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
  832. package/skills/xcode-test/SKILL.md +360 -0
@@ -0,0 +1,634 @@
1
+ #!/usr/bin/env bash
2
+ # code-to-prd: reverse-engineer a Next.js codebase into a PRD (#2726).
3
+ #
4
+ # Single-script implementation per Simplicity review: walker + framework
5
+ # detection + extraction + render + 3-layer fail-closed redaction
6
+ # orchestration. v1 = Next.js only (App Router + Pages Router).
7
+ #
8
+ # Usage:
9
+ # bash code-to-prd.sh <target-codebase-path> [<output-path>]
10
+ #
11
+ # If <output-path> is omitted, defaults to
12
+ # `knowledge-base/product/prd/<package-name>-prd.md` resolved relative to the
13
+ # repo root containing this script.
14
+ #
15
+ # Exit codes:
16
+ # 0 — PRD written successfully (or degraded-success path per FR8.1)
17
+ # 1 — a redaction layer found secret-shaped content; the PRD was NOT
18
+ # written (Layer 2 sentinel, or a Layer 3 gitleaks finding)
19
+ # 2 — preflight failed (gitleaks missing or not runnable, no package.json,
20
+ # empty walker, not Next.js, target unreadable, etc.), OR the Layer 3
21
+ # scan did not complete — the PRD was not written, never "found secrets"
22
+ # 3 — IO error writing the PRD (loud operator message)
23
+ #
24
+ # Env knobs (test-only — never used in normal operation):
25
+ # CODE_TO_PRD_SKIP_LAYER_2=1 — bypass Layer 2 sentinel (AC5 RED test).
26
+ # CODE_TO_PRD_FAKE_SFA_FAIL=1 — force the SKIPPED gap-analysis placeholder
27
+ # (degraded-success path, FR8.1 / AC7). No-op in default flow because
28
+ # v1 always writes the SKIPPED placeholder — operator runs
29
+ # spec-flow-analyzer via Task to populate it afterward.
30
+
31
+ set -uo pipefail
32
+
33
+ # ---------------------------------------------------------------------------
34
+ # Path resolution
35
+ # ---------------------------------------------------------------------------
36
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
37
+ SKILL_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
38
+ PLUGIN_DIR="$(cd "${SKILL_DIR}/../.." && pwd)"
39
+ REPO_ROOT="$(cd "${PLUGIN_DIR}/../.." && pwd)"
40
+
41
+ REDACT_SENTINEL="${PLUGIN_DIR}/skills/incident/scripts/redact-sentinel.sh"
42
+ BANNER_TEMPLATE="${SKILL_DIR}/references/banner-template.md"
43
+
44
+ # ---------------------------------------------------------------------------
45
+ # Arg parsing
46
+ # ---------------------------------------------------------------------------
47
+ if [[ $# -lt 1 || $# -gt 2 ]]; then
48
+ echo "usage: code-to-prd.sh <target-codebase-path> [<output-path>]" >&2
49
+ exit 2
50
+ fi
51
+
52
+ TARGET="$1"
53
+ OUTPUT_OVERRIDE="${2:-}"
54
+
55
+ # ---------------------------------------------------------------------------
56
+ # Phase 0 preflight (FR6.2 + FR1.1)
57
+ # ---------------------------------------------------------------------------
58
+ GL_REMEDIATION="CI pins gitleaks 8.24.2 — install that version or pin it in your version manager (e.g. 'mise use gitleaks@8.24.2')."
59
+ if ! command -v gitleaks >/dev/null 2>&1; then
60
+ echo "code-to-prd: gitleaks not found on PATH. ${GL_REMEDIATION}" >&2
61
+ echo " Layer 3 verifier is mandatory (single-user incident threshold)." >&2
62
+ exit 2
63
+ fi
64
+ # RESOLVABLE IS NOT RUNNABLE (#8266): an unpinned version-manager shim satisfies
65
+ # `command -v` and exits non-zero on every call. Probe by running it. The bound
66
+ # uses timeout, then gtimeout, then none — stock macOS ships neither, and a
67
+ # missing bound must not be misread as a broken gitleaks.
68
+ GL_TIMEOUT=()
69
+ if command -v timeout >/dev/null 2>&1; then GL_TIMEOUT=(timeout 10)
70
+ elif command -v gtimeout >/dev/null 2>&1; then GL_TIMEOUT=(gtimeout 10); fi
71
+ # `${a[@]+"${a[@]}"}`, not `"${a[@]}"`: bash 3.2 (stock macOS /bin/bash) treats an
72
+ # EMPTY array as unbound under `set -u`, which is exactly the no-timeout host.
73
+ gl_probe_rc=0
74
+ gl_probe_err="$( { ${GL_TIMEOUT[@]+"${GL_TIMEOUT[@]}"} gitleaks version >/dev/null; } 2>&1 )" || gl_probe_rc=$?
75
+ if (( gl_probe_rc != 0 )); then
76
+ printf 'code-to-prd: gitleaks is on PATH but not runnable (rc=%s, %q). %s\n' \
77
+ "${gl_probe_rc}" "${gl_probe_err%%$'\n'*}" "${GL_REMEDIATION}" >&2
78
+ echo " Layer 3 verifier is mandatory (single-user incident threshold)." >&2
79
+ exit 2
80
+ fi
81
+
82
+ if [[ ! -d "${TARGET}" ]]; then
83
+ echo "code-to-prd: target directory does not exist: ${TARGET}" >&2
84
+ exit 2
85
+ fi
86
+
87
+ TARGET_ABS="$(cd "${TARGET}" && pwd)"
88
+
89
+ if [[ ! -f "${TARGET_ABS}/package.json" ]]; then
90
+ echo "code-to-prd: no package.json at target root: ${TARGET_ABS}/package.json" >&2
91
+ exit 2
92
+ fi
93
+
94
+ if [[ ! -r "${REDACT_SENTINEL}" ]]; then
95
+ echo "code-to-prd: incident/scripts/redact-sentinel.sh missing or not readable." >&2
96
+ echo " expected at: ${REDACT_SENTINEL}" >&2
97
+ exit 2
98
+ fi
99
+
100
+ if [[ ! -r "${BANNER_TEMPLATE}" ]]; then
101
+ echo "code-to-prd: banner-template.md missing at ${BANNER_TEMPLATE}" >&2
102
+ exit 2
103
+ fi
104
+
105
+ # ---------------------------------------------------------------------------
106
+ # Framework detection — Next.js required (FR1)
107
+ # ---------------------------------------------------------------------------
108
+ NEXT_CONFIG=""
109
+ for ext in js ts mjs cjs; do
110
+ candidate="${TARGET_ABS}/next.config.${ext}"
111
+ if [[ -f "${candidate}" ]]; then
112
+ NEXT_CONFIG="${candidate}"
113
+ break
114
+ fi
115
+ done
116
+
117
+ if [[ -z "${NEXT_CONFIG}" ]]; then
118
+ echo "code-to-prd: framework detection failed — no next.config.{js,ts,mjs,cjs} at ${TARGET_ABS}" >&2
119
+ echo " v1 supports Next.js only. Rails/Django are tracked for v2 (#2726 deferrals)." >&2
120
+ exit 2
121
+ fi
122
+
123
+ # ---------------------------------------------------------------------------
124
+ # Walker — git ls-files honors .gitignore (FR2) + path filter (Layer 1) +
125
+ # realpath symlink rejection (FR2.1)
126
+ # ---------------------------------------------------------------------------
127
+ if ! git -C "${TARGET_ABS}" rev-parse --git-dir >/dev/null 2>&1; then
128
+ # Not a git repo — fall back to find, but the fixture and production targets
129
+ # are expected to be under git. Empty fallback list triggers FR1.1 below.
130
+ RAW_FILES=""
131
+ else
132
+ RAW_FILES="$(git -C "${TARGET_ABS}" ls-files -c -o --exclude-standard 2>/dev/null || true)"
133
+ fi
134
+
135
+ # FR1.1: empty walker means the target is a directory but tracks nothing.
136
+ if [[ -z "${RAW_FILES}" ]]; then
137
+ echo "code-to-prd: walker returned 0 files for ${TARGET_ABS} — target must be under git with tracked files." >&2
138
+ echo " Monorepo support deferred to v2; v1 scopes to the directory containing the first package.json." >&2
139
+ exit 2
140
+ fi
141
+
142
+ # Layer 1 — path-exclusion filter
143
+ is_excluded() {
144
+ local p="$1"
145
+ case "${p}" in
146
+ .env|.env.*|*/.env|*/.env.*) return 0 ;;
147
+ secrets.*|*/secrets.*) return 0 ;;
148
+ *.pem|*.key) return 0 ;;
149
+ credentials.*|*/credentials.*) return 0 ;;
150
+ master.key|*/master.key) return 0 ;;
151
+ .git/*|*/.git/*) return 0 ;;
152
+ esac
153
+ return 1
154
+ }
155
+
156
+ # FR2.1: resolve each candidate via realpath and reject anything that
157
+ # escapes <target> (planted symlinks in inherited-prototype threat model).
158
+ declare -a FILES
159
+ declare -a EXCLUDED_FILES
160
+ EXCLUDED_BY_FILTER=0
161
+ EXCLUDED_BY_SYMLINK=0
162
+ while IFS= read -r rel; do
163
+ [[ -z "${rel}" ]] && continue
164
+ full="${TARGET_ABS}/${rel}"
165
+ if [[ ! -e "${full}" ]]; then
166
+ continue
167
+ fi
168
+ # Reject symlinks outright (v1 stance).
169
+ if [[ -L "${full}" ]]; then
170
+ EXCLUDED_BY_SYMLINK=$((EXCLUDED_BY_SYMLINK + 1))
171
+ continue
172
+ fi
173
+ resolved="$(realpath --relative-base="${TARGET_ABS}" "${full}" 2>/dev/null || echo "${full}")"
174
+ # Anything starting with `/` or `../` escaped the target root.
175
+ case "${resolved}" in
176
+ /*|../*)
177
+ EXCLUDED_BY_SYMLINK=$((EXCLUDED_BY_SYMLINK + 1))
178
+ continue
179
+ ;;
180
+ esac
181
+ if is_excluded "${rel}"; then
182
+ EXCLUDED_BY_FILTER=$((EXCLUDED_BY_FILTER + 1))
183
+ EXCLUDED_FILES+=("${rel}")
184
+ continue
185
+ fi
186
+ FILES+=("${rel}")
187
+ done <<< "${RAW_FILES}"
188
+
189
+ WALKER_COUNT=${#FILES[@]}
190
+ EXCLUDED_TOTAL=$((EXCLUDED_BY_FILTER + EXCLUDED_BY_SYMLINK))
191
+
192
+ if (( WALKER_COUNT == 0 )); then
193
+ echo "code-to-prd: walker emitted no eligible files after path-exclusion filter." >&2
194
+ echo " excluded by filter: ${EXCLUDED_BY_FILTER}; excluded as symlink: ${EXCLUDED_BY_SYMLINK}" >&2
195
+ exit 2
196
+ fi
197
+
198
+ # ---------------------------------------------------------------------------
199
+ # Helpers — project name + output path
200
+ # ---------------------------------------------------------------------------
201
+ extract_package_name() {
202
+ # Best-effort: grep the first `"name": "..."` line. Sanitization to kebab-case
203
+ # handles scoped packages (`@org/pkg` → `org-pkg`).
204
+ awk '
205
+ /"name"[[:space:]]*:/ {
206
+ match($0, /"name"[[:space:]]*:[[:space:]]*"([^"]+)"/, a)
207
+ if (a[1] != "") { print a[1]; exit }
208
+ }
209
+ ' "${TARGET_ABS}/package.json" 2>/dev/null
210
+ }
211
+
212
+ kebab_case() {
213
+ printf '%s' "$1" \
214
+ | tr '[:upper:]' '[:lower:]' \
215
+ | sed -E 's|@||g; s|/|-|g; s|[^a-z0-9-]+|-|g; s|^-+||; s|-+$||'
216
+ }
217
+
218
+ PROJECT_NAME_RAW="$(extract_package_name)"
219
+ PROJECT_NAME="$(kebab_case "${PROJECT_NAME_RAW:-unnamed-next-project}")"
220
+ [[ -z "${PROJECT_NAME}" ]] && PROJECT_NAME="unnamed-next-project"
221
+
222
+ if [[ -n "${OUTPUT_OVERRIDE}" ]]; then
223
+ OUTPUT_PATH="${OUTPUT_OVERRIDE}"
224
+ else
225
+ OUTPUT_PATH="${REPO_ROOT}/knowledge-base/product/prd/${PROJECT_NAME}-prd.md"
226
+ fi
227
+
228
+ mkdir -p "$(dirname "${OUTPUT_PATH}")"
229
+
230
+ # ---------------------------------------------------------------------------
231
+ # Extraction helpers (regex-only; v1 has no AST analysis — see Coverage Caveats)
232
+ # ---------------------------------------------------------------------------
233
+ file_in_target() { printf '%s' "${TARGET_ABS}/$1"; }
234
+
235
+ # Filter FILES[] by extension/path-pattern.
236
+ filter_files() {
237
+ local pattern="$1"
238
+ local f
239
+ for f in "${FILES[@]}"; do
240
+ if [[ "${f}" =~ ${pattern} ]]; then
241
+ printf '%s\n' "${f}"
242
+ fi
243
+ done
244
+ }
245
+
246
+ # Extract first JSDoc/TSDoc one-liner above the default export — best effort.
247
+ first_jsdoc() {
248
+ local file="$1"
249
+ awk '
250
+ /^\/\*\*/ { in_block=1; buf=""; next }
251
+ in_block && /^[[:space:]]*\*\// { in_block=0; print buf; exit }
252
+ in_block {
253
+ line=$0
254
+ sub(/^[[:space:]]*\*[[:space:]]?/, "", line)
255
+ if (line != "" && buf == "") { buf = line }
256
+ }
257
+ ' "${file}" 2>/dev/null | head -1
258
+ }
259
+
260
+ # Extract HTTP methods exported from a route handler (named exports).
261
+ route_methods() {
262
+ local file="$1"
263
+ grep -oE 'export[[:space:]]+(async[[:space:]]+)?function[[:space:]]+(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\b' "${file}" 2>/dev/null \
264
+ | awk '{print $NF}' \
265
+ | sort -u \
266
+ | paste -sd, -
267
+ }
268
+
269
+ # Path → route (App Router): app/foo/bar/page.tsx → /foo/bar
270
+ app_route_from_path() {
271
+ local p="$1"
272
+ p="${p#app/}"
273
+ p="${p%/page.*}"
274
+ p="${p%/route.*}"
275
+ if [[ "${p}" == "page."* || "${p}" == "route."* ]]; then
276
+ echo "/"
277
+ else
278
+ echo "/${p}"
279
+ fi
280
+ }
281
+
282
+ # Path → route (Pages Router): pages/foo/bar.tsx → /foo/bar; index → /
283
+ pages_route_from_path() {
284
+ local p="$1"
285
+ p="${p#pages/}"
286
+ p="${p%.tsx}"; p="${p%.ts}"; p="${p%.jsx}"; p="${p%.js}"
287
+ p="${p%/index}"
288
+ if [[ "${p}" == "index" ]]; then
289
+ echo "/"
290
+ else
291
+ echo "/${p}"
292
+ fi
293
+ }
294
+
295
+ # ---------------------------------------------------------------------------
296
+ # Section renderers — emit to stdout, captured by the orchestrator below
297
+ # ---------------------------------------------------------------------------
298
+ render_routes() {
299
+ echo "## Routes"
300
+ echo ""
301
+ echo "### App Router"
302
+ echo ""
303
+ local app_pages=() app_handlers=()
304
+ while IFS= read -r f; do
305
+ [[ -n "${f}" ]] && app_pages+=("${f}")
306
+ done < <(filter_files '^app/.*page\.(tsx|jsx|ts|js)$')
307
+ while IFS= read -r f; do
308
+ [[ -n "${f}" ]] && app_handlers+=("${f}")
309
+ done < <(filter_files '^app/.*route\.(ts|js)$')
310
+
311
+ if (( ${#app_pages[@]} == 0 && ${#app_handlers[@]} == 0 )); then
312
+ echo "_No App Router routes detected._"
313
+ echo ""
314
+ else
315
+ echo "| Route | File | Methods | Description |"
316
+ echo "|---|---|---|---|"
317
+ local f route desc methods
318
+ for f in "${app_pages[@]}"; do
319
+ route="$(app_route_from_path "${f}")"
320
+ desc="$(first_jsdoc "$(file_in_target "${f}")")"
321
+ desc="${desc:-—}"
322
+ printf '| `%s` | `%s` | page | %s |\n' "${route}" "${f}" "${desc}"
323
+ done
324
+ for f in "${app_handlers[@]}"; do
325
+ route="$(app_route_from_path "${f}")"
326
+ methods="$(route_methods "$(file_in_target "${f}")")"
327
+ methods="${methods:-?}"
328
+ desc="$(first_jsdoc "$(file_in_target "${f}")")"
329
+ desc="${desc:-—}"
330
+ printf '| `%s` | `%s` | %s | %s |\n' "${route}" "${f}" "${methods}" "${desc}"
331
+ done
332
+ echo ""
333
+ fi
334
+
335
+ echo "### Pages Router"
336
+ echo ""
337
+ local pages_routes=()
338
+ while IFS= read -r f; do
339
+ [[ -n "${f}" ]] && pages_routes+=("${f}")
340
+ done < <(filter_files '^pages/[^_].*\.(tsx|jsx|ts|js)$')
341
+
342
+ if (( ${#pages_routes[@]} == 0 )); then
343
+ echo "_No Pages Router routes detected._"
344
+ echo ""
345
+ else
346
+ echo "| Route | File | Description |"
347
+ echo "|---|---|---|"
348
+ local f route desc
349
+ for f in "${pages_routes[@]}"; do
350
+ route="$(pages_route_from_path "${f}")"
351
+ desc="$(first_jsdoc "$(file_in_target "${f}")")"
352
+ desc="${desc:-—}"
353
+ printf '| `%s` | `%s` | %s |\n' "${route}" "${f}" "${desc}"
354
+ done
355
+ echo ""
356
+ fi
357
+ }
358
+
359
+ render_state_shapes() {
360
+ echo "## State Shapes"
361
+ echo ""
362
+ echo "Regex-derived snapshot of client-state hooks across tracked files. Best-effort; see Coverage Caveats."
363
+ echo ""
364
+ local count=0
365
+ local f
366
+ for f in "${FILES[@]}"; do
367
+ [[ "${f}" =~ \.(tsx|jsx|ts|js)$ ]] || continue
368
+ local full
369
+ full="$(file_in_target "${f}")"
370
+ while IFS= read -r line; do
371
+ [[ -z "${line}" ]] && continue
372
+ printf -- '- `%s` — `%s`\n' "${f}" "${line}"
373
+ count=$((count + 1))
374
+ done < <(grep -nE '\buse(State|Reducer)\b\s*[(<]' "${full}" 2>/dev/null | head -3)
375
+ done
376
+ if (( count == 0 )); then
377
+ echo "_No `useState`/`useReducer` call sites detected._"
378
+ fi
379
+ echo ""
380
+ }
381
+
382
+ render_api_deps() {
383
+ echo "## API & External Dependencies"
384
+ echo ""
385
+ echo "### fetch() literal URLs"
386
+ echo ""
387
+ local hits
388
+ hits="$(
389
+ for f in "${FILES[@]}"; do
390
+ [[ "${f}" =~ \.(tsx|jsx|ts|js|mjs|cjs)$ ]] || continue
391
+ grep -hEo "fetch\(['\"][^'\"]+['\"]" "$(file_in_target "${f}")" 2>/dev/null \
392
+ | sed -E "s/^fetch\(['\"]//; s/['\"]\$//"
393
+ done | sort -u
394
+ )"
395
+ if [[ -z "${hits}" ]]; then
396
+ echo "_None detected._"
397
+ else
398
+ while IFS= read -r u; do
399
+ [[ -z "${u}" ]] && continue
400
+ printf -- '- `%s`\n' "${u}"
401
+ done <<< "${hits}"
402
+ fi
403
+ echo ""
404
+
405
+ echo "### Internal API imports"
406
+ echo ""
407
+ hits="$(
408
+ for f in "${FILES[@]}"; do
409
+ [[ "${f}" =~ \.(tsx|jsx|ts|js|mjs|cjs)$ ]] || continue
410
+ grep -hEo "from[[:space:]]+['\"]@/(lib/api[^'\"]*|server/[^'\"]*)['\"]" "$(file_in_target "${f}")" 2>/dev/null \
411
+ | sed -E "s/^from[[:space:]]+['\"]//; s/['\"]\$//"
412
+ done | sort -u
413
+ )"
414
+ if [[ -z "${hits}" ]]; then
415
+ echo "_None detected._"
416
+ else
417
+ while IFS= read -r u; do
418
+ [[ -z "${u}" ]] && continue
419
+ printf -- '- `%s`\n' "${u}"
420
+ done <<< "${hits}"
421
+ fi
422
+ echo ""
423
+
424
+ echo "### Environment-variable names (FR5 — values never read)"
425
+ echo ""
426
+ hits="$(
427
+ for f in "${FILES[@]}"; do
428
+ [[ "${f}" =~ \.(tsx|jsx|ts|js|mjs|cjs)$ ]] || continue
429
+ grep -hEo 'process\.env\.[A-Z_][A-Z0-9_]*' "$(file_in_target "${f}")" 2>/dev/null \
430
+ | sed -E 's/^process\.env\.//'
431
+ done | sort -u
432
+ )"
433
+ if [[ -z "${hits}" ]]; then
434
+ echo "_None detected._"
435
+ else
436
+ while IFS= read -r u; do
437
+ [[ -z "${u}" ]] && continue
438
+ printf -- '- `%s`\n' "${u}"
439
+ done <<< "${hits}"
440
+ fi
441
+ echo ""
442
+
443
+ echo "### Third-party SDK packages (from package.json)"
444
+ echo ""
445
+ hits="$(
446
+ awk '
447
+ /"(dependencies|peerDependencies|devDependencies)"[[:space:]]*:/ { in_deps=1; depth=0; next }
448
+ in_deps && /\{/ { depth++ }
449
+ in_deps && /\}/ { depth--; if (depth <= 0) { in_deps=0; depth=0; next } }
450
+ in_deps {
451
+ if (match($0, /"([^"]+)"[[:space:]]*:[[:space:]]*"/, a)) {
452
+ print a[1]
453
+ }
454
+ }
455
+ ' "${TARGET_ABS}/package.json" 2>/dev/null | sort -u
456
+ )"
457
+ if [[ -z "${hits}" ]]; then
458
+ echo "_None detected._"
459
+ else
460
+ while IFS= read -r u; do
461
+ [[ -z "${u}" ]] && continue
462
+ printf -- '- `%s`\n' "${u}"
463
+ done <<< "${hits}"
464
+ fi
465
+ echo ""
466
+ }
467
+
468
+ render_coverage_caveats() {
469
+ echo "## Coverage Caveats"
470
+ echo ""
471
+ echo "### Frameworks not scanned"
472
+ echo ""
473
+ echo "v1 detects Next.js only. The following frameworks are NOT scanned by this run: Rails, Django, FastAPI, Express, NestJS, Remix, Astro, SvelteKit, Nuxt, Phoenix. If the target codebase mixes Next.js with one of these, the non-Next.js surface is invisible to this PRD."
474
+ echo ""
475
+ echo "### Extraction techniques used"
476
+ echo ""
477
+ echo "- Filesystem walk via \`git ls-files -c -o --exclude-standard\` (honors \`.gitignore\`)."
478
+ echo "- Regex on source — no AST analysis. Estimated false-negative rate: ~30% on dynamic imports, computed routes, conditional renders."
479
+ echo "- One-line JSDoc/TSDoc extraction from the first \`/** … */\` block in each route file."
480
+ echo "- HTTP method detection via \`export (async )?function (GET|POST|…)\` regex; arrow-function exports are NOT detected."
481
+ echo ""
482
+ echo "### Excluded by path filter"
483
+ echo ""
484
+ echo "${EXCLUDED_BY_FILTER} files excluded by Layer 1 path filter (categories: \`.env*\`, \`secrets.*\`, \`*.pem\`, \`*.key\`, \`credentials.*\`, \`master.key\`, \`.git/**\`). ${EXCLUDED_BY_SYMLINK} files excluded as symlinks (FR2.1 — inherited-prototype threat model). Exact paths are intentionally omitted to avoid recreating the redaction surface."
485
+ echo ""
486
+ echo "### GDPR Art. 9 special-category disclaimer"
487
+ echo ""
488
+ echo "Automated redaction (\`redact-sentinel.sh\` + \`gitleaks\`) covers 16 secret/PII classes (JWT, email, UUID, Stripe/GitHub/Anthropic/OpenAI/Supabase/Doppler/Slack keys, IPv4, env-var values, PEM private keys) and NFKC-normalizes + strips zero-width/invalid-byte characters before matching (defeats Unicode-confusable evasion; see ADR-095). It does **NOT** detect Article 9 special-category text content (race, ethnicity, religion, political views, health, biometric, sexual orientation). Before sharing this PRD outside the founder's immediate trust circle, review banner-flagged sections and any free-text content for Art. 9 categories. See \`knowledge-base/project/learnings/2026-05-15-fail-closed-redaction-enables-committed-default-output.md\` for the v2 keyword-scan layer roadmap."
489
+ echo ""
490
+ }
491
+
492
+ render_gap_analysis_placeholder() {
493
+ local ts
494
+ ts="$(date -u '+%Y-%m-%dT%H:%M:%SZ')"
495
+ echo "## Gap Analysis"
496
+ echo ""
497
+ echo "SKIPPED (spec-flow-analyzer unavailable at ${ts})"
498
+ echo ""
499
+ echo "_Per FR8.1 degraded-success — operator may spawn the agent \`soleur:product:spec-flow-analyzer\` on this PRD path to populate this section. The placeholder is the default state because the bash script cannot directly spawn Claude Code agents (v1 limitation, tracked for v2)._"
500
+ echo ""
501
+ }
502
+
503
+ # ---------------------------------------------------------------------------
504
+ # Orchestrator — render to a temp file, run Layer 2, run Layer 3, write to disk
505
+ # ---------------------------------------------------------------------------
506
+ STAGING="$(mktemp -t code-to-prd.XXXXXX.md)"
507
+ cleanup() {
508
+ [[ -e "${STAGING}" ]] && rm -f "${STAGING}"
509
+ }
510
+ trap cleanup EXIT INT TERM HUP
511
+
512
+ GENERATED_AT="$(date -u '+%Y-%m-%dT%H:%M:%SZ')"
513
+
514
+ {
515
+ echo "---"
516
+ echo "project: \"${PROJECT_NAME}\""
517
+ echo "framework: \"next.js\""
518
+ echo "generator: \"code-to-prd@v1\""
519
+ echo "generated_at: \"${GENERATED_AT}\""
520
+ echo "walker_count: ${WALKER_COUNT}"
521
+ echo "walker_excluded: ${EXCLUDED_TOTAL}"
522
+ echo "---"
523
+ echo ""
524
+ echo "# PRD — ${PROJECT_NAME}"
525
+ echo ""
526
+ cat "${BANNER_TEMPLATE}"
527
+ echo ""
528
+ echo "## Overview"
529
+ echo ""
530
+ echo "- **Project name:** \`${PROJECT_NAME}\` (from \`package.json\`)."
531
+ echo "- **Framework:** Next.js (\`${NEXT_CONFIG##*/}\` detected)."
532
+ echo "- **Walker stats:** ${WALKER_COUNT} tracked files scanned; ${EXCLUDED_TOTAL} excluded by Layer 1 + symlink rejection."
533
+ echo "- **Generator:** \`code-to-prd@v1\` — see \`plugins/soleur/skills/code-to-prd/SKILL.md\`."
534
+ echo ""
535
+ render_routes
536
+ render_state_shapes
537
+ render_api_deps
538
+ render_coverage_caveats
539
+ render_gap_analysis_placeholder
540
+ echo "---"
541
+ echo ""
542
+ echo "_Adapted from \`alirezarezvani/claude-skills\` (MIT) — see [plugins/soleur/NOTICE](../../../plugins/soleur/NOTICE)._"
543
+ } > "${STAGING}"
544
+
545
+ # ---------------------------------------------------------------------------
546
+ # Layer 2 — pre-write sentinel (fail-closed)
547
+ # ---------------------------------------------------------------------------
548
+ if [[ "${CODE_TO_PRD_SKIP_LAYER_2:-0}" != "1" ]]; then
549
+ # Capture sentinel exit code WITHOUT `! cmd` negation — bash's `$?` after
550
+ # `! cmd` reflects the negation, not the original exit, so the rc=1 branch
551
+ # would always render as "unexpected 0". Three-branch dispatch on the real
552
+ # exit preserves operator-facing diagnostics.
553
+ bash "${REDACT_SENTINEL}" "${STAGING}" >/dev/null 2>&1
554
+ sentinel_rc=$?
555
+ if (( sentinel_rc == 1 )); then
556
+ echo "code-to-prd: Layer 2 sentinel found redaction-class matches in the rendered PRD." >&2
557
+ echo " Aborting write — no partial PRD lands on disk." >&2
558
+ echo " Run \`bash ${REDACT_SENTINEL} <staging>\` against a debug copy to see the matched classes." >&2
559
+ exit 1
560
+ elif (( sentinel_rc == 2 )); then
561
+ # exit 2, NOT 1. The header reserves 1 for "a redaction layer FOUND secret-shaped
562
+ # content" and 2 for "the scan did not complete — never 'found secrets'". A failed
563
+ # sentinel INVOCATION is the second. Exiting 1 here told the operator their codebase
564
+ # contains secrets when the real fault was that Layer 2 never ran — the same
565
+ # could-not-measure-read-as-measured-bad conflation #8266 exists to remove, and the
566
+ # one Layer 3 below was just fixed for.
567
+ echo "code-to-prd: Layer 2 sentinel invocation failed (exit 2) — the redaction scan did NOT complete, so this is not a finding about your content. Investigate the sentinel before retrying." >&2
568
+ exit 2
569
+ elif (( sentinel_rc != 0 )); then
570
+ echo "code-to-prd: Layer 2 sentinel returned unexpected exit ${sentinel_rc} — the redaction scan did NOT complete; this is not a finding about your content." >&2
571
+ exit 2
572
+ fi
573
+ else
574
+ echo "code-to-prd: WARNING — CODE_TO_PRD_SKIP_LAYER_2=1 is set; bypassing Layer 2 (test-only path)." >&2
575
+ fi
576
+
577
+ # ---------------------------------------------------------------------------
578
+ # Layer 3 — independent gitleaks verifier over the EXACT bytes about to be
579
+ # written (fail-closed). It scans the staged file BEFORE the copy (#8266):
580
+ # scanning after the copy meant a failed or positive scan had already
581
+ # overwritten the operator's previous PRD by the time it deleted the new one.
582
+ # The copy below is byte-for-byte, so the verified bytes are the written bytes.
583
+ # ---------------------------------------------------------------------------
584
+ GITLEAKS_OUT="$(mktemp -t code-to-prd-gl.XXXXXX.json)"
585
+ GITLEAKS_ERR="$(mktemp -t code-to-prd-gl.XXXXXX.err)"
586
+ trap 'cleanup; rm -f "${GITLEAKS_OUT}" "${GITLEAKS_ERR}"' EXIT INT TERM HUP
587
+
588
+ gl_rc=0
589
+ gitleaks detect \
590
+ --source "${STAGING}" \
591
+ --no-git \
592
+ --report-format json \
593
+ --report-path "${GITLEAKS_OUT}" \
594
+ --redact \
595
+ --exit-code 1 \
596
+ >/dev/null 2>"${GITLEAKS_ERR}" || gl_rc=$?
597
+
598
+ if (( gl_rc != 0 )); then
599
+ # `--exit-code 1` sets the code gitleaks uses for FINDINGS; it does not make
600
+ # every non-zero exit a finding. A finding is rc 1 AND a report that names at
601
+ # least one rule — mktemp creates the report before gitleaks runs, so an empty
602
+ # body means the scan did not complete, never "found secrets".
603
+ if (( gl_rc == 1 )) && [[ -s "${GITLEAKS_OUT}" ]] && grep -q '"RuleID"' "${GITLEAKS_OUT}"; then
604
+ n_findings="$(grep -o '"RuleID"' "${GITLEAKS_OUT}" | wc -l | tr -d ' ')"
605
+ echo "code-to-prd: Layer 3 (gitleaks) reported ${n_findings} finding(s) in the rendered PRD; the PRD was not written." >&2
606
+ echo " Remove the secret-shaped strings from the codebase, then re-run. The redacted report is not kept on disk." >&2
607
+ exit 1
608
+ fi
609
+ printf 'code-to-prd: Layer 3 secret scan did not complete (gitleaks rc=%s, %q); the PRD was not written.\n' \
610
+ "${gl_rc}" "$(head -1 "${GITLEAKS_ERR}" 2>/dev/null)" >&2
611
+ echo " An unscanned PRD is never written (single-user incident threshold). ${GL_REMEDIATION}" >&2
612
+ exit 2
613
+ fi
614
+
615
+ # Loud-overwrite warning — Finding 6 (user-impact-reviewer): two distinct
616
+ # codebases sharing a package.json `name` resolve to the same OUTPUT_PATH;
617
+ # silent overwrite of the prior PRD lets a wrong-codebase PRD reach a
618
+ # buyer's data room. Emit a visible WARN so the operator sees the collision
619
+ # before committing/sharing the new PRD.
620
+ if [[ -e "${OUTPUT_PATH}" ]]; then
621
+ echo "code-to-prd: WARNING — overwriting existing PRD at ${OUTPUT_PATH}" >&2
622
+ echo " If this run targets a different codebase than the prior one, commit or rename the previous PRD before sharing." >&2
623
+ fi
624
+
625
+ # Write to disk.
626
+ if ! cp "${STAGING}" "${OUTPUT_PATH}"; then
627
+ echo "code-to-prd: failed to write PRD to ${OUTPUT_PATH}" >&2
628
+ exit 3
629
+ fi
630
+
631
+ echo "code-to-prd: wrote ${OUTPUT_PATH}"
632
+ echo " walker: ${WALKER_COUNT} files | excluded: ${EXCLUDED_TOTAL}"
633
+ echo " Next step: spawn the agent soleur:product:spec-flow-analyzer to populate Gap Analysis."
634
+ exit 0