@soleur/opencode 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (812) hide show
  1. package/.claude-plugin/agents.manifest.json +476 -0
  2. package/.claude-plugin/plugin.json +42 -0
  3. package/README.md +44 -2
  4. package/agents/community/.gitkeep +0 -0
  5. package/agents/engineering/cto.md +87 -0
  6. package/agents/engineering/design/ddd-architect.md +95 -0
  7. package/agents/engineering/discovery/agent-finder.md +214 -0
  8. package/agents/engineering/discovery/functional-discovery.md +182 -0
  9. package/agents/engineering/infra/infra-security.md +151 -0
  10. package/agents/engineering/infra/platform-strategist.md +109 -0
  11. package/agents/engineering/infra/terraform-architect.md +171 -0
  12. package/agents/engineering/prompt-engineer.md +37 -0
  13. package/agents/engineering/research/best-practices-researcher.md +115 -0
  14. package/agents/engineering/research/framework-docs-researcher.md +93 -0
  15. package/agents/engineering/research/git-history-analyzer.md +53 -0
  16. package/agents/engineering/research/learnings-researcher.md +285 -0
  17. package/agents/engineering/research/repo-research-analyst.md +118 -0
  18. package/agents/engineering/review/agent-native-reviewer.md +279 -0
  19. package/agents/engineering/review/architecture-strategist.md +61 -0
  20. package/agents/engineering/review/code-quality-analyst.md +92 -0
  21. package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
  22. package/agents/engineering/review/data-integrity-guardian.md +82 -0
  23. package/agents/engineering/review/data-migration-expert.md +98 -0
  24. package/agents/engineering/review/deployment-verification-agent.md +183 -0
  25. package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
  26. package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
  27. package/agents/engineering/review/legacy-code-expert.md +55 -0
  28. package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
  29. package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
  30. package/agents/engineering/review/performance-oracle.md +130 -0
  31. package/agents/engineering/review/security-sentinel.md +167 -0
  32. package/agents/engineering/review/semgrep-sast.md +36 -0
  33. package/agents/engineering/review/test-design-reviewer.md +150 -0
  34. package/agents/engineering/review/user-impact-reviewer.md +70 -0
  35. package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
  36. package/agents/finance/budget-analyst.md +29 -0
  37. package/agents/finance/cfo.md +44 -0
  38. package/agents/finance/financial-reporter.md +30 -0
  39. package/agents/finance/revenue-analyst.md +30 -0
  40. package/agents/legal/clo.md +115 -0
  41. package/agents/legal/legal-compliance-auditor.md +110 -0
  42. package/agents/legal/legal-document-generator.md +134 -0
  43. package/agents/marketing/analytics-analyst.md +25 -0
  44. package/agents/marketing/brand-architect.md +181 -0
  45. package/agents/marketing/cmo.md +76 -0
  46. package/agents/marketing/conversion-optimizer.md +19 -0
  47. package/agents/marketing/copywriter.md +20 -0
  48. package/agents/marketing/fact-checker.md +70 -0
  49. package/agents/marketing/growth-strategist.md +145 -0
  50. package/agents/marketing/paid-media-strategist.md +28 -0
  51. package/agents/marketing/pricing-strategist.md +17 -0
  52. package/agents/marketing/programmatic-seo-specialist.md +25 -0
  53. package/agents/marketing/retention-strategist.md +23 -0
  54. package/agents/marketing/seo-aeo-analyst.md +164 -0
  55. package/agents/operations/coo.md +50 -0
  56. package/agents/operations/ops-advisor.md +78 -0
  57. package/agents/operations/ops-provisioner.md +101 -0
  58. package/agents/operations/ops-research.md +52 -0
  59. package/agents/operations/service-automator.md +278 -0
  60. package/agents/product/business-validator.md +206 -0
  61. package/agents/product/competitive-intelligence.md +89 -0
  62. package/agents/product/cpo.md +63 -0
  63. package/agents/product/design/ux-design-lead.md +209 -0
  64. package/agents/product/spec-flow-analyzer.md +122 -0
  65. package/agents/sales/cro.md +44 -0
  66. package/agents/sales/deal-architect.md +29 -0
  67. package/agents/sales/outbound-strategist.md +29 -0
  68. package/agents/sales/pipeline-analyst.md +29 -0
  69. package/agents/support/cco.md +48 -0
  70. package/agents/support/community-manager.md +570 -0
  71. package/agents/support/ticket-triage.md +70 -0
  72. package/bin/soleur-opencode.js +29 -0
  73. package/commands/go.md +659 -0
  74. package/commands/help.md +273 -0
  75. package/commands/sync.md +977 -0
  76. package/commands/version.md +103 -0
  77. package/hooks/antigravity-hooks.json +84 -0
  78. package/hooks/antigravity-session-start.sh +15 -0
  79. package/hooks/bare-root-cwd-guard.sh +131 -0
  80. package/hooks/browser-snapshot-credential-guard.sh +200 -0
  81. package/hooks/codex-session-start.sh +9 -0
  82. package/hooks/compaction-state.sh +525 -0
  83. package/hooks/destructive-command-guard.sh +1387 -0
  84. package/hooks/devin-session-start.sh +90 -0
  85. package/hooks/ext-filter-detect.sh +171 -0
  86. package/hooks/hooks.json +133 -0
  87. package/hooks/lib/hook-tool-kind.sh +24 -0
  88. package/hooks/lib/log-rotation.sh +176 -0
  89. package/hooks/lib/shell-argv.pl +576 -0
  90. package/hooks/memory-backstop.sh +1114 -0
  91. package/hooks/operator-stage-approval.sh +391 -0
  92. package/hooks/stop-hook.sh +367 -0
  93. package/hooks/unkept-promise-hook.sh +383 -0
  94. package/hooks/version-banner.sh +127 -0
  95. package/hooks/welcome-hook.sh +50 -0
  96. package/install.js +108 -0
  97. package/lib/agent-registry.ts +154 -0
  98. package/lib/c4-canonical-cli.mjs +34 -0
  99. package/lib/c4-canonical.mjs +46 -0
  100. package/lib/c4-from-components.ts +554 -0
  101. package/lib/go-routing.ts +81 -0
  102. package/lib/grok-inspect-contract.ts +311 -0
  103. package/lib/harness-model-map.ts +101 -0
  104. package/lib/harness-parity.ts +726 -0
  105. package/lib/harness-tool-map.ts +180 -0
  106. package/lib/harness.ts +716 -0
  107. package/lib/heartbeat-live-reconcile.ts +1153 -0
  108. package/lib/heartbeat-manifest.ts +342 -0
  109. package/lib/kb-coverage.ts +252 -0
  110. package/lib/pr-merge-poll.ts +103 -0
  111. package/lib/workflow-fidelity.ts +388 -0
  112. package/opencode/INSTRUCTIONS.md +152 -0
  113. package/opencode/agents/engineering/cto.md +10 -0
  114. package/opencode/agents/engineering/design/ddd-architect.md +10 -0
  115. package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
  116. package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
  117. package/opencode/agents/engineering/infra/infra-security.md +10 -0
  118. package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
  119. package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
  120. package/opencode/agents/engineering/prompt-engineer.md +10 -0
  121. package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
  122. package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
  123. package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
  124. package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
  125. package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
  126. package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
  127. package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
  128. package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
  129. package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
  130. package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
  131. package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
  132. package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
  133. package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
  134. package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
  135. package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
  136. package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
  137. package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
  138. package/opencode/agents/engineering/review/performance-oracle.md +10 -0
  139. package/opencode/agents/engineering/review/security-sentinel.md +10 -0
  140. package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
  141. package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
  142. package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
  143. package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
  144. package/opencode/agents/finance/budget-analyst.md +10 -0
  145. package/opencode/agents/finance/cfo.md +10 -0
  146. package/opencode/agents/finance/financial-reporter.md +10 -0
  147. package/opencode/agents/finance/revenue-analyst.md +10 -0
  148. package/opencode/agents/legal/clo.md +10 -0
  149. package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
  150. package/opencode/agents/legal/legal-document-generator.md +10 -0
  151. package/opencode/agents/marketing/analytics-analyst.md +10 -0
  152. package/opencode/agents/marketing/brand-architect.md +10 -0
  153. package/opencode/agents/marketing/cmo.md +10 -0
  154. package/opencode/agents/marketing/conversion-optimizer.md +10 -0
  155. package/opencode/agents/marketing/copywriter.md +10 -0
  156. package/opencode/agents/marketing/fact-checker.md +10 -0
  157. package/opencode/agents/marketing/growth-strategist.md +10 -0
  158. package/opencode/agents/marketing/paid-media-strategist.md +10 -0
  159. package/opencode/agents/marketing/pricing-strategist.md +10 -0
  160. package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
  161. package/opencode/agents/marketing/retention-strategist.md +10 -0
  162. package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
  163. package/opencode/agents/operations/coo.md +10 -0
  164. package/opencode/agents/operations/ops-advisor.md +10 -0
  165. package/opencode/agents/operations/ops-provisioner.md +10 -0
  166. package/opencode/agents/operations/ops-research.md +10 -0
  167. package/opencode/agents/operations/service-automator.md +10 -0
  168. package/opencode/agents/product/business-validator.md +10 -0
  169. package/opencode/agents/product/competitive-intelligence.md +10 -0
  170. package/opencode/agents/product/cpo.md +10 -0
  171. package/opencode/agents/product/design/ux-design-lead.md +10 -0
  172. package/opencode/agents/product/spec-flow-analyzer.md +10 -0
  173. package/opencode/agents/sales/cro.md +10 -0
  174. package/opencode/agents/sales/deal-architect.md +10 -0
  175. package/opencode/agents/sales/outbound-strategist.md +10 -0
  176. package/opencode/agents/sales/pipeline-analyst.md +10 -0
  177. package/opencode/agents/support/cco.md +10 -0
  178. package/opencode/agents/support/community-manager.md +10 -0
  179. package/opencode/agents/support/ticket-triage.md +10 -0
  180. package/opencode/commands/go.md +10 -0
  181. package/opencode/commands/help.md +10 -0
  182. package/opencode/commands/sync.md +10 -0
  183. package/opencode/commands/version.md +11 -0
  184. package/opencode/opencode.json +8 -0
  185. package/opencode/plugin.ts +493 -0
  186. package/package.json +36 -4
  187. package/scripts/admin-merge-ready.sh +545 -0
  188. package/scripts/admin-merge-ready.test.sh +753 -0
  189. package/scripts/affected-tests.sh +908 -0
  190. package/scripts/affected-tests.test.sh +1797 -0
  191. package/scripts/alpha-metrics.sh +78 -0
  192. package/scripts/alpha-metrics.test.sh +115 -0
  193. package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
  194. package/scripts/audit-flag-flip.sh +107 -0
  195. package/scripts/check-red-on-main.sh +316 -0
  196. package/scripts/ci-head-verdict.sh +363 -0
  197. package/scripts/cloud-detect.sh +193 -0
  198. package/scripts/delegation-verify.sh +657 -0
  199. package/scripts/delegation-verify.test.sh +1424 -0
  200. package/scripts/deploy-arm.sh +475 -0
  201. package/scripts/domain-model-drift.sh +419 -0
  202. package/scripts/emit-decision.sh +144 -0
  203. package/scripts/emit-decision.test.sh +144 -0
  204. package/scripts/ext-filter-divergence-corpus.txt +15 -0
  205. package/scripts/ext-filter-divergence.sh +189 -0
  206. package/scripts/generate-c4-from-components.ts +442 -0
  207. package/scripts/grok-fidelity-gate.sh +68 -0
  208. package/scripts/grok-pre-push-gate.sh +232 -0
  209. package/scripts/harness-discovery-smoke.ts +906 -0
  210. package/scripts/harness-parity-census.ts +92 -0
  211. package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
  212. package/scripts/install-opencode-adapter.ts +520 -0
  213. package/scripts/lib/affected-tests/common.sh +365 -0
  214. package/scripts/lib/affected-tests/go.sh +157 -0
  215. package/scripts/lib/affected-tests/js.sh +188 -0
  216. package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
  217. package/scripts/lib/affected-tests/python.sh +185 -0
  218. package/scripts/lib/context-sanitize.sh +49 -0
  219. package/scripts/lib/domain-model-lib.sh +180 -0
  220. package/scripts/lib/ext-filter-grammar.tsv +34 -0
  221. package/scripts/lib/operator-script.sh +1236 -0
  222. package/scripts/lib/proc.sh +580 -0
  223. package/scripts/lib/session-state.sh +748 -0
  224. package/scripts/lib/tmp-classify.sh +843 -0
  225. package/scripts/lib/wrapper-boundary.sh +47 -0
  226. package/scripts/lint-ratchet.py +1547 -0
  227. package/scripts/monitor-pr-checks.sh +441 -0
  228. package/scripts/pipeline-tally.sh +756 -0
  229. package/scripts/pipeline-tally.test.sh +740 -0
  230. package/scripts/plugin-version.sh +528 -0
  231. package/scripts/precommit-guard.sh +113 -0
  232. package/scripts/precommit-guard.test.sh +254 -0
  233. package/scripts/reconcile-live-heartbeats.ts +705 -0
  234. package/scripts/render-c4-model.sh +217 -0
  235. package/scripts/resolve-git-root.sh +55 -0
  236. package/scripts/resolve-regenerable-conflicts.sh +363 -0
  237. package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
  238. package/scripts/ruff-requirements.txt +22 -0
  239. package/scripts/run-in-pid-namespace.sh +98 -0
  240. package/scripts/run-in-pid-namespace.test.sh +290 -0
  241. package/scripts/scan-ancestor-signal-helpers.py +556 -0
  242. package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
  243. package/scripts/setup-ralph-loop.sh +238 -0
  244. package/scripts/sync-cursor-name-map.ts +316 -0
  245. package/scripts/sync-grok-agent-compat.ts +188 -0
  246. package/scripts/sync-npm-package.ts +178 -0
  247. package/scripts/sync-opencode-adapter.ts +479 -0
  248. package/scripts/sync-pr-behind.sh +534 -0
  249. package/scripts/sync-pr-behind.test.sh +252 -0
  250. package/scripts/taste-profile-update.sh +180 -0
  251. package/scripts/taste-profile-update.test.sh +167 -0
  252. package/scripts/write-budget-marker.sh +23 -0
  253. package/scripts/write-kb-coverage.ts +113 -0
  254. package/skills/admin-ip-refresh/SKILL.md +81 -0
  255. package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
  256. package/skills/agent-browser/SKILL.md +698 -0
  257. package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
  258. package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
  259. package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
  260. package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
  261. package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
  262. package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
  263. package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
  264. package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
  265. package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
  266. package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
  267. package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
  268. package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
  269. package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
  270. package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
  271. package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
  272. package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
  273. package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
  274. package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
  275. package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
  276. package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
  277. package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
  278. package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
  279. package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
  280. package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
  281. package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
  282. package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
  283. package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
  284. package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
  285. package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
  286. package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
  287. package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
  288. package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
  289. package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
  290. package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
  291. package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
  292. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
  293. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
  294. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
  295. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
  296. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
  297. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
  298. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
  299. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
  300. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
  301. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
  302. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
  303. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
  304. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
  305. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
  306. package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
  307. package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
  308. package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
  309. package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
  310. package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
  311. package/skills/agent-native-architecture/SKILL.md +479 -0
  312. package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
  313. package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
  314. package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
  315. package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
  316. package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
  317. package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
  318. package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
  319. package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
  320. package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
  321. package/skills/agent-native-architecture/references/product-implications.md +478 -0
  322. package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
  323. package/skills/agent-native-architecture/references/self-modification.md +294 -0
  324. package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
  325. package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
  326. package/skills/agent-native-audit/SKILL.md +300 -0
  327. package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
  328. package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
  329. package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
  330. package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
  331. package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
  332. package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
  333. package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
  334. package/skills/architecture/SKILL.md +436 -0
  335. package/skills/architecture/references/adr-template.md +154 -0
  336. package/skills/architecture/references/likec4-reference.md +136 -0
  337. package/skills/architecture/references/nfr-reference.md +126 -0
  338. package/skills/archive-kb/SKILL.md +86 -0
  339. package/skills/archive-kb/scripts/archive-kb.sh +300 -0
  340. package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
  341. package/skills/atdd-developer/SKILL.md +65 -0
  342. package/skills/brainstorm/SKILL.md +701 -0
  343. package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
  344. package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
  345. package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
  346. package/skills/brainstorm/references/ui-surface-terms.md +42 -0
  347. package/skills/brainstorm-techniques/SKILL.md +231 -0
  348. package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
  349. package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
  350. package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
  351. package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
  352. package/skills/campaign-calendar/SKILL.md +145 -0
  353. package/skills/cf-token-scope/SKILL.md +164 -0
  354. package/skills/cf-token-scope/references/widen-playbook.md +114 -0
  355. package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
  356. package/skills/changelog/SKILL.md +142 -0
  357. package/skills/code-to-prd/SKILL.md +66 -0
  358. package/skills/code-to-prd/references/banner-template.md +12 -0
  359. package/skills/code-to-prd/references/prd-template.md +41 -0
  360. package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
  361. package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
  362. package/skills/code-to-prd/test/fixture/.env.example +7 -0
  363. package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
  364. package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
  365. package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
  366. package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
  367. package/skills/code-to-prd/test/fixture/package.json +6 -0
  368. package/skills/cohort-status/SKILL.md +62 -0
  369. package/skills/community/SKILL.md +210 -0
  370. package/skills/community/scripts/bsky-community.sh +644 -0
  371. package/skills/community/scripts/bsky-setup.sh +631 -0
  372. package/skills/community/scripts/community-router.sh +93 -0
  373. package/skills/community/scripts/discord-community.sh +487 -0
  374. package/skills/community/scripts/discord-setup.sh +784 -0
  375. package/skills/community/scripts/github-community.sh +706 -0
  376. package/skills/community/scripts/hn-community.sh +233 -0
  377. package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
  378. package/skills/community/scripts/linkedin-community.sh +750 -0
  379. package/skills/community/scripts/linkedin-setup.sh +758 -0
  380. package/skills/community/scripts/x-community.sh +890 -0
  381. package/skills/community/scripts/x-setup.sh +713 -0
  382. package/skills/community/test/community-argv.test.sh +2922 -0
  383. package/skills/community/test/github-community.test.sh +981 -0
  384. package/skills/competitive-analysis/SKILL.md +69 -0
  385. package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
  386. package/skills/compound/SKILL.md +673 -0
  387. package/skills/compound/scripts/token-efficiency-report.sh +334 -0
  388. package/skills/compound/test/phase-16.test.sh +379 -0
  389. package/skills/compound-capture/SKILL.md +791 -0
  390. package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
  391. package/skills/compound-capture/assets/resolution-template.md +116 -0
  392. package/skills/compound-capture/references/yaml-schema.md +67 -0
  393. package/skills/compound-capture/schema.yaml +181 -0
  394. package/skills/constraint-scaffold/SKILL.md +175 -0
  395. package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
  396. package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
  397. package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
  398. package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
  399. package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
  400. package/skills/constraint-scaffold/references/shared-runner.template +135 -0
  401. package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
  402. package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
  403. package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
  404. package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
  405. package/skills/constraint-scaffold/test/generator.test.sh +93 -0
  406. package/skills/constraint-scaffold/test/parity.test.sh +285 -0
  407. package/skills/content-writer/SKILL.md +242 -0
  408. package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
  409. package/skills/cron-delete/SKILL.md +56 -0
  410. package/skills/cron-list/SKILL.md +54 -0
  411. package/skills/deepen-plan/SKILL.md +937 -0
  412. package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
  413. package/skills/deploy/SKILL.md +115 -0
  414. package/skills/deploy/references/hetzner-setup.md +65 -0
  415. package/skills/deploy/scripts/deploy.sh +37 -0
  416. package/skills/deploy-docs/SKILL.md +95 -0
  417. package/skills/dhh-rails-style/SKILL.md +203 -0
  418. package/skills/dhh-rails-style/references/architecture.md +717 -0
  419. package/skills/dhh-rails-style/references/controllers.md +323 -0
  420. package/skills/dhh-rails-style/references/frontend.md +556 -0
  421. package/skills/dhh-rails-style/references/gems.md +316 -0
  422. package/skills/dhh-rails-style/references/models.md +388 -0
  423. package/skills/dhh-rails-style/references/testing.md +354 -0
  424. package/skills/discord-content/SKILL.md +126 -0
  425. package/skills/docs-site/SKILL.md +214 -0
  426. package/skills/drain-labeled-backlog/SKILL.md +203 -0
  427. package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
  428. package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
  429. package/skills/drain-prs/SKILL.md +142 -0
  430. package/skills/drain-prs/scripts/triage-prs.sh +192 -0
  431. package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
  432. package/skills/dspy-ruby/SKILL.md +634 -0
  433. package/skills/dspy-ruby/assets/config-template.rb +359 -0
  434. package/skills/dspy-ruby/assets/module-template.rb +326 -0
  435. package/skills/dspy-ruby/assets/signature-template.rb +143 -0
  436. package/skills/dspy-ruby/references/core-concepts.md +268 -0
  437. package/skills/dspy-ruby/references/optimization.md +623 -0
  438. package/skills/dspy-ruby/references/providers.md +335 -0
  439. package/skills/eval-harness/README.md +194 -0
  440. package/skills/eval-harness/SKILL.md +157 -0
  441. package/skills/eval-harness/enums/go-routes.json +13 -0
  442. package/skills/eval-harness/enums/incident-threshold.json +5 -0
  443. package/skills/eval-harness/enums/lane.json +5 -0
  444. package/skills/eval-harness/enums/tool-selection.json +20 -0
  445. package/skills/eval-harness/enums/triage-levels.json +5 -0
  446. package/skills/eval-harness/gated-skills.json +34 -0
  447. package/skills/eval-harness/models.generated.json +5 -0
  448. package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
  449. package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
  450. package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
  451. package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
  452. package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
  453. package/skills/eval-harness/prompts/go-baseline.txt +6 -0
  454. package/skills/eval-harness/prompts/go-skill.txt +21 -0
  455. package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
  456. package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
  457. package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
  458. package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
  459. package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
  460. package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
  461. package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
  462. package/skills/eval-harness/prompts/triage-skill.txt +10 -0
  463. package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
  464. package/skills/eval-harness/scripts/extract-block.cjs +87 -0
  465. package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
  466. package/skills/eval-harness/scripts/gen-models.sh +41 -0
  467. package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
  468. package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
  469. package/skills/eval-harness/scripts/parse-label.cjs +93 -0
  470. package/skills/eval-harness/scripts/verdict.cjs +132 -0
  471. package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
  472. package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
  473. package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
  474. package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
  475. package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
  476. package/skills/eval-harness/test/eval-gate.test.sh +132 -0
  477. package/skills/eval-harness/test/extract-block.test.sh +87 -0
  478. package/skills/eval-harness/test/gate-classification.test.sh +77 -0
  479. package/skills/eval-harness/test/gen-models.test.sh +75 -0
  480. package/skills/eval-harness/test/measure-classification.test.sh +74 -0
  481. package/skills/eval-harness/test/parse-label.test.sh +129 -0
  482. package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
  483. package/skills/eval-harness/test/verdict.test.sh +123 -0
  484. package/skills/every-style-editor/SKILL.md +142 -0
  485. package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
  486. package/skills/feature-tweet/SKILL.md +199 -0
  487. package/skills/feature-video/SKILL.md +412 -0
  488. package/skills/feature-video/scripts/check_deps.sh +281 -0
  489. package/skills/file-todos/SKILL.md +267 -0
  490. package/skills/file-todos/assets/todo-template.md +166 -0
  491. package/skills/fix-issue/SKILL.md +278 -0
  492. package/skills/fix-issue/references/agent-authored-exclusion.md +118 -0
  493. package/skills/fix-issue/references/exclude-label-jq-snippet.md +96 -0
  494. package/skills/flag-bootstrap/SETUP.md +142 -0
  495. package/skills/flag-create/SKILL.md +145 -0
  496. package/skills/flag-create/scripts/create.sh +273 -0
  497. package/skills/flag-delete/SKILL.md +167 -0
  498. package/skills/flag-delete/scripts/delete.sh +288 -0
  499. package/skills/flag-list/SKILL.md +99 -0
  500. package/skills/flag-list/scripts/list.sh +275 -0
  501. package/skills/flag-set-role/SKILL.md +229 -0
  502. package/skills/flag-set-role/scripts/flip.sh +774 -0
  503. package/skills/frontend-anti-slop/SKILL.md +106 -0
  504. package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
  505. package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
  506. package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
  507. package/skills/frontend-design/SKILL.md +77 -0
  508. package/skills/gdpr-gate/NOTICE +136 -0
  509. package/skills/gdpr-gate/SKILL.md +341 -0
  510. package/skills/gdpr-gate/references/fields.md +160 -0
  511. package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
  512. package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
  513. package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
  514. package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
  515. package/skills/gdpr-gate/references/layers/frontend.md +249 -0
  516. package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
  517. package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
  518. package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
  519. package/skills/gdpr-gate/references/legal-consent.md +140 -0
  520. package/skills/gdpr-gate/references/non-negotiables.md +60 -0
  521. package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
  522. package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
  523. package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
  524. package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
  525. package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
  526. package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
  527. package/skills/gemini-imagegen/SKILL.md +283 -0
  528. package/skills/gemini-imagegen/requirements.txt +5 -0
  529. package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
  530. package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
  531. package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
  532. package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
  533. package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
  534. package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
  535. package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
  536. package/skills/git-worktree/SKILL.md +534 -0
  537. package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
  538. package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
  539. package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
  540. package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
  541. package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
  542. package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
  543. package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
  544. package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
  545. package/skills/go/SKILL.md +54 -0
  546. package/skills/growth/SKILL.md +164 -0
  547. package/skills/harvest-debt/SKILL.md +78 -0
  548. package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
  549. package/skills/heal-skill/SKILL.md +173 -0
  550. package/skills/help/SKILL.md +46 -0
  551. package/skills/incident/NOTICE +39 -0
  552. package/skills/incident/SKILL.md +395 -0
  553. package/skills/incident/scripts/dry-run.sh +448 -0
  554. package/skills/incident/scripts/redact-engine.py +412 -0
  555. package/skills/incident/scripts/redact-sentinel.sh +44 -0
  556. package/skills/incident/templates/pir.md +139 -0
  557. package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
  558. package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
  559. package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
  560. package/skills/incident/test/fixtures/positive-corpus.md +87 -0
  561. package/skills/incident/test/redact-sentinel.test.sh +1420 -0
  562. package/skills/invoice/SKILL.md +206 -0
  563. package/skills/kb-glossary/SKILL.md +71 -0
  564. package/skills/kb-glossary/references/glossary-format.md +111 -0
  565. package/skills/kb-glossary/references/rejected-request-register.md +115 -0
  566. package/skills/kb-search/SKILL.md +276 -0
  567. package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
  568. package/skills/legal-audit/SKILL.md +161 -0
  569. package/skills/legal-generate/NOTICE +242 -0
  570. package/skills/legal-generate/SKILL.md +244 -0
  571. package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
  572. package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
  573. package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
  574. package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
  575. package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
  576. package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
  577. package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
  578. package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
  579. package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
  580. package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
  581. package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
  582. package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
  583. package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
  584. package/skills/linear-fetch/SKILL.md +247 -0
  585. package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
  586. package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
  587. package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
  588. package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
  589. package/skills/linear-fetch/test/parity.test.sh +112 -0
  590. package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
  591. package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
  592. package/skills/merge-pr/SKILL.md +668 -0
  593. package/skills/model-launch-review/SKILL.md +255 -0
  594. package/skills/model-launch-review/scripts/audit-models.sh +501 -0
  595. package/skills/one-shot/SKILL.md +316 -0
  596. package/skills/one-shot/references/token-discipline.md +74 -0
  597. package/skills/operator-bootstrap/SKILL.md +412 -0
  598. package/skills/operator-bootstrap/template.sh +439 -0
  599. package/skills/operator-digest/SKILL.md +287 -0
  600. package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
  601. package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
  602. package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
  603. package/skills/operator-rephrase/SKILL.md +98 -0
  604. package/skills/pencil-setup/SKILL.md +201 -0
  605. package/skills/pencil-setup/scripts/check_deps.sh +556 -0
  606. package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
  607. package/skills/pencil-setup/scripts/package-lock.json +1172 -0
  608. package/skills/pencil-setup/scripts/package.json +14 -0
  609. package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
  610. package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
  611. package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
  612. package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
  613. package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
  614. package/skills/plan/SKILL.md +1140 -0
  615. package/skills/plan/references/differential-migration-testing.md +185 -0
  616. package/skills/plan/references/plan-community-discovery.md +42 -0
  617. package/skills/plan/references/plan-founder-check.md +137 -0
  618. package/skills/plan/references/plan-functional-overlap.md +25 -0
  619. package/skills/plan/references/plan-host-fanout.md +51 -0
  620. package/skills/plan/references/plan-issue-templates.md +779 -0
  621. package/skills/plan/references/plan-network-outage-checklist.md +131 -0
  622. package/skills/plan/references/plan-scope-check.md +126 -0
  623. package/skills/plan/references/plan-sharp-edges.md +325 -0
  624. package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
  625. package/skills/plan/references/webapp-cwv-observability.md +143 -0
  626. package/skills/plan-review/SKILL.md +91 -0
  627. package/skills/plan-review/lib/named-panel.mjs +58 -0
  628. package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
  629. package/skills/postmerge/SKILL.md +642 -0
  630. package/skills/postmerge/references/deploy-status-debugging.md +138 -0
  631. package/skills/postmerge/references/graceful-degradation.md +20 -0
  632. package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
  633. package/skills/preflight/SKILL.md +1553 -0
  634. package/skills/preflight/references/check-13-founder-check.md +286 -0
  635. package/skills/preflight/scripts/founder-check.py +1640 -0
  636. package/skills/preflight/scripts/parse-form-a.awk +107 -0
  637. package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
  638. package/skills/product-roadmap/SKILL.md +357 -0
  639. package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
  640. package/skills/provision-cloudflare/SKILL.md +67 -0
  641. package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
  642. package/skills/provision-doppler/SKILL.md +58 -0
  643. package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
  644. package/skills/provision-github/SKILL.md +59 -0
  645. package/skills/provision-github/scripts/provision-github.sh +300 -0
  646. package/skills/provision-hetzner/SKILL.md +76 -0
  647. package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
  648. package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
  649. package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
  650. package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
  651. package/skills/qa/SKILL.md +263 -0
  652. package/skills/qa/references/browser-preflight.md +22 -0
  653. package/skills/questionnaire-generate/SKILL.md +328 -0
  654. package/skills/questionnaire-generate/references/questionnaire.template +60 -0
  655. package/skills/rclone/SKILL.md +162 -0
  656. package/skills/rclone/scripts/check_setup.sh +63 -0
  657. package/skills/release-announce/SKILL.md +65 -0
  658. package/skills/release-docs/SKILL.md +92 -0
  659. package/skills/reproduce-bug/SKILL.md +358 -0
  660. package/skills/resolve-debt/SKILL.md +85 -0
  661. package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
  662. package/skills/resolve-parallel/SKILL.md +45 -0
  663. package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
  664. package/skills/resolve-pr-parallel/SKILL.md +68 -0
  665. package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
  666. package/skills/resolve-todo-parallel/SKILL.md +57 -0
  667. package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
  668. package/skills/review/SKILL.md +1621 -0
  669. package/skills/review/references/anti-slop-scanner-hook.md +40 -0
  670. package/skills/review/references/defect-classes-migrations.md +9 -0
  671. package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
  672. package/skills/review/references/review-e2e-testing.md +116 -0
  673. package/skills/review/references/review-todo-structure.md +165 -0
  674. package/skills/review/references/risk-tier-and-fix-rounds.md +95 -0
  675. package/skills/review/references/semgrep-custom-rules.yaml +174 -0
  676. package/skills/review/references/ultrathink-phases.md +98 -0
  677. package/skills/review/references/wfs.md +6 -0
  678. package/skills/review/scripts/emit-review-trailer.sh +499 -0
  679. package/skills/review/scripts/ensure-semgrep.sh +99 -0
  680. package/skills/review/scripts/fix-round-seats.sh +197 -0
  681. package/skills/review/test/emit-review-trailer.test.sh +387 -0
  682. package/skills/review/test/ensure-semgrep.test.sh +111 -0
  683. package/skills/review/test/fix-round-seats.test.sh +237 -0
  684. package/skills/review/workflows/README.md +147 -0
  685. package/skills/review/workflows/review.workflow.js +667 -0
  686. package/skills/schedule/SKILL.md +796 -0
  687. package/skills/seo-aeo/SKILL.md +139 -0
  688. package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
  689. package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
  690. package/skills/ship/SKILL.md +3022 -0
  691. package/skills/ship/references/adr-ordinal-collision.md +47 -0
  692. package/skills/ship/references/affected-gate-contract.md +115 -0
  693. package/skills/ship/references/ci-run-diagnosis.md +29 -0
  694. package/skills/ship/references/ci-workflow-authoring.md +68 -0
  695. package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
  696. package/skills/ship/references/cto-ruling-armed-push.md +5 -0
  697. package/skills/ship/references/decision-challenges-render.md +71 -0
  698. package/skills/ship/references/detached-battery-verdict.md +13 -0
  699. package/skills/ship/references/feature-tweet-draft.md +42 -0
  700. package/skills/ship/references/followthrough-issue-body-template.md +47 -0
  701. package/skills/ship/references/followthrough-stub-template.sh +92 -0
  702. package/skills/ship/references/merge-queue-dequeue.md +39 -0
  703. package/skills/ship/references/operator-holds.md +149 -0
  704. package/skills/ship/references/pipeline-tally-render.md +43 -0
  705. package/skills/ship/references/pr-overlap.md +153 -0
  706. package/skills/ship/references/queue-mode.md +7 -0
  707. package/skills/ship/references/ready-run-wait.md +36 -0
  708. package/skills/ship/references/red-on-main-quarantine.md +110 -0
  709. package/skills/ship/references/register-update-pr-pattern.md +88 -0
  710. package/skills/ship/references/settle-then-admin-merge.md +130 -0
  711. package/skills/ship/references/supabase-column-probe.md +13 -0
  712. package/skills/ship/scripts/auto-close-scan.sh +76 -0
  713. package/skills/ship/scripts/battery-owed.sh +403 -0
  714. package/skills/ship/scripts/hold-gate-eval.sh +410 -0
  715. package/skills/ship/scripts/net-issue-flow.sh +665 -0
  716. package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
  717. package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
  718. package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
  719. package/skills/skill-creator/SKILL.md +299 -0
  720. package/skills/skill-creator/references/api-security.md +248 -0
  721. package/skills/skill-creator/references/authoring-levers.md +110 -0
  722. package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
  723. package/skills/skill-creator/references/best-practices.md +431 -0
  724. package/skills/skill-creator/references/common-patterns.md +639 -0
  725. package/skills/skill-creator/references/core-principles.md +193 -0
  726. package/skills/skill-creator/references/executable-code.md +188 -0
  727. package/skills/skill-creator/references/iteration-and-testing.md +509 -0
  728. package/skills/skill-creator/references/official-spec.md +193 -0
  729. package/skills/skill-creator/references/recommended-structure.md +180 -0
  730. package/skills/skill-creator/references/skill-structure.md +396 -0
  731. package/skills/skill-creator/references/using-scripts.md +122 -0
  732. package/skills/skill-creator/references/using-templates.md +120 -0
  733. package/skills/skill-creator/references/workflows-and-validation.md +541 -0
  734. package/skills/skill-creator/scripts/init_skill.py +322 -0
  735. package/skills/skill-creator/scripts/package_skill.py +110 -0
  736. package/skills/skill-creator/scripts/quick_validate.py +64 -0
  737. package/skills/skill-creator/templates/router-skill.md +73 -0
  738. package/skills/skill-creator/templates/simple-skill.md +34 -0
  739. package/skills/skill-creator/workflows/add-reference.md +96 -0
  740. package/skills/skill-creator/workflows/add-script.md +104 -0
  741. package/skills/skill-creator/workflows/add-template.md +83 -0
  742. package/skills/skill-creator/workflows/add-workflow.md +128 -0
  743. package/skills/skill-creator/workflows/audit-skill.md +159 -0
  744. package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
  745. package/skills/skill-creator/workflows/create-new-skill.md +207 -0
  746. package/skills/skill-creator/workflows/get-guidance.md +134 -0
  747. package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
  748. package/skills/skill-creator/workflows/verify-skill.md +226 -0
  749. package/skills/skill-security-scan/SKILL.md +145 -0
  750. package/skills/skill-security-scan/references/disclaimer.md +21 -0
  751. package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
  752. package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
  753. package/skills/skill-security-scan/references/override-mechanism.md +171 -0
  754. package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
  755. package/skills/skill-security-scan/references/regex-patterns.md +136 -0
  756. package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
  757. package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
  758. package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
  759. package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
  760. package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
  761. package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
  762. package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
  763. package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
  764. package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
  765. package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
  766. package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
  767. package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
  768. package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
  769. package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
  770. package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
  771. package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
  772. package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
  773. package/skills/skill-security-scan/scripts/lib.sh +197 -0
  774. package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
  775. package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
  776. package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
  777. package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
  778. package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
  779. package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
  780. package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
  781. package/skills/social-distribute/SKILL.md +485 -0
  782. package/skills/spec-templates/SKILL.md +274 -0
  783. package/skills/sync/SKILL.md +49 -0
  784. package/skills/test-browser/SKILL.md +464 -0
  785. package/skills/test-browser/references/feature-map.md +161 -0
  786. package/skills/test-fix-loop/SKILL.md +159 -0
  787. package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
  788. package/skills/triage/SKILL.md +402 -0
  789. package/skills/trigger-cron/SKILL.md +136 -0
  790. package/skills/trigger-cron/scripts/trigger.sh +198 -0
  791. package/skills/user-set-role/SKILL.md +147 -0
  792. package/skills/user-set-role/scripts/set-role.sh +218 -0
  793. package/skills/user-story-writer/SKILL.md +77 -0
  794. package/skills/ux-audit/SKILL.md +251 -0
  795. package/skills/ux-audit/references/finding.schema.json +62 -0
  796. package/skills/ux-audit/references/route-list.yaml +95 -0
  797. package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
  798. package/skills/ux-audit/scripts/bot-signin.ts +135 -0
  799. package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
  800. package/skills/work/SKILL.md +1479 -0
  801. package/skills/work/references/end-of-work-resume.md +7 -0
  802. package/skills/work/references/hook-test-main-cwd.md +24 -0
  803. package/skills/work/references/key-principles.md +83 -0
  804. package/skills/work/references/property-testing.md +122 -0
  805. package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
  806. package/skills/work/references/work-agent-teams.md +97 -0
  807. package/skills/work/references/work-lifecycle-parallel.md +147 -0
  808. package/skills/work/references/work-lockfile-bumps.md +97 -0
  809. package/skills/work/references/work-scratch-sandboxes.md +212 -0
  810. package/skills/work/references/work-subagent-fanout.md +61 -0
  811. package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
  812. package/skills/xcode-test/SKILL.md +360 -0
