forge-workflow 0.0.10 → 0.1.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. package/.claude/rules/{greptile-review-process.md → review-process.md} +56 -41
  2. package/.claude/scripts/{greptile-resolve.sh → review-resolve.sh} +13 -3
  3. package/.cursor/rules/permissions-guidance.mdc +2 -2
  4. package/.forge/hooks/check-tdd.js +3 -0
  5. package/.forge/hooks/forge-native-hook.js +245 -0
  6. package/.forge/protected-paths.yaml +157 -0
  7. package/AGENTS.md +150 -61
  8. package/CHANGELOG.md +681 -0
  9. package/CLAUDE.md +9 -118
  10. package/QUICKSTART.md +171 -0
  11. package/README.md +271 -363
  12. package/bin/forge-cmd.js +120 -9
  13. package/bin/forge-preflight.js +26 -5
  14. package/bin/forge.js +461 -489
  15. package/docs/INDEX.md +93 -0
  16. package/docs/PROJECT_DESIGN.md +685 -0
  17. package/docs/architecture/index.md +66 -0
  18. package/docs/architecture/notes/README.md +35 -0
  19. package/docs/architecture/subsystems/README.md +46 -0
  20. package/docs/forge/TOOLCHAIN.md +670 -0
  21. package/docs/forge/VALIDATION.md +82 -0
  22. package/docs/{AGENT_INSTALL_PROMPT.md → guides/AGENT_INSTALL_PROMPT.md} +3 -3
  23. package/docs/guides/BEADS_GITHUB_SYNC.md +32 -0
  24. package/docs/{ENHANCED_ONBOARDING.md → guides/ENHANCED_ONBOARDING.md} +16 -12
  25. package/docs/guides/GREPTILE_SETUP.md +46 -0
  26. package/docs/guides/MANUAL_REVIEW_GUIDE.md +58 -0
  27. package/docs/guides/MIGRATION.md +56 -0
  28. package/docs/guides/SETUP.md +118 -0
  29. package/docs/guides/SUPPORT.md +185 -0
  30. package/docs/guides/WORKFLOW_TEMPLATES.md +74 -0
  31. package/docs/guides/memory-backends.md +183 -0
  32. package/docs/reference/ADAPTERS.md +128 -0
  33. package/docs/reference/AGENT_SKILL_PARITY.md +175 -0
  34. package/docs/reference/COMMANDS.md +205 -0
  35. package/docs/reference/DECISION_DRIFT_GUARDS.md +97 -0
  36. package/docs/{EXAMPLES.md → reference/EXAMPLES.md} +7 -5
  37. package/docs/reference/FORGE_KERNEL_STORAGE_MODEL.md +135 -0
  38. package/docs/reference/HERMES_INTEGRATION.md +118 -0
  39. package/docs/reference/INSIGHTS_RECAP.md +63 -0
  40. package/docs/reference/INSTALL.md +164 -0
  41. package/docs/reference/KERNEL_TAXONOMY_VALIDATION.md +161 -0
  42. package/docs/reference/PROTECTED_PATH_MANIFEST.md +25 -0
  43. package/docs/reference/RELEASE.md +68 -0
  44. package/docs/reference/RESEARCH_TEMPLATE.md +292 -0
  45. package/docs/{ROADMAP.md → reference/ROADMAP.md} +12 -9
  46. package/docs/reference/SKILLS.md +35 -0
  47. package/docs/reference/STATUS_BOARD.md +80 -0
  48. package/docs/reference/TEMPLATES.md +106 -0
  49. package/docs/{TOOLCHAIN.md → reference/TOOLCHAIN.md} +62 -47
  50. package/docs/reference/VALIDATION.md +82 -0
  51. package/docs/reference/agent-permissions.md +169 -0
  52. package/docs/reference/beads-to-kernel-migration-ux.md +61 -0
  53. package/docs/reference/control-plane-guarantees.md +125 -0
  54. package/docs/reference/dependency-chain.md +331 -0
  55. package/docs/reference/forge-kernel-issue-command-contract.md +161 -0
  56. package/docs/reference/forge-kernel-schema.md +72 -0
  57. package/docs/reference/kernel-conflict-evaluators.md +27 -0
  58. package/docs/reference/patch-md-format.md +77 -0
  59. package/docs/reference/protected-state-surfaces.md +59 -0
  60. package/docs/reference/shepherd.md +115 -0
  61. package/docs/reference/superpowers-analysis.md +320 -0
  62. package/docs/reference/superpowers-integration-options.md +404 -0
  63. package/docs/reference/test-environment.md +519 -0
  64. package/docs/reference/upgrade-safety.md +59 -0
  65. package/lefthook.yml +18 -0
  66. package/lib/adapter-cli.js +307 -0
  67. package/lib/adapters/beads-issue-adapter.js +127 -0
  68. package/lib/adapters/beads-kernel-compat.js +1042 -0
  69. package/lib/adapters/greptile-review-adapter.js +141 -0
  70. package/lib/adapters/kernel-issue-adapter.js +101 -0
  71. package/lib/adapters/pr-state-adapter.js +484 -0
  72. package/lib/adoption-profiles.js +126 -0
  73. package/lib/agents/README.md +2 -6
  74. package/lib/agents/claude.plugin.json +3 -8
  75. package/lib/agents/codex.plugin.json +9 -1
  76. package/lib/agents/cursor.plugin.json +2 -6
  77. package/lib/agents/hermes.plugin.json +22 -0
  78. package/lib/agents-config.js +39 -1236
  79. package/lib/audit-evidence.js +282 -0
  80. package/lib/beads-setup.js +121 -0
  81. package/lib/beads-sync-scaffold.js +25 -101
  82. package/lib/codex-skills.js +51 -1
  83. package/lib/commands/_issue.js +741 -77
  84. package/lib/commands/_manifest.js +91 -0
  85. package/lib/commands/_registry.js +85 -34
  86. package/lib/commands/_resolve-command-opts.js +261 -0
  87. package/lib/commands/_serve-security.js +270 -0
  88. package/lib/commands/adapter.js +12 -0
  89. package/lib/commands/add.js +118 -0
  90. package/lib/commands/audit.js +70 -0
  91. package/lib/commands/blocked.js +5 -0
  92. package/lib/commands/board.js +64 -0
  93. package/lib/commands/claim.js +21 -2
  94. package/lib/commands/claims.js +7 -0
  95. package/lib/commands/clean.js +485 -75
  96. package/lib/commands/close.js +2 -2
  97. package/lib/commands/comment.js +5 -0
  98. package/lib/commands/control.js +148 -0
  99. package/lib/commands/create.js +2 -2
  100. package/lib/commands/dev.js +185 -7
  101. package/lib/commands/doc-gate.js +336 -0
  102. package/lib/commands/doctor.js +156 -0
  103. package/lib/commands/explain.js +15 -0
  104. package/lib/commands/export.js +237 -0
  105. package/lib/commands/gate.js +192 -0
  106. package/lib/commands/hooks.js +242 -0
  107. package/lib/commands/inbox.js +118 -0
  108. package/lib/commands/init.js +598 -0
  109. package/lib/commands/insights.js +79 -0
  110. package/lib/commands/issue.js +12 -1
  111. package/lib/commands/issues.js +17 -0
  112. package/lib/commands/lint.js +5 -0
  113. package/lib/commands/list.js +2 -2
  114. package/lib/commands/merge.js +312 -0
  115. package/lib/commands/migrate.js +523 -0
  116. package/lib/commands/new.js +12 -0
  117. package/lib/commands/options.js +241 -0
  118. package/lib/commands/orient.js +13 -0
  119. package/lib/commands/orphans.js +5 -0
  120. package/lib/commands/patch.js +67 -0
  121. package/lib/commands/plan.js +436 -24
  122. package/lib/commands/preflight.js +211 -0
  123. package/lib/commands/prime.js +13 -0
  124. package/lib/commands/push.js +69 -2
  125. package/lib/commands/ready.js +2 -2
  126. package/lib/commands/recall.js +116 -0
  127. package/lib/commands/recap.js +61 -0
  128. package/lib/commands/recommend.js +0 -1
  129. package/lib/commands/release.js +91 -0
  130. package/lib/commands/remember.js +74 -0
  131. package/lib/commands/role.js +99 -0
  132. package/lib/commands/serve.js +581 -0
  133. package/lib/commands/setup.js +838 -972
  134. package/lib/commands/shepherd.js +436 -0
  135. package/lib/commands/ship.js +23 -1
  136. package/lib/commands/show.js +2 -2
  137. package/lib/commands/stage.js +192 -0
  138. package/lib/commands/stale.js +5 -0
  139. package/lib/commands/status.js +158 -21
  140. package/lib/commands/sync.js +34 -46
  141. package/lib/commands/team.js +4 -1
  142. package/lib/commands/test.js +43 -27
  143. package/lib/commands/update.js +2 -2
  144. package/lib/commands/upgrade.js +47 -0
  145. package/lib/commands/validate.js +43 -18
  146. package/lib/commands/worktree.js +307 -100
  147. package/lib/config-writer.js +202 -0
  148. package/lib/control-plane.js +236 -0
  149. package/lib/core/runtime-graph.js +946 -0
  150. package/lib/dep-guard/keyword-ripple.js +2 -2
  151. package/lib/deprecated-sync-cleanup.js +362 -0
  152. package/lib/detect-agent.js +2 -28
  153. package/lib/detect-worktree.js +35 -9
  154. package/lib/doc-gate/declaration.js +177 -0
  155. package/lib/doc-gate/detect.js +289 -0
  156. package/lib/doc-gate/gate.js +375 -0
  157. package/lib/doc-gate/okf-config.js +128 -0
  158. package/lib/doc-gate/okf.js +429 -0
  159. package/lib/docs-command.js +1161 -6
  160. package/lib/forge-issues.js +382 -11
  161. package/lib/forge-lock.js +262 -0
  162. package/lib/gate-events.js +193 -0
  163. package/lib/global-flags.js +74 -0
  164. package/lib/greptile-match.js +7 -63
  165. package/lib/harness-capability-matrix.js +380 -0
  166. package/lib/hook-global-installer.js +347 -0
  167. package/lib/hook-renderer.js +451 -0
  168. package/lib/inbox.js +391 -0
  169. package/lib/insights.js +397 -0
  170. package/lib/issue-adapter.js +156 -0
  171. package/lib/issue-backend.js +145 -0
  172. package/lib/issue-render.js +220 -0
  173. package/lib/kernel/backing-issue.js +305 -0
  174. package/lib/kernel/broker.js +1218 -0
  175. package/lib/kernel/cli-broker-factory.js +130 -0
  176. package/lib/kernel/conflict-signal.js +82 -0
  177. package/lib/kernel/evaluators.js +195 -0
  178. package/lib/kernel/fs-class.js +495 -0
  179. package/lib/kernel/issue-command-contract.js +559 -0
  180. package/lib/kernel/issue-id-resolver.js +186 -0
  181. package/lib/kernel/lease-enforcer.js +158 -0
  182. package/lib/kernel/migrations.js +333 -0
  183. package/lib/kernel/planning-buckets-schema.js +109 -0
  184. package/lib/kernel/projection-jsonl-writer.js +450 -0
  185. package/lib/kernel/readiness-model.js +329 -0
  186. package/lib/kernel/schema.js +356 -0
  187. package/lib/kernel/sqlite-driver.js +2504 -0
  188. package/lib/kernel/taxonomy-validator.js +394 -0
  189. package/lib/lefthook-check.js +3 -2
  190. package/lib/lefthook-wiring.js +413 -0
  191. package/lib/mcp-config-renderer.js +288 -0
  192. package/lib/memory/graphiti-mcp.js +106 -0
  193. package/lib/memory/router.js +387 -0
  194. package/lib/memory/typed-api.js +102 -0
  195. package/lib/memory-digest.js +195 -0
  196. package/lib/merge-rules.js +395 -0
  197. package/lib/migrate-dry-run.js +466 -0
  198. package/lib/orientation.js +863 -0
  199. package/lib/package-manager-remediation.js +103 -0
  200. package/lib/package-root.js +381 -0
  201. package/lib/patch-intent.js +890 -0
  202. package/lib/plugin-catalog.js +3 -4
  203. package/lib/plugin-manager.js +0 -5
  204. package/lib/pr-bundle.js +186 -0
  205. package/lib/pr-monitor/differ.js +195 -0
  206. package/lib/pr-monitor/events.js +0 -0
  207. package/lib/pr-monitor/gather.js +124 -0
  208. package/lib/pr-monitor/journal.js +299 -0
  209. package/lib/pr-monitor/monitor.js +146 -0
  210. package/lib/pr-monitor/render-sticky.js +157 -0
  211. package/lib/pr-monitor/watch-lifecycle.js +95 -0
  212. package/lib/pr-monitor/watch.js +247 -0
  213. package/lib/pr-pull.js +1273 -0
  214. package/lib/pr-shepherd.js +494 -0
  215. package/lib/pr-state-validator.js +59 -0
  216. package/lib/preflight/gates.js +237 -0
  217. package/lib/preflight/runner.js +116 -0
  218. package/lib/project-discovery.js +0 -53
  219. package/lib/project-memory.js +99 -497
  220. package/lib/protected-path-manifest.js +281 -0
  221. package/lib/protected-state-surfaces.js +387 -0
  222. package/lib/release-readiness.js +2089 -0
  223. package/lib/reset.js +59 -45
  224. package/lib/review-adapter.js +68 -0
  225. package/lib/rules-sync.js +260 -0
  226. package/lib/runtime-health.js +241 -20
  227. package/lib/safety-config-renderer.js +268 -0
  228. package/lib/setup-action-log.js +1 -7
  229. package/lib/setup.js +27 -65
  230. package/lib/shell-utils.js +76 -6
  231. package/lib/skills-sync.js +330 -0
  232. package/lib/smart-status/scoring.js +17 -3
  233. package/lib/status/beads-snapshot.js +45 -2
  234. package/lib/status/presenter.js +169 -18
  235. package/lib/status/snapshot.js +186 -0
  236. package/lib/sync-backend.js +202 -0
  237. package/lib/untrusted-content.js +52 -0
  238. package/lib/upgrade-safety.js +199 -0
  239. package/lib/workflow/enforce-stage.js +296 -47
  240. package/lib/workflow/stage-transition.js +115 -0
  241. package/lib/workflow/stages.js +30 -6
  242. package/lib/workflow/state-manager.js +11 -22
  243. package/lib/workflow/state.js +23 -1
  244. package/lib/workflow-profiles.js +17 -5
  245. package/package.json +37 -35
  246. package/rules/documentation.md +19 -0
  247. package/rules/kernel-tracking.md +26 -0
  248. package/rules/security.md +22 -0
  249. package/rules/tdd.md +20 -0
  250. package/rules/workflow.md +27 -0
  251. package/scripts/auto-backing-issue.js +47 -0
  252. package/scripts/beads-context.sh +81 -57
  253. package/scripts/beads-upgrade-smoke.sh +24 -3
  254. package/scripts/bootstrap-windows-tools.sh +78 -0
  255. package/scripts/branch-protection.js +2 -3
  256. package/scripts/check-agents.js +34 -137
  257. package/scripts/commitlint.js +3 -1
  258. package/scripts/conflict-detect.sh +3 -0
  259. package/scripts/dep-guard.sh +22 -3
  260. package/scripts/file-index.sh +3 -0
  261. package/scripts/forge-team/lib/claim.sh +34 -18
  262. package/scripts/forge-team/lib/dashboard.sh +61 -86
  263. package/scripts/forge-team/lib/epic.sh +99 -263
  264. package/scripts/forge-team/lib/hooks.sh +26 -28
  265. package/scripts/forge-team/lib/identity.sh +4 -4
  266. package/scripts/forge-team/lib/sync-github.sh +49 -84
  267. package/scripts/forge-team/lib/verify.sh +93 -83
  268. package/scripts/forge-team/lib/workload.sh +41 -65
  269. package/scripts/forge-team/tests/claim.test.sh +25 -19
  270. package/scripts/forge-team/tests/dashboard.test.sh +31 -46
  271. package/scripts/forge-team/tests/epic.test.sh +52 -71
  272. package/scripts/forge-team/tests/hooks.test.sh +38 -50
  273. package/scripts/forge-team/tests/identity.test.sh +3 -3
  274. package/scripts/forge-team/tests/integration.test.sh +44 -66
  275. package/scripts/forge-team/tests/sync-github.test.sh +50 -83
  276. package/scripts/forge-team/tests/verify.test.sh +37 -46
  277. package/scripts/forge-team/tests/workflow-integration.test.sh +4 -4
  278. package/scripts/forge-team/tests/workload.test.sh +32 -66
  279. package/scripts/gen-command-manifest.js +153 -0
  280. package/scripts/gen-embedded-assets.mjs +129 -0
  281. package/scripts/install.ps1 +139 -0
  282. package/scripts/install.sh +268 -0
  283. package/scripts/lib/release-asset.mjs +84 -0
  284. package/scripts/parity-check.mjs +145 -0
  285. package/scripts/parity-check.test.mjs +58 -0
  286. package/scripts/pin-agentic-workflow-images.js +112 -0
  287. package/scripts/pr-coordinator.sh +3 -0
  288. package/scripts/preflight-sonar.eslint.config.mjs +44 -0
  289. package/scripts/preflight.sh +21 -94
  290. package/scripts/protected-state-check.js +104 -0
  291. package/scripts/smart-status.sh +60 -57
  292. package/scripts/spikes/config-race-bench.js +111 -0
  293. package/scripts/spikes/harness-capability-matrix.js +13 -0
  294. package/scripts/spikes/patch-anchor-stability-bench.js +125 -0
  295. package/scripts/spikes/protected-path-manifest.js +20 -0
  296. package/scripts/spikes/skill-auto-invoke-parity.js +292 -0
  297. package/scripts/sync-agent-skills.js +62 -0
  298. package/scripts/sync-utils.sh +3 -0
  299. package/scripts/test-ci-shard.js +13 -6
  300. package/scripts/test.js +95 -12
  301. package/skills/claim-safety/SKILL.md +102 -0
  302. package/skills/claim-safety/evals/evals.json +46 -0
  303. package/{.github/prompts/dev.prompt.md → skills/dev/SKILL.md} +44 -50
  304. package/skills/dev/evals/evals.json +50 -0
  305. package/skills/hermes-forge/SKILL.md +185 -0
  306. package/skills/hermes-forge/evals/evals.json +46 -0
  307. package/skills/issue-basics/SKILL.md +111 -0
  308. package/skills/issue-basics/evals/evals.json +46 -0
  309. package/skills/kernel/SKILL.md +166 -0
  310. package/skills/kernel/evals/evals.json +50 -0
  311. package/skills/memory/SKILL.md +102 -0
  312. package/skills/parallel-deep-research/SKILL.md +14 -11
  313. package/skills/parallel-deep-research/evals/evals.json +11 -27
  314. package/{.github/prompts/plan.prompt.md → skills/plan/SKILL.md} +132 -157
  315. package/skills/plan/evals/evals.json +42 -0
  316. package/skills/research/SKILL.md +195 -0
  317. package/skills/research/evals/evals.json +42 -0
  318. package/{.github/prompts/review.prompt.md → skills/review/SKILL.md} +98 -62
  319. package/skills/review/evals/evals.json +42 -0
  320. package/skills/rollback/SKILL.md +110 -0
  321. package/skills/rollback/evals/evals.json +46 -0
  322. package/skills/rollback/references/methods.md +204 -0
  323. package/{.cursor/commands/rollback.md → skills/rollback/references/workflow-integration.md} +10 -284
  324. package/skills/shepherd/SKILL.md +66 -0
  325. package/skills/shepherd/evals/evals.json +42 -0
  326. package/{.github/prompts/ship.prompt.md → skills/ship/SKILL.md} +81 -45
  327. package/skills/ship/evals/evals.json +42 -0
  328. package/skills/smith/SKILL.md +142 -0
  329. package/skills/smith/evals/evals.json +46 -0
  330. package/skills/smith/references/autonomy-and-gates.md +94 -0
  331. package/{.github/prompts/sonarcloud.prompt.md → skills/sonarcloud/SKILL.md} +14 -3
  332. package/skills/sonarcloud/evals/evals.json +46 -0
  333. package/skills/sonarcloud-analysis/SKILL.md +18 -13
  334. package/skills/sonarcloud-analysis/evals/evals.json +11 -15
  335. package/{.github/prompts/status.prompt.md → skills/status/SKILL.md} +20 -10
  336. package/skills/status/evals/evals.json +50 -0
  337. package/skills/triage-ready/SKILL.md +121 -0
  338. package/skills/triage-ready/evals/evals.json +42 -0
  339. package/{.github/prompts/validate.prompt.md → skills/validate/SKILL.md} +52 -29
  340. package/skills/validate/evals/evals.json +42 -0
  341. package/skills/verify/SKILL.md +299 -0
  342. package/skills/verify/evals/evals.json +50 -0
  343. package/.claude/commands/dev.md +0 -345
  344. package/.claude/commands/plan.md +0 -566
  345. package/.claude/commands/premerge.md +0 -186
  346. package/.claude/commands/research.md +0 -42
  347. package/.claude/commands/review.md +0 -451
  348. package/.claude/commands/rollback.md +0 -721
  349. package/.claude/commands/ship.md +0 -213
  350. package/.claude/commands/sonarcloud.md +0 -152
  351. package/.claude/commands/status.md +0 -90
  352. package/.claude/commands/validate.md +0 -288
  353. package/.claude/commands/verify.md +0 -269
  354. package/.claude/rules/workflow.md +0 -121
  355. package/.cline/workflows/dev.md +0 -342
  356. package/.cline/workflows/plan.md +0 -563
  357. package/.cline/workflows/premerge.md +0 -183
  358. package/.cline/workflows/research.md +0 -39
  359. package/.cline/workflows/review.md +0 -448
  360. package/.cline/workflows/rollback.md +0 -718
  361. package/.cline/workflows/ship.md +0 -210
  362. package/.cline/workflows/sonarcloud.md +0 -146
  363. package/.cline/workflows/status.md +0 -87
  364. package/.cline/workflows/validate.md +0 -285
  365. package/.cline/workflows/verify.md +0 -266
  366. package/.codex/config.toml +0 -11
  367. package/.codex/skills/dev/SKILL.md +0 -345
  368. package/.codex/skills/plan/SKILL.md +0 -566
  369. package/.codex/skills/premerge/SKILL.md +0 -186
  370. package/.codex/skills/research/SKILL.md +0 -42
  371. package/.codex/skills/review/SKILL.md +0 -451
  372. package/.codex/skills/rollback/SKILL.md +0 -721
  373. package/.codex/skills/ship/SKILL.md +0 -213
  374. package/.codex/skills/sonarcloud/SKILL.md +0 -149
  375. package/.codex/skills/status/SKILL.md +0 -90
  376. package/.codex/skills/validate/SKILL.md +0 -288
  377. package/.codex/skills/verify/SKILL.md +0 -269
  378. package/.cursor/commands/dev.md +0 -342
  379. package/.cursor/commands/plan.md +0 -563
  380. package/.cursor/commands/premerge.md +0 -183
  381. package/.cursor/commands/research.md +0 -39
  382. package/.cursor/commands/review.md +0 -448
  383. package/.cursor/commands/ship.md +0 -210
  384. package/.cursor/commands/sonarcloud.md +0 -146
  385. package/.cursor/commands/status.md +0 -87
  386. package/.cursor/commands/validate.md +0 -285
  387. package/.cursor/commands/verify.md +0 -266
  388. package/.cursorrules +0 -149
  389. package/.github/prompts/premerge.prompt.md +0 -188
  390. package/.github/prompts/research.prompt.md +0 -44
  391. package/.github/prompts/rollback.prompt.md +0 -723
  392. package/.github/prompts/verify.prompt.md +0 -271
  393. package/.github/workflows/beads-to-github.yml +0 -89
  394. package/.github/workflows/github-to-beads.yml +0 -100
  395. package/.kilocode/workflows/dev.md +0 -346
  396. package/.kilocode/workflows/plan.md +0 -567
  397. package/.kilocode/workflows/premerge.md +0 -187
  398. package/.kilocode/workflows/research.md +0 -43
  399. package/.kilocode/workflows/review.md +0 -452
  400. package/.kilocode/workflows/rollback.md +0 -722
  401. package/.kilocode/workflows/ship.md +0 -214
  402. package/.kilocode/workflows/sonarcloud.md +0 -150
  403. package/.kilocode/workflows/status.md +0 -91
  404. package/.kilocode/workflows/validate.md +0 -289
  405. package/.kilocode/workflows/verify.md +0 -270
  406. package/.opencode/commands/dev.md +0 -345
  407. package/.opencode/commands/plan.md +0 -566
  408. package/.opencode/commands/premerge.md +0 -186
  409. package/.opencode/commands/research.md +0 -42
  410. package/.opencode/commands/review.md +0 -451
  411. package/.opencode/commands/rollback.md +0 -721
  412. package/.opencode/commands/ship.md +0 -213
  413. package/.opencode/commands/sonarcloud.md +0 -149
  414. package/.opencode/commands/status.md +0 -90
  415. package/.opencode/commands/validate.md +0 -288
  416. package/.opencode/commands/verify.md +0 -269
  417. package/.roo/commands/dev.md +0 -346
  418. package/.roo/commands/plan.md +0 -567
  419. package/.roo/commands/premerge.md +0 -187
  420. package/.roo/commands/research.md +0 -43
  421. package/.roo/commands/review.md +0 -452
  422. package/.roo/commands/rollback.md +0 -722
  423. package/.roo/commands/ship.md +0 -214
  424. package/.roo/commands/sonarcloud.md +0 -150
  425. package/.roo/commands/status.md +0 -91
  426. package/.roo/commands/validate.md +0 -289
  427. package/.roo/commands/verify.md +0 -270
  428. package/docs/BEADS_GITHUB_SYNC.md +0 -281
  429. package/docs/GREPTILE_SETUP.md +0 -400
  430. package/docs/MANUAL_REVIEW_GUIDE.md +0 -106
  431. package/docs/SETUP.md +0 -663
  432. package/docs/VALIDATION.md +0 -363
  433. package/lib/agents/cline.plugin.json +0 -29
  434. package/lib/agents/copilot.plugin.json +0 -24
  435. package/lib/agents/kilocode.plugin.json +0 -22
  436. package/lib/agents/opencode.plugin.json +0 -23
  437. package/lib/agents/roo.plugin.json +0 -30
  438. package/lib/beads-bootstrap.js +0 -225
  439. package/lib/beads-health-check.js +0 -188
  440. package/lib/commands/commands-reset.js +0 -147
  441. package/opencode.json +0 -67
  442. package/scripts/beads-context.test.js +0 -584
  443. package/scripts/github-beads-sync/comment.mjs +0 -64
  444. package/scripts/github-beads-sync/config.mjs +0 -148
  445. package/scripts/github-beads-sync/github-api.mjs +0 -131
  446. package/scripts/github-beads-sync/index.mjs +0 -356
  447. package/scripts/github-beads-sync/label-mapper.mjs +0 -54
  448. package/scripts/github-beads-sync/mapping.mjs +0 -132
  449. package/scripts/github-beads-sync/reverse-sync-cli.mjs +0 -31
  450. package/scripts/github-beads-sync/reverse-sync.mjs +0 -162
  451. package/scripts/github-beads-sync/run-bd.mjs +0 -161
  452. package/scripts/github-beads-sync/sanitize.mjs +0 -121
  453. package/scripts/github-beads-sync.config.json +0 -26
  454. package/scripts/sync-commands.js +0 -600
