@soleur/opencode 0.0.0-stage → 1.0.0

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 (812) 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 +659 -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 +108 -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 +342 -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 +152 -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 +493 -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 +363 -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 +520 -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 +113 -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 +178 -0
  247. package/scripts/sync-opencode-adapter.ts +479 -0
  248. package/scripts/sync-pr-behind.sh +534 -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 +65 -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 +142 -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 +118 -0
  493. package/skills/fix-issue/references/exclude-label-jq-snippet.md +96 -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 +668 -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 +325 -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 +138 -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 +1621 -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-todo-structure.md +165 -0
  674. package/skills/review/references/risk-tier-and-fix-rounds.md +95 -0
  675. package/skills/review/references/semgrep-custom-rules.yaml +174 -0
  676. package/skills/review/references/ultrathink-phases.md +98 -0
  677. package/skills/review/references/wfs.md +6 -0
  678. package/skills/review/scripts/emit-review-trailer.sh +499 -0
  679. package/skills/review/scripts/ensure-semgrep.sh +99 -0
  680. package/skills/review/scripts/fix-round-seats.sh +197 -0
  681. package/skills/review/test/emit-review-trailer.test.sh +387 -0
  682. package/skills/review/test/ensure-semgrep.test.sh +111 -0
  683. package/skills/review/test/fix-round-seats.test.sh +237 -0
  684. package/skills/review/workflows/README.md +147 -0
  685. package/skills/review/workflows/review.workflow.js +667 -0
  686. package/skills/schedule/SKILL.md +796 -0
  687. package/skills/seo-aeo/SKILL.md +139 -0
  688. package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
  689. package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
  690. package/skills/ship/SKILL.md +3022 -0
  691. package/skills/ship/references/adr-ordinal-collision.md +47 -0
  692. package/skills/ship/references/affected-gate-contract.md +115 -0
  693. package/skills/ship/references/ci-run-diagnosis.md +29 -0
  694. package/skills/ship/references/ci-workflow-authoring.md +68 -0
  695. package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
  696. package/skills/ship/references/cto-ruling-armed-push.md +5 -0
  697. package/skills/ship/references/decision-challenges-render.md +71 -0
  698. package/skills/ship/references/detached-battery-verdict.md +13 -0
  699. package/skills/ship/references/feature-tweet-draft.md +42 -0
  700. package/skills/ship/references/followthrough-issue-body-template.md +47 -0
  701. package/skills/ship/references/followthrough-stub-template.sh +92 -0
  702. package/skills/ship/references/merge-queue-dequeue.md +39 -0
  703. package/skills/ship/references/operator-holds.md +149 -0
  704. package/skills/ship/references/pipeline-tally-render.md +43 -0
  705. package/skills/ship/references/pr-overlap.md +153 -0
  706. package/skills/ship/references/queue-mode.md +7 -0
  707. package/skills/ship/references/ready-run-wait.md +36 -0
  708. package/skills/ship/references/red-on-main-quarantine.md +110 -0
  709. package/skills/ship/references/register-update-pr-pattern.md +88 -0
  710. package/skills/ship/references/settle-then-admin-merge.md +130 -0
  711. package/skills/ship/references/supabase-column-probe.md +13 -0
  712. package/skills/ship/scripts/auto-close-scan.sh +76 -0
  713. package/skills/ship/scripts/battery-owed.sh +403 -0
  714. package/skills/ship/scripts/hold-gate-eval.sh +410 -0
  715. package/skills/ship/scripts/net-issue-flow.sh +665 -0
  716. package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
  717. package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
  718. package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
  719. package/skills/skill-creator/SKILL.md +299 -0
  720. package/skills/skill-creator/references/api-security.md +248 -0
  721. package/skills/skill-creator/references/authoring-levers.md +110 -0
  722. package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
  723. package/skills/skill-creator/references/best-practices.md +431 -0
  724. package/skills/skill-creator/references/common-patterns.md +639 -0
  725. package/skills/skill-creator/references/core-principles.md +193 -0
  726. package/skills/skill-creator/references/executable-code.md +188 -0
  727. package/skills/skill-creator/references/iteration-and-testing.md +509 -0
  728. package/skills/skill-creator/references/official-spec.md +193 -0
  729. package/skills/skill-creator/references/recommended-structure.md +180 -0
  730. package/skills/skill-creator/references/skill-structure.md +396 -0
  731. package/skills/skill-creator/references/using-scripts.md +122 -0
  732. package/skills/skill-creator/references/using-templates.md +120 -0
  733. package/skills/skill-creator/references/workflows-and-validation.md +541 -0
  734. package/skills/skill-creator/scripts/init_skill.py +322 -0
  735. package/skills/skill-creator/scripts/package_skill.py +110 -0
  736. package/skills/skill-creator/scripts/quick_validate.py +64 -0
  737. package/skills/skill-creator/templates/router-skill.md +73 -0
  738. package/skills/skill-creator/templates/simple-skill.md +34 -0
  739. package/skills/skill-creator/workflows/add-reference.md +96 -0
  740. package/skills/skill-creator/workflows/add-script.md +104 -0
  741. package/skills/skill-creator/workflows/add-template.md +83 -0
  742. package/skills/skill-creator/workflows/add-workflow.md +128 -0
  743. package/skills/skill-creator/workflows/audit-skill.md +159 -0
  744. package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
  745. package/skills/skill-creator/workflows/create-new-skill.md +207 -0
  746. package/skills/skill-creator/workflows/get-guidance.md +134 -0
  747. package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
  748. package/skills/skill-creator/workflows/verify-skill.md +226 -0
  749. package/skills/skill-security-scan/SKILL.md +145 -0
  750. package/skills/skill-security-scan/references/disclaimer.md +21 -0
  751. package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
  752. package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
  753. package/skills/skill-security-scan/references/override-mechanism.md +171 -0
  754. package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
  755. package/skills/skill-security-scan/references/regex-patterns.md +136 -0
  756. package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
  757. package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
  758. package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
  759. package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
  760. package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
  761. package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
  762. package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
  763. package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
  764. package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
  765. package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
  766. package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
  767. package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
  768. package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
  769. package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
  770. package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
  771. package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
  772. package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
  773. package/skills/skill-security-scan/scripts/lib.sh +197 -0
  774. package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
  775. package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
  776. package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
  777. package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
  778. package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
  779. package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
  780. package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
  781. package/skills/social-distribute/SKILL.md +485 -0
  782. package/skills/spec-templates/SKILL.md +274 -0
  783. package/skills/sync/SKILL.md +49 -0
  784. package/skills/test-browser/SKILL.md +464 -0
  785. package/skills/test-browser/references/feature-map.md +161 -0
  786. package/skills/test-fix-loop/SKILL.md +159 -0
  787. package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
  788. package/skills/triage/SKILL.md +402 -0
  789. package/skills/trigger-cron/SKILL.md +136 -0
  790. package/skills/trigger-cron/scripts/trigger.sh +198 -0
  791. package/skills/user-set-role/SKILL.md +147 -0
  792. package/skills/user-set-role/scripts/set-role.sh +218 -0
  793. package/skills/user-story-writer/SKILL.md +77 -0
  794. package/skills/ux-audit/SKILL.md +251 -0
  795. package/skills/ux-audit/references/finding.schema.json +62 -0
  796. package/skills/ux-audit/references/route-list.yaml +95 -0
  797. package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
  798. package/skills/ux-audit/scripts/bot-signin.ts +135 -0
  799. package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
  800. package/skills/work/SKILL.md +1479 -0
  801. package/skills/work/references/end-of-work-resume.md +7 -0
  802. package/skills/work/references/hook-test-main-cwd.md +24 -0
  803. package/skills/work/references/key-principles.md +83 -0
  804. package/skills/work/references/property-testing.md +122 -0
  805. package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
  806. package/skills/work/references/work-agent-teams.md +97 -0
  807. package/skills/work/references/work-lifecycle-parallel.md +147 -0
  808. package/skills/work/references/work-lockfile-bumps.md +97 -0
  809. package/skills/work/references/work-scratch-sandboxes.md +212 -0
  810. package/skills/work/references/work-subagent-fanout.md +61 -0
  811. package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
  812. package/skills/xcode-test/SKILL.md +360 -0
