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
@@ -7,53 +7,38 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
7
7
  TEST_TMP="$(mktemp -d)"
8
8
  trap 'rm -rf "$TEST_TMP"' EXIT
9
9
 
10
- # ── Create mock bd ───────────────────────────────────────────────────────
10
+ # ── Create mock forge ─────────────────────────────────────────────────────
11
+ # Emits Kernel-shaped JSON ({"data":{"issues":[...]}}) for `issue list`.
11
12
  mock_dir="$(mktemp -d)"
12
13
 
13
- cat > "$mock_dir/bd" << 'MOCK'
14
+ cat > "$mock_dir/forge" << 'MOCK'
14
15
  #!/usr/bin/env bash
15
- case "$1" in
16
- list)
17
- if echo "$*" | grep -q -- "--status=open,in_progress"; then
18
- if [[ -n "${BD_MOCK_EMPTY:-}" ]]; then
19
- # No output for empty test
20
- :
21
- elif [[ -n "${BD_MOCK_SINGLE:-}" ]]; then
22
- echo "forge-aaa · Feature A"
23
- else
24
- echo " forge-aaa · Feature A"
25
- echo "○ forge-bbb · Feature B"
26
- echo "◐ forge-ccc · Feature C"
27
- fi
28
- fi
29
- ;;
30
- show)
31
- case "$2" in
32
- forge-aaa)
33
- echo "◐ forge-aaa · Feature A [● P2 · IN_PROGRESS]"
34
- echo "Owner: devone"
35
- echo "Updated: 2026-03-27T10:00:00Z"
36
- ;;
37
- forge-bbb)
38
- echo "○ forge-bbb · Feature B [● P2 · OPEN]"
39
- echo "Owner: devtwo"
40
- echo "Updated: 2026-03-24T10:00:00Z"
41
- ;;
42
- forge-ccc)
43
- echo "◐ forge-ccc · Feature C [● P1 · IN_PROGRESS]"
44
- echo "Owner: devone"
45
- echo "Updated: 2026-03-27T09:00:00Z"
46
- echo ""
47
- echo "DEPENDS ON"
48
- echo " → ◐ forge-aaa: Feature A"
49
- ;;
50
- esac
51
- ;;
52
- esac
16
+ args="$*"
17
+ emit() { printf '{"data":{"issues":%s}}\n' "$1"; }
18
+
19
+ # forge-aaa BLOCKS forge-ccc (kernel: blocker carries the dependency edge), so
20
+ # forge-ccc is the blocked one — its blocked_by resolves to forge-aaa via reverse scan.
21
+ aaa='{"id":"forge-aaa","title":"Feature A","status":"in_progress","assignee":"devone","updated_at":"2026-03-27T10:00:00Z","dependencies":["forge-ccc"]}'
22
+ bbb='{"id":"forge-bbb","title":"Feature B","status":"open","assignee":"devtwo","updated_at":"2026-03-24T10:00:00Z","dependencies":[]}'
23
+ ccc='{"id":"forge-ccc","title":"Feature C","status":"in_progress","assignee":"devone","updated_at":"2026-03-27T09:00:00Z","dependencies":[]}'
24
+
25
+ if [[ "$args" == *"issue list"* ]]; then
26
+ if [[ -n "${FORGE_MOCK_EMPTY:-}" ]]; then
27
+ emit "[]"
28
+ elif [[ -n "${FORGE_MOCK_SINGLE:-}" ]]; then
29
+ if [[ "$args" == *"--status=in_progress"* ]]; then emit "[$aaa]"; else emit "[]"; fi
30
+ else
31
+ if [[ "$args" == *"--status=open"* ]]; then emit "[$bbb]"
32
+ elif [[ "$args" == *"--status=in_progress"* ]]; then emit "[$aaa,$ccc]"
33
+ else emit "[]"; fi
34
+ fi
35
+ exit 0
36
+ fi
37
+ exit 0
53
38
  MOCK
