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,148 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * `forge control <gate-id|rail-id> <mandatory|optional|permission>`
5
+ * `forge control status [--json]`
6
+ *
7
+ * Tri-state control for the gate/rail CONFIG registry (`gate.*` / `rail.*`) —
8
+ * this sets *declared* intent, NOT runtime enforcement. Setting a state writes
9
+ * the SAME resolver-consumed field `forge gate` writes
10
+ * (`workflow.gates.<id>.enabled`); there is deliberately NO parallel `controls:`
11
+ * key, because a key the resolver never reads would be doubly-fake. The tri-state
12
+ * is the vocabulary; `enabled` is the stored truth (state is derived at read
13
+ * time). IMPORTANT: as of 2026-07-15 no runtime consumer denies on these flags —
14
+ * real enforcement lives independently (lefthook TDD hook, fail-closed
15
+ * validate/preflight, enforce-stage order+completion). See the guarantee matrix.
16
+ *
17
+ * For MCP servers / rules / skills it REFUSES with a clear "presence-only, not
18
+ * enforceable" message pointing at docs/reference/control-plane-guarantees.md,
19
+ * rather than pretend a control it cannot honor.
20
+ *
21
+ * `status` renders the all-surface read view with enforcement-locus badges
22
+ * (724356ea) so the UI never implies enforcement a surface lacks.
23
+ */
24
+
25
+ const path = require('node:path');
26
+ const { setConfigOverride } = require('../config-writer');
27
+ const { getDefaultRuntimeGraph, getResolvedRuntimeGraph } = require('../core/runtime-graph');
28
+ const {
29
+ classifySurface,
30
+ isControllable,
31
+ describeControl,
32
+ planControl,
33
+ GUARANTEE_DOC,
34
+ } = require('../control-plane');
35
+
36
+ function usage() {
37
+ return [
38
+ 'Usage: forge control <gate-id|rail-id> <mandatory|optional|permission>',
39
+ ' forge control status [--json]',
40
+ '',
41
+ `Tri-state control for the gate/rail registry. These flags are DECLARED intent`,
42
+ `— today no runtime consumer denies on them (see the guarantee matrix). MCP/`,
43
+ `rules/skills are presence-only and refused — see ${GUARANTEE_DOC}.`,
44
+ ].join('\n');
45
+ }
46
+
47
+ // The known toggleable set is gates PLUS unlocked rails — exactly the surface
48
+ // `forge gate` governs. Combined lookup because gate.* / rail.* namespaces are
49
+ // disjoint. Used to validate an id BEFORE writing (never mid-run).
50
+ function knownPrimitive(id) {
51
+ const graph = getDefaultRuntimeGraph();
52
+ return [...graph.gates, ...graph.rails].find(primitive => primitive.id === id);
53
+ }
54
+
55
+ function resolvedControls(projectRoot) {
56
+ const graph = getResolvedRuntimeGraph({ projectRoot });
57
+ return [...graph.gates, ...graph.rails].map(describeControl);
58
+ }
59
+
60
+ function renderStatus(records) {
61
+ const lines = ['Control plane — enforcement-locus per surface (honest to today wiring):', ''];
62
+ for (const rec of records) {
63
+ const state = rec.state ? ` [${rec.state}]` : '';
64
+ lines.push(`- ${rec.id}${state} ${rec.badge} (${rec.locus})`);
65
+ }
66
+ lines.push('');
67
+ lines.push(`No flag above is a wired runtime deny yet: real enforcement lives in`);
68
+ lines.push(`the lefthook TDD hook, fail-closed validate/preflight, and enforce-stage`);
69
+ lines.push(`order+completion — all independent of these flags. MCP/rules/skills are`);
70
+ lines.push(`presence-only (advisory) and not controllable here. See ${GUARANTEE_DOC}.`);
71
+ return `${lines.join('\n')}\n`;
72
+ }
73
+
74
+ function statusCommand(projectRoot, json) {
75
+ const records = resolvedControls(projectRoot);
76
+ if (json) {
77
+ return { success: true, output: `${JSON.stringify({ items: records }, null, 2)}\n` };
78
+ }
79
+ return { success: true, output: renderStatus(records) };
80
+ }
81
+
82
+ function setCommand(id, state, projectRoot) {
83
+ // Advisory surfaces (and unknown namespaces) are refused up front with the
84
+ // guarantee-matrix pointer — nothing is written.
85
+ if (!isControllable(id)) {
86
+ const plan = planControl({ id }, state);
87
+ return { success: false, error: plan.error };
88
+ }
89
+
90
+ // Validate the id is a real primitive BEFORE writing (mirrors `forge gate`).
91
+ const primitive = knownPrimitive(id);
92
+ if (!primitive) {
93
+ return {
94
+ success: false,
95
+ error: `Unknown ${classifySurface(id)} '${id}'. Run 'forge control status' to list controllable surfaces.`,
96
+ };
97
+ }
98
+
99
+ const plan = planControl({ id, locked: primitive.locked === true }, state);
100
+ if (!plan.ok) {
101
+ return { success: false, error: plan.error };
102
+ }
103
+
104
+ const { configPath } = setConfigOverride(
105
+ projectRoot,
106
+ ['workflow', 'gates', id, 'enabled'],
107
+ plan.enabled,
108
+ );
109
+ const where = path.relative(projectRoot, configPath) || configPath;
110
+ return {
111
+ success: true,
112
+ output: `set '${id}' to ${state} (workflow.gates.${id}.enabled=${plan.enabled}) in ${where}`,
113
+ };
114
+ }
115
+
116
+ async function handler(args, flags = {}, projectRoot = process.cwd()) {
117
+ const [first, second] = args;
118
+
119
+ if (first === 'status') {
120
+ // Reject junk after `status` (only the optional --json flag is allowed) so a
121
+ // typo like `forge control status enabled` errors instead of silently
122
+ // ignoring the extra token.
123
+ const extra = args.slice(1).filter(arg => arg !== '--json');
124
+ if (extra.length > 0) {
125
+ return {
126
+ success: false,
127
+ error: `Unexpected argument(s) for status: ${extra.join(', ')}.\n${usage()}`,
128
+ };
129
+ }
130
+ return statusCommand(projectRoot, flags.json === true || args.includes('--json'));
131
+ }
132
+
133
+ if (!first) {
134
+ return { success: false, error: usage() };
135
+ }
136
+ if (!second) {
137
+ return { success: false, error: `Missing state.\n${usage()}` };
138
+ }
139
+
140
+ return setCommand(first, second, projectRoot);
141
+ }
142
+
143
+ module.exports = {
144
+ name: 'control',
145
+ description: 'Set tri-state control (mandatory/optional/permission) for a gate or rail',
146
+ usage: usage(),
147
+ handler,
148
+ };
@@ -1,5 +1,5 @@
1
1
  'use strict';
