@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,103 @@
1
+ /**
2
+ * PR merge-state polling helpers — BEHIND detection and resync contract.
3
+ *
4
+ * Ship Phase 7 embeds the full poll loop; this module is the portable spec
5
+ * Grok Build agents use when polling outside Monitor tool (ad-hoc CI watch,
6
+ * PR babysit, post-merge verify prep).
7
+ *
8
+ * Failure mode (#6347 session): Grok polled `statusCheckRollup` pending/failed
9
+ * but ignored `mergeStateStatus: BEHIND` — burned 17 ticks while main moved.
10
+ */
11
+
12
+ import type { Harness } from "./harness";
13
+
14
+ /** GitHub `mergeStateStatus` values we act on during poll loops. */
15
+ export const MERGE_STATE_BEHIND = "BEHIND" as const;
16
+ export const MERGE_STATE_DIRTY = "DIRTY" as const;
17
+ export const MERGE_STATE_BLOCKED = "BLOCKED" as const;
18
+ export const MERGE_STATE_CLEAN = "CLEAN" as const;
19
+
20
+ export const MAX_BEHIND_SYNCS_DEFAULT = 6;
21
+
22
+ /** Sentinel for drift-guarded docs/scripts. */
23
+ export const PR_BEHIND_SYNC_SENTINEL = "pr-behind-sync-protocol";
24
+
25
+ /** `gh pr view` jq template — MUST include mergeStateStatus, not just checks. */
26
+ export const PR_VIEW_POLL_JQ =
27
+ '"\\(.state) \\(.mergeStateStatus)"';
28
+
29
+ export function formatPrPollState(state: string, mergeStateStatus: string): string {
30
+ return `${state} ${mergeStateStatus}`;
31
+ }
32
+
33
+ export function isBehindPollState(pollLine: string): boolean {
34
+ return pollLine.includes(MERGE_STATE_BEHIND);
35
+ }
36
+
37
+ export function isTerminalPollState(pollLine: string): boolean {
38
+ return /^(MERGED|CLOSED)\b/.test(pollLine.trim());
39
+ }
40
+
41
+ export function isDirtyPollState(pollLine: string): boolean {
42
+ return pollLine.includes(MERGE_STATE_DIRTY);
43
+ }
44
+
45
+ /**
46
+ * When true, stop CI-only polling and resync branch with origin/main first.
47
+ * BEHIND: auto-merge will not fire until head catches up to base.
48
+ * DIRTY: GitHub computed a conflict; locally-clean DIRTY (kb-index) still resyncs.
49
+ */
50
+ export function shouldResyncBeforePoll(mergeStateStatus: string): boolean {
51
+ return (
52
+ mergeStateStatus === MERGE_STATE_BEHIND ||
53
+ mergeStateStatus === MERGE_STATE_DIRTY
54
+ );
55
+ }
56
+
57
+ /**
58
+ * Harness-specific BEHIND/DIRTY resync instructions. The script discriminates:
59
+ * DIRTY auto-syncs only when `git merge-tree` proves the local merge clean
60
+ * (kb-index class); a real conflict exits 6 for manual resolution.
61
+ */
62
+ export function behindSyncInstructions(harness: Harness): string {
63
+ // ADR-179: the installed plugin root, never a repo-relative path (a customer
64
+ // repo has no plugins/soleur/ tree).
65
+ const script = 'bash "${CLAUDE_PLUGIN_ROOT}/scripts/sync-pr-behind.sh"';
66
+ switch (harness) {
67
+ case "grok":
68
+ return [
69
+ "**BEHIND/DIRTY resync (Grok Build)**",
70
+ `- When \`gh pr view --jq '.mergeStateStatus'\` returns \`BEHIND\` or \`DIRTY\`, **STOP** CI-only polling.`,
71
+ `- Exception (first): when \`main\` has a merge queue and the PR is armed (the Phase 7 poll prints \`[ship.phase7.queue_wait]\`) the PR is waiting for GitHub to enqueue it — keep polling; never run the sync script, update-branch or --admin it until \`[ship.phase7.queue_wait_expired]\`, a push line, MERGED, a dequeue or any poll exit. This holds for a BEHIND reading only (a conflicting DIRTY PR still needs its sync). The script itself answers \`kind=queue_wait\` (exit 0, nothing synced) for that PR: a wait, not a failure.`,
72
+ `- Otherwise, from the PR worktree: \`${script} <PR-number>\` (fetch → merge origin/main → push). Use the Phase 7 loop; never write your own poll loop or wrap the script in one.`,
73
+ `- \`DIRTY\` auto-syncs only when the local merge is clean; a real conflict exits for manual resolution.`,
74
+ `- Match AwaitShell \`pattern\`: \`BEHIND detected|auto-sync.*pushed|BEHIND resolved|BEHIND unchanged|merge conflict|\\[pr-behind-sync\\] kind=|\\[ship\\.phase7\\.\`.`,
75
+ `- Exit 11 is a no-op: \`kind=noop\` is GitHub state lag. \`kind=queued\` means the PR is IN the merge queue and nothing was pushed (a push dequeues it): it exits 0 here and 11 only with \`--step\` — keep polling for MERGED, never push, update-branch or --admin it; re-poll, then re-run. Exit 13 (\`kind=dequeued\`) means it left the queue unmerged (a failed merge_group run or a removal; auto-merge may still read armed) — follow the recovery on that line. Exit 12 (\`kind=wrong_branch\`) means this worktree is not the PR's branch — cd to it. Any other \`kind=\` line names its next action.`,
76
+ `- Re-poll after push; do NOT ask the operator to update the branch.`,
77
+ ].join("\n");
78
+
79
+ case "claude":
80
+ return [
81
+ "**BEHIND/DIRTY resync (Claude Code)**",
82
+ `- When mergeStateStatus is \`BEHIND\` or \`DIRTY\`, the ship Phase 7 Monitor loop calls \`sync-pr-behind.sh <PR-number> --step\` once per attempt (the Phase 7 fence's call, never yours; unguarded by design). Never write your own poll loop — use that one. The standalone entry is \`${script} <PR-number>\`: it refuses an armed PR on a merge-queue repo with \`kind=queue_wait\` (exit 0, a wait, not a failure); DIRTY auto-syncs only when locally clean.`,
83
+ `- FORBIDDEN: heartbeating on pending checks while BEHIND or DIRTY — auto-merge is blocked — unless the script reported \`kind=queued\` (exit 11 with \`--step\`): a PR in the merge queue is not blocked, the queue merges it, so keep heartbeating and never sync it; likewise when \`main\` has a merge queue and the PR is armed (the Phase 7 poll prints \`[ship.phase7.queue_wait]\`) on a BEHIND reading (a conflicting DIRTY PR still syncs) — GitHub enqueues it, in force until \`[ship.phase7.queue_wait_expired]\`, a push line, MERGED, a dequeue or any poll exit; \`kind=dequeued\` (exit 13) stops the poll with the recovery.`,
84
+ ].join("\n");
85
+
86
+ case "cursor":
87
+ return [
88
+ "**BEHIND/DIRTY resync (Cursor CLI)**",
89
+ "- No wait primitive has been measured on the Cursor CLI.",
90
+ "- This run cannot finish that gate.",
91
+ "- Continue that merge on a harness that already has a wait, or stop.",
92
+ "- Do not invent a wait. Do not hand the wait to the operator.",
93
+ "- This stop does not make the plugin supported.",
94
+ ].join("\n");
95
+
96
+ default:
97
+ return [
98
+ "**BEHIND/DIRTY resync**",
99
+ `- Exception (first): when \`main\` has a merge queue and the PR is armed (the Phase 7 poll prints \`[ship.phase7.queue_wait]\`) the PR is waiting for GitHub to enqueue it — keep polling; never merge origin/main into it, resync-push, update-branch or --admin it (a fix commit for a red check is fine) until \`[ship.phase7.queue_wait_expired]\`, a push line, MERGED, a dequeue or any poll exit. This holds for a BEHIND reading only (a conflicting DIRTY PR still needs its sync). The script itself answers \`kind=queue_wait\` (exit 0, nothing synced) for that PR: a wait, not a failure.`,
100
+ `- Otherwise, mergeStateStatus \`BEHIND\` or \`DIRTY\` → run \`${script} <PR-number>\` from the PR worktree (fetch → merge origin/main → push; DIRTY only when the local merge is clean; it refuses an armed BEHIND PR on a merge-queue repo with \`kind=queue_wait\`, so never hand-merge instead). Use the Phase 7 loop; never write your own poll loop — on a harness without a Monitor tool, run that block itself inside the waiting subagent or shell.`,
101
+ ].join("\n");
102
+ }
103
+ }
@@ -0,0 +1,388 @@
1
+ /**
2
+ * Workflow fidelity contract — prevents Grok Build (and Claude) agents from
3
+ * cherry-picking pipeline steps after `/go` routes to a registered skill, or
4
+ * stopping mid-chain when a lifecycle skill is invoked standalone.
5
+ *
6
+ * Failure mode (#6325 session): `/go` routed to one-shot; the parent ran
7
+ * worktree setup + inline implementation and stopped — skipping plan, review, ship.
8
+ * Extension (#6320 lifecycle): same bypass at `/brainstorm`, `/plan`, `/work` entry.
9
+ */
10
+
11
+ import type { Harness } from "./harness";
12
+ import { cursorSkillSlash } from "../scripts/sync-cursor-name-map";
13
+
14
+ /** Skills that own a multi-phase pipeline — must be invoked, never inlined. */
15
+ export const PIPELINE_SKILLS = [
16
+ "one-shot",
17
+ "brainstorm",
18
+ "drain-labeled-backlog",
19
+ "drain-prs",
20
+ ] as const;
21
+
22
+ export type PipelineSkill = (typeof PIPELINE_SKILLS)[number];
23
+
24
+ /** Exploration handoff after brainstorm completes (shortcut: one-shot when reqs clear). */
25
+ export const BRAINSTORM_CHILD_SKILLS = ["plan", "one-shot"] as const;
26
+
27
+ /** Planning prefix before the shared implementation tail. */
28
+ export const PLAN_PIPELINE_PREFIX = ["plan", "deepen-plan"] as const;
29
+
30
+ /** Shared implementation tail — one-shot Steps 3–8 and standalone `/work` Phase 4. */
31
+ export const IMPLEMENTATION_TAIL = [
32
+ "work",
33
+ "review",
34
+ "qa",
35
+ "compound",
36
+ "ship",
37
+ ] as const;
38
+
39
+ /** Child skills one-shot must invoke in order (Steps 1–7). */
40
+ export const ONE_SHOT_CHILD_SKILLS = [
41
+ ...PLAN_PIPELINE_PREFIX,
42
+ ...IMPLEMENTATION_TAIL,
43
+ ] as const;
44
+
45
+ /** Standalone skills with mandatory successor invokes (not full orchestrators). */
46
+ export const HANDOFF_SKILLS = ["plan", "work", "review", "compound", "ship"] as const;
47
+
48
+ export type HandoffSkill = (typeof HANDOFF_SKILLS)[number];
49
+
50
+ /** Post-merge production verification — ship Step 3.8, one-shot Step 8 prerequisite. */
51
+ export const POST_MERGE_VERIFICATION_SKILLS = ["postmerge"] as const;
52
+
53
+ /** Emitted only after merge + release workflows + postmerge verification (one-shot Step 8). */
54
+ export const ONE_SHOT_DONE_MARKER = "<promise>DONE</promise>";
55
+
56
+ /** Sentinel markers skills/docs must retain — drift-guarded in tests. */
57
+ export const GO_POST_ROUTE_SENTINEL = "go-post-route";
58
+ export const ONE_SHOT_ANTI_BYPASS_SENTINEL = "one-shot-anti-bypass-protocol";
59
+ export const GROK_PRE_PUSH_GATE_SENTINEL = "grok-pre-push-gate";
60
+
61
+ /** Repo-relative path — run from root before `git push` under Grok Build. */
62
+ export const GROK_PRE_PUSH_GATE_SCRIPT = "plugins/soleur/scripts/grok-pre-push-gate.sh";
63
+ export const BRAINSTORM_ANTI_BYPASS_SENTINEL = "brainstorm-anti-bypass-protocol";
64
+ export const PLAN_ANTI_BYPASS_SENTINEL = "plan-anti-bypass-protocol";
65
+ export const WORK_ANTI_BYPASS_SENTINEL = "work-anti-bypass-protocol";
66
+ export const LIFECYCLE_HANDOFF_SENTINEL = "lifecycle-handoff-protocol";
67
+ export const SHIP_MERGE_DEPLOY_SENTINEL = "ship-merge-deploy-protocol";
68
+ export const POSTMERGE_HARNESS_SENTINEL = "postmerge-harness-protocol";
69
+
70
+ /**
71
+ * Grok has no Skill or Monitor tool. Do not invent matchers for them.
72
+ * Distinct from an untrusted session (no live grok --trust token on the
73
+ * 2026-09-11 host). Drain-prs Grok polling is AwaitShell, not Monitor.
74
+ */
75
+ export const GROK_HOOK_SKIP_NO_TOOL = "SOLEUR_HOOK_SKIP reason=no-tool";
76
+ export const GROK_HOOK_SKIP_UNTRUSTED = "SOLEUR_HOOK_SKIP reason=untrusted-session";
77
+
78
+ /** Re-export for workflow tests — BEHIND resync lives in pr-merge-poll.ts. */
79
+ export { PR_BEHIND_SYNC_SENTINEL } from "./pr-merge-poll";
80
+
81
+ export function isPipelineSkill(skill: string): skill is PipelineSkill {
82
+ return (PIPELINE_SKILLS as readonly string[]).includes(skill);
83
+ }
84
+
85
+ export function isHandoffSkill(skill: string): skill is HandoffSkill {
86
+ return (HANDOFF_SKILLS as readonly string[]).includes(skill);
87
+ }
88
+
89
+ /** Map /go routing labels to soleur skill names (soleur: prefix stripped at dispatch). */
90
+ export const GO_SKILL_ROUTES: Record<string, string> = {
91
+ fix: "one-shot",
92
+ implement: "one-shot",
93
+ drain: "drain-labeled-backlog",
94
+ "drain-prs": "drain-prs",
95
+ review: "review",
96
+ incident: "incident",
97
+ questionnaire: "questionnaire-generate",
98
+ glossary: "kb-glossary",
99
+ default: "brainstorm",
100
+ };
101
+
102
+ export function resolveGoSkillRoute(label: string): string {
103
+ return GO_SKILL_ROUTES[label] ?? GO_SKILL_ROUTES.default;
104
+ }
105
+
106
+ export function isOneShotRoute(label: string): boolean {
107
+ return resolveGoSkillRoute(label) === "one-shot";
108
+ }
109
+
110
+ export function isBrainstormRoute(label: string): boolean {
111
+ return resolveGoSkillRoute(label) === "brainstorm";
112
+ }
113
+
114
+ /** Mandatory successors when a handoff skill runs standalone (no parent orchestrator). */
115
+ export function mandatorySuccessors(skill: string): readonly string[] {
116
+ switch (skill) {
117
+ case "brainstorm":
118
+ return BRAINSTORM_CHILD_SKILLS;
119
+ case "plan":
120
+ return ["work"];
121
+ case "work":
122
+ return ["review", "compound", "ship"];
123
+ case "review":
124
+ return ["compound"];
125
+ case "compound":
126
+ return ["ship"];
127
+ case "ship":
128
+ return [...POST_MERGE_VERIFICATION_SKILLS];
129
+ default:
130
+ return [];
131
+ }
132
+ }
133
+
134
+ /**
135
+ * The operator-typed / adapter-rendered form of one skill on one harness. The cursor
136
+ * arm is `formatSkillRef`-only until `detectHarness` returns `cursor`. `formatSkillInvocation`
137
+ * does not share that arm in slice 1. Docs name skills as `soleur:<name>` and
138
+ * leave THIS to the adapter (ADR-226); every fidelity string below goes through it so no
139
+ * harness receives another harness's form (arch F3, #8299).
140
+ */
141
+ export function formatSkillRef(skill: string, harness: Harness): string {
142
+ switch (harness) {
143
+ case "codex":
144
+ return `$soleur:${skill}`;
145
+ case "grok":
146
+ return `/${skill}`;
147
+ case "devin":
148
+ return `/soleur:${skill}`;
149
+ case "antigravity":
150
+ return `/soleur:${skill}`;
151
+ case "cursor":
152
+ return cursorSkillSlash(skill);
153
+ case "opencode":
154
+ // The bare id is OpenCode's registration key (measurements §2.3): it has no namespaced form.
155
+ return skill;
156
+ default:
157
+ return `soleur:${skill}`;
158
+ }
159
+ }
160
+
161
+ /**
162
+ * The declared TRANSITION set — every edge a session may legally take, including
163
+ * back-edges.
164
+ *
165
+ * DELIBERATELY SEPARATE FROM `mandatorySuccessors()`, which is not a transition
166
+ * set: its result is rendered into the prompt as
167
+ * "When standalone, invoke next: /X, /Y" (see `workflowFidelityInstructions`).
168
+ * A permitted transition is legal-if-taken; a mandatory successor is a directive.
169
+ * Putting `plan` into `work`'s successors to express the `work -> plan` back-edge
170
+ * would instruct the model to re-enter planning after EVERY work run.
171
+ *
172
+ * The four back-edges are operator-approved: `review -> work` (review produced
173
+ * findings that need implementing), `ship -> work` (a pre-merge gate —
174
+ * preflight/QA — failed), `postmerge -> work` (post-merge verification failed;
175
+ * declared 2026-09-19 on #8325 — 7 sessions took it, 5 re-entered
176
+ * `work -> review -> compound -> ship -> postmerge` in full, 2 ended at `work`,
177
+ * none skipped `ship`) and `work -> plan` (implementation invalidated the
178
+ * plan). The first, second and fourth were approved on #8302.
179
+ *
180
+ * `plan -> ship` is deliberately ABSENT. It is the path that lets a session skip
181
+ * `review` entirely, which surfaces only after merge — the operator-facing loss
182
+ * this edge set exists to make visible. Its absence is asserted directly in
183
+ * `workflow-fidelity.test.ts`, because nothing else in the suite would notice if
184
+ * it were added.
185
+ *
186
+ * This is a bundled TypeScript const, NOT a runtime read of
187
+ * `.claude/phase-surface-map.json`. The plugin ships as `./plugins/soleur`
188
+ * (`.claude-plugin/marketplace.json`) and does not carry `.claude/`, so a runtime
189
+ * read returns nothing on a customer install — and `mandatorySuccessors()` would
190
+ * then silently emit no next-step directive at all. The JSON is a derived view
191
+ * kept honest by a parity test; the same reasoning already produced the bundled
192
+ * web copy at `apps/web-platform/server/phase-surface-map.ts`. See ADR-229.
193
+ */
194
+ export const DECLARED_TRANSITIONS: Readonly<Record<string, readonly string[]>> = {
195
+ brainstorm: ["plan", "one-shot"],
196
+ plan: ["work"],
197
+ work: ["review", "compound", "ship", "plan"],
198
+ review: ["compound", "work"],
199
+ compound: ["ship"],
200
+ ship: ["postmerge", "work"],
201
+ postmerge: ["work"],
202
+ };
203
+
204
+ /**
205
+ * Node skills that another node's SKILL.md invokes as a designed SUB-STEP of
206
+ * its own run, keyed by the invoking node. Each entry names the section that
207
+ * makes the call (pinned per entry by the anchor test in workflow-fidelity.test.ts):
208
+ * - brainstorm: runs `compound` to capture learnings, then hands off to
209
+ * `plan`, so the log shows `brainstorm compound plan` for the handoff.
210
+ * - plan: §Exit Gate step 1 runs `compound` (direct invocation only; in a
211
+ * pipeline the gate is skipped and the entry is simply unused — sound
212
+ * either way, since `plan -> work` is the only pair it can declare).
213
+ * - postmerge: §Phase 6 (Update Issue and Compound) runs `compound`.
214
+ * - ship: §Phase 2 (Capture Learnings) runs `compound` inside ship.
215
+ * §Phase 1.5 (Review Evidence Gate: the missing-evidence option and the
216
+ * `sequential-fallback` re-run) and §Phase 5.5 (Pre-Ship Review Gates ->
217
+ * Code Review Completion Gate) run `review` inside ship. These are
218
+ * interactive arms only; headless aborts instead (PR #8627). The log
219
+ * records starts only, so the classifier collapses ANY review whose
220
+ * previous kept node is ship, whatever invoked it; see ADR-229's
221
+ * 2026-09-23 re-baseline for what that masks.
222
+ * The classifier drops a record whose skill is a sub-step of the PREVIOUS KEPT
223
+ * node before pairing, so `plan compound work` pairs as `plan -> work`. This is
224
+ * NOT an edge: no `K -> compound` edge is declared for any key K, and because
225
+ * the collapse joins K to its NEXT node, `plan compound ship` surfaces as the
226
+ * review skip `plan -> ship` instead of hiding behind the declared
227
+ * `compound -> ship` (#8399). `review: ["compound"]` is the entry the rules
228
+ * below forbid: `compound` is a declared successor of `review`, so the collapse
229
+ * would turn `review compound work` into the declared `review -> work`.
230
+ * Mirrored in .claude/workflow-transitions.json under `sub_steps`
231
+ * (parity-pinned). See ADR-229 (amended 2026-09-21, #8399; 2026-09-23, PR #8627).
232
+ *
233
+ * To add an entry: the key and every value must be DECLARED_TRANSITIONS nodes
234
+ * (a non-node is removed by the classifier's node filter first, so the entry
235
+ * would be dead); a value must not be a declared successor of its key (the
236
+ * collapse would silently delete a declared pair from `pairs`). An entry also
237
+ * hands the value's outgoing edges to the key: any successor of the key that is
238
+ * not a successor of the value becomes a declared pair after the collapse, so
239
+ * measure which pairs vanish before adding one. Edit this const first, then
240
+ * mirror it in the JSON view (and its `_comment` amendment list), then update in
241
+ * the same PR: the exact-set pin, the `ANCHORS` heading list and its heading
242
+ * total in workflow-fidelity.test.ts (a new KEY also moves the view key-set pin
243
+ * there and `LOOP_KEYS` in the classifier suite), a case in
244
+ * scripts/classify-workflow-transitions.test.sh (plus its `MIN_CASES` floor),
245
+ * and ADR-229's Status line, a re-baseline bullet and its Verification counts.
246
+ * Run `bun test plugins/soleur/test/workflow-fidelity.test.ts`.
247
+ */
248
+ export const DECLARED_SUB_STEPS: Readonly<Record<string, readonly string[]>> = {
249
+ brainstorm: ["compound"],
250
+ plan: ["compound"],
251
+ postmerge: ["compound"],
252
+ ship: ["compound", "review"],
253
+ };
254
+
255
+ /** Edges declared FROM `skill`. Unknown nodes declare nothing. */
256
+ export function declaredTransitions(skill: string): readonly string[] {
257
+ return DECLARED_TRANSITIONS[skill] ?? [];
258
+ }
259
+
260
+ /** Whether `from -> to` is a declared edge. */
261
+ export function isDeclaredTransition(from: string, to: string): boolean {
262
+ return declaredTransitions(from).includes(to);
263
+ }
264
+
265
+ function formatSkillList(skills: readonly string[], harness: Harness): string {
266
+ return skills.map((s) => `\`${formatSkillRef(s, harness)}\``).join(", ");
267
+ }
268
+
269
+ /**
270
+ * Markdown block appended to harness routing instructions.
271
+ * Cite in go.md Step 2.1 (`<!-- workflow-fidelity:block:go-post-route:start -->`).
272
+ */
273
+ export function workflowFidelityInstructions(harness: Harness): string {
274
+ if (harness === "cursor") {
275
+ return [
276
+ "**Workflow fidelity (Cursor CLI)**",
277
+ "- Read the canonical file the stub names, relative to the plugin root, and follow that file.",
278
+ `- \`${formatSkillRef("go", harness)}\` and \`${formatSkillRef("sync", harness)}\` stay bare. Every other name is prefixed, including \`${formatSkillRef("plan", harness)}\`, \`${formatSkillRef("help", harness)}\`, and \`${formatSkillRef("review", harness)}\`.`,
279
+ "- Slice 1 does not run hooks and does not classify the session as cursor.",
280
+ ].join("\n");
281
+ }
282
+
283
+ const invokeSurface =
284
+ harness === "codex"
285
+ ? "skill loading (skills.read when available; otherwise read the installed SKILL.md and execute its full workflow)"
286
+ : harness === "grok"
287
+ ? "slash command (`/brainstorm`, `/one-shot`, `/plan`, `/work`, `/review`, `/ship`, …)"
288
+ : harness === "antigravity"
289
+ ? "slash command or reading SKILL.md (`/soleur:brainstorm`, `/soleur:one-shot`, …)"
290
+ : harness === "claude"
291
+ ? "Skill tool (`soleur:<skill>`)"
292
+ : harness === "opencode"
293
+ ? "**skill** tool with the bare id (`soleur:plan` → `plan`, `soleur:one-shot` → `one-shot`, …)"
294
+ : "registered skill invocation";
295
+
296
+ const brainstormNext = formatSkillList(BRAINSTORM_CHILD_SKILLS, harness);
297
+ const workTail = formatSkillList(
298
+ ["review", "qa", "compound", "ship"] as const,
299
+ harness,
300
+ );
301
+
302
+ const ref = (skill: string): string => `\`${formatSkillRef(skill, harness)}\``;
303
+ const go = ref("go");
304
+
305
+ const nextActionLine =
306
+ harness === "grok"
307
+ ? "- After `/go` routes to a pipeline skill (`one-shot`, `brainstorm`, `drain-*`), your **next action** MUST be to Read that skill's SKILL.md in this process and run it to completion (Grok has no nested Skill tool). Forbidden is executing a subset or writing product code before the child skill finishes — not the Read itself."
308
+ : `- After ${go} routes to a pipeline skill (\`one-shot\`, \`brainstorm\`, \`drain-*\`), your **next action** MUST be that skill's ${invokeSurface} — not reading SKILL.md and executing steps selectively.`;
309
+
310
+ const lines = [
311
+ "**Workflow fidelity (never bypass)**",
312
+ nextActionLine,
313
+ `- **FORBIDDEN after routing to \`brainstorm\`:** product code (Write/Edit/Shell); ending after spec/brainstorm doc without handoff. **REQUIRED next:** ${brainstormNext}.`,
314
+ `- **FORBIDDEN after routing to \`one-shot\`:** inline implementation before Steps 1–8 complete; ending after push/draft PR; reporting "done" without \`${ONE_SHOT_DONE_MARKER}\`.`,
315
+ `- **FORBIDDEN on standalone \`plan\` / \`work\`:** implementing or pushing without the mandated successor chain. \`plan\` → ${ref("work")}; \`work\` → ${workTail}.`,
316
+ `- **Merge → deploy (never ask the operator):** after ${ref("ship")} queues merge, YOU poll through release workflows and invoke ${ref("postmerge")} — do not ask "want me to monitor?" or end the turn at MERGED.`,
317
+ `- **Parking finished work is not a hand-off:** a stop is legitimate only for something you cannot clear — an in-flight CI run or agent, authorization for an irreversible production action (\`hr-menu-option-ack-not-prod-write-auth\`), cost/scope, an outward-facing effect, or a genuine requirements fork. Handing a reviewed, green PR back for a merge/review/ship is none of those: \`rf-never-skip-qa-review-before-merging\` requires carrying it to MERGED in-session, and "review-gated" means ${ref("review")} RAN and its findings were fixed, never that a person approves. Claude Code blocks this at its Stop hook; you have no hook, so this line is your copy of the rule.`,
318
+ `- **\`${ONE_SHOT_DONE_MARKER}\` gate:** emit ONLY after merge + release workflows + ${ref("postmerge")} verification complete — not at draft PR, not at merge alone.`,
319
+ `- **Deliverables:** brainstorm = artifacts + handoff; plan = plan file + ${ref("work")}; work/one-shot = **merged PR + healthy deploy**. Draft PRs are checkpoints only.`,
320
+ "- Skill exit summaries (`## Work Phase Complete`, `## Review Phase Complete`) are **continuation gates**, not turn boundaries.",
321
+ ];
322
+
323
+ if (harness === "grok") {
324
+ lines.push(
325
+ `- **Before \`git push\`:** run \`bash ${GROK_PRE_PUSH_GATE_SCRIPT}\` from repo root (local CI parity: \`test-all.sh\` + fast required checks + \`grok-fidelity\`). Abort push on non-zero exit; do not wait for CI.`,
326
+ );
327
+ }
328
+
329
+ return lines.join("\n");
330
+ }
331
+
332
+ /**
333
+ * Strengthen skill invocation text for pipeline and handoff skills. Every skill named in the
334
+ * suffix is rendered in the ACTIVE harness's form. `harness` is REQUIRED, not defaulted: a
335
+ * default of "grok" would reproduce the pre-ADR-226 strings (`/postmerge`, `/ship`) for any
336
+ * caller that forgot it — the exact defect this function was changed to remove — and would do
337
+ * so silently on three of four harnesses. A required parameter makes forgetting a type error — the grok arm reads exactly as before, and
338
+ * `invokeSkill("ship")` on Codex names `$soleur:postmerge`, never `/postmerge` (arch F3).
339
+ */
340
+ export function pipelineInvocationSuffix(skill: string, harness: Harness): string {
341
+ const ref = (s: string): string => formatSkillRef(s, harness);
342
+ if (skill === "one-shot") {
343
+ return (
344
+ ` Run **all** Steps 0–8 to completion. ` +
345
+ `Do NOT implement product code inline. ` +
346
+ `Poll merge→deploy yourself; invoke ${ref("postmerge")} after ${ref("ship")}. ` +
347
+ `Emit \`${ONE_SHOT_DONE_MARKER}\` only after postmerge completes.`
348
+ );
349
+ }
350
+ if (skill === "brainstorm") {
351
+ return (
352
+ " Run the full brainstorm pipeline to completion. " +
353
+ "Do NOT write product code. " +
354
+ `Hand off via ${ref("plan")} or ${ref("one-shot")} when exploration is done.`
355
+ );
356
+ }
357
+ if (skill === "plan") {
358
+ return (
359
+ " Run the full plan pipeline. " +
360
+ `Do NOT implement product code inline — invoke ${ref("work")} when the plan artifact is ready.`
361
+ );
362
+ }
363
+ if (skill === "work") {
364
+ return (
365
+ ` Run implementation then the post-work tail (${ref("review")} → ${ref("compound")} → ${ref("ship")} → ${ref("postmerge")}). ` +
366
+ "Do NOT stop after push — merged PR + deploy verification is the deliverable."
367
+ );
368
+ }
369
+ if (skill === "ship") {
370
+ return (
371
+ ` Poll merge and release workflows to completion; invoke ${ref("postmerge")} before cleanup. ` +
372
+ "Do NOT ask the operator to monitor — you own the wait."
373
+ );
374
+ }
375
+ if (skill === "postmerge") {
376
+ return " Run all postmerge phases through Phase 7 report — production health gate.";
377
+ }
378
+ if (isPipelineSkill(skill)) {
379
+ return " Run the skill's full pipeline — do not stop after the first phase.";
380
+ }
381
+ if (isHandoffSkill(skill)) {
382
+ const next = mandatorySuccessors(skill);
383
+ if (next.length > 0) {
384
+ return ` When standalone, invoke next: ${next.map(ref).join(", ")} — do not end the turn at artifacts.`;
385
+ }
386
+ }
387
+ return "";
388
+ }
@@ -0,0 +1,152 @@
1
+ # Soleur on OpenCode — routing
2
+
3
+ Generated by `scripts/sync-opencode-adapter.ts`. Do not edit by hand.
4
+
5
+ ## Skills
6
+
7
+ Soleur skills register from the canonical tree through the `skills` config key, so this
8
+ harness has no generated skill tree. A skill id is the **bare directory basename**
9
+ (`plan`, `one-shot`, `work`): there is no `soleur:` namespace here (measurement §2.3).
10
+
11
+ Canonical Soleur prose is written for Claude Code and says `soleur:<name>`. On this
12
+ harness that prefix is dropped: invoke `soleur:plan` as `plan`. An agent-read document
13
+ keeps the canonical form; an operator-typed or tool-invoked reference is bare.
14
+
15
+ ## Agents
16
+
17
+ An agent id is derived from its file path, not from frontmatter `name:`, so
18
+ `soleur:engineering:cto` is spawned as `engineering/cto` (measurement §3.0). Every
19
+ Soleur agent is generated with `mode: subagent`; without that field an agent registers
20
+ as primary and the `subagent` tool cannot reach it.
21
+
22
+ Spawn subagents through the **`subagent`** tool. It takes the path-derived id
23
+ (`engineering/cto`), a one-line `description`, and a complete `prompt` — the child sees
24
+ nothing but that prompt. Foreground waits for the result; `background: true` returns
25
+ immediately and notifies the parent when the child finishes.
26
+
27
+ **Nesting depth is one.** A spawned child must not spawn further children: when a skill's
28
+ step says *the leader spawns X*, the leader is the session that invoked the skill. A child
29
+ that finds it needs a specialist reports back instead of delegating.
30
+
31
+ ## Commands
32
+
33
+ `/go`, `/help`, `/sync` and `/version` register from the **config directory's** `commands/`
34
+ (`install-opencode-adapter.ts` copies `opencode/commands/*.md` there). The committed tree's
35
+ `opencode/commands/` is the source the installer copies, not a discovery root. If `/go` is
36
+ absent, the adapter is not installed: run
37
+ `bun "${CLAUDE_PLUGIN_ROOT}/scripts/install-opencode-adapter.ts" --check` (see *Paths and
38
+ entry points* below for the token) — it names what is missing (measurement §4.0).
39
+
40
+ A stub's body carries the literal text `$ARGUMENTS`. OpenCode's docs say the token is
41
+ replaced with the invocation's arguments (§4.0 is docs-sourced, not measured); the stub is
42
+ written on that basis. If the token is still present when the command runs, read it as the
43
+ arguments you were given — the stub's job is to route you, not to parse them.
44
+
45
+ ## Paths and entry points
46
+
47
+ Soleur's canonical prose calls scripts as `bash "${CLAUDE_PLUGIN_ROOT}/<path>"`, with the
48
+ token substituted at delivery time on Claude Code. **Nothing on this harness substitutes
49
+ it**, so a copied call reaches the shell with the token expanded to nothing, collapses to a
50
+ workdir-relative path, and surfaces as `source=none verified=false` in the `go` gate rather
51
+ than as anything that looks like a missing variable.
52
+
53
+ The resolved root for this install is the line below — the installer rewrites it when it
54
+ copies this file:
55
+
56
+ __SOLEUR_PLUGIN_ROOT__
57
+
58
+ Before running any canonical `bash` call, type that absolute path in place of the token. It
59
+ is the prefix for every path in the plugin (`skills/`, `agents/`, `commands/`, `hooks/`,
60
+ `scripts/`) and the prefix of the `skills` entry in `opencode.json`, so either source
61
+ disambiguates the other. Do not export or default a variable for it: the value is a literal
62
+ path here. A `subagent` child does not inherit your shell environment, so hand it the
63
+ absolute path in its prompt rather than assuming a variable exists.
64
+
65
+ ## Tools
66
+
67
+ Canonical Soleur prose names Claude Code tools. This table is the translation, and the
68
+ property it is held to is that **every** name Soleur's agent-read corpus uses has a row
69
+ here (`test/harness-tool-map.test.ts`). The OpenCode side is the V2 built-in set
70
+ (measurement §12.8); V1 called the shell tool `bash` and V2 calls it `shell`.
71
+
72
+ | Soleur instruction | OpenCode execution |
73
+ | --- | --- |
74
+ | Read / Glob / Grep | `read`, `glob`, `grep` |
75
+ | Write / Edit / MultiEdit | `write` for a new file, `edit` for a change (`replaceAll` replaces every match, which is all `MultiEdit` ever was); `patch` adds, moves or deletes several files in one call on the models that expose it |
76
+ | Bash / Shell | `shell`. Set `workdir` instead of putting `cd` in the command, `timeout` in milliseconds, and `background: true` for a long-running process |
77
+ | Skill `soleur:<name>` | The `skill` tool with the **bare** id: load `soleur:plan` as `plan`. The id must be in the advertised set, so a wrong one fails loudly instead of silently loading nothing |
78
+ | Task / Agent / spawn_subagent | The `subagent` tool with the path-derived id (`engineering/cto`) |
79
+ | AskUserQuestion | `question` — a real blocking prompt with a free-form answer always available |
80
+ | TodoWrite / TodoRead | No `todo` tool exists. Track the steps in the skill's own Markdown, or in a scratch file in the project |
81
+ | Monitor / AwaitShell / TaskOutput | `shell` with `background: true` returns immediately and notifies the session when the process finishes, retaining the full output in a managed file. There is no await/poll primitive and no background output reader; for a wait-until-event watch, run a bounded `shell` poll loop and keep progress visible |
82
+ | WebSearch / WebFetch / ToolSearch | `websearch`, `webfetch`. No tool-search tool exists: the built-in set is advertised up front, so name the tool the step wants |
83
+ | SendMessage / ListAgents | No equivalent. `subagent` starts a child and, in the background form, notifies on completion — there is no message-without-a-turn and no enumeration. Pass the returned `sessionID` to continue that same child |
84
+ | TaskCreate / TaskGet / TaskList / TaskUpdate / TaskStop | No equivalent, and no inventory of running children exists. Track steps in the skill's own Markdown or a project file |
85
+ | RemoteTrigger / PushNotification / ScheduleWakeup / CronCreate / CronDelete / CronList | No equivalent. Report the unsupported gate rather than simulating it — a scheduled or push-triggered step that silently does not fire is worse than one that refuses |
86
+ | NotebookEdit | No equivalent; edit the file with `edit` |
87
+ | Workflow scripts | Translate the orchestration into `subagent` calls; do not execute Claude tool calls as shell JavaScript |
88
+
89
+ A gate with no OpenCode equivalent is stated as unsupported above, never silently
90
+ skipped — the same posture the hook ledger takes. A step that cannot fire must say so.
91
+
92
+ ## Hooks and completion
93
+
94
+ The plugin module `plugin.ts` (installed as `<configdir>/plugins/soleur-plugin.ts`) is the hook
95
+ carrier. `.claude/hooks/opencode-dispositions.tsv` is its ledger: one row per canonical
96
+ registration, every row carrying a disposition, so a gate with no equivalent here is
97
+ **reported, never silently skipped**.
98
+
99
+ OpenCode V2 has **no Stop hook**. Every hook surface communicates only by mutating the event
100
+ object it is handed, and `ctx.event.subscribe` is a one-way iterator with no return channel,
101
+ so no hook can defer a stop, force a continuation, or veto a completion. Soleur's completion
102
+ marker is therefore **advisory** on this harness: a session that goes quiet is observed and
103
+ nothing more. The structural checks inside the invoked skill are the contract, and the marker
104
+ is a report, not a gate.
105
+
106
+ The guards are real, and they reuse the canonical scripts unchanged. A shell call is handed to
107
+ `browser-snapshot-credential-guard.sh` and `destructive-command-guard.sh` in the order
108
+ `hooks.json` registers them, and the decision is written onto the permission event: a `deny`
109
+ becomes `effect = "deny"` and a guard's `ask` becomes `effect = "ask"`, a real prompt. The tool
110
+ then reports `permission.rejected` carrying the guard's reason, which the model reads. Neither
111
+ value is downgraded — `deny` blocks, `ask` waits (measurement §12.2).
112
+
113
+ The shell tool's wire name here is **`shell`**, not `bash`; the plugin maps both to Claude's
114
+ `Bash` before handing the call to a guard (measurement §12.1). Code-mode `execute` calls carry
115
+ JavaScript rather than a command and are not decided by the Bash guards — a limitation this
116
+ harness shares with the guard scripts' own input contract.
117
+
118
+ The post-compaction re-read is **armed, not guaranteed**, unlike Codex and Devin:
119
+ `ctx.session.hook("compaction")` sets state and the next `ctx.session.hook("context")`
120
+ re-injects the rule corpus plus the re-read directive. §12.3 captured that `context` fire
121
+ once; §14.0 records a later probe where it did **not** fire, unreconciled (#10587). No
122
+ compaction-support claim is published from this. Operationally: after a compaction you
123
+ notice, re-read `AGENTS.rules.md` yourself rather than assuming the injection happened.
124
+ What is not reproduced at all is `compaction-state.sh`'s transcript-bounded window
125
+ bookkeeping, which counts `compact_boundary` records in a Claude Code transcript this
126
+ harness has no equivalent of.
127
+
128
+ ## Uninstall / removal
129
+
130
+ There is **no `--uninstall` flag** on `install-opencode-adapter.ts` today (tracked in
131
+ #10591 item 4), so removal is done by hand against the config dir the installer wrote to.
132
+ Four things were created; remove all four, because a partial removal is worse than none:
133
+
134
+ 1. **The generated `agents/` and `commands/` stubs.** These directories are **shared** with
135
+ the operator, so delete only the files whose body names the canonical plugin path (the
136
+ stubs' signature) — never the whole directory.
137
+ 2. **`<configdir>/soleur/`** — the installed instructions tree.
138
+ 3. **`<configdir>/plugins/soleur-plugin.ts`** — the hook carrier. Leaving it behind keeps
139
+ Soleur live after you meant to remove it: it still registers the Bash guards and still
140
+ re-injects the rule corpus on every session. It does **not** fail closed by itself — the
141
+ `guard-did-not-run` deny fires only when a guard *script* cannot be spawned (the checkout
142
+ moved or was removed, or `__SOLEUR_PLUGIN_ROOT__` never resolved), which is a checkout
143
+ problem rather than a leftover-file one.
144
+ 4. **The `skills` and `instructions` entries the installer added to `<configdir>/opencode.json`.**
145
+ Edit the file and drop those two keys; leaving them behind points OpenCode at a tree that
146
+ no longer exists.
147
+
148
+ Do **not** use `install-opencode-adapter.ts --check` to confirm removal. It is an
149
+ idempotence check for an *installed* adapter: it reports `MISSING` for every path it expects
150
+ and exits 1, so a correct removal is indistinguishable from a broken install. Verify by hand
151
+ instead — the four paths above are absent, and a fresh OpenCode session no longer
152
+ re-injects the Soleur rule corpus or emits a `[soleur] guard-run-failure` line.
@@ -0,0 +1,10 @@
1
+ ---
2
+ mode: subagent
3
+ description: "Participates in brainstorm and planning phases to assess technical implications, flag architecture concerns, and identify engineering risks for proposed features. Use individual engineering agents (review, research, design) for focused tasks; use this agent for cross-cutting technical assessment during feature exploration."
4
+ ---
5
+
6
+ Stub for the canonical agent `soleur:engineering:cto`. OpenCode derives an agent's id from this
7
+ file's path, so the canonical `name:` frontmatter is deliberately not repeated here.
8
+
9
+ Read and follow the canonical agent definition at `__SOLEUR_PLUGIN_ROOT__/agents/engineering/cto.md`,
10
+ then work as that agent.