54
- chmod +x "$mock_dir/bd"
39
+ chmod +x "$mock_dir/forge"
55
40
 
56
- export BD_CMD="$mock_dir/bd"
41
+ export FORGE_CMD="$mock_dir/forge"
57
42
 
58
43
  # Source the library under test
59
44
  source "$SCRIPT_DIR/lib/dashboard.sh"
@@ -132,24 +117,24 @@ assert_contains "blocked shows dependency" "forge-aaa" "$output"
132
117
  echo ""
133
118
  echo "── Test 4: No issues → clear message ──"
134
119
 
135
- export BD_MOCK_EMPTY=1
120
+ export FORGE_MOCK_EMPTY=1
136
121
  rc=0
137
122
  output_empty="$(cmd_dashboard 2>&1)" || rc=$?
138
123
  assert_exit "empty dashboard exits 0" 0 "$rc"
139
124
  assert_contains "shows no active issues" "No active issues" "$output_empty"
140
- unset BD_MOCK_EMPTY
125
+ unset FORGE_MOCK_EMPTY
141
126
 
142
127
  # ── Test 5: Single developer → works correctly ──────────────────────────
143
128
  echo ""
144
129
  echo "── Test 5: Single developer ──"
145
130
 
146
- export BD_MOCK_SINGLE=1
131
+ export FORGE_MOCK_SINGLE=1
147
132
  rc=0
148
133
  output_single="$(cmd_dashboard 2>&1)" || rc=$?
149
134
  assert_exit "single dev dashboard exits 0" 0 "$rc"
150
135
  assert_contains "shows devone" "devone" "$output_single"
151
136
  assert_not_contains "no devtwo in single mode" "devtwo" "$output_single"
152
- unset BD_MOCK_SINGLE
137
+ unset FORGE_MOCK_SINGLE
153
138
 
154
139
  # ── Test 6: --format=json → valid JSON ──────────────────────────────────
155
140
  echo ""
@@ -7,74 +7,45 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
7
7
  TEST_TMP="$(mktemp -d)"
8
8
  trap 'rm -rf "$TEST_TMP"' EXIT
9
9
 
10
- # ── Create mock bd ───────────────────────────────────────────────────────
10
+ # ── Create mock forge ────────────────────────────────────────────────────
11
+ # Only handles `forge issue children <id> --json`, emitting the kernel
12
+ # issue-command-contract envelope ({schema_version,command,data:{epic,children,
13
+ # rollup,count},next_commands}). An unknown id mirrors the kernel not-found path:
14
+ # error on stderr, empty stdout, non-zero exit.
11
15
  mock_dir="$(mktemp -d)"
12
16
 
13
- cat > "$mock_dir/bd" << 'MOCK'
17
+ cat > "$mock_dir/forge" << 'MOCK'
14
18
  #!/usr/bin/env bash
