@soleur/opencode 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (812) hide show
  1. package/.claude-plugin/agents.manifest.json +476 -0
  2. package/.claude-plugin/plugin.json +42 -0
  3. package/README.md +44 -2
  4. package/agents/community/.gitkeep +0 -0
  5. package/agents/engineering/cto.md +87 -0
  6. package/agents/engineering/design/ddd-architect.md +95 -0
  7. package/agents/engineering/discovery/agent-finder.md +214 -0
  8. package/agents/engineering/discovery/functional-discovery.md +182 -0
  9. package/agents/engineering/infra/infra-security.md +151 -0
  10. package/agents/engineering/infra/platform-strategist.md +109 -0
  11. package/agents/engineering/infra/terraform-architect.md +171 -0
  12. package/agents/engineering/prompt-engineer.md +37 -0
  13. package/agents/engineering/research/best-practices-researcher.md +115 -0
  14. package/agents/engineering/research/framework-docs-researcher.md +93 -0
  15. package/agents/engineering/research/git-history-analyzer.md +53 -0
  16. package/agents/engineering/research/learnings-researcher.md +285 -0
  17. package/agents/engineering/research/repo-research-analyst.md +118 -0
  18. package/agents/engineering/review/agent-native-reviewer.md +279 -0
  19. package/agents/engineering/review/architecture-strategist.md +61 -0
  20. package/agents/engineering/review/code-quality-analyst.md +92 -0
  21. package/agents/engineering/review/code-simplicity-reviewer.md +109 -0
  22. package/agents/engineering/review/data-integrity-guardian.md +82 -0
  23. package/agents/engineering/review/data-migration-expert.md +98 -0
  24. package/agents/engineering/review/deployment-verification-agent.md +183 -0
  25. package/agents/engineering/review/dhh-rails-reviewer.md +46 -0
  26. package/agents/engineering/review/kieran-rails-reviewer.md +87 -0
  27. package/agents/engineering/review/legacy-code-expert.md +55 -0
  28. package/agents/engineering/review/observability-coverage-reviewer.md +147 -0
  29. package/agents/engineering/review/pattern-recognition-specialist.md +59 -0
  30. package/agents/engineering/review/performance-oracle.md +130 -0
  31. package/agents/engineering/review/security-sentinel.md +167 -0
  32. package/agents/engineering/review/semgrep-sast.md +36 -0
  33. package/agents/engineering/review/test-design-reviewer.md +150 -0
  34. package/agents/engineering/review/user-impact-reviewer.md +70 -0
  35. package/agents/engineering/workflow/pr-comment-resolver.md +69 -0
  36. package/agents/finance/budget-analyst.md +29 -0
  37. package/agents/finance/cfo.md +44 -0
  38. package/agents/finance/financial-reporter.md +30 -0
  39. package/agents/finance/revenue-analyst.md +30 -0
  40. package/agents/legal/clo.md +115 -0
  41. package/agents/legal/legal-compliance-auditor.md +110 -0
  42. package/agents/legal/legal-document-generator.md +134 -0
  43. package/agents/marketing/analytics-analyst.md +25 -0
  44. package/agents/marketing/brand-architect.md +181 -0
  45. package/agents/marketing/cmo.md +76 -0
  46. package/agents/marketing/conversion-optimizer.md +19 -0
  47. package/agents/marketing/copywriter.md +20 -0
  48. package/agents/marketing/fact-checker.md +70 -0
  49. package/agents/marketing/growth-strategist.md +145 -0
  50. package/agents/marketing/paid-media-strategist.md +28 -0
  51. package/agents/marketing/pricing-strategist.md +17 -0
  52. package/agents/marketing/programmatic-seo-specialist.md +25 -0
  53. package/agents/marketing/retention-strategist.md +23 -0
  54. package/agents/marketing/seo-aeo-analyst.md +164 -0
  55. package/agents/operations/coo.md +50 -0
  56. package/agents/operations/ops-advisor.md +78 -0
  57. package/agents/operations/ops-provisioner.md +101 -0
  58. package/agents/operations/ops-research.md +52 -0
  59. package/agents/operations/service-automator.md +278 -0
  60. package/agents/product/business-validator.md +206 -0
  61. package/agents/product/competitive-intelligence.md +89 -0
  62. package/agents/product/cpo.md +63 -0
  63. package/agents/product/design/ux-design-lead.md +209 -0
  64. package/agents/product/spec-flow-analyzer.md +122 -0
  65. package/agents/sales/cro.md +44 -0
  66. package/agents/sales/deal-architect.md +29 -0
  67. package/agents/sales/outbound-strategist.md +29 -0
  68. package/agents/sales/pipeline-analyst.md +29 -0
  69. package/agents/support/cco.md +48 -0
  70. package/agents/support/community-manager.md +570 -0
  71. package/agents/support/ticket-triage.md +70 -0
  72. package/bin/soleur-opencode.js +29 -0
  73. package/commands/go.md +659 -0
  74. package/commands/help.md +273 -0
  75. package/commands/sync.md +977 -0
  76. package/commands/version.md +103 -0
  77. package/hooks/antigravity-hooks.json +84 -0
  78. package/hooks/antigravity-session-start.sh +15 -0
  79. package/hooks/bare-root-cwd-guard.sh +131 -0
  80. package/hooks/browser-snapshot-credential-guard.sh +200 -0
  81. package/hooks/codex-session-start.sh +9 -0
  82. package/hooks/compaction-state.sh +525 -0
  83. package/hooks/destructive-command-guard.sh +1387 -0
  84. package/hooks/devin-session-start.sh +90 -0
  85. package/hooks/ext-filter-detect.sh +171 -0
  86. package/hooks/hooks.json +133 -0
  87. package/hooks/lib/hook-tool-kind.sh +24 -0
  88. package/hooks/lib/log-rotation.sh +176 -0
  89. package/hooks/lib/shell-argv.pl +576 -0
  90. package/hooks/memory-backstop.sh +1114 -0
  91. package/hooks/operator-stage-approval.sh +391 -0
  92. package/hooks/stop-hook.sh +367 -0
  93. package/hooks/unkept-promise-hook.sh +383 -0
  94. package/hooks/version-banner.sh +127 -0
  95. package/hooks/welcome-hook.sh +50 -0
  96. package/install.js +108 -0
  97. package/lib/agent-registry.ts +154 -0
  98. package/lib/c4-canonical-cli.mjs +34 -0
  99. package/lib/c4-canonical.mjs +46 -0
  100. package/lib/c4-from-components.ts +554 -0
  101. package/lib/go-routing.ts +81 -0
  102. package/lib/grok-inspect-contract.ts +311 -0
  103. package/lib/harness-model-map.ts +101 -0
  104. package/lib/harness-parity.ts +726 -0
  105. package/lib/harness-tool-map.ts +180 -0
  106. package/lib/harness.ts +716 -0
  107. package/lib/heartbeat-live-reconcile.ts +1153 -0
  108. package/lib/heartbeat-manifest.ts +342 -0
  109. package/lib/kb-coverage.ts +252 -0
  110. package/lib/pr-merge-poll.ts +103 -0
  111. package/lib/workflow-fidelity.ts +388 -0
  112. package/opencode/INSTRUCTIONS.md +152 -0
  113. package/opencode/agents/engineering/cto.md +10 -0
  114. package/opencode/agents/engineering/design/ddd-architect.md +10 -0
  115. package/opencode/agents/engineering/discovery/agent-finder.md +10 -0
  116. package/opencode/agents/engineering/discovery/functional-discovery.md +10 -0
  117. package/opencode/agents/engineering/infra/infra-security.md +10 -0
  118. package/opencode/agents/engineering/infra/platform-strategist.md +10 -0
  119. package/opencode/agents/engineering/infra/terraform-architect.md +10 -0
  120. package/opencode/agents/engineering/prompt-engineer.md +10 -0
  121. package/opencode/agents/engineering/research/best-practices-researcher.md +10 -0
  122. package/opencode/agents/engineering/research/framework-docs-researcher.md +10 -0
  123. package/opencode/agents/engineering/research/git-history-analyzer.md +10 -0
  124. package/opencode/agents/engineering/research/learnings-researcher.md +10 -0
  125. package/opencode/agents/engineering/research/repo-research-analyst.md +10 -0
  126. package/opencode/agents/engineering/review/agent-native-reviewer.md +10 -0
  127. package/opencode/agents/engineering/review/architecture-strategist.md +10 -0
  128. package/opencode/agents/engineering/review/code-quality-analyst.md +10 -0
  129. package/opencode/agents/engineering/review/code-simplicity-reviewer.md +10 -0
  130. package/opencode/agents/engineering/review/data-integrity-guardian.md +10 -0
  131. package/opencode/agents/engineering/review/data-migration-expert.md +10 -0
  132. package/opencode/agents/engineering/review/deployment-verification-agent.md +10 -0
  133. package/opencode/agents/engineering/review/dhh-rails-reviewer.md +10 -0
  134. package/opencode/agents/engineering/review/kieran-rails-reviewer.md +10 -0
  135. package/opencode/agents/engineering/review/legacy-code-expert.md +10 -0
  136. package/opencode/agents/engineering/review/observability-coverage-reviewer.md +10 -0
  137. package/opencode/agents/engineering/review/pattern-recognition-specialist.md +10 -0
  138. package/opencode/agents/engineering/review/performance-oracle.md +10 -0
  139. package/opencode/agents/engineering/review/security-sentinel.md +10 -0
  140. package/opencode/agents/engineering/review/semgrep-sast.md +10 -0
  141. package/opencode/agents/engineering/review/test-design-reviewer.md +10 -0
  142. package/opencode/agents/engineering/review/user-impact-reviewer.md +10 -0
  143. package/opencode/agents/engineering/workflow/pr-comment-resolver.md +10 -0
  144. package/opencode/agents/finance/budget-analyst.md +10 -0
  145. package/opencode/agents/finance/cfo.md +10 -0
  146. package/opencode/agents/finance/financial-reporter.md +10 -0
  147. package/opencode/agents/finance/revenue-analyst.md +10 -0
  148. package/opencode/agents/legal/clo.md +10 -0
  149. package/opencode/agents/legal/legal-compliance-auditor.md +10 -0
  150. package/opencode/agents/legal/legal-document-generator.md +10 -0
  151. package/opencode/agents/marketing/analytics-analyst.md +10 -0
  152. package/opencode/agents/marketing/brand-architect.md +10 -0
  153. package/opencode/agents/marketing/cmo.md +10 -0
  154. package/opencode/agents/marketing/conversion-optimizer.md +10 -0
  155. package/opencode/agents/marketing/copywriter.md +10 -0
  156. package/opencode/agents/marketing/fact-checker.md +10 -0
  157. package/opencode/agents/marketing/growth-strategist.md +10 -0
  158. package/opencode/agents/marketing/paid-media-strategist.md +10 -0
  159. package/opencode/agents/marketing/pricing-strategist.md +10 -0
  160. package/opencode/agents/marketing/programmatic-seo-specialist.md +10 -0
  161. package/opencode/agents/marketing/retention-strategist.md +10 -0
  162. package/opencode/agents/marketing/seo-aeo-analyst.md +10 -0
  163. package/opencode/agents/operations/coo.md +10 -0
  164. package/opencode/agents/operations/ops-advisor.md +10 -0
  165. package/opencode/agents/operations/ops-provisioner.md +10 -0
  166. package/opencode/agents/operations/ops-research.md +10 -0
  167. package/opencode/agents/operations/service-automator.md +10 -0
  168. package/opencode/agents/product/business-validator.md +10 -0
  169. package/opencode/agents/product/competitive-intelligence.md +10 -0
  170. package/opencode/agents/product/cpo.md +10 -0
  171. package/opencode/agents/product/design/ux-design-lead.md +10 -0
  172. package/opencode/agents/product/spec-flow-analyzer.md +10 -0
  173. package/opencode/agents/sales/cro.md +10 -0
  174. package/opencode/agents/sales/deal-architect.md +10 -0
  175. package/opencode/agents/sales/outbound-strategist.md +10 -0
  176. package/opencode/agents/sales/pipeline-analyst.md +10 -0
  177. package/opencode/agents/support/cco.md +10 -0
  178. package/opencode/agents/support/community-manager.md +10 -0
  179. package/opencode/agents/support/ticket-triage.md +10 -0
  180. package/opencode/commands/go.md +10 -0
  181. package/opencode/commands/help.md +10 -0
  182. package/opencode/commands/sync.md +10 -0
  183. package/opencode/commands/version.md +11 -0
  184. package/opencode/opencode.json +8 -0
  185. package/opencode/plugin.ts +493 -0
  186. package/package.json +36 -4
  187. package/scripts/admin-merge-ready.sh +545 -0
  188. package/scripts/admin-merge-ready.test.sh +753 -0
  189. package/scripts/affected-tests.sh +908 -0
  190. package/scripts/affected-tests.test.sh +1797 -0
  191. package/scripts/alpha-metrics.sh +78 -0
  192. package/scripts/alpha-metrics.test.sh +115 -0
  193. package/scripts/ancestor-signal-helpers.baseline.txt +16 -0
  194. package/scripts/audit-flag-flip.sh +107 -0
  195. package/scripts/check-red-on-main.sh +316 -0
  196. package/scripts/ci-head-verdict.sh +363 -0
  197. package/scripts/cloud-detect.sh +193 -0
  198. package/scripts/delegation-verify.sh +657 -0
  199. package/scripts/delegation-verify.test.sh +1424 -0
  200. package/scripts/deploy-arm.sh +475 -0
  201. package/scripts/domain-model-drift.sh +419 -0
  202. package/scripts/emit-decision.sh +144 -0
  203. package/scripts/emit-decision.test.sh +144 -0
  204. package/scripts/ext-filter-divergence-corpus.txt +15 -0
  205. package/scripts/ext-filter-divergence.sh +189 -0
  206. package/scripts/generate-c4-from-components.ts +442 -0
  207. package/scripts/grok-fidelity-gate.sh +68 -0
  208. package/scripts/grok-pre-push-gate.sh +232 -0
  209. package/scripts/harness-discovery-smoke.ts +906 -0
  210. package/scripts/harness-parity-census.ts +92 -0
  211. package/scripts/inngest-luks-alert-armed-probe.ts +29 -0
  212. package/scripts/install-opencode-adapter.ts +520 -0
  213. package/scripts/lib/affected-tests/common.sh +365 -0
  214. package/scripts/lib/affected-tests/go.sh +157 -0
  215. package/scripts/lib/affected-tests/js.sh +188 -0
  216. package/scripts/lib/affected-tests/nx-turbo.sh +98 -0
  217. package/scripts/lib/affected-tests/python.sh +185 -0
  218. package/scripts/lib/context-sanitize.sh +49 -0
  219. package/scripts/lib/domain-model-lib.sh +180 -0
  220. package/scripts/lib/ext-filter-grammar.tsv +34 -0
  221. package/scripts/lib/operator-script.sh +1236 -0
  222. package/scripts/lib/proc.sh +580 -0
  223. package/scripts/lib/session-state.sh +748 -0
  224. package/scripts/lib/tmp-classify.sh +843 -0
  225. package/scripts/lib/wrapper-boundary.sh +47 -0
  226. package/scripts/lint-ratchet.py +1547 -0
  227. package/scripts/monitor-pr-checks.sh +441 -0
  228. package/scripts/pipeline-tally.sh +756 -0
  229. package/scripts/pipeline-tally.test.sh +740 -0
  230. package/scripts/plugin-version.sh +528 -0
  231. package/scripts/precommit-guard.sh +113 -0
  232. package/scripts/precommit-guard.test.sh +254 -0
  233. package/scripts/reconcile-live-heartbeats.ts +705 -0
  234. package/scripts/render-c4-model.sh +217 -0
  235. package/scripts/resolve-git-root.sh +55 -0
  236. package/scripts/resolve-regenerable-conflicts.sh +363 -0
  237. package/scripts/resolve-regenerable-conflicts.test.sh +780 -0
  238. package/scripts/ruff-requirements.txt +22 -0
  239. package/scripts/run-in-pid-namespace.sh +98 -0
  240. package/scripts/run-in-pid-namespace.test.sh +290 -0
  241. package/scripts/scan-ancestor-signal-helpers.py +556 -0
  242. package/scripts/scan-ancestor-signal-helpers.test.sh +670 -0
  243. package/scripts/setup-ralph-loop.sh +238 -0
  244. package/scripts/sync-cursor-name-map.ts +316 -0
  245. package/scripts/sync-grok-agent-compat.ts +188 -0
  246. package/scripts/sync-npm-package.ts +178 -0
  247. package/scripts/sync-opencode-adapter.ts +479 -0
  248. package/scripts/sync-pr-behind.sh +534 -0
  249. package/scripts/sync-pr-behind.test.sh +252 -0
  250. package/scripts/taste-profile-update.sh +180 -0
  251. package/scripts/taste-profile-update.test.sh +167 -0
  252. package/scripts/write-budget-marker.sh +23 -0
  253. package/scripts/write-kb-coverage.ts +113 -0
  254. package/skills/admin-ip-refresh/SKILL.md +81 -0
  255. package/skills/admin-ip-refresh/references/admin-ip-refresh-procedure.md +201 -0
  256. package/skills/agent-browser/SKILL.md +698 -0
  257. package/skills/agent-browser/scripts/playwright-mcp-profile-slot.sh +304 -0
  258. package/skills/agent-browser/scripts/playwright-mcp-redact-proxy.py +964 -0
  259. package/skills/agent-browser/scripts/redact-a11y-snapshot.py +443 -0
  260. package/skills/agent-browser/test/fixtures/capture-playwright-mcp-fixtures.py +217 -0
  261. package/skills/agent-browser/test/fixtures/fake-passthrough-proxy.py +24 -0
  262. package/skills/agent-browser/test/fixtures/fake-playwright-mcp.py +131 -0
  263. package/skills/agent-browser/test/fixtures/make-proxy-mutant.py +48 -0
  264. package/skills/agent-browser/test/fixtures/odd-shapes/dialog-link-injection.json +10 -0
  265. package/skills/agent-browser/test/fixtures/odd-shapes/empty-content.json +5 -0
  266. package/skills/agent-browser/test/fixtures/odd-shapes/error-and-result.json +4 -0
  267. package/skills/agent-browser/test/fixtures/odd-shapes/error-code-bool.json +6 -0
  268. package/skills/agent-browser/test/fixtures/odd-shapes/error-code-string.json +6 -0
  269. package/skills/agent-browser/test/fixtures/odd-shapes/error-message-tree.json +6 -0
  270. package/skills/agent-browser/test/fixtures/odd-shapes/error-no-data.json +6 -0
  271. package/skills/agent-browser/test/fixtures/odd-shapes/error-string.json +4 -0
  272. package/skills/agent-browser/test/fixtures/odd-shapes/error-with-data.json +9 -0
  273. package/skills/agent-browser/test/fixtures/odd-shapes/evaluate-escaped-object.json +10 -0
  274. package/skills/agent-browser/test/fixtures/odd-shapes/invalid-utf8.json +4 -0
  275. package/skills/agent-browser/test/fixtures/odd-shapes/link-result.json +10 -0
  276. package/skills/agent-browser/test/fixtures/odd-shapes/list-two-results.json +6 -0
  277. package/skills/agent-browser/test/fixtures/odd-shapes/meta-in-result.json +13 -0
  278. package/skills/agent-browser/test/fixtures/odd-shapes/no-content.json +5 -0
  279. package/skills/agent-browser/test/fixtures/odd-shapes/quoted-key.json +10 -0
  280. package/skills/agent-browser/test/fixtures/odd-shapes/resource-block.json +18 -0
  281. package/skills/agent-browser/test/fixtures/odd-shapes/result-and-method.json +11 -0
  282. package/skills/agent-browser/test/fixtures/odd-shapes/result-string.json +3 -0
  283. package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped-one-row.json +10 -0
  284. package/skills/agent-browser/test/fixtures/odd-shapes/run-code-escaped.json +10 -0
  285. package/skills/agent-browser/test/fixtures/odd-shapes/structured-content.json +13 -0
  286. package/skills/agent-browser/test/fixtures/odd-shapes/tools-list-no-tools.json +5 -0
  287. package/skills/agent-browser/test/fixtures/odd-shapes/tree-no-credential.json +10 -0
  288. package/skills/agent-browser/test/fixtures/odd-shapes/two-text-blocks.json +14 -0
  289. package/skills/agent-browser/test/fixtures/odd-shapes/unparsable-line.json +3 -0
  290. package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-brace.json +10 -0
  291. package/skills/agent-browser/test/fixtures/odd-shapes/value-contains-link-substring.json +10 -0
  292. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/close.json +12 -0
  293. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/evaluate.json +12 -0
  294. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/find.json +12 -0
  295. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/framing.json +6 -0
  296. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/initialize.json +14 -0
  297. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate-link.json +12 -0
  298. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/navigate.json +12 -0
  299. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/roots-list-request.json +5 -0
  300. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/screenshot.json +17 -0
  301. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-filename.json +12 -0
  302. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-json.json +12 -0
  303. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot-meta-raw.json +12 -0
  304. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/snapshot.json +12 -0
  305. package/skills/agent-browser/test/fixtures/playwright-mcp-0.0.78/tools-list.json +827 -0
  306. package/skills/agent-browser/test/fixtures/proxy-session-driver.py +138 -0
  307. package/skills/agent-browser/test/fixtures/session-facts.py +102 -0
  308. package/skills/agent-browser/test/playwright-mcp-lifetime.test.sh +1620 -0
  309. package/skills/agent-browser/test/playwright-mcp-redact-proxy.test.sh +1599 -0
  310. package/skills/agent-browser/test/redact-a11y-snapshot.test.sh +527 -0
  311. package/skills/agent-native-architecture/SKILL.md +479 -0
  312. package/skills/agent-native-architecture/references/action-parity-discipline.md +430 -0
  313. package/skills/agent-native-architecture/references/agent-execution-patterns.md +483 -0
  314. package/skills/agent-native-architecture/references/agent-native-testing.md +605 -0
  315. package/skills/agent-native-architecture/references/architecture-patterns.md +493 -0
  316. package/skills/agent-native-architecture/references/dynamic-context-injection.md +358 -0
  317. package/skills/agent-native-architecture/references/files-universal-interface.md +314 -0
  318. package/skills/agent-native-architecture/references/from-primitives-to-domain-tools.md +381 -0
  319. package/skills/agent-native-architecture/references/mcp-tool-design.md +524 -0
  320. package/skills/agent-native-architecture/references/mobile-patterns.md +897 -0
  321. package/skills/agent-native-architecture/references/product-implications.md +478 -0
  322. package/skills/agent-native-architecture/references/refactoring-to-prompt-native.md +342 -0
  323. package/skills/agent-native-architecture/references/self-modification.md +294 -0
  324. package/skills/agent-native-architecture/references/shared-workspace-architecture.md +700 -0
  325. package/skills/agent-native-architecture/references/system-prompt-design.md +263 -0
  326. package/skills/agent-native-audit/SKILL.md +300 -0
  327. package/skills/agent-native-audit/workflows/agent-native-audit.workflow.js +423 -0
  328. package/skills/andrew-kane-gem-writer/SKILL.md +189 -0
  329. package/skills/andrew-kane-gem-writer/references/database-adapters.md +231 -0
  330. package/skills/andrew-kane-gem-writer/references/module-organization.md +121 -0
  331. package/skills/andrew-kane-gem-writer/references/rails-integration.md +183 -0
  332. package/skills/andrew-kane-gem-writer/references/resources.md +126 -0
  333. package/skills/andrew-kane-gem-writer/references/testing-patterns.md +261 -0
  334. package/skills/architecture/SKILL.md +436 -0
  335. package/skills/architecture/references/adr-template.md +154 -0
  336. package/skills/architecture/references/likec4-reference.md +136 -0
  337. package/skills/architecture/references/nfr-reference.md +126 -0
  338. package/skills/archive-kb/SKILL.md +86 -0
  339. package/skills/archive-kb/scripts/archive-kb.sh +300 -0
  340. package/skills/archive-kb/test/archive-kb-partial-run.test.sh +276 -0
  341. package/skills/atdd-developer/SKILL.md +65 -0
  342. package/skills/brainstorm/SKILL.md +701 -0
  343. package/skills/brainstorm/references/brainstorm-brand-workshop.md +153 -0
  344. package/skills/brainstorm/references/brainstorm-domain-config.md +63 -0
  345. package/skills/brainstorm/references/brainstorm-validation-workshop.md +65 -0
  346. package/skills/brainstorm/references/ui-surface-terms.md +42 -0
  347. package/skills/brainstorm-techniques/SKILL.md +231 -0
  348. package/skills/brainstorm-techniques/references/decision-principles.md +150 -0
  349. package/skills/brainstorm-techniques/references/phase-boundaries.md +103 -0
  350. package/skills/brainstorm-techniques/references/standing-delegation.md +407 -0
  351. package/skills/brainstorm-techniques/references/technical-ruling-delegation.md +174 -0
  352. package/skills/campaign-calendar/SKILL.md +145 -0
  353. package/skills/cf-token-scope/SKILL.md +164 -0
  354. package/skills/cf-token-scope/references/widen-playbook.md +114 -0
  355. package/skills/cf-token-scope/scripts/cf-token-scope.sh +253 -0
  356. package/skills/changelog/SKILL.md +142 -0
  357. package/skills/code-to-prd/SKILL.md +66 -0
  358. package/skills/code-to-prd/references/banner-template.md +12 -0
  359. package/skills/code-to-prd/references/prd-template.md +41 -0
  360. package/skills/code-to-prd/scripts/code-to-prd.sh +634 -0
  361. package/skills/code-to-prd/test/code-to-prd.test.sh +447 -0
  362. package/skills/code-to-prd/test/fixture/.env.example +7 -0
  363. package/skills/code-to-prd/test/fixture/app/about/page.tsx +11 -0
  364. package/skills/code-to-prd/test/fixture/app/api/health/route.ts +10 -0
  365. package/skills/code-to-prd/test/fixture/app/page.tsx +14 -0
  366. package/skills/code-to-prd/test/fixture/next.config.mjs +3 -0
  367. package/skills/code-to-prd/test/fixture/package.json +6 -0
  368. package/skills/cohort-status/SKILL.md +62 -0
  369. package/skills/community/SKILL.md +210 -0
  370. package/skills/community/scripts/bsky-community.sh +644 -0
  371. package/skills/community/scripts/bsky-setup.sh +631 -0
  372. package/skills/community/scripts/community-router.sh +93 -0
  373. package/skills/community/scripts/discord-community.sh +487 -0
  374. package/skills/community/scripts/discord-setup.sh +784 -0
  375. package/skills/community/scripts/github-community.sh +706 -0
  376. package/skills/community/scripts/hn-community.sh +233 -0
  377. package/skills/community/scripts/lib/hmac-sha1-b64.sh +126 -0
  378. package/skills/community/scripts/linkedin-community.sh +750 -0
  379. package/skills/community/scripts/linkedin-setup.sh +758 -0
  380. package/skills/community/scripts/x-community.sh +890 -0
  381. package/skills/community/scripts/x-setup.sh +713 -0
  382. package/skills/community/test/community-argv.test.sh +2922 -0
  383. package/skills/community/test/github-community.test.sh +981 -0
  384. package/skills/competitive-analysis/SKILL.md +69 -0
  385. package/skills/competitive-analysis/references/peer-plugin-audit.md +218 -0
  386. package/skills/compound/SKILL.md +673 -0
  387. package/skills/compound/scripts/token-efficiency-report.sh +334 -0
  388. package/skills/compound/test/phase-16.test.sh +379 -0
  389. package/skills/compound-capture/SKILL.md +791 -0
  390. package/skills/compound-capture/assets/critical-pattern-template.md +37 -0
  391. package/skills/compound-capture/assets/resolution-template.md +116 -0
  392. package/skills/compound-capture/references/yaml-schema.md +67 -0
  393. package/skills/compound-capture/schema.yaml +181 -0
  394. package/skills/constraint-scaffold/SKILL.md +175 -0
  395. package/skills/constraint-scaffold/references/boundary-readme.template +35 -0
  396. package/skills/constraint-scaffold/references/constraint-gates-workflow.template +69 -0
  397. package/skills/constraint-scaffold/references/depcruise-config.template +230 -0
  398. package/skills/constraint-scaffold/references/fix-constraints-stage-a.template +240 -0
  399. package/skills/constraint-scaffold/references/fix-constraints-stage-b.template +313 -0
  400. package/skills/constraint-scaffold/references/shared-runner.template +135 -0
  401. package/skills/constraint-scaffold/scripts/constraint-scaffold.sh +589 -0
  402. package/skills/constraint-scaffold/test/bite-proof.test.sh +1338 -0
  403. package/skills/constraint-scaffold/test/boundary.test.sh +734 -0
  404. package/skills/constraint-scaffold/test/emit-fix-constraints.test.sh +193 -0
  405. package/skills/constraint-scaffold/test/generator.test.sh +93 -0
  406. package/skills/constraint-scaffold/test/parity.test.sh +285 -0
  407. package/skills/content-writer/SKILL.md +242 -0
  408. package/skills/content-writer/scripts/blog-jargon-scan.sh +42 -0
  409. package/skills/cron-delete/SKILL.md +56 -0
  410. package/skills/cron-list/SKILL.md +54 -0
  411. package/skills/deepen-plan/SKILL.md +937 -0
  412. package/skills/deepen-plan/workflows/deepen-plan.workflow.js +488 -0
  413. package/skills/deploy/SKILL.md +115 -0
  414. package/skills/deploy/references/hetzner-setup.md +65 -0
  415. package/skills/deploy/scripts/deploy.sh +37 -0
  416. package/skills/deploy-docs/SKILL.md +95 -0
  417. package/skills/dhh-rails-style/SKILL.md +203 -0
  418. package/skills/dhh-rails-style/references/architecture.md +717 -0
  419. package/skills/dhh-rails-style/references/controllers.md +323 -0
  420. package/skills/dhh-rails-style/references/frontend.md +556 -0
  421. package/skills/dhh-rails-style/references/gems.md +316 -0
  422. package/skills/dhh-rails-style/references/models.md +388 -0
  423. package/skills/dhh-rails-style/references/testing.md +354 -0
  424. package/skills/discord-content/SKILL.md +126 -0
  425. package/skills/docs-site/SKILL.md +214 -0
  426. package/skills/drain-labeled-backlog/SKILL.md +203 -0
  427. package/skills/drain-labeled-backlog/scripts/group-by-area.sh +208 -0
  428. package/skills/drain-labeled-backlog/workflows/drain-labeled-backlog.workflow.js +433 -0
  429. package/skills/drain-prs/SKILL.md +142 -0
  430. package/skills/drain-prs/scripts/triage-prs.sh +192 -0
  431. package/skills/drain-prs/test/argv-ceiling.test.sh +183 -0
  432. package/skills/dspy-ruby/SKILL.md +634 -0
  433. package/skills/dspy-ruby/assets/config-template.rb +359 -0
  434. package/skills/dspy-ruby/assets/module-template.rb +326 -0
  435. package/skills/dspy-ruby/assets/signature-template.rb +143 -0
  436. package/skills/dspy-ruby/references/core-concepts.md +268 -0
  437. package/skills/dspy-ruby/references/optimization.md +623 -0
  438. package/skills/dspy-ruby/references/providers.md +335 -0
  439. package/skills/eval-harness/README.md +194 -0
  440. package/skills/eval-harness/SKILL.md +157 -0
  441. package/skills/eval-harness/enums/go-routes.json +13 -0
  442. package/skills/eval-harness/enums/incident-threshold.json +5 -0
  443. package/skills/eval-harness/enums/lane.json +5 -0
  444. package/skills/eval-harness/enums/tool-selection.json +20 -0
  445. package/skills/eval-harness/enums/triage-levels.json +5 -0
  446. package/skills/eval-harness/gated-skills.json +34 -0
  447. package/skills/eval-harness/models.generated.json +5 -0
  448. package/skills/eval-harness/promptfooconfig-go-routing.yaml +35 -0
  449. package/skills/eval-harness/promptfooconfig-incident-threshold.yaml +32 -0
  450. package/skills/eval-harness/promptfooconfig-lane-inference.yaml +33 -0
  451. package/skills/eval-harness/promptfooconfig-ticket-triage.yaml +34 -0
  452. package/skills/eval-harness/promptfooconfig-tool-selection.yaml +33 -0
  453. package/skills/eval-harness/prompts/go-baseline.txt +6 -0
  454. package/skills/eval-harness/prompts/go-skill.txt +21 -0
  455. package/skills/eval-harness/prompts/incident-threshold-baseline.txt +6 -0
  456. package/skills/eval-harness/prompts/incident-threshold-skill.txt +12 -0
  457. package/skills/eval-harness/prompts/lane-inference-baseline.txt +6 -0
  458. package/skills/eval-harness/prompts/lane-inference-skill.txt +15 -0
  459. package/skills/eval-harness/prompts/tool-selection-baseline.txt +19 -0
  460. package/skills/eval-harness/prompts/tool-selection-skill.txt +22 -0
  461. package/skills/eval-harness/prompts/triage-baseline.txt +7 -0
  462. package/skills/eval-harness/prompts/triage-skill.txt +10 -0
  463. package/skills/eval-harness/scripts/eval-gate.cjs +318 -0
  464. package/skills/eval-harness/scripts/extract-block.cjs +87 -0
  465. package/skills/eval-harness/scripts/gate-classification.cjs +28 -0
  466. package/skills/eval-harness/scripts/gen-models.sh +41 -0
  467. package/skills/eval-harness/scripts/gen-skill-prompt.cjs +177 -0
  468. package/skills/eval-harness/scripts/measure-classification.cjs +30 -0
  469. package/skills/eval-harness/scripts/parse-label.cjs +93 -0
  470. package/skills/eval-harness/scripts/verdict.cjs +132 -0
  471. package/skills/eval-harness/tasks/go-routing.jsonl +8 -0
  472. package/skills/eval-harness/tasks/incident-threshold.jsonl +7 -0
  473. package/skills/eval-harness/tasks/lane-inference.jsonl +7 -0
  474. package/skills/eval-harness/tasks/ticket-triage.jsonl +6 -0
  475. package/skills/eval-harness/tasks/tool-selection.jsonl +15 -0
  476. package/skills/eval-harness/test/eval-gate.test.sh +132 -0
  477. package/skills/eval-harness/test/extract-block.test.sh +87 -0
  478. package/skills/eval-harness/test/gate-classification.test.sh +77 -0
  479. package/skills/eval-harness/test/gen-models.test.sh +75 -0
  480. package/skills/eval-harness/test/measure-classification.test.sh +74 -0
  481. package/skills/eval-harness/test/parse-label.test.sh +129 -0
  482. package/skills/eval-harness/test/registry-completeness.test.sh +109 -0
  483. package/skills/eval-harness/test/verdict.test.sh +123 -0
  484. package/skills/every-style-editor/SKILL.md +142 -0
  485. package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +529 -0
  486. package/skills/feature-tweet/SKILL.md +199 -0
  487. package/skills/feature-video/SKILL.md +412 -0
  488. package/skills/feature-video/scripts/check_deps.sh +281 -0
  489. package/skills/file-todos/SKILL.md +267 -0
  490. package/skills/file-todos/assets/todo-template.md +166 -0
  491. package/skills/fix-issue/SKILL.md +278 -0
  492. package/skills/fix-issue/references/agent-authored-exclusion.md +118 -0
  493. package/skills/fix-issue/references/exclude-label-jq-snippet.md +96 -0
  494. package/skills/flag-bootstrap/SETUP.md +142 -0
  495. package/skills/flag-create/SKILL.md +145 -0
  496. package/skills/flag-create/scripts/create.sh +273 -0
  497. package/skills/flag-delete/SKILL.md +167 -0
  498. package/skills/flag-delete/scripts/delete.sh +288 -0
  499. package/skills/flag-list/SKILL.md +99 -0
  500. package/skills/flag-list/scripts/list.sh +275 -0
  501. package/skills/flag-set-role/SKILL.md +229 -0
  502. package/skills/flag-set-role/scripts/flip.sh +774 -0
  503. package/skills/frontend-anti-slop/SKILL.md +106 -0
  504. package/skills/frontend-anti-slop/references/anti-patterns.md +199 -0
  505. package/skills/frontend-anti-slop/references/slop-rules.md +65 -0
  506. package/skills/frontend-anti-slop/scripts/tier1-scan.ts +525 -0
  507. package/skills/frontend-design/SKILL.md +77 -0
  508. package/skills/gdpr-gate/NOTICE +136 -0
  509. package/skills/gdpr-gate/SKILL.md +341 -0
  510. package/skills/gdpr-gate/references/fields.md +160 -0
  511. package/skills/gdpr-gate/references/layers/api-layer.md +355 -0
  512. package/skills/gdpr-gate/references/layers/auth-sessions.md +290 -0
  513. package/skills/gdpr-gate/references/layers/data-in-transit.md +331 -0
  514. package/skills/gdpr-gate/references/layers/data-lifecycle.md +341 -0
  515. package/skills/gdpr-gate/references/layers/frontend.md +249 -0
  516. package/skills/gdpr-gate/references/layers/testing-seeding.md +256 -0
  517. package/skills/gdpr-gate/references/leakage-vectors.md +248 -0
  518. package/skills/gdpr-gate/references/legacy/legal-consent-v1-prose.md +48 -0
  519. package/skills/gdpr-gate/references/legal-consent.md +140 -0
  520. package/skills/gdpr-gate/references/non-negotiables.md +60 -0
  521. package/skills/gdpr-gate/scripts/gdpr-gate.sh +271 -0
  522. package/skills/gdpr-gate/scripts/notice-frontmatter.sh +337 -0
  523. package/skills/gdpr-gate/scripts/path-denylist.txt +39 -0
  524. package/skills/gdpr-gate/scripts/repo-scan.sh +158 -0
  525. package/skills/gdpr-gate/scripts/vendor-drift-classify.sh +120 -0
  526. package/skills/gdpr-gate/scripts/vendor-pin-integrity.sh +237 -0
  527. package/skills/gemini-imagegen/SKILL.md +283 -0
  528. package/skills/gemini-imagegen/requirements.txt +5 -0
  529. package/skills/gemini-imagegen/scripts/_error_handling.py +146 -0
  530. package/skills/gemini-imagegen/scripts/compose_images.py +150 -0
  531. package/skills/gemini-imagegen/scripts/edit_image.py +137 -0
  532. package/skills/gemini-imagegen/scripts/gemini_images.py +256 -0
  533. package/skills/gemini-imagegen/scripts/generate_image.py +147 -0
  534. package/skills/gemini-imagegen/scripts/multi_turn_chat.py +223 -0
  535. package/skills/gemini-imagegen/scripts/test_error_handling.py +179 -0
  536. package/skills/git-worktree/SKILL.md +534 -0
  537. package/skills/git-worktree/scripts/git-repo-readiness-diag.sh +98 -0
  538. package/skills/git-worktree/scripts/worktree-manager.sh +4773 -0
  539. package/skills/git-worktree/test/create-from-origin-main.test.sh +116 -0
  540. package/skills/git-worktree/test/lease-protects-active.test.sh +1056 -0
  541. package/skills/git-worktree/test/no-repo-fail-loud.test.sh +88 -0
  542. package/skills/git-worktree/test/orphan-reaper-honest-count.test.sh +379 -0
  543. package/skills/git-worktree/test/reap-archive-persistence.test.sh +725 -0
  544. package/skills/git-worktree/test/stale-lock-sweep.test.sh +176 -0
  545. package/skills/go/SKILL.md +54 -0
  546. package/skills/growth/SKILL.md +164 -0
  547. package/skills/harvest-debt/SKILL.md +78 -0
  548. package/skills/harvest-debt/scripts/harvest-debt.sh +114 -0
  549. package/skills/heal-skill/SKILL.md +173 -0
  550. package/skills/help/SKILL.md +46 -0
  551. package/skills/incident/NOTICE +39 -0
  552. package/skills/incident/SKILL.md +395 -0
  553. package/skills/incident/scripts/dry-run.sh +448 -0
  554. package/skills/incident/scripts/redact-engine.py +412 -0
  555. package/skills/incident/scripts/redact-sentinel.sh +44 -0
  556. package/skills/incident/templates/pir.md +139 -0
  557. package/skills/incident/test/fixtures/dry-run-incident.json +26 -0
  558. package/skills/incident/test/fixtures/dry-run-secret-leak.json +26 -0
  559. package/skills/incident/test/fixtures/legacy-bash-scanner.sh +82 -0
  560. package/skills/incident/test/fixtures/positive-corpus.md +87 -0
  561. package/skills/incident/test/redact-sentinel.test.sh +1420 -0
  562. package/skills/invoice/SKILL.md +206 -0
  563. package/skills/kb-glossary/SKILL.md +71 -0
  564. package/skills/kb-glossary/references/glossary-format.md +111 -0
  565. package/skills/kb-glossary/references/rejected-request-register.md +115 -0
  566. package/skills/kb-search/SKILL.md +276 -0
  567. package/skills/kb-search/scripts/kb-search-cache.sh +123 -0
  568. package/skills/legal-audit/SKILL.md +161 -0
  569. package/skills/legal-generate/NOTICE +242 -0
  570. package/skills/legal-generate/SKILL.md +244 -0
  571. package/skills/legal-generate/references/templates/advisor-agreement/template.md +12 -0
  572. package/skills/legal-generate/references/templates/business-associate-agreement/template.md +112 -0
  573. package/skills/legal-generate/references/templates/cookie-notice/template.md +82 -0
  574. package/skills/legal-generate/references/templates/dpa-global/template.md +439 -0
  575. package/skills/legal-generate/references/templates/dpa-us/template.md +222 -0
  576. package/skills/legal-generate/references/templates/employee-offer-letter/template.md +75 -0
  577. package/skills/legal-generate/references/templates/master-services-agreement/template.md +252 -0
  578. package/skills/legal-generate/references/templates/mutual-nda/template.md +66 -0
  579. package/skills/legal-generate/references/templates/one-way-nda/template.md +38 -0
  580. package/skills/legal-generate/references/templates/privacy-policy-gdpr/template.md +427 -0
  581. package/skills/legal-generate/references/templates/privacy-policy-us/template.md +313 -0
  582. package/skills/legal-generate/references/templates/terms-of-use/template.md +75 -0
  583. package/skills/legal-generate/scripts/strip-vendor-credit.sh +96 -0
  584. package/skills/linear-fetch/SKILL.md +247 -0
  585. package/skills/linear-fetch/scripts/assert-no-linear-telemetry.sh +66 -0
  586. package/skills/linear-fetch/scripts/redact-linear-urls.sh +51 -0
  587. package/skills/linear-fetch/scripts/render-caller-template.sh +36 -0
  588. package/skills/linear-fetch/test/assert-no-linear-telemetry.test.sh +113 -0
  589. package/skills/linear-fetch/test/parity.test.sh +112 -0
  590. package/skills/linear-fetch/test/persist-safe-integration.test.sh +191 -0
  591. package/skills/linear-fetch/test/redact-linear-urls.test.sh +226 -0
  592. package/skills/merge-pr/SKILL.md +668 -0
  593. package/skills/model-launch-review/SKILL.md +255 -0
  594. package/skills/model-launch-review/scripts/audit-models.sh +501 -0
  595. package/skills/one-shot/SKILL.md +316 -0
  596. package/skills/one-shot/references/token-discipline.md +74 -0
  597. package/skills/operator-bootstrap/SKILL.md +412 -0
  598. package/skills/operator-bootstrap/template.sh +439 -0
  599. package/skills/operator-digest/SKILL.md +287 -0
  600. package/skills/operator-digest/assets/operator-digest.workflow.yml +175 -0
  601. package/skills/operator-digest/scripts/digest-scrub.sh +119 -0
  602. package/skills/operator-digest/scripts/provision-operator-digest-repo.sh +147 -0
  603. package/skills/operator-rephrase/SKILL.md +98 -0
  604. package/skills/pencil-setup/SKILL.md +201 -0
  605. package/skills/pencil-setup/scripts/check_deps.sh +556 -0
  606. package/skills/pencil-setup/scripts/copy_adapter.sh +80 -0
  607. package/skills/pencil-setup/scripts/package-lock.json +1172 -0
  608. package/skills/pencil-setup/scripts/package.json +14 -0
  609. package/skills/pencil-setup/scripts/pencil-error-enrichment.mjs +21 -0
  610. package/skills/pencil-setup/scripts/pencil-mcp-adapter.mjs +733 -0
  611. package/skills/pencil-setup/scripts/pencil-response-classify.mjs +38 -0
  612. package/skills/pencil-setup/scripts/pencil-save-gate.mjs +26 -0
  613. package/skills/pencil-setup/scripts/sanitize-filename.mjs +25 -0
  614. package/skills/plan/SKILL.md +1140 -0
  615. package/skills/plan/references/differential-migration-testing.md +185 -0
  616. package/skills/plan/references/plan-community-discovery.md +42 -0
  617. package/skills/plan/references/plan-founder-check.md +137 -0
  618. package/skills/plan/references/plan-functional-overlap.md +25 -0
  619. package/skills/plan/references/plan-host-fanout.md +51 -0
  620. package/skills/plan/references/plan-issue-templates.md +779 -0
  621. package/skills/plan/references/plan-network-outage-checklist.md +131 -0
  622. package/skills/plan/references/plan-scope-check.md +126 -0
  623. package/skills/plan/references/plan-sharp-edges.md +325 -0
  624. package/skills/plan/references/plan-signoff-lifecycle.md +12 -0
  625. package/skills/plan/references/webapp-cwv-observability.md +143 -0
  626. package/skills/plan-review/SKILL.md +91 -0
  627. package/skills/plan-review/lib/named-panel.mjs +58 -0
  628. package/skills/plan-review/workflows/plan-review.workflow.js +477 -0
  629. package/skills/postmerge/SKILL.md +642 -0
  630. package/skills/postmerge/references/deploy-status-debugging.md +138 -0
  631. package/skills/postmerge/references/graceful-degradation.md +20 -0
  632. package/skills/postmerge/references/sentry-error-count-delta.md +137 -0
  633. package/skills/preflight/SKILL.md +1553 -0
  634. package/skills/preflight/references/check-13-founder-check.md +286 -0
  635. package/skills/preflight/scripts/founder-check.py +1640 -0
  636. package/skills/preflight/scripts/parse-form-a.awk +107 -0
  637. package/skills/preflight/scripts/probe-verb-gate.sh +108 -0
  638. package/skills/product-roadmap/SKILL.md +357 -0
  639. package/skills/product-roadmap/scripts/roadmap-reconcile.sh +327 -0
  640. package/skills/provision-cloudflare/SKILL.md +67 -0
  641. package/skills/provision-cloudflare/scripts/provision-cloudflare.sh +271 -0
  642. package/skills/provision-doppler/SKILL.md +58 -0
  643. package/skills/provision-doppler/scripts/provision-doppler.sh +358 -0
  644. package/skills/provision-github/SKILL.md +59 -0
  645. package/skills/provision-github/scripts/provision-github.sh +300 -0
  646. package/skills/provision-hetzner/SKILL.md +76 -0
  647. package/skills/provision-hetzner/scripts/provision-hetzner.sh +262 -0
  648. package/skills/provision-hetzner/test/fixture/knowledge-base/legal/tenant-dpa-register.md +26 -0
  649. package/skills/provision-hetzner/test/fixture/provision-hetzner-dry-run.golden +34 -0
  650. package/skills/provision-hetzner/test/provision-hetzner-characterization.test.sh +227 -0
  651. package/skills/qa/SKILL.md +263 -0
  652. package/skills/qa/references/browser-preflight.md +22 -0
  653. package/skills/questionnaire-generate/SKILL.md +328 -0
  654. package/skills/questionnaire-generate/references/questionnaire.template +60 -0
  655. package/skills/rclone/SKILL.md +162 -0
  656. package/skills/rclone/scripts/check_setup.sh +63 -0
  657. package/skills/release-announce/SKILL.md +65 -0
  658. package/skills/release-docs/SKILL.md +92 -0
  659. package/skills/reproduce-bug/SKILL.md +358 -0
  660. package/skills/resolve-debt/SKILL.md +85 -0
  661. package/skills/resolve-debt/scripts/resolve-debt.py +584 -0
  662. package/skills/resolve-parallel/SKILL.md +45 -0
  663. package/skills/resolve-parallel/workflows/resolve-parallel.workflow.js +415 -0
  664. package/skills/resolve-pr-parallel/SKILL.md +68 -0
  665. package/skills/resolve-pr-parallel/workflows/resolve-pr-parallel.workflow.js +419 -0
  666. package/skills/resolve-todo-parallel/SKILL.md +57 -0
  667. package/skills/resolve-todo-parallel/workflows/resolve-todo-parallel.workflow.js +398 -0
  668. package/skills/review/SKILL.md +1621 -0
  669. package/skills/review/references/anti-slop-scanner-hook.md +40 -0
  670. package/skills/review/references/defect-classes-migrations.md +9 -0
  671. package/skills/review/references/generated-input-oracle-surfaces.md +15 -0
  672. package/skills/review/references/review-e2e-testing.md +116 -0
  673. package/skills/review/references/review-todo-structure.md +165 -0
  674. package/skills/review/references/risk-tier-and-fix-rounds.md +95 -0
  675. package/skills/review/references/semgrep-custom-rules.yaml +174 -0
  676. package/skills/review/references/ultrathink-phases.md +98 -0
  677. package/skills/review/references/wfs.md +6 -0
  678. package/skills/review/scripts/emit-review-trailer.sh +499 -0
  679. package/skills/review/scripts/ensure-semgrep.sh +99 -0
  680. package/skills/review/scripts/fix-round-seats.sh +197 -0
  681. package/skills/review/test/emit-review-trailer.test.sh +387 -0
  682. package/skills/review/test/ensure-semgrep.test.sh +111 -0
  683. package/skills/review/test/fix-round-seats.test.sh +237 -0
  684. package/skills/review/workflows/README.md +147 -0
  685. package/skills/review/workflows/review.workflow.js +667 -0
  686. package/skills/schedule/SKILL.md +796 -0
  687. package/skills/seo-aeo/SKILL.md +139 -0
  688. package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
  689. package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
  690. package/skills/ship/SKILL.md +3022 -0
  691. package/skills/ship/references/adr-ordinal-collision.md +47 -0
  692. package/skills/ship/references/affected-gate-contract.md +115 -0
  693. package/skills/ship/references/ci-run-diagnosis.md +29 -0
  694. package/skills/ship/references/ci-workflow-authoring.md +68 -0
  695. package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
  696. package/skills/ship/references/cto-ruling-armed-push.md +5 -0
  697. package/skills/ship/references/decision-challenges-render.md +71 -0
  698. package/skills/ship/references/detached-battery-verdict.md +13 -0
  699. package/skills/ship/references/feature-tweet-draft.md +42 -0
  700. package/skills/ship/references/followthrough-issue-body-template.md +47 -0
  701. package/skills/ship/references/followthrough-stub-template.sh +92 -0
  702. package/skills/ship/references/merge-queue-dequeue.md +39 -0
  703. package/skills/ship/references/operator-holds.md +149 -0
  704. package/skills/ship/references/pipeline-tally-render.md +43 -0
  705. package/skills/ship/references/pr-overlap.md +153 -0
  706. package/skills/ship/references/queue-mode.md +7 -0
  707. package/skills/ship/references/ready-run-wait.md +36 -0
  708. package/skills/ship/references/red-on-main-quarantine.md +110 -0
  709. package/skills/ship/references/register-update-pr-pattern.md +88 -0
  710. package/skills/ship/references/settle-then-admin-merge.md +130 -0
  711. package/skills/ship/references/supabase-column-probe.md +13 -0
  712. package/skills/ship/scripts/auto-close-scan.sh +76 -0
  713. package/skills/ship/scripts/battery-owed.sh +403 -0
  714. package/skills/ship/scripts/hold-gate-eval.sh +410 -0
  715. package/skills/ship/scripts/net-issue-flow.sh +665 -0
  716. package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
  717. package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
  718. package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
  719. package/skills/skill-creator/SKILL.md +299 -0
  720. package/skills/skill-creator/references/api-security.md +248 -0
  721. package/skills/skill-creator/references/authoring-levers.md +110 -0
  722. package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
  723. package/skills/skill-creator/references/best-practices.md +431 -0
  724. package/skills/skill-creator/references/common-patterns.md +639 -0
  725. package/skills/skill-creator/references/core-principles.md +193 -0
  726. package/skills/skill-creator/references/executable-code.md +188 -0
  727. package/skills/skill-creator/references/iteration-and-testing.md +509 -0
  728. package/skills/skill-creator/references/official-spec.md +193 -0
  729. package/skills/skill-creator/references/recommended-structure.md +180 -0
  730. package/skills/skill-creator/references/skill-structure.md +396 -0
  731. package/skills/skill-creator/references/using-scripts.md +122 -0
  732. package/skills/skill-creator/references/using-templates.md +120 -0
  733. package/skills/skill-creator/references/workflows-and-validation.md +541 -0
  734. package/skills/skill-creator/scripts/init_skill.py +322 -0
  735. package/skills/skill-creator/scripts/package_skill.py +110 -0
  736. package/skills/skill-creator/scripts/quick_validate.py +64 -0
  737. package/skills/skill-creator/templates/router-skill.md +73 -0
  738. package/skills/skill-creator/templates/simple-skill.md +34 -0
  739. package/skills/skill-creator/workflows/add-reference.md +96 -0
  740. package/skills/skill-creator/workflows/add-script.md +104 -0
  741. package/skills/skill-creator/workflows/add-template.md +83 -0
  742. package/skills/skill-creator/workflows/add-workflow.md +128 -0
  743. package/skills/skill-creator/workflows/audit-skill.md +159 -0
  744. package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
  745. package/skills/skill-creator/workflows/create-new-skill.md +207 -0
  746. package/skills/skill-creator/workflows/get-guidance.md +134 -0
  747. package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
  748. package/skills/skill-creator/workflows/verify-skill.md +226 -0
  749. package/skills/skill-security-scan/SKILL.md +145 -0
  750. package/skills/skill-security-scan/references/disclaimer.md +21 -0
  751. package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
  752. package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
  753. package/skills/skill-security-scan/references/override-mechanism.md +171 -0
  754. package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
  755. package/skills/skill-security-scan/references/regex-patterns.md +136 -0
  756. package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
  757. package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
  758. package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
  759. package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
  760. package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
  761. package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
  762. package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
  763. package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
  764. package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
  765. package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
  766. package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
  767. package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
  768. package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
  769. package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
  770. package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
  771. package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
  772. package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
  773. package/skills/skill-security-scan/scripts/lib.sh +197 -0
  774. package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
  775. package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
  776. package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
  777. package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
  778. package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
  779. package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
  780. package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
  781. package/skills/social-distribute/SKILL.md +485 -0
  782. package/skills/spec-templates/SKILL.md +274 -0
  783. package/skills/sync/SKILL.md +49 -0
  784. package/skills/test-browser/SKILL.md +464 -0
  785. package/skills/test-browser/references/feature-map.md +161 -0
  786. package/skills/test-fix-loop/SKILL.md +159 -0
  787. package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
  788. package/skills/triage/SKILL.md +402 -0
  789. package/skills/trigger-cron/SKILL.md +136 -0
  790. package/skills/trigger-cron/scripts/trigger.sh +198 -0
  791. package/skills/user-set-role/SKILL.md +147 -0
  792. package/skills/user-set-role/scripts/set-role.sh +218 -0
  793. package/skills/user-story-writer/SKILL.md +77 -0
  794. package/skills/ux-audit/SKILL.md +251 -0
  795. package/skills/ux-audit/references/finding.schema.json +62 -0
  796. package/skills/ux-audit/references/route-list.yaml +95 -0
  797. package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
  798. package/skills/ux-audit/scripts/bot-signin.ts +135 -0
  799. package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
  800. package/skills/work/SKILL.md +1479 -0
  801. package/skills/work/references/end-of-work-resume.md +7 -0
  802. package/skills/work/references/hook-test-main-cwd.md +24 -0
  803. package/skills/work/references/key-principles.md +83 -0
  804. package/skills/work/references/property-testing.md +122 -0
  805. package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
  806. package/skills/work/references/work-agent-teams.md +97 -0
  807. package/skills/work/references/work-lifecycle-parallel.md +147 -0
  808. package/skills/work/references/work-lockfile-bumps.md +97 -0
  809. package/skills/work/references/work-scratch-sandboxes.md +212 -0
  810. package/skills/work/references/work-subagent-fanout.md +61 -0
  811. package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
  812. package/skills/xcode-test/SKILL.md +360 -0
