@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,580 @@
1
+ #!/usr/bin/env bash
2
+ # Soleur process helpers: enumerate and signal test runs WITHOUT killing the
3
+ # invoking shell or another worktree's session.
4
+ #
5
+ # WHY THIS FILE EXISTS. A prose rule forbidding self-matching `pkill -f` already
6
+ # lived in the work skill and did not prevent the failure it describes: on
7
+ # 2026-08-13 an agent read that rule, ran the forbidden form anyway, killed its
8
+ # own shell, then wrote a "more careful" pgrep loop that self-matched and killed
9
+ # its shell a second time. The second attempt was also unscoped across sibling
10
+ # worktrees — parallel worktrees are this repo's documented workflow, so an
11
+ # unscoped pattern is a cross-session destructive action. Prose does not
12
+ # execute; this does. See #7525.
13
+ #
14
+ # WHY BRACKET-SAFETY IS A CATEGORY ERROR HERE. `[t]est-all` is a pgrep/`ps|grep`
15
+ # idiom: it stops the MATCHER from matching itself. A /proc walk has no pattern
16
+ # for a bracket to fool, and the invoker's own command line still contains the
17
+ # literal pattern either way. The property ("never reports the process
18
+ # performing the enumeration") is bought by the three exclusions below instead.
19
+ #
20
+ # HIDDEN ASSUMPTION, stated because the design depends on it: proc.sh's own
21
+ # command line MATCHES proc.sh's own predicate. That is the entire reason the
22
+ # process-group exclusion is required — proc.sh's command-substitution forks
23
+ # match the predicate and are NOT ancestors. Do not remove it on the grounds
24
+ # that ancestry already covers the invoking shell.
25
+ #
26
+ # THE SCAN->SIGNAL CHANNEL CARRIES NO PATHS. This is the file's single most
27
+ # important structural property and it was learned the hard way: the first
28
+ # revision emitted `class<TAB>pid<TAB>cwd` and read it back with
29
+ # `IFS=$'\t' read`. A directory name may legally contain a newline, and
30
+ # /proc/<pid>/cwd reports it verbatim — so a process whose cwd was a directory
31
+ # named $'evil\nsignal\t31337\t/pwned' injected a FORGED `signal` row into the
32
+ # protocol. Measured: pid 31337 reached the kill site having never matched the
33
+ # pattern, never been classified, and never had its cwd tested, while the
34
+ # carrier process itself was correctly refused. The refusal path WAS the
35
+ # injection vector, so a correct boundary check did not help.
36
+ #
37
+ # Therefore the channel now carries only (a) a class token from a closed set of
38
+ # literals and (b) a pid, which is numeric by construction and re-validated
39
+ # before use. Paths are re-read by the consumer for DISPLAY only, and sanitized.
40
+ # Do not put a filesystem path back into this channel.
41
+ #
42
+ # The /proc primitives below are MIRRORED from scripts/lib/test-contention.sh
43
+ # (search that file for `_tc_stat_field`), deliberately not sourced: this file
44
+ # ships inside the plugin (ADR-178) and a shipped file sourcing a repo-root
45
+ # library is the exact defect ADR-178 exists to prevent. plugins/soleur/test/
46
+ # proc.test.sh pins the mirrored forms against drift.
47
+ #
48
+ # Location: ships INSIDE the plugin (ADR-178, ADR-179) so a marketplace install
49
+ # resolves it, and so a customer's own `scripts/` directory cannot shadow a file
50
+ # whose advertised contract is to send signals.
51
+ #
52
+ # PORTABILITY: bash 3.2 (the /bin/bash macOS ships). `mapfile -d` is bash 4.4+
53
+ # and is deliberately NOT used — when it is absent the error is swallowed, argv
54
+ # stays empty, nothing ever matches, and `kill_mine` prints `killed=0`, which
55
+ # reads as "nothing to kill" and sends the operator back to pkill. That is this
56
+ # file's own failure mode reappearing one level down, so the NUL read below is
57
+ # written the portable way on purpose.
58
+
59
+ # Guard against double-source within a single shell.
60
+ if [[ "${_SOLEUR_PROC_LOADED:-}" == "1" ]]; then
61
+ return 0 2>/dev/null || true
62
+ fi
63
+ _SOLEUR_PROC_LOADED=1
64
+
65
+ # Test seams. Namespace-prefixed because scripts/tmpfs-guard.sh already binds a
66
+ # bare PROC_ROOT and this file is sourceable.
67
+ PROC_SH_ROOT="${PROC_SH_ROOT:-/proc}"
68
+ PROC_SH_SELF_PID="${PROC_SH_SELF_PID:-$$}"
69
+
70
+ # Wrapper commands that legitimately precede a shell on the command line.
71
+ # Without this, `timeout 600 bash scripts/test-all.sh` has argv[0]=timeout and
72
+ # is INVISIBLE to both verbs — and `timeout … bash <suite>` is a real shape in
73
+ # this repo (scripts/lib/test-contention.sh says so in its own comments). An
74
+ # invisible run is a silent `killed=0`, i.e. the D6 failure mode.
75
+ _PROC_WRAPPERS='timeout env nohup nice ionice setsid stdbuf time taskset flock script unbuffer rtk'
76
+ # `rtk` carries an optional exec-subcommand word (run|err|test|proxy|bypass|summary) between
77
+ # itself and the real argv — `rtk run bash x.sh` execs bash, and `rtk bash x.sh` does too
78
+ # (filtered subcommand or run_fallback raw exec). The walk below skips the wrapper's own
79
+ # options, then that subcommand word if present, before landing.
80
+ # NOT `busybox`: it is an applet multiplexer, not a shell, so admitting it makes
81
+ # `busybox grep -rn test-all.sh` scan every later token and match — the same
82
+ # over-match the wrapper walk below was corrected for.
83
+ _PROC_SHELLS='bash sh dash zsh ksh mksh ash'
84
+
85
+ # --- /proc primitives (mirrored from scripts/lib/test-contention.sh) --------
86
+ #
87
+ # comm (field 2) is parenthesized and MAY contain spaces and close-parens, so
88
+ # the parser strips through the LAST ') ' rather than splitting on whitespace.
89
+ # A naive `awk '{print $4}'` mis-indexes on any such process — which is exactly
90
+ # what the /proc recipe currently quoted in git-worktree/SKILL.md does.
91
+ _proc_stat_field() {
92
+ # $1 = path to a /proc/<pid>/stat file, $2 = field index AFTER the comm strip
93
+ # (i.e. overall field N maps to N-2 here).
94
+ local f="$1" idx="$2" line rest
95
+ [[ -r "$f" ]] || return 0
96
+ line=$(cat "$f" 2>/dev/null) || return 0
97
+ rest="${line##*') '}"
98
+ awk -v i="$idx" '{print $i}' <<<"$rest"
99
+ }
100
+
101
+ # Overall field 4 (ppid) => field 2 after the comm strip.
102
+ _proc_ppid() { _proc_stat_field "$1" 2; }
103
+ # Overall field 5 (pgrp) => field 3 after the comm strip.
104
+ _proc_pgrp() { _proc_stat_field "$1" 3; }
105
+
106
+ # Self plus every ancestor pid.
107
+ #
108
+ # WHY THE WHOLE CHAIN, not just $$ and $PPID: this helper is normally launched
109
+ # through a wrapper (`bash -c '… bash …/proc.sh kill_mine test-all.sh'`, a CI
110
+ # step shell, an agent harness), and that wrapper's OWN command line contains
111
+ # the pattern. Excluding only $$ reports the caller's own invocation as a
112
+ # target on EVERY run. Measured in test-contention.sh's development: a clean
113
+ # solo run reported 2 phantom siblings, both links in its own ancestor chain.
114
+ _proc_self_and_ancestors() {
115
+ local pid="$PROC_SH_SELF_PID" out="" guard=0
116
+ while [[ "$pid" =~ ^[0-9]+$ ]] && (( pid > 0 && guard < 64 )); do
117
+ out+="$pid "
118
+ local ppid
119
+ ppid=$(_proc_ppid "$PROC_SH_ROOT/$pid/stat") || ppid=""
120
+ [[ "$ppid" =~ ^[0-9]+$ ]] || break
121
+ [[ "$ppid" == "$pid" ]] && break
122
+ pid="$ppid"
123
+ guard=$(( guard + 1 ))
124
+ done
125
+ printf '%s' "$out"
126
+ }
127
+
128
+ # --- Ownership boundary ----------------------------------------------------
129
+
130
+ # Canonicalize a directory so a symlinked worktree path compares equal to the
131
+ # resolved cwd /proc reports. Without this, kill_mine refuses EVERYTHING and
132
+ # looks correct — a failure the suite must have a fixture for, because a
133
+ # positive control whose paths are already canonical cannot see it.
134
+ _proc_canon() {
135
+ local p="$1"
136
+ if [[ -d "$p" ]]; then
137
+ (cd "$p" 2>/dev/null && pwd -P) && return 0
138
+ fi
139
+ printf '%s' "$p"
140
+ }
141
+
142
+ # The current worktree, or a loud failure. Fail-closed on purpose: a scan with
143
+ # no ownership boundary would classify every match as foreign or, worse, as
144
+ # mine — and this file's whole contract is that boundary.
145
+ _proc_worktree() {
146
+ local root
147
+ if [[ -n "${PROC_SH_WORKTREE:-}" ]]; then
148
+ root=$(_proc_canon "$PROC_SH_WORKTREE")
149
+ else
150
+ root=$(git rev-parse --show-toplevel 2>/dev/null) || root=""
151
+ if [[ -z "$root" ]]; then
152
+ echo "proc.sh: cannot resolve the current worktree (not inside a git repository and PROC_SH_WORKTREE is unset)." >&2
153
+ echo "proc.sh: refusing to scan — without an ownership boundary this cannot tell your processes from another session's." >&2
154
+ return 1
155
+ fi
156
+ root=$(_proc_canon "$root")
157
+ fi
158
+
159
+ # The boundary must be an absolute path below the filesystem root. An empty
160
+ # root would make the prefix test `/*`, which matches EVERY absolute path;
161
+ # a bare `/` is a boundary that owns the whole machine. Both are refused
162
+ # structurally rather than relying on the prefix test's incidental behaviour.
163
+ if [[ "$root" != /* || "$root" == "/" ]]; then
164
+ echo "proc.sh: refusing to scan — ownership boundary '$root' is not an absolute path below /." >&2
165
+ return 1
166
+ fi
167
+ printf '%s' "$root"
168
+ }
169
+
170
+ # Sibling worktrees nested UNDER the current root, loaded into the global array
171
+ # `_PROC_NESTED`.
172
+ #
173
+ # WHY: in the ordinary non-bare layout the main checkout's toplevel is a strict
174
+ # PREFIX of every worktree beneath it, so `kill_mine` run from the main checkout
175
+ # would classify every sibling worktree's processes as `mine` — the exact
176
+ # cross-session kill this file exists to prevent, arriving through the boundary
177
+ # rather than around it.
178
+ #
179
+ # AN ARRAY, NOT A DELIMITED STRING, and `--porcelain`, NOT the default format.
180
+ # The first revision of this function did `${line%% *}` over `git worktree list`
181
+ # and joined the results space-delimited, then re-split them with an unquoted
182
+ # `for`. That is the F1 defect class — a path in a text channel — re-created
183
+ # inside the guard written to close a different instance of it. Measured: a
184
+ # worktree at `.worktrees/my branch` truncated to `.worktrees/my`, matched
185
+ # nothing, and was NOT excluded, so the cross-worktree kill came back through
186
+ # the new guard. The unquoted `for` also glob-expanded any path containing `*`.
187
+ # `--porcelain` emits one unambiguous `worktree <path>` line per entry.
188
+ #
189
+ # `git -C "$root"`, not the ambient cwd: with PROC_SH_WORKTREE scoping the
190
+ # boundary to a repo other than the caller's cwd — the documented seam — running
191
+ # git in the cwd returns nothing, and an empty exclusion set is NOT harmless. It
192
+ # is precisely the state this function exists to prevent, so it warns.
193
+ _PROC_NESTED=()
194
+ _proc_load_nested() {
195
+ local root="$1" line p
196
+ _PROC_NESTED=()
197
+ if ! git -C "$root" rev-parse --git-dir >/dev/null 2>&1; then
198
+ echo "proc.sh: warning — cannot enumerate worktrees under '$root' (not a git repo, or git unavailable)." >&2
199
+ echo "proc.sh: nested worktrees will NOT be excluded; a process in one may be classified as yours." >&2
200
+ return 0
201
+ fi
202
+ while IFS= read -r line; do
203
+ [[ "$line" == worktree\ * ]] || continue
204
+ p="${line#worktree }"
205
+ [[ -n "$p" ]] || continue
206
+ p=$(_proc_canon "$p")
207
+ [[ "$p" == "$root" ]] && continue
208
+ [[ "$p" == "$root"/* ]] && _PROC_NESTED+=("$p")
209
+ done < <(git -C "$root" worktree list --porcelain 2>/dev/null || true)
210
+ }
211
+
212
+ # Does this pid's own cwd lie inside the ownership boundary?
213
+ #
214
+ # The SINGLE source of truth for the boundary — called once during the walk and
215
+ # again immediately before the signal. The second call narrows the pid-reuse
216
+ # window and re-validates numeric form; it is NOT a forgery defence (a forged
217
+ # pid naming any process whose cwd is inside the boundary would pass it
218
+ # unchanged). The forgery defence is that the channel carries no paths at all.
219
+ #
220
+ # On success it sets `_PROC_OWNS_CWD` to the canonicalized path that PASSED the
221
+ # check, so the caller can report the value the decision was made on rather than
222
+ # taking a third, independent reading.
223
+ _PROC_OWNS_CWD=""
224
+ _proc_owns() {
225
+ local pid="$1" root="$2" cwd n
226
+ _PROC_OWNS_CWD=""
227
+ [[ "$pid" =~ ^[1-9][0-9]*$ ]] || return 1
228
+ cwd=$(readlink "$PROC_SH_ROOT/$pid/cwd" 2>/dev/null) || return 1
229
+ [[ -n "$cwd" ]] || return 1
230
+ # A deleted cwd is reported by the kernel as `<path> (deleted)`, with rc 0.
231
+ # That is a "could not establish where this process is" state, not a path, so
232
+ # it is refused rather than string-matched — no positive proof, no signal.
233
+ #
234
+ # This suffix test is FALSIFIABLE, and deliberately kept anyway (#7537).
235
+ # Measured: a live directory literally named `work (deleted)` reads st_nlink 2
236
+ # while a genuinely deleted cwd reads 0, so the suffix alone cannot tell the
237
+ # two apart. Here that does not matter, because the failure direction is a
238
+ # REFUSAL — a process in such a directory is simply never claimed as ours, and
239
+ # nothing is signalled on the strength of it.
240
+ #
241
+ # The repo-root `scripts/orphan-process-reaper.sh` (a developer-box tool, not
242
+ # shipped to customers, so this path may not exist in your checkout) asks a
243
+ # DIFFERENT question about the same
244
+ # link — "is this inode unlinked?" — and answers it with `stat -Lc '%h'`
245
+ # rather than with the suffix, because for that question the failure direction
246
+ # is a KILL. The two predicates are meant to diverge; unifying them would move
247
+ # this file's refusal onto a test built for the opposite consequence.
248
+ [[ "$cwd" == *' (deleted)' ]] && return 1
249
+ cwd=$(_proc_canon "$cwd")
250
+ for n in ${_PROC_NESTED[@]+"${_PROC_NESTED[@]}"}; do
251
+ [[ "$cwd" == "$n" || "$cwd" == "$n"/* ]] && return 1
252
+ done
253
+ # The trailing `/` is the whole prefix boundary: without it a sibling
254
+ # worktree named `<ROOT>-two` is selected as ours.
255
+ if [[ "$cwd" == "$root" || "$cwd" == "$root"/* ]]; then
256
+ _PROC_OWNS_CWD="$cwd"
257
+ return 0
258
+ fi
259
+ return 1
260
+ }
261
+
262
+ # A string rendered safe to print.
263
+ #
264
+ # `tr -c '[:print:]'`, not a hand-picked list. The first revision mapped only
265
+ # \n \t \r, which is the shape that looks thorough and is not: measured, ESC,
266
+ # BEL, backspace, VT and DEL all survived it. A directory can legally be named
267
+ # $'\033[2K\033[1Aoverwritten', and printing that erases the line above it in
268
+ # the operator's terminal — audit forgery in the tool whose output is the only
269
+ # evidence of what it did. LC_ALL=C so the class is byte-wise; the cost is that
270
+ # non-ASCII path bytes are masked too, which is the right trade here.
271
+ # `printf | tr`, NOT a herestring: `<<<` appends a newline, which is itself
272
+ # non-printing and so became a spurious trailing `?` on every path.
273
+ _proc_sanitize() { printf '%s' "$1" | LC_ALL=C tr -c '[:print:]' '?'; }
274
+
275
+ # The cwd of a pid, re-read and sanitized, for DISPLAY only.
276
+ _proc_show_cwd() {
277
+ local pid="$1" cwd
278
+ cwd=$(readlink "$PROC_SH_ROOT/$pid/cwd" 2>/dev/null) || cwd=""
279
+ [[ -n "$cwd" ]] || { printf '<unreadable>'; return 0; }
280
+ _proc_sanitize "$cwd"
281
+ }
282
+
283
+ # --- Matching --------------------------------------------------------------
284
+
285
+ # Does this /proc/<pid> match PATTERN, by ARGV POSITION rather than by substring
286
+ # anywhere in the joined command line (cq-assert-anchor-not-bare-token applied
287
+ # to process matching)?
288
+ #
289
+ # A substring over the joined cmdline matches any process that merely MENTIONS
290
+ # the target — including `grep -rn test-all.sh scripts/`, so `kill_mine
291
+ # test-all.sh` would kill the operator's own grep.
292
+ _proc_is_match() {
293
+ local d="$1" pat="$2"
294
+ [[ -r "$d/cmdline" ]] || return 1
295
+
296
+ # Portable NUL-separated argv read. NOT `mapfile -d ''` — see PORTABILITY.
297
+ #
298
+ # The `|| [[ -n "$arg" ]]` is load-bearing: `read` returns non-zero at EOF
299
+ # when the final field has no delimiter, so without it the last argv element
300
+ # is silently DISCARDED. Processes that rewrite argv in place (Perl `$0=`,
301
+ # Python setproctitle, several daemons) routinely leave the trailing NUL off,
302
+ # and measured, such a process was invisible to both verbs — a silent
303
+ # `killed=0`, which is the failure this construct was chosen to avoid.
304
+ local -a argv=()
305
+ local arg
306
+ while IFS= read -r -d '' arg || [[ -n "$arg" ]]; do
307
+ argv+=("$arg")
308
+ done < "$d/cmdline"
309
+ (( ${#argv[@]} > 0 )) || return 1
310
+
311
+ # Step over leading wrapper commands AND their own arguments, so
312
+ # `timeout 600 bash suite.sh` is not invisible.
313
+ #
314
+ # A PREVIOUS REVISION GOT THIS WRONG IN THE DANGEROUS DIRECTION and it is
315
+ # recorded here because the failure is subtle: it tolerated arbitrary tokens
316
+ # after any wrapper, which degenerated the whole rule into a bare basename
317
+ # match over every argv element. Measured — `timeout 600 grep -rn test-all.sh
318
+ # scripts/` classified as OURS, so `kill_mine test-all.sh` would have killed
319
+ # the operator's own grep from inside their own worktree, where the cwd test
320
+ # cannot save them. That is exactly the harm the argv-position rule exists to
321
+ # prevent, reintroduced by the fix for wrapper invisibility.
322
+ #
323
+ # So the wrapper walk consumes only what a wrapper can plausibly take —
324
+ # options, VAR=value assignments, bare numeric durations — and then the STRICT
325
+ # rule is re-applied to whatever it lands on. Anything unrecognized ends the
326
+ # walk rather than being skipped: an unmatched run is invisible (fail closed),
327
+ # while a wrongly-matched one is a kill.
328
+ local i=0 b
329
+ while (( i < ${#argv[@]} )); do
330
+ b="${argv[i]##*/}"
331
+ case " $_PROC_WRAPPERS " in
332
+ *" $b "*)
333
+ i=$(( i + 1 ))
334
+ while (( i < ${#argv[@]} )); do
335
+ case "${argv[i]}" in
336
+ -* | *=* | [0-9]*) i=$(( i + 1 )) ;;
337
+ *) break ;;
338
+ esac
339
+ done
340
+ if [[ "$b" == rtk ]]; then
341
+ case "${argv[i]:-}" in run|err|test|proxy|bypass|summary) i=$(( i + 1 )) ;; esac
342
+ while (( i < ${#argv[@]} )); do
343
+ case "${argv[i]}" in
344
+ -* | *=* | [0-9]*) i=$(( i + 1 )) ;;
345
+ *) break ;;
346
+ esac
347
+ done
348
+ fi
349
+ continue
350
+ ;;
351
+ esac
352
+ break
353
+ done
354
+ (( i < ${#argv[@]} )) || return 1
355
+
356
+ # The effective command. STRICT from here: it is the target itself, or a
357
+ # shell whose later arguments may name the target. Never an arbitrary command
358
+ # that merely mentions the pattern somewhere in its argv.
359
+ b="${argv[i]##*/}"
360
+ [[ "$b" == "$pat" ]] && return 0
361
+ case " $_PROC_SHELLS " in
362
+ *" $b "*) ;;
363
+ *) return 1 ;;
364
+ esac
365
+
366
+ local tok j
367
+ for (( j = i + 1; j < ${#argv[@]}; j++ )); do
368
+ tok="${argv[j]}"
369
+ [[ "$tok" == *[[:space:]]* ]] && continue
370
+ [[ "${tok##*/}" == "$pat" ]] && return 0
371
+ done
372
+ return 1
373
+ }
374
+
375
+ # --- The single walk -------------------------------------------------------
376
+ #
377
+ # ONE walk, shared by both verbs, so there is exactly one place where a pid can
378
+ # be classified. Emits `<class><TAB><pid>` where class is one of the literals
379
+ # below and pid is numeric — NO PATHS (see the header). `total` carries a count
380
+ # rather than a pid.
381
+ _proc_scan() {
382
+ local pat="$1" root="$2"
383
+ local excluded self_pgrp d pid pgrp scanned=0
384
+
385
+ excluded=" $(_proc_self_and_ancestors)"
386
+
387
+ # Own process GROUP. The command-substitution subshells and `&`-backgrounded
388
+ # forks of THIS very invocation share its pgid but are NOT in the ancestor
389
+ # chain, so ancestry alone lets proc.sh select a transient fork of itself. A
390
+ # genuinely separate session has a DIFFERENT pgid, so pgid is the exact
391
+ # discriminator.
392
+ self_pgrp=$(_proc_pgrp "$PROC_SH_ROOT/$PROC_SH_SELF_PID/stat" 2>/dev/null) || self_pgrp=""
393
+ [[ "$self_pgrp" =~ ^[0-9]+$ ]] || self_pgrp=""
394
+
395
+ for d in "$PROC_SH_ROOT"/[0-9]*; do
396
+ [[ -d "$d" ]] || continue
397
+ pid="${d##*/}"
398
+ # The glob only guarantees a LEADING digit: `12abc` and `0` both match it,
399
+ # and `kill -TERM 0` signals the caller's whole process group. Validated
400
+ # here so no non-pid can reach the signal site.
401
+ [[ "$pid" =~ ^[1-9][0-9]*$ ]] || continue
402
+ scanned=$(( scanned + 1 ))
403
+
404
+ [[ "$excluded" == *" $pid "* ]] && continue
405
+ _proc_is_match "$d" "$pat" || continue
406
+
407
+ pgrp=$(_proc_pgrp "$d/stat") || pgrp=""
408
+ if [[ -n "$self_pgrp" ]] && [[ "$pgrp" == "$self_pgrp" ]]; then
409
+ printf 'skip\t%s\n' "$pid"
410
+ continue
411
+ fi
412
+
413
+ if _proc_owns "$pid" "$root"; then
414
+ printf 'signal\t%s\n' "$pid"
415
+ else
416
+ printf 'refuse\t%s\n' "$pid"
417
+ fi
418
+ done
419
+
420
+ printf 'total\t%s\n' "$scanned"
421
+ }
422
+
423
+ # Reject a pattern that can never match, loudly. Both comparisons are against a
424
+ # BASENAME, so a pattern containing `/` matches nothing — and would print
425
+ # `killed=0`, which reads as "nothing to kill" and sends the operator back to
426
+ # pkill.
427
+ _proc_check_pattern() {
428
+ local pat="$1" verb="$2"
429
+ if [[ -z "$pat" ]]; then
430
+ echo "usage: $verb <pattern> [signal]" >&2
431
+ return 2
432
+ fi
433
+ if [[ "$pat" == */* ]]; then
434
+ echo "proc.sh: pattern '$pat' contains '/' and can never match — matching is on the BASENAME." >&2
435
+ echo "proc.sh: use '${pat##*/}' instead." >&2
436
+ return 2
437
+ fi
438
+ return 0
439
+ }
440
+
441
+ # --- Verbs -----------------------------------------------------------------
442
+
443
+ # list_runs <pattern>
444
+ #
445
+ # Enumerate every matching process, each labelled with the worktree that owns
446
+ # it. Signals nothing — this is the dry run, and the thing to reach for first.
447
+ list_runs() {
448
+ local pat="${1:-}"
449
+ _proc_check_pattern "$pat" list_runs || return $?
450
+ local root
451
+ root=$(_proc_worktree) || return 1
452
+ _proc_load_nested "$root"
453
+
454
+ local cls pid n=0
455
+ while IFS=$'\t' read -r cls pid; do
456
+ case "$cls" in
457
+ signal) printf '%s\tmine\t%s\n' "$pid" "$(_proc_show_cwd "$pid")"; n=$(( n + 1 )) ;;
458
+ refuse) printf '%s\tforeign\t%s\n' "$pid" "$(_proc_show_cwd "$pid")"; n=$(( n + 1 )) ;;
459
+ skip) printf '%s\tskipped\tsame-process-group\n' "$pid"; n=$(( n + 1 )) ;;
460
+ *) ;;
461
+ esac
462
+ done < <(_proc_scan "$pat" "$root")
463
+
464
+ (( n > 0 )) || echo "no processes match '$pat'"
465
+ return 0
466
+ }
467
+
468
+ # kill_mine <pattern> [signal]
469
+ #
470
+ # Signal ONLY the matching processes whose own cwd is inside the current
471
+ # worktree. Everything else is refused AND printed — a refusal you cannot see
472
+ # is indistinguishable from a match that never happened.
473
+ #
474
+ # Individual pids are signalled, never a process group: `kill -TERM 0` can
475
+ # reach the parent. Default TERM; the caller may pass another signal, and no
476
+ # escalation to KILL happens on its own.
477
+ kill_mine() {
478
+ local pat="${1:-}" sig="${2:-TERM}"
479
+ _proc_check_pattern "$pat" kill_mine || return $?
480
+ local root
481
+ root=$(_proc_worktree) || return 1
482
+ _proc_load_nested "$root"
483
+
484
+ # Fail SAFE, not open: anything other than an explicit off value means dry
485
+ # run. The previous form matched only the literal `1`, so PROC_SH_DRY_RUN=true
486
+ # performed a REAL kill on an operator who had asked for a rehearsal.
487
+ local dry=0
488
+ case "${PROC_SH_DRY_RUN:-0}" in
489
+ 0 | false | "") dry=0 ;;
490
+ *) dry=1 ;;
491
+ esac
492
+
493
+ local killed=0 would=0 refused=0 late=0 skipped=0 failed=0 scanned=0
494
+ local cls pid rc shown
495
+ while IFS=$'\t' read -r cls pid; do
496
+ case "$cls" in
497
+ signal)
498
+ # Re-verify ownership at the signal site. The walk's verdict is about a
499
+ # pid at scan time; a pid can die and be recycled onto an unrelated
500
+ # process before this line runs. One extra readlink narrows that window.
501
+ if ! _proc_owns "$pid" "$root"; then
502
+ late=$(( late + 1 ))
503
+ printf 'refused pid=%s reason=%s\n' "$pid" "ownership-changed-before-signal"
504
+ continue
505
+ fi
506
+ # Capture the display path from the SAME check that authorized the
507
+ # signal, BEFORE sending it. Re-reading afterwards loses the path
508
+ # exactly when the kill succeeds — the process is gone, readlink fails,
509
+ # and the record degrades to `<unreadable>`. Measured: a live run
510
+ # printed `signalled pid=954752 cwd=<unreadable>` while the dry run
511
+ # printed the real path, so the rehearsal showed what the real run hid.
512
+ shown=$(_proc_sanitize "$_PROC_OWNS_CWD")
513
+ if (( dry )); then
514
+ would=$(( would + 1 ))
515
+ printf 'would-signal pid=%s cwd=%s\n' "$pid" "$shown"
516
+ continue
517
+ fi
518
+ rc=0
519
+ kill -"$sig" "$pid" 2>/dev/null || rc=$?
520
+ if (( rc == 0 )); then
521
+ killed=$(( killed + 1 ))
522
+ printf 'signalled pid=%s cwd=%s\n' "$pid" "$shown"
523
+ else
524
+ # A swallowed failure counted as a kill is a lie in the direction
525
+ # that matters: the operator reads killed=1 and stops looking.
526
+ failed=$(( failed + 1 ))
527
+ printf 'FAILED pid=%s rc=%s (signal not delivered)\n' "$pid" "$rc"
528
+ fi
529
+ ;;
530
+ refuse)
531
+ refused=$(( refused + 1 ))
532
+ printf 'refused pid=%s cwd=%s\n' "$pid" "$(_proc_show_cwd "$pid")"
533
+ ;;
534
+ skip)
535
+ skipped=$(( skipped + 1 ))
536
+ printf 'refused pid=%s reason=%s\n' "$pid" "same-process-group"
537
+ ;;
538
+ total) scanned="$pid" ;;
539
+ *) ;;
540
+ esac
541
+ done < <(_proc_scan "$pat" "$root")
542
+
543
+ # Printed on EVERY invocation. `skipped_same_pgroup` is counted SEPARATELY
544
+ # because the pgid exclusion can legitimately suppress a real target — under
545
+ # a non-interactive shell without job control, a run launched with `&` from
546
+ # the same shell shares this pgid. A bare `killed=0` would then read as
547
+ # "nothing to kill" and send the operator straight back to pkill, which is
548
+ # the precise failure this file exists to prevent, one level down. The
549
+ # documented workaround is to launch under `setsid`, which creates a new pgid.
550
+ # `mode` is on the line because output alone could not previously distinguish
551
+ # a rehearsal from a real kill.
552
+ # `would_signal` is separate from `killed` so a rehearsal never reports kills
553
+ # it did not perform, and `late_refused` is separate from `refused` so the
554
+ # signal-site re-check is visible as its own enforcement point rather than
555
+ # being folded into the walk's verdict.
556
+ printf 'killed=%s would_signal=%s failed=%s refused=%s late_refused=%s skipped_same_pgroup=%s scanned=%s mode=%s\n' \
557
+ "$killed" "$would" "$failed" "$refused" "$late" "$skipped" "$scanned" \
558
+ "$( (( dry )) && printf 'dry-run' || printf 'live' )"
559
+ return 0
560
+ }
561
+
562
+ # Allow `bash proc.sh <fn> <args>` as a CLI shim (used by SKILL.md pointers and
563
+ # ad-hoc operator invocations), mirroring session-state.sh's dispatch.
564
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
565
+ fn="${1:-}"
566
+ shift || true
567
+ case "$fn" in
568
+ list_runs | kill_mine)
569
+ "$fn" "$@"
570
+ ;;
571
+ "")
572
+ echo "usage: $0 {list_runs|kill_mine} <pattern> [signal]" >&2
573
+ exit 2
574
+ ;;
575
+ *)
576
+ echo "proc.sh: unknown function: $fn" >&2
577
+ exit 2
578
+ ;;
579
+ esac
580
+ fi