15
- case "$1 $2" in
16
- "show forge-epic1")
17
- cat << 'SHOW'
18
- forge-epic1 · Test Epic [● P2 · IN_PROGRESS]
19
- Owner: devone
20
-
21
- BLOCKS
22
- ← ✓ forge-child1: Child 1 (closed)
23
- ← ◐ forge-child2: Child 2 (in_progress)
24
- forge-child3: Child 3 (open)
25
- SHOW
26
- ;;
27
- "show forge-child1")
28
- echo "✓ forge-child1 · Child 1 [● P2 · CLOSED]"
29
- echo "Owner: devone"
30
- ;;
31
- "show forge-child2")
32
- echo "◐ forge-child2 · Child 2 [● P2 · IN_PROGRESS]"
33
- echo "Owner: devtwo"
34
- ;;
35
- "show forge-child3")
36
- echo "○ forge-child3 · Child 3 [● P3 · OPEN]"
37
- echo "Owner: devone"
38
- ;;
39
- "show forge-empty")
40
- cat << 'SHOW'
41
- ○ forge-empty · Empty Epic [● P2 · OPEN]
42
- Owner: devone
43
- SHOW
44
- ;;
45
- "show forge-blocked")
46
- cat << 'SHOW'
47
- ◐ forge-blocked · Blocked Epic [● P2 · IN_PROGRESS]
48
- Owner: devone
49
-
50
- BLOCKS
51
- ← ✓ forge-bchild1: Bchild 1 (closed)
52
- ← ◐ forge-bchild2: Bchild 2 (in_progress)
53
- ← ○ forge-bchild3: Bchild 3 (open)
54
- SHOW
55
- ;;
56
- "show forge-bchild1")
57
- echo "✓ forge-bchild1 · Bchild 1 [● P2 · CLOSED]"
58
- echo "Owner: devone"
59
- ;;
60
- "show forge-bchild2")
61
- cat << 'SHOW'
62
- ◐ forge-bchild2 · Bchild 2 [● P2 · IN_PROGRESS]
63
- Owner: devtwo
64
-
65
- BLOCKED_BY
66
- → forge-bchild1: Bchild 1
67
- SHOW
68
- ;;
69
- "show forge-bchild3")
70
- echo "○ forge-bchild3 · Bchild 3 [● P3 · OPEN]"
71
- echo "Owner: devone"
72
- ;;
73
- esac
19
+ if [[ "$1" == "issue" && "$2" == "children" ]]; then
20
+ id="$3"
21
+ case "$id" in
22
+ forge-epic1)
23
+ cat << 'JSON'
24
+ {"schema_version":"forge.issue.v1","command":"issue.children","data":{"epic":{"id":"forge-epic1","title":"Test Epic","type":"epic","status":"in_progress"},"children":[{"id":"forge-child1","title":"Child 1","status":"done","assignee":"devone","blocked":false,"blocked_by":[],"dependencies":[],"dependents":[]},{"id":"forge-child2","title":"Child 2","status":"in_progress","assignee":"devtwo","blocked":false,"blocked_by":[],"dependencies":[],"dependents":[]},{"id":"forge-child3","title":"Child 3","status":"open","assignee":"devone","blocked":false,"blocked_by":[],"dependencies":[],"dependents":[]}],"rollup":{"total":3,"done":1,"in_progress":1,"open":1,"review":0,"cancelled":0,"blocked":0,"percentage":33,"by_status":{"open":1,"in_progress":1,"review":0,"done":1,"cancelled":0}},"count":3},"next_commands":[]}
25
+ JSON
26
+ ;;
27
+ forge-empty)
28
+ cat << 'JSON'
29
+ {"schema_version":"forge.issue.v1","command":"issue.children","data":{"epic":{"id":"forge-empty","title":"Empty Epic","type":"epic","status":"open"},"children":[],"rollup":{"total":0,"done":0,"in_progress":0,"open":0,"review":0,"cancelled":0,"blocked":0,"percentage":0,"by_status":{"open":0,"in_progress":0,"review":0,"done":0,"cancelled":0}},"count":0},"next_commands":[]}
30
+ JSON
31
+ ;;
32
+ forge-blocked)
33
+ cat << 'JSON'
34
+ {"schema_version":"forge.issue.v1","command":"issue.children","data":{"epic":{"id":"forge-blocked","title":"Blocked Epic","type":"epic","status":"in_progress"},"children":[{"id":"forge-bchild1","title":"Bchild 1","status":"done","assignee":"devone","blocked":false,"blocked_by":[],"dependencies":[],"dependents":["forge-bchild2"]},{"id":"forge-bchild2","title":"Bchild 2","status":"in_progress","assignee":"devtwo","blocked":true,"blocked_by":["forge-bchild1"],"dependencies":["forge-bchild1"],"dependents":[]},{"id":"forge-bchild3","title":"Bchild 3","status":"open","assignee":"devone","blocked":false,"blocked_by":[],"dependencies":[],"dependents":[]}],"rollup":{"total":3,"done":1,"in_progress":1,"open":1,"review":0,"cancelled":0,"blocked":1,"percentage":33,"by_status":{"open":1,"in_progress":1,"review":0,"done":1,"cancelled":0}},"count":3},"next_commands":[]}
35
+ JSON
36
+ ;;
37
+ *)
38
+ echo "Issue $id not found" >&2
39
+ exit 1
40
+ ;;
41
+ esac
42
+ exit 0
43
+ fi
44
+ exit 1
74
45
  MOCK
