forge-workflow 0.0.10 → 0.1.0-beta.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 (454) hide show
  1. package/.claude/rules/{greptile-review-process.md → review-process.md} +56 -41
  2. package/.claude/scripts/{greptile-resolve.sh → review-resolve.sh} +13 -3
  3. package/.cursor/rules/permissions-guidance.mdc +2 -2
  4. package/.forge/hooks/check-tdd.js +3 -0
  5. package/.forge/hooks/forge-native-hook.js +245 -0
  6. package/.forge/protected-paths.yaml +157 -0
  7. package/AGENTS.md +150 -61
  8. package/CHANGELOG.md +681 -0
  9. package/CLAUDE.md +9 -118
  10. package/QUICKSTART.md +171 -0
  11. package/README.md +271 -363
  12. package/bin/forge-cmd.js +120 -9
  13. package/bin/forge-preflight.js +26 -5
  14. package/bin/forge.js +461 -489
  15. package/docs/INDEX.md +93 -0
  16. package/docs/PROJECT_DESIGN.md +685 -0
  17. package/docs/architecture/index.md +66 -0
  18. package/docs/architecture/notes/README.md +35 -0
  19. package/docs/architecture/subsystems/README.md +46 -0
  20. package/docs/forge/TOOLCHAIN.md +670 -0
  21. package/docs/forge/VALIDATION.md +82 -0
  22. package/docs/{AGENT_INSTALL_PROMPT.md → guides/AGENT_INSTALL_PROMPT.md} +3 -3
  23. package/docs/guides/BEADS_GITHUB_SYNC.md +32 -0
  24. package/docs/{ENHANCED_ONBOARDING.md → guides/ENHANCED_ONBOARDING.md} +16 -12
  25. package/docs/guides/GREPTILE_SETUP.md +46 -0
  26. package/docs/guides/MANUAL_REVIEW_GUIDE.md +58 -0
  27. package/docs/guides/MIGRATION.md +56 -0
  28. package/docs/guides/SETUP.md +118 -0
  29. package/docs/guides/SUPPORT.md +185 -0
  30. package/docs/guides/WORKFLOW_TEMPLATES.md +74 -0
  31. package/docs/guides/memory-backends.md +183 -0
  32. package/docs/reference/ADAPTERS.md +128 -0
  33. package/docs/reference/AGENT_SKILL_PARITY.md +175 -0
  34. package/docs/reference/COMMANDS.md +205 -0
  35. package/docs/reference/DECISION_DRIFT_GUARDS.md +97 -0
  36. package/docs/{EXAMPLES.md → reference/EXAMPLES.md} +7 -5
  37. package/docs/reference/FORGE_KERNEL_STORAGE_MODEL.md +135 -0
  38. package/docs/reference/HERMES_INTEGRATION.md +118 -0
  39. package/docs/reference/INSIGHTS_RECAP.md +63 -0
  40. package/docs/reference/INSTALL.md +164 -0
  41. package/docs/reference/KERNEL_TAXONOMY_VALIDATION.md +161 -0
  42. package/docs/reference/PROTECTED_PATH_MANIFEST.md +25 -0
  43. package/docs/reference/RELEASE.md +68 -0
  44. package/docs/reference/RESEARCH_TEMPLATE.md +292 -0
  45. package/docs/{ROADMAP.md → reference/ROADMAP.md} +12 -9
  46. package/docs/reference/SKILLS.md +35 -0
  47. package/docs/reference/STATUS_BOARD.md +80 -0
  48. package/docs/reference/TEMPLATES.md +106 -0
  49. package/docs/{TOOLCHAIN.md → reference/TOOLCHAIN.md} +62 -47
  50. package/docs/reference/VALIDATION.md +82 -0
  51. package/docs/reference/agent-permissions.md +169 -0
  52. package/docs/reference/beads-to-kernel-migration-ux.md +61 -0
  53. package/docs/reference/control-plane-guarantees.md +125 -0
  54. package/docs/reference/dependency-chain.md +331 -0
  55. package/docs/reference/forge-kernel-issue-command-contract.md +161 -0
  56. package/docs/reference/forge-kernel-schema.md +72 -0
  57. package/docs/reference/kernel-conflict-evaluators.md +27 -0
  58. package/docs/reference/patch-md-format.md +77 -0
  59. package/docs/reference/protected-state-surfaces.md +59 -0
  60. package/docs/reference/shepherd.md +115 -0
  61. package/docs/reference/superpowers-analysis.md +320 -0
  62. package/docs/reference/superpowers-integration-options.md +404 -0
  63. package/docs/reference/test-environment.md +519 -0
  64. package/docs/reference/upgrade-safety.md +59 -0
  65. package/lefthook.yml +18 -0
  66. package/lib/adapter-cli.js +307 -0
  67. package/lib/adapters/beads-issue-adapter.js +127 -0
  68. package/lib/adapters/beads-kernel-compat.js +1042 -0
  69. package/lib/adapters/greptile-review-adapter.js +141 -0
  70. package/lib/adapters/kernel-issue-adapter.js +101 -0
  71. package/lib/adapters/pr-state-adapter.js +484 -0
  72. package/lib/adoption-profiles.js +126 -0
  73. package/lib/agents/README.md +2 -6
  74. package/lib/agents/claude.plugin.json +3 -8
  75. package/lib/agents/codex.plugin.json +9 -1
  76. package/lib/agents/cursor.plugin.json +2 -6
  77. package/lib/agents/hermes.plugin.json +22 -0
  78. package/lib/agents-config.js +39 -1236
  79. package/lib/audit-evidence.js +282 -0
  80. package/lib/beads-setup.js +121 -0
  81. package/lib/beads-sync-scaffold.js +25 -101
  82. package/lib/codex-skills.js +51 -1
  83. package/lib/commands/_issue.js +741 -77
  84. package/lib/commands/_manifest.js +91 -0
  85. package/lib/commands/_registry.js +85 -34
  86. package/lib/commands/_resolve-command-opts.js +261 -0
  87. package/lib/commands/_serve-security.js +270 -0
  88. package/lib/commands/adapter.js +12 -0
  89. package/lib/commands/add.js +118 -0
  90. package/lib/commands/audit.js +70 -0
  91. package/lib/commands/blocked.js +5 -0
  92. package/lib/commands/board.js +64 -0
  93. package/lib/commands/claim.js +21 -2
  94. package/lib/commands/claims.js +7 -0
  95. package/lib/commands/clean.js +485 -75
  96. package/lib/commands/close.js +2 -2
  97. package/lib/commands/comment.js +5 -0
  98. package/lib/commands/control.js +148 -0
  99. package/lib/commands/create.js +2 -2
  100. package/lib/commands/dev.js +185 -7
  101. package/lib/commands/doc-gate.js +336 -0
  102. package/lib/commands/doctor.js +156 -0
  103. package/lib/commands/explain.js +15 -0
  104. package/lib/commands/export.js +237 -0
  105. package/lib/commands/gate.js +192 -0
  106. package/lib/commands/hooks.js +242 -0
  107. package/lib/commands/inbox.js +118 -0
  108. package/lib/commands/init.js +598 -0
  109. package/lib/commands/insights.js +79 -0
  110. package/lib/commands/issue.js +12 -1
  111. package/lib/commands/issues.js +17 -0
  112. package/lib/commands/lint.js +5 -0
  113. package/lib/commands/list.js +2 -2
  114. package/lib/commands/merge.js +312 -0
  115. package/lib/commands/migrate.js +523 -0
  116. package/lib/commands/new.js +12 -0
  117. package/lib/commands/options.js +241 -0
  118. package/lib/commands/orient.js +13 -0
  119. package/lib/commands/orphans.js +5 -0
  120. package/lib/commands/patch.js +67 -0
  121. package/lib/commands/plan.js +436 -24
  122. package/lib/commands/preflight.js +211 -0
  123. package/lib/commands/prime.js +13 -0
  124. package/lib/commands/push.js +69 -2
  125. package/lib/commands/ready.js +2 -2
  126. package/lib/commands/recall.js +116 -0
  127. package/lib/commands/recap.js +61 -0
  128. package/lib/commands/recommend.js +0 -1
  129. package/lib/commands/release.js +91 -0
  130. package/lib/commands/remember.js +74 -0
  131. package/lib/commands/role.js +99 -0
  132. package/lib/commands/serve.js +581 -0
  133. package/lib/commands/setup.js +838 -972
  134. package/lib/commands/shepherd.js +436 -0
  135. package/lib/commands/ship.js +23 -1
  136. package/lib/commands/show.js +2 -2
  137. package/lib/commands/stage.js +192 -0
  138. package/lib/commands/stale.js +5 -0
  139. package/lib/commands/status.js +158 -21
  140. package/lib/commands/sync.js +34 -46
  141. package/lib/commands/team.js +4 -1
  142. package/lib/commands/test.js +43 -27
  143. package/lib/commands/update.js +2 -2
  144. package/lib/commands/upgrade.js +47 -0
  145. package/lib/commands/validate.js +43 -18
  146. package/lib/commands/worktree.js +307 -100
  147. package/lib/config-writer.js +202 -0
  148. package/lib/control-plane.js +236 -0
  149. package/lib/core/runtime-graph.js +946 -0
  150. package/lib/dep-guard/keyword-ripple.js +2 -2
  151. package/lib/deprecated-sync-cleanup.js +362 -0
  152. package/lib/detect-agent.js +2 -28
  153. package/lib/detect-worktree.js +35 -9
  154. package/lib/doc-gate/declaration.js +177 -0
  155. package/lib/doc-gate/detect.js +289 -0
  156. package/lib/doc-gate/gate.js +375 -0
  157. package/lib/doc-gate/okf-config.js +128 -0
  158. package/lib/doc-gate/okf.js +429 -0
  159. package/lib/docs-command.js +1161 -6
  160. package/lib/forge-issues.js +382 -11
  161. package/lib/forge-lock.js +262 -0
  162. package/lib/gate-events.js +193 -0
  163. package/lib/global-flags.js +74 -0
  164. package/lib/greptile-match.js +7 -63
  165. package/lib/harness-capability-matrix.js +380 -0
  166. package/lib/hook-global-installer.js +347 -0
  167. package/lib/hook-renderer.js +451 -0
  168. package/lib/inbox.js +391 -0
  169. package/lib/insights.js +397 -0
  170. package/lib/issue-adapter.js +156 -0
  171. package/lib/issue-backend.js +145 -0
  172. package/lib/issue-render.js +220 -0
  173. package/lib/kernel/backing-issue.js +305 -0
  174. package/lib/kernel/broker.js +1218 -0
  175. package/lib/kernel/cli-broker-factory.js +130 -0
  176. package/lib/kernel/conflict-signal.js +82 -0
  177. package/lib/kernel/evaluators.js +195 -0
  178. package/lib/kernel/fs-class.js +495 -0
  179. package/lib/kernel/issue-command-contract.js +559 -0
  180. package/lib/kernel/issue-id-resolver.js +186 -0
  181. package/lib/kernel/lease-enforcer.js +158 -0
  182. package/lib/kernel/migrations.js +333 -0
  183. package/lib/kernel/planning-buckets-schema.js +109 -0
  184. package/lib/kernel/projection-jsonl-writer.js +450 -0
  185. package/lib/kernel/readiness-model.js +329 -0
  186. package/lib/kernel/schema.js +356 -0
  187. package/lib/kernel/sqlite-driver.js +2504 -0
  188. package/lib/kernel/taxonomy-validator.js +394 -0
  189. package/lib/lefthook-check.js +3 -2
  190. package/lib/lefthook-wiring.js +413 -0
  191. package/lib/mcp-config-renderer.js +288 -0
  192. package/lib/memory/graphiti-mcp.js +106 -0
  193. package/lib/memory/router.js +387 -0
  194. package/lib/memory/typed-api.js +102 -0
  195. package/lib/memory-digest.js +195 -0
  196. package/lib/merge-rules.js +395 -0
  197. package/lib/migrate-dry-run.js +466 -0
  198. package/lib/orientation.js +863 -0
  199. package/lib/package-manager-remediation.js +103 -0
  200. package/lib/package-root.js +381 -0
  201. package/lib/patch-intent.js +890 -0
  202. package/lib/plugin-catalog.js +3 -4
  203. package/lib/plugin-manager.js +0 -5
  204. package/lib/pr-bundle.js +186 -0
  205. package/lib/pr-monitor/differ.js +195 -0
  206. package/lib/pr-monitor/events.js +0 -0
  207. package/lib/pr-monitor/gather.js +124 -0
  208. package/lib/pr-monitor/journal.js +299 -0
  209. package/lib/pr-monitor/monitor.js +146 -0
  210. package/lib/pr-monitor/render-sticky.js +157 -0
  211. package/lib/pr-monitor/watch-lifecycle.js +95 -0
  212. package/lib/pr-monitor/watch.js +247 -0
  213. package/lib/pr-pull.js +1273 -0
  214. package/lib/pr-shepherd.js +494 -0
  215. package/lib/pr-state-validator.js +59 -0
  216. package/lib/preflight/gates.js +237 -0
  217. package/lib/preflight/runner.js +116 -0
  218. package/lib/project-discovery.js +0 -53
  219. package/lib/project-memory.js +99 -497
  220. package/lib/protected-path-manifest.js +281 -0
  221. package/lib/protected-state-surfaces.js +387 -0
  222. package/lib/release-readiness.js +2089 -0
  223. package/lib/reset.js +59 -45
  224. package/lib/review-adapter.js +68 -0
  225. package/lib/rules-sync.js +260 -0
  226. package/lib/runtime-health.js +241 -20
  227. package/lib/safety-config-renderer.js +268 -0
  228. package/lib/setup-action-log.js +1 -7
  229. package/lib/setup.js +27 -65
  230. package/lib/shell-utils.js +76 -6
  231. package/lib/skills-sync.js +330 -0
  232. package/lib/smart-status/scoring.js +17 -3
  233. package/lib/status/beads-snapshot.js +45 -2
  234. package/lib/status/presenter.js +169 -18
  235. package/lib/status/snapshot.js +186 -0
  236. package/lib/sync-backend.js +202 -0
  237. package/lib/untrusted-content.js +52 -0
  238. package/lib/upgrade-safety.js +199 -0
  239. package/lib/workflow/enforce-stage.js +296 -47
  240. package/lib/workflow/stage-transition.js +115 -0
  241. package/lib/workflow/stages.js +30 -6
  242. package/lib/workflow/state-manager.js +11 -22
  243. package/lib/workflow/state.js +23 -1
  244. package/lib/workflow-profiles.js +17 -5
  245. package/package.json +37 -35
  246. package/rules/documentation.md +19 -0
  247. package/rules/kernel-tracking.md +26 -0
  248. package/rules/security.md +22 -0
  249. package/rules/tdd.md +20 -0
  250. package/rules/workflow.md +27 -0
  251. package/scripts/auto-backing-issue.js +47 -0
  252. package/scripts/beads-context.sh +81 -57
  253. package/scripts/beads-upgrade-smoke.sh +24 -3
  254. package/scripts/bootstrap-windows-tools.sh +78 -0
  255. package/scripts/branch-protection.js +2 -3
  256. package/scripts/check-agents.js +34 -137
  257. package/scripts/commitlint.js +3 -1
  258. package/scripts/conflict-detect.sh +3 -0
  259. package/scripts/dep-guard.sh +22 -3
  260. package/scripts/file-index.sh +3 -0
  261. package/scripts/forge-team/lib/claim.sh +34 -18
  262. package/scripts/forge-team/lib/dashboard.sh +61 -86
  263. package/scripts/forge-team/lib/epic.sh +99 -263
  264. package/scripts/forge-team/lib/hooks.sh +26 -28
  265. package/scripts/forge-team/lib/identity.sh +4 -4
  266. package/scripts/forge-team/lib/sync-github.sh +49 -84
  267. package/scripts/forge-team/lib/verify.sh +93 -83
  268. package/scripts/forge-team/lib/workload.sh +41 -65
  269. package/scripts/forge-team/tests/claim.test.sh +25 -19
  270. package/scripts/forge-team/tests/dashboard.test.sh +31 -46
  271. package/scripts/forge-team/tests/epic.test.sh +52 -71
  272. package/scripts/forge-team/tests/hooks.test.sh +38 -50
  273. package/scripts/forge-team/tests/identity.test.sh +3 -3
  274. package/scripts/forge-team/tests/integration.test.sh +44 -66
  275. package/scripts/forge-team/tests/sync-github.test.sh +50 -83
  276. package/scripts/forge-team/tests/verify.test.sh +37 -46
  277. package/scripts/forge-team/tests/workflow-integration.test.sh +4 -4
  278. package/scripts/forge-team/tests/workload.test.sh +32 -66
  279. package/scripts/gen-command-manifest.js +153 -0
  280. package/scripts/gen-embedded-assets.mjs +129 -0
  281. package/scripts/install.ps1 +139 -0
  282. package/scripts/install.sh +268 -0
  283. package/scripts/lib/release-asset.mjs +84 -0
  284. package/scripts/parity-check.mjs +145 -0
  285. package/scripts/parity-check.test.mjs +58 -0
  286. package/scripts/pin-agentic-workflow-images.js +112 -0
  287. package/scripts/pr-coordinator.sh +3 -0
  288. package/scripts/preflight-sonar.eslint.config.mjs +44 -0
  289. package/scripts/preflight.sh +21 -94
  290. package/scripts/protected-state-check.js +104 -0
  291. package/scripts/smart-status.sh +60 -57
  292. package/scripts/spikes/config-race-bench.js +111 -0
  293. package/scripts/spikes/harness-capability-matrix.js +13 -0
  294. package/scripts/spikes/patch-anchor-stability-bench.js +125 -0
  295. package/scripts/spikes/protected-path-manifest.js +20 -0
  296. package/scripts/spikes/skill-auto-invoke-parity.js +292 -0
  297. package/scripts/sync-agent-skills.js +62 -0
  298. package/scripts/sync-utils.sh +3 -0
  299. package/scripts/test-ci-shard.js +13 -6
  300. package/scripts/test.js +95 -12
  301. package/skills/claim-safety/SKILL.md +102 -0
  302. package/skills/claim-safety/evals/evals.json +46 -0
  303. package/{.github/prompts/dev.prompt.md → skills/dev/SKILL.md} +44 -50
  304. package/skills/dev/evals/evals.json +50 -0
  305. package/skills/hermes-forge/SKILL.md +185 -0
  306. package/skills/hermes-forge/evals/evals.json +46 -0
  307. package/skills/issue-basics/SKILL.md +111 -0
  308. package/skills/issue-basics/evals/evals.json +46 -0
  309. package/skills/kernel/SKILL.md +166 -0
  310. package/skills/kernel/evals/evals.json +50 -0
  311. package/skills/memory/SKILL.md +102 -0
  312. package/skills/parallel-deep-research/SKILL.md +14 -11
  313. package/skills/parallel-deep-research/evals/evals.json +11 -27
  314. package/{.github/prompts/plan.prompt.md → skills/plan/SKILL.md} +132 -157
  315. package/skills/plan/evals/evals.json +42 -0
  316. package/skills/research/SKILL.md +195 -0
  317. package/skills/research/evals/evals.json +42 -0
  318. package/{.github/prompts/review.prompt.md → skills/review/SKILL.md} +98 -62
  319. package/skills/review/evals/evals.json +42 -0
  320. package/skills/rollback/SKILL.md +110 -0
  321. package/skills/rollback/evals/evals.json +46 -0
  322. package/skills/rollback/references/methods.md +204 -0
  323. package/{.cursor/commands/rollback.md → skills/rollback/references/workflow-integration.md} +10 -284
  324. package/skills/shepherd/SKILL.md +66 -0
  325. package/skills/shepherd/evals/evals.json +42 -0
  326. package/{.github/prompts/ship.prompt.md → skills/ship/SKILL.md} +81 -45
  327. package/skills/ship/evals/evals.json +42 -0
  328. package/skills/smith/SKILL.md +142 -0
  329. package/skills/smith/evals/evals.json +46 -0
  330. package/skills/smith/references/autonomy-and-gates.md +94 -0
  331. package/{.github/prompts/sonarcloud.prompt.md → skills/sonarcloud/SKILL.md} +14 -3
  332. package/skills/sonarcloud/evals/evals.json +46 -0
  333. package/skills/sonarcloud-analysis/SKILL.md +18 -13
  334. package/skills/sonarcloud-analysis/evals/evals.json +11 -15
  335. package/{.github/prompts/status.prompt.md → skills/status/SKILL.md} +20 -10
  336. package/skills/status/evals/evals.json +50 -0
  337. package/skills/triage-ready/SKILL.md +121 -0
  338. package/skills/triage-ready/evals/evals.json +42 -0
  339. package/{.github/prompts/validate.prompt.md → skills/validate/SKILL.md} +52 -29
  340. package/skills/validate/evals/evals.json +42 -0
  341. package/skills/verify/SKILL.md +299 -0
  342. package/skills/verify/evals/evals.json +50 -0
  343. package/.claude/commands/dev.md +0 -345
  344. package/.claude/commands/plan.md +0 -566
  345. package/.claude/commands/premerge.md +0 -186
  346. package/.claude/commands/research.md +0 -42
  347. package/.claude/commands/review.md +0 -451
  348. package/.claude/commands/rollback.md +0 -721
  349. package/.claude/commands/ship.md +0 -213
  350. package/.claude/commands/sonarcloud.md +0 -152
  351. package/.claude/commands/status.md +0 -90
  352. package/.claude/commands/validate.md +0 -288
  353. package/.claude/commands/verify.md +0 -269
  354. package/.claude/rules/workflow.md +0 -121
  355. package/.cline/workflows/dev.md +0 -342
  356. package/.cline/workflows/plan.md +0 -563
  357. package/.cline/workflows/premerge.md +0 -183
  358. package/.cline/workflows/research.md +0 -39
  359. package/.cline/workflows/review.md +0 -448
  360. package/.cline/workflows/rollback.md +0 -718
  361. package/.cline/workflows/ship.md +0 -210
  362. package/.cline/workflows/sonarcloud.md +0 -146
  363. package/.cline/workflows/status.md +0 -87
  364. package/.cline/workflows/validate.md +0 -285
  365. package/.cline/workflows/verify.md +0 -266
  366. package/.codex/config.toml +0 -11
  367. package/.codex/skills/dev/SKILL.md +0 -345
  368. package/.codex/skills/plan/SKILL.md +0 -566
  369. package/.codex/skills/premerge/SKILL.md +0 -186
  370. package/.codex/skills/research/SKILL.md +0 -42
  371. package/.codex/skills/review/SKILL.md +0 -451
  372. package/.codex/skills/rollback/SKILL.md +0 -721
  373. package/.codex/skills/ship/SKILL.md +0 -213
  374. package/.codex/skills/sonarcloud/SKILL.md +0 -149
  375. package/.codex/skills/status/SKILL.md +0 -90
  376. package/.codex/skills/validate/SKILL.md +0 -288
  377. package/.codex/skills/verify/SKILL.md +0 -269
  378. package/.cursor/commands/dev.md +0 -342
  379. package/.cursor/commands/plan.md +0 -563
  380. package/.cursor/commands/premerge.md +0 -183
  381. package/.cursor/commands/research.md +0 -39
  382. package/.cursor/commands/review.md +0 -448
  383. package/.cursor/commands/ship.md +0 -210
  384. package/.cursor/commands/sonarcloud.md +0 -146
  385. package/.cursor/commands/status.md +0 -87
  386. package/.cursor/commands/validate.md +0 -285
  387. package/.cursor/commands/verify.md +0 -266
  388. package/.cursorrules +0 -149
  389. package/.github/prompts/premerge.prompt.md +0 -188
  390. package/.github/prompts/research.prompt.md +0 -44
  391. package/.github/prompts/rollback.prompt.md +0 -723
  392. package/.github/prompts/verify.prompt.md +0 -271
  393. package/.github/workflows/beads-to-github.yml +0 -89
  394. package/.github/workflows/github-to-beads.yml +0 -100
  395. package/.kilocode/workflows/dev.md +0 -346
  396. package/.kilocode/workflows/plan.md +0 -567
  397. package/.kilocode/workflows/premerge.md +0 -187
  398. package/.kilocode/workflows/research.md +0 -43
  399. package/.kilocode/workflows/review.md +0 -452
  400. package/.kilocode/workflows/rollback.md +0 -722
  401. package/.kilocode/workflows/ship.md +0 -214
  402. package/.kilocode/workflows/sonarcloud.md +0 -150
  403. package/.kilocode/workflows/status.md +0 -91
  404. package/.kilocode/workflows/validate.md +0 -289
  405. package/.kilocode/workflows/verify.md +0 -270
  406. package/.opencode/commands/dev.md +0 -345
  407. package/.opencode/commands/plan.md +0 -566
  408. package/.opencode/commands/premerge.md +0 -186
  409. package/.opencode/commands/research.md +0 -42
  410. package/.opencode/commands/review.md +0 -451
  411. package/.opencode/commands/rollback.md +0 -721
  412. package/.opencode/commands/ship.md +0 -213
  413. package/.opencode/commands/sonarcloud.md +0 -149
  414. package/.opencode/commands/status.md +0 -90
  415. package/.opencode/commands/validate.md +0 -288
  416. package/.opencode/commands/verify.md +0 -269
  417. package/.roo/commands/dev.md +0 -346
  418. package/.roo/commands/plan.md +0 -567
  419. package/.roo/commands/premerge.md +0 -187
  420. package/.roo/commands/research.md +0 -43
  421. package/.roo/commands/review.md +0 -452
  422. package/.roo/commands/rollback.md +0 -722
  423. package/.roo/commands/ship.md +0 -214
  424. package/.roo/commands/sonarcloud.md +0 -150
  425. package/.roo/commands/status.md +0 -91
  426. package/.roo/commands/validate.md +0 -289
  427. package/.roo/commands/verify.md +0 -270
  428. package/docs/BEADS_GITHUB_SYNC.md +0 -281
  429. package/docs/GREPTILE_SETUP.md +0 -400
  430. package/docs/MANUAL_REVIEW_GUIDE.md +0 -106
  431. package/docs/SETUP.md +0 -663
  432. package/docs/VALIDATION.md +0 -363
  433. package/lib/agents/cline.plugin.json +0 -29
  434. package/lib/agents/copilot.plugin.json +0 -24
  435. package/lib/agents/kilocode.plugin.json +0 -22
  436. package/lib/agents/opencode.plugin.json +0 -23
  437. package/lib/agents/roo.plugin.json +0 -30
  438. package/lib/beads-bootstrap.js +0 -225
  439. package/lib/beads-health-check.js +0 -188
  440. package/lib/commands/commands-reset.js +0 -147
  441. package/opencode.json +0 -67
  442. package/scripts/beads-context.test.js +0 -584
  443. package/scripts/github-beads-sync/comment.mjs +0 -64
  444. package/scripts/github-beads-sync/config.mjs +0 -148
  445. package/scripts/github-beads-sync/github-api.mjs +0 -131
  446. package/scripts/github-beads-sync/index.mjs +0 -356
  447. package/scripts/github-beads-sync/label-mapper.mjs +0 -54
  448. package/scripts/github-beads-sync/mapping.mjs +0 -132
  449. package/scripts/github-beads-sync/reverse-sync-cli.mjs +0 -31
  450. package/scripts/github-beads-sync/reverse-sync.mjs +0 -162
  451. package/scripts/github-beads-sync/run-bd.mjs +0 -161
  452. package/scripts/github-beads-sync/sanitize.mjs +0 -121
  453. package/scripts/github-beads-sync.config.json +0 -26
  454. package/scripts/sync-commands.js +0 -600
