@soleur/opencode 0.0.0-stage → 3.354.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (832) hide show
  1. package/.claude-plugin/agents.manifest.json +476 -0
  2. package/.claude-plugin/plugin.json +42 -0
  3. package/README.md +44 -2
  4. package/agents/community/.gitkeep +0 -0
  5. package/agents/engineering/cto.md +87 -0
  6. package/agents/engineering/design/ddd-architect.md +95 -0
  7. package/agents/engineering/discovery/agent-finder.md +214 -0
  8. package/agents/engineering/discovery/functional-discovery.md +182 -0
  9. package/agents/engineering/infra/infra-security.md +151 -0
  10. package/agents/engineering/infra/platform-strategist.md +109 -0
  11. package/agents/engineering/infra/terraform-architect.md +171 -0
  12. package/agents/engineering/prompt-engineer.md +37 -0
  13. package/agents/engineering/research/best-practices-researcher.md +115 -0
  14. package/agents/engineering/research/framework-docs-researcher.md +93 -0
  15. package/agents/engineering/research/git-history-analyzer.md +53 -0
  16. package/agents/engineering/research/learnings-researcher.md +285 -0
  17. package/agents/engineering/research/repo-research-analyst.md +118 -0
  18. package/agents/engineering/review/agent-native-reviewer.md +279 -0
  19. package/agents/engineering/review/architecture-strategist.md +61 -0
  20. package/agents/engineering/review/code-quality-analyst.md +92 -0
  21. package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
  22. package/agents/engineering/review/data-integrity-guardian.md +82 -0
  23. package/agents/engineering/review/data-migration-expert.md +98 -0
  24. package/agents/engineering/review/deployment-verification-agent.md +183 -0
  25. package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
  26. package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
  27. package/agents/engineering/review/legacy-code-expert.md +55 -0
  28. package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
  29. package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
  30. package/agents/engineering/review/performance-oracle.md +130 -0
  31. package/agents/engineering/review/security-sentinel.md +167 -0
  32. package/agents/engineering/review/semgrep-sast.md +36 -0
  33. package/agents/engineering/review/test-design-reviewer.md +150 -0
  34. package/agents/engineering/review/user-impact-reviewer.md +70 -0
  35. package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
  36. package/agents/finance/budget-analyst.md +29 -0
  37. package/agents/finance/cfo.md +44 -0
  38. package/agents/finance/financial-reporter.md +30 -0
  39. package/agents/finance/revenue-analyst.md +30 -0
  40. package/agents/legal/clo.md +115 -0
  41. package/agents/legal/legal-compliance-auditor.md +110 -0
  42. package/agents/legal/legal-document-generator.md +134 -0
  43. package/agents/marketing/analytics-analyst.md +25 -0
  44. package/agents/marketing/brand-architect.md +181 -0
  45. package/agents/marketing/cmo.md +76 -0
  46. package/agents/marketing/conversion-optimizer.md +19 -0
  47. package/agents/marketing/copywriter.md +20 -0
  48. package/agents/marketing/fact-checker.md +70 -0
  49. package/agents/marketing/growth-strategist.md +145 -0
  50. package/agents/marketing/paid-media-strategist.md +28 -0
  51. package/agents/marketing/pricing-strategist.md +17 -0
  52. package/agents/marketing/programmatic-seo-specialist.md +25 -0
  53. package/agents/marketing/retention-strategist.md +23 -0
  54. package/agents/marketing/seo-aeo-analyst.md +164 -0
  55. package/agents/operations/coo.md +50 -0
  56. package/agents/operations/ops-advisor.md +78 -0
  57. package/agents/operations/ops-provisioner.md +101 -0
  58. package/agents/operations/ops-research.md +52 -0
  59. package/agents/operations/service-automator.md +278 -0
  60. package/agents/product/business-validator.md +206 -0
  61. package/agents/product/competitive-intelligence.md +89 -0
  62. package/agents/product/cpo.md +63 -0
  63. package/agents/product/design/ux-design-lead.md +209 -0
  64. package/agents/product/spec-flow-analyzer.md +122 -0
  65. package/agents/sales/cro.md +44 -0
  66. package/agents/sales/deal-architect.md +29 -0
  67. package/agents/sales/outbound-strategist.md +29 -0
  68. package/agents/sales/pipeline-analyst.md +29 -0
  69. package/agents/support/cco.md +48 -0
  70. package/agents/support/community-manager.md +570 -0
  71. package/agents/support/ticket-triage.md +70 -0
  72. package/bin/soleur-opencode.js +29 -0
  73. package/commands/go.md +660 -0
  74. package/commands/help.md +273 -0
  75. package/commands/sync.md +977 -0
  76. package/commands/version.md +103 -0
  77. package/hooks/antigravity-hooks.json +84 -0
  78. package/hooks/antigravity-session-start.sh +15 -0
  79. package/hooks/bare-root-cwd-guard.sh +131 -0
  80. package/hooks/browser-snapshot-credential-guard.sh +200 -0
  81. package/hooks/codex-session-start.sh +9 -0
  82. package/hooks/compaction-state.sh +525 -0
  83. package/hooks/destructive-command-guard.sh +1387 -0
  84. package/hooks/devin-session-start.sh +90 -0
  85. package/hooks/ext-filter-detect.sh +171 -0
  86. package/hooks/hooks.json +133 -0
  87. package/hooks/lib/hook-tool-kind.sh +24 -0
  88. package/hooks/lib/log-rotation.sh +176 -0
  89. package/hooks/lib/shell-argv.pl +576 -0
  90. package/hooks/memory-backstop.sh +1114 -0
  91. package/hooks/operator-stage-approval.sh +391 -0
  92. package/hooks/stop-hook.sh +367 -0
  93. package/hooks/unkept-promise-hook.sh +383 -0
  94. package/hooks/version-banner.sh +127 -0
  95. package/hooks/welcome-hook.sh +50 -0
  96. package/install.js +29 -0
  97. package/lib/agent-registry.ts +154 -0
  98. package/lib/c4-canonical-cli.mjs +34 -0
  99. package/lib/c4-canonical.mjs +46 -0
  100. package/lib/c4-from-components.ts +554 -0
  101. package/lib/go-routing.ts +81 -0
  102. package/lib/grok-inspect-contract.ts +311 -0
  103. package/lib/harness-model-map.ts +101 -0
  104. package/lib/harness-parity.ts +726 -0
  105. package/lib/harness-tool-map.ts +180 -0
  106. package/lib/harness.ts +716 -0
  107. package/lib/heartbeat-live-reconcile.ts +1153 -0
  108. package/lib/heartbeat-manifest.ts +361 -0
  109. package/lib/kb-coverage.ts +252 -0
  110. package/lib/pr-merge-poll.ts +103 -0
  111. package/lib/workflow-fidelity.ts +388 -0
  112. package/opencode/INSTRUCTIONS.md +171 -0
  113. package/opencode/agents/engineering/cto.md +10 -0
  114. package/opencode/agents/engineering/design/ddd-architect.md +10 -0
  115. package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
  116. package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
  117. package/opencode/agents/engineering/infra/infra-security.md +10 -0
  118. package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
  119. package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
  120. package/opencode/agents/engineering/prompt-engineer.md +10 -0
  121. package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
  122. package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
  123. package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
  124. package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
  125. package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
  126. package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
  127. package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
  128. package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
  129. package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
  130. package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
  131. package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
  132. package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
  133. package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
  134. package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
  135. package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
  136. package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
  137. package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
  138. package/opencode/agents/engineering/review/performance-oracle.md +10 -0
  139. package/opencode/agents/engineering/review/security-sentinel.md +10 -0
  140. package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
  141. package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
  142. package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
  143. package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
  144. package/opencode/agents/finance/budget-analyst.md +10 -0
  145. package/opencode/agents/finance/cfo.md +10 -0
  146. package/opencode/agents/finance/financial-reporter.md +10 -0
  147. package/opencode/agents/finance/revenue-analyst.md +10 -0
  148. package/opencode/agents/legal/clo.md +10 -0
  149. package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
  150. package/opencode/agents/legal/legal-document-generator.md +10 -0
  151. package/opencode/agents/marketing/analytics-analyst.md +10 -0
  152. package/opencode/agents/marketing/brand-architect.md +10 -0
  153. package/opencode/agents/marketing/cmo.md +10 -0
  154. package/opencode/agents/marketing/conversion-optimizer.md +10 -0
  155. package/opencode/agents/marketing/copywriter.md +10 -0
  156. package/opencode/agents/marketing/fact-checker.md +10 -0
  157. package/opencode/agents/marketing/growth-strategist.md +10 -0
  158. package/opencode/agents/marketing/paid-media-strategist.md +10 -0
  159. package/opencode/agents/marketing/pricing-strategist.md +10 -0
  160. package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
  161. package/opencode/agents/marketing/retention-strategist.md +10 -0
  162. package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
  163. package/opencode/agents/operations/coo.md +10 -0
  164. package/opencode/agents/operations/ops-advisor.md +10 -0
  165. package/opencode/agents/operations/ops-provisioner.md +10 -0
  166. package/opencode/agents/operations/ops-research.md +10 -0
  167. package/opencode/agents/operations/service-automator.md +10 -0
  168. package/opencode/agents/product/business-validator.md +10 -0
  169. package/opencode/agents/product/competitive-intelligence.md +10 -0
  170. package/opencode/agents/product/cpo.md +10 -0
  171. package/opencode/agents/product/design/ux-design-lead.md +10 -0
  172. package/opencode/agents/product/spec-flow-analyzer.md +10 -0
  173. package/opencode/agents/sales/cro.md +10 -0
  174. package/opencode/agents/sales/deal-architect.md +10 -0
  175. package/opencode/agents/sales/outbound-strategist.md +10 -0
  176. package/opencode/agents/sales/pipeline-analyst.md +10 -0
  177. package/opencode/agents/support/cco.md +10 -0
  178. package/opencode/agents/support/community-manager.md +10 -0
  179. package/opencode/agents/support/ticket-triage.md +10 -0
  180. package/opencode/commands/go.md +10 -0
  181. package/opencode/commands/help.md +10 -0
  182. package/opencode/commands/sync.md +10 -0
  183. package/opencode/commands/version.md +11 -0
  184. package/opencode/opencode.json +8 -0
  185. package/opencode/plugin.ts +818 -0
  186. package/package.json +36 -4
  187. package/scripts/admin-merge-ready.sh +545 -0
  188. package/scripts/admin-merge-ready.test.sh +753 -0
  189. package/scripts/affected-tests.sh +908 -0
  190. package/scripts/affected-tests.test.sh +1797 -0
  191. package/scripts/alpha-metrics.sh +78 -0
  192. package/scripts/alpha-metrics.test.sh +115 -0
  193. package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
  194. package/scripts/audit-flag-flip.sh +107 -0
  195. package/scripts/check-red-on-main.sh +316 -0
  196. package/scripts/ci-head-verdict.sh +411 -0
  197. package/scripts/cloud-detect.sh +193 -0
  198. package/scripts/delegation-verify.sh +657 -0
  199. package/scripts/delegation-verify.test.sh +1424 -0
  200. package/scripts/deploy-arm.sh +475 -0
  201. package/scripts/domain-model-drift.sh +419 -0
  202. package/scripts/emit-decision.sh +144 -0
  203. package/scripts/emit-decision.test.sh +144 -0
  204. package/scripts/ext-filter-divergence-corpus.txt +15 -0
  205. package/scripts/ext-filter-divergence.sh +189 -0
  206. package/scripts/generate-c4-from-components.ts +442 -0
  207. package/scripts/grok-fidelity-gate.sh +68 -0
  208. package/scripts/grok-pre-push-gate.sh +232 -0
  209. package/scripts/harness-discovery-smoke.ts +906 -0
  210. package/scripts/harness-parity-census.ts +92 -0
  211. package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
  212. package/scripts/install-opencode-adapter.ts +509 -0
  213. package/scripts/lib/affected-tests/common.sh +365 -0
  214. package/scripts/lib/affected-tests/go.sh +157 -0
  215. package/scripts/lib/affected-tests/js.sh +188 -0
  216. package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
  217. package/scripts/lib/affected-tests/python.sh +185 -0
  218. package/scripts/lib/context-sanitize.sh +49 -0
  219. package/scripts/lib/domain-model-lib.sh +180 -0
  220. package/scripts/lib/ext-filter-grammar.tsv +34 -0
  221. package/scripts/lib/operator-script.sh +1236 -0
  222. package/scripts/lib/proc.sh +580 -0
  223. package/scripts/lib/session-state.sh +748 -0
  224. package/scripts/lib/tmp-classify.sh +843 -0
  225. package/scripts/lib/wrapper-boundary.sh +47 -0
  226. package/scripts/lint-ratchet.py +1547 -0
  227. package/scripts/monitor-pr-checks.sh +441 -0
  228. package/scripts/pipeline-tally.sh +756 -0
  229. package/scripts/pipeline-tally.test.sh +740 -0
  230. package/scripts/plugin-version.sh +528 -0
  231. package/scripts/precommit-guard.sh +115 -0
  232. package/scripts/precommit-guard.test.sh +254 -0
  233. package/scripts/reconcile-live-heartbeats.ts +705 -0
  234. package/scripts/render-c4-model.sh +217 -0
  235. package/scripts/resolve-git-root.sh +55 -0
  236. package/scripts/resolve-regenerable-conflicts.sh +363 -0
  237. package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
  238. package/scripts/ruff-requirements.txt +22 -0
  239. package/scripts/run-in-pid-namespace.sh +98 -0
  240. package/scripts/run-in-pid-namespace.test.sh +290 -0
  241. package/scripts/scan-ancestor-signal-helpers.py +556 -0
  242. package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
  243. package/scripts/setup-ralph-loop.sh +238 -0
  244. package/scripts/sync-cursor-name-map.ts +316 -0
  245. package/scripts/sync-grok-agent-compat.ts +188 -0
  246. package/scripts/sync-npm-package.ts +165 -0
  247. package/scripts/sync-opencode-adapter.ts +498 -0
  248. package/scripts/sync-pr-behind.sh +647 -0
  249. package/scripts/sync-pr-behind.test.sh +252 -0
  250. package/scripts/taste-profile-update.sh +180 -0
  251. package/scripts/taste-profile-update.test.sh +167 -0
  252. package/scripts/write-budget-marker.sh +23 -0
  253. package/scripts/write-kb-coverage.ts +113 -0
  254. package/skills/admin-ip-refresh/SKILL.md +81 -0
  255. package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
  256. package/skills/agent-browser/SKILL.md +698 -0
  257. package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
  258. package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
  259. package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
  260. package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
  261. package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
  262. package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
  263. package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
  264. package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
  265. package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
  266. package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
  267. package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
  268. package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
  269. package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
  270. package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
  271. package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
  272. package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
  273. package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
  274. package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
  275. package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
  276. package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
  277. package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
  278. package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
  279. package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
  280. package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
  281. package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
  282. package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
  283. package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
  284. package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
  285. package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
  286. package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
  287. package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
  288. package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
  289. package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
  290. package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
  291. package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
  292. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
  293. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
  294. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
  295. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
  296. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
  297. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
  298. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
  299. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
  300. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
  301. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
  302. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
  303. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
  304. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
  305. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
  306. package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
  307. package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
  308. package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
  309. package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
  310. package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
  311. package/skills/agent-native-architecture/SKILL.md +479 -0
  312. package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
  313. package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
  314. package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
  315. package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
  316. package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
  317. package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
  318. package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
  319. package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
  320. package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
  321. package/skills/agent-native-architecture/references/product-implications.md +478 -0
  322. package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
  323. package/skills/agent-native-architecture/references/self-modification.md +294 -0
  324. package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
  325. package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
  326. package/skills/agent-native-audit/SKILL.md +300 -0
  327. package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
  328. package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
  329. package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
  330. package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
  331. package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
  332. package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
  333. package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
  334. package/skills/architecture/SKILL.md +436 -0
  335. package/skills/architecture/references/adr-template.md +154 -0
  336. package/skills/architecture/references/likec4-reference.md +136 -0
  337. package/skills/architecture/references/nfr-reference.md +126 -0
  338. package/skills/archive-kb/SKILL.md +86 -0
  339. package/skills/archive-kb/scripts/archive-kb.sh +300 -0
  340. package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
  341. package/skills/atdd-developer/SKILL.md +65 -0
  342. package/skills/brainstorm/SKILL.md +701 -0
  343. package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
  344. package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
  345. package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
  346. package/skills/brainstorm/references/ui-surface-terms.md +42 -0
  347. package/skills/brainstorm-techniques/SKILL.md +231 -0
  348. package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
  349. package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
  350. package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
  351. package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
  352. package/skills/campaign-calendar/SKILL.md +145 -0
  353. package/skills/cf-token-scope/SKILL.md +164 -0
  354. package/skills/cf-token-scope/references/widen-playbook.md +114 -0
  355. package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
  356. package/skills/changelog/SKILL.md +142 -0
  357. package/skills/code-to-prd/SKILL.md +66 -0
  358. package/skills/code-to-prd/references/banner-template.md +12 -0
  359. package/skills/code-to-prd/references/prd-template.md +41 -0
  360. package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
  361. package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
  362. package/skills/code-to-prd/test/fixture/.env.example +7 -0
  363. package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
  364. package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
  365. package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
  366. package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
  367. package/skills/code-to-prd/test/fixture/package.json +6 -0
  368. package/skills/cohort-status/SKILL.md +62 -0
  369. package/skills/community/SKILL.md +210 -0
  370. package/skills/community/scripts/bsky-community.sh +644 -0
  371. package/skills/community/scripts/bsky-setup.sh +631 -0
  372. package/skills/community/scripts/community-router.sh +93 -0
  373. package/skills/community/scripts/discord-community.sh +487 -0
  374. package/skills/community/scripts/discord-setup.sh +784 -0
  375. package/skills/community/scripts/github-community.sh +706 -0
  376. package/skills/community/scripts/hn-community.sh +233 -0
  377. package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
  378. package/skills/community/scripts/linkedin-community.sh +750 -0
  379. package/skills/community/scripts/linkedin-setup.sh +758 -0
  380. package/skills/community/scripts/x-community.sh +890 -0
  381. package/skills/community/scripts/x-setup.sh +713 -0
  382. package/skills/community/test/community-argv.test.sh +2922 -0
  383. package/skills/community/test/github-community.test.sh +981 -0
  384. package/skills/competitive-analysis/SKILL.md +69 -0
  385. package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
  386. package/skills/compound/SKILL.md +673 -0
  387. package/skills/compound/scripts/token-efficiency-report.sh +334 -0
  388. package/skills/compound/test/phase-16.test.sh +379 -0
  389. package/skills/compound-capture/SKILL.md +791 -0
  390. package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
  391. package/skills/compound-capture/assets/resolution-template.md +116 -0
  392. package/skills/compound-capture/references/yaml-schema.md +67 -0
  393. package/skills/compound-capture/schema.yaml +181 -0
  394. package/skills/constraint-scaffold/SKILL.md +175 -0
  395. package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
  396. package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
  397. package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
  398. package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
  399. package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
  400. package/skills/constraint-scaffold/references/shared-runner.template +135 -0
  401. package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
  402. package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
  403. package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
  404. package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
  405. package/skills/constraint-scaffold/test/generator.test.sh +93 -0
  406. package/skills/constraint-scaffold/test/parity.test.sh +285 -0
  407. package/skills/content-writer/SKILL.md +242 -0
  408. package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
  409. package/skills/cron-delete/SKILL.md +56 -0
  410. package/skills/cron-list/SKILL.md +54 -0
  411. package/skills/deepen-plan/SKILL.md +937 -0
  412. package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
  413. package/skills/deploy/SKILL.md +115 -0
  414. package/skills/deploy/references/hetzner-setup.md +67 -0
  415. package/skills/deploy/scripts/deploy.sh +37 -0
  416. package/skills/deploy-docs/SKILL.md +95 -0
  417. package/skills/dhh-rails-style/SKILL.md +203 -0
  418. package/skills/dhh-rails-style/references/architecture.md +717 -0
  419. package/skills/dhh-rails-style/references/controllers.md +323 -0
  420. package/skills/dhh-rails-style/references/frontend.md +556 -0
  421. package/skills/dhh-rails-style/references/gems.md +316 -0
  422. package/skills/dhh-rails-style/references/models.md +388 -0
  423. package/skills/dhh-rails-style/references/testing.md +354 -0
  424. package/skills/discord-content/SKILL.md +126 -0
  425. package/skills/docs-site/SKILL.md +214 -0
  426. package/skills/drain-labeled-backlog/SKILL.md +203 -0
  427. package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
  428. package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
  429. package/skills/drain-prs/SKILL.md +143 -0
  430. package/skills/drain-prs/scripts/triage-prs.sh +192 -0
  431. package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
  432. package/skills/dspy-ruby/SKILL.md +634 -0
  433. package/skills/dspy-ruby/assets/config-template.rb +359 -0
  434. package/skills/dspy-ruby/assets/module-template.rb +326 -0
  435. package/skills/dspy-ruby/assets/signature-template.rb +143 -0
  436. package/skills/dspy-ruby/references/core-concepts.md +268 -0
  437. package/skills/dspy-ruby/references/optimization.md +623 -0
  438. package/skills/dspy-ruby/references/providers.md +335 -0
  439. package/skills/eval-harness/README.md +194 -0
  440. package/skills/eval-harness/SKILL.md +157 -0
  441. package/skills/eval-harness/enums/go-routes.json +13 -0
  442. package/skills/eval-harness/enums/incident-threshold.json +5 -0
  443. package/skills/eval-harness/enums/lane.json +5 -0
  444. package/skills/eval-harness/enums/tool-selection.json +20 -0
  445. package/skills/eval-harness/enums/triage-levels.json +5 -0
  446. package/skills/eval-harness/gated-skills.json +34 -0
  447. package/skills/eval-harness/models.generated.json +5 -0
  448. package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
  449. package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
  450. package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
  451. package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
  452. package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
  453. package/skills/eval-harness/prompts/go-baseline.txt +6 -0
  454. package/skills/eval-harness/prompts/go-skill.txt +21 -0
  455. package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
  456. package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
  457. package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
  458. package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
  459. package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
  460. package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
  461. package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
  462. package/skills/eval-harness/prompts/triage-skill.txt +10 -0
  463. package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
  464. package/skills/eval-harness/scripts/extract-block.cjs +87 -0
  465. package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
  466. package/skills/eval-harness/scripts/gen-models.sh +41 -0
  467. package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
  468. package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
  469. package/skills/eval-harness/scripts/parse-label.cjs +93 -0
  470. package/skills/eval-harness/scripts/verdict.cjs +132 -0
  471. package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
  472. package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
  473. package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
  474. package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
  475. package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
  476. package/skills/eval-harness/test/eval-gate.test.sh +132 -0
  477. package/skills/eval-harness/test/extract-block.test.sh +87 -0
  478. package/skills/eval-harness/test/gate-classification.test.sh +77 -0
  479. package/skills/eval-harness/test/gen-models.test.sh +75 -0
  480. package/skills/eval-harness/test/measure-classification.test.sh +74 -0
  481. package/skills/eval-harness/test/parse-label.test.sh +129 -0
  482. package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
  483. package/skills/eval-harness/test/verdict.test.sh +123 -0
  484. package/skills/every-style-editor/SKILL.md +142 -0
  485. package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
  486. package/skills/feature-tweet/SKILL.md +199 -0
  487. package/skills/feature-video/SKILL.md +412 -0
  488. package/skills/feature-video/scripts/check_deps.sh +281 -0
  489. package/skills/file-todos/SKILL.md +267 -0
  490. package/skills/file-todos/assets/todo-template.md +166 -0
  491. package/skills/fix-issue/SKILL.md +278 -0
  492. package/skills/fix-issue/references/agent-authored-exclusion.md +120 -0
  493. package/skills/fix-issue/references/exclude-label-jq-snippet.md +97 -0
  494. package/skills/flag-bootstrap/SETUP.md +142 -0
  495. package/skills/flag-create/SKILL.md +145 -0
  496. package/skills/flag-create/scripts/create.sh +273 -0
  497. package/skills/flag-delete/SKILL.md +167 -0
  498. package/skills/flag-delete/scripts/delete.sh +288 -0
  499. package/skills/flag-list/SKILL.md +99 -0
  500. package/skills/flag-list/scripts/list.sh +275 -0
  501. package/skills/flag-set-role/SKILL.md +229 -0
  502. package/skills/flag-set-role/scripts/flip.sh +774 -0
  503. package/skills/frontend-anti-slop/SKILL.md +106 -0
  504. package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
  505. package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
  506. package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
  507. package/skills/frontend-design/SKILL.md +77 -0
  508. package/skills/gdpr-gate/NOTICE +136 -0
  509. package/skills/gdpr-gate/SKILL.md +341 -0
  510. package/skills/gdpr-gate/references/fields.md +160 -0
  511. package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
  512. package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
  513. package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
  514. package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
  515. package/skills/gdpr-gate/references/layers/frontend.md +249 -0
  516. package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
  517. package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
  518. package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
  519. package/skills/gdpr-gate/references/legal-consent.md +140 -0
  520. package/skills/gdpr-gate/references/non-negotiables.md +60 -0
  521. package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
  522. package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
  523. package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
  524. package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
  525. package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
  526. package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
  527. package/skills/gemini-imagegen/SKILL.md +283 -0
  528. package/skills/gemini-imagegen/requirements.txt +5 -0
  529. package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
  530. package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
  531. package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
  532. package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
  533. package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
  534. package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
  535. package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
  536. package/skills/git-worktree/SKILL.md +534 -0
  537. package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
  538. package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
  539. package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
  540. package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
  541. package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
  542. package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
  543. package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
  544. package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
  545. package/skills/go/SKILL.md +54 -0
  546. package/skills/growth/SKILL.md +164 -0
  547. package/skills/harvest-debt/SKILL.md +78 -0
  548. package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
  549. package/skills/heal-skill/SKILL.md +173 -0
  550. package/skills/help/SKILL.md +46 -0
  551. package/skills/incident/NOTICE +39 -0
  552. package/skills/incident/SKILL.md +395 -0
  553. package/skills/incident/scripts/dry-run.sh +448 -0
  554. package/skills/incident/scripts/redact-engine.py +412 -0
  555. package/skills/incident/scripts/redact-sentinel.sh +44 -0
  556. package/skills/incident/templates/pir.md +139 -0
  557. package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
  558. package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
  559. package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
  560. package/skills/incident/test/fixtures/positive-corpus.md +87 -0
  561. package/skills/incident/test/redact-sentinel.test.sh +1420 -0
  562. package/skills/invoice/SKILL.md +206 -0
  563. package/skills/kb-glossary/SKILL.md +71 -0
  564. package/skills/kb-glossary/references/glossary-format.md +111 -0
  565. package/skills/kb-glossary/references/rejected-request-register.md +115 -0
  566. package/skills/kb-search/SKILL.md +276 -0
  567. package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
  568. package/skills/legal-audit/SKILL.md +161 -0
  569. package/skills/legal-generate/NOTICE +242 -0
  570. package/skills/legal-generate/SKILL.md +244 -0
  571. package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
  572. package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
  573. package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
  574. package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
  575. package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
  576. package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
  577. package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
  578. package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
  579. package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
  580. package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
  581. package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
  582. package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
  583. package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
  584. package/skills/linear-fetch/SKILL.md +247 -0
  585. package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
  586. package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
  587. package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
  588. package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
  589. package/skills/linear-fetch/test/parity.test.sh +112 -0
  590. package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
  591. package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
  592. package/skills/merge-pr/SKILL.md +670 -0
  593. package/skills/model-launch-review/SKILL.md +255 -0
  594. package/skills/model-launch-review/scripts/audit-models.sh +501 -0
  595. package/skills/one-shot/SKILL.md +316 -0
  596. package/skills/one-shot/references/token-discipline.md +74 -0
  597. package/skills/operator-bootstrap/SKILL.md +412 -0
  598. package/skills/operator-bootstrap/template.sh +439 -0
  599. package/skills/operator-digest/SKILL.md +287 -0
  600. package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
  601. package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
  602. package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
  603. package/skills/operator-rephrase/SKILL.md +98 -0
  604. package/skills/pencil-setup/SKILL.md +201 -0
  605. package/skills/pencil-setup/scripts/check_deps.sh +556 -0
  606. package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
  607. package/skills/pencil-setup/scripts/package-lock.json +1172 -0
  608. package/skills/pencil-setup/scripts/package.json +14 -0
  609. package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
  610. package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
  611. package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
  612. package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
  613. package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
  614. package/skills/plan/SKILL.md +1140 -0
  615. package/skills/plan/references/differential-migration-testing.md +185 -0
  616. package/skills/plan/references/plan-community-discovery.md +42 -0
  617. package/skills/plan/references/plan-founder-check.md +137 -0
  618. package/skills/plan/references/plan-functional-overlap.md +25 -0
  619. package/skills/plan/references/plan-host-fanout.md +51 -0
  620. package/skills/plan/references/plan-issue-templates.md +779 -0
  621. package/skills/plan/references/plan-network-outage-checklist.md +131 -0
  622. package/skills/plan/references/plan-scope-check.md +126 -0
  623. package/skills/plan/references/plan-sharp-edges.md +331 -0
  624. package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
  625. package/skills/plan/references/webapp-cwv-observability.md +143 -0
  626. package/skills/plan-review/SKILL.md +91 -0
  627. package/skills/plan-review/lib/named-panel.mjs +58 -0
  628. package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
  629. package/skills/postmerge/SKILL.md +642 -0
  630. package/skills/postmerge/references/deploy-status-debugging.md +141 -0
  631. package/skills/postmerge/references/graceful-degradation.md +20 -0
  632. package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
  633. package/skills/preflight/SKILL.md +1553 -0
  634. package/skills/preflight/references/check-13-founder-check.md +286 -0
  635. package/skills/preflight/scripts/founder-check.py +1640 -0
  636. package/skills/preflight/scripts/parse-form-a.awk +107 -0
  637. package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
  638. package/skills/product-roadmap/SKILL.md +357 -0
  639. package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
  640. package/skills/provision-cloudflare/SKILL.md +67 -0
  641. package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
  642. package/skills/provision-doppler/SKILL.md +58 -0
  643. package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
  644. package/skills/provision-github/SKILL.md +59 -0
  645. package/skills/provision-github/scripts/provision-github.sh +300 -0
  646. package/skills/provision-hetzner/SKILL.md +76 -0
  647. package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
  648. package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
  649. package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
  650. package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
  651. package/skills/qa/SKILL.md +263 -0
  652. package/skills/qa/references/browser-preflight.md +22 -0
  653. package/skills/questionnaire-generate/SKILL.md +328 -0
  654. package/skills/questionnaire-generate/references/questionnaire.template +60 -0
  655. package/skills/rclone/SKILL.md +162 -0
  656. package/skills/rclone/scripts/check_setup.sh +63 -0
  657. package/skills/release-announce/SKILL.md +65 -0
  658. package/skills/release-docs/SKILL.md +92 -0
  659. package/skills/reproduce-bug/SKILL.md +358 -0
  660. package/skills/resolve-debt/SKILL.md +85 -0
  661. package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
  662. package/skills/resolve-parallel/SKILL.md +45 -0
  663. package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
  664. package/skills/resolve-pr-parallel/SKILL.md +68 -0
  665. package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
  666. package/skills/resolve-todo-parallel/SKILL.md +57 -0
  667. package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
  668. package/skills/review/SKILL.md +1620 -0
  669. package/skills/review/references/anti-slop-scanner-hook.md +40 -0
  670. package/skills/review/references/defect-classes-migrations.md +9 -0
  671. package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
  672. package/skills/review/references/review-e2e-testing.md +116 -0
  673. package/skills/review/references/review-evidence-comment.md +36 -0
  674. package/skills/review/references/review-todo-structure.md +165 -0
  675. package/skills/review/references/risk-tier-and-fix-rounds.md +97 -0
  676. package/skills/review/references/semgrep-custom-rules.yaml +174 -0
  677. package/skills/review/references/ultrathink-phases.md +98 -0
  678. package/skills/review/references/wfs.md +6 -0
  679. package/skills/review/scripts/emit-review-trailer.sh +499 -0
  680. package/skills/review/scripts/ensure-semgrep.sh +99 -0
  681. package/skills/review/scripts/fix-round-seats.sh +197 -0
  682. package/skills/review/test/emit-review-trailer.test.sh +387 -0
  683. package/skills/review/test/ensure-semgrep.test.sh +111 -0
  684. package/skills/review/test/fix-round-seats.test.sh +237 -0
  685. package/skills/review/workflows/README.md +147 -0
  686. package/skills/review/workflows/review.workflow.js +667 -0
  687. package/skills/schedule/SKILL.md +796 -0
  688. package/skills/seo-aeo/SKILL.md +139 -0
  689. package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
  690. package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
  691. package/skills/ship/SKILL.md +3023 -0
  692. package/skills/ship/references/adr-ordinal-collision.md +47 -0
  693. package/skills/ship/references/affected-gate-contract.md +115 -0
  694. package/skills/ship/references/ci-run-diagnosis.md +29 -0
  695. package/skills/ship/references/ci-workflow-authoring.md +68 -0
  696. package/skills/ship/references/cleanup-merged-archival.md +39 -0
  697. package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
  698. package/skills/ship/references/cto-ruling-armed-push.md +5 -0
  699. package/skills/ship/references/decision-challenges-render.md +71 -0
  700. package/skills/ship/references/delegated-act-authoring-form.md +7 -0
  701. package/skills/ship/references/detached-battery-verdict.md +13 -0
  702. package/skills/ship/references/epic-close-sweep.md +62 -0
  703. package/skills/ship/references/feature-tweet-draft.md +42 -0
  704. package/skills/ship/references/followthrough-issue-body-template.md +47 -0
  705. package/skills/ship/references/followthrough-stub-template.sh +92 -0
  706. package/skills/ship/references/merge-queue-dequeue.md +39 -0
  707. package/skills/ship/references/operator-holds.md +179 -0
  708. package/skills/ship/references/pipeline-tally-render.md +43 -0
  709. package/skills/ship/references/pr-overlap.md +153 -0
  710. package/skills/ship/references/queue-mode.md +7 -0
  711. package/skills/ship/references/ready-run-wait.md +36 -0
  712. package/skills/ship/references/red-on-main-quarantine.md +110 -0
  713. package/skills/ship/references/register-update-pr-pattern.md +88 -0
  714. package/skills/ship/references/settle-then-admin-merge.md +130 -0
  715. package/skills/ship/references/supabase-column-probe.md +13 -0
  716. package/skills/ship/scripts/auto-close-scan.sh +76 -0
  717. package/skills/ship/scripts/battery-owed.sh +403 -0
  718. package/skills/ship/scripts/hold-gate-eval.sh +410 -0
  719. package/skills/ship/scripts/net-issue-flow.sh +665 -0
  720. package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
  721. package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
  722. package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
  723. package/skills/skill-creator/SKILL.md +299 -0
  724. package/skills/skill-creator/references/api-security.md +248 -0
  725. package/skills/skill-creator/references/authoring-levers.md +110 -0
  726. package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
  727. package/skills/skill-creator/references/best-practices.md +431 -0
  728. package/skills/skill-creator/references/common-patterns.md +639 -0
  729. package/skills/skill-creator/references/core-principles.md +193 -0
  730. package/skills/skill-creator/references/executable-code.md +188 -0
  731. package/skills/skill-creator/references/iteration-and-testing.md +509 -0
  732. package/skills/skill-creator/references/official-spec.md +193 -0
  733. package/skills/skill-creator/references/recommended-structure.md +180 -0
  734. package/skills/skill-creator/references/skill-structure.md +396 -0
  735. package/skills/skill-creator/references/using-scripts.md +122 -0
  736. package/skills/skill-creator/references/using-templates.md +120 -0
  737. package/skills/skill-creator/references/workflows-and-validation.md +541 -0
  738. package/skills/skill-creator/scripts/init_skill.py +322 -0
  739. package/skills/skill-creator/scripts/package_skill.py +110 -0
  740. package/skills/skill-creator/scripts/quick_validate.py +64 -0
  741. package/skills/skill-creator/templates/router-skill.md +73 -0
  742. package/skills/skill-creator/templates/simple-skill.md +34 -0
  743. package/skills/skill-creator/workflows/add-reference.md +96 -0
  744. package/skills/skill-creator/workflows/add-script.md +104 -0
  745. package/skills/skill-creator/workflows/add-template.md +83 -0
  746. package/skills/skill-creator/workflows/add-workflow.md +128 -0
  747. package/skills/skill-creator/workflows/audit-skill.md +159 -0
  748. package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
  749. package/skills/skill-creator/workflows/create-new-skill.md +207 -0
  750. package/skills/skill-creator/workflows/get-guidance.md +134 -0
  751. package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
  752. package/skills/skill-creator/workflows/verify-skill.md +226 -0
  753. package/skills/skill-security-scan/SKILL.md +145 -0
  754. package/skills/skill-security-scan/references/disclaimer.md +21 -0
  755. package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
  756. package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
  757. package/skills/skill-security-scan/references/override-mechanism.md +171 -0
  758. package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
  759. package/skills/skill-security-scan/references/regex-patterns.md +136 -0
  760. package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
  761. package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
  762. package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
  763. package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
  764. package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
  765. package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
  766. package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
  767. package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
  768. package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
  769. package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
  770. package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
  771. package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
  772. package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
  773. package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
  774. package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
  775. package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
  776. package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
  777. package/skills/skill-security-scan/scripts/lib.sh +197 -0
  778. package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
  779. package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
  780. package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
  781. package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
  782. package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
  783. package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
  784. package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
  785. package/skills/social-distribute/SKILL.md +485 -0
  786. package/skills/spec-templates/SKILL.md +274 -0
  787. package/skills/sync/SKILL.md +49 -0
  788. package/skills/test-browser/SKILL.md +464 -0
  789. package/skills/test-browser/references/feature-map.md +161 -0
  790. package/skills/test-fix-loop/SKILL.md +159 -0
  791. package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
  792. package/skills/triage/SKILL.md +402 -0
  793. package/skills/trigger-cron/SKILL.md +136 -0
  794. package/skills/trigger-cron/scripts/trigger.sh +198 -0
  795. package/skills/user-set-role/SKILL.md +147 -0
  796. package/skills/user-set-role/scripts/set-role.sh +218 -0
  797. package/skills/user-story-writer/SKILL.md +77 -0
  798. package/skills/ux-audit/SKILL.md +251 -0
  799. package/skills/ux-audit/references/finding.schema.json +62 -0
  800. package/skills/ux-audit/references/route-list.yaml +95 -0
  801. package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
  802. package/skills/ux-audit/scripts/bot-signin.ts +135 -0
  803. package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
  804. package/skills/verification-scaffold/SKILL.md +73 -0
  805. package/skills/verification-scaffold/references/gitleaks.toml.template +13 -0
  806. package/skills/verification-scaffold/references/guardrail-audit.md +156 -0
  807. package/skills/verification-scaffold/references/guards/block-stash-hook.sh.template +72 -0
  808. package/skills/verification-scaffold/references/guards/commit-on-main-hook.sh.template +82 -0
  809. package/skills/verification-scaffold/references/guards/orphan-test-check.sh.template +102 -0
  810. package/skills/verification-scaffold/references/guards/precommit-guard.sh.template +115 -0
  811. package/skills/verification-scaffold/references/guards/secret-scan-hook.sh.template +176 -0
  812. package/skills/verification-scaffold/references/guards/verification-gates.yml.template +49 -0
  813. package/skills/verification-scaffold/references/guards/wrapper-boundary.sh.template +47 -0
  814. package/skills/verification-scaffold/references/guards.tsv +21 -0
  815. package/skills/verification-scaffold/references/verification-readme.template +55 -0
  816. package/skills/verification-scaffold/scripts/verification-scaffold.sh +785 -0
  817. package/skills/verification-scaffold/test/bite-proof.test.sh +159 -0
  818. package/skills/verification-scaffold/test/generator.test.sh +319 -0
  819. package/skills/verification-scaffold/test/manifest.test.sh +144 -0
  820. package/skills/work/SKILL.md +1480 -0
  821. package/skills/work/references/end-of-work-resume.md +7 -0
  822. package/skills/work/references/hook-test-main-cwd.md +24 -0
  823. package/skills/work/references/key-principles.md +83 -0
  824. package/skills/work/references/property-testing.md +122 -0
  825. package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
  826. package/skills/work/references/work-agent-teams.md +97 -0
  827. package/skills/work/references/work-lifecycle-parallel.md +147 -0
  828. package/skills/work/references/work-lockfile-bumps.md +97 -0
  829. package/skills/work/references/work-scratch-sandboxes.md +212 -0
  830. package/skills/work/references/work-subagent-fanout.md +61 -0
  831. package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
  832. package/skills/xcode-test/SKILL.md +360 -0
