@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,501 @@
1
+ #!/usr/bin/env bash
2
+ # audit-models.sh — deterministic auditor for the per-Anthropic-model-release checklist.
3
+ #
4
+ # Modes:
5
+ # (default) full audit report to stdout; every check group is named (no silent green).
6
+ # --detect cron signal: exit 10 if config-class model-ID drift is found, 0 if clean.
7
+ # One-line summary to stdout. Used by the rule-audit.yml detection step.
8
+ # --fix apply MECHANICAL model-ID swaps to config-class files only (auto-fix surface).
9
+ # pin / pricing / tier-map / dormant are FLAG-ONLY and never mutated here.
10
+ #
11
+ # Options:
12
+ # --root DIR scan DIR instead of the git repo root (test harness uses this).
13
+ #
14
+ # Auto-fix surface = stale model IDs in config. Excluded from auto-fix (never mutated):
15
+ # test fixtures (*/test/*, *.test.*), archives (**/archive/**), spikes (*/spike/*),
16
+ # all of knowledge-base/** (docs/plans/specs/brainstorms/learnings — archival prose
17
+ # that never selects a model at runtime), community digests.
18
+ # Source of truth for current IDs: the claude-api skill table + official docs.
19
+ set -euo pipefail
20
+
21
+ ROOT=""
22
+ MODE="audit"
23
+ while [[ $# -gt 0 ]]; do
24
+ case "$1" in
25
+ --root) ROOT="$2"; shift 2 ;;
26
+ --detect) MODE="detect"; shift ;;
27
+ --fix) MODE="fix"; shift ;;
28
+ *) echo "unknown arg: $1" >&2; exit 64 ;;
29
+ esac
30
+ done
31
+ if [[ -z "$ROOT" ]]; then
32
+ ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
33
+ fi
34
+ ROOT="${ROOT%/}" # normalize: trailing slash breaks rel() prefix-strip
35
+ # A newline in ROOT would split the SDK-carve-out pattern built from it below: grep -E then
36
+ # fails ("Unmatched (") and every `grep -vE "$EXCLUDE_RE" || true` swallows the error, so
37
+ # --detect would print a clean verdict over a scan that excluded nothing. Refuse it up front.
38
+ case "$ROOT" in
39
+ *$'\n'*)
40
+ echo "audit-models: refusing a --root containing a newline (it would corrupt the exclusion pattern)" >&2
41
+ exit 64
42
+ ;;
43
+ esac
44
+
45
+ # --- current landscape — update at each model launch ---
46
+ # Each superseded id maps to the CURRENT same-tier id as "<stale>=<current>".
47
+ # At each launch: (1) ADD a pair for the newly-superseded id, AND (2) RETARGET
48
+ # every existing same-tier pair's RHS to the new current id. Step 2 is not
49
+ # optional — `--fix` applies pairs sequentially, so a CHAINED map
50
+ # (4-7=4-8 alongside 4-8=5) is order-dependent and lands on a stale id.
51
+ # The SINGLE-HOP INVARIANT below enforces this mechanically: no target may
52
+ # also appear as a source. Source of truth for current ids: the claude-api
53
+ # skill table + https://platform.claude.com/docs/en/about-claude/models/overview.md
54
+ # (pricing: https://platform.claude.com/docs/en/about-claude/pricing.md).
55
+ AUTOFIX_PAIRS=(
56
+ "claude-opus-5=claude-opus-5-5"
57
+ "claude-opus-4-8=claude-opus-5-5"
58
+ "claude-opus-4-7=claude-opus-5-5"
59
+ "claude-opus-4-6=claude-opus-5-5"
60
+ "claude-sonnet-5=claude-sonnet-5-5"
61
+ "claude-sonnet-4-6=claude-sonnet-5-5"
62
+ "claude-sonnet-4-5=claude-sonnet-5-5"
63
+ "claude-fable-5=claude-fable-5-1"
64
+ # Haiku 5.5 launch, 2026-10-08. BOTH Haiku 4.5 spellings: the id boundary defined
65
+ # below makes the undated id a different token from the dated one, so one pair alone
66
+ # leaves the other spelling stale forever. Both RHS are the current id, so the
67
+ # single-hop invariant holds. No closing paren in comments here: the test parser
68
+ # reads this array up to the first one.
69
+ "claude-haiku-4-5-20251001=claude-haiku-5-5"
70
+ "claude-haiku-4-5=claude-haiku-5-5"
71
+ )
72
+
73
+ # SINGLE-HOP INVARIANT (fail-fast). A convergent map rewrites every stale id
74
+ # in ONE pass; if any RHS is also an LHS, `--fix` leaves files on an
75
+ # intermediate id and `--detect` re-flags them forever (a permanently-red
76
+ # drift cron that auto-files issues it cannot fix). Cheap to assert, so assert
77
+ # it on every invocation rather than trusting the editor to have retargeted.
78
+ assert_single_hop() {
79
+ local p from to q other
80
+ for p in "${AUTOFIX_PAIRS[@]}"; do
81
+ to="${p#*=}"
82
+ for q in "${AUTOFIX_PAIRS[@]}"; do
83
+ other="${q%%=*}"
84
+ if [[ "$to" == "$other" ]]; then
85
+ from="${p%%=*}"
86
+ echo "audit-models: NON-CONVERGENT AUTOFIX_PAIRS — '${from}' maps to '${to}', which is itself a source id." >&2
87
+ echo " Retarget every same-tier pair directly to the current id (no chaining)." >&2
88
+ exit 78
89
+ fi
90
+ done
91
+ done
92
+ }
93
+ assert_single_hop
94
+ # The stale ids (LHS of each pair), '|'-joined for grep.
95
+ autofix_from_re() {
96
+ local p out=""
97
+ for p in "${AUTOFIX_PAIRS[@]}"; do out="${out:+$out|}${p%%=*}"; done
98
+ printf '%s' "$out"
99
+ }
100
+
101
+ # RIGHT-BOUNDARY of a model id: the next char must not extend the id. Model ids
102
+ # are [0-9A-Za-z-], so a bare alternation would match a PREFIX of a longer id.
103
+ #
104
+ # The `--fix` sed has been anchored since the script was created; SELECTION was
105
+ # not. That asymmetry was ALREADY producing a permanently-red drift cron before
106
+ # Fable 5.1 existed — measured on origin/main, a config file carrying the DATED
107
+ # variant `claude-opus-4-7-20260101` reports `--detect` rc=10, `--fix` prints
108
+ # "fixed" while changing nothing (the sed's boundary correctly declines), and
109
+ # `--detect` re-flags it forever. Same input on this version: rc=0.
110
+ #
111
+ # So the general invariant is the one stated at the bottom of this comment
112
+ # (selection and rewriting must share one boundary), and dated ids were its
113
+ # standing violation. `claude-fable-5` is what made it unavoidable rather than
114
+ # what created it: it was the first pair whose stale id is a strict PREFIX of
115
+ # its own target (`claude-sonnet-5` and `claude-opus-5` now share that shape),
116
+ # so the mismatch fires on the id that is CURRENT rather than only
117
+ # on a longer variant nobody had written yet. `assert_single_hop` does NOT catch
118
+ # either shape ('claude-fable-5-1' is not itself a source id).
119
+ #
120
+ # Selection and rewriting MUST use this one boundary, or they can disagree
121
+ # again: the sed cannot fix what only the grep considers stale.
122
+ ID_BOUNDARY='([^0-9A-Za-z-]|$)'
123
+
124
+ # Anchored matcher — the ONLY pattern that may decide "this file is stale".
125
+ autofix_match_re() { printf '%s%s' "($(autofix_from_re))" "$ID_BOUNDARY"; }
126
+
127
+ FLAG_ONLY_STALE_RE='claude-3[._-]|claude-(opus|sonnet|haiku)-[0-9.]+-20250[0-9]+'
128
+
129
+ DELETION_GUARD=20 # abort --fix if any file would lose more than this many lines
130
+
131
+ # Path classes excluded from the config (auto-fix) surface. knowledge-base/** is
132
+ # archival/historical prose (learnings, plans, brainstorms) — it never selects a
133
+ # model at runtime, so a stale id there is not operational drift.
134
+ # `\.generated\.` keeps the sweeper out of generated artifacts: those have a
135
+ # generator that reads the TS registry (eval-harness/scripts/gen-models.sh), and
136
+ # a blind sed here would make the generator no longer the sole writer — exactly
137
+ # the second-SSOT the generator's own header promises does not exist.
138
+ # SDK-PATH CARVE-OUT (Haiku 5.5 launch, 2026-10-08; #8643). These two scripts drive the
139
+ # Agent SDK `query()`, whose model resolution lives in the SDK's BUNDLED CLI — pinned at
140
+ # @anthropic-ai/claude-agent-sdk 0.3.284, which does not know `claude-haiku-5-5` (an
141
+ # unknown id silently halves max_tokens, #6934). Auto-fixing them to the new id would
142
+ # break two paid scripts, and leaving them selectable would make `--detect` exit 10
143
+ # forever. They stay on `claude-haiku-4-5` until the SDK pin reaches 0.3.293, the first
144
+ # release whose bundle carries the id. EXACT paths, never a directory: widening this to
145
+ # apps/web-platform/scripts/ would hide a genuinely stale sibling. The exemption is per FILE
146
+ # (every stale id, not only Haiku): these scripts run on the SDK-bundled CLI. It is SELF-EXPIRING:
147
+ # model-launch-review.test.ts fails once the SDK pin reaches 0.3.293 and says to delete
148
+ # this array and swap the two scripts.
149
+ SDK_PATH_CARVEOUT=(
150
+ "apps/web-platform/scripts/sandbox-canary.mjs"
151
+ "apps/web-platform/scripts/plugin-root-sandbox-propagation-probe.mjs"
152
+ )
153
+ sdk_carveout_re() {
154
+ # ANCHORED at both ends: `^<root>/<path>$`. The left anchor matters because candidate
155
+ # paths are absolute under $ROOT, so an unanchored `/apps/…/x.mjs$` also exempts the same
156
+ # relative path nested under another prefix (vendor/…, .worktrees/…). $ROOT is escaped so
157
+ # a root containing regex metacharacters cannot alter the pattern.
158
+ local p out="" root_re
159
+ root_re="$(printf '%s' "$ROOT" | sed 's/[][\\.*^$+?(){}|]/\\&/g')"
160
+ for p in "${SDK_PATH_CARVEOUT[@]}"; do
161
+ p="${p//./\\.}"
162
+ out="${out:+$out|}^${root_re}/${p}\$"
163
+ done
164
+ printf '%s' "$out"
165
+ }
166
+ EXCLUDE_RE='(/node_modules/|/\.git/|/\.next/|/test/|/__tests__/|/spike/|/archive/|knowledge-base/|/community/|\.test\.|\.spec\.|\.generated\.|/model-launch-review/|'"$(sdk_carveout_re)"')'
167
+
168
+ # Collect config-class files containing any auto-fixable stale ID.
169
+ # Returns 2 (and prints to stderr) if the scan itself failed. That distinction
170
+ # is load-bearing: `|| true` alone swallows grep's error exit (>=2: unreadable
171
+ # dir, bad regex) as indistinguishable from its no-match exit (1), so --detect
172
+ # would report a confident "none — config model IDs are current" from a scan
173
+ # that never ran. A detector that cannot tell "clean" from "could not look" is
174
+ # the failure mode #5100 exists to prevent.
175
+ collect_config_hits() {
176
+ local re out rc
177
+ re="$(autofix_match_re)"
178
+ # -I (skip binary) is a CORRECTNESS flag, not an optimisation. Without it a
179
+ # compiled artifact under $ROOT is selectable: measured, a blob containing
180
+ # `claude-opus-4-7` between NULs was reported as a stale config file, the
181
+ # `[1]` re-scan could not read it back (`grep -o` on binary prints
182
+ # "binary file matches" to stderr and yields no stdout), and `--fix` would
183
+ # then `sed -i` the binary in place — a byte-patched artifact reported as
184
+ # `fixed:`. That path is now reachable by following this skill's own SKILL.md,
185
+ # which tells the operator to unpack `claude-code-linux-x64` and grep it.
186
+ # The auto-fix surface is config-class TEXT by definition, so a binary is
187
+ # never a legitimate hit and excluding it closes selection, display and
188
+ # rewrite in one place.
189
+ # `if out=$(cmd); then` rather than a bare capture: the exit code here is
190
+ # load-bearing (rc 1 = no match, rc >= 2 = the scan itself failed), so the
191
+ # `|| true` form lint-shell-capture-exit also accepts would flatten rc to 0
192
+ # and re-open the #5100 conflation this function exists to prevent. This form
193
+ # satisfies the lint AND keeps the discrimination.
194
+ if out="$(grep -rIEl "$re" "$ROOT" \
195
+ --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=.next \
196
+ --exclude-dir=test --exclude-dir=__tests__ --exclude-dir=spike --exclude-dir=archive \
197
+ --exclude-dir=community \
198
+ --exclude='*.test.*' --exclude='*.spec.*' 2>/dev/null)"; then
199
+ rc=0
200
+ else
201
+ rc=$?
202
+ fi
203
+ if (( rc >= 2 )); then
204
+ echo "audit-models: scan FAILED (grep rc=$rc) under '$ROOT' — refusing to report clean." >&2
205
+ return 2
206
+ fi
207
+ [[ -n "$out" ]] || return 0
208
+ printf '%s\n' "$out" | grep -vE "$EXCLUDE_RE" || true
209
+ }
210
+
211
+ rel() { echo "${1#"$ROOT"/}"; }
212
+
213
+ # #8392 census: readers that index a FIXED content position of an Anthropic
214
+ # response. A model swap that turns thinking on by default moves the text block
215
+ # off position 0, and such a reader then returns empty forever with no error.
216
+ #
217
+ # Anchored on "$ROOT" and rc-discriminating for the same reason as
218
+ # collect_config_hits: a cwd-relative grep under `--root DIR` would scan nothing,
219
+ # exit 1, and print a clean verdict meaning "the scan ran nowhere" — the exact
220
+ # vacuity class this census exists to catch.
221
+ #
222
+ # The pattern is carried ESCAPED (content\[0\]) so this script is not itself a
223
+ # hit of the plan's AC2 census, which matches the plain text. Keep the escapes.
224
+ collect_content_position_readers() {
225
+ local out rc
226
+ if out="$(grep -rIEn 'content\[0\]|content\?\.\[0\]' "$ROOT" \
227
+ --include='*.ts' --include='*.sh' --include='*.mjs' --include='*.js' \
228
+ --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=.next \
229
+ --exclude-dir=test --exclude-dir=__tests__ --exclude-dir=spike --exclude-dir=archive \
230
+ --exclude-dir=community \
231
+ --exclude='*.test.*' --exclude='*.spec.*' 2>/dev/null)"; then
232
+ rc=0
233
+ else
234
+ rc=$?
235
+ fi
236
+ if (( rc >= 2 )); then
237
+ echo " UNKNOWN — census scan FAILED (grep rc=$rc) under '$ROOT'; NOT a pass."
238
+ return 0
239
+ fi
240
+ out="$(printf '%s\n' "$out" | grep -vE "$EXCLUDE_RE" || true)"
241
+ if [[ -z "${out//[[:space:]]/}" ]]; then
242
+ echo " none — no fixed-position readers."
243
+ else
244
+ # NOT `sed "s|^$ROOT/|…|"`: $ROOT is a filesystem path that may legally contain
245
+ # `|` or `[`. Measured — a `|` makes sed exit "unknown option to 's'", the
246
+ # pipeline dies under pipefail and the census prints NEITHER a hit nor `none`
247
+ # (reads as empty); a `[` silently fails to strip and emits a bare absolute path
248
+ # with no HIT marker. Quoted-expansion strip, the technique rel() already uses.
249
+ while IFS= read -r line; do
250
+ [[ -n "$line" ]] && printf ' HIT: %s\n' "${line#"$ROOT"/}"
251
+ done <<< "$out"
252
+ fi
253
+ }
254
+
255
+ # Shared hits capture. `mapfile -t hits < <(collect_config_hits)` DISCARDS the
256
+ # function's exit code, so a failed scan would fall straight through to the
257
+ # "clean" branch in every mode — the exact absent-vs-could-not-look conflation
258
+ # this script was fixed for. Route the capture through a file so the rc
259
+ # survives, and give EVERY mode the same abort. One owning trap (ADR-129).
260
+ _HITS_TMP="$(mktemp)"
261
+ trap 'rm -f "$_HITS_TMP"' EXIT
262
+
263
+ # Populates the global `hits` array, or aborts naming the mode that failed.
264
+ load_hits() { # $1 = label for the failure line
265
+ if ! collect_config_hits > "$_HITS_TMP"; then
266
+ echo "$1: UNKNOWN — scan failed; treat as un-run, not clean."
267
+ exit 1
268
+ fi
269
+ mapfile -t hits < "$_HITS_TMP"
270
+ }
271
+
272
+ # ---------------- detect mode (cron) ----------------
273
+ if [[ "$MODE" == "detect" ]]; then
274
+ load_hits "model-drift"
275
+ if [[ ${#hits[@]} -gt 0 ]]; then
276
+ echo "model-drift: ${#hits[@]} config file(s) carry a stale model ID (auto-fixable via /soleur:model-launch-review)."
277
+ for f in "${hits[@]}"; do echo " - $(rel "$f")"; done
278
+ exit 10
279
+ fi
280
+ echo "model-drift: none (config model IDs current)."
281
+ exit 0
282
+ fi
283
+
284
+ # ---------------- fix mode (mechanical model-ID swaps only) ----------------
285
+ if [[ "$MODE" == "fix" ]]; then
286
+ load_hits "model-fix"
287
+ for f in "${hits[@]}"; do
288
+ before=$(wc -l < "$f")
289
+ tmp="$(mktemp)"
290
+ cp "$f" "$tmp"
291
+ for pair in "${AUTOFIX_PAIRS[@]}"; do
292
+ from="${pair%%=*}"; to="${pair#*=}"
293
+ # anchored on the SAME boundary as selection (ID_BOUNDARY): preserve the
294
+ # trailing char so a longer/dated variant (claude-opus-4-7-20260101) or a
295
+ # successor that extends the stale id (claude-fable-5-1) is NOT corrupted
296
+ # by a prefix swap.
297
+ sed -i -E "s/${from}${ID_BOUNDARY}/${to}\1/g" "$f"
298
+ done
299
+ after=$(wc -l < "$f")
300
+ # deletion guard: a 1-for-1 ID swap must not change line count materially.
301
+ if (( before - after > DELETION_GUARD )); then
302
+ cp "$tmp" "$f" # revert
303
+ rm -f "$tmp"
304
+ echo "ABORT: $(rel "$f") would lose $((before - after)) lines (> DELETION_GUARD=$DELETION_GUARD); reverted." >&2
305
+ exit 1
306
+ fi
307
+ rm -f "$tmp"
308
+ echo "fixed: $(rel "$f")"
309
+ done
310
+ exit 0
311
+ fi
312
+
313
+ # ---------------- audit mode (report; no silent green) ----------------
314
+ echo "== model-launch-review audit =="
315
+ echo "root: $ROOT"
316
+ echo
317
+
318
+ echo "[1] model-ID inventory (AUTO-FIX)"
319
+ load_hits " model-ID inventory"
320
+ if [[ ${#hits[@]} -gt 0 ]]; then
321
+ echo " stale config model IDs found (mechanical same-tier swap):"
322
+ for f in "${hits[@]}"; do
323
+ # Same anchored matcher as selection, then drop the boundary char the
324
+ # pattern had to capture (an end-of-line match captures nothing to drop),
325
+ # so the report names the id and not `claude-fable-5"`.
326
+ # `set -o pipefail` is in force, so a no-match here kills the script with no
327
+ # message. That silence is the wrong failure: the file is in `hits` BECAUSE
328
+ # the selector matched it, so an empty re-scan means selection and display
329
+ # have diverged — the exact class ID_BOUNDARY exists to prevent — and it
330
+ # must be named rather than mistaken for an ordinary abort.
331
+ # Trigger on EMPTINESS, not just on a non-zero rc. `grep -o` on a file it
332
+ # considers binary prints "binary file matches" to stderr, yields no stdout
333
+ # and exits 0 — so an rc-only guard stayed silent on the one realistic
334
+ # divergence and the report printed a bare `[]` while the audit exited 0
335
+ # (measured). Selection now skips binaries (-I), so this is a true internal
336
+ # invariant; keep both conditions so neither half can go quiet alone.
337
+ ids="$(grep -oE "$(autofix_match_re)" "$f" 2>/dev/null | sed -E 's/[^0-9A-Za-z-]+$//' | sort -u | tr '\n' ' ')" || true
338
+ if [[ -z "${ids// /}" ]]; then
339
+ echo "audit-models: INTERNAL — selector matched $(rel "$f") but the display re-scan found no id." >&2
340
+ echo " selection and display disagree; they must share autofix_match_re." >&2
341
+ exit 70
342
+ fi
343
+ echo " - $(rel "$f") [${ids}]"
344
+ done
345
+ echo " → run with --fix (each stale id → its current same-tier id), then open a CI-gated PR."
346
+ else
347
+ echo " none — config model IDs are current."
348
+ fi
349
+ # flag-only: very old families
350
+ mapfile -t old < <(grep -rEl "$FLAG_ONLY_STALE_RE" "$ROOT" \
351
+ --exclude-dir=node_modules --exclude-dir=.git --exclude-dir=.next 2>/dev/null \
352
+ | grep -vE "$EXCLUDE_RE" || true)
353
+ if [[ ${#old[@]} -gt 0 ]]; then
354
+ echo " FLAG (manual, too old for blind swap):"
355
+ for f in "${old[@]}"; do echo " - $(rel "$f")"; done
356
+ fi
357
+ echo
358
+
359
+ echo "[2] claude-code-action pin freshness (FLAG-ONLY)"
360
+ mapfile -t pins < <(grep -rl 'anthropics/claude-code-action@' "$ROOT/.github" 2>/dev/null || true)
361
+ if [[ ${#pins[@]} -gt 0 ]]; then
362
+ echo " workflows pinning claude-code-action:"
363
+ for f in "${pins[@]}"; do
364
+ echo " - $(rel "$f"): $(grep -oE 'claude-code-action@[a-f0-9]+ # v[0-9.]+' "$f" | head -1)"
365
+ done
366
+ # Compute the drift rather than telling a human to run a command
367
+ # (hr-no-dashboard-eyeball-pull-data-yourself). Best-effort: `gh` may be
368
+ # absent or unauthenticated in a cron sandbox, and that MUST read as
369
+ # UNKNOWN — never as "the pin is fresh".
370
+ if command -v gh >/dev/null 2>&1; then
371
+ _tip="$(gh api repos/anthropics/claude-code-action/releases --jq '.[0].tag_name' 2>/dev/null || true)"
372
+ _pin_sha="$(grep -ohE 'claude-code-action@[a-f0-9]{40}' "${pins[@]}" 2>/dev/null | head -1 | cut -d@ -f2)"
373
+ # These pins are annotated TAG objects, so git/tags resolves them. A pin
374
+ # produced by pin-github-action/Dependabot is a plain COMMIT sha, where
375
+ # git/tags 404s and commits/<sha> is the correct call — try both.
376
+ _pin_desc=""
377
+ if [[ -n "$_pin_sha" ]]; then
378
+ _pin_desc="$(gh api "repos/anthropics/claude-code-action/git/tags/$_pin_sha" --jq '"\(.tag) \(.tagger.date)"' 2>/dev/null \
379
+ || gh api "repos/anthropics/claude-code-action/commits/$_pin_sha" --jq '"(commit) \(.commit.committer.date)"' 2>/dev/null \
380
+ || true)"
381
+ fi
382
+ if [[ -n "$_tip" && -n "$_pin_desc" ]]; then
383
+ echo " pinned: $_pin_desc tip: $_tip"
384
+ else
385
+ echo " pin freshness: UNKNOWN (GitHub API unreachable) — NOT a freshness pass."
386
+ fi
387
+ else
388
+ echo " pin freshness: UNKNOWN (gh not on PATH) — NOT a freshness pass."
389
+ fi
390
+ echo " bump a pin ONLY when coupled to a --model swap in the same workflow (#2540 invariant)."
391
+ else
392
+ echo " no claude-code-action pins under .github (or scanning a test root)."
393
+ fi
394
+ echo
395
+
396
+ echo "[2b] pinned claude-code CLI knows the tier models (FLAG-ONLY)"
397
+ # The `claude` CLI carries a BUNDLED per-model table. A model ID absent from it
398
+ # is treated exactly like a garbage ID: the CLI silently falls back to HALF the
399
+ # max_tokens (measured 64000 -> 32000, #6934), degrading every cron that passes
400
+ # --model. This is invisible to the model-ID sweep, to tsc, and to the suite —
401
+ # the argv is well-formed and the run succeeds. Grep the installed bundle when
402
+ # present; absence of node_modules is UNKNOWN, never a pass.
403
+ #
404
+ # WHAT IS MEASURED: the INSTALLED tree, which is not necessarily the PIN. The
405
+ # model table ships in the platform binary (@anthropic-ai/claude-code-linux-x64),
406
+ # fetched by the stub's postinstall — the npm tarball for @anthropic-ai/claude-code
407
+ # is a ~23 kB launcher that contains no model ids at all, so only an installed
408
+ # (or separately unpacked platform) tree can answer this question.
409
+ #
410
+ # A stale node_modules therefore reports DRIFT against ids the PIN actually
411
+ # knows. Observed 2026-09-03: node_modules held 2.1.142 while package.json
412
+ # pinned 2.1.219, and this check reported `claude-opus-5` and `claude-sonnet-5`
413
+ # ABSENT — both are present in 2.1.219. A false DRIFT here costs a needless
414
+ # dependency bump; the same skew in the other direction (node_modules NEWER
415
+ # than the pin) would report a false PASS, which is worse. So state the two
416
+ # versions and refuse to call a mismatch a measurement of the pin.
417
+ # SCOPE IS LOAD-BEARING: probe the PLATFORM BINARY, never the @anthropic-ai
418
+ # scope. Measured 2026-09-03 in this repo: `claude-agent-sdk` and
419
+ # `claude-agent-sdk-linux-x64` BOTH contain `claude-sonnet-5`, so a scope-wide
420
+ # grep answers "ok present in the pinned CLI bundle" from the AGENT SDK while
421
+ # claude-code lacks the id entirely — a false PASS on the exact #6934
422
+ # degradation this check exists to catch. Read the version from the same
423
+ # package we grep, or the printed version labels a measurement of a different
424
+ # package (the stub carries no model ids, so its version is not the subject).
425
+ _cli_pkg="$ROOT/apps/web-platform/node_modules/@anthropic-ai/claude-code-linux-x64"
426
+ _cli_dir="$_cli_pkg"
427
+ _cli_pinned="$(grep -oE '"@anthropic-ai/claude-code"[[:space:]]*:[[:space:]]*"[^"]+"' \
428
+ "$ROOT/apps/web-platform/package.json" 2>/dev/null | grep -oE '[0-9][^"]*' | head -1 || true)"
429
+ _cli_installed="$(grep -oE '"version"[[:space:]]*:[[:space:]]*"[^"]+"' \
430
+ "$_cli_pkg/package.json" 2>/dev/null \
431
+ | head -1 | grep -oE '[0-9][^"]*' || true)"
432
+ # Every arm names what it measured. The `elif` MUST require _cli_installed:
433
+ # guarding on _cli_pinned alone printed "matches the package.json pin" on a
434
+ # tree with no install at all (reproduced on a root carrying only
435
+ # package.json), immediately above the UNKNOWN line that contradicts it — a
436
+ # pass-shaped claim over a channel that was never read, which is the
437
+ # absent-vs-could-not-look conflation collect_config_hits exists to prevent.
438
+ if [[ -n "$_cli_pinned" && -n "$_cli_installed" && "$_cli_pinned" != "$_cli_installed" ]]; then
439
+ echo " NOTE: measuring INSTALLED ${_cli_installed}, but package.json pins ${_cli_pinned}."
440
+ echo " Findings below describe the installed tree, NOT the pin — reinstall before trusting them."
441
+ elif [[ -n "$_cli_pinned" && -n "$_cli_installed" ]]; then
442
+ echo " measuring installed tree @ ${_cli_installed} (matches the package.json pin)."
443
+ elif [[ -n "$_cli_pinned" ]]; then
444
+ echo " pin: ${_cli_pinned} / installed: (none) — comparison UNKNOWN, not a match."
445
+ else
446
+ echo " pin: UNKNOWN (could not read @anthropic-ai/claude-code from apps/web-platform/package.json)."
447
+ fi
448
+ if [[ -d "$_cli_dir" ]]; then
449
+ # `fable` included: the alternation must cover every tier that can appear in
450
+ # the scanned registries, or the one model whose id the pin lacks is the one
451
+ # model never checked. (Fable reaches Soleur as the harness `model: fable`
452
+ # ALIAS today, so no fable literal is in these files yet — this closes the
453
+ # gap for the launch where one lands.)
454
+ for _m in $(grep -ohE '"claude-(opus|sonnet|haiku|fable)-[0-9a-z-]+"' \
455
+ "$ROOT/apps/web-platform/server/inngest/model-tiers.ts" \
456
+ "$ROOT/apps/web-platform/server/inngest/leader-prompts/constants.ts" 2>/dev/null \
457
+ | tr -d '"' | sort -u); do
458
+ # -a: the linux-x64 CLI is a compiled binary; a text-mode grep silently
459
+ # reports zero hits for EVERY id, including known-good ones (a null result
460
+ # that reads exactly like a real one).
461
+ # Anchored on the SAME boundary as everything else: a fixed-string probe is
462
+ # unanchored on both sides, so a bundle carrying only `claude-opus-5-20260101`
463
+ # answered "ok present" for `claude-opus-5` AND for the bare tier
464
+ # `claude-opus` (measured). That is this PR's own prefix-shadowing class in
465
+ # the PRESENCE direction — a tier whose id the pin genuinely lacks reports
466
+ # green whenever any longer id sharing its prefix is in the blob.
467
+ # Left-anchored too (#8603), matching the CI twin
468
+ # apps/web-platform/test/server/inngest/claude-cli-pin-knows-models.test.ts:
469
+ # an id present only inside a longer token (the Bedrock provider form
470
+ # `us.anthropic.<id>`) is not an entry the model table resolves.
471
+ if grep -raqE "(^|[^0-9A-Za-z.-])${_m}${ID_BOUNDARY}" "$_cli_dir" 2>/dev/null; then
472
+ echo " ok $_m present in the pinned CLI bundle"
473
+ else
474
+ echo " DRIFT $_m ABSENT from ${_cli_pkg##*/} @ ${_cli_installed:-unknown} — bump @anthropic-ai/claude-code"
475
+ fi
476
+ done
477
+ else
478
+ echo " UNKNOWN (${_cli_pkg#"$ROOT"/} absent) — NOT a pass; run after install."
479
+ fi
480
+ echo
481
+
482
+ echo "[3] pricing + tier-map + dormant work (FLAG-ONLY)"
483
+ echo " - pricing: compare apps/web-platform/server/inngest/functions/agent-on-spawn-requested.ts"
484
+ echo " MODEL_PRICING rows against the claude-api source-of-truth; never auto-edit (billing constant)."
485
+ echo " - tier-map: re-check cron model literals + ADR-053 / plugins/soleur/AGENTS.md policy vs new pricing."
486
+ echo " (workflow-model-pins.test.ts PIN_ALLOWLIST is a don't-mutate invariant, not a pricing surface.)"
487
+ echo " - dormant: gh issue list --state open -L 200 --search 'deferred model OR pricing'"
488
+ echo " - grok tier-map (item 6, agent-run): compare 'grok models' + docs.x.ai against TIER_MAPS.grok."
489
+ echo " - thinking-API shape: the REQUEST side sets no thinking params, but the CLI applies each"
490
+ echo " model row's default_effort: re-decide AUDIT_EFFORT (apps/web-platform/server/inngest/"
491
+ echo " model-tiers.ts) and update REVIEWED_DEFAULT_EFFORT in claude-cli-pin-knows-models.test.ts (#8603)."
492
+ echo " The RESPONSE side is NOT inert: a thinking-by-default model puts a thinking block"
493
+ echo " FIRST, so any reader indexing a fixed content position silently returns empty"
494
+ echo " and the model's answer is billed and discarded (#8392)."
495
+ echo " The BLOCKING guard is scripts/lint-anthropic-content-position.py, twin-"
496
+ echo " registered in scripts/test-all.sh so it gates every PR — this census does"
497
+ echo " NOT gate anything and is reachable only from this hand-run audit mode"
498
+ echo " (--detect and --fix both return before it). Advisory echo of the same scan:"
499
+ collect_content_position_readers
500
+ echo
501
+ echo "== end audit =="