2
2
 
3
- const { makeAliasCommand } = require('./_issue');
3
+ const { createIssueSubcommand } = require('./_issue');
4
4
 
5
- module.exports = makeAliasCommand('create');
5
+ module.exports = createIssueSubcommand('create');
@@ -11,6 +11,7 @@
11
11
  const { execFileSync } = require('node:child_process');
12
12
  const fs = require('node:fs');
13
13
  const path = require('node:path');
14
+ const { recordAndLabelSubagentAuditEvent } = require('../audit-evidence');
14
15
 
15
16
  function getExecOptions() {
16
17
  return { encoding: 'utf8', cwd: process.cwd(), timeout: 120000 };
@@ -380,21 +381,24 @@ async function executeDev(featureName, options = {}) {
380
381
  // Use --phase flag to explicitly specify GREEN or REFACTOR.
381
382
  currentPhase = detectTDDPhase({ sourceFiles, testFiles, testsPassing });
382
383
 
383
- return {
384
+ const result = {
384
385
  success: true,
385
386
  detectedPhase: currentPhase,
386
387
  autoDetected: true,
387
388
  guidance: getTDDGuidance(currentPhase),
388
389
  summary: `Default ${currentPhase} phase (use --phase flag for explicit phase control)`,
389
390
  };
391
+
392
+ return withDevAuditEvidence(featureName, currentPhase, result, options);
390
393
  }
391
394
 
392
395
  // Validate REFACTOR requires passing tests
393
396
  if (phase === 'REFACTOR' && testsPassing === false) {
394
- return {
397
+ const result = {
395
398
  success: false,
396
399
  error: 'Cannot proceed to REFACTOR phase: tests are failing. Complete GREEN phase first.',
397
400
  };
401
+ return withDevAuditEvidence(featureName, currentPhase, result, options);
398
402
  }
399
403
 
400
404
  // Execute based on phase
@@ -409,7 +413,8 @@ async function executeDev(featureName, options = {}) {
409
413
  result.summary = 'Write failing tests for the feature';
410
414
  } else if (currentPhase === 'GREEN') {
411
415
  // Run tests to check status
412
- const testResults = await runTests();
416
+ const runPhaseTests = options.runTests || runTests;
417
+ const testResults = await runPhaseTests();
413
418
  result.testResults = testResults;
414
419
  result.success = testResults.success; // Reflect actual test outcome
415
420
  if (!testResults.success) {
@@ -422,7 +427,7 @@ async function executeDev(featureName, options = {}) {
422
427
  result.summary = 'Improve code quality while keeping tests green';
423
428
  }
424
429
 
425
- return result;
430
+ return withDevAuditEvidence(featureName, currentPhase, result, options);
426
431
  } catch (error) {
427
432
  return {
428
433
  success: false,
@@ -431,6 +436,74 @@ async function executeDev(featureName, options = {}) {
431
436
  }
432
437
  }
433
438
 
439
+ function withDevAuditEvidence(featureName, phase, result, options = {}) {
440
+ if (!options.audit) {
441
+ return result;
442
+ }
443
+
444
+ const auditEvent = {
445
+ issueId: options.issueId,
446
+ phase,
447
+ taskTitle: `forge dev ${featureName}`,
448
+ prompt: `forge dev ${featureName} ${phase}`,
449
+ response: result.success === false
450
+ ? result.error || result.summary || result.guidance || ''
451
+ : result.summary || result.error || result.guidance || '',
452
+ verdict: result.success === false ? 'FAIL' : 'PASS',
453
+ metadata: {
454
+ featureName,
455
+ phase,
456
+ detectedPhase: result.detectedPhase,
457
+ nextPhase: result.nextPhase,
458
+ autoDetected: Boolean(result.autoDetected),
459
+ success: result.success !== false,
460
+ },
461
+ };
462
+
463
+ try {
464
+ const auditEvidence = emitImplementerAuditEvidence(auditEvent, options.auditOptions || {});
465
+ if (auditEvidence.record?.success === false) {
466
+ const auditError = auditEvidence.record.error || 'bd audit record failed';
467
+ return {
468
+ ...result,
469
+ success: false,
470
+ error: result.success === false ? result.error : `Audit evidence persistence failed: ${auditError}`,
471
+ auditEvidence,
472
+ };
473
+ }
474
+
475
+ return {
476
+ ...result,
477
+ auditEvidence,
478
+ };
479
+ } catch (error) {
480
+ if (isAuditCommandUnavailableError(error)) {
481
+ return {
482
+ ...result,
483
+ auditEvidence: {
484
+ success: false,
485
+ skipped: true,
486
+ error: error.message,
487
+ },
488
+ };
489
+ }
490
+
491
+ return {
492
+ ...result,
493
+ success: false,
494
+ error: result.success === false ? result.error : `Audit evidence persistence failed: ${error.message}`,
495
+ auditEvidence: {
496
+ success: false,
497
+ error: error.message,
498
+ },
499
+ };
500
+ }
501
+ }
502
+
503
+ function isAuditCommandUnavailableError(error) {
504
+ return error?.code === 'ENOENT' || /\bbd\b.*not found/i.test(error?.message || '');
505
+ }
506
+
434
507
  /**
435
508
  * Decision gate route constants
436
509
  *
@@ -557,12 +630,109 @@ function verifyTaskCompletion(taskTitle, ownedFiles, opts = {}) {
557
630
  return { committed: true, autoCommitted: true, commitSha, hasChanges: true };
558
631
  }
559
632
 
633
+ function emitDevSubagentAuditEvidence(role, phase, event = {}, options = {}) {
634
+ const safeEvent = event && typeof event === 'object' ? event : {};
635
+ return recordAndLabelSubagentAuditEvent({
636
+ ...safeEvent,
637
+ command: 'dev',
638
+ role,
639
+ phase: phase || safeEvent.phase,
640
+ }, options);
641
+ }
642
+
643
+ function emitImplementerAuditEvidence(event, options = {}) {
644
+ return emitDevSubagentAuditEvidence('implementer', event?.phase || 'GREEN', event, options);
645
+ }
646
+
647
+ function emitSpecReviewerAuditEvidence(event, options = {}) {
648
+ return emitDevSubagentAuditEvidence('spec_reviewer', 'SPEC', event, options);
649
+ }
650
+
651
+ function emitQualityReviewerAuditEvidence(event, options = {}) {
652
+ return emitDevSubagentAuditEvidence('quality_reviewer', 'QUALITY', event, options);
653
+ }
654
+
655
+ function isMissingDevFlagValue(value) {
656
+ return value === undefined || value === '' || (typeof value === 'string' && value.startsWith('--'));
657
+ }
658
+
659
+ function missingDevFlagValue(name, parsedArgs, flags) {
660
+ return { args: parsedArgs, flags, error: `${name} requires a value` };
661
+ }
662
+
663
+ function consumeSeparatedDevFlag(name, key, rawArgs, index, parsedArgs, flags) {
664
+ const value = rawArgs[index + 1];
665
+ if (isMissingDevFlagValue(value)) {
666
+ return missingDevFlagValue(name, parsedArgs, flags);
667
+ }
668
+
669
+ flags[key] = value;
670
+ return { consumed: 2 };
671
+ }
672
+
673
+ function consumeEqualsDevFlag(prefix, name, key, arg, parsedArgs, flags) {
674
+ const value = arg.slice(prefix.length);
675
+ if (value === '') {
676
+ return missingDevFlagValue(name, parsedArgs, flags);
677
+ }
678
+
679
+ flags[key] = value;
680
+ return { consumed: 1 };
681
+ }
682
+
683
+ function consumeDevFlag(rawArgs, index, parsedArgs, flags) {
684
+ const arg = rawArgs[index];
685
+ if (arg === '--issue-id') {
686
+ return consumeSeparatedDevFlag('--issue-id', 'issueId', rawArgs, index, parsedArgs, flags);
687
+ }
688
+ if (typeof arg === 'string' && arg.startsWith('--issue-id=')) {
689
+ return consumeEqualsDevFlag('--issue-id=', '--issue-id', 'issueId', arg, parsedArgs, flags);
690
+ }
691
+ if (arg === '--phase') {
692
+ return consumeSeparatedDevFlag('--phase', 'phase', rawArgs, index, parsedArgs, flags);
693
+ }
694
+ if (typeof arg === 'string' && arg.startsWith('--phase=')) {
695
+ return consumeEqualsDevFlag('--phase=', '--phase', 'phase', arg, parsedArgs, flags);
696
+ }
697
+
698
+ return { consumed: 0 };
699
+ }
700
+
701
+ function parseDevHandlerInput(rawArgs = [], rawFlags = {}) {
702
+ const parsedArgs = [];
703
+ const flags = { ...rawFlags };
704
+ if (flags['issue-id'] && !flags.issueId) {
705
+ flags.issueId = flags['issue-id'];
706
+ }
707
+
708
+ for (let i = 0; i < rawArgs.length; i++) {
709
+ const consumed = consumeDevFlag(rawArgs, i, parsedArgs, flags);
710
+ if (consumed.error) {
711
+ return consumed;
712
+ }
713
+ if (consumed.consumed > 0) {
714
+ i += consumed.consumed - 1;
715
+ continue;
716
+ }
717
+ parsedArgs.push(rawArgs[i]);
718
+ }
719
+
720
+ return { args: parsedArgs, flags };
721
+ }
722
+
560
723
  module.exports = {
561
724
  name: 'dev',
562
725
  description: 'Run the TDD development stage with phase guidance',
563
726
  handler: async (args, flags = {}) => {
564
- const featureName = args[0] || 'feature';
565
- const phaseInput = flags.phase || args[1];
727
+ const parsed = parseDevHandlerInput(args, flags);
728
+ if (parsed.error) {
729
+ return {
730
+ success: false,
731
+ error: parsed.error,
732
+ };
733
+ }
734
+ const featureName = parsed.args[0] || 'feature';
735
+ const phaseInput = parsed.flags.phase || parsed.args[1];
566
736
  const phase = typeof phaseInput === 'string' ? phaseInput.toUpperCase() : undefined;
567
737
  if (phase && !['RED', 'GREEN', 'REFACTOR'].includes(phase)) {
568
738
  return {
@@ -571,7 +741,12 @@ module.exports = {
571
741
  };
572
742
  }
573
743
 
574
- const result = await executeDev(featureName, phase ? { phase } : {});
744
+ const result = await executeDev(featureName, {
745
+ ...(phase ? { phase } : {}),
746
+ audit: true,
747
+ issueId: parsed.flags.issueId,
748
+ auditOptions: parsed.flags.auditOptions,
749
+ });
575
750
  if (!result.success) {
576
751
  return result;
577
752
  }
@@ -591,6 +766,9 @@ module.exports = {
591
766
  generateCommitMessage,
592
767
  identifyParallelWork,
593
768
  executeDev,
769
+ emitImplementerAuditEvidence,
770
+ emitSpecReviewerAuditEvidence,
771
+ emitQualityReviewerAuditEvidence,
594
772
  calculateDecisionRoute,
595
773
  DECISION_ROUTES,
596
774
  verifyTaskCompletion,