@@ -0,0 +1,103 @@
1
+ ---
2
+ name: version
3
+ description: "Show the installed Soleur plugin version and whether a newer release exists"
4
+ argument-hint: ""
5
+ disable-model-invocation: true
6
+ ---
7
+
8
+ # Soleur Version
9
+
10
+ Report which Soleur plugin version is installed, what the latest release is, and how to update. Run the shared resolver; never guess or infer a version yourself. This command is Claude Code only and is started by the user; it is not run automatically.
11
+
12
+ This explicit run contacts github.com regardless of `SOLEUR_UPDATE_CHECK`, because you asked: one `git ls-remote --tags` against the public repo and, for a commit-hash or local-checkout install only, one unauthenticated GitHub compare API request whose URL includes the installed commit hash (for a local checkout that is the checkout's current commit, which may be one you have never pushed anywhere). It uses no tokens, no user git config and no credentials of its own (any proxy you configured in your environment is still used), and each request is time-limited.
13
+
14
+ ## Step 1: Run the resolver
15
+
16
+ Run via the **Bash tool**:
17
+
18
+ ```bash
19
+ if grep -q '"name"[[:space:]]*:[[:space:]]*"soleur"' "${CLAUDE_PLUGIN_ROOT}/.claude-plugin/plugin.json" 2>/dev/null; then
20
+ if [ -f "${CLAUDE_PLUGIN_ROOT}/scripts/plugin-version.sh" ]; then
21
+ bash "${CLAUDE_PLUGIN_ROOT}/scripts/plugin-version.sh" --compare --refresh
22
+ else
23
+ echo "source=unknown"
24
+ fi
25
+ else
26
+ echo "source=unknown"
27
+ fi
28
+ ```
29
+
30
+ If `CLAUDE_PLUGIN_ROOT` is not set or the script does not exist at that path, do not look for it anywhere else (a script from the current directory is not trusted): print `Installed: unknown` and stop. The output is `key=value` lines: `source`, `version`, `commit`, `marketplace`, `cache`, `latest_status`, `latest`, `latest_commit`, `relation`, `reason`, `cache_dir`. Use only these values. `source=checkout` means the plugin is loaded in place from a local git checkout (a local-folder marketplace or `--plugin-dir`); `commit` is that checkout's HEAD commit, read from its files without running git.
31
+
32
+ ## Step 2: Print this block
33
+
34
+ Print the block below, filling it from the resolver output. Keep it compact, no emoji.
35
+
36
+ ```text
37
+ Soleur plugin version
38
+
39
+ Installed: <version, or "commit <sha12>", or "commit <sha12> (local checkout, HEAD commit, not uncommitted or unsynced files)"> (source: <manifest | commit | checkout>)
40
+ Latest: <latest, e.g. v3.4.5> (or the WHY line from the rules below)
41
+ Status: <one status line from the rules below>
42
+
43
+ Update (Claude Code):
44
+ <for source=checkout: the local-folder steps from "Update commands" below, never the GitHub marketplace pair>
45
+ <otherwise: the two commands from "Update commands" below>
46
+ Restart the CLI afterwards; plugin changes apply on restart.
47
+
48
+ Session-start newer-release check (off by default): the version line itself is shown at
49
+ every session start with no network. To also check for a newer release, set
50
+ SOLEUR_UPDATE_CHECK=1 in your user-level Claude Code settings "env" block (not a checked-in
51
+ project settings file, and not in CI or ephemeral containers); remove it to turn it off.
52
+ ```
53
+
54
+ ### Installed line
55
+
56
+ - `source=manifest`: print `version`.
57
+ - `source=commit`: print `commit <commit>` (the 12-character hash). Do not invent a version number for it.
58
+ - `source=checkout`: print `commit <commit> (local checkout, HEAD commit, not uncommitted or unsynced files)` exactly as the template shows it (`<commit>` is the 12-character hash of the HEAD commit of the git checkout that contains the plugin folder, read from its files without running git). Do not invent a version number for it.
59
+ - `source=unknown`, `source=none`, or any value other than `manifest`, `commit` and `checkout`: print `Installed: unknown`, omit the `Update (Claude Code):` block, and say the plugin root could not be identified (not running from an installed plugin, a recognizable cache directory, or a local git checkout whose HEAD could be read: an unborn branch, a reftable or sha-256 repository or an unusual layout reads as unknown); tell the user they can compare with `claude plugin list` (you do not run it). Do not print a version.
60
+
61
+ ### Latest line (explain WHY when missing)
62
+
63
+ When `latest=` is present, print it. Label it "(cached, may be out of date)" whenever `cache=stale` or `latest_status` is `offline` or `timeout`. When `latest=` is absent, print the first matching reason, never a blank:
64
+
65
+ 1. `latest_status=offline`: "Could not reach github.com (offline or blocked)."
66
+ 2. `latest_status=timeout`: "The lookup timed out."
67
+ 3. `latest_status=no-git`: "`git` is not installed, so the release lookup was skipped."
68
+ 4. `latest_status=no-tags`: "github.com answered but returned no release tags."
69
+ 5. `cache=corrupt`: "The version cache is unreadable; it is rewritten on the next successful lookup." (the file is `latest-release.<install id>` under `cache_dir`, or `latest-release.checkout` for a local checkout).
70
+ 6. Anything else: "The latest release could not be determined."
71
+
72
+ ### Status line (compare result)
73
+
74
+ Read `relation` and `reason`:
75
+
76
+ - `relation=older`: "A newer release exists."
77
+ - `relation=current`: "No release newer than yours (latest tag vX.Y.Z)", with the `latest` value. This means only that no release tag newer than the installed commit or version was found. Never say "up to date" or "you are on the latest release".
78
+ - `relation=unknown`: "Cannot compare" plus the reason: `installed-unknown` (the installed version could not be read), `diverged` (the installed commit is not on the release line), `compare-failed` or `compare-unparseable` (the GitHub compare call failed; a local checkout may also be on a commit that was never published), `no-curl` (curl is missing), `stale-cache` (the answer came from a cached or failed lookup, so it is not trusted; run this command again when online), `cache-invalid` (the cached answer was unusable; run this command again).
79
+ - `relation` absent (no latest release is known): "Cannot compare: the latest release is not known", followed by the `latest_status` reason from the Latest line rules.
80
+
81
+ Never say "up to date" when the relation is unknown or absent, and never infer a relation by comparing strings yourself.
82
+
83
+ ### Update commands
84
+
85
+ Choose by `source` first, then (for `manifest` and `commit` only) by the `marketplace` value:
86
+
87
+ - `source=checkout` (in place from a local git checkout; use this arm whatever `marketplace` says, and never print the GitHub marketplace pair for it, which would replace the in-place install with a published copy). **Print these steps for the user to run; never run any of them yourself** (no `git`, no `claude`, no `gh`). The marketplace is the local folder and is named `soleur`. Tell the user how to tell the two layouts apart: `git -C <folder> rev-parse --is-bare-repository` prints `true` for a bare layout (`<folder>` is the Source path in `claude plugin marketplace list`, or the `--plugin-dir` path).
88
+ 1. Update the folder. Bare layout (`true`, files mirrored on disk): in the repository root run `git fetch --no-tags origin main:main`; if git refuses because `main` is checked out in a worktree, commit or stash there and run `git pull --ff-only origin main` inside that worktree instead (never force-move `main`: that can orphan unpushed commits). Then run `plugins/soleur/skills/git-worktree/scripts/worktree-manager.sh sync`, which mirrors the repository's HEAD to the files on disk (it overwrites tracked files there and does not fetch). Normal clone (`false`): update the branch you run from, for example `git pull --ff-only`.
89
+ 2. If the plugin was added as a local-folder marketplace (the usual case): `claude plugin marketplace update soleur` then `claude plugin update soleur@soleur`, then restart. If it was started with `--plugin-dir <path>`, skip this step (no marketplace command applies) and just restart.
90
+ The resolver cannot tell those two launch modes apart, so print both lines, each labelled. If the plugin folder is vendored inside another project's repository, the identity shown is that project's HEAD and these steps do not update the vendored copy.
91
+ - `source=manifest` or `source=commit`, with `marketplace` absent or `soleur-marketplace`:
92
+ `claude plugin marketplace update soleur-marketplace` then `claude plugin update soleur@soleur-marketplace`
93
+ - `soleur`:
94
+ `claude plugin marketplace update soleur` then `claude plugin update soleur@soleur`
95
+ - any other value: print the same pair with that marketplace name substituted.
96
+
97
+ If the install is project-scoped (`claude plugin list` shows Scope), add `--scope project` to the update command. See `knowledge-base/engineering/operations/runbooks/plugin-delivery-recovery.md` if an update says "already at the latest version" but nothing changes.
98
+
99
+ ## Output Rules
100
+
101
+ - Print only values the resolver returned or the fixed text above; never report a version you did not read.
102
+ - Do not run `gh`, `curl`, `git` or `claude` yourself; the resolver owns every network call.
103
+ - If the Bash tool is unavailable, say so and print only `Installed:` from the plugin root directory name if it is a 12-character hex commit hash; otherwise print `unknown`.
@@ -0,0 +1,84 @@
1
+ {
2
+ "description": "Soleur plugin hooks for Antigravity CLI",
3
+ "hooks": {
4
+ "PreToolUse": [
5
+ {
6
+ "matcher": "^(run_command|Bash|exec)$",
7
+ "hooks": [
8
+ {
9
+ "type": "command",
10
+ "command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/browser-snapshot-credential-guard.sh\""
11
+ }
12
+ ]
13
+ },
14
+ {
15
+ "matcher": "^(run_command|write_to_file|replace_file_content|Bash|Monitor|Write|Edit|MultiEdit|NotebookEdit)$",
16
+ "hooks": [
17
+ {
18
+ "type": "command",
19
+ "command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/operator-stage-approval.sh\"",
20
+ "timeout": 10
21
+ }
22
+ ]
23
+ },
24
+ {
25
+ "matcher": "^(run_command|Bash)$",
26
+ "hooks": [
27
+ {
28
+ "type": "command",
29
+ "command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/destructive-command-guard.sh\"",
30
+ "timeout": 10
31
+ }
32
+ ]
33
+ }
34
+ ],
35
+ "SessionStart": [
36
+ {
37
+ "matcher": "startup|resume|clear|compact",
38
+ "hooks": [
39
+ {
40
+ "type": "command",
41
+ "command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/antigravity-session-start.sh\""
42
+ }
43
+ ]
44
+ },
45
+ {
46
+ "matcher": "startup",
47
+ "hooks": [
48
+ {
49
+ "type": "command",
50
+ "command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/welcome-hook.sh\""
51
+ }
52
+ ]
53
+ },
54
+ {
55
+ "matcher": "startup",
56
+ "hooks": [
57
+ {
58
+ "type": "command",
59
+ "command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/version-banner.sh\"",
60
+ "timeout": 10
61
+ }
62
+ ]
63
+ }
64
+ ],
65
+ "Stop": [
66
+ {
67
+ "hooks": [
68
+ {
69
+ "type": "command",
70
+ "command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/stop-hook.sh\""
71
+ }
72
+ ]
73
+ },
74
+ {
75
+ "hooks": [
76
+ {
77
+ "type": "command",
78
+ "command": "bash \"${SOLEUR_PLUGIN_ROOT}/hooks/unkept-promise-hook.sh\""
79
+ }
80
+ ]
81
+ }
82
+ ]
83
+ }
84
+ }
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ [[ -n "${ANTIGRAVITY_CLI:-}" || -n "${AGY_VERSION:-}" || -n "${GEMINI_CLI:-}" || -n "${PLUGIN_ROOT:-}" ]] || exit 0
5
+ SOLEUR_PLUGIN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
6
+
7
+ # Run session start worktree cleanup if available
8
+ if [[ -f "$SOLEUR_PLUGIN_ROOT/skills/git-worktree/scripts/worktree-manager.sh" ]]; then
9
+ bash "$SOLEUR_PLUGIN_ROOT/skills/git-worktree/scripts/worktree-manager.sh" cleanup-merged 2>/dev/null || true
10
+ fi
11
+
12
+ jq -n --arg root "$SOLEUR_PLUGIN_ROOT" \
13
+ --rawfile instructions "$SOLEUR_PLUGIN_ROOT/antigravity/INSTRUCTIONS.md" \
14
+ '{hookSpecificOutput: {hookEventName: "SessionStart", additionalContext:
15
+ ("Soleur plugin root: " + $root + "\n" + $instructions)}}'
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env bash
2
+ # bare-root-cwd-guard.sh — PLUGIN-level SessionStart arm for the row-3 bare-repo-root
3
+ # misanchor (#10392). Same basename as .claude/hooks/bare-root-cwd-guard.sh on purpose:
4
+ # the dual-home naming convention lets the tree disambiguate the two arms (CTO ruling
5
+ # 2026-10-20). The repo arm reaches only this repo's sessions; THIS arm ships in the
6
+ # plugin payload and so reaches every other repository on a machine that installs it.
7
+ #
8
+ # Contract: always exits 0. On detection it emits exactly one SessionStart envelope
9
+ # {"hookSpecificOutput":{"hookEventName":"SessionStart","additionalContext": …}}
10
+ # whose additionalContext carries one `SOLEUR_BARE_ROOT_CWD source=plugin-session-start`
11
+ # marker line followed by a bounded [bare-root-cwd] redirect block. Every other path —
12
+ # no jq, no .cwd, non-bare cwd, deduped repo — prints NOTHING: a SessionStart hook that
13
+ # cannot emit valid JSON must emit nothing.
14
+ #
15
+ # cwd resolution: the envelope's `.cwd` first (jq-gated; some harnesses omit it), then
16
+ # DEVIN_PROJECT_DIR → CLAUDE_PROJECT_DIR → $PWD.
17
+ #
18
+ # Detection is the SAME three-term config-FILE predicate as the repo arm, the
19
+ # bare-head-self-heal copy, and the copy inlined in
20
+ # plugins/soleur/skills/git-worktree/scripts/git-repo-readiness-diag.sh —
21
+ # plugins/soleur/test/git-repo-readiness-diag.test.sh D5 pins the three-way parity:
22
+ # 1. `root` is a repo ROOT in the ADR-099 row-3 layout: `<root>/.git` is a real
23
+ # directory (not a file or symlink — a `gitdir:` redirect, a linked worktree, and
24
+ # a symlinked .git all fail here), `core.bare` reads `true` from its config FILE
25
+ # (never `--is-bare-repository`: ADR-173 records that a masked config reports true
26
+ # for any normal clone — the exact false-positive #10392 forbids), and
27
+ # 2. `--absolute-git-dir` resolves to exactly that directory.
28
+ # A `git init --bare` repo (mirror, server repo) fails term 1 — its git dir IS the
29
+ # root, there is no `<root>/.git` — so a genuinely bare customer repo never gets a
30
+ # misapplied redirect (P2). A session in a real worktree exits earlier on
31
+ # `--show-toplevel`, which also keeps a bare-root SUBDIRECTORY silent: that narrowing
32
+ # is deliberate (go.md's --is-bare-repository routing guard is the in-bare-subdir
33
+ # backstop).
34
+ #
35
+ # Dedup (CTO ruling 2026-10-20): when the target repo already carries its own arm —
36
+ # BOTH a `SOLEUR_BARE_ROOT_CWD` marker under `.claude/hooks/*.sh` AND a settings/devin
37
+ # registry referencing `session-rules-loader.sh` — the repo arm reports the session and
38
+ # this arm stays silent. A vendored-but-unwired tree hits term 1 only, so this arm still
39
+ # fires there; over-suppression is the worse failure direction.
40
+ #
41
+ # Redirect text is topology-generic (`git worktree add`) — a customer repo does not
42
+ # carry this repo's .worktrees/ machinery. A soleur `worktree-manager.sh` hint line is
43
+ # appended ONLY when the plugin-side script exists.
44
+ #
45
+ # No `set -e`, by design: every step is an explicit `|| exit 0`.
46
+ set -uo pipefail
47
+
48
+ # jq gates everything: it parses the incoming envelope AND emits the outgoing one, so
49
+ # without it the only correct behavior is silence.
50
+ command -v jq >/dev/null 2>&1 || exit 0
51
+
52
+ # An inherited git-location variable overrides `cd` and `git -C` alike, and would aim
53
+ # every probe below at a different repository than the one named (same unset list as
54
+ # the repo arm and the readiness-diag copy — the parity suite pins the GIT_DIR arm).
55
+ unset GIT_DIR GIT_WORK_TREE GIT_COMMON_DIR GIT_INDEX_FILE GIT_OBJECT_DIRECTORY \
56
+ GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_NAMESPACE
57
+
58
+ # Shared context sanitizer (#10395): the emitted path enters agent context, so the
59
+ # strip runs through the lib when it is readable. Plugin-side copy lives under
60
+ # scripts/lib/ (the plugin ships only plugins/soleur/**); the repo-side copy lives at
61
+ # .claude/hooks/lib/ and is byte-equal (context-sanitize.test.sh pins `cmp`).
62
+ _plugin_hooks_dir=$(cd -P "${BASH_SOURCE[0]%/*}" 2>/dev/null && pwd -P) || exit 0
63
+ _ctx_lib="$_plugin_hooks_dir/../scripts/lib/context-sanitize.sh"
64
+ # shellcheck source=/dev/null
65
+ [[ -r "$_ctx_lib" ]] && . "$_ctx_lib" || true
66
+ unset _ctx_lib _plugin_hooks_dir
67
+ if ! declare -F soleur_ctx_sanitize >/dev/null 2>&1; then
68
+ # Fallback — identical byte contract to the lib (C0 + DEL + NEL/LS/PS) so an
69
+ # unreadable lib degrades to the same strip, never to zero protection. Octal
70
+ # \177 for DEL: tr does not interpret \xHH. $'…' ANSI-C quoting is REQUIRED on
71
+ # the sed patterns: BSD sed does not interpret bare '\xHH' and would silently
72
+ # strip nothing.
73
+ soleur_ctx_sanitize() {
74
+ LC_ALL=C tr -d '\000-\037\177' \
75
+ | LC_ALL=C sed -e $'s/\xc2\x85//g' -e $'s/\xe2\x80\xa8//g' -e $'s/\xe2\x80\xa9//g'
76
+ }
77
+ fi
78
+
79
+ input=$(cat 2>/dev/null || true)
80
+ cwd=$(printf '%s' "$input" | jq -r '.cwd // empty' 2>/dev/null || true)
81
+ if [[ -z "$cwd" ]]; then
82
+ cwd="${DEVIN_PROJECT_DIR:-${CLAUDE_PROJECT_DIR:-$PWD}}"
83
+ fi
84
+ [[ -n "$cwd" ]] || exit 0
85
+ cd -- "$cwd" 2>/dev/null || exit 0
86
+ root=$(pwd -P) || exit 0
87
+
88
+ # A worktree answers --show-toplevel; only a bare shape falls through to the
89
+ # predicate. This is a worktree test, never a bareness test (Sharp Edges).
90
+ [[ -n "$(git rev-parse --show-toplevel 2>/dev/null)" ]] && exit 0
91
+
92
+ # Three-term ADR-099 row-3 predicate — fourth inline copy, parity-pinned.
93
+ [[ -d "$root/.git" && ! -L "$root/.git" ]] || exit 0
94
+ [[ "$(git config --file "$root/.git/config" --type=bool --get core.bare 2>/dev/null)" == "true" ]] || exit 0
95
+ git_dir=$(git rev-parse --absolute-git-dir 2>/dev/null) || exit 0
96
+ [[ "$git_dir" == "$root/.git" ]] || exit 0
97
+
98
+ # Dedup: the repo's own arm reports when it is BOTH present and wired. `grep -l` on
99
+ # the glob is the bounded, read-only probe; an unmatched glob or an absent registry
100
+ # file simply fails the term and this arm still fires.
101
+ if grep -lF 'SOLEUR_BARE_ROOT_CWD' "$root"/.claude/hooks/*.sh >/dev/null 2>&1 \
102
+ && { grep -qs 'session-rules-loader\.sh' "$root/.claude/settings.json" 2>/dev/null \
103
+ || grep -qs 'session-rules-loader\.sh' "$root/.devin/config.json" 2>/dev/null; }; then
104
+ exit 0
105
+ fi
106
+
107
+ # Sanitize the path for context: envelope-supplied, so strip control characters
108
+ # (incl. DEL, NEL, and the U+2028/U+2029 line-break class — #10395) and cap it.
109
+ safe_root=$(printf '%s' "$root" | soleur_ctx_sanitize | cut -c1-200)
110
+
111
+ block="SOLEUR_BARE_ROOT_CWD source=plugin-session-start
112
+ [bare-root-cwd] ${safe_root} is a bare repository root with a synced overlay of HEAD, not a worktree.
113
+ [bare-root-cwd] Route file-touching work through a linked worktree:
114
+ [bare-root-cwd] git worktree add <path> <branch>
115
+ [bare-root-cwd] then cd into the new worktree path before editing.
116
+ [bare-root-cwd] A .env at this root is NOT project configuration — do not read it as one."
117
+
118
+ # Soleur-hint line — gated on the plugin-side script existing on this machine
119
+ # (CTO ruling: the manager ships in the plugin payload, but the text is only
120
+ # emitted where it can actually run).
121
+ if [[ -n "${CLAUDE_PLUGIN_ROOT:-}" \
122
+ && -f "${CLAUDE_PLUGIN_ROOT}/skills/git-worktree/scripts/worktree-manager.sh" ]]; then
123
+ safe_wm=$(printf '%s' "${CLAUDE_PLUGIN_ROOT}/skills/git-worktree/scripts/worktree-manager.sh" \
124
+ | soleur_ctx_sanitize | cut -c1-300)
125
+ block+=$'\n'"[bare-root-cwd] Soleur worktree manager present: bash \"${safe_wm}\" --yes create <name>"
126
+ fi
127
+
128
+ jq -n --arg ctx "$block" \
129
+ '{hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:$ctx}}' 2>/dev/null \
130
+ || exit 0
131
+ exit 0
@@ -0,0 +1,200 @@
1
+ #!/usr/bin/env bash
2
+ # PreToolUse hook on Bash.
3
+ # Denies an `agent-browser ... snapshot` that is not routed through the
4
+ # accessibility-snapshot redactor.
5
+ #
6
+ # WHY (#7947, measured -- see
7
+ # knowledge-base/project/specs/feat-one-shot-7946-7947-sentry-org-token-and-snapshot-redaction/phase-0-measurement.md):
8
+ # an accessibility snapshot serializes the VALUE of input fields. A value the
9
+ # agent never supplied -- a password manager's autofill, a static value=, a JS
10
+ # assignment, or a generated-credential panel -- is rendered into the transcript
11
+ # and into any snapshot file written to disk. Nothing about the call looks
12
+ # credential-adjacent: the natural reason to snapshot a login page is to find
13
+ # out whether the flow advanced.
14
+ #
15
+ # Measured, and this is why the hook exists rather than a prose rule:
16
+ # * agent-browser 0.22.3 masks type=password (bullets) but renders a readonly
17
+ # type=text credential panel -- the "Token" class -- in CLEAR. That class
18
+ # has already fired in this repo (2026-05-19 Sentry token scope probe).
19
+ # * The Playwright MCP renders BOTH in clear.
20
+ #
21
+ # This hook covers the Bash path only. Property P7 ("the guards hold without the
22
+ # acting agent having to remember them") holds on the Bash path via this
23
+ # interceptor AND on a Playwright-MCP registration routed through
24
+ # skills/agent-browser/scripts/playwright-mcp-redact-proxy.py (#7980), which
25
+ # rewrites every tool result through the same redactor at the stdio boundary.
26
+ # An unwrapped Playwright-MCP registration remains uncovered — #8156 shipped
27
+ # the plugin's own wrapped registration (mcp__plugin_soleur_playwright__*), but
28
+ # a customer's OWN playwright entry is still exactly as wrapped as they
29
+ # configured it; the transcript-sink closer for that surface is Option C,
30
+ # deferred at #8286. That gap is stated rather than implied.
31
+ #
32
+ # Disposition is DENY, not rewrite: ADR-162 permits exactly one PreToolUse
33
+ # rewriter and grep-rewrite.sh holds it. Two hooks emitting updatedInput for the
34
+ # same call have undefined precedence and one rewrite is silently discarded.
35
+ #
36
+ # Fail-open by construction: any parse failure exits 0 with no decision. A hook
37
+ # that hard-fails on a malformed envelope would block every Bash call.
38
+ set -uo pipefail
39
+
40
+ # Operator kill-switch, matching the convention of the other PreToolUse hooks
41
+ # (grep-rewrite.sh carries SOLEUR_DISABLE_GREP_REWRITE). A false deny must not
42
+ # require editing the installed plugin to work around.
43
+ [[ -n "${SOLEUR_DISABLE_SNAPSHOT_GUARD:-}" ]] && exit 0
44
+
45
+ INPUT="$(cat 2>/dev/null || true)"
46
+ [[ -z "$INPUT" ]] && exit 0
47
+
48
+ # Fast path, before any subprocess. The deny predicate requires the literal
49
+ # `agent-browser`, and JSON escaping cannot alter it, so it survives verbatim in
50
+ # the envelope. This short-circuits ~every Bash call in a session without
51
+ # spawning jq -- which matters because this hook is registered on the Bash
52
+ # matcher and also loads on the hosted platform surface, so it runs on EVERY
53
+ # Bash tool call, not only on browser ones.
54
+ [[ "$INPUT" == *agent-browser* ]] || exit 0
55
+
56
+ # The redactor is anchored on its FILENAME, not on a bare word like "python3" or
57
+ # "redact". The assertion is on the anchor: a look-alike command name that does
58
+ # not redact must not satisfy the allow-predicate.
59
+ REDACTOR_ANCHOR='redact-a11y-snapshot'
60
+
61
+ # Portable remedy path. `${CLAUDE_PLUGIN_ROOT}` resolves to the installed plugin
62
+ # on a customer machine, where a repo-relative path does not exist at all -- the
63
+ # operator would get `python3: can't open file`, and the natural next move is the
64
+ # screenshot escape, which this very message says is unsafe for the one class
65
+ # with a recorded incident.
66
+ # The remedy this hook PRINTS is the form the operator will paste, so it must be
67
+ # the canonical one: bare `${CLAUDE_PLUGIN_ROOT}`, quoted. ADR-179 rejects the
68
+ # `:-default` variant precisely because the fallback resolves to a repo-relative
69
+ # path that exists on no customer machine -- it turns a loud failure into a
70
+ # silent one, which is the defect class this whole guard exists to remove.
71
+ REDACTOR_CMD='python3 "${CLAUDE_PLUGIN_ROOT}/skills/agent-browser/scripts/redact-a11y-snapshot.py"'
72
+
73
+ # `jq` unusable is NOT the same condition as a malformed envelope, and must not
74
+ # get the same silent pass. Without this branch a machine whose jq is missing OR
75
+ # BROKEN runs with the guard entirely off, forever, with no signal -- while
76
+ # SKILL.md tells the agent the gate exists, so its own reasoning defers to a
77
+ # control that is not there.
78
+ #
79
+ # Detected by RESULT, not by `command -v`: a jq that is present and exits
80
+ # non-zero (wrong build, missing shared library, exec-format error) passes a
81
+ # presence check and then fails exactly like an absent one. The first revision
82
+ # of this branch used `command -v` and the suite caught it.
83
+ # Canonical kind map (#8205): Devin wire names → Claude kinds. Absent lib
84
+ # degrades to passthrough, preserving this hook's fail-open invariant.
85
+ . "$(dirname "${BASH_SOURCE[0]}")/lib/hook-tool-kind.sh" 2>/dev/null || true
86
+ if ! type hook_tool_kind >/dev/null 2>&1; then
87
+ hook_tool_kind() { printf '%s\n' "${1-}"; }
88
+ echo "WARN: hook-tool-kind.sh missing — kind gates degrade to raw-name passthrough (silent-off under Devin)" >&2
89
+ fi
90
+
91
+ jq_rc=0
92
+ TOOL="$(printf '%s' "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null)" || jq_rc=$?
93
+ if [[ $jq_rc -ne 0 ]]; then
94
+ if grep -qE 'agent-browser([[:space:]]+[^|;&]*)?[[:space:]]snapshot\b' <<<"$INPUT" 2>/dev/null \
95
+ && ! grep -qF "$REDACTOR_ANCHOR" <<<"$INPUT" 2>/dev/null; then
96
+ printf '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"BLOCKED (degraded mode): jq is unusable on this machine (exit %s), so this hook cannot parse the tool envelope and fell back to a raw scan of stdin. That scan sees an unrouted `agent-browser snapshot`. Install a working jq, or route the snapshot through the redactor: %s"}}\n' "$jq_rc" "$REDACTOR_CMD"
97
+ fi
98
+ exit 0
99
+ fi
100
+
101
+ # Both names reach this check: hooks.json binds `^(Bash|exec)$` — Claude Code's
102
+ # tool is `Bash`, Devin's is `exec`, and either envelope may arrive. The kind
103
+ # map normalizes `exec` → `Bash`; dropping it here would silently no-op the
104
+ # guard on exactly the surface the matcher was widened for.
105
+ [[ "$(hook_tool_kind "$TOOL")" == "Bash" ]] || exit 0
106
+
107
+ CMD="$(printf '%s' "$INPUT" | jq -r '.tool_input.command // empty' 2>/dev/null || true)"
108
+ [[ -z "$CMD" ]] && exit 0
109
+
110
+ # Split into sequential segments. A pipe is NOT a separator -- it is what carries
111
+ # a snapshot into the redactor, so it must stay inside the segment being judged.
112
+ #
113
+ # A bare `&` IS a separator, and omitting it was a live bypass: the whole command
114
+ # stayed one segment, the segment contained the anchor, and an unrouted second
115
+ # invocation rode through. ADR-213 and the Article 30 register both assert this
116
+ # guard is judged per shell segment, so that claim was false as written.
117
+ #
118
+ # `2>&1` is protected first -- its `&` is a redirect, not a separator, and the
119
+ # approved form depends on it.
120
+ # awk, not sed: `\n` in a sed REPLACEMENT and `\x01` in a sed pattern are GNU
121
+ # extensions. On BSD sed (the macOS default) the replacement emits a literal
122
+ # `n` and `\x01` matches a literal `x01`, so NOTHING SPLITS -- the whole command
123
+ # stays one segment, the anchor is found somewhere in it, and every chained
124
+ # bypass this splitter exists to catch is ALLOWED. The guard would have been
125
+ # silently inert on macOS while its suite passed on Linux, which is the same
126
+ # portability class as the `mapfile` defect already fixed here and the one the
127
+ # repo's own 2026-09-07 learning records for `\x1b`.
128
+ #
129
+ # In awk's gsub REPLACEMENT an unescaped `&` means "the matched text", so
130
+ # restoring the literal `>&` requires `\\&`. Getting that wrong silently
131
+ # doubles the redirect and was caught by the round-trip row in the suite.
132
+ SPLIT="$(printf '%s' "$CMD" | awk '
133
+ { gsub(/>&/, "\001"); gsub(/&&|\|\||;|&/, "\n"); gsub(/\001/, ">\\&"); print }
134
+ ')"
135
+
136
+ offending=0
137
+ reason_detail=''
138
+ while IFS= read -r seg; do
139
+ # HERESTRING throughout (#6992/#7024): `grep -q` on a PIPE can die of SIGPIPE
140
+ # under pipefail and read as "no match", which in a policy gate is fail-OPEN.
141
+ #
142
+ # `snapshot` is word-anchored, so `screenshot` is never caught here.
143
+ grep -qE 'agent-browser([[:space:]]+[^|;&]*)?[[:space:]]snapshot\b' <<<"$seg" 2>/dev/null || continue
144
+
145
+ # The allow-predicate is NOT "the anchor appears somewhere". Substring
146
+ # presence was satisfied by a trailing COMMENT, and by a `tee` that writes the
147
+ # unredacted tree to disk on its way to the redactor -- which is precisely the
148
+ # sink this hook's own deny text names.
149
+ if ! grep -qE '\|[^|]*'"$REDACTOR_ANCHOR" <<<"$seg" 2>/dev/null; then
150
+ offending=1
151
+ reason_detail='the redactor is not downstream of a pipe in this command'
152
+ break
153
+ fi
154
+ # Judge sinks on the segment UPSTREAM of the redactor only. A `tee` or a
155
+ # redirect AFTER the redactor writes redacted bytes and is harmless; one
156
+ # BEFORE it writes the raw tree, which is the sink this hook's deny text
157
+ # names. Scoping to the prefix is what makes the difference decidable --
158
+ # without it the legitimate `... | redactor > snap.txt` is denied while the
159
+ # question the check means to ask goes unasked.
160
+ pre="${seg%%"$REDACTOR_ANCHOR"*}"
161
+
162
+ if grep -qE '(^|[|[:space:]])tee([[:space:]]|$)' <<<"$pre" 2>/dev/null; then
163
+ offending=1
164
+ reason_detail='`tee` writes the UNREDACTED snapshot to disk before the redactor sees it'
165
+ break
166
+ fi
167
+ # A file redirect of the snapshot itself, e.g. `snapshot -i > raw.txt`.
168
+ #
169
+ # Match a `>` (optionally `>>`, optionally with a leading fd digit) that is
170
+ # NOT followed by `&`, so an fd duplication such as `2>&1` -- the approved
171
+ # form -- is allowed while a file sink is not. The previous
172
+ # `[^0-9<>]>[^&|]` form excluded a digit BEFORE the `>` and a `|` AFTER it,
173
+ # so `1>/tmp/leak.txt` and `>|/tmp/leak.txt` were both measured ALLOWED.
174
+ if grep -qE '[0-9]?>>?([^&>]|$)' <<<"$pre" 2>/dev/null; then
175
+ offending=1
176
+ reason_detail='this command redirects the snapshot to a file, which bypasses the redactor'
177
+ break
178
+ fi
179
+ done <<<"$SPLIT"
180
+
181
+ [[ $offending -eq 1 ]] || exit 0
182
+
183
+ reason="BLOCKED: this \`agent-browser snapshot\` is not routed through the credential redactor — ${reason_detail}.
184
+
185
+ An accessibility snapshot serializes the VALUE of input fields. A value you never typed — a password manager's autofill, a static \`value=\`, or a generated-credential panel — is rendered into the transcript and into any snapshot file written to disk. Nothing about the call looks credential-adjacent, which is why this is a gate and not a guideline (#7947).
186
+
187
+ Route it through the redactor:
188
+
189
+ agent-browser snapshot -i 2>&1 | ${REDACTOR_CMD}
190
+
191
+ Or take a screenshot instead, which is safe for a \`type=password\` field — the browser renders it as dots.
192
+
193
+ MEASURED CAVEAT, because the obvious advice is wrong here: a screenshot is NOT safe for a generated-credential panel (a readonly \`type=text\` box named \"Token\", \"API key\", …). The browser renders those in clear, so the screenshot leaks exactly as the snapshot does. On a page showing a freshly-minted credential, capture neither — read the value with \`agent-browser get value <sel>\` into a file and shred it.
194
+
195
+ The redactor is defense-in-depth on one sink. It does not make snapshotting a credential page safe: it cannot see a localised field name, a credential outside a text-input role, or a value split across segmented inputs."
196
+
197
+ jq -nc --arg r "$reason" \
198
+ '{hookSpecificOutput: {hookEventName: "PreToolUse", permissionDecision: "deny", permissionDecisionReason: $r}}' 2>/dev/null
199
+
200
+ exit 0
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ [[ -n "${CODEX_THREAD_ID:-}" || -n "${PLUGIN_ROOT:-}" ]] || exit 0
5
+ SOLEUR_PLUGIN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
6
+ jq -n --arg root "$SOLEUR_PLUGIN_ROOT" \
7
+ --rawfile instructions "$SOLEUR_PLUGIN_ROOT/codex/INSTRUCTIONS.md" \
8
+ '{hookSpecificOutput: {hookEventName: "SessionStart", additionalContext:
9
+ ("Soleur plugin root: " + $root + "\n" + $instructions)}}'