forge-workflow 0.0.9 → 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 (479) 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 +151 -61
  8. package/CHANGELOG.md +681 -0
  9. package/CLAUDE.md +9 -106
  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 +466 -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/{TOOLCHAIN.md → forge/TOOLCHAIN.md} +56 -47
  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/reference/TOOLCHAIN.md +658 -0
  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 +225 -28
  81. package/lib/beads-sync-scaffold.js +36 -107
  82. package/lib/codex-skills.js +51 -1
  83. package/lib/commands/_issue.js +744 -70
  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 +66 -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 +22 -2
  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 +851 -979
  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 +329 -11
  140. package/lib/commands/sync.js +34 -46
  141. package/lib/commands/team.js +15 -2
  142. package/lib/commands/test.js +58 -7
  143. package/lib/commands/update.js +2 -2
  144. package/lib/commands/upgrade.js +47 -0
  145. package/lib/commands/validate.js +56 -25
  146. package/lib/commands/worktree.js +308 -128
  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 +184 -0
  151. package/lib/deprecated-sync-cleanup.js +362 -0
  152. package/lib/detect-agent.js +2 -28
  153. package/lib/detect-worktree.js +42 -17
  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 +697 -0
  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/issue-sync/authority.js +100 -0
  174. package/lib/issue-sync/github-pull.js +184 -0
  175. package/lib/issue-sync/import-primitives.js +98 -0
  176. package/lib/issue-sync/legacy-link-bridge.js +436 -0
  177. package/lib/issue-sync/link-store.js +292 -0
  178. package/lib/issue-sync/project-github.js +123 -0
  179. package/lib/issue-sync/reconcile.js +195 -0
  180. package/lib/issue-sync/schema.js +126 -0
  181. package/lib/kernel/backing-issue.js +305 -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/planning-buckets-schema.js +109 -0
  192. package/lib/kernel/projection-jsonl-writer.js +450 -0
  193. package/lib/kernel/readiness-model.js +329 -0
  194. package/lib/kernel/schema.js +356 -0
  195. package/lib/kernel/sqlite-driver.js +2504 -0
  196. package/lib/kernel/taxonomy-validator.js +394 -0
  197. package/lib/lefthook-check.js +8 -4
  198. package/lib/lefthook-wiring.js +413 -0
  199. package/lib/mcp-config-renderer.js +288 -0
  200. package/lib/memory/graphiti-mcp.js +106 -0
  201. package/lib/memory/router.js +387 -0
  202. package/lib/memory/typed-api.js +102 -0
  203. package/lib/memory-digest.js +195 -0
  204. package/lib/merge-rules.js +395 -0
  205. package/lib/migrate-dry-run.js +466 -0
  206. package/lib/orientation.js +863 -0
  207. package/lib/package-manager-remediation.js +103 -0
  208. package/lib/package-root.js +381 -0
  209. package/lib/patch-intent.js +890 -0
  210. package/lib/plugin-catalog.js +3 -4
  211. package/lib/plugin-manager.js +0 -5
  212. package/lib/pr-bundle.js +186 -0
  213. package/lib/pr-monitor/differ.js +195 -0
  214. package/lib/pr-monitor/events.js +0 -0
  215. package/lib/pr-monitor/gather.js +124 -0
  216. package/lib/pr-monitor/journal.js +299 -0
  217. package/lib/pr-monitor/monitor.js +146 -0
  218. package/lib/pr-monitor/render-sticky.js +157 -0
  219. package/lib/pr-monitor/watch-lifecycle.js +95 -0
  220. package/lib/pr-monitor/watch.js +247 -0
  221. package/lib/pr-pull.js +1273 -0
  222. package/lib/pr-shepherd.js +494 -0
  223. package/lib/pr-state-validator.js +59 -0
  224. package/lib/preflight/gates.js +237 -0
  225. package/lib/preflight/runner.js +116 -0
  226. package/lib/project-discovery.js +0 -53
  227. package/lib/project-memory.js +166 -0
  228. package/lib/protected-path-manifest.js +281 -0
  229. package/lib/protected-state-surfaces.js +387 -0
  230. package/lib/release-readiness.js +2089 -0
  231. package/lib/reset.js +59 -45
  232. package/lib/review-adapter.js +68 -0
  233. package/lib/rules-sync.js +260 -0
  234. package/lib/runtime-health.js +332 -23
  235. package/lib/safety-config-renderer.js +268 -0
  236. package/lib/setup-action-log.js +1 -7
  237. package/lib/setup.js +27 -65
  238. package/lib/shell-utils.js +76 -6
  239. package/lib/skills-sync.js +330 -0
  240. package/lib/smart-status/conflicts.js +205 -0
  241. package/lib/smart-status/scoring.js +191 -0
  242. package/lib/status/beads-snapshot.js +145 -0
  243. package/lib/status/presenter.js +216 -0
  244. package/lib/status/snapshot.js +186 -0
  245. package/lib/sync-backend.js +202 -0
  246. package/lib/untrusted-content.js +52 -0
  247. package/lib/upgrade-safety.js +199 -0
  248. package/lib/workflow/enforce-stage.js +298 -47
  249. package/lib/workflow/stage-transition.js +115 -0
  250. package/lib/workflow/stages.js +30 -6
  251. package/lib/workflow/state-manager.js +159 -14
  252. package/lib/workflow/state.js +23 -1
  253. package/lib/workflow-profiles.js +17 -5
  254. package/package.json +46 -36
  255. package/rules/documentation.md +19 -0
  256. package/rules/kernel-tracking.md +26 -0
  257. package/rules/security.md +22 -0
  258. package/rules/tdd.md +20 -0
  259. package/rules/workflow.md +27 -0
  260. package/scripts/auto-backing-issue.js +47 -0
  261. package/scripts/beads-context.sh +165 -22
  262. package/scripts/beads-migrate-to-dolt.sh +7 -0
  263. package/scripts/beads-upgrade-smoke.sh +284 -0
  264. package/scripts/behavioral-judge.sh +115 -11
  265. package/scripts/benchmark.js +349 -63
  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-analyze.js +52 -17
  272. package/scripts/dep-guard-keyword-ripple.js +29 -0
  273. package/scripts/dep-guard-render-review.js +86 -0
  274. package/scripts/dep-guard.sh +64 -232
  275. package/scripts/file-index.sh +3 -0
  276. package/scripts/forge-team/lib/claim.sh +34 -18
  277. package/scripts/forge-team/lib/dashboard.sh +61 -86
  278. package/scripts/forge-team/lib/epic.sh +99 -263
  279. package/scripts/forge-team/lib/hooks.sh +26 -28
  280. package/scripts/forge-team/lib/identity.sh +4 -4
  281. package/scripts/forge-team/lib/sync-github.sh +144 -47
  282. package/scripts/forge-team/lib/verify.sh +93 -83
  283. package/scripts/forge-team/lib/workload.sh +41 -65
  284. package/scripts/forge-team/tests/claim.test.sh +25 -19
  285. package/scripts/forge-team/tests/dashboard.test.sh +31 -46
  286. package/scripts/forge-team/tests/epic.test.sh +52 -71
  287. package/scripts/forge-team/tests/hooks.test.sh +38 -50
  288. package/scripts/forge-team/tests/identity.test.sh +3 -3
  289. package/scripts/forge-team/tests/integration.test.sh +44 -66
  290. package/scripts/forge-team/tests/sync-github.test.sh +183 -79
  291. package/scripts/forge-team/tests/verify.test.sh +37 -46
  292. package/scripts/forge-team/tests/workflow-integration.test.sh +4 -4
  293. package/scripts/forge-team/tests/workload.test.sh +32 -66
  294. package/scripts/gen-command-manifest.js +153 -0
  295. package/scripts/gen-embedded-assets.mjs +129 -0
  296. package/scripts/install.ps1 +139 -0
  297. package/scripts/install.sh +268 -0
  298. package/scripts/lib/beads-migrate-to-dolt.mjs +503 -0
  299. package/scripts/lib/release-asset.mjs +84 -0
  300. package/scripts/parity-check.mjs +145 -0
  301. package/scripts/parity-check.test.mjs +58 -0
  302. package/scripts/pin-agentic-workflow-images.js +112 -0
  303. package/scripts/pr-coordinator.sh +3 -0
  304. package/scripts/preflight-sonar.eslint.config.mjs +44 -0
  305. package/scripts/preflight.sh +108 -0
  306. package/scripts/protected-state-check.js +104 -0
  307. package/scripts/smart-status-score.js +31 -0
  308. package/scripts/smart-status-sessions.js +51 -0
  309. package/scripts/smart-status.sh +117 -369
  310. package/scripts/spikes/config-race-bench.js +111 -0
  311. package/scripts/spikes/harness-capability-matrix.js +13 -0
  312. package/scripts/spikes/patch-anchor-stability-bench.js +125 -0
  313. package/scripts/spikes/protected-path-manifest.js +20 -0
  314. package/scripts/spikes/skill-auto-invoke-parity.js +292 -0
  315. package/scripts/sync-agent-skills.js +62 -0
  316. package/scripts/sync-agentic-workflow.js +48 -0
  317. package/scripts/sync-utils.sh +3 -0
  318. package/scripts/test-ci-shard.js +251 -0
  319. package/scripts/test-dashboard.js +188 -52
  320. package/scripts/test-full-suite.js +186 -0
  321. package/scripts/test-profile.js +278 -0
  322. package/scripts/test.js +302 -28
  323. package/scripts/validate.js +143 -0
  324. package/scripts/validate.sh +18 -1
  325. package/skills/claim-safety/SKILL.md +102 -0
  326. package/skills/claim-safety/evals/evals.json +46 -0
  327. package/{.github/prompts/dev.prompt.md → skills/dev/SKILL.md} +46 -52
  328. package/skills/dev/evals/evals.json +50 -0
  329. package/skills/hermes-forge/SKILL.md +185 -0
  330. package/skills/hermes-forge/evals/evals.json +46 -0
  331. package/skills/issue-basics/SKILL.md +111 -0
  332. package/skills/issue-basics/evals/evals.json +46 -0
  333. package/skills/kernel/SKILL.md +166 -0
  334. package/skills/kernel/evals/evals.json +50 -0
  335. package/skills/memory/SKILL.md +102 -0
  336. package/skills/parallel-deep-research/SKILL.md +14 -11
  337. package/skills/parallel-deep-research/evals/evals.json +11 -27
  338. package/{.github/prompts/plan.prompt.md → skills/plan/SKILL.md} +134 -159
  339. package/skills/plan/evals/evals.json +42 -0
  340. package/skills/research/SKILL.md +195 -0
  341. package/skills/research/evals/evals.json +42 -0
  342. package/{.github/prompts/review.prompt.md → skills/review/SKILL.md} +98 -62
  343. package/skills/review/evals/evals.json +42 -0
  344. package/skills/rollback/SKILL.md +110 -0
  345. package/skills/rollback/evals/evals.json +46 -0
  346. package/skills/rollback/references/methods.md +204 -0
  347. package/{.cursor/commands/rollback.md → skills/rollback/references/workflow-integration.md} +10 -284
  348. package/skills/shepherd/SKILL.md +66 -0
  349. package/skills/shepherd/evals/evals.json +42 -0
  350. package/skills/ship/SKILL.md +251 -0
  351. package/skills/ship/evals/evals.json +42 -0
  352. package/skills/smith/SKILL.md +142 -0
  353. package/skills/smith/evals/evals.json +46 -0
  354. package/skills/smith/references/autonomy-and-gates.md +94 -0
  355. package/{.github/prompts/sonarcloud.prompt.md → skills/sonarcloud/SKILL.md} +14 -3
  356. package/skills/sonarcloud/evals/evals.json +46 -0
  357. package/skills/sonarcloud-analysis/SKILL.md +18 -13
  358. package/skills/sonarcloud-analysis/evals/evals.json +11 -15
  359. package/skills/status/SKILL.md +102 -0
  360. package/skills/status/evals/evals.json +50 -0
  361. package/skills/triage-ready/SKILL.md +121 -0
  362. package/skills/triage-ready/evals/evals.json +42 -0
  363. package/{.github/prompts/validate.prompt.md → skills/validate/SKILL.md} +52 -29
  364. package/skills/validate/evals/evals.json +42 -0
  365. package/skills/verify/SKILL.md +299 -0
  366. package/skills/verify/evals/evals.json +50 -0
  367. package/.claude/commands/dev.md +0 -345
  368. package/.claude/commands/plan.md +0 -566
  369. package/.claude/commands/premerge.md +0 -186
  370. package/.claude/commands/research.md +0 -42
  371. package/.claude/commands/review.md +0 -451
  372. package/.claude/commands/rollback.md +0 -721
  373. package/.claude/commands/ship.md +0 -213
  374. package/.claude/commands/sonarcloud.md +0 -152
  375. package/.claude/commands/status.md +0 -90
  376. package/.claude/commands/validate.md +0 -288
  377. package/.claude/commands/verify.md +0 -269
  378. package/.claude/rules/workflow.md +0 -121
  379. package/.cline/workflows/dev.md +0 -342
  380. package/.cline/workflows/plan.md +0 -563
  381. package/.cline/workflows/premerge.md +0 -183
  382. package/.cline/workflows/research.md +0 -39
  383. package/.cline/workflows/review.md +0 -448
  384. package/.cline/workflows/rollback.md +0 -718
  385. package/.cline/workflows/ship.md +0 -210
  386. package/.cline/workflows/sonarcloud.md +0 -146
  387. package/.cline/workflows/status.md +0 -87
  388. package/.cline/workflows/validate.md +0 -285
  389. package/.cline/workflows/verify.md +0 -266
  390. package/.codex/config.toml +0 -11
  391. package/.codex/skills/dev/SKILL.md +0 -345
  392. package/.codex/skills/plan/SKILL.md +0 -566
  393. package/.codex/skills/premerge/SKILL.md +0 -186
  394. package/.codex/skills/research/SKILL.md +0 -42
  395. package/.codex/skills/review/SKILL.md +0 -451
  396. package/.codex/skills/rollback/SKILL.md +0 -721
  397. package/.codex/skills/ship/SKILL.md +0 -213
  398. package/.codex/skills/sonarcloud/SKILL.md +0 -149
  399. package/.codex/skills/status/SKILL.md +0 -90
  400. package/.codex/skills/validate/SKILL.md +0 -288
  401. package/.codex/skills/verify/SKILL.md +0 -269
  402. package/.cursor/commands/dev.md +0 -342
  403. package/.cursor/commands/plan.md +0 -563
  404. package/.cursor/commands/premerge.md +0 -183
  405. package/.cursor/commands/research.md +0 -39
  406. package/.cursor/commands/review.md +0 -448
  407. package/.cursor/commands/ship.md +0 -210
  408. package/.cursor/commands/sonarcloud.md +0 -146
  409. package/.cursor/commands/status.md +0 -87
  410. package/.cursor/commands/validate.md +0 -285
  411. package/.cursor/commands/verify.md +0 -266
  412. package/.cursorrules +0 -149
  413. package/.github/prompts/premerge.prompt.md +0 -188
  414. package/.github/prompts/research.prompt.md +0 -44
  415. package/.github/prompts/rollback.prompt.md +0 -723
  416. package/.github/prompts/ship.prompt.md +0 -215
  417. package/.github/prompts/status.prompt.md +0 -92
  418. package/.github/prompts/verify.prompt.md +0 -271
  419. package/.github/workflows/beads-to-github.yml +0 -56
  420. package/.github/workflows/github-to-beads.yml +0 -97
  421. package/.kilocode/workflows/dev.md +0 -346
  422. package/.kilocode/workflows/plan.md +0 -567
  423. package/.kilocode/workflows/premerge.md +0 -187
  424. package/.kilocode/workflows/research.md +0 -43
  425. package/.kilocode/workflows/review.md +0 -452
  426. package/.kilocode/workflows/rollback.md +0 -722
  427. package/.kilocode/workflows/ship.md +0 -214
  428. package/.kilocode/workflows/sonarcloud.md +0 -150
  429. package/.kilocode/workflows/status.md +0 -91
  430. package/.kilocode/workflows/validate.md +0 -289
  431. package/.kilocode/workflows/verify.md +0 -270
  432. package/.opencode/commands/dev.md +0 -345
  433. package/.opencode/commands/plan.md +0 -566
  434. package/.opencode/commands/premerge.md +0 -186
  435. package/.opencode/commands/research.md +0 -42
  436. package/.opencode/commands/review.md +0 -451
  437. package/.opencode/commands/rollback.md +0 -721
  438. package/.opencode/commands/ship.md +0 -213
  439. package/.opencode/commands/sonarcloud.md +0 -149
  440. package/.opencode/commands/status.md +0 -90
  441. package/.opencode/commands/validate.md +0 -288
  442. package/.opencode/commands/verify.md +0 -269
  443. package/.roo/commands/dev.md +0 -346
  444. package/.roo/commands/plan.md +0 -567
  445. package/.roo/commands/premerge.md +0 -187
  446. package/.roo/commands/research.md +0 -43
  447. package/.roo/commands/review.md +0 -452
  448. package/.roo/commands/rollback.md +0 -722
  449. package/.roo/commands/ship.md +0 -214
  450. package/.roo/commands/sonarcloud.md +0 -150
  451. package/.roo/commands/status.md +0 -91
  452. package/.roo/commands/validate.md +0 -289
  453. package/.roo/commands/verify.md +0 -270
  454. package/docs/BEADS_GITHUB_SYNC.md +0 -255
  455. package/docs/GREPTILE_SETUP.md +0 -400
  456. package/docs/MANUAL_REVIEW_GUIDE.md +0 -106
  457. package/docs/SETUP.md +0 -663
  458. package/docs/VALIDATION.md +0 -363
  459. package/lib/agents/cline.plugin.json +0 -29
  460. package/lib/agents/copilot.plugin.json +0 -24
  461. package/lib/agents/kilocode.plugin.json +0 -22
  462. package/lib/agents/opencode.plugin.json +0 -23
  463. package/lib/agents/roo.plugin.json +0 -30
  464. package/lib/beads-health-check.js +0 -143
  465. package/lib/commands/commands-reset.js +0 -147
  466. package/opencode.json +0 -67
  467. package/scripts/beads-context.test.js +0 -567
  468. package/scripts/github-beads-sync/comment.mjs +0 -64
  469. package/scripts/github-beads-sync/config.mjs +0 -148
  470. package/scripts/github-beads-sync/github-api.mjs +0 -131
  471. package/scripts/github-beads-sync/index.mjs +0 -332
  472. package/scripts/github-beads-sync/label-mapper.mjs +0 -54
  473. package/scripts/github-beads-sync/mapping.mjs +0 -78
  474. package/scripts/github-beads-sync/reverse-sync-cli.mjs +0 -31
  475. package/scripts/github-beads-sync/reverse-sync.mjs +0 -138
  476. package/scripts/github-beads-sync/run-bd.mjs +0 -161
  477. package/scripts/github-beads-sync/sanitize.mjs +0 -121
  478. package/scripts/github-beads-sync.config.json +0 -26
  479. 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
+ };