@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,88 @@
1
+ #!/usr/bin/env bash
2
+ # Concierge repo-readiness gate (fix-concierge-repo-readiness-gate):
3
+ # worktree-manager.sh must FAIL LOUD when invoked in a workspace that has no git
4
+ # repository at all (the Concierge cloud env when a connected repo's clone is
5
+ # still in flight, or its self-heal clone failed). Previously the `create` path
6
+ # died silently under `set -e` on `git rev-parse --show-toplevel`, so the
7
+ # skill (go/one-shot) saw no clear signal and the agent improvised ~40 varied
8
+ # exploration commands (evading the narrow cd-&&-pwd-loop runtime detector from
9
+ # #5313) before the session hung. The fix emits a distinct `NO_GIT_REPOSITORY`
10
+ # marker + non-zero exit so the skill can stop with an honest, no-wait message.
11
+ #
12
+ # Run via: bash plugins/soleur/skills/git-worktree/test/no-repo-fail-loud.test.sh
13
+
14
+ set -uo pipefail
15
+
16
+ # Git-location tripwire (#7833). These suites drive worktree-manager.sh, which runs
17
+ # `git worktree remove`, `git branch -D` and `git reset --hard` -- the highest-damage git writes
18
+ # in the corpus. An inherited GIT_DIR aims all of them at the developer's real repository, so
19
+ # this file aborts rather than proceeding. Inline rather than sourcing test-helpers.sh, which
20
+ # would also import an assertion framework these suites do not use.
21
+ for _v in GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE GIT_COMMON_DIR GIT_OBJECT_DIRECTORY \
22
+ GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_NAMESPACE GIT_TEMPLATE_DIR GIT_EXEC_PATH; do
23
+ if [[ -n "${!_v:-}" && "${SOLEUR_GIT_TRIPWIRE_ALLOW:-0}" != "1" ]]; then
24
+ printf 'FATAL: %s started with an inherited git-location environment (%s=%s).\n' \
25
+ "${BASH_SOURCE[0]}" "$_v" "${!_v}" >&2
26
+ printf 'Fix the ENTRY POINT: unset %s && <runner>\n' "$_v" >&2
27
+ exit 97
28
+ fi
29
+ done
30
+ unset _v
31
+
32
+ REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../../.." && pwd)"
33
+ WM="$REPO_ROOT/plugins/soleur/skills/git-worktree/scripts/worktree-manager.sh"
34
+
35
+ PASS=0; FAIL=0
36
+ fail() { echo " FAIL: $1"; FAIL=$((FAIL+1)); }
37
+ pass() { echo " pass: $1"; PASS=$((PASS+1)); }
38
+
39
+ TMP=$(mktemp -d)
40
+ trap 'rm -rf "$TMP"' EXIT
41
+
42
+ # A workspace dir that is NOT a git repo (no `.git`) — mirrors a Concierge
43
+ # /workspaces/<id> whose clone never landed. GIT_CEILING_DIRECTORIES stops git
44
+ # from discovering an ancestor repo (e.g. the soleur checkout hosting this test).
45
+ NOREPO="$TMP/workspace"
46
+ mkdir -p "$NOREPO"
47
+ export GIT_CEILING_DIRECTORIES="$TMP"
48
+
49
+ # --- AC1: `create` exits non-zero in a repo-less workspace ---
50
+ (
51
+ cd "$NOREPO"
52
+ bash "$WM" --yes create feat-x
53
+ ) >"$TMP/out.log" 2>&1
54
+ RC=$?
55
+ [[ "$RC" -ne 0 ]] \
56
+ && pass "AC1: create exits non-zero in a repo-less workspace (rc=$RC)" \
57
+ || fail "AC1: create exited 0 in a repo-less workspace (should fail loud)"
58
+
59
+ # --- AC2: output carries the machine-detectable NO_GIT_REPOSITORY marker ---
60
+ grep -q "NO_GIT_REPOSITORY" "$TMP/out.log" \
61
+ && pass "AC2: output contains NO_GIT_REPOSITORY marker" \
62
+ || fail "AC2: output missing NO_GIT_REPOSITORY marker (got: $(cat "$TMP/out.log"))"
63
+
64
+ # --- AC3: it does NOT die with the raw, opaque git error under set -e ---
65
+ grep -qi "not a git repository\|must be run in a work tree" "$TMP/out.log" \
66
+ && fail "AC3: leaked raw git error instead of the honest marker (got: $(cat "$TMP/out.log"))" \
67
+ || pass "AC3: no raw/opaque git error leaked"
68
+
69
+ # --- AC4: a real bare-repo workspace still works (guard is not over-broad) ---
70
+ BARE="$TMP/local.git"
71
+ git init --bare -b main "$BARE" >/dev/null
72
+ SEED="$TMP/seed"
73
+ git clone "$BARE" "$SEED" >/dev/null 2>&1
74
+ ( cd "$SEED" && git -c user.email=t@t -c user.name=t commit --allow-empty -m seed >/dev/null && git push origin main >/dev/null 2>&1 )
75
+ rm -rf "$SEED"
76
+ (
77
+ cd "$BARE"
78
+ bash "$WM" --yes create feat-ok
79
+ ) >"$TMP/out.ok.log" 2>&1 \
80
+ && pass "AC4: create still succeeds in a valid bare repo" \
81
+ || fail "AC4: create regressed in a valid bare repo (output: $(cat "$TMP/out.ok.log"))"
82
+
83
+ echo
84
+ echo "=== Results ==="
85
+ echo "PASS: $PASS"
86
+ echo "FAIL: $FAIL"
87
+ [[ "$FAIL" -eq 0 ]] || exit 1
88
+ exit 0
@@ -0,0 +1,379 @@
1
+ #!/usr/bin/env bash
2
+ # #7102 — the orphan reaper must not report a cleanup it did not perform.
3
+ #
4
+ # `cleanup_orphan_worktree_dirs` ran `rm -rf` without checking the exit
5
+ # status and incremented `orphans_cleaned` unconditionally, so a directory it
6
+ # could not remove was still counted, still announced per-directory, and still
7
+ # folded into the "Cleaned N orphan directory(ies)" summary. The trigger is
8
+ # ordinary: the local Supabase stack bind-mounts as root and leaves
9
+ # root:root dirs inside an otherwise user-owned worktree, which an unprivileged
10
+ # `rm` cannot unlink. The class recurs for any worktree that ever started it.
11
+ #
12
+ # A third defect sits one line below the reported one: the function's last
13
+ # statement was `[[ "$verbose" == "true" ]] && echo …`, so a SUCCESSFUL clean at
14
+ # the default verbose=false returned rc=1 — and both call sites are bare inside
15
+ # `cleanup_merged_worktrees` under `set -e`, silently skipping the tmp reapers.
16
+ #
17
+ # Review additionally surfaced three destructive/observability defects covered
18
+ # here: a `.git` DIRECTORY (a nested full clone) read as "definitely orphaned"
19
+ # and destroyed; a swallowed `git worktree list` failure emptying the registry
20
+ # so every directory reads as unregistered; and an unsanitized directory name
21
+ # interpolated into a line-oriented telemetry sink.
22
+ #
23
+ # Plan: knowledge-base/project/plans/archive/20261013-041741-2026-07-31-fix-honest-failure-reporting-hook-timeout-and-orphan-reaper-plan.md
24
+ #
25
+ # Run via: bash plugins/soleur/skills/git-worktree/test/orphan-reaper-honest-count.test.sh
26
+
27
+ set -uo pipefail
28
+
29
+ # Git-location tripwire (#7833). These suites drive worktree-manager.sh, which runs
30
+ # `git worktree remove`, `git branch -D` and `git reset --hard` -- the highest-damage git writes
31
+ # in the corpus. An inherited GIT_DIR aims all of them at the developer's real repository, so
32
+ # this file aborts rather than proceeding. Inline rather than sourcing test-helpers.sh, which
33
+ # would also import an assertion framework these suites do not use.
34
+ for _v in GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE GIT_COMMON_DIR GIT_OBJECT_DIRECTORY \
35
+ GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_NAMESPACE GIT_TEMPLATE_DIR GIT_EXEC_PATH; do
36
+ if [[ -n "${!_v:-}" && "${SOLEUR_GIT_TRIPWIRE_ALLOW:-0}" != "1" ]]; then
37
+ printf 'FATAL: %s started with an inherited git-location environment (%s=%s).\n' \
38
+ "${BASH_SOURCE[0]}" "$_v" "${!_v}" >&2
39
+ printf 'Fix the ENTRY POINT: unset %s && <runner>\n' "$_v" >&2
40
+ exit 97
41
+ fi
42
+ done
43
+ unset _v
44
+
45
+ REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../../.." && pwd)"
46
+ WM="$REPO_ROOT/plugins/soleur/skills/git-worktree/scripts/worktree-manager.sh"
47
+
48
+ PASS=0; FAIL=0
49
+ fail() { echo " FAIL: $1"; FAIL=$((FAIL+1)); }
50
+ pass() { echo " pass: $1"; PASS=$((PASS+1)); }
51
+
52
+ # Every assertion below must run for the suite to mean anything. A preflight
53
+ # SKIP exits 77 (autotools convention) BEFORE this point, so a skip is
54
+ # distinguishable from a pass. EXACT equality, not a floor: a floor with slack
55
+ # only fires once that many assertions vanish, and it drifts by hand anyway
56
+ # (each added assertion bumps it), so it costs the same maintenance for strictly
57
+ # less power. Counting PASS+FAIL rather than PASS means a FAILING assertion
58
+ # still counts as coverage, so this gate and the pass/fail gate stay orthogonal.
59
+ EXPECTED_ASSERTIONS=41
60
+
61
+ # Case 2 leaves a `chmod 500` directory behind, which defeats a plain
62
+ # `rm -rf "$TMP"` cleanup exactly as it defeats the reaper. Restore write
63
+ # permission at the top of the trap or the suite litters TMPDIR every run.
64
+ TMP=$(mktemp -d)
65
+ trap 'chmod -R u+rwX "$TMP" 2>/dev/null; rm -rf "$TMP"' EXIT
66
+
67
+ # --- Preflight: root ignores permission bits, so the unremovable fixture
68
+ # cannot be constructed and the failure cases would pass vacuously. Exit 77,
69
+ # not 0 — a skip that exits 0 is indistinguishable from a full green run. ---
70
+ if [[ $EUID -eq 0 ]]; then
71
+ echo "SKIP: running as root — the chmod 500 unremovable fixture cannot be built"
72
+ exit 77
73
+ fi
74
+
75
+ # --- Preflight: the sentinel maps GNU `rm` strerror text to an errno label.
76
+ # On a non-GNU host the label would be OTHER and the errno assertion is
77
+ # meaningless. Probe the real thing rather than guessing from `uname`. ---
78
+ probe="$TMP/.probe"; mkdir -p "$probe/inner"; : > "$probe/inner/f"; chmod 500 "$probe/inner"
79
+ probe_err=$(LC_ALL=C rm -rf -- "$probe" 2>&1 >/dev/null)
80
+ chmod -R u+rwX "$probe" 2>/dev/null; rm -rf "$probe"
81
+ if [[ "$probe_err" != *"Permission denied"* ]]; then
82
+ echo "SKIP: non-GNU \`rm\` strerror (got: ${probe_err:-<empty>}) — errno mapping not assertable"
83
+ exit 77
84
+ fi
85
+
86
+ # --- Stand up a real repo so `git worktree list --porcelain` returns a real
87
+ # registered path (the reaper's allowlist). Mirrors the sibling suites. ---
88
+ UPSTREAM="$TMP/upstream.git"
89
+ git init --bare -b main "$UPSTREAM" >/dev/null
90
+ SEED="$TMP/seed"
91
+ git clone "$UPSTREAM" "$SEED" >/dev/null 2>&1
92
+ ( cd "$SEED" && git -c user.email=t@t -c user.name=t commit --allow-empty -m seed >/dev/null \
93
+ && git push origin main >/dev/null 2>&1 )
94
+ rm -rf "$SEED"
95
+
96
+ LOCAL="$TMP/local.git"
97
+ git init --bare -b main "$LOCAL" >/dev/null
98
+ ( cd "$LOCAL" && git remote add origin "$UPSTREAM" && git fetch --no-tags origin main:main >/dev/null 2>&1 )
99
+
100
+ cd "$LOCAL" || exit 1
101
+ # shellcheck source=/dev/null
102
+ source "$WM"
103
+ set +e
104
+
105
+ strip_ansi() { sed -e 's/\x1b\[[0-9;]*m//g'; }
106
+ count_dirs() { find "$1" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l | tr -d ' '; }
107
+
108
+ # Parse the reaper's own success summary. Returns the integer it CLAIMS to have
109
+ # cleaned, or "none" when no summary was printed. Only meaningful at
110
+ # verbose=true — the success summary is verbose-gated by design.
111
+ claimed_count() { grep -oE 'Cleaned [0-9]+ orphan' <<<"$1" | grep -oE '[0-9]+' || echo "none"; }
112
+
113
+ mk_stuck() { mkdir -p "$1/inner"; : > "$1/inner/f"; chmod 500 "$1/inner"; }
114
+
115
+ # ---------------------------------------------------------------------------
116
+ # Case 1 — the happy path still discriminates correctly.
117
+ # ---------------------------------------------------------------------------
118
+ echo "Case 1: discriminates orphan vs registered vs has-.git"
119
+ WORKTREE_DIR="$TMP/wt1"; mkdir -p "$WORKTREE_DIR"
120
+ mkdir -p "$WORKTREE_DIR/plain-orphan/nested"; : > "$WORKTREE_DIR/plain-orphan/nested/f"
121
+ git -C "$LOCAL" worktree add "$WORKTREE_DIR/registered" -b c1 main >/dev/null 2>&1
122
+ mkdir -p "$WORKTREE_DIR/has-git-file"; echo "gitdir: /nowhere" > "$WORKTREE_DIR/has-git-file/.git"
123
+ # A nested FULL clone has a `.git` DIRECTORY, not a file. A `-f` test reads that
124
+ # as "definitely orphaned" and destroys the clone along with any uncommitted
125
+ # work in it — and the honest-reporting fix would then faithfully announce the
126
+ # destruction, which is worse than the silent version.
127
+ git clone "$UPSTREAM" "$WORKTREE_DIR/nested-clone" >/dev/null 2>&1
128
+ : > "$WORKTREE_DIR/nested-clone/uncommitted-work.txt"
129
+ # A BARE repo has NO `.git` entry at all -- it IS the git dir -- so every
130
+ # `.git`-based test (including `-e`) reads it as orphaned and reaps its refs
131
+ # and objects. Verified destroyed before the positive bare-layout guard landed.
132
+ git init --bare -b main "$WORKTREE_DIR/parked-bare.git" >/dev/null 2>&1
133
+ : > "$WORKTREE_DIR/parked-bare.git/PRECIOUS-REFS"
134
+
135
+ out1=$(cleanup_orphan_worktree_dirs true 2>&1 | strip_ansi)
136
+
137
+ [[ "$(claimed_count "$out1")" == "1" ]] \
138
+ && pass "claims exactly 1 cleaned" \
139
+ || fail "claims $(claimed_count "$out1") cleaned, expected 1"
140
+ [[ ! -d "$WORKTREE_DIR/plain-orphan" ]] \
141
+ && pass "plain orphan removed" \
142
+ || fail "plain orphan survived"
143
+ [[ -d "$WORKTREE_DIR/registered" ]] \
144
+ && pass "registered worktree preserved" \
145
+ || fail "registered worktree was destroyed"
146
+ [[ -d "$WORKTREE_DIR/has-git-file" ]] \
147
+ && pass "orphan with .git file preserved" \
148
+ || fail "orphan with .git file was destroyed"
149
+ [[ -f "$WORKTREE_DIR/nested-clone/uncommitted-work.txt" ]] \
150
+ && pass "nested clone (.git DIRECTORY) preserved with its uncommitted work" \
151
+ || fail "nested clone was DESTROYED — a .git directory must not read as orphaned"
152
+ [[ -f "$WORKTREE_DIR/parked-bare.git/PRECIOUS-REFS" ]] \
153
+ && pass "bare repository preserved (no .git entry is not the same as orphaned)" \
154
+ || fail "bare repository was DESTROYED — its refs and objects are unrecoverable"
155
+
156
+ # ---------------------------------------------------------------------------
157
+ # Case 2 — an UNREMOVABLE orphan must not be counted or announced.
158
+ # ---------------------------------------------------------------------------
159
+ echo "Case 2: unremovable orphan is reported honestly"
160
+ WORKTREE_DIR="$TMP/wt2"; mkdir -p "$WORKTREE_DIR"; mk_stuck "$WORKTREE_DIR/stuck"
161
+
162
+ out2=$(cleanup_orphan_worktree_dirs false 2>/dev/null | strip_ansi)
163
+ err2=$(cleanup_orphan_worktree_dirs false 2>&1 >/dev/null | strip_ansi)
164
+ # The success summary is verbose-gated, so a verbose=FALSE capture can never
165
+ # contain it — asserting "does not claim" against that stream is unconditionally
166
+ # true and pins nothing. Capture at verbose=TRUE, where the summary WOULD print
167
+ # if the counter were wrong, and assert the value rather than negating one of
168
+ # many possible wrong values.
169
+ outv=$(cleanup_orphan_worktree_dirs true 2>/dev/null | strip_ansi)
170
+
171
+ [[ -d "$WORKTREE_DIR/stuck" ]] \
172
+ && pass "unremovable dir survives (fixture is valid)" \
173
+ || fail "fixture invalid — dir was removed, cannot test the failure path"
174
+ [[ "$(claimed_count "$outv")" == "none" ]] \
175
+ && pass "prints no success summary at verbose=true when nothing was cleaned" \
176
+ || fail "claimed $(claimed_count "$outv") cleaned while the directory is still on disk"
177
+ grep -q 'SOLEUR_ORPHAN_UNREMOVABLE' <<<"$out2" \
178
+ && pass "emits SOLEUR_ORPHAN_UNREMOVABLE sentinel on stdout" \
179
+ || fail "no SOLEUR_ORPHAN_UNREMOVABLE sentinel on stdout"
180
+ grep -q 'errno=EACCES' <<<"$out2" \
181
+ && pass "sentinel carries errno=EACCES" \
182
+ || fail "sentinel missing errno=EACCES"
183
+ grep -q 'reason=rm-partial' <<<"$out2" \
184
+ && pass "sentinel uses reason=rm-partial (rm -rf deletes what it can first)" \
185
+ || fail "sentinel missing reason=rm-partial"
186
+ # The success counter must be readable at the DEFAULT verbosity. Nothing else
187
+ # reads it there (the success summary is verbose-gated), so without this the
188
+ # counter can be corrupted on the default path undetectably.
189
+ grep -q 'cleaned=0' <<<"$out2" \
190
+ && pass "sentinel reports cleaned=0 when nothing was removed (counter honest at verbose=false)" \
191
+ || fail "sentinel did not report cleaned=0: $(grep -oE 'cleaned=[0-9]+' <<<"$out2")"
192
+ grep -qE 'Could not remove [0-9]+ orphan directory' <<<"$err2" \
193
+ && pass "failure summary prints on stderr at verbose=false" \
194
+ || fail "failure summary suppressed at verbose=false (the default path)"
195
+ grep -qF "$WORKTREE_DIR/stuck" <<<"$err2" \
196
+ && pass "failure summary names the surviving directory" \
197
+ || fail "failure summary does not name the surviving directory"
198
+ grep -qF 'SKILL.md' <<<"$err2" \
199
+ && pass "failure summary points at the remediation runbook" \
200
+ || fail "failure summary has no remediation pointer"
201
+ # The remediation must not hand an agent a guardrail-bypassing command. Check
202
+ # BOTH streams — the pointer lives on stderr, the sentinel on stdout.
203
+ grep -q 'docker run' <<<"$out2$err2" \
204
+ && fail "remediation contains a docker run string (bypasses the rm -rf guardrail)" \
205
+ || pass "remediation contains no guardrail-bypassing docker command"
206
+ grep -q "Removed orphan directory: stuck" <<<"$outv" \
207
+ && fail "announces 'Removed orphan directory: stuck' for a dir still on disk" \
208
+ || pass "no per-directory removal line for the surviving dir"
209
+
210
+ # ---------------------------------------------------------------------------
211
+ # Case 3 — counter integrity, with MORE THAN ONE stuck directory so the count,
212
+ # the plural path, the per-directory loop and the array append are all pinned
213
+ # above N=1 (at N=1 a hardcoded "1", a `[0]`-only loop and a clobbering
214
+ # assignment are all indistinguishable from correct).
215
+ # ---------------------------------------------------------------------------
216
+ echo "Case 3: claimed count equals the find-verified delta, with N>1 failures"
217
+ WORKTREE_DIR="$TMP/wt3"; mkdir -p "$WORKTREE_DIR"
218
+ mkdir -p "$WORKTREE_DIR/gone-a" "$WORKTREE_DIR/gone-b"
219
+ mk_stuck "$WORKTREE_DIR/stuck3a"; mk_stuck "$WORKTREE_DIR/stuck3b"
220
+
221
+ before3=$(count_dirs "$WORKTREE_DIR")
222
+ # One invocation, both streams: a second call would run against the leftovers
223
+ # (gone-a/gone-b already reaped) and report cleaned=0.
224
+ cleanup_orphan_worktree_dirs true >"$TMP/o3.raw" 2>"$TMP/e3.raw"
225
+ out3=$(strip_ansi <"$TMP/o3.raw"); err3=$(strip_ansi <"$TMP/e3.raw")
226
+ after3=$(count_dirs "$WORKTREE_DIR")
227
+ delta3=$(( before3 - after3 ))
228
+ claim3=$(claimed_count "$out3")
229
+
230
+ [[ "$delta3" == "2" ]] \
231
+ && pass "two removable orphans actually removed" \
232
+ || fail "expected delta 2, observed $delta3"
233
+ [[ "$claim3" == "$delta3" ]] \
234
+ && pass "claimed $claim3 == observed delta $delta3" \
235
+ || fail "claimed $claim3 but only $delta3 directories actually disappeared"
236
+ grep -qE 'Could not remove 2 orphan directory' <<<"$err3" \
237
+ && pass "failure summary reports exactly 2 (count is not hardcoded)" \
238
+ || fail "failure summary did not report 2: $(grep -oE 'Could not remove [0-9]+' <<<"$err3")"
239
+ grep -qF "stuck3a" <<<"$err3" && grep -qF "stuck3b" <<<"$err3" \
240
+ && pass "failure summary names BOTH stuck directories (loop is not [0]-only)" \
241
+ || fail "failure summary omitted one of the two stuck directories"
242
+ grep -qE 'SOLEUR_ORPHAN_UNREMOVABLE count=2' <<<"$out3" \
243
+ && pass "sentinel aggregates with count=2" \
244
+ || fail "sentinel did not report count=2"
245
+ grep -q 'cleaned=2' <<<"$out3" \
246
+ && pass "sentinel reports cleaned=2 in a mixed run (success counter honest alongside failures)" \
247
+ || fail "sentinel did not report cleaned=2: $(grep -oE 'cleaned=[0-9]+' <<<"$out3")"
248
+ # One aggregate marker per invocation, never one per directory: the marker
249
+ # extractor keeps a fixed budget per tool_response and STOPS at the cap, so an
250
+ # unbounded per-directory producer would crowd out the paging wedge markers.
251
+ [[ "$(grep -c 'SOLEUR_ORPHAN_UNREMOVABLE' <<<"$out3")" == "1" ]] \
252
+ && pass "emits exactly ONE aggregate marker for 2 failures (bounded producer)" \
253
+ || fail "emitted $(grep -c 'SOLEUR_ORPHAN_UNREMOVABLE' <<<"$out3") markers; must be 1"
254
+
255
+ # ---------------------------------------------------------------------------
256
+ # Case 4 — the function must return 0 on every path.
257
+ # ---------------------------------------------------------------------------
258
+ echo "Case 4: returns 0 on every path (defect 3)"
259
+ WORKTREE_DIR="$TMP/wt4a"; mkdir -p "$WORKTREE_DIR/orphan-a"
260
+ cleanup_orphan_worktree_dirs false >/dev/null 2>&1; rc4a=$?
261
+ [[ "$rc4a" -eq 0 ]] \
262
+ && pass "rc=0 for (cleaned>=1, verbose=false)" \
263
+ || fail "rc=$rc4a for (cleaned>=1, verbose=false) — aborts its caller under set -e"
264
+
265
+ WORKTREE_DIR="$TMP/wt4b"; mkdir -p "$WORKTREE_DIR/orphan-b"
266
+ cleanup_orphan_worktree_dirs true >/dev/null 2>&1; rc4b=$?
267
+ [[ "$rc4b" -eq 0 ]] \
268
+ && pass "rc=0 for (cleaned>=1, verbose=true)" \
269
+ || fail "rc=$rc4b for (cleaned>=1, verbose=true)"
270
+
271
+ WORKTREE_DIR="$TMP/wt4c"; mkdir -p "$WORKTREE_DIR"; mk_stuck "$WORKTREE_DIR/stuck4"
272
+ cleanup_orphan_worktree_dirs false >/dev/null 2>&1; rc4c=$?
273
+ [[ "$rc4c" -eq 0 ]] \
274
+ && pass "rc=0 for (failed removal, verbose=false)" \
275
+ || fail "rc=$rc4c for (failed removal, verbose=false)"
276
+
277
+ WORKTREE_DIR="$TMP/wt4d"; mkdir -p "$WORKTREE_DIR"
278
+ cleanup_orphan_worktree_dirs false >/dev/null 2>&1; rc4d=$?
279
+ [[ "$rc4d" -eq 0 ]] \
280
+ && pass "rc=0 for (nothing to clean)" \
281
+ || fail "rc=$rc4d for (nothing to clean)"
282
+
283
+ # ---------------------------------------------------------------------------
284
+ # Case 5 — the OTHER direction. Every case above asks "does it report the
285
+ # failure?"; none asks "does it stay quiet when there is none?". Without this,
286
+ # making the failure summary unconditional, or emitting the sentinel on the
287
+ # SUCCESS branch, both pass — and the reaper would cry wolf on every run of the
288
+ # default path that session-start, work Phase 0 and ship Phase 7 all execute.
289
+ # ---------------------------------------------------------------------------
290
+ echo "Case 5: silent on a fully clean run (no false failure surfaces)"
291
+ for v in false true; do
292
+ WORKTREE_DIR="$TMP/wt5-$v"; mkdir -p "$WORKTREE_DIR"/{ok-a,ok-b,ok-c}
293
+ # ONE invocation, both streams captured. The reaper is destructive: a second
294
+ # call runs against an already-emptied directory, so it would assert the
295
+ # nothing-to-do path while claiming to cover the reaped-three path.
296
+ cleanup_orphan_worktree_dirs "$v" >"$TMP/o5.raw" 2>"$TMP/e5.raw"; rc5=$?
297
+ o5=$(strip_ansi <"$TMP/o5.raw"); e5=$(strip_ansi <"$TMP/e5.raw")
298
+ grep -q 'SOLEUR_ORPHAN_UNREMOVABLE' <<<"$o5" \
299
+ && fail "verbose=$v: emitted an UNREMOVABLE sentinel on a clean run" \
300
+ || pass "verbose=$v: no UNREMOVABLE sentinel on a clean run"
301
+ grep -q 'Could not remove' <<<"$e5" \
302
+ && fail "verbose=$v: printed a failure summary on a clean run" \
303
+ || pass "verbose=$v: no failure summary on a clean run"
304
+ # A crash produces silence too, and silence would satisfy both greps above.
305
+ # Pin rc from the SAME invocation so an abort (e.g. an unbound array read
306
+ # under `set -u`) is not mistaken for a clean, quiet run.
307
+ [[ "$rc5" -eq 0 ]] \
308
+ && pass "verbose=$v: clean run returns 0 (silence is not a crash)" \
309
+ || fail "verbose=$v: clean run returned rc=$rc5"
310
+ done
311
+ [[ "$(count_dirs "$TMP/wt5-false")" == "0" ]] \
312
+ && pass "clean run actually removed all three orphans" \
313
+ || fail "clean-run fixture did not reap: $(count_dirs "$TMP/wt5-false") left"
314
+
315
+ # ---------------------------------------------------------------------------
316
+ # Case 6 — the registry must FAIL CLOSED. `git worktree list` can fail wholesale
317
+ # under the sandbox's masked-config wedge; a swallowed failure yields an EMPTY
318
+ # registry, under which every directory reads as unregistered and the reaper
319
+ # deletes the entire tree including live worktrees.
320
+ # ---------------------------------------------------------------------------
321
+ echo "Case 6: fails closed when the worktree registry is unavailable"
322
+ WORKTREE_DIR="$TMP/wt6"; mkdir -p "$WORKTREE_DIR/precious/nested"
323
+ : > "$WORKTREE_DIR/precious/nested/data.txt"
324
+ # Make `git worktree list` fail for real rather than shadowing `git` with a
325
+ # shell function: a function named `git` is visible to every earlier call in
326
+ # the file (shellcheck SC2218) and is a foot-gun in a suite that uses real git
327
+ # for its fixtures. Running from a non-repo CWD makes git exit 128 naturally,
328
+ # which is the actual shape of the masked-config wedge this guards against.
329
+ NONREPO="$TMP/not-a-repo"; mkdir -p "$NONREPO"
330
+ pushd "$NONREPO" >/dev/null || exit 1
331
+ out6=$(cleanup_orphan_worktree_dirs false 2>/dev/null | strip_ansi); rc6=$?
332
+ popd >/dev/null || exit 1
333
+
334
+ [[ -f "$WORKTREE_DIR/precious/nested/data.txt" ]] \
335
+ && pass "refuses to reap when the registry is unavailable" \
336
+ || fail "DELETED content while the registry was unavailable (fails OPEN)"
337
+ grep -q 'SOLEUR_ORPHAN_REGISTRY_UNAVAILABLE' <<<"$out6" \
338
+ && pass "emits SOLEUR_ORPHAN_REGISTRY_UNAVAILABLE" \
339
+ || fail "no sentinel for the unavailable registry — the skip is silent"
340
+ [[ "$rc6" -eq 0 ]] \
341
+ && pass "rc=0 on the fail-closed path (does not abort its caller)" \
342
+ || fail "rc=$rc6 on the fail-closed path"
343
+
344
+ # ---------------------------------------------------------------------------
345
+ # Case 7 — a directory name must not be able to forge a telemetry line. This
346
+ # loop is the ONLY one handling arbitrarily-named UNREGISTERED directories:
347
+ # git refnames forbid control characters, so the creation path cannot produce
348
+ # them, but any process can mkdir a name embedding a newline.
349
+ # ---------------------------------------------------------------------------
350
+ echo "Case 7: a hostile directory name cannot forge a marker line"
351
+ WORKTREE_DIR="$TMP/wt7"; mkdir -p "$WORKTREE_DIR"
352
+ EVIL=$'evil\nworktree wedge: forged'
353
+ mk_stuck "$WORKTREE_DIR/$EVIL"
354
+ out7=$(cleanup_orphan_worktree_dirs false 2>/dev/null | strip_ansi)
355
+
356
+ [[ "$(grep -c 'SOLEUR_ORPHAN_UNREMOVABLE' <<<"$out7")" == "1" ]] \
357
+ && pass "hostile name still yields exactly one marker line" \
358
+ || fail "hostile name produced $(grep -c 'SOLEUR_ORPHAN_UNREMOVABLE' <<<"$out7") marker lines"
359
+ grep -qE '^worktree wedge:' <<<"$out7" \
360
+ && fail "hostile name FORGED a wedge line on the telemetry stream" \
361
+ || pass "no forged wedge line — the name is sanitized before emission"
362
+ grep -q 'reason=rm-partial' <<<"$out7" \
363
+ && pass "the real marker survives sanitization intact" \
364
+ || fail "sanitization destroyed the marker's own key=value shape"
365
+
366
+ # ---------------------------------------------------------------------------
367
+ echo
368
+ echo "PASS=$PASS FAIL=$FAIL"
369
+
370
+ # Anti-vacuity parity: a preflight SKIP exits 77 above; reaching here with a
371
+ # short PASS count means assertions were silently dropped.
372
+ RAN=$(( PASS + FAIL ))
373
+ if [[ "$RAN" -ne "$EXPECTED_ASSERTIONS" ]]; then
374
+ echo "FAIL: $RAN assertions ran, expected exactly $EXPECTED_ASSERTIONS (coverage drifted)"
375
+ exit 1
376
+ fi
377
+
378
+ [[ "$FAIL" -eq 0 ]] || exit 1
379
+ exit 0