@@ -0,0 +1,307 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+ const { GreptileReviewAdapter } = require('./adapters/greptile-review-adapter');
6
+ const { validateReviewAdapter } = require('./review-adapter');
7
+
8
+ const RESERVED_ADAPTER_NAMES = new Set(['greptile']);
9
+ const REQUIRED_NORMALIZED_THREAD_KEYS = ['id', 'commentId', 'file', 'line', 'body', 'author', 'isResolved', 'raw'];
10
+
11
+ function parseOption(args, name, fallback = undefined) {
12
+ const prefix = `--${name}=`;
13
+ const inline = args.find((arg) => arg.startsWith(prefix));
14
+ if (inline) {
15
+ return inline.slice(prefix.length);
16
+ }
17
+ const index = args.indexOf(`--${name}`);
18
+ if (index !== -1 && args[index + 1] && !args[index + 1].startsWith('--')) {
19
+ return args[index + 1];
20
+ }
21
+ if (index !== -1) {
22
+ return '';
23
+ }
24
+ return fallback;
25
+ }
26
+
27
+ function validateAdapterName(name) {
28
+ if (!name || typeof name !== 'string') {
29
+ return 'Adapter name is required';
30
+ }
31
+ if (!/^[a-z][a-z0-9-]*$/.test(name)) {
32
+ return 'Adapter name must start with a lowercase letter and contain only lowercase letters, numbers, and hyphens';
33
+ }
34
+ return null;
35
+ }
36
+
37
+ function assertValidAdapterName(name) {
38
+ const error = validateAdapterName(name);
39
+ if (error) {
40
+ throw new Error(error);
41
+ }
42
+ }
43
+
44
+ function isReservedAdapterName(name) {
45
+ return RESERVED_ADAPTER_NAMES.has(name);
46
+ }
47
+
48
+ function adapterNameToClassName(name) {
49
+ return `${name
50
+ .split(/[^a-zA-Z0-9]+/)
51
+ .filter(Boolean)
52
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
53
+ .join('')}ReviewAdapter`;
54
+ }
55
+
56
+ function getReviewAdapterDir(projectRoot) {
57
+ return path.join(projectRoot, '.forge', 'adapters', 'review');
58
+ }
59
+
60
+ function getAdapterPath(projectRoot, name, kind = 'review') {
61
+ assertValidAdapterName(name);
62
+ const adapterDir = path.resolve(projectRoot, '.forge', 'adapters', kind);
63
+ const adapterPath = path.resolve(adapterDir, `${name}.js`);
64
+ if (!adapterPath.startsWith(`${adapterDir}${path.sep}`)) {
65
+ throw new Error('Adapter path must stay under .forge/adapters');
66
+ }
67
+ return adapterPath;
68
+ }
69
+
70
+ function renderReviewAdapterScaffold(name, template) {
71
+ const className = adapterNameToClassName(name);
72
+ return `'use strict';
73
+
74
+ class ${className} {
75
+ constructor(options = {}) {
76
+ this.id = options.id || '${name}';
77
+ this.kind = 'review';
78
+ this.name = options.name || '${className}';
79
+ }
80
+
81
+ async fetchThreads(_context) {
82
+ throw new Error('${name}.fetchThreads must connect to the review provider');
83
+ }
84
+
85
+ parse(_payload) {
86
+ // Start from the ${template} template and normalize provider payloads into:
87
+ // { id, commentId, file, line, body, author, isResolved, raw }
88
+ throw new Error('${name}.parse must normalize provider payloads before use');
89
+ }
90
+
91
+ async reply(_context) {
92
+ throw new Error('${name}.reply must post a review-thread reply');
93
+ }
94
+
95
+ async resolve(_context) {
96
+ throw new Error('${name}.resolve must mark a review thread resolved');
97
+ }
98
+
99
+ score(threads) {
100
+ return threads.map((thread) => ({ ...thread, resolved: false, reason: 'not scored' }));
101
+ }
102
+ }
103
+
104
+ module.exports = { ${className} };
105
+ `;
106
+ }
107
+
108
+ function scaffoldAdapter(args, projectRoot) {
109
+ const subcommand = args[0];
110
+ const name = args[1];
111
+ const kind = parseOption(args, 'kind', 'review');
112
+ const template = parseOption(args, 'template', 'greptile');
113
+
114
+ if (subcommand !== 'adapter' || !name) {
115
+ return { success: false, error: 'Usage: forge new adapter <name> --kind=review --template=greptile' };
116
+ }
117
+ const nameError = validateAdapterName(name);
118
+ if (nameError) {
119
+ return { success: false, error: nameError };
120
+ }
121
+ if (isReservedAdapterName(name)) {
122
+ return { success: false, error: `Adapter name is reserved: ${name}` };
123
+ }
124
+ if (kind !== 'review') {
125
+ return { success: false, error: 'Only --kind=review is supported in this foundation PR' };
126
+ }
127
+ if (template !== 'greptile') {
128
+ return { success: false, error: 'Only --template=greptile is supported in this foundation PR' };
129
+ }
130
+
131
+ const adapterDir = getReviewAdapterDir(projectRoot);
132
+ const adapterPath = getAdapterPath(projectRoot, name, kind);
133
+ fs.mkdirSync(adapterDir, { recursive: true });
134
+
135
+ if (fs.existsSync(adapterPath)) {
136
+ return { success: false, error: `Adapter already exists: ${path.relative(projectRoot, adapterPath)}` };
137
+ }
138
+
139
+ fs.writeFileSync(adapterPath, renderReviewAdapterScaffold(name, template));
140
+
141
+ return {
142
+ success: true,
143
+ output: `Created review adapter scaffold: ${path.relative(projectRoot, adapterPath).split(path.sep).join('/')}`,
144
+ };
145
+ }
146
+
147
+ function loadAdapter(name, projectRoot) {
148
+ if (name === 'greptile') {
149
+ return new GreptileReviewAdapter();
150
+ }
151
+
152
+ const adapterPath = getAdapterPath(projectRoot, name);
153
+ if (!fs.existsSync(adapterPath)) {
154
+ throw new Error(`Adapter not found: ${name}`);
155
+ }
156
+
157
+ const mod = require(adapterPath);
158
+ const exported = mod.default || mod[adapterNameToClassName(name)] || mod.adapter || mod;
159
+ return typeof exported === 'function' ? new exported() : exported;
160
+ }
161
+
162
+ function hasNormalizedReviewThreadShape(thread) {
163
+ return Boolean(thread)
164
+ && REQUIRED_NORMALIZED_THREAD_KEYS.every((key) => Object.prototype.hasOwnProperty.call(thread, key));
165
+ }
166
+
167
+ async function runFixtureReplay(args, projectRoot) {
168
+ const name = args[1];
169
+ const fixturePath = parseOption(args, 'fixture');
170
+
171
+ if (!name || !fixturePath) {
172
+ return { success: false, error: 'Usage: forge adapter test <name> --fixture=<path>' };
173
+ }
174
+
175
+ let adapter;
176
+ try {
177
+ adapter = loadAdapter(name, projectRoot);
178
+ } catch (error) {
179
+ return { success: false, error: error.message };
180
+ }
181
+ const validation = validateReviewAdapter(adapter);
182
+ if (!validation.valid) {
183
+ return { success: false, error: validation.errors.join('; ') };
184
+ }
185
+
186
+ const absoluteFixturePath = path.isAbsolute(fixturePath)
187
+ ? fixturePath
188
+ : path.join(projectRoot, fixturePath);
189
+ let fixture;
190
+ let parsed;
191
+ let scores;
192
+ try {
193
+ fixture = JSON.parse(fs.readFileSync(absoluteFixturePath, 'utf8'));
194
+ const fixtureInput = Object.prototype.hasOwnProperty.call(fixture, 'input')
195
+ ? fixture.input
196
+ : fixture;
197
+ parsed = adapter.parse(fixtureInput);
198
+ if (!Array.isArray(parsed)) {
199
+ throw new Error('Adapter parse must return an array');
200
+ }
201
+ if (!parsed.every(hasNormalizedReviewThreadShape)) {
202
+ throw new Error('Adapter parse must return normalized review threads');
203
+ }
204
+ scores = await adapter.score(parsed, {
205
+ projectRoot,
206
+ sinceCommit: fixture.sinceCommit || null,
207
+ _exec: fixture.gitOutput ? () => fixture.gitOutput : () => '',
208
+ });
209
+ if (!Array.isArray(scores)) {
210
+ throw new Error('Adapter score must return an array');
211
+ }
212
+ } catch (error) {
213
+ return { success: false, error: `Fixture replay failed: ${error.message}` };
214
+ }
215
+
216
+ if (fixture.expect?.threads !== undefined && parsed.length !== fixture.expect.threads) {
217
+ return {
218
+ success: false,
219
+ error: `Expected ${fixture.expect.threads} parsed threads, got ${parsed.length}`,
220
+ };
221
+ }
222
+
223
+ return {
224
+ success: true,
225
+ output: `Adapter ${name} fixture replay passed: ${parsed.length} parsed thread${parsed.length === 1 ? '' : 's'}, ${scores.length} scored result${scores.length === 1 ? '' : 's'}`,
226
+ };
227
+ }
228
+
229
+ function listAdapters(projectRoot) {
230
+ const adapterDir = getReviewAdapterDir(projectRoot);
231
+ const local = fs.existsSync(adapterDir)
232
+ ? fs.readdirSync(adapterDir)
233
+ .filter((file) => file.endsWith('.js'))
234
+ .map((file) => file.replace(/\.js$/, ''))
235
+ .filter((name) => !isReservedAdapterName(name))
236
+ : [];
237
+ return ['greptile', ...local].sort((left, right) => left.localeCompare(right));
238
+ }
239
+
240
+ function setAdapterEnabled(args, projectRoot, enabled) {
241
+ const name = args[1];
242
+ if (!name) {
243
+ return { success: false, error: `Usage: forge adapter ${enabled ? 'enable' : 'disable'} <name>` };
244
+ }
245
+ const nameError = validateAdapterName(name);
246
+ if (nameError) {
247
+ return { success: false, error: nameError };
248
+ }
249
+ let config;
250
+ try {
251
+ const configDir = path.join(projectRoot, '.forge');
252
+ const configPath = path.join(configDir, 'adapters.json');
253
+ fs.mkdirSync(configDir, { recursive: true });
254
+ const parsedConfig = fs.existsSync(configPath)
255
+ ? JSON.parse(fs.readFileSync(configPath, 'utf8'))
256
+ : null;
257
+ config = parsedConfig && typeof parsedConfig === 'object' && !Array.isArray(parsedConfig)
258
+ ? parsedConfig
259
+ : { review: {} };
260
+ config.review = config.review && typeof config.review === 'object' && !Array.isArray(config.review)
261
+ ? config.review
262
+ : {};
263
+ config.review[name] = { ...(config.review[name] || {}), enabled };
264
+ fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\n`);
265
+ } catch (error) {
266
+ return { success: false, error: `Failed to update adapter config: ${error.message}` };
267
+ }
268
+ return {
269
+ success: true,
270
+ output: `${enabled ? 'Enabled' : 'Disabled'} review adapter: ${name}`,
271
+ };
272
+ }
273
+
274
+ async function handleAdapterCommand(args, projectRoot) {
275
+ const action = args[0];
276
+
277
+ if (action === 'test') {
278
+ return runFixtureReplay(args, projectRoot);
279
+ }
280
+ if (action === 'list') {
281
+ return { success: true, output: listAdapters(projectRoot).join('\n') };
282
+ }
283
+ if (action === 'enable') {
284
+ return setAdapterEnabled(args, projectRoot, true);
285
+ }
286
+ if (action === 'disable') {
287
+ return setAdapterEnabled(args, projectRoot, false);
288
+ }
289
+
290
+ return {
291
+ success: false,
292
+ error: 'Usage: forge adapter <test|list|enable|disable> ...',
293
+ };
294
+ }
295
+
296
+ module.exports = {
297
+ adapterNameToClassName,
298
+ getAdapterPath,
299
+ handleAdapterCommand,
300
+ hasNormalizedReviewThreadShape,
301
+ isReservedAdapterName,
302
+ listAdapters,
303
+ runFixtureReplay,
304
+ scaffoldAdapter,
305
+ setAdapterEnabled,
306
+ validateAdapterName,
307
+ };
@@ -0,0 +1,127 @@
1
+ 'use strict';
2
+
3
+ const {
4
+ IssueAdapter,
5
+ decideIssueAuthority,
6
+ normalizeIssueStatus,
7
+ } = require('../issue-adapter.js');
8
+
9
+ class BeadsIssueAdapter extends IssueAdapter {
10
+ constructor(options = {}) {
11
+ super({
12
+ id: options.id || 'beads',
13
+ kind: 'issue',
14
+ name: options.name || 'Beads Issue Adapter',
15
+ version: options.version || '0.1.0',
16
+ });
17
+ this.runBeadsOperation = options.runBeadsOperation;
18
+ }
19
+
20
+ run(operation, args = [], context = {}) {
21
+ if (typeof this.runBeadsOperation !== 'function') {
22
+ throw new TypeError('runBeadsOperation is not configured on this adapter');
23
+ }
24
+
25
+ return this.runBeadsOperation(operation, args, context, context.deps || {});
26
+ }
27
+
28
+ list(args = [], context = {}) {
29
+ return this.run('list', args, context);
30
+ }
31
+
32
+ ready(args = [], context = {}) {
33
+ return this.run('ready', args, context);
34
+ }
35
+
36
+ read(args = [], context = {}) {
37
+ return this.run('show', args, context);
38
+ }
39
+
40
+ show(args = [], context = {}) {
41
+ return this.read(args, context);
42
+ }
43
+
44
+ create(args = [], context = {}) {
45
+ return this.run('create', args, context);
46
+ }
47
+
48
+ search(args = [], context = {}) {
49
+ return this.run('search', args, context);
50
+ }
51
+
52
+ stats(args = [], context = {}) {
53
+ return this.run('stats', args, context);
54
+ }
55
+
56
+ update(args = [], context = {}) {
57
+ return this.run('update', args, context);
58
+ }
59
+
60
+ close(args = [], context = {}) {
61
+ return this.run('close', args, context);
62
+ }
63
+
64
+ comment(args = [], context = {}) {
65
+ return this.run('comment', args, context);
66
+ }
67
+
68
+ depAdd(args = [], context = {}) {
69
+ return this.run('dep.add', args, context);
70
+ }
71
+
72
+ depRemove(args = [], context = {}) {
73
+ return this.run('dep.remove', args, context);
74
+ }
75
+
76
+ // De-bead parity: claim/release and the KAP-7/KAP-12 derived reads now route
77
+ // through the backend abstraction (the translations moved out of _issue.js). The
78
+ // beads layer maps claim -> `update <id> --claim`; release has no bd equivalent
79
+ // and returns the Kernel-only contract error (handled in runBeadsOperation).
80
+ claim(args = [], context = {}) {
81
+ return this.run('claim', args, context);
82
+ }
83
+
84
+ release(args = [], context = {}) {
85
+ return this.run('release', args, context);
86
+ }
87
+
88
+ blocked(args = [], context = {}) {
89
+ return this.run('blocked', args, context);
90
+ }
91
+
92
+ stale(args = [], context = {}) {
93
+ return this.run('stale', args, context);
94
+ }
95
+
96
+ orphans(args = [], context = {}) {
97
+ return this.run('orphans', args, context);
98
+ }
99
+
100
+ lint(args = [], context = {}) {
101
+ return this.run('lint', args, context);
102
+ }
103
+
104
+ // Lease ownership is Kernel-only; the beads layer returns the Kernel-only contract
105
+ // error (handled in runBeadsOperation), matching the release passthrough.
106
+ owns(args = [], context = {}) {
107
+ return this.run('owns', args, context);
108
+ }
109
+
110
+ // Active-lease listing is Kernel-only (kernel_claims); the beads layer returns the
111
+ // Kernel-only contract error (handled in runBeadsOperation), matching owns/release.
112
+ claims(args = [], context = {}) {
113
+ return this.run('claims', args, context);
114
+ }
115
+
116
+ mapStatus(status, context = {}) {
117
+ return normalizeIssueStatus(status, context);
118
+ }
119
+
120
+ decideAuthority(change = {}, context = {}) {
121
+ return decideIssueAuthority(change, context);
122
+ }
123
+ }
124
+
125
+ module.exports = {
126
+ BeadsIssueAdapter,
127
+ };