@@ -0,0 +1,69 @@
1
+ name: constraint-gates (L1 import boundary)
2
+
3
+ # GENERATED by `plugins/soleur/skills/constraint-scaffold` (ADR-071). Always-runs
4
+ # + internal path-check: the job fires on every PR and reports a real conclusion,
5
+ # but exits 0 fast when the target app is untouched — so a required check never
6
+ # deadlocks pending-forever on a `paths:` filter. The agent — never the founder —
7
+ # owns this file. Recovery is automatic: when this gate trips on a PR, the two-stage
8
+ # auto-recovery dispatcher (fix-constraints-stage-a/b, ADR-074) fixes the import and
9
+ # opens a follow-up PR if it is auto-fixable; otherwise a maintainer re-runs the
10
+ # constraint-scaffold skill locally (or runs `--refresh-baseline`).
11
+
12
+ on:
13
+ pull_request:
14
+ types: [opened, synchronize, reopened]
15
+
16
+ permissions:
17
+ contents: read
18
+
19
+ # Stateless lint gate — a mid-run cancel leaves nothing half-written; a
20
+ # superseding PR push makes every earlier run's verdict stale anyway. The
21
+ # SHA arm is dormant (no push trigger today): if one is ever added, `main`
22
+ # runs still never cancel each other.
23
+ concurrency:
24
+ group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.ref || github.sha }}
25
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
26
+
27
+ jobs:
28
+ constraint-gates:
29
+ name: L1 import-boundary gate
30
+ runs-on: ubuntu-latest
31
+ steps:
32
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
33
+ with:
34
+ fetch-depth: 0
35
+
36
+ - name: Detect target changes
37
+ id: changed
38
+ env:
39
+ BASE_REF: ${{ github.event.pull_request.base.ref }}
40
+ run: |
41
+ set -euo pipefail
42
+ # No --depth here: a shallow fetch can leave the merge-base unreachable,
43
+ # making the three-dot diff fail under `set -e` and redden every
44
+ # non-target PR. checkout already used fetch-depth: 0 (full history).
45
+ git fetch --no-tags origin "$BASE_REF"
46
+ changed_files=$(git -c core.quotePath=false diff --name-only "origin/${BASE_REF}...HEAD")
47
+ if grep -qE '^__TARGET_DIR__/' <<<"$changed_files"; then
48
+ echo "changed=true" >> "$GITHUB_OUTPUT"
49
+ else
50
+ echo "changed=false" >> "$GITHUB_OUTPUT"
51
+ echo "__TARGET_DIR__/** unchanged in this PR — constraint-gates passes (no-op)."
52
+ fi
53
+
54
+ - name: Setup Node.js
55
+ if: steps.changed.outputs.changed == 'true'
56
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
57
+ with:
58
+ node-version: 22
59
+ cache: npm
60
+ cache-dependency-path: __TARGET_DIR__/package-lock.json
61
+
62
+ - name: Install dependencies
63
+ if: steps.changed.outputs.changed == 'true'
64
+ working-directory: __TARGET_DIR__
65
+ run: npm ci --ignore-scripts
66
+
67
+ - name: Run constraint gates (fail-closed)
68
+ if: steps.changed.outputs.changed == 'true'
69
+ run: bash __TARGET_DIR__/scripts/constraint-gates.sh
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Layer-1 constraint gate — client -> server-secret import boundary.
3
+ *
4
+ * GENERATED by `plugins/soleur/skills/constraint-scaffold` (ADR-071, Option D).
5
+ * The agent — never the founder — owns this file. Recovery is automatic: when
6
+ * this gate trips on a PR, the two-stage auto-recovery dispatcher
7
+ * (fix-constraints-stage-a/b, ADR-074) fixes the offending import and opens a
8
+ * follow-up PR if it is auto-fixable; a real leak the agent cannot fix is
9
+ * surfaced for a maintainer (who re-runs the constraint-scaffold skill locally,
10
+ * or runs `--refresh-baseline`). The gate stays informational/non-blocking. Do NOT hand-edit.
11
+ *
12
+ * Mechanism: dependency-cruiser matches modules by PATH and cannot see the
13
+ * `"use client"` directive, so this config is executable CommonJS that computes
14
+ * the client-module `from` set at require-time by scanning `app/**` + `components/**`
15
+ * for a leading `"use client"` directive. The set is RECOMPUTED every run and
16
+ * NEVER committed as a static list — a stale list would be blind to a newly added
17
+ * client file (the exact leak this gate exists to catch). An empty from-set while
18
+ * `"use client"` files exist is a HARD ERROR, not a silently-disabled rule.
19
+ *
20
+ * Two rules (ADR-071 + the 2026-07-01 #5777 amendment):
21
+ * 1. `no-client-to-server-secret` — DIRECT edges: a "use client" module
22
+ * value-imports `server/**` directly.
23
+ * 2. `no-client-to-server-secret-transitive` — TRANSITIVE reach: a "use client"
24
+ * module reaches `server/**` through a chain of value imports (e.g. a
25
+ * non-client `lib/` helper that value-imports a server secret). This is the
26
+ * dependency hop the direct rule is blind to (#5777, NG5 of #5765).
27
+ *
28
+ * `options.tsPreCompilationDeps` is `false` (v1 set it `true`): dependency-cruiser
29
+ * v16 `reachable` rules are schema-locked to `{path,pathNot,reachable}` and CANNOT
30
+ * filter `dependencyTypesNot` per-rule, so the ONLY way to keep the transitive rule
31
+ * from following a build-time-erased `import type` hop is to elide type-only edges
32
+ * from the graph GLOBALLY. With type-only edges gone, the direct rule no longer
33
+ * needs `dependencyTypesNot:["type-only"]` (its violation set is byte-identical
34
+ * before/after the flip — proven at build time, locked by boundary.test.sh). Both
35
+ * rules therefore ignore type-only imports for free. See ADR-071 §Amendment 2026-07-01.
36
+ */
37
+ const fs = require("fs");
38
+ const path = require("path");
39
+
40
+ const ROOT = __dirname;
41
+ const CLIENT_DIRS = ["app", "components"];
42
+ const SOURCE_EXT = /\.(?:tsx?|jsx?|mjs|cjs)$/;
43
+ // The secret set: the whole server tree is server-only (reads server-only secrets).
44
+ const SECRET_PATH = "^server/";
45
+ // Value-safe server modules the TRANSITIVE rule excludes via `to.pathNot`. These
46
+ // carry NO secret values — they are code-static registries / editorial metadata a
47
+ // client may legitimately reach through a helper:
48
+ // server/domain-leaders.ts — static leader array, no secrets
49
+ // server/providers.ts — env-var NAMES as metadata (never reads process.env)
50
+ // server/team-names-validation.ts — pure validation, no secrets
51
+ // server/scope-grants/action-class-map.ts — code-static action-class registry (no imports, no env)
52
+ // COUPLING: this is the SAME "known value-safe server modules" set the DIRECT rule
53
+ // grandfathers via its baseline (.dependency-cruiser-known-violations.json). Two
54
+ // hand-maintained copies that can drift — a future editor MUST update both, and any
55
+ // module added here MUST be security-reviewed value-safe (no process.env value read,
56
+ // no secret import) and covered by the boundary.test.sh drift guard (D4). Excluding a
57
+ // module here does NOT blind a client to OTHER server modules (it is a `to` filter,
58
+ // never a `from` filter). See ADR-071 §Amendment 2026-07-01 and the D3c drift guard.
59
+ // SOLEUR-DEBT: pathNot allowlist is a hand-maintained fail-open backstopped only by the
60
+ // D4 content-invariant drift guard; relocate these 4 modules OUT of server/** so the
61
+ // exclusion is enforced by LOCATION (deletes pathNot + the guard). Upgrade trigger: next
62
+ // time one of the 4 is edited to add a runtime value, OR a 5th value-safe module would
63
+ // need adding here. Tracked: #5850.
64
+ // End-anchored to the exact module file (`\.<ext>$`) — a bare trailing `\.` would
65
+ // prefix-match dot-suffixed SIBLINGS (`server/providers.server.ts`,
66
+ // `server/domain-leaders.data.ts`) and silently exempt them from the transitive
67
+ // rule too; those are natural Next.js names and must stay WATCHED.
68
+ const VALUE_SAFE_PATH =
69
+ "^server/(domain-leaders|providers|team-names-validation|scope-grants/action-class-map)\\.(?:[cm]?[jt]sx?)$";
70
+
71
+ function walk(dir, acc) {
72
+ let entries;
73
+ try {
74
+ entries = fs.readdirSync(dir, { withFileTypes: true });
75
+ } catch (e) {
76
+ if (e && e.code === "ENOENT") return acc; // dir absent is fine; cwd check below
77
+ throw e;
78
+ }
79
+ for (const entry of entries) {
80
+ if (entry.name === "node_modules" || entry.name === ".next") continue;
81
+ const full = path.join(dir, entry.name);
82
+ if (entry.isSymbolicLink()) {
83
+ // A symlinked source file is neither isFile() nor isDirectory() as a
84
+ // Dirent, so the branches below would silently DROP it from the scan —
85
+ // excluding it from the client from-set = fail open (a symlinked client
86
+ // module could leak unflagged). Resolve the link; hard-error on a
87
+ // symlinked source file rather than skipping it.
88
+ let target;
89
+ try {
90
+ target = fs.statSync(full); // follows the symlink
91
+ } catch {
92
+ continue; // broken/dangling link: not a readable source file
93
+ }
94
+ if (target.isFile() && SOURCE_EXT.test(entry.name)) {
95
+ throw new Error(
96
+ "constraint-scaffold: symlinked source file " +
97
+ full +
98
+ " — refusing to silently skip it (would fail the import-boundary scan open)",
99
+ );
100
+ }
101
+ continue; // symlinked directory / non-source: not scanned (out of v1 scope)
102
+ }
103
+ if (entry.isDirectory()) {
104
+ walk(full, acc);
105
+ } else if (entry.isFile() && SOURCE_EXT.test(entry.name)) {
106
+ acc.push(full);
107
+ }
108
+ }
109
+ return acc;
110
+ }
111
+
112
+ function isUseClient(file) {
113
+ let rest = fs.readFileSync(file, "utf8");
114
+ // Skip leading blank lines and leading comments before the directive. A
115
+ // license/eslint banner (`// ...` line-comment or `/* ... */` block-comment)
116
+ // before `"use client"` is valid Next.js; treating such a file as non-client
117
+ // would leave its server value-imports UNFLAGGED (a silent leak).
118
+ for (;;) {
119
+ rest = rest.replace(/^\s+/, "");
120
+ if (rest.startsWith("//")) {
121
+ const nl = rest.indexOf("\n");
122
+ if (nl === -1) return false;
123
+ rest = rest.slice(nl + 1);
124
+ continue;
125
+ }
126
+ if (rest.startsWith("/*")) {
127
+ const end = rest.indexOf("*/");
128
+ if (end === -1) return false;
129
+ rest = rest.slice(end + 2);
130
+ continue;
131
+ }
132
+ break;
133
+ }
134
+ // The directive, allowing a trailing `;` and/or a trailing line/block comment
135
+ // on the same line: `"use client"; // hydration`.
136
+ const firstLine = rest.split(/\r?\n/, 1)[0];
137
+ return /^(['"])use client\1\s*;?\s*(?:\/\/.*|\/\*.*)?$/.test(firstLine);
138
+ }
139
+
140
+ function reEscape(s) {
141
+ // Escape every regex metacharacter — route groups like `app/(dashboard)/`
142
+ // carry `(` / `)` and filenames carry `.`.
143
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
144
+ }
145
+
146
+ function computeClientFromSet() {
147
+ // A wrong cwd (config required from outside the target root) would make the
148
+ // whole scan blind. Require at least one client dir to exist — else hard fail.
149
+ const presentDirs = CLIENT_DIRS.filter((d) => fs.existsSync(path.join(ROOT, d)));
150
+ if (presentDirs.length === 0) {
151
+ throw new Error(
152
+ "constraint-scaffold: neither app/ nor components/ found under " +
153
+ ROOT +
154
+ " — gate cannot scan client modules (wrong cwd or empty input)",
155
+ );
156
+ }
157
+ const files = [];
158
+ for (const d of presentDirs) walk(path.join(ROOT, d), files);
159
+ const clientFiles = files.filter(isUseClient);
160
+ let fromSet = clientFiles.map((f) => {
161
+ const rel = path.relative(ROOT, f).split(path.sep).join("/");
162
+ return "^" + reEscape(rel) + "$";
163
+ });
164
+ // Test seam: simulate a scan-vs-map divergence (found client files but the
165
+ // mapped set came back empty) to prove the guard below is live. Test-only.
166
+ if (process.env.CONSTRAINT_SCAFFOLD_TEST_FORCE_EMPTY === "1") fromSet = [];
167
+ if (clientFiles.length > 0 && fromSet.length === 0) {
168
+ throw new Error(
169
+ "constraint-scaffold: client-module from-set is empty while " +
170
+ clientFiles.length +
171
+ ' "use client" files exist — refusing to emit a silently-disabled rule',
172
+ );
173
+ }
174
+ // No client modules at all: match nothing (a regex that never matches) rather
175
+ // than `[]`, which dependency-cruiser would treat as match-anything.
176
+ if (fromSet.length === 0) fromSet = ["(?!)"];
177
+ return fromSet;
178
+ }
179
+
180
+ // Compute the client-module from-set ONCE and share it across both rules so the
181
+ // fail-closed guards inside computeClientFromSet (empty-from-set hard error, the
182
+ // `(?!)` never-match sentinel, the "neither app/ nor components/" hard error, the
183
+ // symlinked-source hard error) apply to BOTH rules identically.
184
+ const clientFrom = computeClientFromSet();
185
+
186
+ module.exports = {
187
+ forbidden: [
188
+ {
189
+ name: "no-client-to-server-secret",
190
+ severity: "error",
191
+ comment:
192
+ 'A "use client" module must not take a value (non-type-only) import on the ' +
193
+ "server-only tree (server/**) — that ships a server secret into the browser " +
194
+ "bundle. Use `import type` for types, or move the value behind a server boundary.",
195
+ from: { path: clientFrom },
196
+ // No `dependencyTypesNot:["type-only"]` — type-only edges are elided globally
197
+ // by `tsPreCompilationDeps:false` (see header), so this rule flags exactly the
198
+ // value edges it flagged under v1's `true` + `dependencyTypesNot` (proven
199
+ // byte-identical; a flip regression could only SHRINK the value-edge set, so
200
+ // boundary.test.sh floors the direct baseline at >=10).
201
+ to: { path: SECRET_PATH },
202
+ },
203
+ {
204
+ name: "no-client-to-server-secret-transitive",
205
+ severity: "error",
206
+ comment:
207
+ 'A "use client" module must not TRANSITIVELY reach the server-only tree ' +
208
+ "(server/**) through a chain of value imports — a non-client helper that " +
209
+ "value-imports a server secret ships that secret into the browser bundle. " +
210
+ "Break the chain, or use `import type`. (Type-only hops are elided globally, " +
211
+ "so a client -> `import type` helper -> server chain does NOT flag.)",
212
+ from: { path: clientFrom },
213
+ // `pathNot` excludes the known value-safe server modules (VALUE_SAFE_PATH) so
214
+ // the reachable baseline stays EMPTY: dependency-cruiser softens `reachability`
215
+ // violations per-ORIGIN (`from`+rule name only, ignoring `to`/`via`), so
216
+ // baselining even one value-safe transitive path would blind that client to
217
+ // EVERY future transitive secret. We never baseline a reachability entry — we
218
+ // exclude value-safe targets here and FIX real leaks (D2/D3, ADR-071 amendment).
219
+ to: { path: SECRET_PATH, pathNot: VALUE_SAFE_PATH, reachable: true },
220
+ },
221
+ ],
222
+ options: {
223
+ tsConfig: { fileName: "tsconfig.json" },
224
+ // false (v1: true) — elide type-only edges globally so the reachable rule cannot
225
+ // follow a build-time-erased `import type` hop (its `to` is schema-locked and
226
+ // cannot filter dependency-types per-rule). The direct rule's output is unchanged.
227
+ tsPreCompilationDeps: false,
228
+ doNotFollow: { path: "node_modules" },
229
+ },
230
+ };
@@ -0,0 +1,240 @@
1
+ name: fix-constraints-stage-a
2
+
3
+ # Stage A — UNTRUSTED producer of the two-stage constraint-gate recovery (ADR-074, #5814).
4
+ # GENERATED by `plugins/soleur/skills/constraint-scaffold` into __TARGET_DIR__'s CI. The agent
5
+ # — never the founder — owns this file and gate maintenance. Runs on `pull_request` — NOT the
6
+ # privileged issue_comment / pull-request-target trigger — holds NO write token, and treats
7
+ # running PR-head code as
8
+ # the EXPECTED, safe thing (`pull_request` is CodeQL's designated untrusted context). If the
9
+ # L1 constraint-gate is red on a same-repo PR, it dispatches the agent to FIX it (fix-only —
10
+ # never grows the suppression baseline), re-verifies the gate is green, and uploads the fix
11
+ # as a full-post-image-contents artifact (per-file sha256 + meta.json) for the privileged
12
+ # Stage B (fix-constraints-stage-b, workflow_run) to apply. No commit, no push, no repo-write
13
+ # scope here.
14
+ #
15
+ # SECURITY: `permissions: contents: read` ONLY. The write capability lives exclusively in
16
+ # Stage B, which never executes this untrusted tree (Git Data API, no checkout/no apply). The
17
+ # name: field above is load-bearing — Stage B's `on: workflow_run: workflows:` matches it by
18
+ # NAME, not by filename; a rename here silently stops recovery. Manual retry: re-run this
19
+ # workflow (workflow_dispatch) or push a commit to the PR.
20
+
21
+ on:
22
+ pull_request:
23
+ types: [opened, synchronize, reopened]
24
+ paths:
25
+ - '__TARGET_DIR__/app/**'
26
+ - '__TARGET_DIR__/components/**'
27
+ - '__TARGET_DIR__/server/**'
28
+ - '__TARGET_DIR__/.dependency-cruiser.cjs'
29
+ - '__TARGET_DIR__/.dependency-cruiser-known-violations.json'
30
+ workflow_dispatch:
31
+
32
+ permissions:
33
+ contents: read
34
+
35
+ concurrency:
36
+ # One agent dispatch per head SHA — a push-storm on one PR can't fan out N paid runs.
37
+ group: fix-constraints-a-${{ github.event.pull_request.head.sha || github.sha }}
38
+ cancel-in-progress: true
39
+
40
+ jobs:
41
+ produce:
42
+ # Loop guard: Stage B opens `soleur/fix-constraints/<pr>` follow-up PRs; those must never
43
+ # re-dispatch Stage A (github.head_ref is empty on workflow_dispatch → guard passes).
44
+ if: >-
45
+ github.event_name == 'workflow_dispatch' ||
46
+ !startsWith(github.head_ref, 'soleur/fix-constraints/')
47
+ runs-on: ubuntu-latest
48
+ timeout-minutes: 30
49
+ permissions:
50
+ contents: read
51
+ steps:
52
+ - name: Checkout the PR head (immutable SHA)
53
+ uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
54
+ with:
55
+ # pull_request checks out the ephemeral merge ref by default; pin to the immutable
56
+ # head SHA so the tree the gate runs on == the tree Stage B attests via head_sha.
57
+ ref: ${{ github.event.pull_request.head.sha }}
58
+ persist-credentials: false
59
+
60
+ - name: Preflight — API key present?
61
+ id: preflight
62
+ # Self-contained key-presence gate: sets ok=true iff ANTHROPIC_API_KEY is set (fork PRs
63
+ # get no secret → ok=false → the fix agent is skipped). The Soleur dogfood swaps this for
64
+ # a richer `./.github/actions/anthropic-preflight` composite that ALSO soft-skips on
65
+ # billing-cap / transient API errors; tenants get this minimal check so the template
66
+ # depends on no repo-local action.
67
+ env:
68
+ ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
69
+ run: |
70
+ if [ -n "${ANTHROPIC_API_KEY:-}" ]; then
71
+ echo "ok=true" >> "$GITHUB_OUTPUT"
72
+ else
73
+ echo "ok=false" >> "$GITHUB_OUTPUT"
74
+ echo "::notice::ANTHROPIC_API_KEY not set — skipping the fix agent (recovery is same-repo only)."
75
+ fi
76
+
77
+ - name: Setup Bun # the gate's depcruise binary lives in node_modules
78
+ uses: oven-sh/setup-bun@3d267786b128fe76c2f16a390aa2448b815359f3 # v2.1.2
79
+ with:
80
+ bun-version-file: ".bun-version"
81
+
82
+ - name: Install dependencies (no postinstall scripts over untrusted PR code)
83
+ working-directory: __TARGET_DIR__
84
+ # --ignore-scripts kills the postinstall ACE vector on fork-controlled package.json.
85
+ # (It does NOT stop the gate's own .dependency-cruiser.cjs from running — that is the
86
+ # accepted Stage-A residual, bounded by the capped/rotatable key + no write token.)
87
+ run: npm ci --ignore-scripts
88
+
89
+ - name: Run the constraint-gate (capture rc)
90
+ id: gate
91
+ run: |
92
+ set +e
93
+ bash __TARGET_DIR__/scripts/constraint-gates.sh
94
+ echo "rc=$?" >> "$GITHUB_OUTPUT"
95
+
96
+ - name: Dispatch agent to fix the gate (fix-only)
97
+ if: steps.gate.outputs.rc != '0' && steps.preflight.outputs.ok == 'true'
98
+ id: agent
99
+ uses: anthropics/claude-code-action@20f0b248c5003db4b9ca43c45e17949bcdc36d2d # v1.0.236
100
+ with:
101
+ anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
102
+ # `id-token: write` is deliberately ABSENT here (untrusted pull_request
103
+ # context — see ADR-074): the explicit input is the only safe token
104
+ # path. Verified at the pinned SHA: inputs.github_token ->
105
+ # OVERRIDE_GITHUB_TOKEN makes setupGitHubToken return BEFORE
106
+ # getOidcToken. Without it the agent step OIDC-hard-fails ~15 s in —
107
+ # the latent defect the dogfood copy carried until its repair.
108
+ github_token: ${{ github.token }}
109
+ # Model pin + action SHA mirror claude-code-review.yml verbatim (CI-validated).
110
+ # Pin freshness is model-launch-review's job — do NOT substitute a model id from memory.
111
+ claude_args: '--model claude-sonnet-5-5 --max-turns 20 --allowedTools Bash,Read,Write,Edit,Glob,Grep'
112
+ prompt: |
113
+ A constraint-gate tripped on this PR. Run `__TARGET_DIR__/scripts/constraint-gates.sh`,
114
+ read the failure, and FIX the offending import so a client ("use client") module no longer
115
+ value-imports the server-only tree (server/**). Make file edits ONLY under
116
+ __TARGET_DIR__/{app,components,server}.
117
+ You are FIX-ONLY: do NOT run the constraint-scaffold generator, do NOT pass
118
+ --refresh-baseline, and do NOT edit .dependency-cruiser-known-violations.json — growing
119
+ the suppression baseline would whitelist a real client->server-secret leak and is a
120
+ maintainer-only local action, never an auto-recovery path.
121
+ If the failure is not a real leak you can fix with an import change, make NO edits.
122
+ Do NOT commit or push — the workflow owns delivery.
123
+
124
+ - name: Re-run the gate to VERIFY the fix
125
+ # Assert the invariant — never trust "agent exited 0" (it exits 0 even on give-up).
126
+ if: steps.agent.outcome == 'success'
127
+ id: verify
128
+ run: |
129
+ set +e
130
+ bash __TARGET_DIR__/scripts/constraint-gates.sh
131
+ echo "rc=$?" >> "$GITHUB_OUTPUT"
132
+ # `git status --porcelain` (not `git diff`) so a fix that CREATES a new in-scope
133
+ # file (untracked) counts as changed — `git diff` ignores untracked files.
134
+ if [ -z "$(git status --porcelain)" ]; then
135
+ echo "changed=false" >> "$GITHUB_OUTPUT"
136
+ else
137
+ echo "changed=true" >> "$GITHUB_OUTPUT"
138
+ fi
139
+
140
+ - name: Build recovery artifact (full post-image contents + per-file sha256 + meta.json)
141
+ # Only when the agent produced a real, verified-green change. FIX-ONLY + in-scope:
142
+ # any changed path outside __TARGET_DIR__/{app,components,server} (incl. the baseline
143
+ # JSON, constraint-gates.sh, .github/**, *.cjs) ABORTS the artifact — baseline growth is
144
+ # maintainer-only; auto-recovery never ships an out-of-scope edit.
145
+ if: steps.verify.outputs.rc == '0' && steps.verify.outputs.changed == 'true'
146
+ id: artifact
147
+ env:
148
+ PR_NUMBER: ${{ github.event.pull_request.number }}
149
+ HEAD_SHA: ${{ github.event.pull_request.head.sha }}
150
+ HEAD_REF: ${{ github.event.pull_request.head.ref }}
151
+ run: |
152
+ set -euo pipefail
153
+ staging="${RUNNER_TEMP}/fix-constraints-patch"
154
+ rm -rf "$staging"; mkdir -p "$staging/files"
155
+ # Stage ALL agent changes (tracked edits AND new untracked in-scope files; git add
156
+ # respects .gitignore so node_modules etc. are excluded), then enumerate them
157
+ # NUL-delimited so any filename survives. Out-of-scope edits are still enumerated
158
+ # here so the allowlist below can ABORT on them (never silently ship a partial fix).
159
+ git add -A
160
+ mapfile -d '' changed < <(git diff --cached --name-only -z)
161
+ if [ "${#changed[@]}" -eq 0 ]; then
162
+ echo "::notice::no changed files — nothing to deliver"; exit 0
163
+ fi
164
+ # Positive-charset, end-anchored allowlist + explicit absolute/`..` reject (matches
165
+ # Stage B's validator; defense-in-depth so the producer's scope boundary does not rely
166
+ # on a git-diff normalization invariant).
167
+ allow_re='^__TARGET_DIR__/(app|components|server)/[A-Za-z0-9._/-]+$'
168
+ files_json='[]'
169
+ for f in "${changed[@]}"; do
170
+ if [[ "$f" == /* ]] || [[ "$f" == *".."* ]] || [[ ! "$f" =~ $allow_re ]]; then
171
+ echo "::error::agent edited an out-of-scope path (${f}) — auto-recovery is fix-only and in-scope-only; no artifact produced. A maintainer must review."
172
+ # Record the give-up reason so the marker step (below) can tell Stage B to comment.
173
+ echo "giveup_reason=edited an out-of-scope path" >> "$GITHUB_OUTPUT"
174
+ exit 0 # no recovery artifact => a give-up marker is produced instead
175
+ fi
176
+ dest="$staging/files/$f"
177
+ mkdir -p "$(dirname "$dest")"
178
+ cp "$f" "$dest"
179
+ sha="$(sha256sum "$f" | awk '{print $1}')"
180
+ files_json="$(jq -c --arg p "$f" --arg s "$sha" '. + [{path:$p, sha256:$s}]' <<<"$files_json")"
181
+ done
182
+ jq -n --arg pr "$PR_NUMBER" --arg sha "$HEAD_SHA" --arg ref "$HEAD_REF" \
183
+ --argjson files "$files_json" \
184
+ '{pr_number: ($pr|tonumber), head_sha: $sha, head_ref: $ref, files: $files, touches_baseline: false}' \
185
+ > "$staging/meta.json"
186
+ echo "dir=${staging}" >> "$GITHUB_OUTPUT"
187
+ echo "produced=true" >> "$GITHUB_OUTPUT"
188
+
189
+ - name: Upload recovery artifact
190
+ if: steps.artifact.outputs.produced == 'true'
191
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
192
+ with:
193
+ name: fix-constraints-patch-${{ github.event.pull_request.number }}
194
+ path: ${{ steps.artifact.outputs.dir }}
195
+ retention-days: 1
196
+ if-no-files-found: error
197
+
198
+ - name: Build give-up marker (red gate, no in-scope fix delivered)
199
+ # The gate was RED but no recovery artifact was produced (no key, agent didn't run,
200
+ # made no edits, still red after the fix, or greened via an out-of-scope path). Emit a
201
+ # tiny marker so the privileged Stage B can post ONE "maintainer needed" comment on the
202
+ # PR — the founder is NEVER left silently deadlocked (plan AC: no terminal state is
203
+ # silent). No marker when the gate was already green (nothing tripped → no comment).
204
+ if: steps.gate.outputs.rc != '0' && steps.artifact.outputs.produced != 'true'
205
+ id: giveup
206
+ env:
207
+ PR_NUMBER: ${{ github.event.pull_request.number }}
208
+ HEAD_SHA: ${{ github.event.pull_request.head.sha }}
209
+ PREFLIGHT_OK: ${{ steps.preflight.outputs.ok }}
210
+ AGENT_OUTCOME: ${{ steps.agent.outcome }}
211
+ VERIFY_RC: ${{ steps.verify.outputs.rc }}
212
+ ARTIFACT_REASON: ${{ steps.artifact.outputs.giveup_reason }}
213
+ run: |
214
+ set -euo pipefail
215
+ if [ "${PREFLIGHT_OK}" != 'true' ]; then
216
+ reason="the fix agent could not run (API key unavailable or a fork PR)"
217
+ elif [ -n "${ARTIFACT_REASON}" ]; then
218
+ reason="${ARTIFACT_REASON}"
219
+ elif [ "${AGENT_OUTCOME}" != 'success' ]; then
220
+ reason="the fix agent did not complete"
221
+ elif [ "${VERIFY_RC}" != '0' ]; then
222
+ reason="the gate was still red after the agent's attempt"
223
+ else
224
+ reason="the agent made no edits — this gate may not be auto-fixable"
225
+ fi
226
+ staging="${RUNNER_TEMP}/fix-constraints-giveup"
227
+ rm -rf "$staging"; mkdir -p "$staging"
228
+ jq -n --arg pr "$PR_NUMBER" --arg sha "$HEAD_SHA" --arg r "$reason" \
229
+ '{pr_number: ($pr|tonumber), head_sha: $sha, reason: $r}' > "$staging/meta.json"
230
+ echo "dir=${staging}" >> "$GITHUB_OUTPUT"
231
+ echo "produced=true" >> "$GITHUB_OUTPUT"
232
+
233
+ - name: Upload give-up marker
234
+ if: steps.giveup.outputs.produced == 'true'
235
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
236
+ with:
237
+ name: fix-constraints-giveup-${{ github.event.pull_request.number }}
238
+ path: ${{ steps.giveup.outputs.dir }}
239
+ retention-days: 1
240
+ if-no-files-found: error