@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,111 @@
1
+ #!/usr/bin/env bash
2
+ # Hermetic suite for ensure-semgrep.sh (#9964): a resolvable-but-dead semgrep
3
+ # must NOT read as present. Every arm runs the SUT under `env -i` with a
4
+ # curated PATH — no real brew/pipx/python3/timeout can leak in, and HOME is a
5
+ # sandbox dir so the SUT's `$HOME/.local/bin` prepend cannot see the host.
6
+
7
+ set -u
8
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
+ SUT="$SCRIPT_DIR/../scripts/ensure-semgrep.sh"
10
+ PASS=0; FAIL=0; TOTAL=0
11
+
12
+ ok() { PASS=$((PASS+1)); TOTAL=$((TOTAL+1)); echo " PASS: $1"; }
13
+ no() { FAIL=$((FAIL+1)); TOTAL=$((TOTAL+1)); echo " FAIL: $1"; }
14
+ assert() { local desc="$1" cond="$2"; if eval "$cond"; then ok "$desc"; else no "$desc"; fi; }
15
+
16
+ D="" D2="" D3="" D4="" D5="" D6="" D7="" D8="" D9=""
17
+ cleanup() { [ -n "$D" ] && rm -rf "$D" "$D2" "$D3" "$D4" "$D5" "$D6" "$D7" "$D8" "$D9"; }
18
+ trap cleanup EXIT
19
+
20
+ # Each arm's dir carries: stubs (semgrep/installers), home/ (empty HOME), and
21
+ # tools/ (symlinks to the real coreutils the stubs need — nothing else).
22
+ mkarm() {
23
+ local dir
24
+ dir="$(mktemp -d)"
25
+ mkdir -p "$dir/home" "$dir/tools"
26
+ for t in chmod cat env ls cp mkdir; do
27
+ command -v "$t" >/dev/null 2>&1 && ln -sf "$(command -v "$t")" "$dir/tools/$t"
28
+ done
29
+ printf '%s\n' "$dir"
30
+ }
31
+ # run_sut <dir> [extra PATH dirs] — curated env: PATH=dir[:extra], HOME=dir/home.
32
+ run_sut() { local dir="$1"; shift; env -i PATH="$dir:$dir/tools${1:+:$1}" HOME="$dir/home" /bin/bash "$SUT"; }
33
+
34
+ dead_semgrep() { printf '#!/bin/sh\necho "ModuleNotFoundError: No module named semgrep" >&2\nexit 1\n' >"$1/semgrep"; chmod +x "$1/semgrep"; }
35
+ live_semgrep() { printf '#!/bin/sh\nif [ "$1" = "--version" ]; then echo "1.99.0"; exit 0; fi\nexit 0\n' >"$1/semgrep"; chmod +x "$1/semgrep"; }
36
+ probe_semgrep() { printf '#!/bin/sh\necho "$1" >>"%s/probe-log"\nif [ "$1" = "--version" ]; then echo "1.99.0"; exit 0; fi\nexit 0\n' "$1" >"$1/semgrep"; chmod +x "$1/semgrep"; }
37
+ # installer stubs assert argv fidelity AND record invocation AND "install" a
38
+ # probe-logging semgrep by copying the arm's pre-written `installed` stub to
39
+ # the target (the SUT re-probes after install — every rc-0 path must show
40
+ # --version ran).
41
+ write_installed() { printf '#!/bin/sh\necho "$1" >>"%s/probe-log"\nif [ "$1" = "--version" ]; then echo "1.99.0"; exit 0; fi\nexit 0\n' "$1" >"$1/installed"; chmod +x "$1/installed"; }
42
+ install_brew() {
43
+ write_installed "$1"
44
+ printf '#!/bin/sh\necho "brew:$1:$2" >>"%s/called"\nif [ "$1" = "install" ] && [ "$2" = "semgrep" ]; then cp "%s/installed" "%s/semgrep"; chmod +x "%s/semgrep"; exit 0; fi\nexit 1\n' "$1" "$1" "$1" "$1" >"$1/brew"; chmod +x "$1/brew"
45
+ }
46
+ fail_stub() { printf '#!/bin/sh\necho "%s" >>"%s/called"\nexit 1\n' "$2" "$1" >"$1/$2"; chmod +x "$1/$2"; }
47
+
48
+ # --- arm A: live semgrep on PATH → rc 0, no installer invoked --------------
49
+ D="$(mkarm)"; live_semgrep "$D"; fail_stub "$D" brew; fail_stub "$D" pipx
50
+ OUT="$(run_sut "$D" 2>/dev/null)"; RC=$?
51
+ assert "live semgrep: exit 0 and its path printed" "[ $RC -eq 0 ] && [[ \"$OUT\" == */semgrep ]]"
52
+ assert "live semgrep: NO installer invoked" "[ ! -f '$D/called' ]"
53
+
54
+ # --- arm B: dead shim + working brew → installs, re-probes, rc 0 -----------
55
+ D2="$(mkarm)"; dead_semgrep "$D2"; install_brew "$D2"
56
+ run_sut "$D2" >/dev/null 2>&1; RC=$?
57
+ assert "dead shim + brew: exit 0 after install" "[ $RC -eq 0 ] && grep -q 'brew:install:semgrep' '$D2/called'"
58
+ assert "dead shim + brew: the post-install re-probe ran --version" "grep -q -- '--version' '$D2/probe-log'"
59
+
60
+ # --- arm C: dead shim + NO installer → rc 2, NOT reported present ----------
61
+ D3="$(mkarm)"; dead_semgrep "$D3"
62
+ ERR="$(run_sut "$D3" 2>&1 >/dev/null)"; RC=$?
63
+ assert "dead shim + no installer: exit 2 (shim reads as absent)" "[ $RC -eq 2 ]"
64
+ assert "dead shim + no installer: diagnostic names the dead shim" "[[ \"$ERR\" == *'resolves at'* ]]"
65
+ assert "dead shim + no installer: points at shim removal, not a missing installer" "[[ \"$ERR\" == *[Ss]'him'* ]]"
66
+
67
+ # --- arm D: installer produces a still-dead binary → falls through, rc 1 ---
68
+ D4="$(mkarm)"; dead_semgrep "$D4"
69
+ printf '#!/bin/sh\necho "brew" >>"%s/called"\nexit 0\n' "$D4" >"$D4/brew"; chmod +x "$D4/brew" # brew "succeeds" but shim stays dead (shadowed)
70
+ fail_stub "$D4" pipx; fail_stub "$D4" python3
71
+ ERR="$(run_sut "$D4" 2>&1 >/dev/null)"; RC=$?
72
+ assert "install-success-but-still-dead: exit 1 (attempted, still dead)" "[ $RC -eq 1 ]"
73
+ assert "install-success-but-still-dead: diagnostic names the dead path" "[[ \"$ERR\" == *'still does not run'* ]]"
74
+
75
+ # --- arm E: absent semgrep + working brew → rc 0 (regression) --------------
76
+ D5="$(mkarm)"; install_brew "$D5"
77
+ run_sut "$D5" >/dev/null 2>&1; RC=$?
78
+ assert "absent + brew: exit 0 with installer invoked AND re-probed" "[ $RC -eq 0 ] && grep -q 'brew:install:semgrep' '$D5/called' && grep -q -- '--version' '$D5/probe-log'"
79
+
80
+ # --- arm F: dead shim + brew fails + pipx succeeds → rc 0 ------------------
81
+ D6="$(mkarm)"; dead_semgrep "$D6"; fail_stub "$D6" brew; fail_stub "$D6" python3
82
+ write_installed "$D6"
83
+ printf '#!/bin/sh\necho "pipx:$1:$2" >>"%s/called"\nif [ "$1" = "install" ] && [ "$2" = "semgrep" ]; then cp "%s/installed" "%s/home/.local/bin/semgrep"; chmod +x "%s/home/.local/bin/semgrep"; exit 0; fi\nexit 1\n' "$D6" "$D6" "$D6" "$D6" >"$D6/pipx"; chmod +x "$D6/pipx"
84
+ mkdir -p "$D6/home/.local/bin"
85
+ run_sut "$D6" >/dev/null 2>&1; RC=$?
86
+ assert "dead shim + brew fails + pipx installs to HOME/.local/bin: exit 0" "[ $RC -eq 0 ] && grep -q 'pipx:install:semgrep' '$D6/called'"
87
+ assert "arm F: the HOME/.local/bin prepend is what made the install visible" "grep -q -- '--version' '$D6/probe-log'"
88
+
89
+ # --- arm G: the probe RUNS on every rc-0 path (vacuity pin) ----------------
90
+ D7="$(mkarm)"; probe_semgrep "$D7"
91
+ run_sut "$D7" >/dev/null 2>&1; RC=$?
92
+ assert "probe runs semgrep --version on the rc-0 path" "[ $RC -eq 0 ] && grep -q -- '--version' '$D7/probe-log'"
93
+
94
+ # --- arm H: python3 -m pip install --user success path, argv-faithful ------
95
+ D8="$(mkarm)"; dead_semgrep "$D8"; fail_stub "$D8" brew; fail_stub "$D8" pipx
96
+ write_installed "$D8"
97
+ printf '#!/bin/sh\necho "python3:$*" >>"%s/called"\nif [ "$1" = "-m" ] && [ "$2" = "pip" ] && [ "$3" = "install" ] && [ "$4" = "--user" ] && [ "$5" = "semgrep" ]; then cp "%s/installed" "%s/home/.local/bin/semgrep"; chmod +x "%s/home/.local/bin/semgrep"; exit 0; fi\nexit 1\n' "$D8" "$D8" "$D8" "$D8" >"$D8/python3"; chmod +x "$D8/python3"
98
+ mkdir -p "$D8/home/.local/bin"
99
+ run_sut "$D8" >/dev/null 2>&1; RC=$?
100
+ assert "dead shim + python3 -m pip --user success: exit 0, argv-faithful" "[ $RC -eq 0 ] && grep -q 'python3:-m pip install --user semgrep' '$D8/called'"
101
+ assert "arm H: re-probe ran the pip-installed binary" "grep -q -- '--version' '$D8/probe-log'"
102
+
103
+ # --- arm I: installer present but FAILED (nothing installed) → rc 1 ------
104
+ D9="$(mkarm)"; dead_semgrep "$D9"; fail_stub "$D9" brew
105
+ ERR="$(run_sut "$D9" 2>&1 >/dev/null)"; RC=$?
106
+ assert "dead shim + brew fails + nothing else: exit 1 (attempted)" "[ $RC -eq 1 ]"
107
+ assert "arm I: rc 1 not rc 2 — an installer WAS attempted" "[[ \"$ERR\" == *'still does not run'* ]]"
108
+
109
+ echo
110
+ echo "=== ensure-semgrep.test.sh: $PASS passed, $FAIL failed ($TOTAL assertions) ==="
111
+ [ "$FAIL" -eq 0 ]
@@ -0,0 +1,237 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # Tests for fix-round-seats.sh — the single path→seat map consumed by both the
4
+ # `none`-tier panel gating and the post-panel fix-commit targeted round (ADR-267).
5
+ #
6
+ # The suite needs NO filesystem fixtures — the SUT is a pure argv→stdout
7
+ # function, so every arm is an invocation plus a stdout/stderr assertion. That
8
+ # also means there is deliberately no mktemp/assert_fixture_dir machinery.
9
+ #
10
+ # Mutation axes covered (Guard 1 of the 9399 plan): per-arm membership, the
11
+ # code-quality floor on unmatched source, multi-area unions, registry
12
+ # validation of emitted AND --finding-seats tokens, the forged-token drop, and
13
+ # the empty-diff contract.
14
+ set -uo pipefail
15
+ export TMPDIR="${TMPDIR:-/var/tmp}"
16
+
17
+ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
18
+ SUT="$(cd "${DIR}/../scripts" && pwd)/fix-round-seats.sh"
19
+ WORKFLOW="$(cd "${DIR}/../workflows" && pwd)/review.workflow.js"
20
+
21
+ passes=0
22
+ fails=0
23
+ # INDEPENDENT case counter (ADR-193): moves in assert(), never in the verdict
24
+ # helpers — a counter owned by pass()/fail() dies with the verdict it counts.
25
+ CASES=0
26
+
27
+ pass() { passes=$((passes + 1)); printf ' ok %s\n' "$1"; }
28
+ fail() {
29
+ fails=$((fails + 1))
30
+ printf ' FAIL %s\n' "$1"
31
+ [[ -n "${2:-}" ]] && printf ' %s\n' "$2"
32
+ return 0
33
+ }
34
+
35
+ assert() {
36
+ CASES=$((CASES + 1))
37
+ if eval "$2"; then
38
+ pass "$1"
39
+ else
40
+ fail "$1" "${3:-$2}"
41
+ fi
42
+ }
43
+
44
+ printf '\n=== fix-round-seats ===\n\n'
45
+
46
+ [[ -f "$SUT" ]] || {
47
+ printf '\n[FATAL] SUT missing at %s — nothing to test.\n' "$SUT" >&2
48
+ exit 1
49
+ }
50
+ [[ -f "$WORKFLOW" ]] || {
51
+ printf '\n[FATAL] workflow missing at %s — registry cannot be derived.\n' "$WORKFLOW" >&2
52
+ exit 1
53
+ }
54
+
55
+ # Canonical seat registry, DERIVED — not restated. Agent-type leaves come from
56
+ # the workflow's DIMENSIONS registry; the deterministic/non-agent seats the
57
+ # workflow carries (shellcheck, anti-slop, gdpr) plus the SKILL-only
58
+ # structural-enumeration seat are appended explicitly.
59
+ registry() {
60
+ grep -oE "agentType: 'soleur:[a-z:-]+'" "$WORKFLOW" | tr -d "'" | awk -F: '{print $NF}'
61
+ printf '%s\n' shellcheck anti-slop gdpr-gate structural-enumeration code-simplicity-reviewer
62
+ }
63
+
64
+ run() { # $1=label; rest=args — captures stdout, stderr, rc without a subshell race
65
+ local label; label="$1"; : "$label"; shift
66
+ OUT="$(bash "$SUT" "$@" 2>"$TMPERR")"; RC=$?
67
+ ERR="$(cat "$TMPERR")"
68
+ }
69
+ TMPERR="$(mktemp -t fixseats-err.XXXXXXXX)"
70
+ trap 'rm -f "$TMPERR"' EXIT
71
+
72
+ # ── ARM 1: migration path → data-integrity + data-migration (+ deploy-verify) ──
73
+ run mig --files 'apps/web-platform/supabase/migrations/20990101000000_x.sql'
74
+ assert "migration path exits 0" '[[ "$RC" -eq 0 ]]' "rc=$RC err=$ERR"
75
+ assert "migration path emits data-integrity-guardian" \
76
+ 'grep -qx "data-integrity-guardian" <<<"$OUT"' "out=$OUT"
77
+ assert "migration path emits data-migration-expert" \
78
+ 'grep -qx "data-migration-expert" <<<"$OUT"' "out=$OUT"
79
+ assert "migration path emits deployment-verification-agent" \
80
+ 'grep -qx "deployment-verification-agent" <<<"$OUT"' "out=$OUT"
81
+
82
+ # ── ARM 2: floor — an unmatched source path still emits code-quality-analyst ──
83
+ # `scripts/lib/` hits no area arm (not web-platform, not plugins/soleur), so the
84
+ # only mapped seat is the deterministic SAST one — the floor must still fire.
85
+ run floor --files 'scripts/lib/foo.ts'
86
+ assert "unmatched source emits code-quality floor" \
87
+ '[[ "$RC" -eq 0 ]] && grep -qx "code-quality-analyst" <<<"$OUT"' "rc=$RC out=$OUT"
88
+ assert "unmatched source also emits semgrep (source extension)" \
89
+ 'grep -qx "semgrep-sast" <<<"$OUT"' "out=$OUT"
90
+ # Golden output pins membership AND order AND suppression: nothing else may be
91
+ # emitted for a lone unmatched source path.
92
+ assert "unmatched source emits EXACTLY code-quality + semgrep, in order" \
93
+ '[[ "$OUT" == $'"'"'code-quality-analyst\nsemgrep-sast'"'"' ]]' "out=$OUT"
94
+ assert "unmatched source names the path on stderr (unmapped-paths)" \
95
+ 'grep -q "unmapped-paths: scripts/lib/foo.ts" <<<"$ERR"' "err=$ERR"
96
+
97
+ # ── ARM 3: multi-area union does not stop at the first member ─────────────────
98
+ run multi --files $'plugins/soleur/skills/review/test/fix-round-seats.test.sh\napps/web-platform/supabase/migrations/20990101000000_x.sql'
99
+ assert "test file + migration yields BOTH test-design and data-integrity" \
100
+ 'grep -qx "test-design-reviewer" <<<"$OUT" && grep -qx "data-integrity-guardian" <<<"$OUT"' "out=$OUT"
101
+ assert "test file + .sh extension also yields shellcheck" \
102
+ 'grep -qx "shellcheck" <<<"$OUT"' "out=$OUT"
103
+
104
+ # ── ARM 4: every emitted token resolves against the canonical registry ────────
105
+ run reg --files $'apps/web-platform/supabase/migrations/20990101000000_x.sql\napps/web-platform/server/auth.ts\nplugins/soleur/skills/review/test/fix-round-seats.test.sh'
106
+ _reg="$(registry | sort -u)"
107
+ _bad="$(comm -23 <(sort -u <<<"$OUT") <(printf '%s\n' "$_reg"))"
108
+ assert "all emitted seats resolve against the derived registry" \
109
+ '[[ -z "$_bad" ]]' "unregistered: $_bad"
110
+
111
+ # ── ARM 5: --finding-seats unions the reporting seat ──────────────────────────
112
+ run find --files 'docs/guide.md' --finding-seats user-impact-reviewer
113
+ assert "finding-seat unions into an otherwise path-empty round" \
114
+ '[[ "$RC" -eq 0 ]] && grep -qx "user-impact-reviewer" <<<"$OUT"' "rc=$RC out=$OUT"
115
+
116
+ # ── ARM 6: forged / unknown --finding-seats tokens never reach stdout ──────────
117
+ run forge --files 'docs/guide.md' --finding-seats $'security-sentinel\nBUG-INJECTED'
118
+ assert "newline-forged token is dropped, not echoed" \
119
+ '! grep -qx "BUG-INJECTED" <<<"$OUT"' "out=$OUT"
120
+ assert "newline-forged token warns on stderr" \
121
+ 'grep -q "unknown-seat:" <<<"$ERR"' "err=$ERR"
122
+ assert "the real seat in the same arg survives" \
123
+ 'grep -qx "security-sentinel" <<<"$OUT"' "out=$OUT"
124
+ run unk --files 'docs/guide.md' --finding-seats 'not-a-seat'
125
+ assert "unknown seat name dropped with warning" \
126
+ '[[ "$RC" -eq 0 ]] && ! grep -qx "not-a-seat" <<<"$OUT" && grep -q "unknown-seat: not-a-seat" <<<"$ERR"' \
127
+ "rc=$RC out=$OUT err=$ERR"
128
+
129
+ # ── ARM 7: empty --files is a distinct exit-0 contract ────────────────────────
130
+ run empty --files ''
131
+ assert "empty file list exits 0 with empty stdout" \
132
+ '[[ "$RC" -eq 0 && -z "$OUT" ]]' "rc=$RC out=$OUT"
133
+ assert "empty file list notes it on stderr" \
134
+ 'grep -q "note: empty fix diff" <<<"$ERR"' "err=$ERR"
135
+
136
+ # NB: sensitive-path fixtures name a NONEXISTENT path on purpose — the
137
+ # battery-tag-authorship closure walks filesystem-real path mentions, and a
138
+ # fixture naming a file that runs `git fetch`/`pull` would drag it into the
139
+ # battery's offender census (measured live: session-sync.ts, 3 offenders).
140
+ # ── ARM 8: sensitive path → security-sentinel ─────────────────────────────────
141
+ run sens --files 'apps/web-platform/lib/stripe/__fixture__.ts'
142
+ assert "sensitive path emits security-sentinel" \
143
+ 'grep -qx "security-sentinel" <<<"$OUT"' "out=$OUT"
144
+
145
+ # ── ARM 9: docs-only path emits no seats (floor is source-only) ───────────────
146
+ run docs --files 'README.md'
147
+ assert "non-source unmatched path emits nothing" \
148
+ '[[ "$RC" -eq 0 && -z "$OUT" ]]' "rc=$RC out=$OUT"
149
+
150
+ # ── ARM 10: usage error exits 2 ───────────────────────────────────────────────
151
+ run badflag --bogus
152
+ assert "unknown flag exits 2" '[[ "$RC" -eq 2 ]]' "rc=$RC"
153
+ run noargs
154
+ assert "no args exits 2" '[[ "$RC" -eq 2 ]]' "rc=$RC"
155
+
156
+ # ── ARM 11: every map arm has a presence pin ─────────────────────────────────
157
+ # PERSIST isolated (a lib/ path that hits no other arm), PERF, GDPR, and
158
+ # ANTISLOP/AGENT_SURFACE each get a fixture — deleting any single arm must red.
159
+ run persist --files 'apps/web-platform/lib/util.ts'
160
+ assert "persistence lib/ arm emits data-integrity-guardian" \
161
+ 'grep -qx "data-integrity-guardian" <<<"$OUT"' "out=$OUT"
162
+ run perf --files 'packages/inngest/foo.ts'
163
+ assert "perf-arm path emits performance-oracle" \
164
+ 'grep -qx "performance-oracle" <<<"$OUT"' "out=$OUT"
165
+ run gdprarm --files 'apps/web-platform/lib/auth/x.ts'
166
+ assert "gdpr-arm path emits gdpr-gate" \
167
+ 'grep -qx "gdpr-gate" <<<"$OUT"' "out=$OUT"
168
+ run sloparm --files 'apps/web-platform/components/ui/foo.tsx'
169
+ assert "anti-slop+agent-surface arms both fire on a UI path" \
170
+ 'grep -qx "anti-slop" <<<"$OUT" && grep -qx "agent-native-reviewer" <<<"$OUT"' "out=$OUT"
171
+
172
+ # ── ARM 12: comma-separated --files must actually SPLIT ───────────────────────
173
+ # SENSITIVE_PATH_RE is ^-anchored, so only the SPLIT second entry can emit
174
+ # security-sentinel — the joined line never matches.
175
+ run comma --files 'docs/a.md,apps/web-platform/lib/stripe/__fixture__.ts'
176
+ assert "comma split is observable (anchored arm on the second entry)" \
177
+ 'grep -qx "security-sentinel" <<<"$OUT"' "out=$OUT"
178
+
179
+ # ── ARM 13: --finding-seats vocabulary normalization ─────────────────────────
180
+ # Canonical ids and workflow dimension keys both reduce to leaf names; a forged
181
+ # glob token is never pathname-expanded.
182
+ run vocab --files 'docs/guide.md' --finding-seats 'soleur:engineering:review:security-sentinel,git-history,code-quality'
183
+ assert "canonical id normalizes to leaf" \
184
+ 'grep -qx "security-sentinel" <<<"$OUT"' "out=$OUT"
185
+ assert "dimension keys normalize to leaves" \
186
+ 'grep -qx "git-history-analyzer" <<<"$OUT" && grep -qx "code-quality-analyst" <<<"$OUT"' "out=$OUT"
187
+ run dupfs --files 'docs/guide.md' --finding-seats 'security-sentinel,security-sentinel'
188
+ assert "duplicate finding-seat dedupes to one line" \
189
+ '[[ "$(grep -c "^security-sentinel$" <<<"$OUT")" -eq 1 ]]' "out=$OUT"
190
+ run glob --files '' --finding-seats '*'
191
+ assert "a forged glob token cannot expand or reach stdout" \
192
+ '[[ "$RC" -eq 0 && -z "$OUT" ]]' "rc=$RC out=$OUT err=$ERR"
193
+ # Discriminating: with `set -f` removed, '*' pathname-expands and stderr shows
194
+ # the expanded filenames instead of the literal token.
195
+ assert "forged glob is reported literally (set -f holds)" \
196
+ 'grep -q "unknown-seat: \*" <<<"$ERR"' "err=$ERR"
197
+
198
+ # ── ARM 14: whitespace-only and CRLF file entries are normalized ──────────────
199
+ run blank --files $' \n\t\n'
200
+ assert "whitespace-only --files behaves like empty (no floor, no seats)" \
201
+ '[[ "$RC" -eq 0 && -z "$OUT" ]]' "rc=$RC out=$OUT err=$ERR"
202
+ # Discriminating: a leading-whitespace path only matches the ^-anchored
203
+ # sensitive arm after the leading-trim — removing the trim reds this arm.
204
+ run wsanchored --files ' apps/web-platform/lib/stripe/__fixture__.ts'
205
+ assert "leading-whitespace path still matches the anchored sensitive arm" \
206
+ 'grep -qx "security-sentinel" <<<"$OUT"' "out=$OUT"
207
+ # Discriminating: git quote-paths a filename containing spaces; the wrapping
208
+ # quote would defeat the ^-anchored sensitive arm without the strip.
209
+ run quoted --files '"apps/web-platform/lib/stripe/__fixture__.ts"'
210
+ assert "quote-pathed entry still matches the anchored sensitive arm" \
211
+ 'grep -qx "security-sentinel" <<<"$OUT"' "out=$OUT"
212
+ run crlf --files $'scripts/lib/foo.ts\r'
213
+ assert "CR-trailing path still matches the source arm" \
214
+ 'grep -qx "code-quality-analyst" <<<"$OUT"' "out=$OUT"
215
+
216
+ # ── Accounting conservation (ADR-193 #3) — reported directly, never via verdict helpers ──
217
+ if [[ $((passes + fails)) -ne "$CASES" ]]; then
218
+ printf '\n[FATAL] accounting: passes+fails (%d) != CASES (%d).\n' \
219
+ "$((passes + fails))" "$CASES" >&2
220
+ printf '\n=== fix-round-seats: %d passed, %d failed (%d assertions) ===\n\n' \
221
+ "$passes" "$fails" "$CASES" >&2
222
+ exit 1
223
+ fi
224
+
225
+ # ── Anti-vacuity floor (ADR-193 #1) — reads the INDEPENDENT counter ───────────
226
+ FIXSEATS_MIN_ASSERTIONS=36
227
+ if (( CASES < FIXSEATS_MIN_ASSERTIONS )); then
228
+ printf '\n[FATAL] anti-vacuity floor: only %d assertion(s) ran, expected >= %d.\n' \
229
+ "$CASES" "$FIXSEATS_MIN_ASSERTIONS" >&2
230
+ printf '\n=== fix-round-seats: %d passed, %d failed (%d assertions) ===\n\n' \
231
+ "$passes" "$fails" "$CASES" >&2
232
+ exit 1
233
+ fi
234
+
235
+ printf '\n=== fix-round-seats: %d passed, %d failed (%d assertions) ===\n\n' \
236
+ "$passes" "$fails" "$CASES"
237
+ [[ "$fails" -eq 0 ]]
@@ -0,0 +1,147 @@
1
+ # Workflow-backed `soleur:review` (prototype)
2
+
3
+ `review.workflow.js` is a [dynamic workflow](https://claude.com/blog/introducing-dynamic-workflows-in-claude-code)
4
+ re-implementation of the core engine of the `soleur:review` skill. It is a
5
+ **prototype for A/B comparison** against the prose-driven SKILL.md — not a
6
+ replacement. Both can coexist.
7
+
8
+ > **Known divergence:** `SKILL.md` §"Change Classification Gate" step 4 adds a
9
+ > **`design-risk`** signal — a mechanism-introducing PR gets a design-validity
10
+ > pass (simplicity + architecture, plus economics only on a cost claim) *before*
11
+ > the full panel, with mandatory dedup of lenses that already ran. This port does
12
+ > not implement it: its classify agent returns the four classes and the `triggers`
13
+ > object only. A run driven from this script therefore skips the design-validity
14
+ > ordering. The prose skill remains the default and the authority.
15
+
16
+ ## What it does
17
+
18
+ ```
19
+ Classify ──▶ Review ──▶ Verify ──▶ Synthesize ──▶ File
20
+ (1 agent) (always-on (1–3 (dedup + (CONCUR-gated
21
+ + cond. skeptics provenance scope-out,
22
+ dimensions) refute disposition) dry-run by
23
+ each find.) default)
24
+ ```
25
+
26
+ 1. **Classify** — one agent runs the same change-class predicates as
27
+ `SKILL.md` §"Change Classification Gate" and returns a structured class
28
+ (`code` / `non-code` / `lockfile-only` / `deletion-dominated`) **plus a
29
+ `triggers` object** (Rails, migration, tests, source, bash-only, GDPR,
30
+ user-impact threshold).
31
+ 2. **Review** — the script (not the model) maps the class to its **always-on**
32
+ dimension list and the triggers to its **conditional** dimensions, then fans
33
+ out one agent per lens. Each lens reuses the **real Soleur reviewer agent**
34
+ via `agentType`, so it inherits that agent's system prompt.
35
+ 3. **Verify** — every finding is handed to 1–3 adversarial skeptics (a
36
+ perspective-diverse panel — correctness / scope / already-handled — when
37
+ `deepReview`) that default to `isReal=false` and must be argued *out* of
38
+ refutation; majority-real survives. **No-barrier pipeline**: a dimension's
39
+ findings start verifying the instant that dimension lands. The fan-out is
40
+ **budget-floored** — if `budget.remaining()` drops below the reserve, the
41
+ remaining findings are surfaced `UNVERIFIED` (kept, not dropped) and the
42
+ skipped set is logged. Never a silent cap.
43
+ 4. **Synthesize** — confirmed findings are deduped by `file+title`, then given
44
+ a deterministic `disposition` (`fix-inline` vs `scope-out-candidate`) from
45
+ the SKILL's cost-of-filing rule encoded in code.
46
+ 5. **File** — each `scope-out-candidate` is independently co-signed by a
47
+ simplicity-biased **CONCUR gate** (defaults to DISSENT). DISSENT flips the
48
+ finding back to `fix-inline`; CONCUR files a `deferred-scope-out` issue —
49
+ but only when invoked with `{ file: true }`. Otherwise it's a **dry run**
50
+ that emits the would-file issue body for inspection.
51
+
52
+ **Untrusted-input hardening:** finding titles derive from the diff under
53
+ review — potentially attacker-controlled PR content. The title is passed to
54
+ `gh` as a shell argv, so it runs through `safeTitle()` (strips control chars
55
+ + shell metacharacters, caps length) and a constant `review: ` prefix <!-- markdownlint-disable-line MD038 -->
56
+ (no leading `-` → no argv flag-smuggling); the body always goes via
57
+ `--body-file` so it is never shell-parsed. The agent writes both to temp
58
+ files with its Write tool rather than receiving an interpolated command.
59
+
60
+ ## How to run it
61
+
62
+ From a session where the diff under review is reachable (`origin/main...HEAD`):
63
+
64
+ ```
65
+ Workflow({ scriptPath: "plugins/soleur/skills/review/workflows/review.workflow.js",
66
+ args: "1234" }) // PR number, branch name, or "" for current branch
67
+ ```
68
+
69
+ `args` may also be an object:
70
+
71
+ | field | effect |
72
+ |---|---|
73
+ | `target` | PR number / branch / `""` (current branch) |
74
+ | `deepReview` | force the full always-on 8-dimension pass **and** a 3-skeptic perspective-diverse verify panel. The literal phrases `deep review` / `full review` in a string `target` trigger the same override, matching the SKILL. |
75
+ | `file` | actually create the `deferred-scope-out` GitHub issues for CONCUR'd candidates. Default (omit) is a dry run that only emits the would-file bodies. |
76
+
77
+ e.g. `args: { target: "1234", deepReview: true, file: true }`.
78
+
79
+ Iterate by editing the file and re-invoking with the same `scriptPath`. To
80
+ resume an interrupted run, add `resumeFromRunId: "<runId>"` — unchanged
81
+ `agent()` calls return cached results instantly.
82
+
83
+ ## What it inherits from Workflow that the SKILL can't express today
84
+
85
+ | Capability | SKILL.md (Task-spawn prose) | This workflow |
86
+ |---|---|---|
87
+ | Class → fan-out decision | Model interprets a bash decision tree each run | Deterministic JS lookup (`CLASS_DIMENSIONS` + `conditionalDimensions`) |
88
+ | Conditional agents | Prose "if PR contains X, spawn agent Y" | `triggers` flags → deterministic dimension list |
89
+ | Risk-tier panel scaling | SKILL delegates to `references/risk-tier-and-fix-rounds.md` | `resolveTier` (fail-closed sensitive-path clamp) + `scaleAlwaysOn` trigger-gate {data-integrity, agent-native, performance} at `none` tier (ADR-267) |
90
+ | Per-finding verification | None — CONCUR fires only on scope-out *filings* | Every finding adversarially refuted (1–3 skeptics) before surfacing |
91
+ | Review→verify scheduling | Implicit barrier (waits for all reviewers) | No-barrier `pipeline()` — verify starts per-dimension |
92
+ | Disposition (fix vs file) | Prose cost-of-filing gate, model-applied | `disposition()` — code, auditable, identical every run |
93
+ | Scope-out CONCUR gate | Manual self-check the agent CONCUR'd | Structured CONCUR/DISSENT verdict; DISSENT auto-flips to fix-inline |
94
+ | Resume after interruption | Restart from zero | Journaled — cached prefix replays instantly |
95
+ | Token ceiling | Hand-written "API budget" warnings | `budget` floor on the verify fan-out; UNVERIFIED-not-dropped + logged |
96
+ | Structured output | Parse agent prose by hand | Schema-validated, agents retry on mismatch |
97
+
98
+ ## Ported so far
99
+
100
+ + always-on dimension agents (class-gated 2/4/8 fan-out)
101
+ + conditional dimensions (Rails ×2, migration ×2, test-design, semgrep-SAST,
102
+ shellcheck (bash), real `gdpr-gate` skill, anti-slop Tier-1, user-impact)
103
+ from deterministic `triggers`
104
+ + deterministic-tool findings auto-confirmed (skip adversarial verify)
105
+ + 1–3 skeptic adversarial verification, no-barrier pipeline
106
+ + provenance-driven deterministic disposition
107
+ + CONCUR-gated `deferred-scope-out` filing (dry-run by default; `{ file: true }`
108
+ to create issues)
109
+ + `budget` floor on the verify fan-out with logged UNVERIFIED coverage
110
+
111
+ ### Deterministic vs. judgment findings
112
+
113
+ Dimensions split into two kinds:
114
+
115
+ + **LLM-judgment** (the reviewer agents) → every finding is adversarially
116
+ verified (refute-by-default) before it surfaces.
117
+ + **Deterministic tools/skills** (`semgrep`, `shellcheck`, `anti-slop`, the real
118
+ `gdpr-gate`) → findings are **auto-confirmed as ground truth**, skipping the
119
+ verify stage. Refuting an `SC2086` or a `BRAND-RAW-HEX` hit would be both wrong
120
+ and wasteful; the tool is authoritative. These carry `deterministic: true`.
121
+
122
+ `bashOnly` routes the SAST slot to `shellcheck` instead of `semgrep` (semgrep's
123
+ tree-sitter bash parser is vacuous — SKILL.md note). `anti-slop` high-severity
124
+ `brand` findings are a **required-fix** gate (the scanner exits non-zero).
125
+
126
+ ## Still NOT ported (next increments)
127
+
128
+ + **Follow-through auto-wiring** — filed scope-outs don't yet scaffold the
129
+ `<!-- soleur:followthrough -->` directive + verification script + `chmod`.
130
+ + **semgrep `ensure-semgrep.sh` exit-code handling** — the `semgrep` dimension
131
+ prompts the bootstrap but doesn't hard-abort the run on a non-zero installer
132
+ exit (the SKILL does).
133
+ + **Pipeline-mode compact-marker output** for `one-shot` / `work` callers (the
134
+ workflow returns structured JSON instead, which an orchestrator consumes
135
+ directly — arguably moot in workflow form).
136
+ + **Fix-commit targeted rounds (ADR-267)** — `--fix-round`/`--since` arg
137
+ handling, `PANEL_SHA` snapshotting, and the `structural-enumeration` seat
138
+ (the `aggregate pattern` row's guard-shaped structural pass, a SKILL-only
139
+ `general-purpose` spawn) exist only in the prose skill; the workflow port
140
+ resolves the tier and gates the none-tier panel but does not run fix rounds.
141
+
142
+ ## Validation
143
+
144
+ `review.workflow.js`'s control flow (conditional fan-out, pipeline verify,
145
+ majority survival, CONCUR flip, dry-run filing, budget floor) is exercised by a
146
+ stub harness with **no real agents / zero tokens** — see the PR description for
147
+ the matrix. The live A/B on PR #5006 covers the real-agent path.