@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
package/lib/harness.ts ADDED
@@ -0,0 +1,716 @@
1
+ /**
2
+ * Harness adapter — maps Soleur workflow invocations to Claude Code, Grok Build, Codex, Devin CLI, or the Cursor CLI.
3
+ *
4
+ * Claude: Skill tool (`soleur:<skill>`), Task tool (agents), `/soleur:<command>` slash commands.
5
+ * Grok: slash commands (`/<skill>`, `/go`), spawn_subagent (agents).
6
+ * Codex: $soleur:<skill> skill mentions, spawn_agent (agents).
7
+ * Devin: Skill tool (`soleur:<skill>`), run_subagent (agents), `/soleur:<command>` slash commands.
8
+ * Cursor: `/go` and `/sync` stay bare; every other skill and agent is `/soleur-<name>`. Slice 1 does not detect this harness.
9
+ * OpenCode: bare skill ids (the registration key), agents via the subagent tool keyed on the path id.
10
+ *
11
+ * Skills and go.md must call these helpers (or follow routingInstructions) — never improvise workflows.
12
+ */
13
+
14
+ import { resolve } from "path";
15
+ import {
16
+ agentIdToPath,
17
+ agentIdToGrokSubagentType,
18
+ discoverAgentEntries,
19
+ pathToAgentId,
20
+ PLUGIN_ROOT,
21
+ } from "./agent-registry";
22
+ import { cursorAgentSlash, cursorSkillSlash } from "../scripts/sync-cursor-name-map";
23
+ import { behindSyncInstructions } from "./pr-merge-poll";
24
+ import { pipelineInvocationSuffix, workflowFidelityInstructions } from "./workflow-fidelity";
25
+
26
+ export type Harness = "claude" | "grok" | "codex" | "devin" | "cursor" | "opencode" | "antigravity" | "unknown";
27
+
28
+ /** Env vars set by Antigravity CLI / Google Gemini CLI. */
29
+ const ANTIGRAVITY_ENV_MARKERS = [
30
+ "ANTIGRAVITY_CLI",
31
+ "AGY_VERSION",
32
+ "GEMINI_CLI",
33
+ ] as const;
34
+
35
+ /** Env vars set by Grok Build (see https://docs.x.ai/build/settings/reference). */
36
+ const GROK_ENV_MARKERS = [
37
+ "GROK_HOME",
38
+ "GROK_AGENT",
39
+ "GROK_DEFAULT_MODEL",
40
+ "GROK_SUBAGENTS",
41
+ ] as const;
42
+
43
+ /** Env vars set by Devin CLI. */
44
+ const DEVIN_ENV_MARKERS = [
45
+ "DEVIN",
46
+ "DEVIN_HOME",
47
+ ] as const;
48
+
49
+ export interface SkillInvocation {
50
+ harness: Harness;
51
+ tool: "Skill" | "slash_command" | "skill";
52
+ command: string;
53
+ args?: string;
54
+ instruction: string;
55
+ }
56
+
57
+ export interface AgentSpawn {
58
+ harness: Harness;
59
+ tool: "Task" | "spawn_subagent" | "spawn_agent" | "run_subagent" | "invoke_subagent" | "subagent";
60
+ agent: string;
61
+ prompt: string;
62
+ instruction: string;
63
+ }
64
+
65
+ /** Strip `soleur:` prefix; Grok exposes bare skill names as slash commands. */
66
+ export function normalizeSkillName(skill: string): string {
67
+ return skill.replace(/^soleur:/, "");
68
+ }
69
+
70
+ /**
71
+ * Ensure agent ids are plugin-qualified when a bare or path-style name is passed.
72
+ * Path-style: `engineering/review/security-sentinel` → registry-qualified id.
73
+ */
74
+ export function normalizeAgentName(agent: string): string {
75
+ if (agent.startsWith("soleur:")) {
76
+ return agent;
77
+ }
78
+ if (agent.includes("/")) {
79
+ return pathToAgentId(`agents/${agent.replace(/\.md$/, "")}.md`);
80
+ }
81
+ if (agent.includes(":")) {
82
+ return `soleur:${agent}`;
83
+ }
84
+ return agent;
85
+ }
86
+
87
+ /**
88
+ * Detect the active harness from environment markers and process metadata.
89
+ * Detection order: CLAUDECODE → OPENCODE → ANTIGRAVITY_* → GROK_* → CODEX_THREAD_ID → DEVIN_* → process title/argv heuristics.
90
+ *
91
+ * OPENCODE is checked second, and before the config-path markers, on purpose. OpenCode injects it
92
+ * into the environment of every process it spawns as a tool call — and into nothing else: a clean
93
+ * env, `opencode serve`, `opencode acp`, and the session runtime process itself all lack it
94
+ * (measurements.md §1.1). GROK_HOME / DEVIN_HOME are installation *paths* that a shell profile can
95
+ * export into any session, so they must not be able to shadow a marker OpenCode injects itself.
96
+ * CLAUDECODE keeps the first position the existing precedence tests pin.
97
+ *
98
+ * `AI_AGENT=opencode` is present in the same arm but is deliberately NOT the predicate: the name is
99
+ * generic (measurements.md §1.0 caveat).
100
+ */
101
+ export function detectHarness(env: NodeJS.ProcessEnv = process.env): Harness {
102
+ if (env.CLAUDECODE) {
103
+ return "claude";
104
+ }
105
+
106
+ if (env.OPENCODE) {
107
+ return "opencode";
108
+ }
109
+
110
+ for (const key of ANTIGRAVITY_ENV_MARKERS) {
111
+ if (env[key]) {
112
+ return "antigravity";
113
+ }
114
+ }
115
+
116
+ for (const key of GROK_ENV_MARKERS) {
117
+ if (env[key]) {
118
+ return "grok";
119
+ }
120
+ }
121
+
122
+ if (env.CODEX_THREAD_ID) {
123
+ return "codex";
124
+ }
125
+
126
+ for (const key of DEVIN_ENV_MARKERS) {
127
+ if (env[key]) {
128
+ return "devin";
129
+ }
130
+ }
131
+
132
+ // Process heuristics apply only when inspecting the live runtime env — not
133
+ // injected test fixtures (Grok Build's argv/title would false-positive "grok").
134
+ if (env === process.env && typeof process !== "undefined") {
135
+ const title = (process.title ?? "").toLowerCase();
136
+ const argv = process.argv.join(" ").toLowerCase();
137
+ if (title.includes("antigravity") || /\b(antigravity|agy)\b/.test(argv)) {
138
+ return "antigravity";
139
+ }
140
+ if (title.includes("grok") || /\bgrok\b/.test(argv)) {
141
+ return "grok";
142
+ }
143
+ if (title.includes("devin") || /\bdevin\b/.test(argv)) {
144
+ return "devin";
145
+ }
146
+ }
147
+
148
+ return "unknown";
149
+ }
150
+
151
+ /**
152
+ * Return the harness-specific skill invocation string (display / logging).
153
+ */
154
+ export function formatSkillInvocation(skill: string, args?: string): string {
155
+ const harness = detectHarness();
156
+ const name = normalizeSkillName(skill);
157
+ const trimmedArgs = args?.trim();
158
+
159
+ if (harness === "codex") {
160
+ return trimmedArgs ? `$soleur:${name} ${trimmedArgs}` : `$soleur:${name}`;
161
+ }
162
+
163
+ if (harness === "grok") {
164
+ return trimmedArgs ? `/${name} ${trimmedArgs}` : `/${name}`;
165
+ }
166
+
167
+ if (harness === "opencode") {
168
+ // OpenCode's skill id is the bare directory basename: the name must equal its directory
169
+ // (measurements §2.3), so `soleur:<name>` cannot be a registration key. This is the same
170
+ // bare-dispatch shape Grok already carries, not a new exception (ADR-291 D1).
171
+ return trimmedArgs ? `${name} ${trimmedArgs}` : name;
172
+ }
173
+
174
+ if (harness === "devin") {
175
+ const command = trimmedArgs ? `/soleur:${name} ${trimmedArgs}` : `/soleur:${name}`;
176
+ return command;
177
+ }
178
+
179
+ if (harness === "antigravity") {
180
+ const command = trimmedArgs ? `/soleur:${name} ${trimmedArgs}` : `/soleur:${name}`;
181
+ return command;
182
+ }
183
+
184
+ // Claude's operator-typed form is the slash command, exactly as the codex/grok/devin arms
185
+ // above give theirs. This used to return `soleur:<name> (args: <x>)` — a DISPLAY string no
186
+ // operator can type — while ADR-226 §4 and the `operator-typed-render` blocks in ten skills
187
+ // cite this function as the thing that produces a typeable form. The blocks were right about
188
+ // the contract and the claude arm was the outlier (#8299).
189
+ const command = `/soleur:${name}`;
190
+ return trimmedArgs ? `${command} ${trimmedArgs}` : command;
191
+ }
192
+
193
+ /**
194
+ * Structured skill invocation — use at routing sites instead of improvising steps.
195
+ */
196
+ export function invokeSkill(skill: string, args?: string): SkillInvocation {
197
+ const harness = detectHarness();
198
+ const name = normalizeSkillName(skill);
199
+ const trimmedArgs = args?.trim();
200
+
201
+ const pipelineSuffix = pipelineInvocationSuffix(name, harness);
202
+
203
+ if (harness === "codex") {
204
+ return {
205
+ harness,
206
+ tool: "skill",
207
+ command: `$soleur:${name}`,
208
+ args: trimmedArgs,
209
+ instruction:
210
+ `Load the registered Soleur skill $soleur:${name}: read its SKILL.md and follow the entire workflow.` +
211
+ (trimmedArgs ? ` Use these arguments as $ARGUMENTS: ${trimmedArgs}` : "") +
212
+ " Use skills.read when available, otherwise read the installed skill file. Do not send a dollar mention to the shell." +
213
+ pipelineSuffix,
214
+ };
215
+ }
216
+
217
+ if (harness === "grok") {
218
+ const command = trimmedArgs ? `/${name} ${trimmedArgs}` : `/${name}`;
219
+ return {
220
+ harness,
221
+ tool: "slash_command",
222
+ command,
223
+ args: trimmedArgs,
224
+ instruction:
225
+ `Read \`plugins/soleur/skills/${name}/SKILL.md\` in this process and run it to completion ` +
226
+ `(Grok has no nested Skill/slash tool; \`/${name}\` names the skill, it is not a nested tool_use). ` +
227
+ "Do NOT improvise a subset of its steps." +
228
+ pipelineSuffix,
229
+ };
230
+ }
231
+
232
+ if (harness === "opencode") {
233
+ return {
234
+ harness,
235
+ tool: "skill",
236
+ command: name,
237
+ args: trimmedArgs,
238
+ instruction:
239
+ `Load the registered Soleur skill \`${name}\` with the **skill** tool — OpenCode keys skills ` +
240
+ `by their bare directory name. If that tool is unavailable, read ` +
241
+ `\`plugins/soleur/skills/${name}/SKILL.md\` and run the entire workflow. ` +
242
+ "Do NOT improvise a subset of its steps." +
243
+ (trimmedArgs ? ` Use these arguments as $ARGUMENTS: ${trimmedArgs}` : "") +
244
+ pipelineSuffix,
245
+ };
246
+ }
247
+
248
+ if (harness === "devin") {
249
+ const command = trimmedArgs ? `/soleur:${name} ${trimmedArgs}` : `/soleur:${name}`;
250
+ return {
251
+ harness,
252
+ tool: "slash_command",
253
+ command,
254
+ args: trimmedArgs,
255
+ instruction:
256
+ `Invoke the registered skill via the \`${command}\` slash command. ` +
257
+ "Do NOT improvise workflow steps — run the skill to completion." +
258
+ pipelineSuffix,
259
+ };
260
+ }
261
+
262
+ if (harness === "antigravity") {
263
+ const command = trimmedArgs ? `/soleur:${name} ${trimmedArgs}` : `/soleur:${name}`;
264
+ return {
265
+ harness,
266
+ tool: "slash_command",
267
+ command,
268
+ args: trimmedArgs,
269
+ instruction:
270
+ `Read \`plugins/soleur/skills/${name}/SKILL.md\` using \`view_file\` (or invoke slash command \`${command}\`) and run it to completion. ` +
271
+ "Do NOT improvise workflow steps — follow all required phases and decision gates." +
272
+ pipelineSuffix,
273
+ };
274
+ }
275
+
276
+ const command = `soleur:${name}`;
277
+ return {
278
+ harness: harness === "claude" ? "claude" : harness,
279
+ tool: "Skill",
280
+ command,
281
+ args: trimmedArgs,
282
+ instruction:
283
+ `Invoke via the **Skill tool** with skill \`${command}\`` +
284
+ (trimmedArgs ? ` and args: \`${trimmedArgs}\`` : "") +
285
+ ". Do NOT improvise workflow steps." +
286
+ pipelineSuffix,
287
+ };
288
+ }
289
+
290
+ /**
291
+ * Return markdown guidance for spawning an agent under the active harness.
292
+ */
293
+ export function formatAgentSpawn(agent: string, prompt: string): string {
294
+ const harness = detectHarness();
295
+ const agentId = normalizeAgentName(agent);
296
+
297
+ if (harness === "codex") {
298
+ const spawn = spawnAgent(agent, prompt);
299
+ return `${spawn.instruction}\n\n${spawn.prompt}`;
300
+ }
301
+
302
+ if (harness === "grok") {
303
+ // Grok validates subagent_type against the .grok/agents filename stem
304
+ // (colons → hyphens), not the colon-qualified Claude id.
305
+ const grokType = agentIdToGrokSubagentType(agentId);
306
+ return (
307
+ `Use **spawn_subagent** with subagent_type \`${grokType}\` ` +
308
+ `(Grok spawn key; canonical id \`${agentId}\`) and this prompt:\n\n${prompt}`
309
+ );
310
+ }
311
+
312
+ if (harness === "devin") {
313
+ return (
314
+ `Use the **run_subagent** tool with agent \`${agentId}\` and this prompt:\n\n${prompt}`
315
+ );
316
+ }
317
+
318
+ if (harness === "antigravity") {
319
+ return (
320
+ `Use **invoke_subagent** with agent \`${agentId}\` (or register dynamically via **define_subagent**) and this prompt:\n\n${prompt}`
321
+ );
322
+ }
323
+
324
+ if (harness === "opencode") {
325
+ // OpenCode derives the agent id from its file path and ignores frontmatter `name:`
326
+ // (measurements §3.0), so the registry's colon id does not resolve — the path form does.
327
+ const pathId = agentIdToPath(agentId);
328
+ return (
329
+ `Use the **subagent** tool with subagent_type \`${pathId}\` ` +
330
+ `(OpenCode's path-derived id; canonical id \`${agentId}\`) and this prompt:\n\n${prompt}`
331
+ );
332
+ }
333
+
334
+ return (
335
+ `Use the **Task tool** with subagent_type \`${agentId}\` and this prompt:\n\n${prompt}`
336
+ );
337
+ }
338
+
339
+ /**
340
+ * Structured agent spawn — maps Claude Task tool to Grok spawn_subagent, Codex spawn_agent, and Devin run_subagent.
341
+ */
342
+ export function spawnAgent(agent: string, prompt: string): AgentSpawn {
343
+ const harness = detectHarness();
344
+ const agentId = normalizeAgentName(agent);
345
+
346
+ if (harness === "codex") {
347
+ const entries = discoverAgentEntries().filter(
348
+ (entry) => entry.id === agentId || entry.name === agentId,
349
+ );
350
+ if (entries.length !== 1) {
351
+ throw new Error(`Unknown or ambiguous Soleur agent: ${agent}`);
352
+ }
353
+ const entry = entries[0];
354
+ return {
355
+ harness,
356
+ tool: "spawn_agent",
357
+ agent: entry.id,
358
+ prompt: `Read and follow the Soleur agent definition at ${resolve(PLUGIN_ROOT, entry.path)}.\nApply the Codex compatibility instructions at ${resolve(PLUGIN_ROOT, "codex/INSTRUCTIONS.md")}.\n\n${prompt}`,
359
+ instruction:
360
+ "Use the available spawn_agent tool with its default agent type and pass the supplied prompt verbatim as its message. " +
361
+ "Inherit the session model and permissions. Use the tool's actual schema; the Soleur ID identifies the instruction file, not a registered Codex agent type.",
362
+ };
363
+ }
364
+
365
+ if (harness === "grok") {
366
+ const grokType = agentIdToGrokSubagentType(agentId);
367
+ return {
368
+ harness,
369
+ tool: "spawn_subagent",
370
+ agent: grokType,
371
+ prompt,
372
+ instruction:
373
+ `Spawn via **spawn_subagent** with subagent_type \`${grokType}\` ` +
374
+ `(not colon form \`${agentId}\` — Grok matches the \`.grok/agents/\` filename stem). ` +
375
+ "Enable with `GROK_SUBAGENTS=1` or `[subagents] enabled = true` in config. " +
376
+ "Pass the prompt verbatim — do NOT substitute a manual workflow.",
377
+ };
378
+ }
379
+
380
+ if (harness === "devin") {
381
+ const entries = discoverAgentEntries().filter(
382
+ (entry) => entry.id === agentId || entry.name === agentId,
383
+ );
384
+ if (entries.length !== 1) {
385
+ throw new Error(`Unknown or ambiguous Soleur agent: ${agent}`);
386
+ }
387
+ const entry = entries[0];
388
+ return {
389
+ harness,
390
+ tool: "run_subagent",
391
+ agent: entry.id,
392
+ prompt: `Read and follow the Soleur agent definition at ${resolve(PLUGIN_ROOT, entry.path)}.\nApply the Devin compatibility instructions at ${resolve(PLUGIN_ROOT, "devin/INSTRUCTIONS.md")}.\n\n${prompt}`,
393
+ instruction:
394
+ `Spawn via **run_subagent** with agent \`${entry.id}\`. ` +
395
+ "Inherit the session model and permissions. " +
396
+ "Pass the prompt verbatim — do NOT substitute a manual workflow.",
397
+ };
398
+ }
399
+
400
+ if (harness === "antigravity") {
401
+ const entries = discoverAgentEntries().filter(
402
+ (entry) => entry.id === agentId || entry.name === agentId,
403
+ );
404
+ if (entries.length !== 1) {
405
+ throw new Error(`Unknown or ambiguous Soleur agent: ${agent}`);
406
+ }
407
+ const entry = entries[0];
408
+ return {
409
+ harness,
410
+ tool: "invoke_subagent",
411
+ agent: entry.id,
412
+ prompt: `Read and follow the Soleur agent definition at ${resolve(PLUGIN_ROOT, entry.path)}.\nApply the Antigravity compatibility instructions at ${resolve(PLUGIN_ROOT, "antigravity/INSTRUCTIONS.md")}.\n\n${prompt}`,
413
+ instruction:
414
+ `Spawn via **invoke_subagent** with agent \`${entry.id}\` (define dynamically via \`define_subagent\` if not already registered in this session). ` +
415
+ "Set Workspace: 'inherit' and Model: 'inherit'. " +
416
+ "Pass the prompt verbatim — do NOT substitute a manual workflow.",
417
+ };
418
+ }
419
+
420
+ if (harness === "opencode") {
421
+ const entries = discoverAgentEntries().filter(
422
+ (entry) => entry.id === agentId || entry.name === agentId,
423
+ );
424
+ if (entries.length !== 1) {
425
+ throw new Error(`Unknown or ambiguous Soleur agent: ${agent}`);
426
+ }
427
+ const entry = entries[0];
428
+ const pathId = agentIdToPath(entry.id);
429
+ return {
430
+ harness,
431
+ tool: "subagent",
432
+ agent: pathId,
433
+ prompt: `Read and follow the Soleur agent definition at ${resolve(PLUGIN_ROOT, entry.path)}.\nApply the OpenCode compatibility instructions at ${resolve(PLUGIN_ROOT, "opencode/INSTRUCTIONS.md")}.\n\n${prompt}`,
434
+ instruction:
435
+ `Spawn via the **subagent** tool with subagent_type \`${pathId}\` ` +
436
+ `(OpenCode's path-derived id for \`${entry.id}\`; a path id needs \`mode: subagent\`, which ` +
437
+ "the generated tree sets). Inherit the session model and permissions. " +
438
+ "Pass the prompt verbatim — do NOT substitute a manual workflow.",
439
+ };
440
+ }
441
+
442
+ return {
443
+ harness: harness === "claude" ? "claude" : harness,
444
+ tool: "Task",
445
+ agent: agentId,
446
+ prompt,
447
+ instruction:
448
+ `Spawn via the **Task tool** with subagent_type \`${agentId}\`. ` +
449
+ "Pass the prompt verbatim.",
450
+ };
451
+ }
452
+
453
+ /**
454
+ * Harness-specific guidance for merge → release → deploy polling loops.
455
+ * Cite in ship Phase 7, postmerge Phase 2, one-shot Step 7–8.
456
+ */
457
+ export function pollInstructions(harness: Harness): string {
458
+ // Cursor returns the behind-sync stop immediately. Without this return the call
459
+ // falls through to the default poll essay and then appends the stop.
460
+ if (harness === "cursor") {
461
+ return behindSyncInstructions("cursor");
462
+ }
463
+
464
+ const behind = behindSyncInstructions(harness);
465
+
466
+ switch (harness) {
467
+ case "codex":
468
+ return [
469
+ "**Merge/deploy polling (Codex)**",
470
+ "- Use exec_command for bounded status probes; resume yielded shell sessions with write_stdin.",
471
+ "- Poll PR state and mergeStateStatus, resolve BEHIND in the PR worktree before continuing (except when `main` has a merge queue and the PR is armed (the Phase 7 poll prints `[ship.phase7.queue_wait]`): GitHub then enqueues it).",
472
+ "- Keep waiting through merge and release completion; load $soleur:postmerge before declaring completion.",
473
+ behind,
474
+ ].join("\n");
475
+
476
+ case "claude":
477
+ return [
478
+ "**Merge/deploy polling (Claude Code)**",
479
+ "- Poll `gh pr view --jq '.state,.mergeStateStatus'` — not checks alone.",
480
+ "- Use the **Monitor tool**, and prefer the canonical loop over hand-rolling one:",
481
+ " `Monitor({command: \"bash plugins/soleur/scripts/monitor-pr-checks.sh <PR>\",",
482
+ " persistent: true, description: \"PR #<N> checks\"})`.",
483
+ " Pass `persistent: true` — the Monitor tool's `timeout_ms` DEFAULTS TO 5 MINUTES and",
484
+ " caps at 1 hour, while this script's default budget is 60 polls x 120s = 2 hours, so the",
485
+ " obvious invocation is killed after roughly one line.",
486
+ " **It emits on every CHANGE, plus a heartbeat every `--heartbeat-every` polls (default 5)",
487
+ " when nothing changed.** Silence must never be the healthy signal — but emitting every",
488
+ " poll unconditionally is the opposite failure, since the Monitor tool auto-stops a watch",
489
+ " that produces too many events. A hand-rolled",
490
+ " loop whose every `echo` sits behind a terminal-state branch satisfies both monitor",
491
+ " hard rules and still emits nothing for the entire run — measured on #7778, where the",
492
+ " operator had to ask why the monitor showed no progress. The Monitor docs warn about",
493
+ " the inverse case only (\"if this crashed, would my filter emit?\"); the healthy",
494
+ " still-running path is the one that gets forgotten, and silence there is",
495
+ " indistinguishable from a dead watch.",
496
+ "- NEVER Bash `run_in_background` for PR merge, CI, or release polling.",
497
+ "- **A monitor is a resource with a lifetime. Re-scoping what you watch means",
498
+ " `TaskStop` on the old one FIRST — never arming a second beside it.** A monitor",
499
+ " exits only when the state it polls goes terminal, so a superseded one does not",
500
+ " wind down on its own: it keeps polling the same endpoint at the same cadence",
501
+ " for its full timeout. Layering is the default failure because each re-scope",
502
+ " feels like a new need rather than a replacement.",
503
+ " In the Soleur repo a hook additionally REPORTS a re-arm on a target you are",
504
+ " still watching, naming the task ids to stop. It does not block: it reads",
505
+ " liveness from an undocumented transcript shape, so it fails open by design.",
506
+ "- After merge: watch release workflows to `completed`, then invoke `soleur:postmerge`.",
507
+ "- FORBIDDEN: asking the operator to watch merge/deploy status.",
508
+ "",
509
+ behind,
510
+ ].join("\n");
511
+
512
+ case "grok":
513
+ return [
514
+ "**Merge/deploy polling (Grok Build)**",
515
+ "- Poll `gh pr view --json state,mergeStateStatus` on every tick — **pending checks alone miss BEHIND**.",
516
+ "- Use **Shell** with adequate `block_until_ms` for short `gh` probes.",
517
+ "- Use **AwaitShell** with `pattern` for long loops — match `MERGED`, `BEHIND detected`, `auto-sync.*pushed`, `BEHIND resolved`, `Merge poll timed out`, `\\[ship\\.phase7\\.`, `\\[pr-behind-sync\\] kind=`, `postmerge verification complete`.",
518
+ "- NEVER ask the operator to monitor merge, CI, or deploy — you own the wait.",
519
+ "- After `/ship` merge: poll release workflows, invoke `/postmerge <PR>`, then emit `<promise>DONE</promise>`.",
520
+ "- FORBIDDEN: heartbeating on CI while `mergeStateStatus` is `BEHIND` — except when `main` has a merge queue and the PR is armed (the Phase 7 poll prints `[ship.phase7.queue_wait]`: GitHub enqueues it; never sync it by hand until `[ship.phase7.queue_wait_expired]`, a push line, MERGED, a dequeue or any poll exit).",
521
+ "",
522
+ behind,
523
+ ].join("\n");
524
+
525
+ case "devin":
526
+ return [
527
+ "**Merge/deploy polling (Devin CLI)**",
528
+ "- Poll `gh pr view --json state,mergeStateStatus` on every tick — **pending checks alone miss BEHIND**.",
529
+ "- Use **exec** with adequate timeout for short `gh` probes.",
530
+ // SOLEUR-DEBT: partially live-verified. Measured 2026-09-23 on Devin CLI
531
+ // 3000.11.1 (authenticated, `devin -p` in a scratch repo): `run_subagent` DOES
532
+ // arm a background subagent and the parent continues — "Subagent <id> is running
533
+ // in the background". The wake-on-completion half is NOT yet verified: the
534
+ // probe's foreground step hit headless mode's confirmation gate ("rejected a
535
+ // tool call that requires confirmation"), and finishing it needs
536
+ // `--permission-mode dangerous`, which auto-approves every tool.
537
+ // The claim this bullet replaces — that `get_output` cannot wait — is fully
538
+ // measured (devin/INSTRUCTIONS.md §Polling, envelope-capture §7).
539
+ // Upgrade trigger: re-run the probe under a permission mode that admits the
540
+ // foreground write, or from an interactive trusted session. The measurement
541
+ // lives in `devin/INSTRUCTIONS.md` §Polling with an amendment to ADR-223 (Devin
542
+ // wire names) — NOT in ADR-245, which states in as many words that the wait
543
+ // primitive is a fact about Devin's TOOLS rather than about that decision.
544
+ // #8390 item 2 is the origin.
545
+ //
546
+ // The hedge is MIRRORED into the emitted bullets below on purpose. A caveat that
547
+ // lives only here is invisible to the agent that runs the string, and this one
548
+ // changes what the agent should do when the wake does not arrive.
549
+ //
550
+ // What is deliberately NOT mirrored: a bullet saying "`get_output` is not a
551
+ // fallback". harness.test.ts asserts this string never contains `get_output` at
552
+ // all, and that negative over the whole string is a stronger guard than any
553
+ // phrase match that would have to replace it. The measurement it rests on lives
554
+ // in `devin/INSTRUCTIONS.md` §Polling. Do not re-add the bullet to be helpful.
555
+ "- Arm the wait as a background **run_subagent** running an exit-coded poll loop: one exit code per actionable transition (`MERGED`, `BEHIND detected`, `auto-sync.*pushed`, `BEHIND resolved`, `postmerge verification complete`, check failure). Its completion notification is the only wake primitive, so the loop must EXIT to report.",
556
+ "- Give the loop its own **bounded** exits, so a wait that ends without a transition is still diagnosable: a deadline exit (`Merge poll timed out`) and a probe-error exit (`gh` non-zero N consecutive ticks). An unbounded loop cannot report at all, because only its exit wakes you.",
557
+ "- **Partially verified, and this is the part to watch.** Arming IS measured: on Devin CLI 3000.11.1 `run_subagent` returns immediately and the parent continues. Waking the parent on that subagent's completion is NOT yet measured end to end. So treat a missing wake as possible, not impossible: if no notification has arrived by the deadline you set, fall back to foreground **exec** `gh` probes on your own cadence and say in the deliverable that the wait ran foreground. Never report a merge or a deploy you did not observe.",
558
+ "- Mutations (`gh pr update-branch`, the merge itself) stay in the foreground — never inside the waiting subagent.",
559
+ "- NEVER ask the operator to monitor merge, CI, or deploy — you own the wait.",
560
+ "- After `/soleur:ship` merge: poll release workflows, invoke `/soleur:postmerge <PR>`, then emit `<promise>DONE</promise>`.",
561
+ "- FORBIDDEN: heartbeating on CI while `mergeStateStatus` is `BEHIND` — except when `main` has a merge queue and the PR is armed (the Phase 7 poll prints `[ship.phase7.queue_wait]`: GitHub enqueues it; never sync it by hand until `[ship.phase7.queue_wait_expired]`, a push line, MERGED, a dequeue or any poll exit).",
562
+ "",
563
+ behind,
564
+ ].join("\n");
565
+
566
+ case "antigravity":
567
+ return [
568
+ "**Merge/deploy polling (Antigravity CLI)**",
569
+ "- Poll `gh pr view --json state,mergeStateStatus` on every tick — **pending checks alone miss BEHIND**.",
570
+ "- Launch background status checks via **run_command** (with `IsDaemon: false` and check progress via **manage_task**) or schedule wakeups using the **schedule** tool (`DurationSeconds` with `TimerCondition: 'never'` or task ID).",
571
+ "- Antigravity provides native reactive wakeup on background task or subagent completion; NEVER run blocking sleep loops in the foreground.",
572
+ "- NEVER ask the operator to monitor merge, CI, or deploy — you own the wait.",
573
+ "- After `/soleur:ship` merge: poll release workflows, invoke `/soleur:postmerge <PR>`, then emit `<promise>DONE</promise>`.",
574
+ "- FORBIDDEN: heartbeating on CI while `mergeStateStatus` is `BEHIND` — except when `main` has a merge queue and the PR is armed (the Phase 7 poll prints `[ship.phase7.queue_wait]`: GitHub enqueues it; never sync it by hand until `[ship.phase7.queue_wait_expired]`, a push line, MERGED, a dequeue or any poll exit).",
575
+ "",
576
+ behind,
577
+ ].join("\n");
578
+
579
+ case "opencode":
580
+ return [
581
+ "**Merge/deploy polling (OpenCode)**",
582
+ "- Poll `gh pr view --json state,mergeStateStatus` on every tick — **pending checks alone miss BEHIND**.",
583
+ "- Use the **shell** tool with bounded `gh` probes. No wait primitive is measured on this harness (no Monitor, no AwaitShell), so run the canonical sync block itself inside a bounded foreground loop with a deadline exit and a probe-error exit.",
584
+ "- NEVER ask the operator to monitor merge, CI, or deploy — you own the wait.",
585
+ "- After `ship` merges: poll the release workflows, invoke `postmerge`, then emit `<promise>DONE</promise>` (advisory on this harness — ADR-291 D3).",
586
+ "- FORBIDDEN: heartbeating on CI while `mergeStateStatus` is `BEHIND` — except when `main` has a merge queue and the PR is armed (the Phase 7 poll prints `[ship.phase7.queue_wait]`: GitHub enqueues it; never sync it by hand until `[ship.phase7.queue_wait_expired]`, a push line, MERGED, a dequeue or any poll exit).",
587
+ "",
588
+ behind,
589
+ ].join("\n");
590
+
591
+ default:
592
+ return [
593
+ "**Merge/deploy polling**",
594
+ "- Poll PR state + mergeStateStatus; resync on BEHIND before watching checks (except when `main` has a merge queue and the PR is armed (the Phase 7 poll prints `[ship.phase7.queue_wait]`): GitHub then enqueues it).",
595
+ "- Invoke postmerge verification before declaring done.",
596
+ "",
597
+ behind,
598
+ ].join("\n");
599
+ }
600
+ }
601
+
602
+ /**
603
+ * Markdown snippet for go.md / eval-harness — embed at routing time.
604
+ */
605
+ export function routingInstructions(harness: Harness): string {
606
+ const fidelity = workflowFidelityInstructions(harness);
607
+ const polling = pollInstructions(harness);
608
+
609
+ switch (harness) {
610
+ case "codex":
611
+ return [
612
+ "**Harness: Codex**",
613
+ "- Entry points: $soleur:go, $soleur:sync, $soleur:help.",
614
+ "- Load named skills through skills.read when available, otherwise read their installed SKILL.md and follow every required phase.",
615
+ "- Agents: spawn_agent with a prompt that reads the canonical agent definition; use spawnAgent() to resolve its absolute path.",
616
+ "- Read codex/INSTRUCTIONS.md in the installed plugin for tool and path mappings.",
617
+ fidelity,
618
+ polling,
619
+ ].join("\n");
620
+
621
+ case "claude":
622
+ return [
623
+ "**Harness: Claude Code**",
624
+ "- Skills: **Skill tool** with `soleur:<skill>` namespace.",
625
+ "- Agents: **Task tool** with `subagent_type`.",
626
+ "- Commands: `/soleur:go`, `/soleur:sync`, `/soleur:help`.",
627
+ "- **Never improvise** when a route names a `soleur:<skill>` or agent — invoke it.",
628
+ "",
629
+ fidelity,
630
+ "",
631
+ polling,
632
+ ].join("\n");
633
+
634
+ case "grok":
635
+ return [
636
+ "**Harness: Grok Build**",
637
+ "- Skills: any `soleur:<name>` in any Soleur doc names a skill — Read `plugins/soleur/skills/<name>/SKILL.md` in this process and run it to completion. Slash `/<skill>` names the skill; it is not a nested tool_use.",
638
+ "- Agents: **spawn_subagent** (not Task). Use `spawnAgent()` so registry colon ids map to hyphen filename stems (`soleur:product:cpo` → `soleur-product-cpo`).",
639
+ "- Commands: `/go`, `/sync`, `/help` — **not** `/soleur:go`.",
640
+ "- **Never improvise** — Read the registered SKILL.md or spawn the subagent; do not invent a nested Skill tool.",
641
+ "",
642
+ fidelity,
643
+ "",
644
+ polling,
645
+ ].join("\n");
646
+
647
+ case "devin":
648
+ return [
649
+ "**Harness: Devin CLI**",
650
+ "- Skills: **slash commands** — `/soleur:<skill>` (e.g. `/soleur:one-shot`, `/soleur:brainstorm`).",
651
+ "- Agents: **run_subagent** with agent id.",
652
+ "- Commands: `/soleur:go`, `/soleur:sync`, `/soleur:help`.",
653
+ "- **Never improvise** when a route names a `soleur:<skill>` or agent — invoke the slash command or subagent.",
654
+ "- Read devin/INSTRUCTIONS.md in the installed plugin for tool and path mappings.",
655
+ "",
656
+ fidelity,
657
+ "",
658
+ polling,
659
+ ].join("\n");
660
+
661
+ case "cursor":
662
+ return [
663
+ "**Harness: Cursor CLI**",
664
+ `- Entry points: \`${cursorSkillSlash("go")}\` and \`${cursorSkillSlash("sync")}\`. Other skills use the prefixed form, including \`${cursorSkillSlash("plan")}\`, \`${cursorSkillSlash("help")}\`, and \`${cursorSkillSlash("review")}\`.`,
665
+ `- Agents use the prefixed stem, for example \`${cursorAgentSlash("engineering/cto.md")}\`.`,
666
+ "- Read the canonical file the stub names, relative to the plugin root.",
667
+ "- Read cursor/INSTRUCTIONS.md in the installed plugin.",
668
+ "- Slice 1 does not classify the session as cursor, does not run hooks, and does not block a commit.",
669
+ "",
670
+ fidelity,
671
+ "",
672
+ polling,
673
+ ].join("\n");
674
+
675
+ case "antigravity":
676
+ return [
677
+ "**Harness: Antigravity CLI (`agy`)**",
678
+ "- Entry points: `/soleur:go`, `/soleur:sync`, `/soleur:help`.",
679
+ "- Skills: Progressive disclosure via `.agents/skills/` or read `plugins/soleur/skills/<name>/SKILL.md` using `view_file` and execute all required phases. Do not invent a synthetic nested tool.",
680
+ "- Agents: Invoke subagents using `invoke_subagent` (specifying `TypeName`, `Role`, `Prompt`, and `Workspace: 'inherit'`). For custom Soleur domain leaders (`soleur:engineering:cto`, `review-agent`), use `define_subagent` if not pre-registered.",
681
+ "- Subagent Communication: Use `send_message` with subagent conversation IDs. Do not poll in a loop; wait for reactive message delivery.",
682
+ "- Questions: Use `ask_question` for decisions and forks instead of freeform chat whenever structured options exist.",
683
+ "- Read antigravity/INSTRUCTIONS.md in the installed plugin for tool and path mappings.",
684
+ "",
685
+ fidelity,
686
+ "",
687
+ polling,
688
+ ].join("\n");
689
+
690
+ case "opencode":
691
+ return [
692
+ "**Harness: OpenCode**",
693
+ "- Skills: the built-in **skill** tool, with the BARE id — `plan`, `one-shot`, `brainstorm`. The id is the skill's directory name; `soleur:<name>` is the canonical doc form and is not a registration key.",
694
+ "- Agents: the **subagent** tool with the path-derived id (`engineering/cto`). Every generated agent carries `mode: subagent`; without it the agent registers as a primary and the subagent tool cannot reach it.",
695
+ "- Commands: `/go`, `/sync`, `/help`, `/version`.",
696
+ "- If a bare id is ambiguous, read `plugins/soleur/skills/<name>/SKILL.md` and follow it in full.",
697
+ "- Read opencode/INSTRUCTIONS.md in the installed plugin for the tool and path mappings.",
698
+ "- **Never improvise** when a route names a skill or an agent — load it with the skill tool or spawn it.",
699
+ "",
700
+ fidelity,
701
+ "",
702
+ polling,
703
+ ].join("\n");
704
+
705
+ default:
706
+ return [
707
+ "**Harness: unknown** — default to Claude conventions.",
708
+ "- Skills: Skill tool (`soleur:<skill>`). Agents: Task tool.",
709
+ "- If tools are missing, run `grok inspect` from repo root. Live CLI 1.0.29 has no `--trust` flag — do not invent one.",
710
+ "",
711
+ fidelity,
712
+ "",
713
+ polling,
714
+ ].join("\n");
715
+ }
716
+ }