@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,156 @@
1
+ # Guardrail corpus audit — `.claude/hooks/` + `scripts/lint-*` (#10404)
2
+
3
+ Census date: 2026-10-21. Corpus definition (enforced by `test/manifest.test.sh`,
4
+ which re-derives this set from `git ls-files` — a new member with no row here is a
5
+ CI failure):
6
+
7
+ - `.claude/hooks/**/*.sh`, excluding `*.test.sh` and files under `/test/` — **56 files**.
8
+ - `scripts/lint-*`, excluding `*.test.sh`, `*.baseline.txt`, `*.highwater*` — **46 files**.
9
+
10
+ ## Verdicts
11
+
12
+ | Verdict | Meaning |
13
+ |---|---|
14
+ | `generic` | Repo-generic as it stands: no Soleur-domain coupling; could run in an arbitrary repository with at most path arguments. |
15
+ | `generic-after-extraction` | The *guard idea* is repo-generic but the file carries couplings (incident machinery, shared libs, Soleur paths or rule ids) that dead-reference in a user repo. Shippable only as a template. |
16
+ | `soleur-coupled` | The guard's *purpose* is Soleur's: it enforces a Soleur rule id, a Soleur corpus path, a vendor in Soleur's stack, or Soleur telemetry/workflow machinery. Not shipped. |
17
+
18
+ **Counts:** hooks — 0 generic / 10 generic-after-extraction / 47 soleur-coupled.
19
+ lints — 9 generic / 8 generic-after-extraction / 29 soleur-coupled.
20
+
21
+ The canonical emit pair `plugins/soleur/scripts/precommit-guard.sh` +
22
+ `plugins/soleur/scripts/lib/wrapper-boundary.sh` is NOT in the census set (it
23
+ lives under `plugins/`, not `.claude/hooks/` or `scripts/lint-*`); it is the
24
+ source the v1 `commit-on-main` guard emits near-verbatim. Likewise
25
+ `.claude/hooks/guardrails.sh` is classified as a whole file; the v1 `block-stash`
26
+ guard extracts its `block-stash-in-worktrees` arm (guardrails.sh:471) as a
27
+ template rather than shipping the monolith.
28
+
29
+ ## Census — `.claude/hooks/` (56)
30
+
31
+ | File | Verdict | Rationale |
32
+ |---|---|---|
33
+ | `agent-token-tee.sh` | soleur-coupled | Task telemetry into `.claude/.session-tokens.jsonl`, consumed by Soleur `compound` Phase 1.6. |
34
+ | `background-poll-prefer-monitor.sh` | soleur-coupled | Enforces `hr-monitor-not-run-in-background-for-polling` — a Soleur rule keyed to the harness Monitor tool. |
35
+ | `bare-head-self-heal.sh` | soleur-coupled | Repairs Soleur's bare-repo+worktree topology; meaningless in an ordinary clone. |
36
+ | `bare-root-cwd-guard.sh` | soleur-coupled | Same bare-repo topology guard (cwd under the bare root). |
37
+ | `brand-hex-commit-gate.sh` | soleur-coupled | Soleur brand-corpus hex gate. |
38
+ | `cla-signed-author-gate.sh` | soleur-coupled | Keys on `noreply@anthropic.com`, the Soleur `cla-check` required status, `wg-cla-signed-author-before-merge`. |
39
+ | `context-reviewed-gate.sh` | generic-after-extraction | `last_reviewed:`-trailer audit tripwire is format-generic (v2); couplings = `incidents.sh` + `hook-input.sh` sourcing. |
40
+ | `docs-cli-verification.sh` | generic-after-extraction | Advisory "verified CLI" docs lint (v2); couplings = `incidents.sh` + a Soleur file-pattern gate (`apps/**/page.*`). |
41
+ | `doppler-secrets-delete-redirect.sh` | soleur-coupled | Doppler vendor redirect. |
42
+ | `durable-reminder-prefer-inngest.sh` | soleur-coupled | Inngest vendor preference in Soleur's app stack. |
43
+ | `follow-through-directive-gate.sh` | soleur-coupled | Soleur follow-through directive machinery. |
44
+ | `git-commit-secret-scan.sh` | generic-after-extraction | **v1 `secret-scan` source.** Couplings: `lib/hook-input.sh`, `incidents.sh` emits, `jq`, the repo `.gitleaks.toml`; the staged-scan predicate and colour pins are repo-generic. |
45
+ | `grep-rewrite.sh` | soleur-coupled | Neutralizes one observed ugrep `grep` shim — environment remediation, not a general guard (ADR-162). |
46
+ | `guardrails.sh` | soleur-coupled | Monolith wired to `lib/freeze-lock.sh` + `incidents.sh` + the Soleur rule corpus. Its `block-stash-in-worktrees` arm (:471) is extracted as v1 `block-stash`; its `block-commit-on-main` arm delegates to `precommit-guard.sh`, which v1 emits instead. `block-rm-rf` arms (:185, :200) stay v2 — they read `lib/freeze-lock.sh` state and are not self-contained. |
47
+ | `iac-plan-write-guard.sh` | soleur-coupled | Enforces `hr-all-infrastructure-provisioning` on Soleur plan/spec files. |
48
+ | `kb-domain-allowlist-guard.sh` | soleur-coupled | `knowledge-base/` domain allowlist — Soleur corpus structure. |
49
+ | `lib/context-sanitize.sh` | generic-after-extraction | Pure display-boundary sanitizer already byte-twinned plugin-side (v2). |
50
+ | `lib/freeze-lock.sh` | soleur-coupled | `guardrails.sh` freeze-state machinery. |
51
+ | `lib/hook-input.sh` | generic-after-extraction | Harness-generic hook-stdin parser (ADR-156/157). v1 templates self-contain their parse, so it is not emitted; a v2 hook needing it must inline it. |
52
+ | `lib/hook-tool-kind.sh` | generic-after-extraction | Devin→Claude tool-kind map (#8205) — harness-generic, not Soleur-domain (v2). |
53
+ | `lib/incidents.sh` | soleur-coupled | The `emit_incident` sink — the corpus's named coupling; emitted guards strip its calls. |
54
+ | `lib/log-rotation.sh` | generic-after-extraction | `.claude/*.jsonl` rotation util; logic portable, callers Soleur telemetry sinks (v2). |
55
+ | `lib/commit-target-roots.sh` | soleur-coupled | Commit-target argv walker for `git-commit-secret-scan.sh` (#10609) — depends on `plugins/soleur/hooks/lib/shell-argv.pl`, the repo's hardened lexer; the emitted `secret-scan` template self-contains its parse instead. |
56
+ | `lib/monitor-sig.sh` | soleur-coupled | Monitor-ledger signature shared by the two monitor hooks. |
57
+ | `lib/technical-fork-cues.sh` | soleur-coupled | Cue vocabulary for `hr-technical-fork-is-not-an-operator-question`. |
58
+ | `lib/test-incident-sandbox.sh` | soleur-coupled | Test sandbox for `incidents.sh`. |
59
+ | `memory-backstop-mutation-battery.sh` | soleur-coupled | Mutation battery for `memory-backstop.sh`; needs a live systemd user bus. |
60
+ | `memory-backstop-resolve.sh` | soleur-coupled | Shim resolving the newest `memory-backstop.sh` across checkouts. |
61
+ | `memory-backstop.sh` | soleur-coupled | Soleur `~/.claude` memory protection. |
62
+ | `monitor-arm-recorder.sh` | soleur-coupled | Monitor-ledger writer. |
63
+ | `monitor-supersede-guard.sh` | soleur-coupled | Monitor-ledger reader. |
64
+ | `new-scheduled-cron-prefer-inngest.sh` | soleur-coupled | Inngest vendor preference. |
65
+ | `no-memory-write.sh` | soleur-coupled | Soleur memory-directory write ban. |
66
+ | `pencil-collapse-guard.sh` | soleur-coupled | Pencil MCP `.pen` recovery. |
67
+ | `pencil-open-guard.sh` | soleur-coupled | Pencil MCP + `cq-` rule. |
68
+ | `phase-surface-hint.sh` | soleur-coupled | Soleur `.claude/phase-surface-map.json` phase vocabulary (ADR-070). |
69
+ | `pkill-self-match-guard.sh` | generic-after-extraction | Universal self-match class (`pkill -f`, `ps\|grep`); couplings = lazy `incidents.sh` emit + a `proc.sh` pointer (v2). |
70
+ | `post-dispatch-watch-gate.sh` | soleur-coupled | Soleur monitor/watch ledger (`hr-dispatch-async-must-arm-watch`). |
71
+ | `pre-ask-technical-fork-gate.sh` | soleur-coupled | `hr-technical-fork` on AskUserQuestion. |
72
+ | `pre-closing-technical-fork-gate.sh` | soleur-coupled | Same rule on the closing carrier. |
73
+ | `pre-merge-auto-close-scan.sh` | soleur-coupled | `gh pr merge` close-keyword scan bound to the Soleur `follow-through` label. |
74
+ | `pre-merge-rebase.sh` | soleur-coupled | Soleur merge-flow gate. |
75
+ | `prod-write-defer-gate.sh` | soleur-coupled | Soleur prod-write surface definitions. |
76
+ | `rule-incident-marker-capture.sh` | soleur-coupled | Soleur rule-incident marker capture. |
77
+ | `session-rules-loader.sh` | soleur-coupled | Loads `AGENTS.rules.md` — the Soleur rule corpus itself. |
78
+ | `ship-kb-archive-gate.sh` | soleur-coupled | `soleur:ship` KB-archive gate. |
79
+ | `ship-net-issue-flow-gate.sh` | soleur-coupled | ship flow. |
80
+ | `ship-operator-step-gate.sh` | soleur-coupled | ship flow. |
81
+ | `ship-runbook-ssh-gate.sh` | soleur-coupled | ship flow. |
82
+ | `ship-soak-followthrough-gate.sh` | soleur-coupled | ship flow. |
83
+ | `ship-unpushed-commits-gate.sh` | generic-after-extraction | `gh pr merge` denied while `git rev-list origin/<branch>..HEAD` is non-zero — the predicate is repo-generic (v2); couplings = `hook-input.sh`/`jq` stdin parse. |
84
+ | `skill-context-queries.sh` | soleur-coupled | Soleur skill-context plumbing. |
85
+ | `skill-invocation-logger.sh` | soleur-coupled | Soleur skill-invocation telemetry sink. |
86
+ | `skill-security-scan.sh` | soleur-coupled | Invokes the skill-security-scan skill under the payload via a `$PROJECT_DIR` prefix. |
87
+ | `skill-security-scan-write.sh` | soleur-coupled | Same scanner plus `plugins/soleur` write paths. |
88
+ | `supabase-loopback-warn.sh` | soleur-coupled | Supabase vendor stack check (ADR-153). |
89
+ | `worktree-write-guard.sh` | generic-after-extraction | Blocks writes to the main checkout while worktrees exist — repo-generic idea (v2); couplings = `incidents.sh`/`hook-input.sh` sourcing. |
90
+
91
+ ## Census — `scripts/lint-*` (46)
92
+
93
+ | File | Verdict | Rationale |
94
+ |---|---|---|
95
+ | `lint-agents-compound-sync.sh` | soleur-coupled | AGENTS budget contract across the plugin corpus. |
96
+ | `lint-agents-enforcement-tags.py` | soleur-coupled | AGENTS `[hook-enforced:]`/`[skill-enforced:]` tag registry. |
97
+ | `lint-agents-rule-budget.py` | soleur-coupled | `AGENTS.{md,rules.md}` byte budgets. |
98
+ | `lint-anthropic-content-position.py` | soleur-coupled | Anthropic-harness reader lint; scans `knowledge-base/` + Soleur call sites. |
99
+ | `lint-art30-reverification.sh` | soleur-coupled | GDPR Art.30 register/trigger corpus (`knowledge-base/legal/`). |
100
+ | `lint-betterstack-emitter-read.sh` | soleur-coupled | BetterStack emitter corpus. |
101
+ | `lint-bot-synthetic-completeness.sh` | generic-after-extraction | Synthetic check-run completeness for bot-authored PRs is generic (v2); coupling = the `pr-quality-guards.yml` exemption name. |
102
+ | `lint-bot-synthetic-statuses.sh` | generic-after-extraction | `[skip ci]` ban on bot PRs is generic (v2); same named exemptions. |
103
+ | `lint-conversations-update-callsites.sh` | soleur-coupled | `apps/web-platform/server` module boundary. |
104
+ | `lint-credential-path-literals.py` | soleur-coupled | SCAN_DIRS = `plugins/` + `knowledge-base/`. |
105
+ | `lint-diagnosis-claims.sh` | generic-after-extraction | "CI message may not name a cause the job did not measure" is generic (v2); scope names `apps/web-platform/infra/`. |
106
+ | `lint-distribution-content.sh` | soleur-coupled | `knowledge-base/marketing/distribution-content/` marker lint. |
107
+ | `lint-doppler-description-length.py` | soleur-coupled | Doppler description contract over `*.tf`. |
108
+ | `lint-dual-lockfile.sh` | generic | `git ls-files`-driven npm-lockfile-of-record guard; Soleur mentions are comments only. |
109
+ | `lint-encryption-posture.py` | soleur-coupled | Soleur encryption-posture ledger + `apps/*/infra` scope (ADR-140). |
110
+ | `lint-feature-map-coverage.sh` | soleur-coupled | `apps/web-platform/app/**` page set + `feature-map.md`. |
111
+ | `lint-followthrough-varq-ban.sh` | soleur-coupled | Soleur probe-set/varq conventions. |
112
+ | `lint-gh-argv-arg.py` | generic | Repo-wide `gh` argv vs jq-flag-token lint over workflows + `*.sh`; no Soleur coupling. |
113
+ | `lint-guard-contract.py` | soleur-coupled | Soleur plan/SKILL.md guard-contract shape (deepen-plan §4.11). |
114
+ | `lint-infra-no-human-steps.py` | soleur-coupled | `hr-no-ssh-fallback-in-runbooks` on `knowledge-base` docs. |
115
+ | `lint-integration-env-gates.sh` | soleur-coupled | `apps/web-platform/{test,lib}` env-gate wiring + `scheduled-integration-suites.yml`. |
116
+ | `lint-legal-mirror-drift-baseline.sh` | soleur-coupled | Legal mirror corpus (`plugins/soleur/docs/pages/legal`). |
117
+ | `lint-legal-registers.sh` | soleur-coupled | `knowledge-base/legal/` registers. |
118
+ | `lint-legal-scope-block-placement.sh` | soleur-coupled | Legal scope-block placement + the same mirror dir. |
119
+ | `lint-migrated-rule-ids.sh` | soleur-coupled | AGENTS rule-id migration registry. |
120
+ | `lint-orphan-test-suites.sh` | generic-after-extraction | **v1 `orphan-test` source.** The `git ls-files '*.test.sh'` producer is generic; couplings = `scripts/test-all.sh` runner name, `TEST_GROUP`/`SCRIPTS_SHARD` labels, `apps/web-platform/infra/` surfaces. |
121
+ | `lint-questionnaire-identity.sh` | soleur-coupled | `knowledge-base/project/questionnaires/` identity guard. |
122
+ | `lint-rejected-register.sh` | soleur-coupled | `knowledge-base/project/rejected/` no-list guard. |
123
+ | `lint-rule-bodies.py` | soleur-coupled | `AGENTS.rules.md` body-hash ledger. |
124
+ | `lint-rule-ids.py` | soleur-coupled | `AGENTS.md` rule-id coverage. |
125
+ | `lint-scheduled-show-full-output.sh` | soleur-coupled | `scheduled-*.yml` convention + `plugins/soleur/skills/schedule` coupling. |
126
+ | `lint-shell-capture-exit.py` | generic | `git ls-files '*.sh'` producer; capture-of-negative-rc class is universal (the `test-all.sh` mention is baseline prose). |
127
+ | `lint-shell-trace-credential-refusal.py` | generic-after-extraction | xtrace-with-credential refusal is a universal class (v2); Soleur incidents cited are comments only, but the credential-binding corpus is repo-shaped. |
128
+ | `lint-skill-body-budget.py` | soleur-coupled | `plugins/soleur` SKILL.md corpus + `skill-body-budget.json`. |
129
+ | `lint-squash-ci-directives.sh` | generic | `[skip ci]` token scan of `gh pr create` bodies in workflows; token set is GitHub-documented. |
130
+ | `lint-supabase-deprecated-endpoints.sh` | soleur-coupled | Supabase endpoint corpus + `apps/web-platform/lib/supabase`. |
131
+ | `lint-trap-tempfile-ownership.py` | generic-after-extraction | Tempfile-cleanup ownership rules are generic (v2); keys on `SOLEUR_SCRATCH_SESSION_ROOT` markers. |
132
+ | `lint-window-closure-assertion.allowlist.txt` | soleur-coupled | Data companion of the window-closure lint (Soleur test roots). |
133
+ | `lint-window-closure-assertion.py` | soleur-coupled | TEST_ROOTS = `apps/web-platform`, `plugins/soleur/test`, `test`. |
134
+ | `lint-workflow-errexit-capture.py` | generic | Workflow run-body errexit-capture class; scans `.github/workflows`. |
135
+ | `lint-workflow-install-sites.sh` | generic-after-extraction | npm-install-site audit is generic (v2); assembly names `plugins/**` and `apps/web-platform` legs. |
136
+ | `lint-workflow-issue-write-scope.py` | generic | Issue-write permission lint over `.github/workflows`; Soleur cite is a docstring example. |
137
+ | `lint-workflow-local-action-checkout.py` | generic-after-extraction | `uses: ./…`-needs-checkout is generic (v2); third surface names `scripts/lib/bearer-curl.sh`. |
138
+ | `lint-workflow-run-body-syntax.py` | generic | Every `run:` body must parse as bash; `.github/workflows` only. |
139
+ | `lint-workflow-step-env-refs.py` | generic | Step-env scoping lint over workflow files. |
140
+ | `lint-workflows.sh` | generic | actionlint entry point with the 64 KiB hang guard; repo-specific text is comments. |
141
+
142
+ ## The v1 set (and why)
143
+
144
+ | Guard | Source | Why v1 |
145
+ |---|---|---|
146
+ | `secret-scan` | `git-commit-secret-scan.sh` | The highest-value generic gate: credential-leak prevention with the colour-pin/`-diff` bypass work already measured. |
147
+ | `commit-on-main` | `plugins/soleur/scripts/precommit-guard.sh` + `lib/wrapper-boundary.sh` | Already self-contained by design (the near-verbatim emit). |
148
+ | `block-stash` | `guardrails.sh` `block-stash-in-worktrees` arm | Small extractable arm; boundary-regex detection generalizes. |
149
+ | `orphan-test` | `lint-orphan-test-suites.sh` | The meta-guard: a scaffolded suite that is never wired invisibly does nothing; generalizes to user-declared runner surfaces. |
150
+
151
+ `block-rm-rf` was audited for v1 promotion and stays v2: the
152
+ `block-rm-rf-worktrees`/`block-recursive-delete` arms read freeze-lock state and
153
+ incident machinery inside `guardrails.sh` — not self-contained.
154
+
155
+ The 9 `generic` lints above are the v2 candidate pool: shipping one is a
156
+ `guards.tsv` row + a template + an audit-verdict flip, not new design.
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env bash
2
+ # block-stash.sh — PreToolUse hook emitted by soleur:verification-scaffold.
3
+ # Decides every `git stash` at a chain boundary (any position in &&/||/;/|
4
+ # chains, behind env-assignment or launcher prefixes). Extracted from the
5
+ # repo-corpus stash arm; generalized for arbitrary repos.
6
+ #
7
+ # Documented read-only exceptions: `git stash list`, `git stash show` —
8
+ # they mutate nothing. Everything else carrying a `git stash` subcommand
9
+ # (`push`, `pop`, `drop`, `apply`, a bare `git stash`) is decided.
10
+ #
11
+ # MODE=@MODE@ — advisory (installed default): warns and allows; enforce:
12
+ # denies. An unparseable payload is a tool error — warn+allow in advisory,
13
+ # deny with remediation in enforce; `ask` never fires on an error path.
14
+ #
15
+ # Hook stdin: JSON payload with tool_input.command. Hook stdout: the PreToolUse
16
+ # JSON decision envelope. Exit code is always 0.
17
+ set -euo pipefail
18
+
19
+ MODE="@MODE@"
20
+
21
+ _vs_escape() { printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g' | tr '\n' ' '; }
22
+ _vs_decide() {
23
+ local d="$1" r="${2:-}"
24
+ if [ -n "$r" ]; then
25
+ printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"%s","permissionDecisionReason":"%s"}}\n' \
26
+ "$d" "$(_vs_escape "$r")"
27
+ else
28
+ printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"%s"}}\n' "$d"
29
+ fi
30
+ exit 0
31
+ }
32
+ _vs_allow() { _vs_decide allow; }
33
+
34
+ # --- stdin command extraction (jq -> node -> sed fallback) --------------------
35
+ _vs_payload="$(cat)"
36
+ _vs_cmd=""
37
+ if command -v jq >/dev/null 2>&1; then
38
+ _vs_cmd="$(printf '%s' "$_vs_payload" | jq -r '.tool_input.command // ""' 2>/dev/null || true)"
39
+ elif command -v node >/dev/null 2>&1; then
40
+ _vs_cmd="$(printf '%s' "$_vs_payload" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{try{const c=JSON.parse(s).tool_input.command;process.stdout.write(typeof c==="string"?c:"")}catch(e){}})' 2>/dev/null || true)"
41
+ else
42
+ _vs_cmd="$(printf '%s' "$_vs_payload" | sed -n 's/.*"command"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -n 1)"
43
+ fi
44
+ [ -n "$_vs_cmd" ] || _vs_allow
45
+ grep -q 'stash' <<<"$_vs_cmd" || _vs_allow
46
+
47
+ # Wrapper-prefix set: env assignments and launcher words that may sit between a
48
+ # chain boundary and `git` (LEFTHOOK=0 git stash, sudo git stash, env git stash).
49
+ VS_ENV_ASN_RE='[A-Za-z_][A-Za-z_0-9]*=[^[:space:]]+'
50
+ VS_LAUNCHER_RE='(sudo|command|nice|env|xargs)'
51
+ VS_BOUNDARY_PFX="(${VS_ENV_ASN_RE}|${VS_LAUNCHER_RE})"
52
+
53
+ stash_hit=""
54
+ while IFS= read -r seg; do
55
+ if grep -qE '^[[:space:]]*('"${VS_BOUNDARY_PFX}"'[[:space:]]+)*git[[:space:]]+stash([[:space:]]|$)' <<<"$seg"; then
56
+ # Read-only subcommands are the documented exception — everything else decides.
57
+ if grep -qE '^[[:space:]]*('"${VS_BOUNDARY_PFX}"'[[:space:]]+)*git[[:space:]]+stash[[:space:]]+(list|show)([[:space:]]|$)' <<<"$seg"; then
58
+ continue
59
+ fi
60
+ stash_hit="$seg"
61
+ fi
62
+ done < <(printf '%s\n' "$_vs_cmd" | sed -E 's/&&|\|\||[;|]/\n/g')
63
+
64
+ [ -n "$stash_hit" ] || _vs_allow
65
+
66
+ reason="git stash is not allowed by this repo's verification gates — commit WIP to a branch instead, or use 'git stash list'/'git stash show' (read-only, allowed). Offending segment: ${stash_hit:0:120}"
67
+ if [ "$MODE" = "enforce" ]; then
68
+ _vs_decide deny "BLOCKED: $reason"
69
+ else
70
+ printf '[block-stash] WARN: %s\n' "$reason" >&2
71
+ _vs_decide allow
72
+ fi
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env bash
2
+ # commit-on-main.sh — PreToolUse hook emitted by soleur:verification-scaffold.
3
+ # Runs scripts/verification/precommit-guard.sh (the emitted copy) over every
4
+ # Bash command payload and translates its refusal into the hook decision
5
+ # envelope. The DETECTION lives entirely in the emitted guard — this wrapper
6
+ # owns only the decision verb.
7
+ #
8
+ # MODE=@MODE@ — advisory (installed default): a refusal warns and allows;
9
+ # enforce: a refusal denies. A guard/tool error (missing script, usage error)
10
+ # warns+allows in advisory and denies with remediation in enforce — `ask`
11
+ # never fires on an error path in either mode.
12
+ #
13
+ # Hook stdin: JSON payload with tool_input.command. Hook stdout: the PreToolUse
14
+ # JSON decision envelope. Exit code is always 0.
15
+ set -euo pipefail
16
+
17
+ MODE="@MODE@"
18
+
19
+ PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
20
+ GUARD="$PROJECT_DIR/scripts/verification/precommit-guard.sh"
21
+
22
+ _vs_escape() { printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g' | tr '\n' ' '; }
23
+ _vs_decide() {
24
+ local d="$1" r="${2:-}"
25
+ if [ -n "$r" ]; then
26
+ printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"%s","permissionDecisionReason":"%s"}}\n' \
27
+ "$d" "$(_vs_escape "$r")"
28
+ else
29
+ printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"%s"}}\n' "$d"
30
+ fi
31
+ exit 0
32
+ }
33
+ _vs_allow() { _vs_decide allow; }
34
+ _vs_tool_error() {
35
+ printf '[commit-on-main] WARN: %s\n' "$1" >&2
36
+ if [ "$MODE" = "enforce" ]; then
37
+ _vs_decide deny "BLOCKED: commit-on-main: $1"
38
+ else
39
+ _vs_decide allow
40
+ fi
41
+ }
42
+
43
+ # --- stdin command extraction (jq -> node -> sed fallback) --------------------
44
+ _vs_payload="$(cat)"
45
+ _vs_cmd=""
46
+ if command -v jq >/dev/null 2>&1; then
47
+ _vs_cmd="$(printf '%s' "$_vs_payload" | jq -r '.tool_input.command // ""' 2>/dev/null || true)"
48
+ elif command -v node >/dev/null 2>&1; then
49
+ _vs_cmd="$(printf '%s' "$_vs_payload" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{try{const c=JSON.parse(s).tool_input.command;process.stdout.write(typeof c==="string"?c:"")}catch(e){}})' 2>/dev/null || true)"
50
+ else
51
+ _vs_cmd="$(printf '%s' "$_vs_payload" | sed -n 's/.*"command"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -n 1)"
52
+ fi
53
+ [ -n "$_vs_cmd" ] || _vs_allow
54
+
55
+ # Cheap pre-filter: a payload that names neither git nor commit cannot be a
56
+ # commit. The emitted guard runs the real chain-boundary verdict.
57
+ grep -qE 'git' <<<"$_vs_cmd" && grep -qE 'commit' <<<"$_vs_cmd" || _vs_allow
58
+
59
+ [ -f "$GUARD" ] || _vs_tool_error "scripts/verification/precommit-guard.sh is missing — the commit-on-main gate is NOT running. Re-run verification-scaffold or restore the file."
60
+ # The hook's cwd is what the tool call runs in — pass it so a `cd`-free payload
61
+ # resolves the right repo.
62
+ hook_cwd=""
63
+ if command -v jq >/dev/null 2>&1; then
64
+ hook_cwd="$(printf '%s' "$_vs_payload" | jq -r '.cwd // ""' 2>/dev/null || true)"
65
+ fi
66
+ [ -n "$hook_cwd" ] || hook_cwd="$PWD"
67
+
68
+ guard_rc=0
69
+ guard_out="$(bash "$GUARD" --cwd "$hook_cwd" "$_vs_cmd" 2>&1)" || guard_rc=$?
70
+ case "$guard_rc" in
71
+ 0) _vs_allow ;;
72
+ 1)
73
+ reason="${guard_out:-commit refused: the target repo is checked out on a default branch. Create a feature branch first.}"
74
+ if [ "$MODE" = "enforce" ]; then
75
+ _vs_decide deny "BLOCKED: $reason"
76
+ else
77
+ printf '[commit-on-main] WARN: %s\n' "$reason" >&2
78
+ _vs_decide allow
79
+ fi
80
+ ;;
81
+ *) _vs_tool_error "precommit-guard.sh exited $guard_rc (${guard_out:-no output}) — a tool error, not a refusal; nothing was decided." ;;
82
+ esac
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env bash
2
+ # orphan-test-check.sh — emitted by soleur:verification-scaffold.
3
+ #
4
+ # Fail when a tracked *.test.sh ANYWHERE in the repo is run by no declared
5
+ # registration surface. A test nothing executes gates nothing while looking
6
+ # exactly like coverage — the green summary is read as evidence.
7
+ #
8
+ # THE PRODUCER IS `git ls-files '*.test.sh'` — the whole repo, never a
9
+ # directory list.
10
+ #
11
+ # REGISTRATION SURFACES (a suite is registered when its BASENAME appears in at
12
+ # least one):
13
+ # 1. any `.github/workflows/*.{yml,yaml}` file, and
14
+ # 2. any file matched by a word of $RUNNER_GLOBS (default below — declare
15
+ # your own in the workflow job env).
16
+ # or, by decision rather than registration:
17
+ # 3. a reason-carrying line in `.github/verification-known-orphans.txt`
18
+ # (`repo-relative/path.test.sh # <reason>` — keyed on the PATH, never the
19
+ # basename: two suites can share a basename).
20
+ #
21
+ # Exit 0 clean (or zero suites — a pass with a printed notice), exit 1 naming
22
+ # every orphan by path, exit 2 when the check cannot see (zero registration
23
+ # surfaces resolved — a guard whose producer enumerates nothing must fail
24
+ # LOUDLY, not pass vacuously).
25
+ set -euo pipefail
26
+ export LC_ALL=C
27
+
28
+ ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
29
+ cd "$ROOT"
30
+
31
+ RUNNER_GLOBS="${RUNNER_GLOBS:-scripts/test-all.sh scripts/run-tests* Makefile makefile package.json}"
32
+ KNOWN=".github/verification-known-orphans.txt"
33
+
34
+ # --- producer ----------------------------------------------------------------
35
+ TRACKED="$(git ls-files '*.test.sh' | sort -u)"
36
+ if [ -z "$TRACKED" ]; then
37
+ printf 'orphan-test: no tracked *.test.sh files — nothing to check\n'
38
+ exit 0
39
+ fi
40
+
41
+ # --- surfaces ------------------------------------------------------------------
42
+ SURFACES=""
43
+ if [ -d .github/workflows ]; then
44
+ for f in .github/workflows/*.yml .github/workflows/*.yaml; do
45
+ [ -f "$f" ] && SURFACES="$SURFACES $f"
46
+ done
47
+ fi
48
+ for pat in $RUNNER_GLOBS; do
49
+ for f in $pat; do
50
+ [ -f "$f" ] && SURFACES="$SURFACES $f"
51
+ done
52
+ done
53
+
54
+ if [ -z "${SURFACES# }" ]; then
55
+ printf 'orphan-test: FAIL — zero registration surfaces resolved (.github/workflows/*.{yml,yaml} + RUNNER_GLOBS="%s"). The check cannot see anything; refusing to certify vacuously.\n' "$RUNNER_GLOBS" >&2
56
+ exit 2
57
+ fi
58
+ # shellcheck disable=SC2086
59
+ SURFACE_TEXT="$(cat $SURFACES)"
60
+
61
+ # --- exclusion manifest ---------------------------------------------------------
62
+ # Lines: `<path> # <reason>` (reason required). Bare-path lines are reported as
63
+ # findings — a reasonless exclusion is a silent absorption. Stale entries (the
64
+ # path is no longer tracked, or the suite is now registered) are WARNED on.
65
+ fails=0
66
+ if [ -f "$KNOWN" ]; then
67
+ while IFS= read -r line || [ -n "$line" ]; do
68
+ case "$line" in ''|'#'*) continue ;; esac
69
+ entry_path="${line%%#*}"
70
+ entry_path="$(printf '%s' "$entry_path" | sed 's/[[:space:]]*$//; s/^[[:space:]]*//')"
71
+ entry_reason="${line#*#}"
72
+ if [ "$entry_reason" = "$line" ] || [ -z "$(printf '%s' "$entry_reason" | tr -d '[:space:]')" ]; then
73
+ printf 'orphan-test: FAIL — %s carries a reasonless exclusion: %s (every line must read `<path> # <reason>`)\n' "$KNOWN" "$line" >&2
74
+ fails=$((fails + 1))
75
+ continue
76
+ fi
77
+ if ! grep -qxF "$entry_path" <<<"$TRACKED"; then
78
+ printf 'orphan-test: WARN — %s names %s, which is no longer a tracked *.test.sh; a stale exclusion can re-hide the next regression. Remove the line.\n' "$KNOWN" "$entry_path" >&2
79
+ fi
80
+ done < "$KNOWN"
81
+ fi
82
+
83
+ # --- verdict --------------------------------------------------------------------
84
+ while IFS= read -r suite; do
85
+ [ -n "$suite" ] || continue
86
+ base="$(basename "$suite")"
87
+ if grep -qF -- "$base" <<<"$SURFACE_TEXT"; then
88
+ continue
89
+ fi
90
+ if [ -f "$KNOWN" ] && grep -qE "^${suite}[[:space:]]*#" "$KNOWN"; then
91
+ continue
92
+ fi
93
+ printf 'orphan-test: FAIL — %s is tracked but named by no registration surface (workflows, RUNNER_GLOBS files, or %s with a reason)\n' "$suite" "$KNOWN" >&2
94
+ fails=$((fails + 1))
95
+ done <<<"$TRACKED"
96
+
97
+ if [ "$fails" -eq 0 ]; then
98
+ printf 'orphan-test: %s tracked suite(s), all registered\n' "$(printf '%s\n' "$TRACKED" | grep -c .)"
99
+ exit 0
100
+ fi
101
+ printf 'orphan-test: %d finding(s)\n' "$fails" >&2
102
+ exit 1
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env bash
2
+ # precommit-guard.sh — refuse `git commit` on main/master, without hook execution.
3
+ #
4
+ # Canonical source for the commit-on-main check (Soleur Cloud Mode, FR5).
5
+ # Plugin command hooks are documented cloud-capable for most events, but a
6
+ # skill cannot rely on hook execution in a not-local session — and user repos
7
+ # consuming via requiredPlugins have no .claude/hooks at all. work/ship/one-shot
8
+ # invoke this script directly so the refusal is structural in both worlds.
9
+ #
10
+ # Scope: commit-on-main ONLY. The DONE-marker stop-gate is not extractable —
11
+ # it reads hook-stdin transcript data a standalone script cannot see; it stays
12
+ # prose + the plugin Stop hook.
13
+ #
14
+ # Self-contained by design: no jq, no .claude/hooks/lib vendoring (those paths
15
+ # resolve relative to the repo, which is wrong when this script runs from the
16
+ # plugin install cache), no emit_incident — callers log their own incidents.
17
+ # ONE sibling dependency: scripts/lib/wrapper-boundary.sh ships beside this
18
+ # script in the plugin cache, so $(dirname)/lib/… resolves in both contexts
19
+ # (#10248 — the canonical wrapper-prefix grammar the COMMIT_RE below consumes).
20
+ #
21
+ # Usage:
22
+ # precommit-guard.sh "COMMAND" check a shell command string
23
+ # precommit-guard.sh --cwd DIR also check DIR's branch (a `cd DIR &&`
24
+ # or `git -C DIR` inside COMMAND wins)
25
+ #
26
+ # Exit 0 = allowed (not a commit, or not on main/master).
27
+ # Exit 1 = refused — reason on stderr.
28
+ # Exit 2 = usage error.
29
+
30
+ set -euo pipefail
31
+
32
+ COMMAND=""
33
+ CWD=""
34
+ while [[ $# -gt 0 ]]; do
35
+ case "$1" in
36
+ --cwd) CWD="${2:-}"; shift 2 ;;
37
+ -*) echo "precommit-guard.sh: unknown flag: $1" >&2; exit 2 ;;
38
+ *) COMMAND="$1"; shift ;;
39
+ esac
40
+ done
41
+
42
+ # Detection is per pipeline segment: a `git commit` can hide anywhere in a
43
+ # chain — `git add && git commit`, `cd repo; git commit`, `printf msg |
44
+ # git commit -F -`, `LEFTHOOK=0 git commit`. Split COMMAND on the chain
45
+ # operators (&&, ||, ;, |, newline), then judge each segment.
46
+ #
47
+ # Known lexical limits (documented, not silently missed): subshell/eval forms
48
+ # like `bash -c 'git commit'`, `$(git commit)`, `( git commit )`, quoted
49
+ # `-C`/`cd` paths containing spaces, `git -c <cfg> commit` side effects beyond
50
+ # detection, and commits created without `git commit` (merge/pull/cherry-pick/
51
+ # rebase/continue) are out of this guard's declared scope — commit-on-main ONLY.
52
+ # Opaque string payloads (`rtk run -c '…'`, `rtk summary --shell '…'`) join that
53
+ # same declared class — the boundary fragment deliberately excludes the
54
+ # -c/--command/--shell atoms so they cannot match here.
55
+ _PC_GUARD_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
56
+ unset VERIFICATION_ENV_ASN_RE VERIFICATION_LAUNCHER_RE VERIFICATION_RTK_RE VERIFICATION_BOUNDARY_PFX VERIFICATION_BOUNDARY_PFX_LOADED
57
+ if [[ -f "$_PC_GUARD_DIR/lib/wrapper-boundary.sh" ]]; then
58
+ # shellcheck source=/dev/null
59
+ source "$_PC_GUARD_DIR/lib/wrapper-boundary.sh" 2>/dev/null || true
60
+ fi
61
+ if [[ "${VERIFICATION_BOUNDARY_PFX_LOADED:-0}" != 1 ]]; then
62
+ unset VERIFICATION_ENV_ASN_RE VERIFICATION_LAUNCHER_RE VERIFICATION_RTK_RE VERIFICATION_BOUNDARY_PFX
63
+ echo "precommit-guard.sh: wrapper-boundary.sh unavailable at $_PC_GUARD_DIR/lib — commit gate runs pre-#10248 matching" >&2
64
+ fi
65
+ unset _PC_GUARD_DIR
66
+ # #10248: the shared fragment replaces the inline env-asn/launcher alternation —
67
+ # one canonical atom set for every boundary-anchored gate. The :- fallback is
68
+ # the PRE-FIX atom set (env + launcher) — a superset of this file's prior
69
+ # env*/launcher?/env* sandwich, which is the safe direction for a deny gate.
70
+ COMMIT_RE='^[[:space:]]*('"${VERIFICATION_BOUNDARY_PFX:-([A-Za-z_][A-Za-z_0-9]*=[^[:space:]]+|sudo|command|nice|env|xargs)}"'[[:space:]]+)*git([[:space:]]+(-C[[:space:]]+[^[:space:]]+|-c[[:space:]]+[^[:space:]]+|--git-dir=[^[:space:]]+|--git-dir[[:space:]]+[^[:space:]]+|-[A-Za-z]))*[[:space:]]+commit([[:space:]]|$)'
71
+
72
+ last_cd=""
73
+ while IFS= read -r seg; do
74
+ # Track the dir the chain has cd'd into — it applies to later segments.
75
+ cd_hit="$(grep -oE '(^|[[:space:]])cd[[:space:]]+[^[:space:]]+' <<<"$seg" | tail -n 1 | sed -E 's/.*cd[[:space:]]+//' || true)"
76
+ [[ -n "$cd_hit" ]] && last_cd="$cd_hit"
77
+
78
+ grep -qE "$COMMIT_RE" <<<"$seg" || continue
79
+
80
+ # Resolve the repo THIS segment commits into. Priority: the -C / --git-dir
81
+ # attached to the commit's own git invocation, then a GIT_DIR env-assignment
82
+ # prefix (LEFTHOOK=0-style prefixes are the reason env-assignments are scanned
83
+ # at all — dropping GIT_DIR would resolve the wrong repo); then the chain's
84
+ # most recent cd; then --cwd; then ambient $PWD.
85
+ target="" git_dir=""
86
+ if grep -qoE -- '--git-dir[=[:space:]][^[:space:]]+' <<<"$seg"; then
87
+ git_dir="$(grep -oE -- '--git-dir[=[:space:]][^[:space:]]+' <<<"$seg" | tail -n 1 | sed -E 's/^--git-dir[=[:space:]]+//' || true)"
88
+ elif grep -qoE -- '(^|[[:space:]])GIT_DIR=[^[:space:]]+' <<<"$seg"; then
89
+ git_dir="$(grep -oE -- '(^|[[:space:]])GIT_DIR=[^[:space:]]+' <<<"$seg" | tail -n 1 | sed -E 's/.*GIT_DIR=//' || true)"
90
+ else
91
+ git_c="$(grep -oE -- '-C[[:space:]]+[^[:space:]]+' <<<"$seg" | tail -n 1 | sed -E 's/^-C[[:space:]]+//' || true)"
92
+ [[ -n "$git_c" ]] && target="$git_c"
93
+ fi
94
+ if [[ -z "$target" && -z "$git_dir" ]]; then
95
+ for cand in "$last_cd" "$CWD" "$PWD"; do
96
+ [[ -n "$cand" && -d "$cand" ]] && target="$cand" && break
97
+ done
98
+ fi
99
+
100
+ if [[ -n "$git_dir" ]]; then
101
+ BRANCH="$(git --git-dir="$git_dir" rev-parse --abbrev-ref HEAD 2>/dev/null || true)"
102
+ elif [[ -n "$target" && -d "$target" ]]; then
103
+ BRANCH="$(git -C "$target" rev-parse --abbrev-ref HEAD 2>/dev/null || true)"
104
+ else
105
+ continue # nowhere to resolve — nothing to refuse on
106
+ fi
107
+ # The alternation is the stamped default-branch set — soleur:verification-scaffold
108
+ # emits this file with `@DEFAULT_BRANCHES@` substituted for the target's resolved default.
109
+ if [[ "$BRANCH" =~ ^(@DEFAULT_BRANCHES@)$ ]]; then
110
+ printf 'BLOCKED: Committing directly to %s is not allowed. Create a feature branch first.\n' "$BRANCH" >&2
111
+ exit 1
112
+ fi
113
+ done < <(printf '%s\n' "$COMMAND" | sed -E 's/&&|\|\||[;|]/\n/g')
114
+
115
+ exit 0