75
- chmod +x "$mock_dir/bd"
46
+ chmod +x "$mock_dir/forge"
76
47
 
77
- export BD_CMD="$mock_dir/bd"
48
+ export FORGE_CMD="$mock_dir/forge"
78
49
 
79
50
  # Source the library under test
80
51
  source "$SCRIPT_DIR/lib/epic.sh"
@@ -116,7 +87,7 @@ output="$(cmd_epic "forge-epic1" 2>&1)" || rc=$?
116
87
  assert_exit "exits 0" 0 "$rc"
117
88
  assert_contains "shows epic id" "forge-epic1" "$output"
118
89
  assert_contains "progress shows 1/3" "1/3" "$output"
119
- assert_contains "shows closed child marker" "forge-child1" "$output"
90
+ assert_contains "shows done child marker" "forge-child1" "$output"
120
91
  assert_contains "shows in_progress child" "forge-child2" "$output"
121
92
  assert_contains "shows open child" "forge-child3" "$output"
122
93
 
@@ -145,13 +116,14 @@ echo "── Test 5: --format=json ──"
145
116
  rc=0
146
117
  output_json="$(cmd_epic "forge-epic1" "--format=json" 2>&1)" || rc=$?
147
118
  assert_exit "json exits 0" 0 "$rc"
148
- # Validate it's actual JSON (check for opening brace and key fields)
149
- assert_contains "json has epic_id" "epic_id" "$output_json"
150
- assert_contains "json has total" "total" "$output_json"
151
- assert_contains "json has done" "done" "$output_json"
152
- assert_contains "json has percentage" "percentage" "$output_json"
153
- assert_contains "json has children" "children" "$output_json"
154
- assert_contains "json has by_developer" "by_developer" "$output_json"
119
+ # Validate it parses as JSON and carries the expected fields/values.
120
+ assert_eq "json total is 3" "3" "$(printf '%s' "$output_json" | jq -r '.total')"
121
+ assert_eq "json done is 1" "1" "$(printf '%s' "$output_json" | jq -r '.done')"
122
+ assert_eq "json percentage is 33" "33" "$(printf '%s' "$output_json" | jq -r '.percentage')"
123
+ assert_eq "json has 3 children" "3" "$(printf '%s' "$output_json" | jq -r '.children | length')"
124
+ assert_eq "json by_developer devone total 2" "2" "$(printf '%s' "$output_json" | jq -r '.by_developer.devone.total')"
125
+ assert_eq "json by_developer devone done 1" "1" "$(printf '%s' "$output_json" | jq -r '.by_developer.devone.done')"
126
+ assert_eq "json epic_id" "forge-epic1" "$(printf '%s' "$output_json" | jq -r '.epic_id')"
155
127
 
156
128
  # ── Test 6: Missing issue-id → error ────────────────────────────────────
157
129
  echo ""
@@ -169,6 +141,15 @@ output_blocked="$(cmd_epic "forge-blocked" 2>&1)" || rc=$?
169
141
  assert_exit "blocked epic exits 0" 0 "$rc"
170
142
  assert_contains "blocked section present" "Blocked" "$output_blocked"
171
143
  assert_contains "blocked child mentioned" "forge-bchild2" "$output_blocked"
144
+ assert_contains "blocked-by id mentioned" "forge-bchild1" "$output_blocked"
145
+
146
+ # ── Test 8: Unknown epic id → not-found error ────────────────────────────
147
+ echo ""
148
+ echo "── Test 8: Unknown epic id ──"
149
+ rc=0
150
+ output_unknown="$(cmd_epic "forge-nope" 2>&1)" || rc=$?
151
+ assert_exit "unknown id returns 1" 1 "$rc"
152
+ assert_contains "error about fetch" "Could not fetch" "$output_unknown"
172
153
 
