@soleur/opencode 0.0.0-stage → 3.354.2

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 (832) 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 +660 -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 +29 -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 +361 -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 +171 -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 +818 -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 +411 -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 +509 -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 +115 -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 +165 -0
  247. package/scripts/sync-opencode-adapter.ts +498 -0
  248. package/scripts/sync-pr-behind.sh +647 -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 +67 -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 +143 -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 +120 -0
  493. package/skills/fix-issue/references/exclude-label-jq-snippet.md +97 -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 +670 -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 +331 -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 +141 -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 +1620 -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-evidence-comment.md +36 -0
  674. package/skills/review/references/review-todo-structure.md +165 -0
  675. package/skills/review/references/risk-tier-and-fix-rounds.md +97 -0
  676. package/skills/review/references/semgrep-custom-rules.yaml +174 -0
  677. package/skills/review/references/ultrathink-phases.md +98 -0
  678. package/skills/review/references/wfs.md +6 -0
  679. package/skills/review/scripts/emit-review-trailer.sh +499 -0
  680. package/skills/review/scripts/ensure-semgrep.sh +99 -0
  681. package/skills/review/scripts/fix-round-seats.sh +197 -0
  682. package/skills/review/test/emit-review-trailer.test.sh +387 -0
  683. package/skills/review/test/ensure-semgrep.test.sh +111 -0
  684. package/skills/review/test/fix-round-seats.test.sh +237 -0
  685. package/skills/review/workflows/README.md +147 -0
  686. package/skills/review/workflows/review.workflow.js +667 -0
  687. package/skills/schedule/SKILL.md +796 -0
  688. package/skills/seo-aeo/SKILL.md +139 -0
  689. package/skills/seo-aeo/scripts/validate-csp.sh +233 -0
  690. package/skills/seo-aeo/scripts/validate-seo.sh +262 -0
  691. package/skills/ship/SKILL.md +3023 -0
  692. package/skills/ship/references/adr-ordinal-collision.md +47 -0
  693. package/skills/ship/references/affected-gate-contract.md +115 -0
  694. package/skills/ship/references/ci-run-diagnosis.md +29 -0
  695. package/skills/ship/references/ci-workflow-authoring.md +68 -0
  696. package/skills/ship/references/cleanup-merged-archival.md +39 -0
  697. package/skills/ship/references/counsel-review-clo-attestation.md +38 -0
  698. package/skills/ship/references/cto-ruling-armed-push.md +5 -0
  699. package/skills/ship/references/decision-challenges-render.md +71 -0
  700. package/skills/ship/references/delegated-act-authoring-form.md +7 -0
  701. package/skills/ship/references/detached-battery-verdict.md +13 -0
  702. package/skills/ship/references/epic-close-sweep.md +62 -0
  703. package/skills/ship/references/feature-tweet-draft.md +42 -0
  704. package/skills/ship/references/followthrough-issue-body-template.md +47 -0
  705. package/skills/ship/references/followthrough-stub-template.sh +92 -0
  706. package/skills/ship/references/merge-queue-dequeue.md +39 -0
  707. package/skills/ship/references/operator-holds.md +179 -0
  708. package/skills/ship/references/pipeline-tally-render.md +43 -0
  709. package/skills/ship/references/pr-overlap.md +153 -0
  710. package/skills/ship/references/queue-mode.md +7 -0
  711. package/skills/ship/references/ready-run-wait.md +36 -0
  712. package/skills/ship/references/red-on-main-quarantine.md +110 -0
  713. package/skills/ship/references/register-update-pr-pattern.md +88 -0
  714. package/skills/ship/references/settle-then-admin-merge.md +130 -0
  715. package/skills/ship/references/supabase-column-probe.md +13 -0
  716. package/skills/ship/scripts/auto-close-scan.sh +76 -0
  717. package/skills/ship/scripts/battery-owed.sh +403 -0
  718. package/skills/ship/scripts/hold-gate-eval.sh +410 -0
  719. package/skills/ship/scripts/net-issue-flow.sh +665 -0
  720. package/skills/ship/scripts/pr-overlap-preflight.sh +483 -0
  721. package/skills/ship/scripts/ship-pir-action-items-gate.sh +246 -0
  722. package/skills/ship/scripts/technical-ruling-gate.sh +444 -0
  723. package/skills/skill-creator/SKILL.md +299 -0
  724. package/skills/skill-creator/references/api-security.md +248 -0
  725. package/skills/skill-creator/references/authoring-levers.md +110 -0
  726. package/skills/skill-creator/references/be-clear-and-direct.md +587 -0
  727. package/skills/skill-creator/references/best-practices.md +431 -0
  728. package/skills/skill-creator/references/common-patterns.md +639 -0
  729. package/skills/skill-creator/references/core-principles.md +193 -0
  730. package/skills/skill-creator/references/executable-code.md +188 -0
  731. package/skills/skill-creator/references/iteration-and-testing.md +509 -0
  732. package/skills/skill-creator/references/official-spec.md +193 -0
  733. package/skills/skill-creator/references/recommended-structure.md +180 -0
  734. package/skills/skill-creator/references/skill-structure.md +396 -0
  735. package/skills/skill-creator/references/using-scripts.md +122 -0
  736. package/skills/skill-creator/references/using-templates.md +120 -0
  737. package/skills/skill-creator/references/workflows-and-validation.md +541 -0
  738. package/skills/skill-creator/scripts/init_skill.py +322 -0
  739. package/skills/skill-creator/scripts/package_skill.py +110 -0
  740. package/skills/skill-creator/scripts/quick_validate.py +64 -0
  741. package/skills/skill-creator/templates/router-skill.md +73 -0
  742. package/skills/skill-creator/templates/simple-skill.md +34 -0
  743. package/skills/skill-creator/workflows/add-reference.md +96 -0
  744. package/skills/skill-creator/workflows/add-script.md +104 -0
  745. package/skills/skill-creator/workflows/add-template.md +83 -0
  746. package/skills/skill-creator/workflows/add-workflow.md +128 -0
  747. package/skills/skill-creator/workflows/audit-skill.md +159 -0
  748. package/skills/skill-creator/workflows/create-domain-expertise-skill.md +623 -0
  749. package/skills/skill-creator/workflows/create-new-skill.md +207 -0
  750. package/skills/skill-creator/workflows/get-guidance.md +134 -0
  751. package/skills/skill-creator/workflows/upgrade-to-router.md +170 -0
  752. package/skills/skill-creator/workflows/verify-skill.md +226 -0
  753. package/skills/skill-security-scan/SKILL.md +145 -0
  754. package/skills/skill-security-scan/references/disclaimer.md +21 -0
  755. package/skills/skill-security-scan/references/first-party-allowlist.yaml +38 -0
  756. package/skills/skill-security-scan/references/override-artifact-schema.json +68 -0
  757. package/skills/skill-security-scan/references/override-mechanism.md +171 -0
  758. package/skills/skill-security-scan/references/redirect-domains.yaml +27 -0
  759. package/skills/skill-security-scan/references/regex-patterns.md +136 -0
  760. package/skills/skill-security-scan/references/rules/code-exec.yaml +70 -0
  761. package/skills/skill-security-scan/references/rules/filesystem-boundary.yaml +29 -0
  762. package/skills/skill-security-scan/references/rules/manifest.yaml +44 -0
  763. package/skills/skill-security-scan/references/rules/supply-chain.yaml +36 -0
  764. package/skills/skill-security-scan/references/scan-meta-schema.json +63 -0
  765. package/skills/skill-security-scan/references/test-fixtures/clean-soleur-style.skill.md +23 -0
  766. package/skills/skill-security-scan/references/test-fixtures/clean-third-party.skill.md +26 -0
  767. package/skills/skill-security-scan/references/test-fixtures/malicious-codeexec.skill.md +23 -0
  768. package/skills/skill-security-scan/references/test-fixtures/malicious-curl-pipe-bash.skill.md +69 -0
  769. package/skills/skill-security-scan/references/test-fixtures/malicious-prompt-injection.skill.md +17 -0
  770. package/skills/skill-security-scan/references/test-fixtures/malicious-telemetry-beacon.skill.md +23 -0
  771. package/skills/skill-security-scan/references/typosquat-targets.yaml +65 -0
  772. package/skills/skill-security-scan/scripts/check-codeexec.sh +41 -0
  773. package/skills/skill-security-scan/scripts/check-filesystem-boundary.sh +19 -0
  774. package/skills/skill-security-scan/scripts/check-prompt-injection.sh +95 -0
  775. package/skills/skill-security-scan/scripts/check-supply-chain.sh +219 -0
  776. package/skills/skill-security-scan/scripts/check-telemetry-surface.sh +126 -0
  777. package/skills/skill-security-scan/scripts/lib.sh +197 -0
  778. package/skills/skill-security-scan/scripts/parse-override.sh +231 -0
  779. package/skills/skill-security-scan/scripts/run-scan.sh +342 -0
  780. package/skills/skill-security-scan/scripts/run-self-test.sh +95 -0
  781. package/skills/skill-security-scan/test/argv-ceiling.test.sh +180 -0
  782. package/skills/skill-security-scan/test/meta-dir-reap.test.sh +411 -0
  783. package/skills/skill-security-scan/test/parse-override.test.sh +607 -0
  784. package/skills/skill-security-scan/test/redact-pii-ghs-shape.test.sh +251 -0
  785. package/skills/social-distribute/SKILL.md +485 -0
  786. package/skills/spec-templates/SKILL.md +274 -0
  787. package/skills/sync/SKILL.md +49 -0
  788. package/skills/test-browser/SKILL.md +464 -0
  789. package/skills/test-browser/references/feature-map.md +161 -0
  790. package/skills/test-fix-loop/SKILL.md +159 -0
  791. package/skills/test-fix-loop/references/determinism-checklist.md +154 -0
  792. package/skills/triage/SKILL.md +402 -0
  793. package/skills/trigger-cron/SKILL.md +136 -0
  794. package/skills/trigger-cron/scripts/trigger.sh +198 -0
  795. package/skills/user-set-role/SKILL.md +147 -0
  796. package/skills/user-set-role/scripts/set-role.sh +218 -0
  797. package/skills/user-story-writer/SKILL.md +77 -0
  798. package/skills/ux-audit/SKILL.md +251 -0
  799. package/skills/ux-audit/references/finding.schema.json +62 -0
  800. package/skills/ux-audit/references/route-list.yaml +95 -0
  801. package/skills/ux-audit/scripts/bot-fixture.ts +270 -0
  802. package/skills/ux-audit/scripts/bot-signin.ts +135 -0
  803. package/skills/ux-audit/scripts/dedup-hash.ts +46 -0
  804. package/skills/verification-scaffold/SKILL.md +73 -0
  805. package/skills/verification-scaffold/references/gitleaks.toml.template +13 -0
  806. package/skills/verification-scaffold/references/guardrail-audit.md +156 -0
  807. package/skills/verification-scaffold/references/guards/block-stash-hook.sh.template +72 -0
  808. package/skills/verification-scaffold/references/guards/commit-on-main-hook.sh.template +82 -0
  809. package/skills/verification-scaffold/references/guards/orphan-test-check.sh.template +102 -0
  810. package/skills/verification-scaffold/references/guards/precommit-guard.sh.template +115 -0
  811. package/skills/verification-scaffold/references/guards/secret-scan-hook.sh.template +176 -0
  812. package/skills/verification-scaffold/references/guards/verification-gates.yml.template +49 -0
  813. package/skills/verification-scaffold/references/guards/wrapper-boundary.sh.template +47 -0
  814. package/skills/verification-scaffold/references/guards.tsv +21 -0
  815. package/skills/verification-scaffold/references/verification-readme.template +55 -0
  816. package/skills/verification-scaffold/scripts/verification-scaffold.sh +785 -0
  817. package/skills/verification-scaffold/test/bite-proof.test.sh +159 -0
  818. package/skills/verification-scaffold/test/generator.test.sh +319 -0
  819. package/skills/verification-scaffold/test/manifest.test.sh +144 -0
  820. package/skills/work/SKILL.md +1480 -0
  821. package/skills/work/references/end-of-work-resume.md +7 -0
  822. package/skills/work/references/hook-test-main-cwd.md +24 -0
  823. package/skills/work/references/key-principles.md +83 -0
  824. package/skills/work/references/property-testing.md +122 -0
  825. package/skills/work/references/sql-security-definer-rpc-scaffold.sql +78 -0
  826. package/skills/work/references/work-agent-teams.md +97 -0
  827. package/skills/work/references/work-lifecycle-parallel.md +147 -0
  828. package/skills/work/references/work-lockfile-bumps.md +97 -0
  829. package/skills/work/references/work-scratch-sandboxes.md +212 -0
  830. package/skills/work/references/work-subagent-fanout.md +61 -0
  831. package/skills/work/references/work-test-harness-sharp-edges.md +73 -0
  832. package/skills/xcode-test/SKILL.md +360 -0
