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
@@ -4,30 +4,19 @@ Complete reference for all tools integrated with the Forge workflow.
4
4
 
5
5
  ## Overview
6
6
 
7
+ Forge is a local runtime control plane that coordinates several tool surfaces:
8
+
9
+ ```text
10
+ Forge runtime control plane
11
+ - workflow templates and stage skills
12
+ - local project state and protected surfaces
13
+ - kernel-backed issue wrappers and sync (Beads is an opt-out backend)
14
+ - validation, packaging, and release evidence
15
+ - review adapters and external service hooks
16
+ - harness projections for agent-specific commands, prompts, workflows, and skills
7
17
  ```
8
- ┌─────────────────────────────────────────────────────────────────┐
9
- │ FORGE TOOLCHAIN │
10
- ├─────────────────────────────────────────────────────────────────┤
11
- │ │
12
- │ ┌─────────────┐ ┌─────────────────────┐ │
13
- │ │ BEADS │ │ EXTERNAL SERVICES │ │
14
- │ │ (bd) │ │ │ │
15
- │ │ │ │ Parallel AI │ │
16
- │ │ Git-backed │ │ Greptile │ │
17
- │ │ Issue │ │ SonarCloud │ │
18
- │ │ Tracking │ │ GitHub CLI │ │
19
- │ └─────────────┘ └─────────────────────┘ │
20
- │ │ │ │
21
- │ └─────────────────────┘ │
22
- │ │ │
23
- │ ┌─────▼─────┐ │
24
- │ │ FORGE │ │
25
- │ │ 7-Stage │ │
26
- │ │ Workflow │ │
27
- │ └───────────┘ │
28
- │ │
29
- └─────────────────────────────────────────────────────────────────┘
30
- ```
18
+
19
+ The default TDD-first workflow is a core template shipped by Forge. It is not the only runtime primitive. Toolchain docs should describe tools by the surface they support: setup, state, workflow stages, validation, review, release, sync, and recovery.
31
20
 
32
21
  ---
33
22
 
@@ -48,15 +37,17 @@ Windows gotchas:
48
37
 
49
38
  ---
50
39
 
51
- ## Beads - Dolt-Backed Issue Tracking
40
+ ## Beads - Opt-Out Dolt-Backed Issue Backend
52
41
 
53
42
  **Package**: `@beads/bd`
54
43
  **Repository**: [github.com/steveyegge/beads](https://github.com/steveyegge/beads)
55
44
  **Purpose**: Distributed issue tracking designed for AI coding agents
56
45
 
57
- ### Current Forge Target
46
+ > Forge issue wrappers use the built-in **kernel** backend by default — no `bd` install or `bd init` is required, and a fresh clone can track issues immediately. Beads is an **opt-out** backend selected (precedence, highest first) with `--issue-backend beads`, `FORGE_ISSUE_BACKEND=beads`, or `issueBackend: beads` in `.forge/config.yaml`. The rest of this section applies only when Beads is selected.
58
47
 
59
- - Forge now targets the stable Beads `v1.0.0` release for repo setup and CI.
48
+ ### When Beads Is Selected
49
+
50
+ - Forge targets the stable Beads `v1.0.0` release for Beads-backed setup and CI.
60
51
  - Routine team sync still goes through `forge sync`.
61
52
  - Use `bd` directly for Beads features Forge does not wrap yet, such as `bd init`, `bd comments`, `bd dep`, `bd blocked`, `bd backup`, and `bd dolt *`.
62
53
 
@@ -91,19 +82,22 @@ bd doctor
91
82
 
92
83
  ### Supported Repo Layout
93
84
 
94
- Forge treats `.beads/` as the repo-local Beads home directory. The layout in this repository currently includes:
85
+ Forge treats `.beads/` as the repo-local Beads home directory. `.beads/` is local runtime/export state and is not committed to the repository. `forge setup` writes local Git exclude rules under `.git/info/exclude` so Beads state does not dirty downstream projects.
86
+
87
+ A local initialized checkout may contain:
95
88
 
96
89
  ```text
97
90
  .beads/
98
- ├── config.yaml
99
- ├── issues.jsonl
100
- ├── metadata.json
101
- ├── team-map.jsonl
102
- ├── hooks/
103
- └── .gitignore
91
+ ├── config.yaml # local Beads config
92
+ ├── issues.jsonl # local/exported issue data
93
+ ├── metadata.json # local Beads metadata
94
+ ├── team-map.jsonl # local/team projection data
95
+ ├── backup/ # local backup/export state
96
+ ├── hooks/ # local hook shims created by Beads
97
+ └── .gitignore # local ignore guard for runtime files
104
98
  ```
105
99
 
106
- Legacy local database cache files are no longer part of the supported Forge setup instructions. When you need JSONL snapshots for migration verification or CI diffing, generate them explicitly with `bd backup --force`.
100
+ No `.beads/` files are expected to appear in `git ls-files .beads`. Legacy local database cache files are no longer part of the supported Forge setup instructions. When you need JSONL snapshots for migration verification or CI diffing, generate them explicitly with `bd backup --force` and publish them through the intended sync/projection path, not by committing live `.beads/` runtime files.
107
101
 
108
102
  ### Migrate Legacy SQLite Data
109
103
 
@@ -140,6 +134,26 @@ See the script help for explicit path overrides:
140
134
  bash scripts/beads-migrate-to-dolt.sh --help
141
135
  ```