173
154
  # ── Results ──────────────────────────────────────────────────────────────
174
155
  echo ""
@@ -37,71 +37,59 @@ esac
37
37
  MOCK
38
38
  chmod +x "$mock_dir/gh-noauth"
39
39
 
40
- # ── Create mock bd (with in_progress issues having github_issue state) ──
41
- cat > "$mock_dir/bd" << 'MOCK'
40
+ # ── Create mock forge (in_progress issues carry github_issue:<n> labels) ──
41
+ # `issue list --json` exposes labels; sync_issue_status re-reads `issue show`.
42
+ cat > "$mock_dir/forge" << 'MOCK'
42
43
  #!/usr/bin/env bash
43
44
  case "$1 $2" in
44
- "list --status=in_progress")
45
- echo "forge-aaa · Feature A"
46
- echo "◐ forge-bbb · Feature B"
45
+ "issue list")
46
+ printf '{"data":{"issues":[{"id":"forge-aaa","status":"in_progress","labels":["github_issue:42"]},{"id":"forge-bbb","status":"in_progress","labels":["github_issue:55"]}]}}\n'
47
47
  ;;
48
- "show forge-aaa")
49
- echo " forge-aaa · Feature A [● P2 · IN_PROGRESS]"
50
- echo "Owner: devone"
51
- echo "Updated: 2026-03-27T10:00:00Z"
52
- echo ""
53
- echo "STATE"
54
- echo " github_issue:42"
55
- ;;
56
- "show forge-bbb")
57
- echo "◐ forge-bbb · Feature B [● P2 · IN_PROGRESS]"
58
- echo "Owner: devtwo"
59
- echo "Updated: 2026-03-27T09:00:00Z"
60
- echo ""
61
- echo "STATE"
62
- echo " github_issue:55"
48
+ "issue show")
49
+ case "$3" in
50
+ forge-aaa) printf '{"data":{"issue":{"id":"forge-aaa","title":"Feature A","labels":["github_issue:42"]}}}\n' ;;
51
+ forge-bbb) printf '{"data":{"issue":{"id":"forge-bbb","title":"Feature B","labels":["github_issue:55"]}}}\n' ;;
52
+ *) printf '{"data":{"issue":{"id":"%s","title":"","labels":[]}}}\n' "$3" ;;
53
+ esac
63
54
  ;;
55
+ "issue update") echo "Updated" ;;
64
56
  esac
65
57
  MOCK
66
- chmod +x "$mock_dir/bd"
58
+ chmod +x "$mock_dir/forge"
67
59
 
68
- # ── Create mock bd (no in_progress issues) ──────────────────────────────
69
- cat > "$mock_dir/bd-empty" << 'MOCK'
60
+ # ── Create mock forge (no in_progress issues) ───────────────────────────
61
+ cat > "$mock_dir/forge-empty" << 'MOCK'
70
62
  #!/usr/bin/env bash
71
63
  case "$1 $2" in
72
- "list --status=in_progress")
73
- echo ""
74
- ;;
64
+ "issue list") printf '{"data":{"issues":[]}}\n' ;;
75
65
  esac
76
66
  MOCK
77
- chmod +x "$mock_dir/bd-empty"
67
+ chmod +x "$mock_dir/forge-empty"
78
68
 
79
- # ── Create mock bd (issue without github_issue state) ───────────────────
80
- cat > "$mock_dir/bd-no-gh" << 'MOCK'
69
+ # ── Create mock forge (issue without a github_issue label) ──────────────
70
+ cat > "$mock_dir/forge-no-gh" << 'MOCK'
81
71
  #!/usr/bin/env bash
82
72
  case "$1 $2" in
83
- "list --status=in_progress")
84
- echo "forge-xxx · Feature X"
73
+ "issue list")
74
+ printf '{"data":{"issues":[{"id":"forge-xxx","status":"in_progress","labels":[]}]}}\n'
85
75
  ;;