@@ -0,0 +1,447 @@
1
+ #!/usr/bin/env bash
2
+ # Test harness for plugins/soleur/skills/code-to-prd/scripts/code-to-prd.sh (#2726).
3
+ #
4
+ # Pattern mirrors plugins/soleur/skills/incident/test/redact-sentinel.test.sh:
5
+ # - set -uo pipefail (NOT -e — single test failure must not abort the suite)
6
+ # - PASS/FAIL counter
7
+ # - trap-based cleanup
8
+ #
9
+ # Test assertions (plan Phase 6):
10
+ # 1. All 3 fixture routes captured in the PRD.
11
+ # 2. HTTP method (`GET`) captured for `api/health/route.ts` (FR3).
12
+ # 3. Zero fixture-secret tokens appear in PRD output.
13
+ # 4. No env-var VALUE appears in PRD (FR5 — only names).
14
+ # 5. `## Coverage Caveats` block non-empty with all four subsections.
15
+ # 6. Both banners present (verbatim string match).
16
+ # 7. `### How to Read This PRD` subsection present in banner block.
17
+ # 8. `## Gap Analysis` section present (populated or SKIPPED).
18
+ # 9. MIT attribution footer present.
19
+ # 10. Layer 2 sentinel halts the write when a fresh secret is injected post-render (RED).
20
+ # 11. Layer 3 deletes the file if Layer 2 is bypassed via env var (RED).
21
+ #
22
+ # Plus plan AC tests:
23
+ # - AC3: sentinel regex matches the fixture token.
24
+ # - AC6: gitleaks-absent preflight abort.
25
+ # - AC8: missing-package.json preflight abort.
26
+ # - AC9: symlink rejection.
27
+
28
+ set -uo pipefail
29
+
30
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
31
+ SKILL_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
32
+ PLUGIN_DIR="$(cd "${SKILL_DIR}/../.." && pwd)"
33
+ REPO_ROOT="$(cd "${PLUGIN_DIR}/../.." && pwd)"
34
+
35
+ CODE_TO_PRD="${SKILL_DIR}/scripts/code-to-prd.sh"
36
+ REDACT_SENTINEL="${PLUGIN_DIR}/skills/incident/scripts/redact-sentinel.sh"
37
+ FIXTURE="${SCRIPT_DIR}/fixture"
38
+
39
+ PASS=0
40
+ FAIL=0
41
+ TMP_DIR="$(mktemp -d -t code-to-prd-test.XXXXXX)"
42
+ trap 'rm -rf "${TMP_DIR}"' EXIT
43
+
44
+ assert_exit() {
45
+ local label="$1" expected="$2" actual="$3"
46
+ if [[ "${expected}" == "${actual}" ]]; then
47
+ echo "PASS: ${label} (exit=${actual})"
48
+ PASS=$((PASS + 1))
49
+ else
50
+ echo "FAIL: ${label} (expected exit=${expected}, got ${actual})"
51
+ FAIL=$((FAIL + 1))
52
+ fi
53
+ }
54
+
55
+ assert_grep() {
56
+ local label="$1" pattern="$2" file="$3"
57
+ if grep -qE -- "${pattern}" "${file}"; then
58
+ echo "PASS: ${label}"
59
+ PASS=$((PASS + 1))
60
+ else
61
+ echo "FAIL: ${label} (pattern '${pattern}' not found in ${file##*/})"
62
+ FAIL=$((FAIL + 1))
63
+ fi
64
+ }
65
+
66
+ assert_grep_fixed() {
67
+ local label="$1" needle="$2" file="$3"
68
+ if grep -qF -- "${needle}" "${file}"; then
69
+ echo "PASS: ${label}"
70
+ PASS=$((PASS + 1))
71
+ else
72
+ echo "FAIL: ${label} (literal '${needle}' not found in ${file##*/})"
73
+ FAIL=$((FAIL + 1))
74
+ fi
75
+ }
76
+
77
+ assert_no_grep() {
78
+ local label="$1" needle="$2" file="$3"
79
+ if grep -qF -- "${needle}" "${file}"; then
80
+ echo "FAIL: ${label} (literal '${needle}' UNEXPECTEDLY present in ${file##*/})"
81
+ FAIL=$((FAIL + 1))
82
+ else
83
+ echo "PASS: ${label}"
84
+ PASS=$((PASS + 1))
85
+ fi
86
+ }
87
+
88
+ assert_file_absent() {
89
+ local label="$1" path="$2"
90
+ if [[ ! -e "${path}" ]]; then
91
+ echo "PASS: ${label}"
92
+ PASS=$((PASS + 1))
93
+ else
94
+ echo "FAIL: ${label} (path ${path} still exists)"
95
+ FAIL=$((FAIL + 1))
96
+ fi
97
+ }
98
+
99
+ # ---------------------------------------------------------------------------
100
+ # Tool availability (#8266). The baseline and every arm that reaches the real
101
+ # Layer-3 scan need a RUNNABLE gitleaks. A resolvable-but-unrunnable binary (an
102
+ # unpinned mise shim) used to fail the baseline and report it as a code-to-prd
103
+ # failure; those arms now SKIP locally, naming the cause, and the suite FAILS
104
+ # under CI=true, where the runner must provide gitleaks (ADR-188). The probe
105
+ # mirrors the script's: timeout -> gtimeout -> bare.
106
+ # ---------------------------------------------------------------------------
107
+ # shellcheck source=../../../../test/lib/gitleaks-probe.sh
108
+ source "$(cd -P "$(dirname "${BASH_SOURCE[0]}")/../../../test/lib" && pwd -P)/gitleaks-probe.sh"
109
+ gl_probe
110
+
111
+ # A PATH that contains every executable on the current PATH EXCEPT gitleaks,
112
+ # timeout and gtimeout, plus a gitleaks STUB of the given mode. Dropping PATH
113
+ # entries cannot remove a tool that lives in /usr/bin beside everything else,
114
+ # so this links tools individually. $1 = unrunnable | scan-error | findings | clean
115
+ mk_stub_path() {
116
+ local mode="$1" d dir f name
117
+ d="$(mktemp -d "${TMP_DIR}/stubpath.XXXXXX")"
118
+ local IFS=:
119
+ for dir in ${PATH}; do
120
+ [[ -d "${dir}" ]] || continue
121
+ for f in "${dir}"/*; do
122
+ name="${f##*/}"
123
+ case "${name}" in gitleaks|timeout|gtimeout) continue ;; esac
124
+ [[ -x "${f}" && ! -d "${f}" && ! -e "${d}/${name}" ]] && ln -s "${f}" "${d}/${name}"
125
+ done
126
+ done
127
+ # Stub bodies are quoted heredocs: they are DATA written into the stub, and the
128
+ # redirect inside the findings stub is the stub's own, not a fixture write.
129
+ case "${mode}" in
130
+ unrunnable)
131
+ cat > "${d}/gitleaks" <<'STUB'
132
+ #!/bin/sh
133
+ echo "mise ERROR No version is set for shim: gitleaks" >&2
134
+ exit 1
135
+ STUB
136
+ ;;
137
+ scan-error)
138
+ cat > "${d}/gitleaks" <<'STUB'
139
+ #!/bin/sh
140
+ [ "$1" = version ] && { echo 8.24.2; exit 0; }
141
+ echo "gitleaks: fatal: could not read source" >&2
142
+ exit 1
143
+ STUB
144
+ ;;
145
+ findings)
146
+ cat > "${d}/gitleaks" <<'STUB'
147
+ #!/bin/sh
148
+ [ "$1" = version ] && { echo 8.24.2; exit 0; }
149
+ rp=""; while [ $# -gt 0 ]; do [ "$1" = --report-path ] && rp="$2"; shift; done
150
+ printf '%s' '[{"RuleID":"stripe-access-token","File":"prd.md","StartLine":3}]' > "$rp"
151
+ exit 1
152
+ STUB
153
+ ;;
154
+ clean)
155
+ cat > "${d}/gitleaks" <<'STUB'
156
+ #!/bin/sh
157
+ [ "$1" = version ] && { echo 8.24.2; exit 0; }
158
+ exit 0
159
+ STUB
160
+ ;;
161
+ esac
162
+ chmod +x "${d}/gitleaks"
163
+ printf '%s\n' "${d}"
164
+ }
165
+
166
+ # ---------------------------------------------------------------------------
167
+ # Generate a clean PRD from the fixture (positive baseline for tests 1-9)
168
+ # ---------------------------------------------------------------------------
169
+ if _needs_gl "baseline + T1-T9"; then
170
+ BASELINE_PRD="${TMP_DIR}/baseline-prd.md"
171
+ log="${TMP_DIR}/baseline.log"
172
+ bash "${CODE_TO_PRD}" "${FIXTURE}" "${BASELINE_PRD}" >"${log}" 2>&1
173
+ baseline_rc=$?
174
+ assert_exit "Baseline: code-to-prd against fixture exits 0" 0 "${baseline_rc}"
175
+
176
+ if [[ ! -f "${BASELINE_PRD}" ]]; then
177
+ echo "FATAL: baseline PRD was not written; remaining tests skipped."
178
+ echo " See ${log}"
179
+ cat "${log}" >&2
180
+ echo "---"
181
+ echo "PASS=${PASS} FAIL=${FAIL}"
182
+ exit 1
183
+ fi
184
+
185
+ # Test 1 — all 3 fixture routes captured
186
+ assert_grep_fixed "T1.a: route '/' present" '`/`' "${BASELINE_PRD}"
187
+ assert_grep_fixed "T1.b: route '/about' present" '`/about`' "${BASELINE_PRD}"
188
+ assert_grep_fixed "T1.c: route '/api/health' present" '`/api/health`' "${BASELINE_PRD}"
189
+
190
+ # Test 2 — GET method captured for api/health/route.ts (FR3)
191
+ assert_grep "T2: GET method captured for api/health" '\| `/api/health` \| `app/api/health/route\.ts` \| GET \|' "${BASELINE_PRD}"
192
+
193
+ # Test 3 — sentinel-clean: zero redaction-class matches in the PRD
194
+ sentinel_out="${TMP_DIR}/sentinel.out"
195
+ bash "${REDACT_SENTINEL}" "${BASELINE_PRD}" >"${sentinel_out}" 2>&1
196
+ assert_exit "T3: redact-sentinel exits 0 on baseline PRD (AC2)" 0 $?
197
+
198
+ # Test 4 — no env-var VALUE appears (we don't have .env.example yet — once
199
+ # Phase 9b lands, this becomes load-bearing; for now we assert the marker
200
+ # 'FIXTUREDONOTUSE' is absent, which is true under any flow).
201
+ assert_no_grep "T4: env-var VALUE 'FIXTUREDONOTUSE' absent (FR5)" "FIXTUREDONOTUSE" "${BASELINE_PRD}"
202
+
203
+ # Test 5 — Coverage Caveats: non-empty + 4 subsections
204
+ assert_grep_fixed "T5.a: '## Coverage Caveats' header present" '## Coverage Caveats' "${BASELINE_PRD}"
205
+ assert_grep_fixed "T5.b: 'Frameworks not scanned' subsection" '### Frameworks not scanned' "${BASELINE_PRD}"
206
+ assert_grep_fixed "T5.c: 'Extraction techniques used' subsection" '### Extraction techniques used' "${BASELINE_PRD}"
207
+ assert_grep_fixed "T5.d: 'Excluded by path filter' subsection" '### Excluded by path filter' "${BASELINE_PRD}"
208
+ assert_grep_fixed "T5.e: 'GDPR Art. 9 special-category disclaimer' subsection" '### GDPR Art. 9 special-category disclaimer' "${BASELINE_PRD}"
209
+
210
+ # Test 6 — both banners present (verbatim signature markers)
211
+ assert_grep_fixed "T6.a: due-diligence banner sentinel present" 'BANNER:DUE-DILIGENCE' "${BASELINE_PRD}"
212
+ assert_grep_fixed "T6.b: PII/confidentiality banner sentinel present" 'BANNER:PII-CONFIDENTIALITY' "${BASELINE_PRD}"
213
+
214
+ # Test 7 — How to Read This PRD subsection (FR7.1)
215
+ assert_grep_fixed "T7: '### How to Read This PRD' subsection present (FR7.1)" '### How to Read This PRD' "${BASELINE_PRD}"
216
+
217
+ # Test 8 — Gap Analysis section present (populated or SKIPPED)
218
+ assert_grep_fixed "T8.a: '## Gap Analysis' header present" '## Gap Analysis' "${BASELINE_PRD}"
219
+ assert_grep "T8.b: SKIPPED-or-populated body present" 'SKIPPED \(spec-flow-analyzer unavailable at|^# Gap Analysis' "${BASELINE_PRD}"
220
+
221
+ # Test 9 — MIT attribution footer
222
+ assert_grep_fixed "T9: MIT attribution footer present" 'alirezarezvani/claude-skills' "${BASELINE_PRD}"
223
+ fi
224
+
225
+ # ---------------------------------------------------------------------------
226
+ # Synthetic Stripe-shape tokens — assembled at runtime to dodge gitleaks
227
+ # default-pack AND GitHub push-protection (learning 10df08e3: literal
228
+ # `sk_live_*` / `sk_test_*` tokens in committed prose are rejected at push
229
+ # time, separate from pre-commit gitleaks). All halves are inert alone.
230
+ # ---------------------------------------------------------------------------
231
+ SK_PFX="sk_l"
232
+ SK_TAIL="ive_REDTESTLAYER2FIXTUREALNUMSTRIPE0001" # 36 alnum, no underscores
233
+ SYNTHETIC_LIVE="${SK_PFX}${SK_TAIL}"
234
+
235
+ # ---------------------------------------------------------------------------
236
+ # Test 10 — Layer 2 sentinel halts the write when a fresh secret would land.
237
+ # Synthesize a tampered fixture whose app/page.tsx carries the secret in a
238
+ # useState initial value — the State Shapes extractor lifts that line
239
+ # verbatim into the rendered PRD, giving Layer 2 something to react to.
240
+ # ---------------------------------------------------------------------------
241
+ TAMPERED="${TMP_DIR}/tampered-fixture"
242
+ cp -a "${FIXTURE}" "${TAMPERED}"
243
+ cat >"${TAMPERED}/app/page.tsx" <<EOF
244
+ /** Tampered landing page (Layer-2/3 RED test). */
245
+ import { useState } from "react";
246
+ export default function HomePage() {
247
+ const [k, setK] = useState("${SYNTHETIC_LIVE}");
248
+ return <pre>{k}</pre>;
249
+ }
250
+ EOF
251
+ # Initialize a tiny git repo so the walker sees the tampered file.
252
+ #
253
+ # Every mutation names its repository with `-C`. This file runs `set -uo
254
+ # pipefail` WITHOUT `-e`, so a bare `cd` into a fixture that `cp -a` failed to
255
+ # create would not abort — and `git add -A` plus a commit would then run in the
256
+ # inherited cwd, staging and committing the entire real repository. That is the
257
+ # 2026-08-20 incident shape; see plugins/soleur/test/fixture-cd-containment.test.sh.
258
+ git init -q "${TAMPERED}"
259
+ git -C "${TAMPERED}" add -A
260
+ git -C "${TAMPERED}" -c user.email=t@t -c user.name=t commit -q -m fixture --no-verify >/dev/null 2>&1 || true
261
+ if _needs_gl "T10/T11 (Layer 2 halt, Layer 3 catch)"; then
262
+ T10_OUT="${TMP_DIR}/t10-prd.md"
263
+ t10_log="${TMP_DIR}/t10.log"
264
+ bash "${CODE_TO_PRD}" "${TAMPERED}" "${T10_OUT}" >"${t10_log}" 2>&1
265
+ t10_rc=$?
266
+ assert_exit "T10: Layer 2 halts write when secret present (AC4)" 1 "${t10_rc}"
267
+ assert_file_absent "T10: no PRD on disk after Layer 2 abort" "${T10_OUT}"
268
+
269
+ # ---------------------------------------------------------------------------
270
+ # Test 11 — Layer 3 catches what Layer 2 missed (RED test via env bypass).
271
+ # ---------------------------------------------------------------------------
272
+ T11_OUT="${TMP_DIR}/t11-prd.md"
273
+ t11_log="${TMP_DIR}/t11.log"
274
+ CODE_TO_PRD_SKIP_LAYER_2=1 bash "${CODE_TO_PRD}" "${TAMPERED}" "${T11_OUT}" >"${t11_log}" 2>&1
275
+ t11_rc=$?
276
+ assert_exit "T11: Layer 3 catches Layer-2-bypass and exits 1 (AC5)" 1 "${t11_rc}"
277
+ assert_file_absent "T11: Layer 3 deletes the leaked PRD" "${T11_OUT}"
278
+ fi
279
+
280
+ # ---------------------------------------------------------------------------
281
+ # AC3 — sentinel regex matches the planned fixture token (loud guard against
282
+ # Kieran P0-1 underscore-in-regex correctness bug).
283
+ # ---------------------------------------------------------------------------
284
+ ac3_tmp="${TMP_DIR}/ac3.txt"
285
+ AC3_PFX="sk_t"
286
+ AC3_TAIL="est_FIXTUREDONOTUSESYNTHETICTOKEN123"
287
+ printf 'STRIPE_SECRET_KEY=%s%s\n' "${AC3_PFX}" "${AC3_TAIL}" >"${ac3_tmp}"
288
+ bash "${REDACT_SENTINEL}" "${ac3_tmp}" >/dev/null 2>&1
289
+ assert_exit "AC3: sentinel matches fixture token shape (no underscore in tail)" 1 $?
290
+
291
+ # ---------------------------------------------------------------------------
292
+ # AC6 — gitleaks-absent preflight abort.
293
+ # ---------------------------------------------------------------------------
294
+ ac6_log="${TMP_DIR}/ac6.log"
295
+ SCRUBBED_PATH="$(echo "${PATH}" | tr ':' '\n' | while read -r p; do
296
+ [[ -z "${p}" ]] && continue
297
+ if [[ -x "${p}/gitleaks" ]]; then continue; fi
298
+ printf '%s:' "${p}"
299
+ done)"
300
+ PATH="${SCRUBBED_PATH%:}" bash "${CODE_TO_PRD}" "${FIXTURE}" "${TMP_DIR}/ac6-prd.md" >"${ac6_log}" 2>&1
301
+ ac6_rc=$?
302
+ assert_exit "AC6: gitleaks-absent preflight aborts with exit 2" 2 "${ac6_rc}"
303
+ assert_grep_fixed "AC6: error message mentions gitleaks" "gitleaks not found" "${ac6_log}"
304
+
305
+ # ---------------------------------------------------------------------------
306
+ # AC8 — missing-package.json preflight abort.
307
+ # ---------------------------------------------------------------------------
308
+ # The gitleaks preflight runs BEFORE the package.json check, so this arm needs
309
+ # a runnable gitleaks to reach the check it names.
310
+ if _needs_gl "AC8 missing package.json"; then
311
+ ac8_target="${TMP_DIR}/empty-dir"
312
+ mkdir -p "${ac8_target}"
313
+ ac8_log="${TMP_DIR}/ac8.log"
314
+ bash "${CODE_TO_PRD}" "${ac8_target}" "${TMP_DIR}/ac8-prd.md" >"${ac8_log}" 2>&1
315
+ ac8_rc=$?
316
+ assert_exit "AC8: missing-package.json preflight aborts with exit 2" 2 "${ac8_rc}"
317
+ assert_grep_fixed "AC8: error message includes the literal target path" "${ac8_target}" "${ac8_log}"
318
+ fi
319
+
320
+ # ---------------------------------------------------------------------------
321
+ # AC9 — symlink rejection (FR2.1).
322
+ # Plant a symlink inside a copy of the fixture pointing at a sibling sensitive
323
+ # file; confirm the linked content does NOT enter the PRD.
324
+ # ---------------------------------------------------------------------------
325
+ if _needs_gl "AC9 symlink rejection"; then
326
+ ac9_target="${TMP_DIR}/sym-fixture"
327
+ cp -a "${FIXTURE}" "${ac9_target}"
328
+ ac9_sensitive="${TMP_DIR}/sensitive.txt"
329
+ printf 'CANARY_VALUE_SHOULD_NOT_APPEAR_IN_PRD\n' >"${ac9_sensitive}"
330
+ ln -s "${ac9_sensitive}" "${ac9_target}/leaked-link.txt"
331
+ # `-C` for the same reason as the tampered fixture above: an unguarded `cd`
332
+ # into a directory `cp -a` may not have created would redirect `git add -A` at
333
+ # the real repository.
334
+ git init -q "${ac9_target}"
335
+ git -C "${ac9_target}" add -A
336
+ git -C "${ac9_target}" -c user.email=t@t -c user.name=t commit -q -m sym --no-verify >/dev/null 2>&1 || true
337
+ ac9_out="${TMP_DIR}/ac9-prd.md"
338
+ bash "${CODE_TO_PRD}" "${ac9_target}" "${ac9_out}" >"${TMP_DIR}/ac9.log" 2>&1
339
+ assert_no_grep "AC9: symlink target content NOT in PRD" "CANARY_VALUE_SHOULD_NOT_APPEAR_IN_PRD" "${ac9_out}"
340
+ fi
341
+
342
+ # ---------------------------------------------------------------------------
343
+ # AC5 (#8266) — a tool that cannot run is never reported as a verdict about the
344
+ # PRD. Stub gitleaks on a PATH without timeout/gtimeout; no real gitleaks needed.
345
+ # ---------------------------------------------------------------------------
346
+ PREV_BODY="previous PRD — must survive a failed or positive scan"
347
+ stub_case() { # $1 = label, $2 = stub mode; sets SC_RC, SC_LOG, SC_OUT
348
+ local out_dir; out_dir="$(mktemp -d "${TMP_DIR}/stubcase.XXXXXX")"
349
+ SC_OUT="${out_dir}/prd.md"
350
+ SC_LOG="${out_dir}/run.log"
351
+ printf '%s\n' "${PREV_BODY}" > "${SC_OUT}"
352
+ local sp; sp="$(mk_stub_path "$2")"
353
+ PATH="${sp}" bash "${CODE_TO_PRD}" "${FIXTURE}" "${SC_OUT}" >"${SC_LOG}" 2>&1
354
+ SC_RC=$?
355
+ }
356
+ prev_preserved() { # $1 = label
357
+ if [[ -f "${SC_OUT}" && "$(cat "${SC_OUT}")" == "${PREV_BODY}" ]]; then
358
+ echo "PASS: $1"; PASS=$((PASS + 1))
359
+ else
360
+ echo "FAIL: $1 (previous PRD at the output path was modified or removed)"; FAIL=$((FAIL + 1))
361
+ fi
362
+ }
363
+ no_dangling_report_path() { # $1 = label
364
+ # Asserts the LIVE contract, not a retired one. This used to extract a path from
365
+ # a ` Report at: ` line and pass when it was absent OR existed — but this PR
366
+ # deleted that line from the script, so the extraction was permanently empty and
367
+ # the `-z` branch made the row unconditionally green. It had never once evaluated
368
+ # its predicate. Now: require the script to SAY the report is not kept (a positive
369
+ # anchor that a future re-add of an operator-facing path would break), and require
370
+ # no path-shaped `Report at:` line to come back.
371
+ local rp; rp="$(sed -n 's/^[[:space:]]*Report at: //p' "${SC_LOG}")"
372
+ if [[ -n "${rp}" ]]; then
373
+ echo "FAIL: $1 (a 'Report at:' path reappeared: ${rp}; GITLEAKS_OUT is removed by the EXIT trap, so any printed path dangles)"; FAIL=$((FAIL + 1))
374
+ elif ! grep -qF 'not kept on disk' "${SC_LOG}"; then
375
+ echo "FAIL: $1 (the scan log no longer states the report is not kept on disk — the anchor this row pins is gone)"; FAIL=$((FAIL + 1))
376
+ else
377
+ echo "PASS: $1"; PASS=$((PASS + 1))
378
+ fi
379
+ }
380
+
381
+ stub_case "AC5a" unrunnable
382
+ assert_exit "AC5a: unrunnable gitleaks aborts at preflight with exit 2" 2 "${SC_RC}"
383
+ assert_grep_fixed "AC5a: message says the tool cannot run" "not runnable" "${SC_LOG}"
384
+ assert_grep_fixed "AC5a: message names the CI pin" "8.24.2" "${SC_LOG}"
385
+ assert_no_grep "AC5a: never claims the PRD contained secrets" "found secrets" "${SC_LOG}"
386
+ prev_preserved "AC5a: previous PRD untouched"
387
+
388
+ stub_case "AC5b" scan-error
389
+ assert_exit "AC5b: scan that errors without a report exits 2" 2 "${SC_RC}"
390
+ assert_grep_fixed "AC5b: message says the scan did not complete" "did not complete" "${SC_LOG}"
391
+ assert_no_grep "AC5b: never claims the PRD contained secrets" "found secrets" "${SC_LOG}"
392
+ prev_preserved "AC5b: previous PRD untouched (new PRD withheld, not written)"
393
+
394
+ stub_case "AC5c" findings
395
+ assert_exit "AC5c: a real finding exits 1" 1 "${SC_RC}"
396
+ assert_grep_fixed "AC5c: finding count reported" "1 finding" "${SC_LOG}"
397
+ prev_preserved "AC5c: previous PRD untouched (new PRD withheld, not written)"
398
+ no_dangling_report_path "AC5c: no printed report path that does not exist"
399
+
400
+ stub_case "AC5d" clean
401
+ assert_exit "AC5d: a working gitleaks on a host without timeout still scans and writes" 0 "${SC_RC}"
402
+ assert_grep_fixed "AC5d: new PRD written" "## Coverage Caveats" "${SC_OUT}"
403
+
404
+ # ---------------------------------------------------------------------------
405
+ # Summary
406
+ # ---------------------------------------------------------------------------
407
+ # CI fail-on-skip contract, asserted against the epilogue's REAL BYTES. That
408
+ # contract is the only thing stopping the skipped arms from reading as green on a
409
+ # runner without gitleaks, and nothing asserted it — a refactor of the tail would
410
+ # drop it silently and the shard would stay green. Extracted between the markers
411
+ # and driven through a three-row truth table, so a mutation to the SHIPPED code
412
+ # (not a copy) reds.
413
+ _t_ci_contract() {
414
+ local body rc
415
+ body=$(awk '/^# >>> ci-contract-epilogue$/{f=1;next} /^# <<< ci-contract-epilogue$/{f=0} f' "${BASH_SOURCE[0]}")
416
+ if [[ -z "${body//[[:space:]]/}" ]]; then
417
+ echo "FAIL: CI fail-on-skip contract — epilogue markers matched nothing — the extraction is broken, not the contract"; FAIL=$((FAIL + 1))
418
+ return
419
+ fi
420
+ rc=0; ( set +e; eval 'SKIPPED_ARMS=(x); CI=true; PASS=1; FAIL=0'"
421
+ $body" ) >/dev/null 2>&1 || rc=$?
422
+ if [[ "$rc" != 1 ]]; then echo "FAIL: CI fail-on-skip contract — CI=true with skips did not exit 1"; FAIL=$((FAIL + 1)); return; fi
423
+ rc=0; ( set +e; eval 'SKIPPED_ARMS=(x); unset CI; PASS=1; FAIL=0'"
424
+ $body" ) >/dev/null 2>&1 || rc=$?
425
+ if [[ "$rc" == 1 ]]; then echo "FAIL: CI fail-on-skip contract — a local skip (no CI) exited 1"; FAIL=$((FAIL + 1)); return; fi
426
+ rc=0; ( set +e; eval 'SKIPPED_ARMS=(); CI=true; PASS=1; FAIL=0'"
427
+ $body" ) >/dev/null 2>&1 || rc=$?
428
+ if [[ "$rc" == 1 ]]; then echo "FAIL: CI fail-on-skip contract — CI=true with no skips exited 1"; FAIL=$((FAIL + 1)); return; fi
429
+ echo "PASS: CI fail-on-skip contract (3-row truth table on the real epilogue)"; PASS=$((PASS + 1))
430
+ }
431
+ _t_ci_contract
432
+
433
+ # >>> ci-contract-epilogue
434
+ echo "---"
435
+ echo "PASS=${PASS} FAIL=${FAIL} SKIPPED_ARMS=${#SKIPPED_ARMS[@]}"
436
+ if (( ${#SKIPPED_ARMS[@]} > 0 )); then
437
+ printf ' skipped: %s\n' "${SKIPPED_ARMS[@]}"
438
+ if [[ "${CI:-}" == "true" ]]; then
439
+ echo "CI=true: ${#SKIPPED_ARMS[@]} arm(s) could not run because gitleaks is not runnable on this runner — a FAILURE, not a skip (the runner must provide gitleaks 8.24.2)." >&2
440
+ exit 1
441
+ fi
442
+ fi
443
+ # <<< ci-contract-epilogue
444
+ if (( FAIL > 0 )); then
445
+ exit 1
446
+ fi
447
+ exit 0
@@ -0,0 +1,7 @@
1
+ # Synthetic .env.example for code-to-prd fixture (#2726). DO NOT DEPLOY.
2
+ # Token below is alnum-only after `sk_test_` prefix per Kieran P0-1; matches
3
+ # `redact-sentinel.sh` stripe_key regex `sk_(test|live)_[A-Za-z0-9]{16,}`.
4
+ # Allowlisted via `.gitleaks.toml` `[allowlist]` block (commit landed 2026-05-15)
5
+ # per `cq-test-fixtures-synthesized-only`.
6
+ STRIPE_SECRET_KEY=sk_test_FIXTUREDONOTUSESYNTHETICTOKEN123
7
+ DATABASE_URL=postgres://fixture-user:fixture-pass@localhost:5432/code_to_prd_fixture
@@ -0,0 +1,11 @@
1
+ /**
2
+ * About page describing the synthetic fixture's purpose.
3
+ */
4
+ export default function AboutPage() {
5
+ return (
6
+ <main>
7
+ <h1>About</h1>
8
+ <p>This page exists to give the code-to-prd walker a second App Router entry.</p>
9
+ </main>
10
+ );
11
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Health-check endpoint — returns 200 OK.
3
+ */
4
+ export async function GET() {
5
+ const upstream = await fetch("https://api.example.com/healthz");
6
+ return new Response(JSON.stringify({ ok: true, upstream: upstream.status }), {
7
+ headers: { "content-type": "application/json" },
8
+ status: 200,
9
+ });
10
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Landing page for the synthetic code-to-prd fixture.
3
+ */
4
+ import { useState } from "react";
5
+
6
+ export default function HomePage() {
7
+ const [count, setCount] = useState(0);
8
+ return (
9
+ <main>
10
+ <h1>code-to-prd fixture</h1>
11
+ <button onClick={() => setCount(count + 1)}>Count: {count}</button>
12
+ </main>
13
+ );
14
+ }
@@ -0,0 +1,3 @@
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {};
3
+ export default nextConfig;
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "code-to-prd-fixture",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "description": "Synthetic Next.js skeleton used by plugins/soleur/skills/code-to-prd/test/code-to-prd.test.sh. Dependencies are intentionally omitted — the fixture is a walker target and is never installed. Adding real dependency versions trips the dependency-review CI gate on transient upstream CVEs unrelated to this codebase."
6
+ }
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: cohort-status
3
+ description: "This skill should be used when the operator asks for the alpha-tester cohort status — recruitment tally, checkpoint state, quiet flags. Pull-based; no dashboard."
4
+ ---
5
+
6
+ <!-- grok-harness-invoke:start -->
7
+ **Grok Build (`plugins/soleur/lib/harness.ts` `invokeSkill()`):** Read this SKILL.md in this process and run it to completion. A one-segment `soleur:<name>` in this document names a SKILL — on Grok Build, Read `plugins/soleur/skills/<name>/SKILL.md` in this process; it is not a nested tool_use. A multi-segment id such as `soleur:<domain>:<name>` names an AGENT: spawn it, never Read it, and on Grok Build spawn_subagent takes the id with its colons replaced by hyphens (`agentIdToGrokSubagentType`). **Claude Code:** Skill tool for a skill (`soleur:<name>`), Task tool with `subagent_type` for an agent. Forbidden is executing a subset, not the Read.
8
+ <!-- grok-harness-invoke:end -->
9
+
10
+ # cohort-status
11
+
12
+ Prints the alpha-tester cohort table on demand — the pull-based answer to "where is the
13
+ cohort". **Operator-invoked only; never cron.** The armed `cohort-quiet` Inngest check is
14
+ the push path; this skill is for when the operator asks.
15
+
16
+ ## Sources (all local + `gh`; never the hosted DB — there is no CLI auth path)
17
+
18
+ 1. **Tally** — the recruitment-mix table in
19
+ `knowledge-base/engineering/operations/runbooks/alpha-tester-onboarding.md`
20
+ (columns: Tester | Company | Claude Code user? | Surface | Onboarded | Terms |
21
+ cohort_key | nudged_at). This is the only ledger for mix/quota state.
22
+ 2. **Checkpoint state** — `gh issue list --state all -L 50 --search "checkpoint: 2-week
23
+ usage review" --json number,title,state,createdAt`. Per-tester checkpoint issues are
24
+ titled `checkpoint: 2-week usage review — <Company> (alpha tester #N), due <date>`.
25
+ 3. **Armed reminders** — derived by convention, not read from a store:
26
+ `checkpoint-tester-N-<YYYY-MM-DD>` and `cohort-quiet-tester-N-<YYYY-MM-DD>` exist iff
27
+ Step 6 of the runbook ran (`arm-checkpoint.sh N <issue>`). A tester row whose tally has
28
+ no checkpoint issue means arming never happened — report `checkpoint_armed: NO`, do not
29
+ infer dates.
30
+
31
+ ## Procedure
32
+
33
+ 1. Read the runbook tally table. If the file or the table is unreadable, print
34
+ `UNREADABLE: <path>` and stop — **never** print zeros for a failed read.
35
+ 2. Run the `gh issue list` query. If it fails, print `UNREADABLE: gh` and show the tally
36
+ alone.
37
+ 3. Per tester row, compute:
38
+ - `checkpoint` — open / closed / `unfiled` (no matching issue found for #N)
39
+ - `armed` — `yes` iff a matching checkpoint issue exists (Step 6 files it and arms in
40
+ the same step)
41
+ - `quiet` — only from a POSITIVE read: a tester is `quiet` iff the latest `cohort-quiet`
42
+ comment on their tracking issue names their company domain (the check emits
43
+ company-level identifiers — email domains, never mailboxes). Never mark quiet from
44
+ absence — absent data is `unknown`, not `quiet`.
45
+ - `nudged_at` — echoed verbatim from the tally row; the checkpoint interview discloses
46
+ assisted-vs-unassisted returns.
47
+ 4. **Sanitize every issue title before printing** — `tr -d '\n'` and `tr '|' '/'` (issue
48
+ titles are editable text; a newline or pipe inside one breaks the table layout).
49
+ 5. Print the table:
50
+
51
+ ```
52
+ | Tester | Company | CC? | Surface | Onboarded | cohort_key | checkpoint | armed | quiet | nudged_at |
53
+ ```
54
+
55
+ 6. Print the mix floor: `Non-CC recorded X / floor 3; CC recorded Y / ceiling 7` — a
56
+ tester #8 warning when the floor is unreachable.
57
+
58
+ ## Hard rules
59
+
60
+ - `UNREADABLE`, never fabricated zeros — a failed read is a hole, not a count.
61
+ - Company-level identifiers only; never print tester names/emails from elsewhere.
62
+ - No automatic nudging, no posting — this skill is read-only.