@@ -0,0 +1,483 @@
1
+ #!/usr/bin/env bash
2
+ # pr-overlap-preflight.sh -- before work starts and before a merge is armed, list the OTHER open
3
+ # changes on this repository that overlap with this one. READ-ONLY: it never comments on, edits,
4
+ # closes or pushes to anyone's change (a skill never edits another session's change).
5
+ #
6
+ # Usage:
7
+ # pr-overlap-preflight.sh [--mode start|merge] [--pr <N>] [--files "<f ...>"] [--vehicle <N>|this]
8
+ #
9
+ # --mode start (default; no change needs to exist yet) or merge (a change must exist and the
10
+ # starting point must be readable, otherwise exit 2)
11
+ # --pr this change's number (default: read from `gh pr view`)
12
+ # --files the files this change touches, space-separated (default: git diff --no-renames
13
+ # --name-only origin/main...HEAD)
14
+ # --vehicle the change a CTO ruling designated to carry the work. Taken from this flag ONLY, never
15
+ # parsed out of prose. `this` means THIS change is the vehicle (usable before a change
16
+ # exists).
17
+ #
18
+ # An "overlap" is an open change that (a) edits a file in the set, or (b) carries a change with the
19
+ # same title as one of ours (generic titles such as `chore: initialize ...`, `WIP ...`, merge commits
20
+ # and titles under 20 characters are ignored). Generated files (lockfiles, suite timing tables,
21
+ # *.likec4.json, rule-body-hashes.txt, *.baseline.txt) never count as shared files.
22
+ #
23
+ # A DUPLICATE is an overlap where the other change makes the identical edit (equal per-file patch
24
+ # identity) on ALL of our changed files, or on at least two of them; or carries the same title. One
25
+ # identical hunk in one of several shared files is not a duplicate.
26
+ #
27
+ # Who can stop a merge: only a change whose author is OWNER, MEMBER or COLLABORATOR of the repository
28
+ # (GitHub's author_association, read from the REST list of open pulls) can produce exit 10 or 12. A
29
+ # change from anyone else is listed for information (exit 13) and costs no history or diff reads.
30
+ #
31
+ # Exit codes (graduated: only a duplicate or a designated vehicle stops a merge):
32
+ # 0 clear: nothing overlaps
33
+ # 10 overlap and the designated vehicle is the OTHER (team) change: this one carves out
34
+ # 11 overlap and THIS change is the vehicle: the others carve out (informational)
35
+ # 12 a duplicate (same edit or same title) by a team author and no vehicle designated: the caller
36
+ # spawns the CTO to designate one and records the ruling (never an operator question)
37
+ # 13 overlap on shared files only, or any overlap by a non-team author, no vehicle: informational,
38
+ # nothing stops
39
+ # 2 could not check, or called wrongly (printed as "I could not check", never as clear)
40
+ #
41
+ # Cost bounds: one list call plus one author read (100 a page); same-title history is read only for
42
+ # team changes that share a file (per_page=100); a diff is downloaded only when the other change's
43
+ # per-file additions/deletions equal ours; at most 20 diffs; the whole run stops comparing after 45
44
+ # seconds (PR_OVERLAP_DEADLINE_SECS overrides, whole seconds, 1 to 999) and says so, with `deadline=hit`
45
+ # on the last line. Without `timeout`/`gtimeout` the clock is checked before every call.
46
+ #
47
+ # Output: a plain-language human block, then ONE last line for the calling agent:
48
+ # SOLEUR_OVERLAP exit=<code> prs=<n,n|none> vehicle=<n|this|none>[ deadline=hit]
49
+ # A change from outside the team is shown as a link only: its title is never printed.
50
+ # Titles are attacker-controllable text on a public repository: they are printed as data (control,
51
+ # format, bidirectional and line-separator characters stripped, change number and conventional-commit
52
+ # prefix removed, 80 characters), never executed and never placed in a question option.
53
+ #
54
+ # `set -uo pipefail`, deliberately NOT `-e`: the scanners are pipelines whose grep exits 1 on no
55
+ # match. Portable to bash 3.2 and mawk (no associative arrays, no mapfile, no ${var,,}, no sed -i).
56
+ # Lines carrying `# mut:<name>` are the mutation points the suite replaces to prove each check can
57
+ # fail.
58
+
59
+ set -uo pipefail
60
+ export LC_ALL=C
61
+
62
+ MODE=start
63
+ PR_ARG=""
64
+ FILES_ARG=""
65
+ FILES_SET=0
66
+ VEHICLE=""
67
+
68
+ PAGE_CAP=100 # mut:paginate
69
+ LIST_CAP=200 # mut:lcap
70
+ DIFF_CAP=20
71
+ DEADLINE_SECS=45
72
+ deadline_ok() { case "${1-}" in '' | *[!0-9]*) return 1 ;; esac; [ "${#1}" -le 3 ] && [ "$((10#$1))" -gt 0 ]; } # mut:envcheck
73
+ if deadline_ok "${PR_OVERLAP_DEADLINE_SECS:-}"; then DEADLINE_SECS=$((10#$PR_OVERLAP_DEADLINE_SECS)); fi
74
+ T0=$SECONDS
75
+ DEADLINE_HIT=0
76
+ TO_BIN=""
77
+ if command -v timeout >/dev/null 2>&1; then TO_BIN=timeout; elif command -v gtimeout >/dev/null 2>&1; then TO_BIN=gtimeout; fi
78
+
79
+ say() { printf '%s\n' "$*"; }
80
+
81
+ over_deadline() { [ $((SECONDS - T0)) -ge "$DEADLINE_SECS" ]; } # mut:deadline
82
+
83
+ finish() { # finish <code> <csv|none>
84
+ local v="${VEHICLE:-none}" tok=""
85
+ [ "$DEADLINE_HIT" -eq 1 ] && tok=" deadline=hit" # mut:dltoken
86
+ if [ -z "$TO_BIN" ]; then
87
+ say "This machine has no time-limit tool, so one slow answer from GitHub cannot be cut off; no call starts after the deadline, and a call already running is waited for."
88
+ fi
89
+ printf 'SOLEUR_OVERLAP exit=%s prs=%s vehicle=%s%s\n' "$1" "${2:-none}" "$v" "$tok"
90
+ exit "$1"
91
+ }
92
+
93
+ cannot_check() { # cannot_check <plain reason> [noretry]
94
+ say "I could not check whether other open work overlaps with this change ($1)."
95
+ say "It was not checked, and that is not a clear result."
96
+ if [ "${2:-}" = noretry ]; then
97
+ say "Next step for me: continue, and say plainly that the overlap check did not run."
98
+ else
99
+ say "Next step for me: retry once, then continue and say plainly that it was not checked."
100
+ fi
101
+ finish 2 none
102
+ }
103
+
104
+ usage_error() { # usage_error <plain reason>
105
+ say "I could not check whether other open work overlaps with this change ($1)."
106
+ say "It was not checked, and that is not a clear result."
107
+ say "Next step for me: correct the way I called the check (pr-overlap.md lists the options) and run it again."
108
+ finish 2 none
109
+ }
110
+
111
+ is_int() { # digits only, 1 to 9 of them
112
+ case "${1-}" in '' | *[!0-9]*) return 1 ;; esac
113
+ [ "${#1}" -le 9 ]
114
+ }
115
+
116
+ # Bound every network call by its own cap and by what is left of the run deadline. Where neither
117
+ # `timeout` nor `gtimeout` exists (a stock macOS) a running call cannot be cut off, so no call is
118
+ # started once the deadline has passed (status 124, as a killed call would give) and the output says
119
+ # so; the callers retry once and then continue with a visible notice.
120
+ bounded() { # bounded <seconds> <cmd...>
121
+ local secs="$1" left
122
+ shift
123
+ if [ -z "$TO_BIN" ] && over_deadline; then return 124; fi # mut:notimeoutguard
124
+ left=$((DEADLINE_SECS - (SECONDS - T0)))
125
+ [ "$left" -lt 1 ] && left=1
126
+ [ "$secs" -gt "$left" ] && secs="$left" # mut:clip
127
+ if [ -n "$TO_BIN" ]; then
128
+ "$TO_BIN" "$secs" "$@"
129
+ else
130
+ "$@"
131
+ fi
132
+ }
133
+
134
+ # ---- arguments -------------------------------------------------------------------------------
135
+ while [ $# -gt 0 ]; do
136
+ case "$1" in
137
+ --mode)
138
+ [ $# -ge 2 ] || usage_error "the request to this check was incomplete"
139
+ case "$2" in
140
+ start | merge) MODE="$2" ;;
141
+ *) usage_error "the request to this check named an unknown mode" ;;
142
+ esac
143
+ shift 2 ;;
144
+ --pr)
145
+ [ $# -ge 2 ] || usage_error "the request to this check was incomplete"
146
+ is_int "$2" || usage_error "the request to this check gave a change number that is not a number"
147
+ PR_ARG="$2"; shift 2 ;;
148
+ --files)
149
+ [ $# -ge 2 ] || usage_error "the request to this check was incomplete"
150
+ FILES_ARG="$2"; FILES_SET=1; shift 2 ;;
151
+ --vehicle)
152
+ [ $# -ge 2 ] || usage_error "the request to this check was incomplete"
153
+ if [ "$2" = this ] || is_int "$2"; then VEHICLE="$2"; else
154
+ usage_error "the request to this check named a vehicle that is not a number"
155
+ fi
156
+ shift 2 ;;
157
+ *) usage_error "the request to this check had an option I do not recognise" ;;
158
+ esac
159
+ done
160
+
161
+ command -v gh >/dev/null 2>&1 || cannot_check "the GitHub tool is not available here" noretry
162
+ command -v jq >/dev/null 2>&1 || cannot_check "a required reading tool is not available here" noretry
163
+ command -v git >/dev/null 2>&1 || cannot_check "git is not available here" noretry
164
+
165
+ WORK="$(mktemp -d "${TMPDIR:-/tmp}/pr-overlap.XXXXXXXX")" || cannot_check "I could not make a scratch folder"
166
+ trap 'rm -rf "$WORK"' EXIT # mut:write
167
+
168
+ # ---- jq helpers -------------------------------------------------------------------------------
169
+ # clean drops control characters, C1 controls, soft hyphen, Arabic letter mark, Mongolian vowel
170
+ # separator, zero-width and directional marks, line and paragraph separators, bidirectional
171
+ # embeddings and isolates, invisible operators, the byte-order mark, interlinear annotation marks and
172
+ # tag characters: everything a stranger could use to hide, reorder or split the text of a title.
173
+ JQ_DEFS='
174
+ def clean: explode | map(select(. >= 32 and . != 127 and (. < 128 or . > 159) and . != 173 and . != 1564 and . != 6158 and (. < 8203 or . > 8207) and (. < 8232 or . > 8238) and (. < 8288 or . > 8297) and . != 65279 and (. < 65529 or . > 65531) and (. < 917504 or . > 917631))) | implode; # mut:clean
175
+ def norm: clean | sub("\\s*\\(#[0-9]+\\)\\s*$";"") | ascii_downcase | gsub("\\s+";" ") | sub("^ +";"") | sub(" +$";""); # mut:norm
176
+ def short: length < 20; # mut:short
177
+ def generic: test("^(chore: initialize|wip(:| |$)|fixup!|squash!|merge )") or . == "chore: record plan-phase session state" or short; # mut:generic
178
+ def disp: clean | sub("\\s*\\(#[0-9]+\\)\\s*$";"") | sub("^[a-zA-Z]+(\\([^)]*\\))?!?: *";"") | gsub("#(?=[0-9])";"") | gsub("\\s+";" ") | sub("^ +";"") | sub(" +$";"") | (if length == 0 then "untitled" else . end) | (if length > 80 then .[0:77] + "..." else . end);
179
+ def shown: if .trusted then "\"" + (.title | disp) + "\"" else "a change from someone outside the team" end; # mut:untitle
180
+ def noise: test("(^|/)(package-lock\\.json|npm-shrinkwrap\\.json|bun\\.lockb?|yarn\\.lock|pnpm-lock\\.yaml|Gemfile\\.lock|Cargo\\.lock|poetry\\.lock|uv\\.lock|composer\\.lock|go\\.sum|suite-[a-z-]+\\.tsv|rule-body-hashes\\.txt)$") or test("\\.likec4\\.json$") or test("\\.baseline\\.txt$"); # mut:noise
181
+ def trusted: IN("OWNER","MEMBER","COLLABORATOR"); # mut:assoc
182
+ '
183
+ SELF_DEFS='
184
+ def own_number: (.number | tostring) == $cur; # mut:selfnum
185
+ def own_branch: $head != "" and .headRefName == $head and ((.isCrossRepository // false) | not) or ($head != "" and .headRefName == $head and $owner != "" and (.headRepositoryOwner.login // "") == $owner); # mut:selfbranch
186
+ '
187
+ SHARED_DEFS='
188
+ def sharedfiles($eff; $ours): [$eff[] | clean | select((noise | not) and IN($ours[]))] | unique; # mut:samefile
189
+ '
190
+ EDIT_RULE_JQ='$e >= 2 or ($e >= 1 and $e == $o)' # mut:dup
191
+
192
+ # ---- this change ----------------------------------------------------------------------------
193
+ CUR_HEAD="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)"
194
+ [ "$CUR_HEAD" = HEAD ] && CUR_HEAD=""
195
+ CUR_PR="$PR_ARG"
196
+ VIEW_OWNER=""
197
+ if [ -z "$CUR_PR" ]; then
198
+ VIEW_JSON="$(bounded 30 gh pr view --json number,headRefName,headRepositoryOwner 2>/dev/null)"
199
+ vrc=$?
200
+ if [ "$vrc" -eq 0 ] && VIEW_N="$(printf '%s' "$VIEW_JSON" | jq -er '.number' 2>/dev/null)" && is_int "$VIEW_N"; then
201
+ CUR_PR="$VIEW_N"
202
+ VIEW_H="$(printf '%s' "$VIEW_JSON" | jq -r '.headRefName // empty' 2>/dev/null)"
203
+ [ -n "$VIEW_H" ] && CUR_HEAD="$VIEW_H"
204
+ VIEW_OWNER="$(printf '%s' "$VIEW_JSON" | jq -r '.headRepositoryOwner.login // empty' 2>/dev/null)"
205
+ elif [ "$MODE" = merge ]; then
206
+ cannot_check "I could not find this change on GitHub"
207
+ fi
208
+ fi
209
+
210
+ BASE_OK=0
211
+ git rev-parse --verify -q 'origin/main^{commit}' >/dev/null 2>&1 && BASE_OK=1
212
+ if [ "$MODE" = merge ] && [ "$BASE_OK" -ne 1 ]; then
213
+ cannot_check "I cannot see where this work started from"
214
+ fi
215
+
216
+ OWN_FILES=""
217
+ if [ "$FILES_SET" -eq 1 ]; then
218
+ set -f
219
+ for f in $FILES_ARG; do OWN_FILES="$OWN_FILES$f"$'\n'; done
220
+ set +f
221
+ else
222
+ [ "$BASE_OK" -eq 1 ] || cannot_check "I could not read which files this change touches"
223
+ OWN_FILES="$(git diff --no-renames --name-only origin/main...HEAD 2>/dev/null)" # mut:norenames
224
+ rc=$?
225
+ [ "$rc" -eq 0 ] || cannot_check "I could not read which files this change touches"
226
+ fi
227
+ OURS_JSON="$(printf '%s\n' "$OWN_FILES" | jq -R -s -c "$JQ_DEFS"' split("\n") | map(select(length > 0 and (noise | not))) | unique')" \
228
+ || cannot_check "I could not read which files this change touches"
229
+ NOURS="$(printf '%s' "$OURS_JSON" | jq 'length')"
230
+ NEED=2
231
+ [ "$NOURS" -lt 2 ] && NEED="$NOURS"
232
+
233
+ # Our own per-file additions and deletions, to compare with the numbers the list already carries.
234
+ OWN_STATS='{}'
235
+ if [ "$BASE_OK" -eq 1 ]; then
236
+ OWN_STATS="$(git diff --no-renames --numstat origin/main...HEAD 2>/dev/null \
237
+ | jq -R -s -c 'split("\n") | map(select(length > 0) | split("\t") | select(length >= 3 and .[0] != "-") | {key: .[2], value: (.[0] + ":" + .[1])}) | from_entries')" \
238
+ || OWN_STATS='{}'
239
+ fi
240
+ HAVE_EDITS="$(printf '%s' "$OURS_JSON" | jq --argjson st "$OWN_STATS" '[.[] | select($st[.] != null)] | length')"
241
+
242
+ OWN_SUBJECTS=""
243
+ if [ "$BASE_OK" -eq 1 ]; then
244
+ OWN_SUBJECTS="$(git log --no-merges --format=%s origin/main..HEAD 2>/dev/null)"
245
+ rc=$?
246
+ if [ "$rc" -ne 0 ] && [ "$MODE" = merge ]; then cannot_check "I could not read the titles of this change's steps"; fi
247
+ fi
248
+ SUBJ_OURS_JSON="$(printf '%s\n' "$OWN_SUBJECTS" | jq -R -s -c "$JQ_DEFS"' split("\n") | map(norm | select(length > 0 and (generic | not))) | unique')" \
249
+ || cannot_check "I could not read the titles of this change's steps"
250
+
251
+ # ---- the other open changes ---------------------------------------------------------------------
252
+ LIST_JSON="$(bounded 40 gh pr list --state open -L "$LIST_CAP" --json number,title,url,isDraft,files,headRefName,headRepositoryOwner,isCrossRepository 2>/dev/null)"
253
+ rc=$?
254
+ [ "$rc" -ne 0 ] && cannot_check "GitHub did not answer when I asked for the open changes" # mut:listfail
255
+ printf '%s' "$LIST_JSON" | jq -e 'type == "array"' >/dev/null 2>&1 \
256
+ || cannot_check "GitHub gave me an answer I could not read"
257
+ LIST_COUNT="$(printf '%s' "$LIST_JSON" | jq 'length')"
258
+
259
+ # Who wrote each change. `gh pr list --json` has no author-association field, so read it from the REST
260
+ # list of open pulls (one paginated call, 100 a page). Without it nobody can be told from a stranger,
261
+ # so a failed read is "could not check", never a guess.
262
+ ASSOC_MAP='{}'
263
+ if [ "$LIST_COUNT" -gt 0 ]; then
264
+ ASSOC_RAW="$(bounded 30 gh api "repos/{owner}/{repo}/pulls?state=open&per_page=100" --paginate --jq '.[] | {number: .number, assoc: (.author_association // "")}' 2>/dev/null)"
265
+ rc=$?
266
+ [ "$rc" -ne 0 ] && cannot_check "GitHub did not answer when I asked who wrote the open changes" # mut:authread
267
+ ASSOC_MAP="$(printf '%s\n' "$ASSOC_RAW" | jq -s -c 'map({key: (.number | tostring), value: .assoc}) | from_entries')" \
268
+ || cannot_check "GitHub gave me an answer I could not read"
269
+ fi
270
+
271
+ # This change is never an overlap: not by number, and not a change from the same branch of this
272
+ # repository (a fork's change that merely shares the branch name is somebody else's).
273
+ OTHERS="$(printf '%s' "$LIST_JSON" | jq -c --arg cur "$CUR_PR" --arg head "$CUR_HEAD" --arg owner "$VIEW_OWNER" --argjson assoc "$ASSOC_MAP" "$SELF_DEFS"'[.[] | select((own_number or own_branch) | not) | .authorAssociation = ($assoc[(.number | tostring)] // "")]')" \
274
+ || cannot_check "GitHub gave me an answer I could not read"
275
+
276
+ # A change that lists PAGE_CAP files may have more: GitHub caps the list per change. Re-read the team
277
+ # changes whose first page shares nothing with us, with a paginated call; a failed re-read is "could
278
+ # not check", never clear. Nothing to look for (no files) or nothing to learn (the first page already
279
+ # shares a file) means no call.
280
+ OV='{}'
281
+ CAPPED=""
282
+ if [ "$NOURS" -gt 0 ]; then
283
+ CAPPED="$(printf '%s' "$OTHERS" | jq -r --argjson cap "$PAGE_CAP" --argjson ours "$OURS_JSON" "$JQ_DEFS"'.[] | select(((.authorAssociation // "") | trusted) and (.files | length) >= $cap and ([.files[]?.path | clean | select((noise | not) and IN($ours[]))] | length) == 0) | .number')"
284
+ fi
285
+ for n in $CAPPED; do
286
+ over_deadline && cannot_check "I ran out of time reading the full file list of a large change"
287
+ pages="$(bounded 30 gh api "repos/{owner}/{repo}/pulls/$n/files?per_page=100" --paginate --jq '.[].filename' 2>/dev/null)"
288
+ rc=$?
289
+ [ "$rc" -ne 0 ] && cannot_check "GitHub did not answer when I asked for the full file list of a large change" # mut:pagefail
290
+ arr="$(printf '%s\n' "$pages" | jq -R -s -c 'split("\n") | map(select(length > 0))')"
291
+ OV="$(printf '%s' "$OV" | jq -c --arg n "$n" --argjson a "$arr" '. + {($n): $a}')"
292
+ done
293
+
294
+ # Same-file signal. `eq` lists the shared files whose additions/deletions equal ours (or cannot be
295
+ # told because the file list was re-read by name): only those can carry the identical edit.
296
+ CAND="$(printf '%s' "$OTHERS" | jq -c --argjson ours "$OURS_JSON" --argjson ov "$OV" --argjson st "$OWN_STATS" "$JQ_DEFS$SHARED_DEFS"'
297
+ [ .[] | . as $p
298
+ | ($ov[($p.number | tostring)]) as $ovf
299
+ | ($p.files // []) as $pf
300
+ | (if $ovf != null then $ovf else [$pf[]?.path] end) as $eff
301
+ | sharedfiles($eff; $ours) as $sh
302
+ | { number: $p.number, title: ($p.title // ""), url: ($p.url // ""), draft: ($p.isDraft // false),
303
+ trusted: (($p.authorAssociation // "") | trusted),
304
+ files: $sh,
305
+ eq: [ $sh[] | . as $f | select($st[$f] != null and ($ovf != null or ([$pf[] | select(.path == $f) | (((.additions // 0) | tostring) + ":" + ((.deletions // 0) | tostring))] | any(. == $st[$f])))) ] } ]')" \
306
+ || cannot_check "GitHub gave me an answer I could not read"
307
+
308
+ # ---- same-title signal (the change title) ------------------------------------------------------------
309
+ SUBJ_NUMS=""
310
+ if [ "$SUBJ_OURS_JSON" != "[]" ]; then
311
+ TITLE_HITS="$(printf '%s' "$CAND" | jq -r --argjson s "$SUBJ_OURS_JSON" "$JQ_DEFS"'.[] | select((.title | norm) as $t | ($t | generic | not) and ($s | any(. == $t))) | .number')"
312
+ for n in $TITLE_HITS; do SUBJ_NUMS="$SUBJ_NUMS $n"; done
313
+ fi
314
+
315
+ # ---- same-edit and same-title-history signals: team changes that share a file only -------------------
316
+ own_pid() { # own_pid <file> -> the patch identity of OUR edit to the file, or nothing
317
+ local key cf
318
+ key="$(printf '%s' "$1" | cksum | tr ' ' '_')"
319
+ cf="$WORK/own.$key"
320
+ if [ ! -f "$cf" ]; then
321
+ git diff --no-ext-diff --no-color --no-renames origin/main...HEAD -- "$1" 2>/dev/null | git patch-id --stable 2>/dev/null | awk 'NR==1{print $1}' > "$cf"
322
+ fi
323
+ cat "$cf"
324
+ }
325
+
326
+ EDIT_NUMS=""
327
+ DIFF_ELIG=0
328
+ DIFF_N=0
329
+ DIFF_FAILED=0
330
+ DEADLINE_SKIPPED=0
331
+ NOBASE=0
332
+ NOEDITS=0
333
+ [ "$BASE_OK" -eq 1 ] || NOBASE=1 # mut:nobasenote
334
+ [ "$BASE_OK" -eq 1 ] && [ "$HAVE_EDITS" -eq 0 ] && NOEDITS=1
335
+ SHARING="$(printf '%s' "$CAND" | jq -r '.[] | select(.trusted and (.files | length) > 0) | (.number | tostring) + ":" + (.eq | length | tostring)')"
336
+ for tok in $SHARING; do
337
+ n="${tok%%:*}"
338
+ eqn="${tok##*:}"
339
+ if over_deadline; then DEADLINE_HIT=1; DEADLINE_SKIPPED=$((DEADLINE_SKIPPED + 1)); continue; fi
340
+ # Edits: only when we have a saved edit of our own and the numbers can match.
341
+ if [ "$BASE_OK" -eq 1 ] && [ "$HAVE_EDITS" -gt 0 ] && [ "$eqn" -ge "$NEED" ] && [ "$NEED" -gt 0 ]; then
342
+ DIFF_ELIG=$((DIFF_ELIG + 1))
343
+ if [ "$DIFF_N" -lt "$DIFF_CAP" ]; then
344
+ DIFF_N=$((DIFF_N + 1))
345
+ d="$WORK/pd$n"; mkdir -p "$d"
346
+ bounded 30 gh pr diff "$n" > "$d/all.diff" 2>/dev/null
347
+ rc=$?
348
+ if [ "$rc" -ne 0 ]; then
349
+ if over_deadline; then DEADLINE_HIT=1; DEADLINE_SKIPPED=$((DEADLINE_SKIPPED + 1)); continue; fi
350
+ DIFF_FAILED=$((DIFF_FAILED + 1))
351
+ else
352
+ awk -v dir="$d" '
353
+ /^diff --git a\// {
354
+ if (out != "") close(out)
355
+ k++
356
+ name = $0
357
+ sub(/^diff --git a\/.* b\//, "", name)
358
+ out = dir "/" k ".patch"
359
+ print name > (dir "/" k ".name")
360
+ close(dir "/" k ".name")
361
+ }
362
+ k > 0 { print > out }
363
+ ' "$d/all.diff"
364
+ printf '%s' "$CAND" | jq -r --argjson n "$n" '.[] | select(.number == $n) | .eq[]' > "$WORK/eq.$n"
365
+ E=0
366
+ while IFS= read -r f; do
367
+ [ -n "$f" ] || continue
368
+ mine="$(own_pid "$f")"
369
+ [ -n "$mine" ] || continue
370
+ nf="$(grep -lFx -- "$f" "$d"/*.name 2>/dev/null | head -n 1)"
371
+ [ -n "$nf" ] || continue
372
+ theirs="$(git patch-id --stable < "${nf%.name}.patch" 2>/dev/null | awk 'NR==1{print $1}')"
373
+ if [ -n "$theirs" ] && [ "$theirs" = "$mine" ]; then
374
+ E=$((E + 1))
375
+ if [ "$(jq -n --argjson e "$E" --argjson o "$NOURS" "$EDIT_RULE_JQ")" = true ]; then
376
+ EDIT_NUMS="$EDIT_NUMS $n"
377
+ break
378
+ fi
379
+ fi
380
+ done < "$WORK/eq.$n"
381
+ fi
382
+ fi
383
+ fi
384
+ # Same title in the step-by-step history: one read of up to 100 steps, only for what shares a file.
385
+ case " $SUBJ_NUMS $EDIT_NUMS " in *" $n "*) continue ;; esac
386
+ if [ "$SUBJ_OURS_JSON" != "[]" ]; then
387
+ if over_deadline; then DEADLINE_HIT=1; DEADLINE_SKIPPED=$((DEADLINE_SKIPPED + 1)); continue; fi
388
+ lines="$(bounded 30 gh api "repos/{owner}/{repo}/pulls/$n/commits?per_page=100" --paginate --jq '.[].commit.message | split("\n")[0]' 2>/dev/null)"
389
+ rc=$?
390
+ if [ "$rc" -ne 0 ]; then
391
+ if over_deadline; then DEADLINE_HIT=1; DEADLINE_SKIPPED=$((DEADLINE_SKIPPED + 1)); continue; fi
392
+ cannot_check "GitHub did not answer when I asked for the history of another change"
393
+ fi
394
+ hit="$(printf '%s\n' "$lines" | jq -R -s -r --argjson s "$SUBJ_OURS_JSON" "$JQ_DEFS"'split("\n") | map(norm | select(length > 0 and (generic | not))) | if any(.[]; . as $t | $s | any(. == $t)) then "yes" else "no" end')"
395
+ [ "$hit" = yes ] && SUBJ_NUMS="$SUBJ_NUMS $n"
396
+ fi
397
+ done
398
+ # shellcheck disable=SC2086 # the lists are space-separated integers
399
+ EDIT_JSON="$(printf '%s\n' $EDIT_NUMS | jq -R -s -c 'split("\n") | map(select(length > 0) | tonumber)')"
400
+ # shellcheck disable=SC2086
401
+ SUBJ_JSON="$(printf '%s\n' $SUBJ_NUMS | jq -R -s -c 'split("\n") | map(select(length > 0) | tonumber)')"
402
+
403
+ # ---- decide ----------------------------------------------------------------------------------------
404
+ OVER="$(printf '%s' "$CAND" | jq -c --argjson edits "$EDIT_JSON" --argjson subj "$SUBJ_JSON" '
405
+ map(. + { edit: (.number as $n | $edits | any(. == $n)), subject: (.number as $n | $subj | any(. == $n)) })
406
+ | map(select((.files | length) > 0 or .subject))
407
+ | sort_by(.number)')" \
408
+ || cannot_check "I could not combine what I found"
409
+
410
+ N_OVER="$(printf '%s' "$OVER" | jq 'length')"
411
+ IDS="$(printf '%s' "$OVER" | jq -r 'map(.number | tostring) | join(",")')"
412
+ DUP="$(printf '%s' "$OVER" | jq 'any(.[]; .trusted and (.edit or .subject))')"
413
+ VEH_IN=false
414
+ [ -n "$VEHICLE" ] && VEH_IN="$(printf '%s' "$OVER" | jq --arg v "$VEHICLE" 'any(.[]; .trusted and (.number | tostring) == $v)')"
415
+
416
+ vehicle_is_this() { [ -n "$VEHICLE" ] && { [ "$VEHICLE" = this ] || [ "$VEHICLE" = "$CUR_PR" ]; }; } # mut:vehicle
417
+
418
+ if [ "$N_OVER" -eq 0 ]; then
419
+ CODE=0
420
+ elif vehicle_is_this; then
421
+ CODE=11
422
+ elif [ "$VEH_IN" = true ]; then
423
+ CODE=10
424
+ elif [ "$DUP" = true ]; then
425
+ CODE=12
426
+ else
427
+ CODE=13 # mut:sharedblock
428
+ fi
429
+
430
+ # ---- say it in plain words ------------------------------------------------------------------------
431
+ if [ "$N_OVER" -eq 0 ]; then
432
+ say "No other open work overlaps with this change."
433
+ else
434
+ say "Other open work overlaps with this change:"
435
+ printf '%s' "$OVER" | jq -r "$JQ_DEFS"'.[] |
436
+ "- " + shown + " - " + (.url | clean),
437
+ (if (.files | length) > 0 then " Changes some of the same files as yours: " + (.files | map(clean) | .[0:5] | join(", ")) + (if (.files | length) > 5 then " and " + (((.files | length) - 5) | tostring) + " more" else "" end) else empty end),
438
+ (if .edit then " This change makes the same edit as yours." else empty end),
439
+ (if .subject then " It has a change with the same title as one of yours." else empty end),
440
+ (if .trusted | not then " I list it for information only and will not hold anything back for it." else empty end),
441
+ (if .draft then " It is still being worked on and is not ready yet." else empty end)'
442
+ fi
443
+
444
+ if [ "$LIST_COUNT" -ge "$LIST_CAP" ]; then
445
+ say "GitHub listed $LIST_CAP open changes, the most I can read at once, so there may be more that I did not see."
446
+ fi
447
+ if [ "$DIFF_ELIG" -gt "$DIFF_CAP" ]; then
448
+ say "I compared the actual edits of $DIFF_CAP of the $DIFF_ELIG changes that could be the same edit as yours; the rest are matched by file name only."
449
+ fi
450
+ if [ "$DIFF_FAILED" -gt 0 ]; then
451
+ say "I could not compare the edits themselves for $DIFF_FAILED of them, so those are matched by file name only."
452
+ fi
453
+ if [ "$DEADLINE_HIT" -eq 1 ]; then
454
+ say "I stopped comparing after $DEADLINE_SECS seconds so this check would not hold things up; $DEADLINE_SKIPPED of the changes that share files with yours were matched by file name and title only."
455
+ fi
456
+ if [ "$NOBASE" -eq 1 ]; then
457
+ say "I could not compare the edits themselves because I cannot see where this work started from yet."
458
+ elif [ "$NOEDITS" -eq 1 ]; then
459
+ say "I cannot compare the actual edits yet because none of the files for this work have saved changes, so shared files are matched by name only. The edit check runs again before this is merged."
460
+ fi
461
+
462
+ case "$CODE" in
463
+ 0)
464
+ : ;;
465
+ 10)
466
+ say "What this means: another open change was chosen to carry this work. I am holding mine back and will not touch theirs."
467
+ say "Next step for me: wait until that change is live, then check again."
468
+ ;;
469
+ 11)
470
+ say "What this means: this change was chosen to carry the work, so the other changes should step aside. I am not touching them."
471
+ say "Next step for me: carry on with this change; the others are listed only so you know they exist."
472
+ ;;
473
+ 12)
474
+ say "What this means: another open change already covers the same work and nobody has chosen which one carries it. I am holding mine back."
475
+ say "Next step for me: ask the engineering lead agent to choose one change to carry the work and record its decision (a technical choice, not a question for the operator), then run this check again with the chosen change named."
476
+ ;;
477
+ 13)
478
+ say "What this means: these changes touch some of the same files, which is common and does not stop anything. Whichever goes second may need small adjustments."
479
+ say "Next step for me: carry on; I will not touch their changes."
480
+ ;;
481
+ esac
482
+
483
+ finish "$CODE" "${IDS:-none}"