86
- "show forge-xxx")
87
- echo "forge-xxx · Feature X [● P2 · IN_PROGRESS]"
88
- echo "Owner: devone"
89
- echo "Updated: 2026-03-27T10:00:00Z"
76
+ "issue show")
77
+ printf '{"data":{"issue":{"id":"forge-xxx","title":"Feature X","labels":[]}}}\n'
90
78
  ;;
91
79
  esac
92
80
  MOCK
93
- chmod +x "$mock_dir/bd-no-gh"
81
+ chmod +x "$mock_dir/forge-no-gh"
94
82
 
95
- # ── Create .beads/config.yaml for auto-sync tests ──────────────────────
96
- mkdir -p "$TEST_TMP/.beads"
97
- cat > "$TEST_TMP/.beads/config.yaml" << 'YAML'
83
+ # ── Create .forge/config.yaml for auto-sync tests ──────────────────────
84
+ mkdir -p "$TEST_TMP/.forge"
85
+ cat > "$TEST_TMP/.forge/config.yaml" << 'YAML'
98
86
  team:
99
87
  auto-sync: true
100
88
  YAML
101
89
 
102
90
  export GH_CMD="$mock_dir/gh"
103
- export BD_CMD="$mock_dir/bd"
104
- export BEADS_ROOT="$TEST_TMP"
91
+ export FORGE_CMD="$mock_dir/forge"
92
+ export FORGE_ROOT="$TEST_TMP"
105
93
 
106
94
  # Source the library under test
107
95
  source "$SCRIPT_DIR/lib/hooks.sh"