@@ -0,0 +1,554 @@
1
+ // Generate a LikeC4 model from the component docs `/soleur:sync` already writes.
2
+ //
3
+ // WHY A RELATIONSHIP-COUNT GATE EXISTS. The dependency convention this parses is
4
+ // EMERGENT, not specified. Until #7332 the only place it was written down was a
5
+ // prose placeholder in the component template; nothing ever told the producing
6
+ // side to emit a parseable form. Skouer's docs happen to use markdown links,
7
+ // Soleur's own use prose ("None (agents are standalone)") 4 times out of 4. So
8
+ // the failure mode this module is built around is not a crash — it is a corpus
9
+ // that yields elements, exits 0, validates clean, and renders a diagram of
10
+ // DISCONNECTED BOXES reported as a successful result. `assessRender` reports that
11
+ // state as `degraded`: the docs are the defect, not the run.
12
+ //
13
+ // VALIDATION MIRRORS plugins/soleur/scripts/render-c4-model.sh (its DIAG_RE and
14
+ // element-count gates), NOT c4-render.ts — except the #8861 views gate, which
15
+ // all three writers share identically (plain-object `views` count > 0).
16
+ // The two in-repo precedents deliberately disagree on the DIAGNOSTIC gate:
17
+ // `c4-render.ts` refuses to key on likec4 stderr, reasoning that its wording
18
+ // drifts across patch versions — correct for a RUNTIME save path that cannot
19
+ // pin the CLI (its element/view COUNT gates are identical to this module's).
20
+ // This
21
+ // producer pins `likec4@1.50.0` (asserted by a drift guard against both
22
+ // precedents), so the wording is fixed and both gates are safe. That pin is load
23
+ // bearing: if it moves, the diagnostic gate is the thing that breaks.
24
+ //
25
+ // This module is PURE — parsing, edge building, and string generation only. All
26
+ // filesystem writes and the likec4 invocation live in the executable wrapper,
27
+ // plugins/soleur/scripts/generate-c4-from-components.ts, mirroring the
28
+ // heartbeat-live-reconcile.ts -> reconcile-live-heartbeats.ts split.
29
+
30
+ import { readFileSync, readdirSync } from "node:fs";
31
+ import { join } from "node:path";
32
+
33
+ /**
34
+ * Pinned likec4 CLI version. MUST stay equal to `LIKEC4_VERSION` in
35
+ * plugins/soleur/scripts/render-c4-model.sh and the `likec4@…` pin in
36
+ * apps/web-platform/server/c4-render.ts — a drift guard asserts all three.
37
+ */
38
+ export const LIKEC4_VERSION = "1.50.0";
39
+
40
+ /**
41
+ * `--before` cutoff for the `npx` resolve. MUST stay equal to `LIKEC4_BEFORE` in
42
+ * plugins/soleur/scripts/render-c4-model.sh (BUMPING LIKEC4 there) — a drift guard asserts it.
43
+ */
44
+ export const LIKEC4_BEFORE = "2026-09-28";
45
+
46
+ /** Provenance stamp. A file without this as its FIRST line is never overwritten. */
47
+ export const GENERATED_HEADER =
48
+ "// GENERATED by /soleur:sync c4 — hand edits will be overwritten";
49
+
50
+ /**
51
+ * Source-fault detector, behaviourally equivalent to `DIAG_RE` in
52
+ * plugins/soleur/scripts/render-c4-model.sh. likec4@1.50.0 exits 0 on a syntax error —
53
+ * it drops the bad fragment, prints `Invalid <file>` / `Line N:`, and still emits
54
+ * a non-empty but INCOMPLETE model, which element-count alone cannot see.
55
+ *
56
+ * The anchors are deliberate: likec4 echoes `workspace: /abs/path`, so an
57
+ * unanchored `Invalid` would false-fail for a checkout directory whose name
58
+ * happens to contain the marker word.
59
+ */
60
+ export const DIAG_RE =
61
+ /^([0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+)? +[A-Z]+ +[^ ]+ +)?Invalid |Could not resolve|^\s+Line [0-9]+:/m;
62
+
63
+ /**
64
+ * The environment likec4 runs under. Under CI it switches to a timestamped, ANSI-coloured
65
+ * reporter; CI and FORCE_COLOR are dropped and NO_COLOR set so the diagnostics reach
66
+ * `DIAG_RE` plain. `assessRender` also strips ANSI, so either defence alone holds.
67
+ */
68
+ export function likec4ChildEnv(base: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
69
+ const env: NodeJS.ProcessEnv = { ...base, NO_COLOR: "1" };
70
+ delete env.CI;
71
+ delete env.FORCE_COLOR;
72
+ return env;
73
+ }
74
+
75
+ const ANSI_RE = /\x1b\[[0-9;]*m/g;
76
+
77
+ /** Marker sentinel for the C4 producer. */
78
+ export const C4_MARKER = "SOLEUR_KB_SYNC_C4";
79
+
80
+ /**
81
+ * Every numeric field the C4 marker emits, in emission order.
82
+ *
83
+ * ‼️ ALL of them appear on EVERY branch, even when the value is zero. The first
84
+ * version emitted a different field set per branch — `generated_*` and `published`
85
+ * only on the render path, `detail` only on the unavailable path, `docs` sometimes —
86
+ * so an agent parsing a fixed key set got missing keys with no way to tell
87
+ * absent-because-zero from absent-because-branch. `MARKER_FIELDS` in kb-coverage.ts
88
+ * already did this correctly; this is that pattern applied to the sibling producer,
89
+ * with a drift guard asserting both.
90
+ */
91
+ export const C4_MARKER_FIELDS = [
92
+ "elements",
93
+ "relationships",
94
+ "generated_components",
95
+ "generated_relationships",
96
+ "skipped",
97
+ "seeded",
98
+ "published",
99
+ ] as const;
100
+
101
+ export type C4MarkerCounts = Record<(typeof C4_MARKER_FIELDS)[number], number>;
102
+
103
+ /**
104
+ * Build the C4 marker. One formatter, so no branch can omit a field.
105
+ *
106
+ * `reason` is a BARE TOKEN and `detail` carries prose — a consumer classifies on
107
+ * `reason=` without string-matching a sentence.
108
+ */
109
+ export function formatC4Marker(
110
+ status: RenderVerdict["status"],
111
+ counts: C4MarkerCounts,
112
+ reason?: string,
113
+ detail?: string,
114
+ ): string {
115
+ const head =
116
+ `${C4_MARKER} status=${status}` +
117
+ (reason ? ` reason=${reason}` : "") +
118
+ (detail ? ` detail="${detail.replace(/"/g, "'").replace(/\s+/g, " ").trim()}"` : "");
119
+ const fields = C4_MARKER_FIELDS.map((f) => `${f}=${counts[f]}`).join(" ");
120
+ return `${head} ${fields}`;
121
+ }
122
+
123
+ export type DepSource = "frontmatter" | "links" | "none";
124
+
125
+ export type ParsedComponent = {
126
+ /** Sanitized LikeC4 identifier (alphanumeric, camelCase). */
127
+ id: string;
128
+ /** Original kebab-case `component:` value — the key dependencies refer to. */
129
+ name: string;
130
+ /** Human-readable title for the diagram node. */
131
+ title: string;
132
+ /** Resolved dependency names, sorted. */
133
+ deps: string[];
134
+ /**
135
+ * Where `deps` came from. `"frontmatter"` with an empty list means the author
136
+ * DECLARED no dependencies; `"none"` means they declared nothing at all. The
137
+ * coverage summary needs that distinction — a corpus of silent docs must not
138
+ * read as a corpus of genuine leaves.
139
+ */
140
+ depSource: DepSource;
141
+ };
142
+
143
+ export type Edge = { from: string; to: string };
144
+
145
+ export type RenderVerdict = {
146
+ status: "ok" | "degraded" | "failed";
147
+ /**
148
+ * A BARE TOKEN, never free prose. A consumer classifies on this, and the previous
149
+ * form emitted a quoted sentence — so a `reason=(\S+)` regex yielded `"0`.
150
+ * Human-readable context belongs in `detail`.
151
+ */
152
+ reason?: string;
153
+ detail?: string;
154
+ };
155
+
156
+ // ---------------------------------------------------------------------------
157
+ // frontmatter
158
+ // ---------------------------------------------------------------------------
159
+
160
+ type Frontmatter = {
161
+ component?: string;
162
+ status?: string;
163
+ /** `undefined` = absent; `[]` = explicitly declared empty. */
164
+ dependencies?: string[];
165
+ };
166
+
167
+ function splitFrontmatter(source: string): string | null {
168
+ if (!source.startsWith("---")) return null;
169
+ const end = source.indexOf("\n---", 3);
170
+ if (end === -1) return null;
171
+ return source.slice(source.indexOf("\n") + 1, end);
172
+ }
173
+
174
+ function parseFrontmatter(source: string): Frontmatter {
175
+ const block = splitFrontmatter(source);
176
+ if (block === null) return {};
177
+
178
+ const fm: Frontmatter = {};
179
+ const lines = block.split("\n");
180
+
181
+ for (let i = 0; i < lines.length; i++) {
182
+ const line = lines[i];
183
+ const kv = line.match(/^([A-Za-z_][A-Za-z0-9_]*):[ \t]*(.*)$/);
184
+ if (!kv) continue;
185
+ const key = kv[1];
186
+ const inline = kv[2].trim();
187
+
188
+ if (key === "component" || key === "status") {
189
+ fm[key] = inline.replace(/^["']|["']$/g, "");
190
+ continue;
191
+ }
192
+
193
+ if (key !== "dependencies") continue;
194
+
195
+ // Inline form: `dependencies: []` or `dependencies: [a, b]`.
196
+ if (inline.startsWith("[")) {
197
+ const inner = inline.slice(1, inline.lastIndexOf("]")).trim();
198
+ fm.dependencies = inner === "" ? [] : inner.split(",").map((s) => s.trim()).filter(Boolean);
199
+ continue;
200
+ }
201
+
202
+ // Block form: collect the following ` - item` lines. An empty value with no
203
+ // following items is still a DECLARATION, so seed with [].
204
+ const items: string[] = [];
205
+ for (let j = i + 1; j < lines.length; j++) {
206
+ const item = lines[j].match(/^[ \t]+-[ \t]+(.*)$/);
207
+ if (!item) break;
208
+ const v = item[1].trim().replace(/^["']|["']$/g, "");
209
+ if (v) items.push(v);
210
+ }
211
+ fm.dependencies = items;
212
+ }
213
+
214
+ return fm;
215
+ }
216
+
217
+ // ---------------------------------------------------------------------------
218
+ // parsing
219
+ // ---------------------------------------------------------------------------
220
+
221
+ /** Sanitize a kebab-case component name into a LikeC4 identifier. */
222
+ export function toId(name: string): string {
223
+ const parts = name.split(/[^A-Za-z0-9]+/).filter(Boolean);
224
+ if (parts.length === 0) return "component";
225
+ const head = parts[0].toLowerCase();
226
+ const tail = parts.slice(1).map((p) => p[0].toUpperCase() + p.slice(1).toLowerCase());
227
+ const id = head + tail.join("");
228
+ return /^[0-9]/.test(id) ? `c${id}` : id;
229
+ }
230
+
231
+ function titleFor(name: string): string {
232
+ return name
233
+ .split(/[^A-Za-z0-9]+/)
234
+ .filter(Boolean)
235
+ .map((p) => p[0].toUpperCase() + p.slice(1))
236
+ .join(" ");
237
+ }
238
+
239
+ /**
240
+ * Parse one component doc. Returns `null` for a `status: deprecated` doc —
241
+ * sync.md's contract is "Removed components: add `status: deprecated` (do not
242
+ * delete)", so without this filter the element set accretes deleted components
243
+ * forever and their declared dependencies create dangling edges.
244
+ */
245
+ export function parseComponentDoc(source: string, fallbackName: string): ParsedComponent | null {
246
+ const fm = parseFrontmatter(source);
247
+ if (fm.status === "deprecated") return null;
248
+
249
+ const name = fm.component ?? fallbackName;
250
+
251
+ let deps: string[];
252
+ let depSource: DepSource;
253
+
254
+ if (fm.dependencies !== undefined) {
255
+ deps = fm.dependencies;
256
+ depSource = "frontmatter";
257
+ } else {
258
+ // Fallback for docs written before the frontmatter contract: extract markdown
259
+ // links from the prose `**Internal**` line. Prose without links yields
260
+ // nothing — deliberately. Inferring edges from prose would invent
261
+ // architecture, which is worse than reporting degraded.
262
+ const internal = source.match(/^[ \t]*[-*][ \t]*\*\*Internal\*\*[ \t]*:(.*)$/m);
263
+ const links = internal ? [...internal[1].matchAll(/\[([^\]]+)\]\([^)]*\)/g)] : [];
264
+ if (links.length > 0) {
265
+ deps = links.map((m) => m[1].trim());
266
+ depSource = "links";
267
+ } else {
268
+ deps = [];
269
+ depSource = "none";
270
+ }
271
+ }
272
+
273
+ const unique = [...new Set(deps.filter((d) => d && d !== name))].sort();
274
+
275
+ return { id: toId(name), name, title: titleFor(name), deps: unique, depSource };
276
+ }
277
+
278
+ /** Load and parse every `*.md` in a directory, dropping deprecated docs. Sorted by name. */
279
+ export function loadComponentDir(dir: string): ParsedComponent[] {
280
+ const files = readdirSync(dir)
281
+ .filter((f) => f.endsWith(".md") && f !== "README.md")
282
+ .sort();
283
+
284
+ const docs: ParsedComponent[] = [];
285
+ for (const f of files) {
286
+ const parsed = parseComponentDoc(readFileSync(join(dir, f), "utf8"), f.replace(/\.md$/, ""));
287
+ if (parsed) docs.push(parsed);
288
+ }
289
+ return docs.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
290
+ }
291
+
292
+ // ---------------------------------------------------------------------------
293
+ // edges
294
+ // ---------------------------------------------------------------------------
295
+
296
+ /**
297
+ * Build the edge set, dropping any dependency whose target is not a live element.
298
+ * An edge to a missing or deprecated component makes likec4 emit
299
+ * `Could not resolve …`, which the diagnostic gate treats as a hard failure — so
300
+ * the producer must not emit it in the first place.
301
+ */
302
+ export function buildEdges(components: ParsedComponent[]): Edge[] {
303
+ const live = new Set(components.map((c) => c.name));
304
+ const edges: Edge[] = [];
305
+
306
+ for (const c of components) {
307
+ for (const dep of c.deps) {
308
+ if (live.has(dep)) edges.push({ from: c.name, to: dep });
309
+ }
310
+ }
311
+
312
+ return edges.sort((a, b) =>
313
+ a.from < b.from ? -1 : a.from > b.from ? 1 : a.to < b.to ? -1 : a.to > b.to ? 1 : 0,
314
+ );
315
+ }
316
+
317
+ // ---------------------------------------------------------------------------
318
+ // non-destructive write contract
319
+ // ---------------------------------------------------------------------------
320
+
321
+ /**
322
+ * True when the producer may write this path. `/soleur:architecture` writes
323
+ * spec.c4 / model.c4 / views.c4 cwd-relative, and the agent sandbox pins
324
+ * `cwd = workspacePath` — two writers, one directory. A tester who hand-corrects
325
+ * a wrong edge must not have it silently reverted by the next sync.
326
+ *
327
+ * The header must be the FIRST line, not merely present somewhere in the body
328
+ * (cq-assert-anchor-not-bare-token): a hand-authored file that happens to quote
329
+ * the header in a comment is still a hand-authored file.
330
+ */
331
+ export function canOverwrite(existing: string | null): boolean {
332
+ if (existing === null) return true;
333
+ return existing.split("\n", 1)[0].trim() === GENERATED_HEADER;
334
+ }
335
+
336
+ // ---------------------------------------------------------------------------
337
+ // generation
338
+ // ---------------------------------------------------------------------------
339
+
340
+ function escapeC4(s: string): string {
341
+ return s.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
342
+ }
343
+
344
+ /**
345
+ * Emit the composing model file. Deterministic by construction: no timestamp, no
346
+ * run id, sorted inputs — an unchanged component-doc set must produce a
347
+ * byte-identical file, or every sync emits a diff forever.
348
+ */
349
+ export function generateC4(components: ParsedComponent[], edges: Edge[]): string {
350
+ const byName = new Map(components.map((c) => [c.name, c]));
351
+ const out: string[] = [GENERATED_HEADER, "", "model {", ""];
352
+
353
+ for (const c of components) {
354
+ out.push(` ${c.id} = component "${escapeC4(c.title)}" {`);
355
+ out.push(` description "${escapeC4(`Component: ${c.name}`)}"`);
356
+ out.push(" }");
357
+ }
358
+
359
+ if (edges.length > 0) {
360
+ out.push("");
361
+ for (const e of edges) {
362
+ const from = byName.get(e.from);
363
+ const to = byName.get(e.to);
364
+ if (!from || !to) continue;
365
+ out.push(` ${from.id} -> ${to.id} "depends on"`);
366
+ }
367
+ }
368
+
369
+ out.push("}", "");
370
+ return out.join("\n");
371
+ }
372
+
373
+ /**
374
+ * Minimal `specification` block for the `component` element kind the generated model
375
+ * uses. Without it every generated element is an unresolved reference and the render
376
+ * fails.
377
+ *
378
+ * ‼️ The wrapper seeds this only when no file NAMED `spec.c4` exists — it does not
379
+ * scan the directory for an existing `specification` block. That distinction was
380
+ * previously stated the other way round, and the gap is reachable: a repo using the
381
+ * valid single-file LikeC4 layout (its `specification` inside `model.c4`) gets a
382
+ * SECOND `element component` declaration and the whole sync exits 1. Soleur's own
383
+ * diagrams dir has a discrete `spec.c4`, so dogfooding cannot surface it.
384
+ *
385
+ * Left as a filename check deliberately: scanning for a `specification` block means
386
+ * parsing every `.c4` in the directory, and the failure is loud (exit 1 with the
387
+ * likec4 diagnostic naming the duplicate) rather than silent. Recorded here so the
388
+ * next reader sees a known, bounded limitation instead of a false claim.
389
+ */
390
+ export function generateSpecC4(): string {
391
+ return [
392
+ GENERATED_HEADER,
393
+ "",
394
+ "specification {",
395
+ " element component {",
396
+ ' notation "Component"',
397
+ " style {",
398
+ " shape rectangle",
399
+ " }",
400
+ " }",
401
+ "}",
402
+ "",
403
+ ].join("\n");
404
+ }
405
+
406
+ /** Minimal view so the model renders in the KB viewer. */
407
+ export function generateViewsC4(): string {
408
+ return [
409
+ GENERATED_HEADER,
410
+ "",
411
+ "views {",
412
+ " view generatedComponents {",
413
+ ' title "Components (generated from knowledge base)"',
414
+ " include *",
415
+ " }",
416
+ "}",
417
+ "",
418
+ ].join("\n");
419
+ }
420
+
421
+ /**
422
+ * The markdown page carrying the view embed. The KB viewer renders a diagram only
423
+ * for a markdown page with a `likec4-view` fence — three .c4 files alone are not
424
+ * enough (api/kb/c4/project/route.ts also returns MODEL_NOT_BUILT without a
425
+ * committed model.likec4.json).
426
+ */
427
+ export function generateViewPage(viewId = "generatedComponents"): string {
428
+ return [
429
+ "# Components",
430
+ "",
431
+ "Generated by `/soleur:sync c4` from the component docs in",
432
+ "`knowledge-base/project/components/`. Edges come from each doc's",
433
+ "`dependencies:` frontmatter.",
434
+ "",
435
+ "```likec4-view",
436
+ viewId,
437
+ "```",
438
+ "",
439
+ ].join("\n");
440
+ }
441
+
442
+ // ---------------------------------------------------------------------------
443
+ // validation
444
+ // ---------------------------------------------------------------------------
445
+
446
+ /**
447
+ * Count elements, relationships, and views in a rendered `model.likec4.json`.
448
+ * `views` feeds `assessRender`'s zero-views gate (#8861).
449
+ *
450
+ * ‼️ The relationship key is `relations`, NOT `relationships`. Reading the wrong
451
+ * key returns `undefined` -> 0, which makes `assessRender` report EVERY corpus as
452
+ * degraded — a gate that always fires is exactly as useless as one that never
453
+ * does, and no unit test over `assessRender` (which takes plain numbers) can see
454
+ * it. `countModelJson` exists so the key mapping itself is pinned by a test
455
+ * against a real likec4 artifact.
456
+ *
457
+ * Non-object shapes yield 0 rather than throwing: likec4 can emit a null/array
458
+ * field, and a bare `Object.keys` on those would silently produce a wrong count.
459
+ */
460
+ export function countModelJson(json: string): {
461
+ elements: number;
462
+ relationships: number;
463
+ views: number;
464
+ } {
465
+ try {
466
+ const model = JSON.parse(json) as Record<string, unknown>;
467
+ const size = (v: unknown) =>
468
+ v && typeof v === "object" && !Array.isArray(v) ? Object.keys(v).length : 0;
469
+ return {
470
+ elements: size(model.elements),
471
+ relationships: size(model.relations),
472
+ views: size(model.views),
473
+ };
474
+ } catch {
475
+ return { elements: 0, relationships: 0, views: 0 };
476
+ }
477
+ }
478
+
479
+ /**
480
+ * The gates. Order matters: a source fault is a hard failure regardless of
481
+ * counts, an empty model is a failure, a zero-view model is a LAYOUT failure
482
+ * (#8861 — a successful layout always emits at least `index`, so this is the
483
+ * graphviz-fallback/container shape, never the user's source), and only then is
484
+ * a zero-relationship model classified — as `degraded`, never `failed`. The
485
+ * docs are the defect there, not the run, and failing the sync over it would
486
+ * punish the tester for a corpus Soleur itself taught them to write.
487
+ */
488
+ export function assessRender(input: {
489
+ diagnostics: string;
490
+ /** Elements in the RENDERED model (the whole diagrams dir). Validates non-degeneracy. */
491
+ elementCount: number;
492
+ /**
493
+ * Views in the RENDERED model — the #8861 gate, mirroring c4-render.ts's
494
+ * `counts.views === 0`. Elements-but-no-views means the layout engine failed,
495
+ * so a zero here is `failed`, and it is checked before the
496
+ * generatedRelationships degrade so a broken layout is never published as a
497
+ * "link-free corpus".
498
+ */
499
+ viewCount: number;
500
+ /** Relationships in the RENDERED model. Reported, but NOT the gate — see below. */
501
+ relationshipCount: number;
502
+ /**
503
+ * Relationships THIS PRODUCER contributed, i.e. `buildEdges(docs).length`.
504
+ *
505
+ * ‼️ THIS is the gate, and using `relationshipCount` was the defect. `likec4
506
+ * export json .` renders the WHOLE diagrams directory, so on any repo that already
507
+ * has a hand-authored `model.c4` the count is dominated by edges the producer did
508
+ * not create. Measured on this repo: 4 component docs with ZERO `dependencies:`
509
+ * frontmatter — the producer contributed 0 relationships — and the merged render
510
+ * reported 135. The zero-relationship gate, which is this module's entire reason
511
+ * for existing, was therefore unreachable in exactly the two-writer scenario the
512
+ * design is built around: it could only ever fire on a fresh diagrams dir, where
513
+ * it is least needed.
514
+ *
515
+ * The producer already knows this number without asking likec4 — it built the edge
516
+ * set. The render's job is validation and artifact production, not counting.
517
+ */
518
+ generatedRelationships: number;
519
+ }): RenderVerdict {
520
+ const diagnostics = input.diagnostics.replace(ANSI_RE, "");
521
+ if (DIAG_RE.test(diagnostics)) {
522
+ const line = diagnostics.split("\n").find((l) => DIAG_RE.test(l)) ?? "";
523
+ return { status: "failed", reason: "source-fault", detail: line.trim() };
524
+ }
525
+ if (input.elementCount === 0) {
526
+ return { status: "failed", reason: "empty-model", detail: "likec4 produced an empty/degenerate model" };
527
+ }
528
+ if (input.viewCount === 0) {
529
+ // A layout failure with no diagnostic the source-fault arm could claim —
530
+ // the likec4 output tail is the only evidence the agent gets, so carry a
531
+ // trimmed copy on the wire (the marker collapses whitespace anyway).
532
+ const tail = diagnostics
533
+ .split("\n")
534
+ .filter(Boolean)
535
+ .slice(-5)
536
+ .join(" | ")
537
+ .slice(0, 300);
538
+ return {
539
+ status: "failed",
540
+ reason: "zero-views",
541
+ detail: `likec4 produced a model with elements but no views — a layout failure, not a source fault${tail ? ` — last output: ${tail}` : ""}`,
542
+ };
543
+ }
544
+ if (input.generatedRelationships === 0) {
545
+ return {
546
+ status: "degraded",
547
+ reason: "no-generated-relationships",
548
+ detail:
549
+ "component docs declare no parseable dependencies, so this producer " +
550
+ "contributed a set of disconnected boxes",
551
+ };
552
+ }
553
+ return { status: "ok" };
554
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * /go routing dispatch — maps classified intent labels to registered skills/agents.
3
+ *
4
+ * Mirrors the eval-gate routing table in plugins/soleur/commands/go.md.
5
+ * Golden-path eval (Phase F #6325) asserts Grok slash_command dispatch fidelity.
6
+ * Anti-bypass contract (#6338): routes resolve via workflow-fidelity.ts.
7
+ */
8
+
9
+ import { invokeSkill, spawnAgent, type SkillInvocation, type AgentSpawn } from "./harness";
10
+ import { GO_SKILL_ROUTES, resolveGoSkillRoute } from "./workflow-fidelity";
11
+
12
+ export { GO_SKILL_ROUTES, resolveGoSkillRoute };
13
+
14
+ /** Agent routes (spawn_subagent / Task — never improvised workflows). */
15
+ export const GO_AGENT_ROUTES: Record<string, string> = {
16
+ "clo-attestation": "clo",
17
+ "legal-threshold": "clo",
18
+ };
19
+
20
+ export type GoRouteTarget =
21
+ | { kind: "skill"; skill: string }
22
+ | { kind: "agent"; agent: string };
23
+
24
+ /** Resolve a classified routing label to its registered target. */
25
+ export function resolveGoRoute(label: string): GoRouteTarget {
26
+ if (label in GO_AGENT_ROUTES) {
27
+ return { kind: "agent", agent: GO_AGENT_ROUTES[label] };
28
+ }
29
+ return { kind: "skill", skill: resolveGoSkillRoute(label) };
30
+ }
31
+
32
+ export type GoDispatch =
33
+ | { kind: "skill"; invocation: SkillInvocation }
34
+ | { kind: "agent"; spawn: AgentSpawn };
35
+
36
+ /**
37
+ * Dispatch a classified /go route under the active harness.
38
+ * Pass `env` in tests to pin Grok vs Claude without mutating process.env.
39
+ */
40
+ export function dispatchGoRoute(
41
+ label: string,
42
+ userInput: string,
43
+ env?: NodeJS.ProcessEnv,
44
+ ): GoDispatch {
45
+ const target = resolveGoRoute(label);
46
+ const prev = { ...process.env };
47
+
48
+ if (env) {
49
+ for (const key of Object.keys(process.env)) {
50
+ if (!(key in env)) delete process.env[key];
51
+ }
52
+ Object.assign(process.env, env);
53
+ }
54
+
55
+ try {
56
+ if (target.kind === "agent") {
57
+ return { kind: "agent", spawn: spawnAgent(target.agent, userInput) };
58
+ }
59
+ return { kind: "skill", invocation: invokeSkill(target.skill, userInput) };
60
+ } finally {
61
+ for (const key of Object.keys(process.env)) {
62
+ if (!(key in prev)) delete process.env[key];
63
+ }
64
+ Object.assign(process.env, prev);
65
+ }
66
+ }
67
+
68
+ /** Pin harness for deterministic golden-path tests. */
69
+ export function grokTestEnv(): NodeJS.ProcessEnv {
70
+ return { GROK_HOME: "/home/user/.grok" };
71
+ }
72
+
73
+ export function claudeTestEnv(): NodeJS.ProcessEnv {
74
+ return { CLAUDECODE: "1" };
75
+ }
76
+
77
+ /** Expected Grok slash command for a skill route (golden-path assertion). */
78
+ export function expectedGrokSlashCommand(skill: string, args?: string): string {
79
+ const trimmed = args?.trim();
80
+ return trimmed ? `/${skill} ${trimmed}` : `/${skill}`;
81
+ }