142
136
 
137
+ ### Project Memory
138
+
139
+ Forge project memory is a **kernel-backed** read model. `lib/project-memory.js` persists memories in the per-repo Forge Kernel store (the `kernel_memories` table, via the built-in SQLite driver) — it does **not** call `bd`. No Beads install is required for `forge remember` / `forge recall`.
140
+
141
+ `forge remember` / `forge recall` route through this same `kernel_memories` table (via `lib/memory/router.js`), indexed by **FTS5** for token-AND BM25 recall: a `recall` query does full-text matching, and a no-query `recall` returns the newest notes plus a total count (never a full dump). Because the insights engine also writes `kernel_memories`, what it learns is recallable. Any legacy `.forge/memory/notes.jsonl` is imported once on first use, then retired. The opt-in **`graphiti`** backend is **experimental** — its config/doctor checks ship but the runtime write-through emitter is a fast-follow, so selecting it today still writes the local kernel floor. See [docs/guides/memory-backends.md](../guides/memory-backends.md).
142
+
143
+ Typed memory helpers in `lib/memory/typed-api.js` add category and provenance conventions on top of the same kernel store; they do not create a new datastore. The supported categories are:
144
+
145
+ | Category | Key prefix | Durable backend |
146
+ | --- | --- | --- |
147
+ | decisions | `decisions:` | Kernel memory index for canonical docs/work decisions |
148
+ | episodes | `episodes:` | Kernel-backed memory/audit context |
149
+ | skills | `skills:` | Kernel memory index for skill references |
150
+ | state | `state:` | Forge-owned state references |
151
+ | issues | `issues:` | Issue references (`beadsRefs` may cross-link Beads issues when that backend is selected) |
152
+ | audit | `audit:` | Kernel-backed audit references |
153
+ | preferences | `preferences:` | Kernel memory preferences |
154
+
155
+ Every typed write must include provenance fields: `actor`, `reason`, and `source`.
156
+
143
157
  ### Post-Upgrade Smoke Verification
144
158
 
145
159
  Run the repo smoke harness after upgrading:
@@ -224,17 +238,12 @@ Context7 provides current documentation that may be more recent than the AI's tr
224
238
  "mcpServers": {
225
239
  "context7": {
226
240
  "command": "bunx",
227
- "args": ["--bun", "@upstash/context7-mcp@latest"]
241
+ "args": ["--bun", "@upstash/context7-mcp@2"]
228
242
  }
229
243
  }
230
244
  }
231
245
  ```
232
246
 
233
- **Cline (VSCode)**:
234
- 1. Open VSCode Settings
235
- 2. Search for "Cline MCP"
236
- 3. Add Context7 server configuration
237
-
238
247
  **Cursor**: Check Cursor Settings → MCP Servers for configuration options
239
248
 
240
249
  **Other agents**: If your agent supports MCP, configure using the JSON format above
@@ -271,7 +280,7 @@ Add to `.mcp.json` in your project root:
271
280
  "mcpServers": {
272
281
  "context7": {
273
282
  "command": "bunx",
274
- "args": ["--bun", "@upstash/context7-mcp@latest"]
283
+ "args": ["--bun", "@upstash/context7-mcp@2"]
275
284
  },
276
285
  "grep-app": {
277
286
  "command": "bunx",
@@ -501,7 +510,7 @@ volumes:
501
510
  ### GitHub CLI - PR Workflow
502
511
 
503
512
  **Installation**: [cli.github.com](https://cli.github.com)
504
- **Used in**: `/ship`, `/review`, `/premerge` stages
513
+ **Used in**: `/ship` and `/review` stages
505
514
 
506
515
  ```bash
507
516
  # Install