@@ -0,0 +1,130 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * CLI kernel broker factory.
5
+ *
6
+ * Assembles the kernel issue `deps` the CLI path needs so `createKernelIssueBackend`
7
+ * (lib/forge-issues.js) can construct a working broker:
8
+ *
9
+ * B1 — No real driver on the CLI path. We construct `createBuiltinSQLiteDriver`
10
+ * and inject it as `kernelDriver`, so the broker stops hitting
11
+ * `requireGuardedDriverMethods(undefined)`.
12
+ * B2 — Migrations never run on the runtime path. `ensureKernelMigrated` wraps
13
+ * `broker.initialize()` (pragmas + idempotent migration DDL).
14
+ *
15
+ * The factory does NOT change `createKernelIssueBackend`'s contract — it only
16
+ * supplies the `deps.kernelDriver` / `deps.kernelDatabasePath` it already reads.
17
+ *
18
+ * D19 coordination: the filesystem-doctor (read-only DB-location check) belongs
19
+ * just before the driver opens the file. We expose `resolveKernelDatabasePath`
20
+ * as that seam — D19 hooks the path, this factory does not reimplement it.
21
+ *
22
+ * @module kernel/cli-broker-factory
23
+ */
24
+
25
+ const path = require('node:path');
26
+ const {
27
+ createBuiltinSQLiteDriver,
28
+ selectBuiltinSQLiteRuntime,
29
+ } = require('./sqlite-driver');
30
+ const { resolveGitCommonDir, createLocalBroker } = require('./broker');
31
+
32
+ const KERNEL_DB_FILE = 'kernel.sqlite';
33
+ const KERNEL_DB_SUBDIR = 'forge';
34
+
35
+ /**
36
+ * Resolve the kernel database path. Mirrors `buildLocalBrokerConfig`:
37
+ * explicit `databasePath` wins; otherwise `<gitCommonDir>/forge/kernel.sqlite`,
38
+ * where `gitCommonDir` defaults to the resolved git common dir for `projectRoot`.
39
+ *
40
+ * @param {Object} options
41
+ * @param {string} [options.projectRoot]
42
+ * @param {string} [options.gitCommonDir]
43
+ * @param {string} [options.databasePath]
44
+ * @returns {string}
45
+ */
46
+ function resolveKernelDatabasePath(options = {}) {
47
+ if (typeof options.databasePath === 'string' && options.databasePath) {
48
+ return options.databasePath;
49
+ }
50
+ const gitCommonDir = options.gitCommonDir
51
+ || resolveGitCommonDir(options.projectRoot, options);
52
+ return path.join(gitCommonDir, KERNEL_DB_SUBDIR, KERNEL_DB_FILE);
53
+ }
54
+
55
+ /**
56
+ * Build the kernel issue deps for the CLI path.
57
+ *
58
+ * @param {Object} options
59
+ * @param {string} [options.projectRoot] - Repo root (used to resolve the git common dir).
60
+ * @param {string} [options.gitCommonDir] - Git common dir (overrides resolution).
61
+ * @param {string} [options.databasePath] - Explicit kernel DB path (overrides default).
62
+ * @param {Object} [options.runtime] - Pre-selected SQLite runtime (tests inject this).
63
+ * @param {Function} [options.requireModule] - Module loader for runtime detection (tests).
64
+ * @returns {{ useKernelBroker: true, kernelDriver: Object, kernelDatabasePath: string, gitCommonDir?: string }}
65
+ * @throws {Error} when no builtin SQLite runtime is available (message names the runtimes).
66
+ */
67
+ function buildKernelIssueDeps(options = {}) {
68
+ const databasePath = resolveKernelDatabasePath(options);
69
+ const runtime = options.runtime
70
+ || selectBuiltinSQLiteRuntime({ requireModule: options.requireModule });
71
+
72
+ const kernelDriver = createBuiltinSQLiteDriver({ databasePath, runtime });
73
+
74
+ return {
75
+ useKernelBroker: true,
76
+ kernelDriver,
77
+ kernelDatabasePath: databasePath,
78
+ gitCommonDir: options.gitCommonDir,
79
+ };
80
+ }
81
+
82
+ /**
83
+ * Run the broker's migrations/pragmas (B2). Idempotent: per-invocation policy —
84
+ * the CLI process is short-lived and `broker.initialize()` swallows
85
+ * duplicate-column DDL, so calling it on every kernel CLI invocation is safe.
86
+ *
87
+ * @param {{ initialize?: Function }} broker
88
+ * @returns {Promise<Object>} the broker.initialize() result.
89
+ * @throws {Error} when the broker cannot be initialized.
90
+ */
91
+ async function ensureKernelMigrated(broker) {
92
+ if (!broker || typeof broker.initialize !== 'function') {
93
+ throw new Error('Cannot initialize kernel broker: broker is missing initialize().');
94
+ }
95
+ return broker.initialize();
96
+ }
97
+
98
+ /**
99
+ * Build the kernel deps AND a migrated broker ready for issue ops. Constructs the
100
+ * driver (B1), builds the broker over it, runs `broker.initialize()` so pragmas +
101
+ * migrations are applied (B2), and returns deps carrying the initialized broker as
102
+ * `kernelBroker` — which `createKernelIssueBackend` (forge-issues.js) uses directly
103
+ * instead of constructing a second broker.
104
+ *
105
+ * @param {Object} options - Same shape as buildKernelIssueDeps.
106
+ * @returns {Promise<{ useKernelBroker: true, kernelBroker: Object, kernelDriver: Object, kernelDatabasePath: string }>}
107
+ */
108
+ async function buildMigratedKernelIssueDeps(options = {}) {
109
+ const deps = buildKernelIssueDeps(options);
110
+ const broker = createLocalBroker({
111
+ projectRoot: options.projectRoot,
112
+ gitCommonDir: options.gitCommonDir,
113
+ databasePath: deps.kernelDatabasePath,
114
+ driver: deps.kernelDriver,
115
+ });
116
+ await ensureKernelMigrated(broker);
117
+ return {
118
+ useKernelBroker: true,
119
+ kernelBroker: broker,
120
+ kernelDriver: deps.kernelDriver,
121
+ kernelDatabasePath: deps.kernelDatabasePath,
122
+ };
123
+ }
124
+
125
+ module.exports = {
126
+ buildKernelIssueDeps,
127
+ buildMigratedKernelIssueDeps,
128
+ ensureKernelMigrated,
129
+ resolveKernelDatabasePath,
130
+ };
@@ -0,0 +1,82 @@
1
+ 'use strict';
2
+
3
+ // Typed conflict-signal classification (issues 89bf8930 / d4ce47bb).
4
+ //
5
+ // The broker used to classify write conflicts by substring-parsing raw SQLite
6
+ // error text (`/UNIQUE constraint failed/`, `kernel_claims.issue_id`, ...) inline.
7
+ // That coupled the broker to one driver's error dialect and was fragile across
8
+ // SQLite versions/runtimes and future backends (libSQL/Turso/CF).
9
+ //
10
+ // This module is the SINGLE place that owns that driver-boundary knowledge. It
11
+ // maps a raw driver/SQLite error into a stable TYPED code; the broker branches on
12
+ // the code and never parses strings. It mirrors the driver's existing structural
13
+ // signal (`error.kernelRevisionConflict`, set by applyAcceptedIssueMutation's
14
+ // row-level CAS) and generalizes it to every conflict class.
15
+ //
16
+ // When a new backend is added, only classifyConflictSignal changes — the broker's
17
+ // branching stays put. A CI integration test (test/kernel/conflict-signal.test.js)
18
+ // provokes real conflicts against the deployed driver and asserts the mapping,
19
+ // converting the standing "error text" assumption into a build-time contract.
20
+
21
+ const CONFLICT_SIGNAL = Object.freeze({
22
+ // Optimistic-CAS lost update: the row-level revision guard matched 0 rows because
23
+ // the entity's revision moved between the evaluator's out-of-transaction pre-read
24
+ // and the serialized commit. Driver-tagged structurally (never string-derived).
25
+ CAS_STALE: 'CAS_STALE',
26
+ // Duplicate idempotency key — a same-key event replay collided on the events
27
+ // UNIQUE(idempotency_key) index. The broker replays the committed winner.
28
+ UNIQUE_IDEMPOTENCY: 'UNIQUE_IDEMPOTENCY',
29
+ // Two active leases raced on one issue: the partial UNIQUE active-lease index
30
+ // (kernel_claims.issue_id WHERE state='active') rejected the second. The broker
31
+ // quarantines it as a claim_conflict.
32
+ UNIQUE_CLAIM_LEASE: 'UNIQUE_CLAIM_LEASE',
33
+ // Transient lock contention (SQLITE_BUSY / "database is locked"). Part of the
34
+ // typed vocabulary; the broker does not currently branch on it (behavior parity).
35
+ BUSY: 'BUSY',
36
+ // Transient table-level lock (SQLITE_LOCKED). Typed for completeness as above.
37
+ LOCKED: 'LOCKED',
38
+ });
39
+
40
+ // Map a raw driver/SQLite error → typed conflict code, or null if it is not a
41
+ // recognized conflict. Precedence: an already-typed signal (driver-supplied or a
42
+ // prior classification) wins over any string inspection, so once the driver tags
43
+ // an error at its boundary this never re-parses text.
44
+ function classifyConflictSignal(error) {
45
+ if (!error) return null;
46
+
47
+ // 1. Already-typed, driver-supplied signals take priority over any string parse.
48
+ if (typeof error === 'object') {
49
+ if (error.conflictSignal && isKnownSignal(error.conflictSignal)) {
50
+ return error.conflictSignal;
51
+ }
52
+ // The driver's row-level CAS backstop tags this structurally.
53
+ if (error.kernelRevisionConflict) return CONFLICT_SIGNAL.CAS_STALE;
54
+ }
55
+
56
+ // 2. Fallback for un-tagged native errors: inspect the driver's error surface.
57
+ // This is the ONLY place any error-text/code inspection is permitted.
58
+ const message = String(error && error.message != null ? error.message : error);
59
+ const code = String((error && error.code) || '');
60
+
61
+ if (/UNIQUE constraint failed/i.test(message)) {
62
+ // Match ONLY the active-lease partial index (kernel_claims.issue_id), not the
63
+ // table PK (kernel_claims.id): a duplicate-id violation is a distinct bug.
64
+ if (/kernel_claims\.issue_id/i.test(message)) return CONFLICT_SIGNAL.UNIQUE_CLAIM_LEASE;
65
+ if (/idempotency_key/i.test(message)) return CONFLICT_SIGNAL.UNIQUE_IDEMPOTENCY;
66
+ return null;
67
+ }
68
+
69
+ if (/^SQLITE_BUSY/i.test(code) || /database is locked/i.test(message)) return CONFLICT_SIGNAL.BUSY;
70
+ if (/^SQLITE_LOCKED/i.test(code) || /database table is locked/i.test(message)) return CONFLICT_SIGNAL.LOCKED;
71
+
72
+ return null;
73
+ }
74
+
75
+ function isKnownSignal(value) {
76
+ return Object.prototype.hasOwnProperty.call(CONFLICT_SIGNAL, value);
77
+ }
78
+
79
+ module.exports = {
80
+ CONFLICT_SIGNAL,
81
+ classifyConflictSignal,
82
+ };
@@ -0,0 +1,195 @@
1
+ 'use strict';
2
+
3
+ function stableStringify(value) {
4
+ if (value === undefined) return '{}';
5
+ if (value === null || typeof value !== 'object') {
6
+ return JSON.stringify(value);
7
+ }
8
+ if (Array.isArray(value)) {
9
+ return `[${value.map(stableStringify).join(',')}]`;
10
+ }
11
+
12
+ return `{${Object.keys(value).sort((left, right) => left.localeCompare(right))
13
+ .map(key => `${JSON.stringify(key)}:${stableStringify(value[key])}`)
14
+ .join(',')}}`;
15
+ }
16
+
17
+ function normalizePayload(event) {
18
+ if (event.payload_json) {
19
+ try {
20
+ return JSON.parse(event.payload_json);
21
+ } catch {
22
+ return event.payload_json;
23
+ }
24
+ }
25
+ return event.payload || {};
26
+ }
27
+
28
+ function payloadJsonFor(event) {
29
+ return stableStringify(normalizePayload(event));
30
+ }
31
+
32
+ function isForgeProjectionEcho(event, entity = {}) {
33
+ if (event.origin !== 'beads_import') return false;
34
+
35
+ const payload = normalizePayload(event);
36
+ const projectionOrigin = payload.projection_origin;
37
+ if (!projectionOrigin || typeof projectionOrigin !== 'object') return false;
38
+ if (projectionOrigin.source !== 'forge-kernel' || projectionOrigin.target !== 'beads') return false;
39
+ if (projectionOrigin.entity_type !== event.entity_type || projectionOrigin.entity_id !== event.entity_id) return false;
40
+ if (!projectionOrigin.payload_hash || projectionOrigin.payload_hash !== projectionOrigin.imported_payload_hash) return false;
41
+ if (!entity || entity.entity_revision === undefined || entity.entity_revision === null) return false;
42
+
43
+ const actualRevision = Number(entity.entity_revision || 0);
44
+ const projectedRevision = Number(projectionOrigin.entity_revision);
45
+ return Number.isFinite(projectedRevision) && projectedRevision === actualRevision;
46
+ }
47
+
48
+ function findOriginalIdempotencyEvent(event, priorEvents = []) {
49
+ return priorEvents.find(priorEvent => priorEvent.idempotency_key === event.idempotency_key);
50
+ }
51
+
52
+ function findEquivalentEvent(event, priorEvents = []) {
53
+ const payloadJson = payloadJsonFor(event);
54
+ return priorEvents.find(priorEvent => (
55
+ priorEvent.idempotency_key !== event.idempotency_key
56
+ && priorEvent.expected_revision !== undefined
57
+ && Number(priorEvent.expected_revision) === Number(event.expected_revision || 0)
58
+ && priorEvent.entity_type === event.entity_type
59
+ && priorEvent.entity_id === event.entity_id
60
+ && priorEvent.event_type === event.event_type
61
+ && payloadJsonFor(priorEvent) === payloadJson
62
+ ));
63
+ }
64
+
65
+ function isBlockingDependency(dependency = {}) {
66
+ return !dependency.dependency_type || dependency.dependency_type === 'blocks';
67
+ }
68
+
69
+ function dependencyCreatesCycle(payload, dependencies = []) {
70
+ const issueId = payload.issue_id;
71
+ const blocksIssueId = payload.blocks_issue_id;
72
+ if (!issueId || !blocksIssueId) return false;
73
+ if (!isBlockingDependency(payload)) return false;
74
+
75
+ const edges = new Map();
76
+ for (const dependency of [...dependencies, { issue_id: issueId, blocks_issue_id: blocksIssueId }].filter(isBlockingDependency)) {
77
+ if (!edges.has(dependency.issue_id)) edges.set(dependency.issue_id, []);
78
+ edges.get(dependency.issue_id).push(dependency.blocks_issue_id);
79
+ }
80
+
81
+ const seen = new Set();
82
+ const stack = [blocksIssueId];
83
+ while (stack.length > 0) {
84
+ const candidate = stack.pop();
85
+ if (candidate === issueId) return true;
86
+ if (seen.has(candidate)) continue;
87
+ seen.add(candidate);
88
+ for (const next of edges.get(candidate) || []) {
89
+ stack.push(next);
90
+ }
91
+ }
92
+
93
+ return false;
94
+ }
95
+
96
+ function buildConflict(event, reason, actualRevision) {
97
+ const payload = normalizePayload(event);
98
+ return {
99
+ entity_type: event.entity_type,
100
+ entity_id: event.entity_id,
101
+ expected_revision: Number(event.expected_revision || 0),
102
+ actual_revision: Number(actualRevision || 0),
103
+ status: 'quarantined',
104
+ reason,
105
+ payload,
106
+ payload_json: stableStringify({
107
+ reason,
108
+ event: {
109
+ entity_type: event.entity_type,
110
+ entity_id: event.entity_id,
111
+ event_type: event.event_type,
112
+ idempotency_key: event.idempotency_key,
113
+ payload,
114
+ },
115
+ }),
116
+ created_at: event.created_at,
117
+ };
118
+ }
119
+
120
+ function evaluateKernelEvent(input = {}) {
121
+ const event = input.event || {};
122
+ if (!event.entity_type) throw new Error('Kernel event entity_type is required');
123
+ if (!event.entity_id) throw new Error('Kernel event entity_id is required');
124
+ if (!event.event_type) throw new Error('Kernel event event_type is required');
125
+ if (!event.idempotency_key) throw new Error('Kernel event idempotency_key is required');
126
+
127
+ const priorEvents = input.priorEvents || [];
128
+ const originalEvent = findOriginalIdempotencyEvent(event, priorEvents);
129
+ if (originalEvent) {
130
+ return {
131
+ decision: 'duplicate',
132
+ reason: 'idempotency_replay',
133
+ originalEvent,
134
+ projection: false,
135
+ };
136
+ }
137
+
138
+ const equivalentEvent = findEquivalentEvent(event, priorEvents);
139
+ if (equivalentEvent) {
140
+ return {
141
+ decision: 'dedupe',
142
+ reason: 'equivalent_write',
143
+ originalEvent: equivalentEvent,
144
+ projection: false,
145
+ };
146
+ }
147
+
148
+ if (isForgeProjectionEcho(event, input.entity)) {
149
+ return {
150
+ decision: 'projection_echo',
151
+ reason: 'forge_projection_echo',
152
+ projection: false,
153
+ };
154
+ }
155
+
156
+ const actualRevision = Number(input.entity?.entity_revision || 0);
157
+ const expectedRevision = Number(event.expected_revision || 0);
158
+ if (expectedRevision !== actualRevision) {
159
+ return {
160
+ decision: 'quarantine',
161
+ reason: 'stale_revision',
162
+ conflict: buildConflict(event, 'stale_revision', actualRevision),
163
+ projection: false,
164
+ };
165
+ }
166
+
167
+ const payload = normalizePayload(event);
168
+ if (event.event_type === 'dependency.add' && dependencyCreatesCycle(payload, input.dependencies || [])) {
169
+ return {
170
+ decision: 'quarantine',
171
+ reason: 'dependency_cycle',
172
+ conflict: buildConflict(event, 'dependency_cycle', actualRevision),
173
+ projection: false,
174
+ };
175
+ }
176
+
177
+ return {
178
+ decision: 'accept',
179
+ reason: 'accepted',
180
+ event: {
181
+ ...event,
182
+ expected_revision: Number(event.expected_revision || 0),
183
+ payload_json: payloadJsonFor(event),
184
+ },
185
+ projection: true,
186
+ };
187
+ }
188
+
189
+ module.exports = {
190
+ buildConflict,
191
+ dependencyCreatesCycle,
192
+ evaluateKernelEvent,
193
+ normalizePayload,
194
+ stableStringify,
195
+ };