@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,90 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ # DEVIN_DIR is in the gate deliberately: it is the measured cloud-only marker
5
+ # (cloud-probe.md), so if a repo-level SessionStart registration ever fires on a
6
+ # cloud VM this hook must still write — the `hook_source=repo` sentinel is what
7
+ # makes the classifier's non-plugin-source arm discriminate.
8
+ [[ -n "${DEVIN:-}" || -n "${DEVIN_HOME:-}" || -n "${DEVIN_PROJECT_DIR:-}" || -n "${DEVIN_PLUGIN_ROOT:-}" || -n "${DEVIN_DIR:-}" ]] || exit 0
9
+ SOLEUR_PLUGIN_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
10
+
11
+ # --- Local-session sentinel (Soleur Cloud Mode, FR1) ---
12
+ # Content-bearing proof-of-local for scripts/cloud-detect.sh: SessionStart is the
13
+ # one plugin hook event documented absent in Devin Cloud, so a plugin-sourced
14
+ # sentinel on this host is what distinguishes a local Devin session. The write is
15
+ # UNCONDITIONAL under the Devin-env guard above — no plugins/soleur dir check:
16
+ # user repos consuming via requiredPlugins don't vendor the plugin dir, and a
17
+ # scope guard there would invert detection into permanent false-cloud.
18
+ #
19
+ # hook_source records which registration fired, because a repo-level SessionStart
20
+ # firing on a cloud VM writes a matching-host sentinel that must NOT classify
21
+ # local. Resolution order:
22
+ # 1. SOLEUR_HOOK_SOURCE env override (a registration may inject it explicitly)
23
+ # 2. CLAUDE_PLUGIN_ROOT set and resolving to this script's plugin root → plugin
24
+ # 3. otherwise → repo (the fail-safe direction for detection)
25
+ #
26
+ # The sentinel write runs BEFORE the jq emit: a jq-less minimal host must not
27
+ # lose proof-of-local because the context emit died first (the write block is
28
+ # already `|| true`-isolated; a jq failure below still exits non-zero but the
29
+ # sentinel survives).
30
+ #
31
+ # Canonical copy of test-helpers.sh's assert_fixture_dir — P1a requires every
32
+ # tracked copy be byte-equal, and the P1b scanner recognises ONLY this name.
33
+ assert_fixture_dir() {
34
+ case "${1-}" in
35
+ "") printf 'FATAL: fixture dir is EMPTY; git -C "" would operate on %s\n' "$PWD" >&2; exit 2 ;;
36
+ */../*|*/..) printf 'FATAL: fixture dir %s contains ..; refusing\n' "$1" >&2; exit 2 ;;
37
+ /proc/*|/sys/*|/dev/*) printf 'FATAL: fixture dir %s is a synthetic-fs path; refusing\n' "$1" >&2; exit 2 ;;
38
+ /|//|/.) printf 'FATAL: fixture dir resolves to the filesystem root; refusing\n' >&2; exit 2 ;;
39
+ /*) : ;;
40
+ *) printf 'FATAL: fixture dir %s is RELATIVE; refusing\n' "$1" >&2; exit 2 ;;
41
+ esac
42
+ }
43
+ {
44
+ # An inherited GIT_DIR would aim rev-parse at a foreign repo and print the
45
+ # cwd-derived toplevel (e.g. `/` — which passes the absolute check below and
46
+ # would mint `/.devin` on a uid-0 host). Same scrub list as the bare-root arms.
47
+ unset GIT_DIR GIT_WORK_TREE GIT_COMMON_DIR GIT_INDEX_FILE GIT_OBJECT_DIRECTORY \
48
+ GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_NAMESPACE
49
+ _sentinel_root="$(git rev-parse --show-toplevel 2>/dev/null)" && \
50
+ # Guard: a non-empty ABSOLUTE path is required before any write — a relative or
51
+ # pathological toplevel (or a scrubbed-env empty) degrades to context-only;
52
+ # a bare-root session emits context only (#10392 audit).
53
+ [[ -n "$_sentinel_root" && "$_sentinel_root" == /* ]] && \
54
+ _sentinel_source="${SOLEUR_HOOK_SOURCE:-}" && \
55
+ if [[ -z "$_sentinel_source" ]]; then
56
+ _sentinel_source="repo"
57
+ if [[ -n "${CLAUDE_PLUGIN_ROOT:-}" ]] && \
58
+ [[ "$(cd "${CLAUDE_PLUGIN_ROOT}" 2>/dev/null && pwd)" == "$SOLEUR_PLUGIN_ROOT" ]]; then
59
+ _sentinel_source="plugin"
60
+ fi
61
+ fi && \
62
+ mkdir -p "$_sentinel_root/.devin" && \
63
+ _sentinel="$_sentinel_root/.devin/soleur-local-session" && \
64
+ # Single live registration (plugin hooks.json `""` — source matchers are
65
+ # dead under Devin, measured envelope-capture §3). The repo-source arm still
66
+ # matters: if a repo-level SessionStart registration ever fires on a cloud
67
+ # VM, its `repo` write must not mask an existing plugin-sourced sentinel on
68
+ # this host — that sentinel is proof-of-local, and masking it reads as
69
+ # permanent false-cloud.
70
+ if [[ "$_sentinel_source" == "repo" && -f "$_sentinel" ]] && \
71
+ grep -q '"hook_source"[[:space:]]*:[[:space:]]*"plugin"' "$_sentinel" 2>/dev/null; then
72
+ :
73
+ else
74
+ # ts is forensic-only (written for debugging; the classifier does not
75
+ # enforce freshness — a stale same-host sentinel is a documented limit).
76
+ # SOLEUR_HOOK_SOURCE is self-reported under the trusted-agent threat model —
77
+ # an env-forged `plugin` on a cloud VM still fails closed at the
78
+ # classifier's conflicting-evidence arm (DEVIN_DIR is set there).
79
+ assert_fixture_dir "$_sentinel" && \
80
+ printf '{"host":"%s","ts":"%s","hook_source":"%s"}\n' \
81
+ "$(hostname)" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$_sentinel_source" \
82
+ > "$_sentinel.tmp" && \
83
+ mv "$_sentinel.tmp" "$_sentinel"
84
+ fi
85
+ } || true
86
+
87
+ jq -n --arg root "$SOLEUR_PLUGIN_ROOT" \
88
+ --rawfile instructions "$SOLEUR_PLUGIN_ROOT/devin/INSTRUCTIONS.md" \
89
+ '{hookSpecificOutput: {hookEventName: "SessionStart", additionalContext:
90
+ ("Soleur plugin root: " + $root + "\n" + $instructions)}}'
@@ -0,0 +1,171 @@
1
+ #!/usr/bin/env bash
2
+ # ext-filter-detect.sh — SessionStart (matcher: startup|resume|clear|compact) external
3
+ # output-filter detector (#10230). Emits ONE JSON object on stdout — detected tools
4
+ # become newline-joined marker lines inside it (single-document stdout; sibling hooks
5
+ # all emit exactly one object):
6
+ # {"systemMessage": "SOLEUR_EXT_FILTER tool=<t> version=<v> posture=<p>
7
+ # via=on-path|settings-hook|proxy-env measured_at=<date|-> [path=<settings>] ref=soleur.ai/known-external-tools"}
8
+ # and `SOLEUR_EXT_FILTER tool=none` when nothing is detected — so "hook dead" is
9
+ # distinguishable from "no filter" (the same liveness argument compaction-state.sh
10
+ # makes for SOLEUR_COMPACTION_SKIPPED). systemMessage costs zero model tokens; this is
11
+ # an operator-facing line, never additionalContext.
12
+ #
13
+ # Marker semantics (the marker is a per-session public claim — key=value only, never
14
+ # editorial prose; severity lives in docs/pages/known-external-tools.md):
15
+ # posture=unmeasured the divergence harness has NOT run against this tool
16
+ # — explicitly not an assurance
17
+ # posture=literal-clean gate literals survived the divergence corpus (rtk, only
18
+ # after the Phase-3 measurement lands — see POSTURE_RTK below)
19
+ # posture=measured-incompatible gate-literal divergence measured (headroom; only when the
20
+ # detected version is <= the evaluated version and identity
21
+ # is corroborated — never on a bare basename PATH hit, which
22
+ # could be an unrelated `headroom`)
23
+ # tool=proxy posture=unknown ANTHROPIC_BASE_URL points at a non-default endpoint; a
24
+ # generic proxy (LiteLLM/Helicone/corporate) must NEVER be
25
+ # emitted under a vendor name
26
+ # version=unknown version probe failed -> posture floors at unmeasured
27
+ #
28
+ # Skips silently (exit 0, no output) when CLAUDE_PLUGIN_ROOT is unset, on the non-Claude
29
+ # harness markers version-banner.sh uses (CODEX_THREAD_ID, PLUGIN_ROOT), and when
30
+ # SOLEUR_DISABLE_EXT_FILTER_DETECT=1. The marker is Claude-Code-only by design — a Devin
31
+ # or other-harness session has no marker and that does NOT mean "no filter" (the doc's
32
+ # three-rung diagnostic has a manual path for those).
33
+ #
34
+ # Fails open: every path exits 0 and any error prints nothing. Plugin hooks are GLOBAL
35
+ # (they fire in every project), so a hook that errors or hangs would hit every session;
36
+ # the stdin read and every version probe are bounded.
37
+
38
+ [[ "${SOLEUR_DISABLE_EXT_FILTER_DETECT-}" == "1" ]] && exit 0
39
+ set -uo pipefail
40
+ case "$-" in
41
+ *x*) printf '[FATAL] refusing to run under xtrace: this script emits marker text and -x would echo it (see #7797)\n' >&2; exit 78 ;;
42
+ esac
43
+ trap 'exit 0' EXIT
44
+
45
+ # --- posture constants (the Phase-3 conjunctive evidence gate flips POSTURE_RTK in the
46
+ # same commit that lands ext-filter-divergence-report.md; a failed or un-run gate keeps
47
+ # `unmeasured` — the marker never asserts an unmeasured claim) ---------------------------
48
+ POSTURE_RTK="unmeasured" # -> "literal-clean" only after ext-filter-divergence.sh proves zero gate-literal divergence on an rtk-present host
49
+ POSTURE_HEADROOM="measured-incompatible"
50
+ HEADROOM_EVAL_VERSION="0.37.0" # the measured ceiling: claims apply at or below this version
51
+ HEADROOM_MEASURED_AT="2026-09-07" # archived eval date (specs/archive/…headroom-token-compression-eval)
52
+ RTK_MEASURED_AT="-" # the Phase-3 report's date once measured
53
+
54
+ trace() { [[ "${SOLEUR_HOOK_TRACE-}" == "1" ]] && printf 'ext-filter-detect: %s\n' "$*" >&2; return 0; }
55
+
56
+ json_escape() {
57
+ local s="$1"
58
+ s="${s//\\/\\\\}"
59
+ s="${s//\"/\\\"}"
60
+ s="${s//$'\n'/ }"
61
+ s="${s//$'\r'/ }"
62
+ s="${s//$'\t'/ }"
63
+ printf '%s' "$s"
64
+ }
65
+
66
+ MARKERS=()
67
+ emit() { # <marker fields...> -> append a marker line; flushed as ONE systemMessage object
68
+ # (every sibling SessionStart hook emits a single JSON document; N top-level objects
69
+ # risks first-object-only parsing dropping co-detection markers, or a plain-text
70
+ # fallback landing them in model context — one object, newline-joined markers)
71
+ MARKERS+=("SOLEUR_EXT_FILTER $*")
72
+ }
73
+
74
+ flush_markers() {
75
+ ((${#MARKERS[@]})) || return 0
76
+ local joined
77
+ joined="$(printf '%s\n' "${MARKERS[@]}")"
78
+ printf '{"systemMessage": "%s"}\n' "$(json_escape "$joined")"
79
+ }
80
+
81
+ # version_probe <tool> -> last field of `<tool> --version`'s first line, "unknown" on any failure.
82
+ version_probe() {
83
+ local out
84
+ out="$(timeout 2 "$1" --version 2>/dev/null | head -1 | awk '{print $NF}')"
85
+ if [[ "$out" =~ ^v?[0-9]+\.[0-9]+ ]]; then printf '%s' "${out#v}"; else printf 'unknown'; fi
86
+ }
87
+
88
+ # ver_le a b -> 0 iff version a <= version b (dotted numerics). Pure bash — `sort -V`
89
+ # is GNU-only and its absence silently withholds a measured-incompatible warning.
90
+ ver_le() {
91
+ [[ "$1" =~ ^[0-9]+\.[0-9]+ ]] || return 1
92
+ local a1 a2 a3 b1 b2 b3
93
+ IFS=. read -r a1 a2 a3 <<<"$1"; IFS=. read -r b1 b2 b3 <<<"$2"
94
+ a3="${a3%%[^0-9]*}"; b3="${b3%%[^0-9]*}"
95
+ (( 10#${a1:-0} != 10#${b1:-0} )) && { (( 10#${a1:-0} < 10#${b1:-0} )); return; }
96
+ (( 10#${a2:-0} != 10#${b2:-0} )) && { (( 10#${a2:-0} < 10#${b2:-0} )); return; }
97
+ (( 10#${a3:-0} <= 10#${b3:-0} ))
98
+ }
99
+
100
+ # settings_hit <tool> -> prints the tilde-collapsed settings file that wires <tool> into
101
+ # Claude hooks (a "command" entry naming it — a bare mention is not wiring), or nothing.
102
+ # HOME- and cwd-level files; cwd arrives via CWD_CLAUDE dynamic scope.
103
+ settings_hit() {
104
+ local tool="$1" f
105
+ for f in ${HOME:+"$HOME/.claude/settings.json" "$HOME/.claude/settings.local.json"} \
106
+ ${CWD_CLAUDE:+"$CWD_CLAUDE/settings.json" "$CWD_CLAUDE/settings.local.json"}; do
107
+ [[ -r "$f" ]] || continue
108
+ if grep -l '"hooks"' "$f" >/dev/null 2>&1 && grep -lE '"command"[^,}]*'"$tool" "$f" >/dev/null 2>&1; then
109
+ case "$f" in "${HOME:-}"/*) printf '~%s' "${f#"$HOME"}" ;; *) printf '%s' "${f// /%20}" ;; esac
110
+ return 0
111
+ fi
112
+ done
113
+ return 1
114
+ }
115
+
116
+ CWD_CLAUDE=""
117
+ main() {
118
+ # --self-test bypasses the env gates: it exists for operator/agent discoverability
119
+ # ("run the hook, see the marker"), which is exactly when CLAUDE_PLUGIN_ROOT is absent.
120
+ local selftest=0
121
+ if [[ "${1:-}" == "--self-test" ]]; then selftest=1; shift; fi
122
+ (( selftest )) || [[ -n "${CLAUDE_PLUGIN_ROOT:-}" ]] || return 0
123
+ (( selftest )) || { [[ -n "${CODEX_THREAD_ID:-}" || -n "${PLUGIN_ROOT:-}" ]] && return 0; }
124
+
125
+ # Bounded stdin read for the envelope's cwd (a hook that hangs at SessionStart is worse
126
+ # than a crashed one — compaction-state.sh:123-129). Absent or malformed: no cwd arm.
127
+ local envelope=""
128
+ envelope="$(timeout 5 cat 2>/dev/null || true)"
129
+ local cwd
130
+ cwd="$(printf '%s' "$envelope" | grep -o '"cwd"[^,}]*' | head -1 | cut -d'"' -f4)"
131
+ [[ -n "$cwd" && -d "$cwd/.claude" ]] && CWD_CLAUDE="$cwd/.claude"
132
+ trace "cwd=$cwd CWD_CLAUDE=$CWD_CLAUDE"
133
+
134
+ local found=0 tool ver via posture m_at s_hit
135
+
136
+ # --- proxy arm: a non-default ANTHROPIC_BASE_URL emits the NEUTRAL marker, never a
137
+ # named vendor claim — a LiteLLM/Helicone/corporate proxy is the user's own infra.
138
+ case "${ANTHROPIC_BASE_URL:-}" in
139
+ ""|https://api.anthropic.com|https://api.anthropic.com/) : ;;
140
+ *) emit "tool=proxy posture=unknown via=proxy-env measured_at=- ref=soleur.ai/known-external-tools"; found=1 ;;
141
+ esac
142
+
143
+ for tool in rtk headroom; do
144
+ via=""; s_hit=""
145
+ command -v "$tool" >/dev/null 2>&1 && via="on-path"
146
+ s_hit="$(settings_hit "$tool")" && via="${via:+$via,}settings-hook"
147
+ [[ -n "$via" ]] || continue
148
+ found=1
149
+ ver="$(version_probe "$tool")"
150
+ case "$tool" in
151
+ rtk)
152
+ # a named posture requires corroboration AND a resolved version; a bare PATH
153
+ # basename hit is unmeasured by construction.
154
+ if [[ "$via" == *settings-hook* && "$ver" != unknown ]]; then posture="$POSTURE_RTK"; else posture="unmeasured"; fi
155
+ m_at="$RTK_MEASURED_AT" ;;
156
+ headroom)
157
+ if [[ "$via" == *settings-hook* && "$ver" != unknown ]] && ver_le "$ver" "$HEADROOM_EVAL_VERSION"; then
158
+ posture="$POSTURE_HEADROOM"; m_at="$HEADROOM_MEASURED_AT"
159
+ else
160
+ posture="unmeasured"; m_at="-"
161
+ fi ;;
162
+ esac
163
+ emit "tool=$tool version=$ver posture=$posture via=$via measured_at=$m_at${s_hit:+ path=${s_hit// /%20}} ref=soleur.ai/known-external-tools"
164
+ done
165
+
166
+ (( found )) || emit "tool=none ref=soleur.ai/known-external-tools"
167
+ flush_markers
168
+ return 0
169
+ }
170
+
171
+ main "$@"
@@ -0,0 +1,133 @@
1
+ {
2
+ "description": "Soleur plugin hooks",
3
+ "hooks": {
4
+ "PreToolUse": [
5
+ {
6
+ "matcher": "^(Bash|exec)$",
7
+ "hooks": [
8
+ {
9
+ "type": "command",
10
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/browser-snapshot-credential-guard.sh"
11
+ }
12
+ ]
13
+ },
14
+ {
15
+ "matcher": "^(Bash|Monitor|Write|Edit|MultiEdit|NotebookEdit)$",
16
+ "hooks": [
17
+ {
18
+ "type": "command",
19
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/operator-stage-approval.sh",
20
+ "timeout": 10
21
+ }
22
+ ]
23
+ },
24
+ {
25
+ "matcher": "^Bash$",
26
+ "hooks": [
27
+ {
28
+ "type": "command",
29
+ "command": "bash \"${CLAUDE_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 \"${CLAUDE_PLUGIN_ROOT}/hooks/codex-session-start.sh\""
42
+ }
43
+ ]
44
+ },
45
+ {
46
+ "matcher": "",
47
+ "hooks": [
48
+ {
49
+ "type": "command",
50
+ "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/devin-session-start.sh\""
51
+ }
52
+ ]
53
+ },
54
+ {
55
+ "matcher": "",
56
+ "hooks": [
57
+ {
58
+ "type": "command",
59
+ "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/bare-root-cwd-guard.sh\"",
60
+ "timeout": 10
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ "matcher": "startup",
66
+ "hooks": [
67
+ {
68
+ "type": "command",
69
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/welcome-hook.sh"
70
+ }
71
+ ]
72
+ },
73
+ {
74
+ "matcher": "startup",
75
+ "hooks": [
76
+ {
77
+ "type": "command",
78
+ "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/version-banner.sh\"",
79
+ "timeout": 10
80
+ }
81
+ ]
82
+ },
83
+ {
84
+ "matcher": "startup|resume|clear|compact",
85
+ "hooks": [
86
+ {
87
+ "type": "command",
88
+ "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/compaction-state.sh\""
89
+ }
90
+ ]
91
+ },
92
+ {
93
+ "matcher": "startup|resume|clear|compact",
94
+ "hooks": [
95
+ {
96
+ "type": "command",
97
+ "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/ext-filter-detect.sh\"",
98
+ "timeout": 10
99
+ }
100
+ ]
101
+ }
102
+ ],
103
+ "Stop": [
104
+ {
105
+ "hooks": [
106
+ {
107
+ "type": "command",
108
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/stop-hook.sh"
109
+ }
110
+ ]
111
+ },
112
+ {
113
+ "hooks": [
114
+ {
115
+ "type": "command",
116
+ "command": "${CLAUDE_PLUGIN_ROOT}/hooks/unkept-promise-hook.sh"
117
+ }
118
+ ]
119
+ }
120
+ ],
121
+ "PreCompact": [
122
+ {
123
+ "matcher": "manual|auto",
124
+ "hooks": [
125
+ {
126
+ "type": "command",
127
+ "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/compaction-state.sh\""
128
+ }
129
+ ]
130
+ }
131
+ ]
132
+ }
133
+ }
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env bash
2
+ # Canonical Devin→Claude tool-kind map (issue #8205) — PLUGIN COPY.
3
+ #
4
+ # Plugin hooks run in projects that may not carry this repo's
5
+ # .claude/hooks/lib/, so the map is duplicated here. Pinned against the
6
+ # canonical map by .claude/hooks/hook-tool-kind.test.sh — update both or
7
+ # neither. multi_edit/notebook_edit/apply_patch are probed-absent from Devin's
8
+ # vocabulary (envelope-capture §7) — speculative passthroughs; re-probe before
9
+ # relying on them.
10
+
11
+ hook_tool_kind() {
12
+ case "${1-}" in
13
+ exec) printf '%s\n' "Bash" ;;
14
+ write) printf '%s\n' "Write" ;;
15
+ edit) printf '%s\n' "Edit" ;;
16
+ multi_edit) printf '%s\n' "MultiEdit" ;;
17
+ notebook_edit) printf '%s\n' "NotebookEdit" ;;
18
+ apply_patch) printf '%s\n' "Write" ;;
19
+ ask_user_question) printf '%s\n' "AskUserQuestion" ;;
20
+ run_subagent) printf '%s\n' "Agent" ;;
21
+ skill) printf '%s\n' "Skill" ;;
22
+ *) printf '%s\n' "${1-}" ;;
23
+ esac
24
+ }
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env bash
2
+ # log-rotation.sh — sourced helper for .claude/.*.jsonl rotation.
3
+ #
4
+ # Single source of truth for rotating telemetry sinks under .claude/. Called
5
+ # at write time from each emitter (incidents.sh::emit_incident,
6
+ # skill-invocation-logger.sh, agent-token-tee.sh) so growth is bounded on
7
+ # every operator's machine — not only when the weekly aggregator runs.
8
+ #
9
+ # Source from a hook via:
10
+ # source "$(dirname "${BASH_SOURCE[0]}")/lib/log-rotation.sh"
11
+ #
12
+ # Strategy: copy-then-truncate-in-place (NOT atomic-rename). Mirrors the
13
+ # pattern at scripts/rule-metrics-aggregate.sh:291-295. The rationale is
14
+ # concurrency-correctness: writers identify the file by PATH and use `>>$file`
15
+ # (open for append). flock advisories are inode-bound. A `mv $active →
16
+ # $archive.tmp; : > $active` inside the flock would let a writer that opens
17
+ # `>>$file` between the mv and its own flock acquire end up locking a DIFFERENT
18
+ # inode (the freshly-created post-truncate file) than the rotator's open fd.
19
+ # Two writers, two inodes, two flocks — torn writes return.
20
+ #
21
+ # Copy-then-truncate keeps the same inode throughout; readers/writers always
22
+ # converge on the same inode and the lock semantics hold.
23
+ #
24
+ # Public API:
25
+ # rotate_if_needed <jsonl-path> [size-bytes] [age-days]
26
+ #
27
+ # The caller MUST pass a canonicalized absolute path (cd -P / pwd -P resolved)
28
+ # so flock targets the same inode as concurrent writers on the same logical
29
+ # file. All three production callers (incidents.sh, skill-invocation-logger.sh,
30
+ # agent-token-tee.sh) canonicalize their repo-root via `cd -P + pwd -P` —
31
+ # follow that pattern in any new caller. `stat` and the cat redirect both use
32
+ # `-L`/path-following semantics so a symlinked sink rotates on the target's
33
+ # size/mtime rather than the link's metadata.
34
+ #
35
+ # Defaults:
36
+ # size-bytes = $LOG_ROTATION_SIZE_BYTES (or 5 MB)
37
+ # age-days = $LOG_ROTATION_AGE_DAYS (or 30)
38
+ # timeout = $LOG_ROTATION_FLOCK_TIMEOUT_S (or 5)
39
+ #
40
+ # Kill-switch: LOG_ROTATION_DISABLE=1 short-circuits before any work.
41
+ # Test override: LOG_ROTATION_UNIQ_SUFFIX overrides the collision suffix.
42
+ #
43
+ # Exit codes:
44
+ # 0 — no-op (below threshold, missing file, kill-switch, lock-acquire
45
+ # timeout) OR a successful rotation. Existing fire-and-forget callers
46
+ # using `|| true` swallow this either way.
47
+ # 1 — archive-write failure (disk-full, permission-denied). The active file
48
+ # is preserved intact (truncate gated on cat success), the partial
49
+ # archive is removed, and ONE stderr warning is emitted per process
50
+ # (rate-limited via /tmp/log-rotation-warned-$$ — mirrors the pattern
51
+ # at incidents.sh:130-138).
52
+ #
53
+ # Sentinel-aware callers (issue #3509) branch on the non-zero return to emit
54
+ # a `rotation_fail` drop sentinel before falling through to the data write:
55
+ # if ! rotate_if_needed "$file"; then
56
+ # _emit_drop_sentinel "$file" "$HOOK_EVENT_LITERAL" rotation_fail
57
+ # fi
58
+
59
+ # Source session-state.sh (idempotent guard inside it). Used for
60
+ # headless_or_stderr — routes warns to a log file under `claude --bg` and to
61
+ # stderr foreground. Fallback to plain stderr echo when missing (legacy
62
+ # worktrees).
63
+ # shellcheck source=../../../plugins/soleur/scripts/lib/session-state.sh
64
+ source "$(dirname "${BASH_SOURCE[0]}")/../../../plugins/soleur/scripts/lib/session-state.sh" 2>/dev/null || true
65
+ if ! declare -f headless_or_stderr >/dev/null; then
66
+ headless_or_stderr() { echo "[$1] $2" >&2; }
67
+ fi
68
+
69
+ LOG_ROTATION_SIZE_BYTES_DEFAULT=$((5 * 1024 * 1024)) # 5 MB
70
+ LOG_ROTATION_AGE_DAYS_DEFAULT=30
71
+ LOG_ROTATION_FLOCK_TIMEOUT_S_DEFAULT=5
72
+
73
+ rotate_if_needed() {
74
+ [[ "${LOG_ROTATION_DISABLE:-}" == "1" ]] && return 0
75
+
76
+ local active="${1:-}"
77
+ [[ -z "$active" ]] && return 0
78
+ [[ -f "$active" ]] || return 0
79
+ [[ -s "$active" ]] || return 0 # empty — no rotation regardless of mtime
80
+
81
+ local size_threshold="${2:-${LOG_ROTATION_SIZE_BYTES:-$LOG_ROTATION_SIZE_BYTES_DEFAULT}}"
82
+ local age_threshold_days="${3:-${LOG_ROTATION_AGE_DAYS:-$LOG_ROTATION_AGE_DAYS_DEFAULT}}"
83
+ local timeout_s="${LOG_ROTATION_FLOCK_TIMEOUT_S:-$LOG_ROTATION_FLOCK_TIMEOUT_S_DEFAULT}"
84
+
85
+ # Pre-check (cheap, no lock): >99% of calls exit here.
86
+ # `stat -L` dereferences symlinks so a relocated sink (operator-symlinked to
87
+ # tmpfs / larger volume) rotates on the target's size/mtime, not the link's.
88
+ local size mtime now age_seconds age_threshold_seconds
89
+ read -r size mtime < <(stat -L -c "%s %Y" "$active" 2>/dev/null) || return 0
90
+ now=$(date -u +%s 2>/dev/null) || return 0
91
+ age_seconds=$(( now - mtime ))
92
+ age_threshold_seconds=$(( age_threshold_days * 86400 ))
93
+ if (( size <= size_threshold )) && (( age_seconds <= age_threshold_seconds )); then
94
+ return 0
95
+ fi
96
+
97
+ # Compute archive path BEFORE entering flock subshell. Subshell variable
98
+ # reassignments do not propagate back (precedent at
99
+ # rule-metrics-aggregate.sh:288 — same hazard). An already-rotated `.gz`
100
+ # or a lingering uncompressed file from a mid-run crash both count as
101
+ # "already exists"; we append a uniquify suffix rather than clobbering.
102
+ local dir base ts archive suffix
103
+ dir=$(dirname "$active")
104
+ base=$(basename "$active" .jsonl)
105
+ ts=$(date -u +%Y-%m 2>/dev/null) || return 0
106
+ archive="$dir/${base}-${ts}.jsonl"
107
+ if [[ -f "${archive}.gz" || -f "$archive" ]]; then
108
+ suffix="${LOG_ROTATION_UNIQ_SUFFIX:-$(date -u +%H%M%S%N)}"
109
+ archive="$dir/${base}-${ts}-${suffix}.jsonl"
110
+ fi
111
+
112
+ # Acquire flock + re-check + copy-then-truncate. flock fd 9 against $active
113
+ # — same inode the writers use for their own flock. -w timeout matches the
114
+ # agent-token-tee.sh / aggregator precedent. On timeout: skip this round;
115
+ # the next call will rotate. We use exit-code 10 as a 1-bit signal channel
116
+ # ("rotated successfully") since subshell variable reassignments cannot
117
+ # propagate to the outer scope.
118
+ # The subshell exits 0 (no-op) or 10 (rotated). The non-zero exit-10 is a
119
+ # signal channel — caller-side `set -e` would otherwise treat it as an
120
+ # error, so we capture via `|| rotated=$?` (conditional context — set -e
121
+ # does not trigger on the LHS).
122
+ local rotated=0
123
+ # SC2094 disable: the flock-against-self pattern (`9>>"$active"`) opens fd 9
124
+ # against the file the body reads via `cat "$active"`. This is intentional —
125
+ # flock advisories are inode-bound, so the writer's flock and the rotator's
126
+ # flock must target the same inode for them to interlock. Same pattern as
127
+ # scripts/rule-metrics-aggregate.sh:291-295.
128
+ # shellcheck disable=SC2094
129
+ (
130
+ if ! flock -w "$timeout_s" -x 9; then
131
+ exit 0
132
+ fi
133
+ # Re-check inside lock (TOCTOU defense — a peer writer may have rotated
134
+ # between our pre-check and our acquire). `stat -L` parity with the
135
+ # outer pre-check.
136
+ local s2 m2 now2 age2
137
+ read -r s2 m2 < <(stat -L -c "%s %Y" "$active" 2>/dev/null) || exit 0
138
+ now2=$(date -u +%s 2>/dev/null) || exit 0
139
+ age2=$(( now2 - m2 ))
140
+ if (( s2 <= size_threshold )) && (( age2 <= age_threshold_seconds )); then
141
+ exit 0
142
+ fi
143
+ # Copy first, truncate only on success. Preserves data on disk-full / OOM:
144
+ # if cat fails, $active stays intact and the next call retries. We exit 11
145
+ # to signal "rotation attempted but archive write failed" so the outer
146
+ # scope can emit a one-shot warn AND clean up any partial archive bytes.
147
+ if cat "$active" >> "$archive" 2>/dev/null; then
148
+ : > "$active"
149
+ exit 10
150
+ fi
151
+ exit 11
152
+ ) 9>>"$active" 2>/dev/null || rotated=$?
153
+
154
+ case "$rotated" in
155
+ 10)
156
+ # gzip outside the lock — concurrent writers don't wait on compression.
157
+ # Failure leaves the .jsonl archive intact, readable by aggregators.
158
+ gzip -f "$archive" 2>/dev/null || true
159
+ ;;
160
+ 11)
161
+ # Archive write failed mid-copy. Clean up the partial archive so the
162
+ # next attempt starts clean (otherwise the collision-suffix branch fires
163
+ # and orphans the partial forever). Then warn ONCE per process via the
164
+ # marker pattern at incidents.sh:130-138, and signal the failure to
165
+ # sentinel-aware callers via a non-zero return (issue #3509).
166
+ rm -f "$archive" 2>/dev/null || true
167
+ local _log_rotation_warned_marker="/tmp/log-rotation-warned-$$"
168
+ if [[ ! -f "$_log_rotation_warned_marker" ]]; then
169
+ SOLEUR_HOOK_NAME="log-rotation" headless_or_stderr warn "failed to archive $active (disk full? permissions?)"
170
+ : > "$_log_rotation_warned_marker" 2>/dev/null || true
171
+ fi
172
+ return 1
173
+ ;;
174
+ esac
175
+ return 0
176
+ }