forge-workflow 0.0.10 → 0.1.0-beta.3

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 (468) 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 +82 -5
  5. package/.forge/hooks/forge-native-hook.js +431 -0
  6. package/.forge/protected-paths.yaml +157 -0
  7. package/AGENTS.md +151 -61
  8. package/CHANGELOG.md +709 -0
  9. package/CLAUDE.md +9 -118
  10. package/QUICKSTART.md +175 -0
  11. package/README.md +275 -365
  12. package/bin/forge-cmd.js +120 -9
  13. package/bin/forge-preflight.js +26 -5
  14. package/bin/forge.js +532 -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 +121 -0
  29. package/docs/guides/SUPPORT.md +190 -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 +214 -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 +155 -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/activation/ensure-forge-home.js +135 -0
  67. package/lib/adapter-cli.js +307 -0
  68. package/lib/adapters/beads-issue-adapter.js +127 -0
  69. package/lib/adapters/beads-kernel-compat.js +1109 -0
  70. package/lib/adapters/greptile-review-adapter.js +141 -0
  71. package/lib/adapters/kernel-issue-adapter.js +101 -0
  72. package/lib/adapters/pr-state-adapter.js +484 -0
  73. package/lib/adoption-profiles.js +139 -0
  74. package/lib/agents/README.md +2 -6
  75. package/lib/agents/claude.plugin.json +3 -8
  76. package/lib/agents/codex.plugin.json +9 -1
  77. package/lib/agents/cursor.plugin.json +2 -6
  78. package/lib/agents/hermes.plugin.json +22 -0
  79. package/lib/agents-config.js +39 -1236
  80. package/lib/audit-evidence.js +282 -0
  81. package/lib/beads-detect.js +60 -0
  82. package/lib/beads-nudge.js +91 -0
  83. package/lib/beads-setup.js +121 -0
  84. package/lib/beads-sync-scaffold.js +25 -101
  85. package/lib/codex-skills.js +51 -1
  86. package/lib/commands/_aliases.js +248 -0
  87. package/lib/commands/_issue.js +780 -77
  88. package/lib/commands/_manifest.js +93 -0
  89. package/lib/commands/_registry.js +99 -34
  90. package/lib/commands/_resolve-command-opts.js +230 -0
  91. package/lib/commands/_serve-security.js +270 -0
  92. package/lib/commands/adapter.js +12 -0
  93. package/lib/commands/add.js +118 -0
  94. package/lib/commands/audit.js +70 -0
  95. package/lib/commands/blocked.js +5 -0
  96. package/lib/commands/board.js +64 -0
  97. package/lib/commands/claim.js +21 -2
  98. package/lib/commands/claims.js +7 -0
  99. package/lib/commands/clean.js +485 -75
  100. package/lib/commands/close.js +2 -2
  101. package/lib/commands/comment.js +5 -0
  102. package/lib/commands/control.js +148 -0
  103. package/lib/commands/create.js +2 -2
  104. package/lib/commands/dev.js +185 -7
  105. package/lib/commands/doc-gate.js +336 -0
  106. package/lib/commands/doctor.js +156 -0
  107. package/lib/commands/explain.js +15 -0
  108. package/lib/commands/export.js +237 -0
  109. package/lib/commands/gate.js +209 -0
  110. package/lib/commands/hooks.js +377 -0
  111. package/lib/commands/inbox.js +118 -0
  112. package/lib/commands/init.js +604 -0
  113. package/lib/commands/insights.js +79 -0
  114. package/lib/commands/issue.js +12 -1
  115. package/lib/commands/issues.js +17 -0
  116. package/lib/commands/lint.js +5 -0
  117. package/lib/commands/list.js +2 -2
  118. package/lib/commands/memory.js +81 -0
  119. package/lib/commands/merge.js +312 -0
  120. package/lib/commands/migrate.js +362 -0
  121. package/lib/commands/new.js +12 -0
  122. package/lib/commands/options.js +241 -0
  123. package/lib/commands/orient.js +13 -0
  124. package/lib/commands/orphans.js +5 -0
  125. package/lib/commands/patch.js +67 -0
  126. package/lib/commands/plan.js +481 -29
  127. package/lib/commands/pr.js +88 -0
  128. package/lib/commands/preflight.js +211 -0
  129. package/lib/commands/prime.js +13 -0
  130. package/lib/commands/push.js +135 -2
  131. package/lib/commands/ready.js +2 -2
  132. package/lib/commands/recall.js +171 -0
  133. package/lib/commands/recap.js +75 -0
  134. package/lib/commands/recommend.js +0 -1
  135. package/lib/commands/release.js +104 -0
  136. package/lib/commands/remember.js +140 -0
  137. package/lib/commands/role.js +99 -0
  138. package/lib/commands/serve.js +581 -0
  139. package/lib/commands/setup.js +900 -971
  140. package/lib/commands/shepherd.js +501 -0
  141. package/lib/commands/ship.js +59 -1
  142. package/lib/commands/show.js +2 -2
  143. package/lib/commands/stage.js +192 -0
  144. package/lib/commands/stale.js +5 -0
  145. package/lib/commands/status.js +158 -21
  146. package/lib/commands/sync.js +34 -46
  147. package/lib/commands/team.js +4 -1
  148. package/lib/commands/test.js +43 -27
  149. package/lib/commands/update.js +2 -2
  150. package/lib/commands/upgrade.js +47 -0
  151. package/lib/commands/validate.js +43 -18
  152. package/lib/commands/worktree.js +362 -99
  153. package/lib/config-writer.js +202 -0
  154. package/lib/control-plane.js +236 -0
  155. package/lib/core/runtime-graph.js +977 -0
  156. package/lib/dep-guard/keyword-ripple.js +2 -2
  157. package/lib/deprecated-sync-cleanup.js +362 -0
  158. package/lib/detect-agent.js +2 -28
  159. package/lib/detect-worktree.js +35 -9
  160. package/lib/doc-gate/declaration.js +177 -0
  161. package/lib/doc-gate/detect.js +289 -0
  162. package/lib/doc-gate/gate.js +375 -0
  163. package/lib/doc-gate/okf-config.js +128 -0
  164. package/lib/doc-gate/okf.js +429 -0
  165. package/lib/docs-command.js +1161 -6
  166. package/lib/forge-issues.js +382 -11
  167. package/lib/forge-lock.js +262 -0
  168. package/lib/gate-events.js +192 -0
  169. package/lib/global-flags.js +104 -0
  170. package/lib/greptile-match.js +7 -63
  171. package/lib/grounding/context-events.js +230 -0
  172. package/lib/grounding/read-first.js +112 -0
  173. package/lib/harness-capability-matrix.js +380 -0
  174. package/lib/hook-global-installer.js +347 -0
  175. package/lib/hook-renderer.js +541 -0
  176. package/lib/inbox.js +391 -0
  177. package/lib/insights.js +397 -0
  178. package/lib/issue-adapter.js +156 -0
  179. package/lib/issue-backend.js +145 -0
  180. package/lib/issue-render.js +220 -0
  181. package/lib/kernel/backing-issue.js +311 -0
  182. package/lib/kernel/broker.js +1218 -0
  183. package/lib/kernel/cli-broker-factory.js +130 -0
  184. package/lib/kernel/conflict-signal.js +82 -0
  185. package/lib/kernel/evaluators.js +195 -0
  186. package/lib/kernel/fs-class.js +495 -0
  187. package/lib/kernel/issue-command-contract.js +559 -0
  188. package/lib/kernel/issue-id-resolver.js +186 -0
  189. package/lib/kernel/lease-enforcer.js +158 -0
  190. package/lib/kernel/migrations.js +333 -0
  191. package/lib/kernel/owned-kernel.js +43 -0
  192. package/lib/kernel/planning-buckets-schema.js +109 -0
  193. package/lib/kernel/projection-jsonl-writer.js +450 -0
  194. package/lib/kernel/readiness-model.js +329 -0
  195. package/lib/kernel/schema.js +356 -0
  196. package/lib/kernel/sqlite-driver.js +2540 -0
  197. package/lib/kernel/taxonomy-validator.js +394 -0
  198. package/lib/lefthook-check.js +3 -2
  199. package/lib/lefthook-wiring.js +413 -0
  200. package/lib/mcp-config-renderer.js +288 -0
  201. package/lib/memory/graphiti-mcp.js +106 -0
  202. package/lib/memory/router.js +387 -0
  203. package/lib/memory/typed-api.js +102 -0
  204. package/lib/memory-digest.js +195 -0
  205. package/lib/merge-rules.js +395 -0
  206. package/lib/migrate-dry-run.js +466 -0
  207. package/lib/orientation.js +863 -0
  208. package/lib/package-manager-remediation.js +103 -0
  209. package/lib/package-root.js +381 -0
  210. package/lib/patch-intent.js +890 -0
  211. package/lib/plugin-catalog.js +3 -4
  212. package/lib/plugin-manager.js +0 -5
  213. package/lib/pr-bundle.js +186 -0
  214. package/lib/pr-monitor/auto-actions.js +175 -0
  215. package/lib/pr-monitor/differ.js +195 -0
  216. package/lib/pr-monitor/digest.js +206 -0
  217. package/lib/pr-monitor/events.js +0 -0
  218. package/lib/pr-monitor/gather.js +124 -0
  219. package/lib/pr-monitor/journal.js +299 -0
  220. package/lib/pr-monitor/monitor.js +146 -0
  221. package/lib/pr-monitor/render-sticky.js +192 -0
  222. package/lib/pr-monitor/upsert-sticky.js +169 -0
  223. package/lib/pr-monitor/watch-lifecycle.js +95 -0
  224. package/lib/pr-monitor/watch.js +247 -0
  225. package/lib/pr-pull.js +1314 -0
  226. package/lib/pr-shepherd.js +494 -0
  227. package/lib/pr-state-validator.js +59 -0
  228. package/lib/preflight/gates.js +237 -0
  229. package/lib/preflight/runner.js +116 -0
  230. package/lib/project-discovery.js +0 -53
  231. package/lib/project-memory.js +99 -497
  232. package/lib/protected-path-manifest.js +281 -0
  233. package/lib/protected-state-surfaces.js +387 -0
  234. package/lib/release-readiness.js +2105 -0
  235. package/lib/reset.js +59 -45
  236. package/lib/review-adapter.js +68 -0
  237. package/lib/rules-sync.js +260 -0
  238. package/lib/runtime-health.js +241 -20
  239. package/lib/safety-config-renderer.js +268 -0
  240. package/lib/setup-action-log.js +1 -7
  241. package/lib/setup.js +27 -65
  242. package/lib/shell-utils.js +76 -6
  243. package/lib/skills-sync.js +330 -0
  244. package/lib/smart-status/scoring.js +17 -3
  245. package/lib/status/beads-snapshot.js +45 -2
  246. package/lib/status/presenter.js +169 -18
  247. package/lib/status/snapshot.js +186 -0
  248. package/lib/sync-backend.js +202 -0
  249. package/lib/untrusted-content.js +52 -0
  250. package/lib/upgrade-safety.js +251 -0
  251. package/lib/workflow/enforce-stage.js +351 -45
  252. package/lib/workflow/stage-transition.js +115 -0
  253. package/lib/workflow/stages.js +30 -6
  254. package/lib/workflow/state-manager.js +11 -22
  255. package/lib/workflow/state.js +23 -1
  256. package/lib/workflow-profiles.js +17 -5
  257. package/package.json +37 -35
  258. package/rules/documentation.md +19 -0
  259. package/rules/kernel-tracking.md +26 -0
  260. package/rules/security.md +22 -0
  261. package/rules/tdd.md +20 -0
  262. package/rules/workflow.md +27 -0
  263. package/scripts/auto-backing-issue.js +47 -0
  264. package/scripts/beads-context.sh +81 -57
  265. package/scripts/beads-upgrade-smoke.sh +24 -3
  266. package/scripts/bootstrap-windows-tools.sh +78 -0
  267. package/scripts/branch-protection.js +2 -3
  268. package/scripts/check-agents.js +34 -137
  269. package/scripts/commitlint.js +3 -1
  270. package/scripts/conflict-detect.sh +3 -0
  271. package/scripts/dep-guard.sh +22 -3
  272. package/scripts/file-index.sh +3 -0
  273. package/scripts/forge-team/lib/claim.sh +34 -18
  274. package/scripts/forge-team/lib/dashboard.sh +61 -86
  275. package/scripts/forge-team/lib/epic.sh +99 -263
  276. package/scripts/forge-team/lib/hooks.sh +26 -28
  277. package/scripts/forge-team/lib/identity.sh +4 -4
  278. package/scripts/forge-team/lib/sync-github.sh +49 -84
  279. package/scripts/forge-team/lib/verify.sh +93 -83
  280. package/scripts/forge-team/lib/workload.sh +41 -65
  281. package/scripts/forge-team/tests/claim.test.sh +25 -19
  282. package/scripts/forge-team/tests/dashboard.test.sh +31 -46
  283. package/scripts/forge-team/tests/epic.test.sh +52 -71
  284. package/scripts/forge-team/tests/hooks.test.sh +38 -50
  285. package/scripts/forge-team/tests/identity.test.sh +3 -3
  286. package/scripts/forge-team/tests/integration.test.sh +44 -66
  287. package/scripts/forge-team/tests/sync-github.test.sh +50 -83
  288. package/scripts/forge-team/tests/verify.test.sh +37 -46
  289. package/scripts/forge-team/tests/workflow-integration.test.sh +4 -4
  290. package/scripts/forge-team/tests/workload.test.sh +32 -66
  291. package/scripts/gen-command-manifest.js +153 -0
  292. package/scripts/gen-embedded-assets.mjs +129 -0
  293. package/scripts/install.ps1 +139 -0
  294. package/scripts/install.sh +268 -0
  295. package/scripts/lib/release-asset.mjs +84 -0
  296. package/scripts/parity-check.mjs +145 -0
  297. package/scripts/parity-check.test.mjs +58 -0
  298. package/scripts/pin-agentic-workflow-images.js +112 -0
  299. package/scripts/pr-auto-actions.js +93 -0
  300. package/scripts/pr-coordinator.sh +3 -0
  301. package/scripts/pr-verdict-label.js +50 -0
  302. package/scripts/preflight-sonar.eslint.config.mjs +44 -0
  303. package/scripts/preflight.sh +21 -94
  304. package/scripts/protected-state-check.js +104 -0
  305. package/scripts/smart-status.sh +60 -57
  306. package/scripts/spikes/config-race-bench.js +111 -0
  307. package/scripts/spikes/harness-capability-matrix.js +13 -0
  308. package/scripts/spikes/patch-anchor-stability-bench.js +125 -0
  309. package/scripts/spikes/protected-path-manifest.js +20 -0
  310. package/scripts/spikes/skill-auto-invoke-parity.js +292 -0
  311. package/scripts/sync-agent-skills.js +62 -0
  312. package/scripts/sync-utils.sh +3 -0
  313. package/scripts/test-ci-shard.js +13 -6
  314. package/scripts/test.js +95 -12
  315. package/skills/claim-safety/SKILL.md +102 -0
  316. package/skills/claim-safety/evals/evals.json +46 -0
  317. package/{.github/prompts/dev.prompt.md → skills/dev/SKILL.md} +44 -50
  318. package/skills/dev/evals/evals.json +50 -0
  319. package/skills/hermes-forge/SKILL.md +185 -0
  320. package/skills/hermes-forge/evals/evals.json +46 -0
  321. package/skills/issue-basics/SKILL.md +111 -0
  322. package/skills/issue-basics/evals/evals.json +46 -0
  323. package/skills/kernel/SKILL.md +166 -0
  324. package/skills/kernel/evals/evals.json +50 -0
  325. package/skills/memory/SKILL.md +102 -0
  326. package/skills/parallel-deep-research/SKILL.md +14 -11
  327. package/skills/parallel-deep-research/evals/evals.json +11 -27
  328. package/{.github/prompts/plan.prompt.md → skills/plan/SKILL.md} +132 -157
  329. package/skills/plan/evals/evals.json +42 -0
  330. package/skills/research/SKILL.md +195 -0
  331. package/skills/research/evals/evals.json +42 -0
  332. package/{.github/prompts/review.prompt.md → skills/review/SKILL.md} +98 -62
  333. package/skills/review/evals/evals.json +42 -0
  334. package/skills/rollback/SKILL.md +110 -0
  335. package/skills/rollback/evals/evals.json +46 -0
  336. package/skills/rollback/references/methods.md +204 -0
  337. package/{.cursor/commands/rollback.md → skills/rollback/references/workflow-integration.md} +10 -284
  338. package/skills/shepherd/SKILL.md +66 -0
  339. package/skills/shepherd/evals/evals.json +42 -0
  340. package/{.github/prompts/ship.prompt.md → skills/ship/SKILL.md} +81 -45
  341. package/skills/ship/evals/evals.json +42 -0
  342. package/skills/smith/SKILL.md +142 -0
  343. package/skills/smith/evals/evals.json +46 -0
  344. package/skills/smith/references/autonomy-and-gates.md +94 -0
  345. package/{.github/prompts/sonarcloud.prompt.md → skills/sonarcloud/SKILL.md} +14 -3
  346. package/skills/sonarcloud/evals/evals.json +46 -0
  347. package/skills/sonarcloud-analysis/SKILL.md +18 -13
  348. package/skills/sonarcloud-analysis/evals/evals.json +11 -15
  349. package/{.github/prompts/status.prompt.md → skills/status/SKILL.md} +20 -10
  350. package/skills/status/evals/evals.json +50 -0
  351. package/skills/triage-ready/SKILL.md +121 -0
  352. package/skills/triage-ready/evals/evals.json +42 -0
  353. package/{.github/prompts/validate.prompt.md → skills/validate/SKILL.md} +52 -29
  354. package/skills/validate/evals/evals.json +42 -0
  355. package/skills/verify/SKILL.md +299 -0
  356. package/skills/verify/evals/evals.json +50 -0
  357. package/.claude/commands/dev.md +0 -345
  358. package/.claude/commands/plan.md +0 -566
  359. package/.claude/commands/premerge.md +0 -186
  360. package/.claude/commands/research.md +0 -42
  361. package/.claude/commands/review.md +0 -451
  362. package/.claude/commands/rollback.md +0 -721
  363. package/.claude/commands/ship.md +0 -213
  364. package/.claude/commands/sonarcloud.md +0 -152
  365. package/.claude/commands/status.md +0 -90
  366. package/.claude/commands/validate.md +0 -288
  367. package/.claude/commands/verify.md +0 -269
  368. package/.claude/rules/workflow.md +0 -121
  369. package/.cline/workflows/dev.md +0 -342
  370. package/.cline/workflows/plan.md +0 -563
  371. package/.cline/workflows/premerge.md +0 -183
  372. package/.cline/workflows/research.md +0 -39
  373. package/.cline/workflows/review.md +0 -448
  374. package/.cline/workflows/rollback.md +0 -718
  375. package/.cline/workflows/ship.md +0 -210
  376. package/.cline/workflows/sonarcloud.md +0 -146
  377. package/.cline/workflows/status.md +0 -87
  378. package/.cline/workflows/validate.md +0 -285
  379. package/.cline/workflows/verify.md +0 -266
  380. package/.codex/config.toml +0 -11
  381. package/.codex/skills/dev/SKILL.md +0 -345
  382. package/.codex/skills/plan/SKILL.md +0 -566
  383. package/.codex/skills/premerge/SKILL.md +0 -186
  384. package/.codex/skills/research/SKILL.md +0 -42
  385. package/.codex/skills/review/SKILL.md +0 -451
  386. package/.codex/skills/rollback/SKILL.md +0 -721
  387. package/.codex/skills/ship/SKILL.md +0 -213
  388. package/.codex/skills/sonarcloud/SKILL.md +0 -149
  389. package/.codex/skills/status/SKILL.md +0 -90
  390. package/.codex/skills/validate/SKILL.md +0 -288
  391. package/.codex/skills/verify/SKILL.md +0 -269
  392. package/.cursor/commands/dev.md +0 -342
  393. package/.cursor/commands/plan.md +0 -563
  394. package/.cursor/commands/premerge.md +0 -183
  395. package/.cursor/commands/research.md +0 -39
  396. package/.cursor/commands/review.md +0 -448
  397. package/.cursor/commands/ship.md +0 -210
  398. package/.cursor/commands/sonarcloud.md +0 -146
  399. package/.cursor/commands/status.md +0 -87
  400. package/.cursor/commands/validate.md +0 -285
  401. package/.cursor/commands/verify.md +0 -266
  402. package/.cursorrules +0 -149
  403. package/.github/prompts/premerge.prompt.md +0 -188
  404. package/.github/prompts/research.prompt.md +0 -44
  405. package/.github/prompts/rollback.prompt.md +0 -723
  406. package/.github/prompts/verify.prompt.md +0 -271
  407. package/.github/workflows/beads-to-github.yml +0 -89
  408. package/.github/workflows/github-to-beads.yml +0 -100
  409. package/.kilocode/workflows/dev.md +0 -346
  410. package/.kilocode/workflows/plan.md +0 -567
  411. package/.kilocode/workflows/premerge.md +0 -187
  412. package/.kilocode/workflows/research.md +0 -43
  413. package/.kilocode/workflows/review.md +0 -452
  414. package/.kilocode/workflows/rollback.md +0 -722
  415. package/.kilocode/workflows/ship.md +0 -214
  416. package/.kilocode/workflows/sonarcloud.md +0 -150
  417. package/.kilocode/workflows/status.md +0 -91
  418. package/.kilocode/workflows/validate.md +0 -289
  419. package/.kilocode/workflows/verify.md +0 -270
  420. package/.opencode/commands/dev.md +0 -345
  421. package/.opencode/commands/plan.md +0 -566
  422. package/.opencode/commands/premerge.md +0 -186
  423. package/.opencode/commands/research.md +0 -42
  424. package/.opencode/commands/review.md +0 -451
  425. package/.opencode/commands/rollback.md +0 -721
  426. package/.opencode/commands/ship.md +0 -213
  427. package/.opencode/commands/sonarcloud.md +0 -149
  428. package/.opencode/commands/status.md +0 -90
  429. package/.opencode/commands/validate.md +0 -288
  430. package/.opencode/commands/verify.md +0 -269
  431. package/.roo/commands/dev.md +0 -346
  432. package/.roo/commands/plan.md +0 -567
  433. package/.roo/commands/premerge.md +0 -187
  434. package/.roo/commands/research.md +0 -43
  435. package/.roo/commands/review.md +0 -452
  436. package/.roo/commands/rollback.md +0 -722
  437. package/.roo/commands/ship.md +0 -214
  438. package/.roo/commands/sonarcloud.md +0 -150
  439. package/.roo/commands/status.md +0 -91
  440. package/.roo/commands/validate.md +0 -289
  441. package/.roo/commands/verify.md +0 -270
  442. package/docs/BEADS_GITHUB_SYNC.md +0 -281
  443. package/docs/GREPTILE_SETUP.md +0 -400
  444. package/docs/MANUAL_REVIEW_GUIDE.md +0 -106
  445. package/docs/SETUP.md +0 -663
  446. package/docs/VALIDATION.md +0 -363
  447. package/lib/agents/cline.plugin.json +0 -29
  448. package/lib/agents/copilot.plugin.json +0 -24
  449. package/lib/agents/kilocode.plugin.json +0 -22
  450. package/lib/agents/opencode.plugin.json +0 -23
  451. package/lib/agents/roo.plugin.json +0 -30
  452. package/lib/beads-bootstrap.js +0 -225
  453. package/lib/beads-health-check.js +0 -188
  454. package/lib/commands/commands-reset.js +0 -147
  455. package/opencode.json +0 -67
  456. package/scripts/beads-context.test.js +0 -584
  457. package/scripts/github-beads-sync/comment.mjs +0 -64
  458. package/scripts/github-beads-sync/config.mjs +0 -148
  459. package/scripts/github-beads-sync/github-api.mjs +0 -131
  460. package/scripts/github-beads-sync/index.mjs +0 -356
  461. package/scripts/github-beads-sync/label-mapper.mjs +0 -54
  462. package/scripts/github-beads-sync/mapping.mjs +0 -132
  463. package/scripts/github-beads-sync/reverse-sync-cli.mjs +0 -31
  464. package/scripts/github-beads-sync/reverse-sync.mjs +0 -162
  465. package/scripts/github-beads-sync/run-bd.mjs +0 -161
  466. package/scripts/github-beads-sync/sanitize.mjs +0 -121
  467. package/scripts/github-beads-sync.config.json +0 -26
  468. 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
+ };