@@ -542,13 +551,18 @@ irm https://raw.githubusercontent.com/steveyegge/beads/main/install.ps1 | iex
542
551
  ```
543
552
 
544
553
  > **Why Forge + Beads?** Forge wraps the supported day-to-day issue workflow
545
- > (`forge ready`, `forge create`, `forge close`, `forge sync`) while Beads
546
- > remains the underlying store for initialization, dependencies, comments, and
547
- > Dolt-backed sync internals.
554
+ > (`forge ready`, `forge create`, `forge close`, `forge sync`). The kernel is the
555
+ > default underlying issue store for these commands; Beads is an opt-out backend
556
+ > for initialization, dependencies, comments, and Dolt-backed sync internals when
557
+ > selected. Backend selection precedence (highest first): the `--issue-backend`
558
+ > flag, then `FORGE_ISSUE_BACKEND`, then `.forge/config.yaml` (`issueBackend`),
559
+ > then the kernel default.
548
560
 
549
561
  ---
550
562
 
551
- ## Integration with Forge Stages
563
+ ## Default Workflow Template Mapping
564
+
565
+ This table maps tools to the default workflow template. It is not the complete Forge product model and it is not a requirement that every project use every stage.
552
566
 
553
567
  | Stage | Tools Used |
554
568
  |-------|------------|
@@ -559,9 +573,10 @@ irm https://raw.githubusercontent.com/steveyegge/beads/main/install.ps1 | iex
559
573
  | `/validate` | Type check, lint, tests, SonarCloud |
560
574
  | `/ship` | `forge close`, `gh pr create` |
561
575
  | `/review` | `gh pr view`, Greptile, SonarCloud |
562
- | `/premerge` | `forge sync`, doc updates, hand off PR |
563
576
  | `/verify` | Documentation cross-check |
564
577
 
578
+ Pre-merge is not a stage. Its work (`forge sync`, doc updates, hand off PR) runs inside the `/ship` and `/review` stages as an embedded documentation-and-handoff gate.
579
+
565
580
  ---
566
581
 
567
582
  ## Quick Reference Card
@@ -0,0 +1,82 @@
1
+ # Validation Reference
2
+
3
+ Forge validation is evidence, not a slogan. Record the command, result, and failure text when validation fails.
4
+
5
+ ## Project Validation
6
+
7
+ In this repository:
8
+
9
+ ```bash
10
+ bun run check
11
+ ```
12
+
13
+ `bun run check` runs `scripts/validate.js` in this order:
14
+
15
+ 1. `bun run typecheck`
16
+ 2. `bun run lint`
17
+ 3. `bun audit`
18
+ 4. `node scripts/test.js --validate`
19
+
20
+ Security audit behavior distinguishes blocking high/critical vulnerabilities from lower-severity warnings.
21
+
22
+ ## Supporting Commands
23
+
24
+ ```bash
25
+ bun run typecheck
26
+ bun run lint
27
+ bun test --timeout 15000
28
+ bun run validate:yaml
29
+ npm pack --dry-run
30
+ ```
31
+
32
+ Use `npm pack --dry-run` for package contents and release-readiness checks. It does not publish.
33
+
34
+ ## Agent Stage Validation
35
+
36
+ `/validate` is an agent workflow stage. It may include rebase/freshness checks, local validation, manual security review, and Beads context updates according to the installed stage instructions.
37
+
38
+ Do not confuse:
39
+
40
+ - `/validate` - agent stage workflow
41
+ - `forge-preflight` - prerequisite checker
42
+ - `bun run check` - repository validation script
43
+
44
+ ## Work Artifact Paths
45
+
46
+ Current planning and validation evidence should point to:
47
+
48
+ ```text
49
+ docs/work/YYYY-MM-DD-<slug>/
50
+ ```
51
+
52
+ Legacy `docs/research/` or `docs/plans/` examples are historical unless a specific tool documents a compatibility fallback.
53
+
54
+ ## Failure Recovery
55
+
56
+ Fix failures in order:
57
+
58
+ 1. Typecheck
59
+ 2. Lint
60
+ 3. Security audit
61
+ 4. Tests
62
+ 5. Packaging
63
+
64
+ For each failure:
65
+
66
+ 1. Reproduce with the exact command.
67
+ 2. Read the first real error.
68
+ 3. Fix the root cause.
69
+ 4. Rerun the full validation command.
70
+
71
+ Do not proceed to ship with "should pass" or stale output.
72
+
73
+ ## Documentation Changes
74
+
75
+ For docs-only changes, still run:
76
+
77
+ ```bash
78
+ bun run check
79
+ npm pack --dry-run
80
+ ```
81
+
82
+ Run a Markdown link check when available. If adding docs tooling would broaden the PR, file follow-up work instead.
@@ -0,0 +1,169 @@
1
+ # Research: Per-Agent Permissions Configuration
2
+
3
+ > Historical research artifact. Do not treat this page as current setup behavior or current permission defaults. Current user-facing setup guidance lives in [Setup Guide](../guides/SETUP.md), and current skills/command packaging boundaries live in [Skills and command projections](SKILLS.md).
4
+
5
+ **Feature slug**: `agent-permissions`
6
+ **Beads issue**: forge-bo2
7
+ **Date**: 2026-02-24
8
+
9
+ ---
10
+
11
+ ## Objective
12
+
13
+ Every AI agent supported by Forge has its own permission/auto-approval system for terminal commands and file operations. Currently Forge ships no default permission config for any agent, meaning developers hit approval prompts constantly for safe, routine commands (git status, ls, bun run, bd list, etc.).
14
+
15
+ **Goal**: Ship project-level permission config files for all supported agents so that safe commands auto-run out of the box, while destructive commands still require explicit approval.
16
+
17
+ ---
18
+
19
+ ## Codebase Analysis
20
+
21
+ ### What already exists
22
+
23
+ | File | Agent | Status |
24
+ | ---- | ----- | ------ |
25
+ | `AGENTS.md` | Universal | ✅ Exists — workflow instructions only |
26
+ | `docs/SETUP.md` | All agents | ✅ Exists (635 lines) — no permissions section |
27
+ | `lib/agents/*.plugin.json` | 11 agents | ✅ All 11 plugin definitions exist |
28
+ | `.claude/settings.json` | Claude Code | ✅ Exists — project-level permissions present |
29
+ | `opencode.json` | Kilo/OpenCode | ❌ Missing |
30
+ | `.codex/config.toml` | Codex CLI | ❌ Missing |
31
+ | `.cursor/rules/permissions-guidance.mdc` | Cursor | ❌ Missing |
32
+
33
+ ### Affected files
34
+
35
+ - `docs/SETUP.md` — add permissions section
36
+ - `opencode.json` — new file at project root
37
+ - `.codex/config.toml` — new file (directory must be created)
38
+ - `.cursor/rules/permissions-guidance.mdc` — new file (directory must be created)
39
+
40
+ ### Integration points
41
+
42
+ - `docs/SETUP.md` has per-agent sections — permissions guidance slots naturally into each agent's section
43
+ - `.cursor/rules/` is referenced in `cursor.plugin.json` — adding a `.mdc` file there fits the existing pattern
44
+ - The `forge setup` command will need to be updated separately to copy these files to new projects (separate issue)
45
+
46
+ ---
47
+
48
+ ## Research Findings
49
+
50
+ ### Agent Permission System Comparison
51
+
52
+ #### Claude Code — `.claude/settings.json`
53
+ - **Format**: JSON, `permissions.allow` array
54
+ - **Syntax**: `"Bash(git status:*)"` — command prefix with wildcard
55
+ - **Scope**: Project-level (committed) + global (`~/.claude/settings.json`) + local (gitignored)
56
+ - **Granularity**: Per-tool (Bash, Read, Edit, WebFetch, Skill, Task, MCP)
57
+ - **Evaluation**: First match in allow/deny wins
58
+ - **Status**: Already configured in this project's `.claude/settings.json`
59
+
60
+ #### Kilo Code + OpenCode — `opencode.json` (shared format)
61
+ - **Format**: JSON, `permission` object with nested patterns
62
+ - **Syntax**: `"git status *": "allow"` inside `bash` block
63
+ - **Scope**: Project root (project-level) OR `~/.config/kilo/opencode.json` (global)
64
+ - **Granularity**: bash, edit, external_directory, MCP, browser
65
+ - **Evaluation**: **Last matching rule wins** — put deny rules at the bottom
66
+ - **States**: `"allow"`, `"ask"`, `"deny"`
67
+ - **Sources**: [Kilo Code docs](https://kilo.ai/docs/features/auto-approving-actions), [OpenCode docs](https://opencode.ai/docs/permissions/)
68
+
69
+ #### OpenAI Codex CLI — `.codex/config.toml`
70
+ - **Format**: TOML
71
+ - **Syntax**: `approval_policy = "on-request"` + `sandbox_mode = "workspace-write"`
72
+ - **Scope**: `.codex/config.toml` (project) OR `~/.codex/config.toml` (global)
73
+ - **Granularity**: Policy-level (untrusted/on-request/never) + sandbox restrictions
74
+ - **States**: `untrusted` (approve all), `on-request` (agent decides), `never` (no prompts)
75
+ - **Best default**: `on-request` — agent uses built-in risk model, only asks when uncertain
76
+ - **Also supports**: `--full-auto` flag and `--yolo` (dangerous bypass)
77
+ - **Sources**: [Codex CLI config reference](https://developers.openai.com/codex/config-reference/)
78
+
79
+ #### Cursor — IDE Settings (YOLO Mode)
80
+ - **Format**: UI-only — configured in Cursor Settings > Features > Chat & Composer
81
+ - **Syntax**: `Bash(git status *)` in allow/deny lists (same format as Claude Code)
82
+ - **Scope**: IDE-level, not version-controlled — cannot be shipped as project file
83
+ - **Granularity**: Fine-grained per-command allow/deny lists
84
+ - **Approach for Forge**: Document recommended settings in `.cursor/rules/permissions-guidance.mdc`
85
+ - **Sources**: Cursor Settings UI
86
+
87
+ ### Risk-Based Command Classification
88
+
89
+ | Risk Level | Commands | Default action |
90
+ | ---------- | -------- | -------------- |
91
+ | **Safe (read-only)** | git status/log/diff/branch, ls, cat, grep, find, pwd, which, bd list/show/stats | `allow` |
92
+ | **Safe (local write, reversible)** | git add, git commit, git stash, git checkout, bun/npm run, mkdir, touch, cp, mv | `allow` |
93
+ | **Medium (remote-affecting)** | git push, gh pr create, gh issue create | `allow` (intentional dev action) |
94
+ | **Careful (needs attention)** | git reset --hard, git rebase | `ask` |
95
+ | **Dangerous (destructive)** | rm -rf, git push --force, drop database | `deny` |
96
+
97
+ ### Key Design Decisions
98
+
99
+ **Decision 1: Include `git push:*` in allow list**
100
+ - Reasoning: Developers push intentionally, constant prompting breaks flow
101
+ - Evidence: Volleyball project already allows it in settings.local.json
102
+ - Alternative: Keep as `ask` (rejected — too much friction for normal PRs)
103
+
104
+ **Decision 2: `on-request` not `never` for Codex CLI**
105
+ - Reasoning: `never` skips ALL prompts including network access and external edits; `on-request` lets the agent's risk model handle edge cases
106
+ - Evidence: Codex docs recommend `on-request` for interactive development
107
+ - Alternative: `never` for power users (can be documented as option)
108
+
109
+ **Decision 3: Documentation-only for Cursor**
110
+ - Reasoning: Cursor permissions are IDE-level settings, not project files — nothing to commit
111
+ - Evidence: No `settings.json`-like project file exists for Cursor
112
+ - Alternative: None — this is a platform limitation
113
+
114
+ ---
115
+
116
+ ## TDD Test Scenarios
117
+
118
+ Since these are config files (not code), traditional unit tests don't apply. Verification is manual:
119
+
120
+ 1. **opencode.json validity** — JSON parses without errors; `git status` and `bd list` run without prompt in Kilo Code or OpenCode
121
+ 2. **.codex/config.toml validity** — TOML parses correctly; Codex CLI reads file at startup
122
+ 3. **.cursor/rules/ presence** — File appears in Cursor's Rules panel; content is accurate
123
+ 4. **docs/SETUP.md section** — Section is readable, links work, global config snippet is copy-pasteable and correct
124
+
125
+ ---
126
+
127
+ ## Security Analysis
128
+
129
+ ### OWASP Top 10 Relevance
130
+
131
+ | Risk | Relevance | Mitigation |
132
+ | ---- | --------- | ---------- |
133
+ | **A01 Broken Access Control** | Medium — overly broad allow lists could let agents run unintended commands | Explicit deny rules for `rm -rf`, `git push --force`, `git reset --hard` |
134
+ | **A05 Security Misconfiguration** | Medium — shipping overly permissive defaults would be misconfigured | Conservative defaults: `approval_policy = "on-request"` |
135
+ | **A09 Security Logging** | Low — agent commands aren't logged by these configs | Mitigated by git history and Beads tracking |
136
+
137
+ ### Agent-Specific Security Notes
138
+
139
+ - **opencode.json**: Deny rules must be at the bottom (last match wins) — putting them first would be ineffective
140
+ - **Codex CLI**: `sandbox_mode = "workspace-write"` prevents file access outside project root — keep this
141
+ - **Never ship**: `--dangerously-bypass-approvals-and-sandbox` (Codex) or global `"*": "allow"` (opencode.json)
142
+
143
+ ---
144
+
145
+ ## Scope Assessment
146
+
147
+ **Type**: Tactical (config files + docs update, no business logic)
148
+ **Complexity**: Low — all config formats researched, no code changes needed
149
+ **Parallelization**: All 3 config files can be created simultaneously; docs/SETUP.md update is sequential after
150
+ **Estimated files**: 4 new files, 1 modified
151
+
152
+ **Branch**: `feat/agent-permissions`
153
+
154
+ ---
155
+
156
+ ## Sources
157
+
158
+ - [Kilo Code - Auto-Approving Actions](https://kilo.ai/docs/features/auto-approving-actions)
159
+ - [OpenCode - Permissions](https://opencode.ai/docs/permissions/)
160
+ - [Codex CLI - Config Reference](https://developers.openai.com/codex/config-reference/)
161
+ - Forge project codebase analysis (2026-02-24)
162
+
163
+ ---
164
+
165
+ ## Next Step
166
+
167
+ ```bash
168
+ /plan agent-permissions
169
+ ```
@@ -0,0 +1,61 @@
1
+ # Beads To Kernel Migration UX
2
+
3
+ **Status**: 0.0.20 migration reference for Forge Kernel authority rollout.
4
+
5
+ **Related work**:
6
+
7
+ - PR A / `forge-2agy.2.1`: Kernel schema, migrations, and storage classifier.
8
+ - PR B / `forge-2agy.2.2`: Local SQLite WAL broker and command API contract.
9
+ - PR C / `forge-2agy.2.3`: Beads import/export adapter and fidelity report.
10
+ - PR D / `forge-2agy.2.4`: Conflict quarantine, idempotency, and evaluator fixtures.
11
+ - PR E / `forge-2agy.2.5`: Documentation and migration UX.
12
+
13
+ ## User-Facing Position
14
+
15
+ Forge Kernel is the target issue authority. Beads remains compatibility input/output during the migration window so existing repositories can inspect, import, export, and recover issue state without treating `.beads` files as the new source of truth.
16
+
17
+ The migration UX should make three boundaries visible:
18
+
19
+ 1. Import reads Beads state and creates Kernel-shaped records.
20
+ 2. Export projects Kernel records back to Beads-compatible JSONL.
21
+ 3. Projection failure does not invalidate Kernel authority.
22
+
23
+ ## Current Compatibility
24
+
25
+ The Beads compatibility adapter is import/export only. It preserves issue IDs, statuses, priorities, parent-child dependencies, blockers, comments, close reasons, available timestamps, and fidelity counts where the current Beads projection exposes them.
26
+
27
+ Known compatibility gaps are explicit. Kernel schema v1 does not directly preserve every Beads field as first-class issue columns, so unsupported or non-authoritative fields must appear in the fidelity report rather than silently becoming Kernel authority.
28
+
29
+ ## Recommended Operator Flow
30
+
31
+ 1. Snapshot or back up the current Beads projection before migration.
32
+ 2. Run import and review the fidelity report.
33
+ 3. Keep export in dry-run mode until record counts, dependency edges, comments, close metadata, and unsupported-field gaps are understood.
34
+ 4. If export writes are enabled, capture rollback snapshots for the Beads projection files before writing.
35
+ 5. Treat any conflict or stale projection warning as a stop point until the quarantine report is reviewed.
36
+
37
+ ## Rollback Boundaries
38
+
39
+ Import rollback is discard-only when import has not committed authoritative Kernel mutations. Discard the imported Kernel-shaped records and keep the original Beads projection unchanged.
40
+
41
+ Export rollback restores the previous Beads-compatible projection files captured before the export write. This rollback affects files such as `issues.jsonl`, `comments.jsonl`, and `dependencies.jsonl`; it does not roll back Kernel authority.
42
+
43
+ After Kernel command routing is active, a committed Kernel mutation must be reversed through a Kernel operation or a documented Kernel migration rollback. Do not use Beads export rollback as an authority rollback.
44
+
45
+ ## Conflict Quarantine Boundary
46
+
47
+ Conflict quarantine is defined by the landed evaluator contract in [Kernel Conflict Evaluators](kernel-conflict-evaluators.md). Migration UX should reference that contract for exact quarantine behavior, evaluator evidence, and release-readiness checks.
48
+
49
+ The intended UX boundary is stable:
50
+
51
+ - stale revisions, duplicate writes, dependency cycles, and projection drift are detected before external projection;
52
+ - conflicting records are quarantined instead of projected as normal output;
53
+ - the operator gets enough detail to decide whether to repair source input, retry projection, or wait for a resolver path.
54
+
55
+ ## Release Readiness Checklist
56
+
57
+ - Beads import fidelity report reviewed.
58
+ - Export dry-run reviewed before any write.
59
+ - Rollback snapshot path documented for write-enabled export.
60
+ - Projection failure behavior documented as non-authoritative rollback.
61
+ - Conflict quarantine behavior cross-checked against [Kernel Conflict Evaluators](kernel-conflict-evaluators.md).
@@ -0,0 +1,125 @@
1
+ # Control-plane guarantees — what each control state actually does
2
+
3
+ Status: beta (B6). Issues: `7dc59af2` (controls config + `forge control`),
4
+ `724356ea` (all-surface read + enforcement-locus badges). Epic: `363954dd`.
5
+
6
+ This document is the **contract** the cockpit badges and the `forge control`
7
+ command read from. It states, honestly and per surface, what a control state
8
+ *actually* does today — so the UI never sells enforcement Forge cannot deliver.
9
+
10
+ ## Headline — the honest state of enforcement (as of 2026-07-15)
11
+
12
+ **The configurable gate/rail registry is NOT yet consumed by any runtime deny.**
13
+ An adversarial grep of every consumer of the resolved runtime graph found none
14
+ that refuses on `workflow.gates.<id>.enabled`. So setting a gate or rail to
15
+ `mandatory` vs `optional` today changes the **declared registry**, not runtime
16
+ behavior.
17
+
18
+ Real enforcement in Forge today lives **elsewhere, independent of these flags**:
19
+
20
+ - the **B3 lefthook TDD pre-commit hook** (blocks a commit that changes source
21
+ without tests),
22
+ - **B2 fail-closed `validate` / `preflight`** (these fail closed on their own
23
+ logic, *not* on `workflow.gates.<id>.enabled`),
24
+ - **`enforce-stage.js`** (blocks a stage on kernel-recorded stage **order +
25
+ completion**, again independent of these flags).
26
+
27
+ Because of this, **`ENFORCED` is reserved strictly for a wired runtime deny —
28
+ and that set is EMPTY for these flags today.** The badges below never say
29
+ `ENFORCED`; they say what is actually true (`DECLARED`, `DENY-ON-CHECK`,
30
+ `VERIFY (warn-only)`, `PRESENT (advisory)`). Wiring the registry to real
31
+ enforcement points is filed as separate post-beta work.
32
+
33
+ ## The two axes
34
+
35
+ - **State** (author intent, written to config): `mandatory` · `optional` · `permission`.
36
+ - **Enforcement-locus** (what actually happens today, and *where*):
37
+ - `registry — declared, not yet enforced` — the flag is stored and reflected in
38
+ the resolved graph, but **no runtime code consumes it to deny**. (stage-exit
39
+ gates, rails)
40
+ - `run-time verify (warn-only, never denies)` — consumed at run time, but only
41
+ **warns**; never overturns the operation. (`gate.issue_verify`)
42
+ - `deny-on-check (no chokepoint yet)` — a real, deny-**capable** primitive
43
+ (`forge gate check`), but **no chokepoint auto-invokes it**, so nothing denies
44
+ on it yet. (human gates)
45
+ - `render-time presence-only` — written into harness config / discovered by
46
+ precedence; nothing denies at run time. **Advisory.** (mcp / rules / skills)
47
+
48
+ ## The matrix — state × surface × what it actually does today
49
+
50
+ | Surface | Example ids | Controllable by `forge control`? | State it takes | Enforcement-locus | What it actually does today |
51
+ |---|---|---|---|---|---|
52
+ | **Stage gate** | `gate.plan-exit`, `gate.dev-exit`, `gate.validate-exit`, `gate.ship-entry` | **Yes** | `mandatory` / `optional` | `registry — declared, not yet enforced` | Writes the declared value into the resolved graph. **No runtime consumer reads it** — `enforce-stage.js` blocks on stage order + kernel completion, which is independent of this flag. Setting mandatory/optional changes nothing at run time (yet). Badge: `DECLARED (no runtime consumer yet)`. |
53
+ | **Issue-verify gate** | `gate.issue_verify` | **Yes** | `mandatory` / `optional` | `run-time verify (warn-only, never denies)` | Consumed by `lib/commands/_issue.js`: after a kernel write it re-reads and emits `verified` + `mismatches`, but **warn-only** — a mismatch prints a warning and never overturns the write's `ok`. `optional` skips the read-back. Badge: `VERIFY (warn-only)`. |
54
+ | **Human gate** | `gate.intent`, `gate.plan-approval`, `gate.merge` | **Yes** | `permission` / `optional` | `deny-on-check (no chokepoint yet)` | The `forge gate approve` / `forge gate check` primitives are real and deny-**capable**: with the gate active, `forge gate check <issue> <id>` exits non-zero until a durable `gate.approved` event exists (`lib/gate-events.js`). But **no chokepoint auto-invokes `forge gate check`**, so nothing denies on it unless a skill/CI explicitly calls it. Badge: `DENY-ON-CHECK`. |
55
+ | **L1 rail** | `rail.kernel_tracking` (unlocked); other rails (locked) | **Yes** (unlocked only) | `mandatory` / `optional` | `registry — declared, not yet enforced` | Writes the declared value; the resolved graph reflects it. **No runtime refusal exists** — the flag is read only by `gate.js` id-maps, not by an enforcement chokepoint. Locked rails cannot be lowered. Badge: `DECLARED (no runtime consumer yet)`. |
56
+ | **MCP server** | `mcp.*` | **No — refused** | — | `render-time presence-only` | Rendered into harness MCP config. Presence advises the agent a tool exists; Forge does **not** deny at run time. Not enforceable. Badge: `PRESENT (advisory)`. |
57
+ | **Rule** | `rule.*` (`rules/*.md`) | **No — refused** | — | `render-time presence-only` | Injected as agent guidance. No run-time deny. Advisory. Badge: `PRESENT (advisory)`. |
58
+ | **Skill** | `skill.*` | **No — refused** | — | `render-time presence-only` | Discovered by precedence (`.skills/` > `skills/` > packaged). Presence, not enforcement. Advisory. Badge: `PRESENT (advisory)`. |
59
+
60
+ ## How the tri-state maps onto Forge's real config (single source of truth)
61
+
62
+ The one config field `forge control` writes is **`workflow.gates.<id>.enabled`**
63
+ in `.forge/config.yaml` — the field the resolver (`applyEnabledConfig` in
64
+ `lib/core/runtime-graph.js`) consumes into the resolved graph, shared by gates
65
+ and unlocked rails (`gate.*` / `rail.*` namespaces are disjoint). `forge control`
66
+ reuses exactly this field — it does **not** add a parallel `controls:` key,
67
+ because a key nothing reads would be doubly-fake. The tri-state is the
68
+ *vocabulary*; `enabled` is the stored *truth*; state is **derived**, never stored
69
+ twice.
70
+
71
+ **Important:** writing this field changes the **declared registry** the read view
72
+ and `forge options` reflect. It does **not**, today, change what any runtime
73
+ chokepoint does (see the headline). The mapping:
74
+
75
+ | State | Config written | Applies to | Effect today |
76
+ |---|---|---|---|
77
+ | `mandatory` | `workflow.gates.<id>.enabled = true` | stage gates, rails | declared active in the registry; no runtime consumer denies on it |
78
+ | `optional` | `workflow.gates.<id>.enabled = false` | unlocked gates & rails | declared off; for `gate.issue_verify`, actually skips the warn-only read-back |
79
+ | `permission` | `workflow.gates.<id>.enabled = true` | human gates only | keeps the gate active, so `forge gate check` *can* deny if a chokepoint calls it (none does yet) |
80
+
81
+ Read-back derives the label from `(enabled, locked, isHumanGate)`:
82
+ - human gate + enabled → `permission`; human gate + disabled → `optional`.
83
+ - non-human gate/rail + enabled → `mandatory`; + disabled → `optional`.
84
+ - `locked` primitives are always `mandatory` and render a `LOCKED` badge (cannot be lowered).
85
+
86
+ ## What `forge control` refuses, and why
87
+
88
+ - **`permission` on a non-human gate or rail** — refused: the approve/check
89
+ primitive only applies to the three human gates; elsewhere `permission` has no
90
+ path at all.
91
+ - **`optional` on a `locked` primitive** — refused: mirrors
92
+ `Cannot disable locked gate` in `forge gate`.
93
+ - **Any `mcp.*` / `rule.*` / `skill.*` id** — refused with:
94
+ *"<id> is presence-only, not enforceable — Forge has no run-time deny for this
95
+ surface. See docs/reference/control-plane-guarantees.md."* These are read-only
96
+ in the cockpit; their badge is `PRESENT (advisory)`.
97
+
98
+ ## Badge vocabulary (what the read view / dashboard renders)
99
+
100
+ Driven entirely by the honest enforcement-locus above — never by author intent:
101
+
102
+ - `DECLARED (no runtime consumer yet)` — `registry — declared, not yet enforced`
103
+ (stage-exit gates, rails).
104
+ - `VERIFY (warn-only)` — `run-time verify (warn-only, never denies)`
105
+ (`gate.issue_verify`).
106
+ - `DENY-ON-CHECK` — `deny-on-check (no chokepoint yet)` (human gates).
107
+ - `OFF (optional)` — a controllable flag set to `optional`.
108
+ - `PRESENT (advisory)` — `render-time presence-only` (mcp/rules/skills).
109
+ - `· LOCKED` — appended to a locked primitive that cannot be lowered.
110
+ - `ENFORCED (...)` — **reserved for a wired runtime deny; emitted by NOTHING
111
+ today** (the set is empty until the registry is wired to enforcement points).
112
+
113
+ A surface's badge reflects **where and whether** it is actually consumed, so the
114
+ UI can never imply enforcement it lacks.
115
+
116
+ ## Deferred (out of B6 scope, filed separately)
117
+
118
+ - **Wire the configurable gates/rails to real enforcement points** — the bigger
119
+ work that would let a `mandatory` gate/rail actually deny at run time. Filed as
120
+ separate post-beta work; B6 deliberately does *not* attempt it. B6's deliverable
121
+ is the honest vocabulary + matrix, not new enforcement.
122
+ - **Control for advisory surfaces** (mcp/rules/skills) — no run-time deny path
123
+ exists; they stay read-only + `PRESENT (advisory)`.
124
+ - **Live/SSE updates** — a separate stubbed issue; the read view is a
125
+ point-in-time snapshot.