@@ -148,7 +136,7 @@ assert_exit() {
148
136
  # ── Test 1: forge_team_sync with mock gh + bd → syncs in_progress issues ──
149
137
  echo "── Test 1: forge_team_sync syncs in_progress issues ──"
150
138
  export GH_CMD="$mock_dir/gh"
151
- export BD_CMD="$mock_dir/bd"
139
+ export FORGE_CMD="$mock_dir/forge"
152
140
  rc=0
153
141
  output="$(forge_team_sync 2>&1)" || rc=$?
154
142
  assert_exit "exits 0" 0 "$rc"
@@ -158,7 +146,7 @@ assert_contains "reports synced issues" "Synced 2 issues" "$output"
158
146
  echo ""
159
147
  echo "── Test 2: forge_team_sync with gh not authenticated → error, exit 1 ──"
160
148
  export GH_CMD="$mock_dir/gh-noauth"
161
- export BD_CMD="$mock_dir/bd"
149
+ export FORGE_CMD="$mock_dir/forge"
162
150
  rc=0
163
151
  output="$(forge_team_sync 2>&1)" || rc=$?
164
152
  assert_exit "exits 1" 1 "$rc"
@@ -168,8 +156,8 @@ assert_contains "error message" "FORGE_AGENT_7f3a:ERROR:" "$output"
168
156
  echo ""
169
157
  echo "── Test 3: forge_team_sync with auto-sync: false → skip, exit 0 ──"
170
158
  export GH_CMD="$mock_dir/gh"
171
- export BD_CMD="$mock_dir/bd"
172
- cat > "$TEST_TMP/.beads/config.yaml" << 'YAML'
159
+ export FORGE_CMD="$mock_dir/forge"
160
+ cat > "$TEST_TMP/.forge/config.yaml" << 'YAML'
173
161
  team:
174
162
  auto-sync: false
175
163
  YAML
@@ -178,7 +166,7 @@ output="$(forge_team_sync 2>&1)" || rc=$?
178
166
  assert_exit "exits 0" 0 "$rc"
179
167
  assert_not_contains "does not sync" "Synced" "$output"
180
168
  # Restore config
181
- cat > "$TEST_TMP/.beads/config.yaml" << 'YAML'
169
+ cat > "$TEST_TMP/.forge/config.yaml" << 'YAML'
182
170
  team:
183
171
  auto-sync: true
184
172
  YAML
@@ -187,7 +175,7 @@ YAML
187
175
  echo ""
188
176
  echo "── Test 4: forge_team_sync with no in_progress issues → nothing to sync ──"
189
177
  export GH_CMD="$mock_dir/gh"
190
- export BD_CMD="$mock_dir/bd-empty"
178
+ export FORGE_CMD="$mock_dir/forge-empty"
191
179
  rc=0
192
180
  output="$(forge_team_sync 2>&1)" || rc=$?
193
181
  assert_exit "exits 0" 0 "$rc"
@@ -197,7 +185,7 @@ assert_contains "nothing to sync message" "Nothing to sync" "$output"
197
185
  echo ""
198
186
  echo "── Test 5: forge_team_sync --quiet → no output on success ──"
199
187
  export GH_CMD="$mock_dir/gh"
200
- export BD_CMD="$mock_dir/bd"
188
+ export FORGE_CMD="$mock_dir/forge"
201
189
  rc=0
202
190
  output="$(forge_team_sync --quiet 2>&1)" || rc=$?
203
191
  assert_exit "exits 0" 0 "$rc"
@@ -207,7 +195,7 @@ assert_eq "no output" "" "$output"
207
195
  echo ""
208
196
  echo "── Test 6: forge_team_sync_on_stage triggers correct status sync per stage ──"
209
197
  export GH_CMD="$mock_dir/gh"
210
- export BD_CMD="$mock_dir/bd"
198
+ export FORGE_CMD="$mock_dir/forge"
211
199
  # dev transition → in_progress
212
200
  rc=0
213
201
  output="$(forge_team_sync_on_stage forge-aaa plan dev 2>&1)" || rc=$?
@@ -226,7 +214,7 @@ assert_contains "verify skips sync" "skipped" "$output"
226
214
  echo ""
227
215
  echo "── Test 7: Sync failure doesn't block (non-fatal warning) ──"
228
216
  export GH_CMD="$mock_dir/gh"
229
- export BD_CMD="$mock_dir/bd-no-gh"
217
+ export FORGE_CMD="$mock_dir/forge-no-gh"
230
218
  rc=0
231
219
  output="$(forge_team_sync 2>&1)" || rc=$?
232
220
  # Should still exit 0 even with sync failures (non-blocking)
@@ -7,7 +7,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
7
7
  TEST_TMP="$(mktemp -d)"
8
8
  trap 'rm -rf "$TEST_TMP"' EXIT
9
9
 
10
- # Override TEAM_MAP_ROOT so tests don't touch real .beads/
10
+ # Override TEAM_MAP_ROOT so tests don't touch real .forge/
11
11
  export TEAM_MAP_ROOT="$TEST_TMP"
12
12
 
13
13
  # ── Create mock gh ───────────────────────────────────────────────────────
@@ -88,7 +88,7 @@ echo "── Test 3: team_map_add creates parseable JSONL ──"
88
88
  export GH_CMD="$mock_dir/gh"
89
89
  unset _GITHUB_USER_CACHE
90
90
  team_map_add "testuser" "Test User"
91
- mapfile="$TEAM_MAP_ROOT/.beads/team-map.jsonl"
91
+ mapfile="$TEAM_MAP_ROOT/.forge/team-map.jsonl"
92
92
  # Entry should be parseable JSON
93
93
  last_line="$(tail -1 "$mapfile")"
94
94
  parsed="$(echo "$last_line" | jq -r '.github')"
@@ -146,7 +146,7 @@ assert_exit "not a bot" 1 "$rc"
146
146
  echo ""
147
147
  echo "── Test 9: auto_detect_identity ──"
148
148
  # Clean state
149
- rm -rf "$TEAM_MAP_ROOT/.beads"
149
+ rm -rf "$TEAM_MAP_ROOT/.forge"
150
150
  unset _GITHUB_USER_CACHE
151
151
  export GH_CMD="$mock_dir/gh"
152
152
  auto_detect_identity