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
@@ -1,363 +0,0 @@
1
- # Validation & Enforcement
2
-
3
- Forge includes built-in validation and TDD enforcement to ensure quality and consistency.
4
-
5
- ## Table of Contents
6
-
7
- - [Git Hooks](#git-hooks)
8
- - [Validation CLI](#validation-cli)
9
- - [Validators by Stage](#validators-by-stage)
10
- - [Override Mechanisms](#override-mechanisms)
11
- - [Configuration](#configuration)
12
-
13
- ---
14
-
15
- ## Git Hooks
16
-
17
- Forge uses [Lefthook](https://github.com/evilmartians/lefthook) for fast, language-agnostic git hooks.
18
-
19
- ### Pre-Commit Hook
20
-
21
- **Purpose**: Enforce TDD by blocking commits of source code without tests.
22
-
23
- **Trigger**: Before every commit
24
-
25
- **Checks**:
26
- - Detects staged source files (`.js`, `.ts`, `.py`, `.go`, `.java`, `.rb`, etc.)
27
- - Verifies corresponding test files exist (`.test.js`, `.spec.ts`, etc.)
28
- - Excludes config files, test files, and documentation
29
-
30
- **Behavior**:
31
- When source code lacks tests, offers guided recovery:
32
-
33
- ```
34
- ⚠️ Looks like you're committing source code without tests:
35
-
36
- - src/user-service.js
37
-
38
- 📋 TDD Reminder:
39
- Write tests BEFORE implementation (RED-GREEN-REFACTOR)
40
-
41
- What would you like to do?
42
- 1. Unstage source files (keep tests staged)
43
- 2. Continue anyway (I have a good reason)
44
- 3. Abort commit (let me add tests)
45
-
46
- Your choice (1-3):
47
- ```
48
-
49
- **Override**:
50
- ```bash
51
- git commit --no-verify # Skip in emergencies
52
- ```
53
-
54
- ### Pre-Push Hook
55
-
56
- **Purpose**: Ensure all tests pass before pushing to remote.
57
-
58
- **Trigger**: Before every push
59
-
60
- **Checks**:
61
- - Runs `bun test`
62
- - Verifies all tests pass
63
-
64
- **Override**:
65
- ```bash
66
- LEFTHOOK=0 git push # Skip all hooks
67
- ```
68
-
69
- ---
70
-
71
- ## Validation CLI
72
-
73
- The `forge-preflight` CLI checks prerequisites for each workflow stage.
74
-
75
- ### Usage
76
-
77
- ```bash
78
- forge-preflight <command>
79
- ```
80
-
81
- ### Commands
82
-
83
- | Command | Purpose | When to Use |
84
- |---------|---------|-------------|
85
- | `status` | Check project prerequisites | Setup, onboarding |
86
- | `dev` | Validate before `/dev` | Before implementation |
87
- | `ship` | Validate before `/ship` | Before creating PR |
88
-
89
- ---
90
-
91
- ## Validators by Stage
92
-
93
- ### `forge-preflight status`
94
-
95
- **Purpose**: Check basic project setup
96
-
97
- **Checks**:
98
- - ✓ Git repository initialized
99
- - ✓ `package.json` exists
100
- - ✓ Test framework configured (`bun test` script)
101
- - ✓ Node.js installed
102
-
103
- **Example**:
104
- ```bash
105
- $ forge-preflight status
106
-
107
- Checking project prerequisites...
108
-
109
- Validation Results:
110
-
111
- ✓ Git repository
112
- ✓ package.json exists
113
- ✓ Test framework configured
114
- ✓ Node.js installed
115
-
116
- ✅ All checks passed!
117
- ```
118
-
119
- ---
120
-
121
- ### `forge-preflight dev`
122
-
123
- **Purpose**: Validate before starting implementation (`/dev`)
124
-
125
- **Checks**:
126
- - ✓ On feature branch (`feat/*`, `fix/*`, `docs/*`)
127
- - ✓ Plan file exists (`docs/plans/*.md`)
128
- - ✓ Research file exists (`docs/research/*.md`)
129
- - ✓ Test directory exists
130
-
131
- **Example**:
132
- ```bash
133
- $ forge-preflight dev
134
-
135
- Validating prerequisites for /dev stage...
136
-
137
- Validation Results:
138
-
139
- ✓ On feature branch
140
- ✓ Plan file exists
141
- ✓ Research file exists
142
- ✓ Test directory exists
143
-
144
- ✅ All checks passed!
145
- ```
146
-
147
- **Failed Example**:
148
- ```bash
149
- $ forge-preflight dev
150
-
151
- Validating prerequisites for /dev stage...
152
-
153
- Validation Results:
154
-
155
- ✗ On feature branch
156
- Not on a feature branch. Create one: git checkout -b feat/your-feature
157
- ✓ Plan file exists
158
- ✗ Research file exists
159
- No research file found in docs/research/. Run: /research
160
-
161
- ❌ Some checks failed. Please fix the issues above.
162
- ```
163
-
164
- ---
165
-
166
- ### `forge-preflight ship`
167
-
168
- **Purpose**: Validate before creating PR (`/ship`)
169
-
170
- **Checks**:
171
- - ✓ Tests exist (`.test.js`, `.spec.ts` files)
172
- - ✓ Tests pass (`bun test` succeeds)
173
- - ✓ Documentation updated (`README.md` or `docs/`)
174
- - ✓ No uncommitted changes
175
-
176
- **Example**:
177
- ```bash
178
- $ forge-preflight ship
179
-
180
- Validating prerequisites for /ship stage...
181
-
182
- Validation Results:
183
-
184
- ✓ Tests exist
185
- ✓ Tests pass
186
- ✓ Documentation updated
187
- ✓ No uncommitted changes
188
-
189
- ✅ All checks passed!
190
- ```
191
-
192
- ---
193
-
194
- ## Override Mechanisms
195
-
196
- ### Git Hooks
197
-
198
- **Emergency Override** (use sparingly):
199
-
200
- ```bash
201
- # Skip pre-commit hook
202
- git commit --no-verify -m "Emergency hotfix"
203
-
204
- # Skip pre-push hook
205
- LEFTHOOK=0 git push
206
- ```
207
-
208
- **When to use**:
209
- - Emergency hotfixes
210
- - Work-in-progress commits (before pushing)
211
- - Non-code commits (docs, config)
212
-
213
- **When NOT to use**:
214
- - Regular development
215
- - Public repositories
216
- - Production deployments
217
-
218
- ### Validation CLI
219
-
220
- The CLI provides guidance but doesn't block actions. You can proceed manually if checks fail.
221
-
222
- ---
223
-
224
- ## Configuration
225
-
226
- ### Lefthook Configuration
227
-
228
- Edit `lefthook.yml` to customize hooks:
229
-
230
- ```yaml
231
- pre-commit:
232
- commands:
233
- tdd-check:
234
- run: node .forge/hooks/check-tdd.js
235
- stage_fixed: false
236
- tags: tdd
237
- glob: "*.{js,ts,jsx,tsx,py,go,java,rb}"
238
-
239
- pre-push:
240
- commands:
241
- tests:
242
- run: bun test
243
- tags: tests
244
- ```
245
-
246
- **Options**:
247
- - `run`: Command to execute
248
- - `stage_fixed`: Auto-stage modified files (false = safer)
249
- - `tags`: Categorize hooks
250
- - `glob`: File patterns to trigger hook
251
-
252
- ### Custom Test Patterns
253
-
254
- Edit `.forge/hooks/check-tdd.js` to add custom test patterns:
255
-
256
- ```javascript
257
- // Around line 72
258
- const testPatterns = [
259
- `${basename}.test${ext}`,
260
- `${basename}.spec${ext}`,
261
- `test/${basename}.test${ext}`,
262
- `tests/${basename}.test${ext}`,
263
- `__tests__/${basename}.test${ext}`,
264
- // Add custom patterns here
265
- `${dir}/__tests__/${basename}${ext}`,
266
- `spec/${basename}_spec${ext}`, // RSpec style
267
- ];
268
- ```
269
-
270
- ### Validation CLI Customization
271
-
272
- Edit `bin/forge-preflight.js` to add custom validators:
273
-
274
- ```javascript
275
- function validateCustomStage() {
276
- console.log('Validating custom stage...\n');
277
-
278
- check('Custom check', () => {
279
- // Your validation logic
280
- return true;
281
- }, 'Custom error message');
282
-
283
- return printResults();
284
- }
285
- ```
286
-
287
- ---
288
-
289
- ## Installation
290
-
291
- Hooks are automatically installed when you run:
292
-
293
- ```bash
294
- # Install lefthook (one-time)
295
- bun add -d lefthook
296
-
297
- # Set up Forge
298
- bunx forge setup
299
- ```
300
-
301
- The hooks will be automatically installed in your project's `.git/hooks/` directory.
302
-
303
- **Manual installation** (if needed):
304
-
305
- ```bash
306
- # If you prefer global installation
307
- bun install -g lefthook
308
-
309
- # Install hooks
310
- lefthook install
311
- ```
312
-
313
- ---
314
-
315
- ## Troubleshooting
316
-
317
- ### Hooks not running
318
-
319
- ```bash
320
- # Check lefthook installation
321
- lefthook version
322
-
323
- # Reinstall hooks
324
- lefthook install
325
-
326
- # Check git hooks directory
327
- ls -la .git/hooks/
328
- ```
329
-
330
- ### False positives
331
-
332
- If the hook incorrectly flags a file:
333
-
334
- 1. **Short-term**: Use `--no-verify` to skip
335
- 2. **Long-term**: Update exclusion patterns in `.forge/hooks/check-tdd.js`
336
-
337
- ### Tests failing on push
338
-
339
- ```bash
340
- # Run tests locally
341
- bun test
342
-
343
- # Fix failures, then
344
- git push
345
- ```
346
-
347
- ---
348
-
349
- ## Best Practices
350
-
351
- 1. **Write tests first**: Let the hooks guide you to TDD
352
- 2. **Don't abuse overrides**: Only use `--no-verify` in emergencies
353
- 3. **Keep tests fast**: Pre-push hooks run on every push
354
- 4. **Document exceptions**: If you override, explain why in commit message
355
- 5. **Update validators**: Customize for your project's needs
356
-
357
- ---
358
-
359
- ## See Also
360
-
361
- - [Workflow Guide](../AGENTS.md) - Complete 7-stage workflow
362
- - [TDD Guide](../CLAUDE.md) - TDD principles and practices
363
- - [Lefthook Docs](https://github.com/evilmartians/lefthook) - Full hook configuration
@@ -1,29 +0,0 @@
1
- {
2
- "id": "cline",
3
- "name": "Cline",
4
- "version": "1.0.0",
5
- "description": "VS Code agent extension",
6
- "homepage": "https://github.com/cline/cline",
7
- "capabilities": {
8
- "commands": true,
9
- "skills": false,
10
- "hooks": false
11
- },
12
- "directories": {
13
- "workflows": ".cline/workflows"
14
- },
15
- "files": {
16
- "rootConfig": ".clinerules"
17
- },
18
- "support": {
19
- "status": "deprecated",
20
- "surface": "editor-native",
21
- "install": {
22
- "required": false,
23
- "repairRequired": false
24
- }
25
- },
26
- "setup": {
27
- "copyCommands": true
28
- }
29
- }
@@ -1,24 +0,0 @@
1
- {
2
- "id": "copilot",
3
- "name": "GitHub Copilot",
4
- "version": "1.0.0",
5
- "description": "GitHub's AI assistant with native instructions and prompts",
6
- "homepage": "https://github.com/features/copilot",
7
- "capabilities": {
8
- "commands": true,
9
- "skills": false,
10
- "hooks": false
11
- },
12
- "directories": {
13
- "prompts": ".github/prompts",
14
- "instructions": ".github/instructions"
15
- },
16
- "files": {
17
- "rootConfig": ".github/copilot-instructions.md"
18
- },
19
- "setup": {
20
- "needsConversion": true,
21
- "promptFormat": true,
22
- "customSetup": "copilot"
23
- }
24
- }
@@ -1,22 +0,0 @@
1
- {
2
- "id": "kilocode",
3
- "name": "Kilo Code",
4
- "version": "1.0.0",
5
- "description": "VS Code extension with native workflows, rules, and skills",
6
- "homepage": "https://marketplace.visualstudio.com/items?itemName=kilo-code",
7
- "capabilities": {
8
- "commands": true,
9
- "skills": true,
10
- "hooks": false
11
- },
12
- "directories": {
13
- "workflows": ".kilocode/workflows",
14
- "rules": ".kilocode/rules",
15
- "skills": ".kilocode/skills/forge-workflow"
16
- },
17
- "setup": {
18
- "copyRules": true,
19
- "createSkill": true,
20
- "needsConversion": true
21
- }
22
- }
@@ -1,23 +0,0 @@
1
- {
2
- "id": "opencode",
3
- "name": "OpenCode",
4
- "version": "1.0.0",
5
- "description": "Open-source agent with native config and agent definitions",
6
- "homepage": "https://opencode.ai",
7
- "capabilities": {
8
- "commands": true,
9
- "skills": false,
10
- "hooks": false
11
- },
12
- "directories": {
13
- "commands": ".opencode/commands",
14
- "agents": ".opencode/agents"
15
- },
16
- "files": {
17
- "rootConfig": "opencode.json"
18
- },
19
- "setup": {
20
- "copyCommands": true,
21
- "customSetup": "opencode"
22
- }
23
- }
@@ -1,30 +0,0 @@
1
- {
2
- "id": "roo",
3
- "name": "Roo Code",
4
- "version": "1.0.0",
5
- "description": "Cline fork with modes",
6
- "homepage": "https://github.com/roocode/roo",
7
- "capabilities": {
8
- "commands": true,
9
- "skills": false,
10
- "hooks": false
11
- },
12
- "directories": {
13
- "commands": ".roo/commands"
14
- },
15
- "files": {
16
- "rootConfig": ".roorules"
17
- },
18
- "support": {
19
- "status": "deprecated",
20
- "surface": "editor-native",
21
- "install": {
22
- "required": false,
23
- "repairRequired": false
24
- }
25
- },
26
- "setup": {
27
- "copyCommands": true,
28
- "needsConversion": true
29
- }
30
- }
@@ -1,225 +0,0 @@
1
- 'use strict';
2
-
3
- const { execFileSync } = require('node:child_process');
4
- const fs = require('node:fs');
5
- const path = require('node:path');
6
- const { safeBeadsInit } = require('./beads-setup');
7
-
8
- function isIgnorableFsError(error) {
9
- return ['EACCES', 'ENOENT', 'ENOTDIR', 'EPERM'].includes(error?.code);
10
- }
11
-
12
- function isRecoverableCommandError(error) {
13
- return error?.code === 'ENOENT' || typeof error?.status === 'number';
14
- }
15
-
16
- function hasBackupJsonl(backupDir, fsApi) {
17
- try {
18
- return fsApi.readdirSync(backupDir).some((entry) => entry.endsWith('.jsonl'));
19
- } catch (err) {
20
- if (isIgnorableFsError(err)) {
21
- return false;
22
- }
23
- throw err;
24
- }
25
- }
26
-
27
- function resolveMainWorktree(projectRoot, exec) {
28
- try {
29
- const commonDir = exec('git', ['rev-parse', '--git-common-dir'], {
30
- cwd: projectRoot,
31
- encoding: 'utf8',
32
- stdio: 'pipe'
33
- }).trim();
34
- return path.resolve(projectRoot, commonDir, '..');
35
- } catch (err) {
36
- if (isRecoverableCommandError(err)) {
37
- return projectRoot;
38
- }
39
- throw err;
40
- }
41
- }
42
-
43
- function isRecoverableBeadsError(error) {
44
- const message = error?.message ?? String(error ?? '');
45
- return (
46
- /database(?:\s+[^\s]+)?\s+not found/i.test(message) ||
47
- message.includes('failed to open database') ||
48
- message.includes('no beads configuration found')
49
- );
50
- }
51
-
52
- function readMetadataDatabaseName(projectRoot, fsApi) {
53
- const metadataPath = path.resolve(projectRoot, '.beads', 'metadata.json');
54
- if (!fsApi.existsSync(metadataPath)) {
55
- return null;
56
- }
57
-
58
- try {
59
- const metadata = JSON.parse(fsApi.readFileSync(metadataPath, 'utf8'));
60
- if (typeof metadata.dolt_database === 'string' && metadata.dolt_database.trim()) {
61
- return metadata.dolt_database.trim();
62
- }
63
- } catch (err) {
64
- if (err instanceof SyntaxError || isIgnorableFsError(err)) {
65
- return null;
66
- }
67
- throw err;
68
- }
69
-
70
- return null;
71
- }
72
-
73
- function stageExistingBeadsDest(beadsDest, fsApi) {
74
- if (!fsApi.existsSync(beadsDest)) {
75
- return null;
76
- }
77
-
78
- const stagedDest = `${beadsDest}.bootstrap-backup`;
79
- if (fsApi.existsSync(stagedDest) && typeof fsApi.rmSync === 'function') {
80
- fsApi.rmSync(stagedDest, { recursive: true, force: true });
81
- }
82
-
83
- if (typeof fsApi.renameSync === 'function') {
84
- fsApi.renameSync(beadsDest, stagedDest);
85
- return stagedDest;
86
- }
87
-
88
- if (typeof fsApi.rmSync === 'function') {
89
- fsApi.rmSync(beadsDest, { recursive: true, force: true });
90
- }
91
-
92
- return null;
93
- }
94
-
95
- function restoreStagedBeadsDest(beadsDest, stagedDest, fsApi) {
96
- if (!stagedDest || fsApi.existsSync(beadsDest) || typeof fsApi.renameSync !== 'function') {
97
- return;
98
- }
99
-
100
- fsApi.renameSync(stagedDest, beadsDest);
101
- }
102
-
103
- function cleanupStagedBeadsDest(stagedDest, fsApi) {
104
- if (!stagedDest || !fsApi.existsSync(stagedDest) || typeof fsApi.rmSync !== 'function') {
105
- return;
106
- }
107
-
108
- fsApi.rmSync(stagedDest, { recursive: true, force: true });
109
- }
110
-
111
- function tryLinkBeadsSource(beadsSource, beadsDest, platform, fsApi) {
112
- if (!fsApi.existsSync(beadsSource)) {
113
- return false;
114
- }
115
-
116
- const stagedDest = stageExistingBeadsDest(beadsDest, fsApi);
117
-
118
- try {
119
- if (platform === 'win32') {
120
- fsApi.symlinkSync(beadsSource, beadsDest, 'junction');
121
- } else {
122
- fsApi.symlinkSync(beadsSource, beadsDest);
123
- }
124
-
125
- cleanupStagedBeadsDest(stagedDest, fsApi);
126
- return true;
127
- } catch (symlinkErr) {
128
- restoreStagedBeadsDest(beadsDest, stagedDest, fsApi);
129
- if (symlinkErr.code !== 'EPERM') {
130
- throw symlinkErr;
131
- }
132
- return false;
133
- }
134
- }
135
-
136
- function buildInitArgs(mainProjectRoot, projectRoot, fsApi) {
137
- const metadataDatabaseName = readMetadataDatabaseName(mainProjectRoot, fsApi)
138
- || readMetadataDatabaseName(projectRoot, fsApi);
139
- const initArgs = ['init', '--force'];
140
- if (metadataDatabaseName) {
141
- initArgs.push('--database', metadataDatabaseName);
142
- }
143
-
144
- return initArgs;
145
- }
146
-
147
- function runFreshInit(projectRoot, mainProjectRoot, beadsSource, initArgs, exec, runSafeBeadsInit, fsApi) {
148
- const safeInitResult = runSafeBeadsInit(projectRoot, {
149
- prefix: path.basename(mainProjectRoot),
150
- execBdInit: (root) => {
151
- exec('bd', initArgs, { cwd: root, stdio: 'pipe' });
152
- }
153
- });
154
-
155
- if (!safeInitResult.success) {
156
- const initMessage = safeInitResult.errors?.[0]
157
- || safeInitResult.warnings?.[0]
158
- || 'unknown safeBeadsInit failure';
159
- return {
160
- success: false,
161
- strategy: 'fresh-init-failed',
162
- warning: `Beads bootstrap fresh init failed: ${initMessage}`
163
- };
164
- }
165
-
166
- if (safeInitResult.skipped) {
167
- return {
168
- success: true,
169
- strategy: 'existing-state',
170
- warning: 'Beads bootstrap reused existing initialized state'
171
- };
172
- }
173
-
174
- const backupDir = path.resolve(beadsSource, 'backup');
175
- if (hasBackupJsonl(backupDir, fsApi)) {
176
- try {
177
- exec('bd', ['backup', 'restore', backupDir], { cwd: projectRoot, stdio: 'pipe' });
178
- return {
179
- success: true,
180
- strategy: 'backup-restore',
181
- warning: 'Beads bootstrap restored from backup'
182
- };
183
- } catch (restoreErr) {
184
- return {
185
- success: true,
186
- strategy: 'fresh-init',
187
- warning: `Beads bootstrap initialized fresh after backup restore failed: ${restoreErr.message}`
188
- };
189
- }
190
- }
191
-
192
- return {
193
- success: true,
194
- strategy: 'fresh-init',
195
- warning: 'Beads bootstrap initialized fresh (no backup found)'
196
- };
197
- }
198
-
199
- function bootstrapBeads(projectRoot, options = {}) {
200
- const exec = options._exec || execFileSync;
201
- const fsApi = options._fs || fs;
202
- const platform = options._platform || process.platform;
203
- const runSafeBeadsInit = options._safeBeadsInit || safeBeadsInit;
204
- const mainProjectRoot = options.mainProjectRoot || resolveMainWorktree(projectRoot, exec);
205
- const beadsSource = path.resolve(mainProjectRoot, '.beads');
206
- const beadsDest = path.resolve(projectRoot, '.beads');
207
-
208
- if (beadsSource === beadsDest) {
209
- return { success: true, strategy: 'in-place', warning: null };
210
- }
211
-
212
- if (tryLinkBeadsSource(beadsSource, beadsDest, platform, fsApi)) {
213
- return { success: true, strategy: 'linked', warning: null };
214
- }
215
-
216
- const initArgs = buildInitArgs(mainProjectRoot, projectRoot, fsApi);
217
- return runFreshInit(projectRoot, mainProjectRoot, beadsSource, initArgs, exec, runSafeBeadsInit, fsApi);
218
- }
219
-
220
- module.exports = {
221
- bootstrapBeads,
222
- hasBackupJsonl,
223
- isRecoverableBeadsError,
224
- resolveMainWorktree,
225
- };