forge-workflow 0.0.10 → 0.1.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. package/.claude/rules/{greptile-review-process.md → review-process.md} +56 -41
  2. package/.claude/scripts/{greptile-resolve.sh → review-resolve.sh} +13 -3
  3. package/.cursor/rules/permissions-guidance.mdc +2 -2
  4. package/.forge/hooks/check-tdd.js +82 -5
  5. package/.forge/hooks/forge-native-hook.js +431 -0
  6. package/.forge/protected-paths.yaml +157 -0
  7. package/AGENTS.md +151 -61
  8. package/CHANGELOG.md +709 -0
  9. package/CLAUDE.md +9 -118
  10. package/QUICKSTART.md +175 -0
  11. package/README.md +275 -365
  12. package/bin/forge-cmd.js +120 -9
  13. package/bin/forge-preflight.js +26 -5
  14. package/bin/forge.js +532 -489
  15. package/docs/INDEX.md +93 -0
  16. package/docs/PROJECT_DESIGN.md +685 -0
  17. package/docs/architecture/index.md +66 -0
  18. package/docs/architecture/notes/README.md +35 -0
  19. package/docs/architecture/subsystems/README.md +46 -0
  20. package/docs/forge/TOOLCHAIN.md +670 -0
  21. package/docs/forge/VALIDATION.md +82 -0
  22. package/docs/{AGENT_INSTALL_PROMPT.md → guides/AGENT_INSTALL_PROMPT.md} +3 -3
  23. package/docs/guides/BEADS_GITHUB_SYNC.md +32 -0
  24. package/docs/{ENHANCED_ONBOARDING.md → guides/ENHANCED_ONBOARDING.md} +16 -12
  25. package/docs/guides/GREPTILE_SETUP.md +46 -0
  26. package/docs/guides/MANUAL_REVIEW_GUIDE.md +58 -0
  27. package/docs/guides/MIGRATION.md +56 -0
  28. package/docs/guides/SETUP.md +121 -0
  29. package/docs/guides/SUPPORT.md +190 -0
  30. package/docs/guides/WORKFLOW_TEMPLATES.md +74 -0
  31. package/docs/guides/memory-backends.md +183 -0
  32. package/docs/reference/ADAPTERS.md +128 -0
  33. package/docs/reference/AGENT_SKILL_PARITY.md +175 -0
  34. package/docs/reference/COMMANDS.md +214 -0
  35. package/docs/reference/DECISION_DRIFT_GUARDS.md +97 -0
  36. package/docs/{EXAMPLES.md → reference/EXAMPLES.md} +7 -5
  37. package/docs/reference/FORGE_KERNEL_STORAGE_MODEL.md +135 -0
  38. package/docs/reference/HERMES_INTEGRATION.md +118 -0
  39. package/docs/reference/INSIGHTS_RECAP.md +63 -0
  40. package/docs/reference/INSTALL.md +164 -0
  41. package/docs/reference/KERNEL_TAXONOMY_VALIDATION.md +161 -0
  42. package/docs/reference/PROTECTED_PATH_MANIFEST.md +25 -0
  43. package/docs/reference/RELEASE.md +68 -0
  44. package/docs/reference/RESEARCH_TEMPLATE.md +292 -0
  45. package/docs/{ROADMAP.md → reference/ROADMAP.md} +12 -9
  46. package/docs/reference/SKILLS.md +35 -0
  47. package/docs/reference/STATUS_BOARD.md +80 -0
  48. package/docs/reference/TEMPLATES.md +106 -0
  49. package/docs/{TOOLCHAIN.md → reference/TOOLCHAIN.md} +62 -47
  50. package/docs/reference/VALIDATION.md +82 -0
  51. package/docs/reference/agent-permissions.md +169 -0
  52. package/docs/reference/beads-to-kernel-migration-ux.md +61 -0
  53. package/docs/reference/control-plane-guarantees.md +125 -0
  54. package/docs/reference/dependency-chain.md +331 -0
  55. package/docs/reference/forge-kernel-issue-command-contract.md +161 -0
  56. package/docs/reference/forge-kernel-schema.md +72 -0
  57. package/docs/reference/kernel-conflict-evaluators.md +27 -0
  58. package/docs/reference/patch-md-format.md +77 -0
  59. package/docs/reference/protected-state-surfaces.md +59 -0
  60. package/docs/reference/shepherd.md +155 -0
  61. package/docs/reference/superpowers-analysis.md +320 -0
  62. package/docs/reference/superpowers-integration-options.md +404 -0
  63. package/docs/reference/test-environment.md +519 -0
  64. package/docs/reference/upgrade-safety.md +59 -0
  65. package/lefthook.yml +18 -0
  66. package/lib/activation/ensure-forge-home.js +135 -0
  67. package/lib/adapter-cli.js +307 -0
  68. package/lib/adapters/beads-issue-adapter.js +127 -0
  69. package/lib/adapters/beads-kernel-compat.js +1109 -0
  70. package/lib/adapters/greptile-review-adapter.js +141 -0
  71. package/lib/adapters/kernel-issue-adapter.js +101 -0
  72. package/lib/adapters/pr-state-adapter.js +484 -0
  73. package/lib/adoption-profiles.js +139 -0
  74. package/lib/agents/README.md +2 -6
  75. package/lib/agents/claude.plugin.json +3 -8
  76. package/lib/agents/codex.plugin.json +9 -1
  77. package/lib/agents/cursor.plugin.json +2 -6
  78. package/lib/agents/hermes.plugin.json +22 -0
  79. package/lib/agents-config.js +39 -1236
  80. package/lib/audit-evidence.js +282 -0
  81. package/lib/beads-detect.js +60 -0
  82. package/lib/beads-nudge.js +91 -0
  83. package/lib/beads-setup.js +121 -0
  84. package/lib/beads-sync-scaffold.js +25 -101
  85. package/lib/codex-skills.js +51 -1
  86. package/lib/commands/_aliases.js +248 -0
  87. package/lib/commands/_issue.js +780 -77
  88. package/lib/commands/_manifest.js +93 -0
  89. package/lib/commands/_registry.js +99 -34
  90. package/lib/commands/_resolve-command-opts.js +230 -0
  91. package/lib/commands/_serve-security.js +270 -0
  92. package/lib/commands/adapter.js +12 -0
  93. package/lib/commands/add.js +118 -0
  94. package/lib/commands/audit.js +70 -0
  95. package/lib/commands/blocked.js +5 -0
  96. package/lib/commands/board.js +64 -0
  97. package/lib/commands/claim.js +21 -2
  98. package/lib/commands/claims.js +7 -0
  99. package/lib/commands/clean.js +485 -75
  100. package/lib/commands/close.js +2 -2
  101. package/lib/commands/comment.js +5 -0
  102. package/lib/commands/control.js +148 -0
  103. package/lib/commands/create.js +2 -2
  104. package/lib/commands/dev.js +185 -7
  105. package/lib/commands/doc-gate.js +336 -0
  106. package/lib/commands/doctor.js +156 -0
  107. package/lib/commands/explain.js +15 -0
  108. package/lib/commands/export.js +237 -0
  109. package/lib/commands/gate.js +209 -0
  110. package/lib/commands/hooks.js +377 -0
  111. package/lib/commands/inbox.js +118 -0
  112. package/lib/commands/init.js +604 -0
  113. package/lib/commands/insights.js +79 -0
  114. package/lib/commands/issue.js +12 -1
  115. package/lib/commands/issues.js +17 -0
  116. package/lib/commands/lint.js +5 -0
  117. package/lib/commands/list.js +2 -2
  118. package/lib/commands/memory.js +81 -0
  119. package/lib/commands/merge.js +312 -0
  120. package/lib/commands/migrate.js +362 -0
  121. package/lib/commands/new.js +12 -0
  122. package/lib/commands/options.js +241 -0
  123. package/lib/commands/orient.js +13 -0
  124. package/lib/commands/orphans.js +5 -0
  125. package/lib/commands/patch.js +67 -0
  126. package/lib/commands/plan.js +481 -29
  127. package/lib/commands/pr.js +88 -0
  128. package/lib/commands/preflight.js +211 -0
  129. package/lib/commands/prime.js +13 -0
  130. package/lib/commands/push.js +135 -2
  131. package/lib/commands/ready.js +2 -2
  132. package/lib/commands/recall.js +171 -0
  133. package/lib/commands/recap.js +75 -0
  134. package/lib/commands/recommend.js +0 -1
  135. package/lib/commands/release.js +104 -0
  136. package/lib/commands/remember.js +140 -0
  137. package/lib/commands/role.js +99 -0
  138. package/lib/commands/serve.js +581 -0
  139. package/lib/commands/setup.js +900 -971
  140. package/lib/commands/shepherd.js +501 -0
  141. package/lib/commands/ship.js +59 -1
  142. package/lib/commands/show.js +2 -2
  143. package/lib/commands/stage.js +192 -0
  144. package/lib/commands/stale.js +5 -0
  145. package/lib/commands/status.js +158 -21
  146. package/lib/commands/sync.js +34 -46
  147. package/lib/commands/team.js +4 -1
  148. package/lib/commands/test.js +43 -27
  149. package/lib/commands/update.js +2 -2
  150. package/lib/commands/upgrade.js +47 -0
  151. package/lib/commands/validate.js +43 -18
  152. package/lib/commands/worktree.js +362 -99
  153. package/lib/config-writer.js +202 -0
  154. package/lib/control-plane.js +236 -0
  155. package/lib/core/runtime-graph.js +977 -0
  156. package/lib/dep-guard/keyword-ripple.js +2 -2
  157. package/lib/deprecated-sync-cleanup.js +362 -0
  158. package/lib/detect-agent.js +2 -28
  159. package/lib/detect-worktree.js +35 -9
  160. package/lib/doc-gate/declaration.js +177 -0
  161. package/lib/doc-gate/detect.js +289 -0
  162. package/lib/doc-gate/gate.js +375 -0
  163. package/lib/doc-gate/okf-config.js +128 -0
  164. package/lib/doc-gate/okf.js +429 -0
  165. package/lib/docs-command.js +1161 -6
  166. package/lib/forge-issues.js +382 -11
  167. package/lib/forge-lock.js +262 -0
  168. package/lib/gate-events.js +192 -0
  169. package/lib/global-flags.js +104 -0
  170. package/lib/greptile-match.js +7 -63
  171. package/lib/grounding/context-events.js +230 -0
  172. package/lib/grounding/read-first.js +112 -0
  173. package/lib/harness-capability-matrix.js +380 -0
  174. package/lib/hook-global-installer.js +347 -0
  175. package/lib/hook-renderer.js +541 -0
  176. package/lib/inbox.js +391 -0
  177. package/lib/insights.js +397 -0
  178. package/lib/issue-adapter.js +156 -0
  179. package/lib/issue-backend.js +145 -0
  180. package/lib/issue-render.js +220 -0
  181. package/lib/kernel/backing-issue.js +311 -0
  182. package/lib/kernel/broker.js +1218 -0
  183. package/lib/kernel/cli-broker-factory.js +130 -0
  184. package/lib/kernel/conflict-signal.js +82 -0
  185. package/lib/kernel/evaluators.js +195 -0
  186. package/lib/kernel/fs-class.js +495 -0
  187. package/lib/kernel/issue-command-contract.js +559 -0
  188. package/lib/kernel/issue-id-resolver.js +186 -0
  189. package/lib/kernel/lease-enforcer.js +158 -0
  190. package/lib/kernel/migrations.js +333 -0
  191. package/lib/kernel/owned-kernel.js +43 -0
  192. package/lib/kernel/planning-buckets-schema.js +109 -0
  193. package/lib/kernel/projection-jsonl-writer.js +450 -0
  194. package/lib/kernel/readiness-model.js +329 -0
  195. package/lib/kernel/schema.js +356 -0
  196. package/lib/kernel/sqlite-driver.js +2540 -0
  197. package/lib/kernel/taxonomy-validator.js +394 -0
  198. package/lib/lefthook-check.js +3 -2
  199. package/lib/lefthook-wiring.js +413 -0
  200. package/lib/mcp-config-renderer.js +288 -0
  201. package/lib/memory/graphiti-mcp.js +106 -0
  202. package/lib/memory/router.js +387 -0
  203. package/lib/memory/typed-api.js +102 -0
  204. package/lib/memory-digest.js +195 -0
  205. package/lib/merge-rules.js +395 -0
  206. package/lib/migrate-dry-run.js +466 -0
  207. package/lib/orientation.js +863 -0
  208. package/lib/package-manager-remediation.js +103 -0
  209. package/lib/package-root.js +381 -0
  210. package/lib/patch-intent.js +890 -0
  211. package/lib/plugin-catalog.js +3 -4
  212. package/lib/plugin-manager.js +0 -5
  213. package/lib/pr-bundle.js +186 -0
  214. package/lib/pr-monitor/auto-actions.js +175 -0
  215. package/lib/pr-monitor/differ.js +195 -0
  216. package/lib/pr-monitor/digest.js +206 -0
  217. package/lib/pr-monitor/events.js +0 -0
  218. package/lib/pr-monitor/gather.js +124 -0
  219. package/lib/pr-monitor/journal.js +299 -0
  220. package/lib/pr-monitor/monitor.js +146 -0
  221. package/lib/pr-monitor/render-sticky.js +192 -0
  222. package/lib/pr-monitor/upsert-sticky.js +169 -0
  223. package/lib/pr-monitor/watch-lifecycle.js +95 -0
  224. package/lib/pr-monitor/watch.js +247 -0
  225. package/lib/pr-pull.js +1314 -0
  226. package/lib/pr-shepherd.js +494 -0
  227. package/lib/pr-state-validator.js +59 -0
  228. package/lib/preflight/gates.js +237 -0
  229. package/lib/preflight/runner.js +116 -0
  230. package/lib/project-discovery.js +0 -53
  231. package/lib/project-memory.js +99 -497
  232. package/lib/protected-path-manifest.js +281 -0
  233. package/lib/protected-state-surfaces.js +387 -0
  234. package/lib/release-readiness.js +2105 -0
  235. package/lib/reset.js +59 -45
  236. package/lib/review-adapter.js +68 -0
  237. package/lib/rules-sync.js +260 -0
  238. package/lib/runtime-health.js +241 -20
  239. package/lib/safety-config-renderer.js +268 -0
  240. package/lib/setup-action-log.js +1 -7
  241. package/lib/setup.js +27 -65
  242. package/lib/shell-utils.js +76 -6
  243. package/lib/skills-sync.js +330 -0
  244. package/lib/smart-status/scoring.js +17 -3
  245. package/lib/status/beads-snapshot.js +45 -2
  246. package/lib/status/presenter.js +169 -18
  247. package/lib/status/snapshot.js +186 -0
  248. package/lib/sync-backend.js +202 -0
  249. package/lib/untrusted-content.js +52 -0
  250. package/lib/upgrade-safety.js +251 -0
  251. package/lib/workflow/enforce-stage.js +351 -45
  252. package/lib/workflow/stage-transition.js +115 -0
  253. package/lib/workflow/stages.js +30 -6
  254. package/lib/workflow/state-manager.js +11 -22
  255. package/lib/workflow/state.js +23 -1
  256. package/lib/workflow-profiles.js +17 -5
  257. package/package.json +37 -35
  258. package/rules/documentation.md +19 -0
  259. package/rules/kernel-tracking.md +26 -0
  260. package/rules/security.md +22 -0
  261. package/rules/tdd.md +20 -0
  262. package/rules/workflow.md +27 -0
  263. package/scripts/auto-backing-issue.js +47 -0
  264. package/scripts/beads-context.sh +81 -57
  265. package/scripts/beads-upgrade-smoke.sh +24 -3
  266. package/scripts/bootstrap-windows-tools.sh +78 -0
  267. package/scripts/branch-protection.js +2 -3
  268. package/scripts/check-agents.js +34 -137
  269. package/scripts/commitlint.js +3 -1
  270. package/scripts/conflict-detect.sh +3 -0
  271. package/scripts/dep-guard.sh +22 -3
  272. package/scripts/file-index.sh +3 -0
  273. package/scripts/forge-team/lib/claim.sh +34 -18
  274. package/scripts/forge-team/lib/dashboard.sh +61 -86
  275. package/scripts/forge-team/lib/epic.sh +99 -263
  276. package/scripts/forge-team/lib/hooks.sh +26 -28
  277. package/scripts/forge-team/lib/identity.sh +4 -4
  278. package/scripts/forge-team/lib/sync-github.sh +49 -84
  279. package/scripts/forge-team/lib/verify.sh +93 -83
  280. package/scripts/forge-team/lib/workload.sh +41 -65
  281. package/scripts/forge-team/tests/claim.test.sh +25 -19
  282. package/scripts/forge-team/tests/dashboard.test.sh +31 -46
  283. package/scripts/forge-team/tests/epic.test.sh +52 -71
  284. package/scripts/forge-team/tests/hooks.test.sh +38 -50
  285. package/scripts/forge-team/tests/identity.test.sh +3 -3
  286. package/scripts/forge-team/tests/integration.test.sh +44 -66
  287. package/scripts/forge-team/tests/sync-github.test.sh +50 -83
  288. package/scripts/forge-team/tests/verify.test.sh +37 -46
  289. package/scripts/forge-team/tests/workflow-integration.test.sh +4 -4
  290. package/scripts/forge-team/tests/workload.test.sh +32 -66
  291. package/scripts/gen-command-manifest.js +153 -0
  292. package/scripts/gen-embedded-assets.mjs +129 -0
  293. package/scripts/install.ps1 +139 -0
  294. package/scripts/install.sh +268 -0
  295. package/scripts/lib/release-asset.mjs +84 -0
  296. package/scripts/parity-check.mjs +145 -0
  297. package/scripts/parity-check.test.mjs +58 -0
  298. package/scripts/pin-agentic-workflow-images.js +112 -0
  299. package/scripts/pr-auto-actions.js +93 -0
  300. package/scripts/pr-coordinator.sh +3 -0
  301. package/scripts/pr-verdict-label.js +50 -0
  302. package/scripts/preflight-sonar.eslint.config.mjs +44 -0
  303. package/scripts/preflight.sh +21 -94
  304. package/scripts/protected-state-check.js +104 -0
  305. package/scripts/smart-status.sh +60 -57
  306. package/scripts/spikes/config-race-bench.js +111 -0
  307. package/scripts/spikes/harness-capability-matrix.js +13 -0
  308. package/scripts/spikes/patch-anchor-stability-bench.js +125 -0
  309. package/scripts/spikes/protected-path-manifest.js +20 -0
  310. package/scripts/spikes/skill-auto-invoke-parity.js +292 -0
  311. package/scripts/sync-agent-skills.js +62 -0
  312. package/scripts/sync-utils.sh +3 -0
  313. package/scripts/test-ci-shard.js +13 -6
  314. package/scripts/test.js +95 -12
  315. package/skills/claim-safety/SKILL.md +102 -0
  316. package/skills/claim-safety/evals/evals.json +46 -0
  317. package/{.github/prompts/dev.prompt.md → skills/dev/SKILL.md} +44 -50
  318. package/skills/dev/evals/evals.json +50 -0
  319. package/skills/hermes-forge/SKILL.md +185 -0
  320. package/skills/hermes-forge/evals/evals.json +46 -0
  321. package/skills/issue-basics/SKILL.md +111 -0
  322. package/skills/issue-basics/evals/evals.json +46 -0
  323. package/skills/kernel/SKILL.md +166 -0
  324. package/skills/kernel/evals/evals.json +50 -0
  325. package/skills/memory/SKILL.md +102 -0
  326. package/skills/parallel-deep-research/SKILL.md +14 -11
  327. package/skills/parallel-deep-research/evals/evals.json +11 -27
  328. package/{.github/prompts/plan.prompt.md → skills/plan/SKILL.md} +132 -157
  329. package/skills/plan/evals/evals.json +42 -0
  330. package/skills/research/SKILL.md +195 -0
  331. package/skills/research/evals/evals.json +42 -0
  332. package/{.github/prompts/review.prompt.md → skills/review/SKILL.md} +98 -62
  333. package/skills/review/evals/evals.json +42 -0
  334. package/skills/rollback/SKILL.md +110 -0
  335. package/skills/rollback/evals/evals.json +46 -0
  336. package/skills/rollback/references/methods.md +204 -0
  337. package/{.cursor/commands/rollback.md → skills/rollback/references/workflow-integration.md} +10 -284
  338. package/skills/shepherd/SKILL.md +66 -0
  339. package/skills/shepherd/evals/evals.json +42 -0
  340. package/{.github/prompts/ship.prompt.md → skills/ship/SKILL.md} +81 -45
  341. package/skills/ship/evals/evals.json +42 -0
  342. package/skills/smith/SKILL.md +142 -0
  343. package/skills/smith/evals/evals.json +46 -0
  344. package/skills/smith/references/autonomy-and-gates.md +94 -0
  345. package/{.github/prompts/sonarcloud.prompt.md → skills/sonarcloud/SKILL.md} +14 -3
  346. package/skills/sonarcloud/evals/evals.json +46 -0
  347. package/skills/sonarcloud-analysis/SKILL.md +18 -13
  348. package/skills/sonarcloud-analysis/evals/evals.json +11 -15
  349. package/{.github/prompts/status.prompt.md → skills/status/SKILL.md} +20 -10
  350. package/skills/status/evals/evals.json +50 -0
  351. package/skills/triage-ready/SKILL.md +121 -0
  352. package/skills/triage-ready/evals/evals.json +42 -0
  353. package/{.github/prompts/validate.prompt.md → skills/validate/SKILL.md} +52 -29
  354. package/skills/validate/evals/evals.json +42 -0
  355. package/skills/verify/SKILL.md +299 -0
  356. package/skills/verify/evals/evals.json +50 -0
  357. package/.claude/commands/dev.md +0 -345
  358. package/.claude/commands/plan.md +0 -566
  359. package/.claude/commands/premerge.md +0 -186
  360. package/.claude/commands/research.md +0 -42
  361. package/.claude/commands/review.md +0 -451
  362. package/.claude/commands/rollback.md +0 -721
  363. package/.claude/commands/ship.md +0 -213
  364. package/.claude/commands/sonarcloud.md +0 -152
  365. package/.claude/commands/status.md +0 -90
  366. package/.claude/commands/validate.md +0 -288
  367. package/.claude/commands/verify.md +0 -269
  368. package/.claude/rules/workflow.md +0 -121
  369. package/.cline/workflows/dev.md +0 -342
  370. package/.cline/workflows/plan.md +0 -563
  371. package/.cline/workflows/premerge.md +0 -183
  372. package/.cline/workflows/research.md +0 -39
  373. package/.cline/workflows/review.md +0 -448
  374. package/.cline/workflows/rollback.md +0 -718
  375. package/.cline/workflows/ship.md +0 -210
  376. package/.cline/workflows/sonarcloud.md +0 -146
  377. package/.cline/workflows/status.md +0 -87
  378. package/.cline/workflows/validate.md +0 -285
  379. package/.cline/workflows/verify.md +0 -266
  380. package/.codex/config.toml +0 -11
  381. package/.codex/skills/dev/SKILL.md +0 -345
  382. package/.codex/skills/plan/SKILL.md +0 -566
  383. package/.codex/skills/premerge/SKILL.md +0 -186
  384. package/.codex/skills/research/SKILL.md +0 -42
  385. package/.codex/skills/review/SKILL.md +0 -451
  386. package/.codex/skills/rollback/SKILL.md +0 -721
  387. package/.codex/skills/ship/SKILL.md +0 -213
  388. package/.codex/skills/sonarcloud/SKILL.md +0 -149
  389. package/.codex/skills/status/SKILL.md +0 -90
  390. package/.codex/skills/validate/SKILL.md +0 -288
  391. package/.codex/skills/verify/SKILL.md +0 -269
  392. package/.cursor/commands/dev.md +0 -342
  393. package/.cursor/commands/plan.md +0 -563
  394. package/.cursor/commands/premerge.md +0 -183
  395. package/.cursor/commands/research.md +0 -39
  396. package/.cursor/commands/review.md +0 -448
  397. package/.cursor/commands/ship.md +0 -210
  398. package/.cursor/commands/sonarcloud.md +0 -146
  399. package/.cursor/commands/status.md +0 -87
  400. package/.cursor/commands/validate.md +0 -285
  401. package/.cursor/commands/verify.md +0 -266
  402. package/.cursorrules +0 -149
  403. package/.github/prompts/premerge.prompt.md +0 -188
  404. package/.github/prompts/research.prompt.md +0 -44
  405. package/.github/prompts/rollback.prompt.md +0 -723
  406. package/.github/prompts/verify.prompt.md +0 -271
  407. package/.github/workflows/beads-to-github.yml +0 -89
  408. package/.github/workflows/github-to-beads.yml +0 -100
  409. package/.kilocode/workflows/dev.md +0 -346
  410. package/.kilocode/workflows/plan.md +0 -567
  411. package/.kilocode/workflows/premerge.md +0 -187
  412. package/.kilocode/workflows/research.md +0 -43
  413. package/.kilocode/workflows/review.md +0 -452
  414. package/.kilocode/workflows/rollback.md +0 -722
  415. package/.kilocode/workflows/ship.md +0 -214
  416. package/.kilocode/workflows/sonarcloud.md +0 -150
  417. package/.kilocode/workflows/status.md +0 -91
  418. package/.kilocode/workflows/validate.md +0 -289
  419. package/.kilocode/workflows/verify.md +0 -270
  420. package/.opencode/commands/dev.md +0 -345
  421. package/.opencode/commands/plan.md +0 -566
  422. package/.opencode/commands/premerge.md +0 -186
  423. package/.opencode/commands/research.md +0 -42
  424. package/.opencode/commands/review.md +0 -451
  425. package/.opencode/commands/rollback.md +0 -721
  426. package/.opencode/commands/ship.md +0 -213
  427. package/.opencode/commands/sonarcloud.md +0 -149
  428. package/.opencode/commands/status.md +0 -90
  429. package/.opencode/commands/validate.md +0 -288
  430. package/.opencode/commands/verify.md +0 -269
  431. package/.roo/commands/dev.md +0 -346
  432. package/.roo/commands/plan.md +0 -567
  433. package/.roo/commands/premerge.md +0 -187
  434. package/.roo/commands/research.md +0 -43
  435. package/.roo/commands/review.md +0 -452
  436. package/.roo/commands/rollback.md +0 -722
  437. package/.roo/commands/ship.md +0 -214
  438. package/.roo/commands/sonarcloud.md +0 -150
  439. package/.roo/commands/status.md +0 -91
  440. package/.roo/commands/validate.md +0 -289
  441. package/.roo/commands/verify.md +0 -270
  442. package/docs/BEADS_GITHUB_SYNC.md +0 -281
  443. package/docs/GREPTILE_SETUP.md +0 -400
  444. package/docs/MANUAL_REVIEW_GUIDE.md +0 -106
  445. package/docs/SETUP.md +0 -663
  446. package/docs/VALIDATION.md +0 -363
  447. package/lib/agents/cline.plugin.json +0 -29
  448. package/lib/agents/copilot.plugin.json +0 -24
  449. package/lib/agents/kilocode.plugin.json +0 -22
  450. package/lib/agents/opencode.plugin.json +0 -23
  451. package/lib/agents/roo.plugin.json +0 -30
  452. package/lib/beads-bootstrap.js +0 -225
  453. package/lib/beads-health-check.js +0 -188
  454. package/lib/commands/commands-reset.js +0 -147
  455. package/opencode.json +0 -67
  456. package/scripts/beads-context.test.js +0 -584
  457. package/scripts/github-beads-sync/comment.mjs +0 -64
  458. package/scripts/github-beads-sync/config.mjs +0 -148
  459. package/scripts/github-beads-sync/github-api.mjs +0 -131
  460. package/scripts/github-beads-sync/index.mjs +0 -356
  461. package/scripts/github-beads-sync/label-mapper.mjs +0 -54
  462. package/scripts/github-beads-sync/mapping.mjs +0 -132
  463. package/scripts/github-beads-sync/reverse-sync-cli.mjs +0 -31
  464. package/scripts/github-beads-sync/reverse-sync.mjs +0 -162
  465. package/scripts/github-beads-sync/run-bd.mjs +0 -161
  466. package/scripts/github-beads-sync/sanitize.mjs +0 -121
  467. package/scripts/github-beads-sync.config.json +0 -26
  468. package/scripts/sync-commands.js +0 -600
@@ -0,0 +1,237 @@
1
+ 'use strict';
2
+
3
+ const path = require('node:path');
4
+ const {
5
+ runJsonlProjectionConsumer,
6
+ readProjection,
7
+ resolveProjectionDir,
8
+ writeProjection,
9
+ DEFAULT_PROJECTION_TARGET,
10
+ } = require('../kernel/projection-jsonl-writer');
11
+
12
+ // Full set the consumer may call — including the retry (recordProjectionFailure)
13
+ // and dead-letter (deadLetterProjection) paths — so a partially-implemented
14
+ // broker is skipped cleanly instead of failing mid-run.
15
+ const PROJECTION_BROKER_METHODS = [
16
+ 'listProjectionOutbox',
17
+ 'loadProjectionModel',
18
+ 'markProjectionDelivered',
19
+ 'recordProjectionFailure',
20
+ 'deadLetterProjection',
21
+ ];
22
+
23
+ /**
24
+ * Parse `forge export` options from positional args (and a parsed flags object
25
+ * as a fallback). Supported: --import, --dry-run, --json, --dir=<path> / --dir <path>.
26
+ */
27
+ function parseExportOptions(args = [], flags = {}) {
28
+ const options = {
29
+ import: Boolean(flags.import),
30
+ dryRun: Boolean(flags['dry-run'] || flags.dryRun),
31
+ json: Boolean(flags.json),
32
+ dir: flags.dir,
33
+ };
34
+
35
+ for (let i = 0; i < args.length; i += 1) {
36
+ const arg = args[i];
37
+ if (arg === '--import') options.import = true;
38
+ else if (arg === '--dry-run') options.dryRun = true;
39
+ else if (arg === '--json') options.json = true;
40
+ else if (arg.startsWith('--dir=')) options.dir = arg.slice('--dir='.length);
41
+ else if (arg === '--dir') {
42
+ // only consume the next token when it is a real value, not another flag
43
+ const next = args[i + 1];
44
+ if (next && !next.startsWith('--')) {
45
+ options.dir = next;
46
+ i += 1;
47
+ }
48
+ }
49
+ }
50
+
51
+ return options;
52
+ }
53
+
54
+ function brokerSupportsProjection(broker) {
55
+ return Boolean(broker) && PROJECTION_BROKER_METHODS.every(method => typeof broker[method] === 'function');
56
+ }
57
+
58
+ function resolveDirArg(dirArg, projectRoot) {
59
+ if (!dirArg) return undefined;
60
+ return path.resolve(projectRoot || process.cwd(), dirArg);
61
+ }
62
+
63
+ function renderHuman(payload) {
64
+ if (payload.error) return `forge export failed: ${payload.error}`;
65
+ if (payload.imported === true) {
66
+ const { issues, comments, dependencies } = payload.counts;
67
+ const skipped = issues.skipped + comments.skipped + dependencies.skipped;
68
+ // Report "Imported N" ONLY for records actually written; a re-import that
69
+ // applies nothing (everything already present) must not claim it imported them.
70
+ if (payload.applied === 0) {
71
+ return `Kernel projection at ${payload.dir} is already hydrated — nothing new imported`
72
+ + ` (${skipped} record${skipped === 1 ? '' : 's'} already present)`;
73
+ }
74
+ return `Imported Kernel projection from ${payload.dir}`
75
+ + ` (${issues.inserted} issues, ${comments.inserted} comments, ${dependencies.inserted} dependencies`
76
+ + (skipped ? `; ${skipped} already present` : '') + ')';
77
+ }
78
+ if (payload.imported === false) return payload.message;
79
+ if (payload.dryRun) return `${payload.pending} pending projection entr${payload.pending === 1 ? 'y' : 'ies'} → ${payload.dir} (dry run, nothing written)`;
80
+ if (payload.skipped) return payload.message;
81
+ if (payload.exported) return `Exported Kernel projection to ${payload.dir} (drained ${payload.drained})`;
82
+ return payload.message || 'Nothing to export';
83
+ }
84
+
85
+ function finalize(options, payload) {
86
+ const output = options.json ? JSON.stringify(payload, null, 2) : renderHuman(payload);
87
+ return { ...payload, output, json: Boolean(options.json) };
88
+ }
89
+
90
+ /**
91
+ * Forge Export Command (D16 — Kernel JSONL portability projection).
92
+ *
93
+ * Explicit, Kernel-owned projection of issues/comments/dependencies to
94
+ * deterministic git-tracked JSONL under `.forge/kernel/`. This is NOT auto-run on
95
+ * mutation/push (D16 forbids that); it is an on-demand portability/bootstrap
96
+ * surface. The `--import` path reads a committed snapshot back from disk (no
97
+ * broker required) and verifies its manifest integrity.
98
+ *
99
+ * @module commands/export
100
+ */
101
+ module.exports = {
102
+ name: 'export',
103
+ description: 'Export the Kernel backlog to deterministic git-tracked JSONL (D16 portability projection)',
104
+ usage: 'forge export [--dir <path>] [--dry-run] [--json] [--import]',
105
+ flags: {},
106
+
107
+ /**
108
+ * @param {string[]} args - Positional arguments / flags
109
+ * @param {object} flags - Parsed CLI flags (fallback source)
110
+ * @param {string} projectRoot - Project root path
111
+ * @param {object} [opts] - Dependency injection: _broker, _writer, _now, _fs
112
+ */
113
+ async handler(args = [], flags = {}, projectRoot, opts = {}) {
114
+ const options = parseExportOptions(args, flags || {});
115
+ const now = opts._now || new Date().toISOString();
116
+ const writer = opts._writer || writeProjection;
117
+ const fsImpl = opts._fs;
118
+ const projectionDir = resolveDirArg(options.dir, projectRoot);
119
+
120
+ // --- Import / hydrate (read committed JSONL → write kernel.sqlite) ---
121
+ // readProjection verifies snapshot integrity (sha256, per-file kind, manifest
122
+ // counts, and schema_version compatibility) and throws on any mismatch, so an
123
+ // incompatible/tampered snapshot never reaches the kernel writer.
124
+ if (options.import) {
125
+ try {
126
+ const snapshot = readProjection({ projectionDir, projectRoot, fsImpl });
127
+ if (!snapshot) {
128
+ return finalize(options, {
129
+ success: true,
130
+ imported: false,
131
+ dir: resolveProjectionDir(projectionDir, projectRoot),
132
+ message: 'No projection snapshot found to import',
133
+ });
134
+ }
135
+
136
+ const read = {
137
+ issues: snapshot.model.issues.length,
138
+ comments: snapshot.model.comments.length,
139
+ dependencies: snapshot.model.dependencies.length,
140
+ };
141
+
142
+ // Hydration requires a projection-capable Kernel broker (importIssues).
143
+ // The CLI injects one for `export` (a Kernel-tool command); without it we
144
+ // validated the snapshot but cannot write — say so instead of claiming an
145
+ // import happened.
146
+ const importBroker = opts._broker || null;
147
+ if (!importBroker || typeof importBroker.importIssues !== 'function') {
148
+ return finalize(options, {
149
+ success: true,
150
+ imported: false,
151
+ dir: snapshot.dir,
152
+ read,
153
+ message: `Read ${read.issues} issues from ${snapshot.dir} but no Kernel broker is `
154
+ + 'available to import into — nothing was written',
155
+ });
156
+ }
157
+
158
+ // importIssues requires the schema/migrations to exist; the CLI broker is
159
+ // pre-initialized, but initialize() is idempotent so calling it is safe.
160
+ if (typeof importBroker.initialize === 'function') {
161
+ await importBroker.initialize();
162
+ }
163
+
164
+ // Idempotent + transactional upsert-by-id (ON CONFLICT DO NOTHING).
165
+ const summary = await importBroker.importIssues(snapshot.model, { now });
166
+ const applied = summary.issues.inserted + summary.comments.inserted + summary.dependencies.inserted;
167
+
168
+ return finalize(options, {
169
+ success: true,
170
+ imported: true,
171
+ dir: snapshot.dir,
172
+ counts: summary,
173
+ applied,
174
+ });
175
+ } catch (error) {
176
+ return finalize(options, { success: false, imported: false, error: error.message });
177
+ }
178
+ }
179
+
180
+ // --- Export (requires a projection-capable Kernel broker) ------------
181
+ const broker = opts._broker || null;
182
+ if (!brokerSupportsProjection(broker)) {
183
+ return finalize(options, {
184
+ success: true,
185
+ exported: false,
186
+ skipped: true,
187
+ message: 'No Kernel broker available — nothing to export',
188
+ });
189
+ }
190
+
191
+ if (options.dryRun) {
192
+ const pending = (await broker.listProjectionOutbox({
193
+ target: DEFAULT_PROJECTION_TARGET,
194
+ status: 'pending',
195
+ now,
196
+ })) || [];
197
+ return finalize(options, {
198
+ success: true,
199
+ exported: false,
200
+ dryRun: true,
201
+ pending: pending.length,
202
+ dir: resolveProjectionDir(projectionDir, projectRoot),
203
+ });
204
+ }
205
+
206
+ try {
207
+ const run = await runJsonlProjectionConsumer({ broker, projectionDir, projectRoot, now, writer });
208
+
209
+ // A write failure leaves entries retried/dead-lettered without a snapshot;
210
+ // surface it as a failure rather than silently reporting success.
211
+ if (!run.written && run.error) {
212
+ return finalize(options, {
213
+ success: false,
214
+ exported: false,
215
+ error: run.error,
216
+ drained: run.drained,
217
+ retried: run.retried,
218
+ dead: run.dead,
219
+ dir: resolveProjectionDir(projectionDir, projectRoot),
220
+ });
221
+ }
222
+
223
+ return finalize(options, {
224
+ success: true,
225
+ exported: run.written,
226
+ drained: run.drained,
227
+ delivered: run.delivered,
228
+ retried: run.retried,
229
+ dead: run.dead,
230
+ dir: run.write ? run.write.dir : resolveProjectionDir(projectionDir, projectRoot),
231
+ files: run.write ? run.write.files : [],
232
+ });
233
+ } catch (error) {
234
+ return finalize(options, { success: false, exported: false, error: error.message });
235
+ }
236
+ },
237
+ };
@@ -0,0 +1,209 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * `forge gate <enable|disable|approve|reject|status|check> ...`
5
+ *
6
+ * Two families over the same known-gate set:
7
+ *
8
+ * TOGGLE (config surface): `enable|disable <gate-id>` set
9
+ * `workflow.gates.<gate-id>.enabled` true/false in `.forge/config.yaml`. The shipped
10
+ * resolver (`applyEnabledConfig`) already consumes this field, so `forge options
11
+ * gates --json` reflects the flip with zero new read code. Write-time validation:
12
+ * an unknown gate id (or a locked gate being disabled) errors BEFORE anything is
13
+ * written — never mid-run.
14
+ *
15
+ * EVENTS (gates-as-kernel-events — Fable's insight): `approve|reject <issue> <gate>`
16
+ * record a durable `gate.approved` / `gate.rejected` event on the issue; `status`
17
+ * lists them (resume-safe after a compaction/crash); `check` exits 0 iff the gate is
18
+ * DISABLED or an approval event exists — the reusable enforcement primitive a stage
19
+ * skill calls. See lib/gate-events.js and docs/work/2026-07-04-kernel-native-skills/
20
+ * decisions.md.
21
+ */
22
+
23
+ const path = require('node:path');
24
+ const { setConfigOverride } = require('../config-writer');
25
+ const { getDefaultRuntimeGraph, getResolvedRuntimeGraph } = require('../core/runtime-graph');
26
+ const {
27
+ recordGateEvent,
28
+ listGateEvents,
29
+ isGateApproved,
30
+ } = require('../gate-events');
31
+
32
+ // The doc-update gate folds under this noun as `gate doc` (P2, kernel issue
33
+ // 6ab3f30c) — it is a gate concern, not a `pr` one. `doc` delegates to the
34
+ // standalone doc-gate command (same code); bare `forge doc-gate` stays registered
35
+ // as a back-compat alias. Required lazily so the module graph has no cycle and the
36
+ // routed handler is resolved at dispatch time.
37
+ const docGate = require('./doc-gate');
38
+
39
+ const TOGGLE_ACTIONS = new Set(['enable', 'disable']);
40
+ const EVENT_ACTIONS = new Set(['approve', 'reject', 'status', 'check']);
41
+
42
+ function usage() {
43
+ return [
44
+ 'Usage: forge gate <enable|disable|approve|reject|status|check> [<issue-id>] <gate-id> [--reason <text>] [--json]',
45
+ ' forge gate doc <detect|check|init|okf|...> [args] (doc-update gate; = forge doc-gate, run `forge doc-gate --help`)',
46
+ ].join('\n');
47
+ }
48
+
49
+ // The known-toggle set is gates PLUS unlocked toggleable rails (e.g.
50
+ // rail.kernel_tracking): both are governed through the same `forge gate
51
+ // enable|disable` surface and the resolver's rail-aware workflow.gates loop.
52
+ // The gate.* / rail.* id namespaces are disjoint, so one flat map is unambiguous.
53
+ function knownGates() {
54
+ const graph = getDefaultRuntimeGraph();
55
+ return new Map([...graph.gates, ...graph.rails].map(primitive => [primitive.id, primitive]));
56
+ }
57
+
58
+ // Kernel deps + env are threaded through the command opts (4th handler arg) so tests
59
+ // and the orchestrator can inject a shared, already-migrated kernel.
60
+ function kernelDeps(opts = {}) {
61
+ return { kernelBroker: opts.kernelBroker, kernelDriver: opts.kernelDriver };
62
+ }
63
+
64
+ function validateKnownGate(gateId) {
65
+ const gates = knownGates();
66
+ const gate = gates.get(gateId);
67
+ if (!gate) {
68
+ return {
69
+ ok: false,
70
+ error: `Unknown gate '${gateId}'. Known gates: ${[...gates.keys()].join(', ')}`,
71
+ };
72
+ }
73
+ return { ok: true, gate };
74
+ }
75
+
76
+ function handleToggle(action, gateId, projectRoot) {
77
+ if (!gateId) {
78
+ return { success: false, error: `Missing gate id.\n${usage()}` };
79
+ }
80
+ const known = validateKnownGate(gateId);
81
+ if (!known.ok) return { success: false, error: known.error };
82
+ if (action === 'disable' && known.gate.locked === true) {
83
+ return { success: false, error: `Cannot disable locked gate '${gateId}'.` };
84
+ }
85
+
86
+ const enabled = action === 'enable';
87
+ const { configPath } = setConfigOverride(
88
+ projectRoot,
89
+ ['workflow', 'gates', gateId, 'enabled'],
90
+ enabled,
91
+ );
92
+ const where = path.relative(projectRoot, configPath) || configPath;
93
+ return {
94
+ success: true,
95
+ output: `${action}d gate '${gateId}' (workflow.gates.${gateId}.enabled=${enabled}) in ${where}`,
96
+ };
97
+ }
98
+
99
+ async function handleDecision(action, issueId, gateId, flags, projectRoot, opts) {
100
+ if (!issueId || !gateId) {
101
+ return { success: false, error: `Missing issue id or gate id.\n${usage()}` };
102
+ }
103
+ const known = validateKnownGate(gateId);
104
+ if (!known.ok) return { success: false, error: known.error };
105
+
106
+ const decision = action === 'approve' ? 'approved' : 'rejected';
107
+ const reason = typeof flags.reason === 'string' ? flags.reason : undefined;
108
+ const result = await recordGateEvent(projectRoot, {
109
+ issueId,
110
+ gateId,
111
+ decision,
112
+ reason,
113
+ env: opts.env,
114
+ deps: kernelDeps(opts),
115
+ });
116
+
117
+ if (result.issueMissing) {
118
+ return { success: false, error: `Issue '${issueId}' not found.` };
119
+ }
120
+
121
+ const verb = action === 'approve' ? 'approved' : 'rejected';
122
+ const suffix = result.duplicate ? ' (already recorded)' : '';
123
+ const reasonNote = reason ? ` — ${reason}` : '';
124
+ return {
125
+ success: true,
126
+ duplicate: result.duplicate === true,
127
+ actor: result.actor,
128
+ output: `${verb} gate '${gateId}' for ${issueId} (actor ${result.actor})${reasonNote}${suffix}`,
129
+ };
130
+ }
131
+
132
+ async function handleStatus(issueId, flags, projectRoot, opts) {
133
+ if (!issueId) {
134
+ return { success: false, error: `Missing issue id.\n${usage()}` };
135
+ }
136
+ const events = await listGateEvents(projectRoot, issueId, { deps: kernelDeps(opts) });
137
+
138
+ if (flags.json) {
139
+ return { success: true, output: JSON.stringify({ issue: issueId, events }, null, 2) };
140
+ }
141
+
142
+ if (events.length === 0) {
143
+ return { success: true, output: `No gate events for ${issueId}.` };
144
+ }
145
+ const lines = events.map(event => {
146
+ const label = event.event_type === 'gate.approved' ? 'APPROVED' : 'REJECTED';
147
+ const reason = event.reason ? ` — ${event.reason}` : '';
148
+ return `${label} ${event.gate} by ${event.actor} at ${event.created_at}${reason}`;
149
+ });
150
+ return { success: true, output: `Gate events for ${issueId}:\n${lines.join('\n')}` };
151
+ }
152
+
153
+ async function handleCheck(issueId, gateId, projectRoot, opts) {
154
+ if (!issueId || !gateId) {
155
+ return { success: false, error: `Missing issue id or gate id.\n${usage()}` };
156
+ }
157
+ const known = validateKnownGate(gateId);
158
+ if (!known.ok) return { success: false, error: known.error };
159
+
160
+ // Disabled gate/rail → satisfied without any approval event (read via the shipped
161
+ // resolver). Rails share the workflow.gates toggle surface, so check both collections.
162
+ const resolved = getResolvedRuntimeGraph({ projectRoot });
163
+ const resolvedGate = [...resolved.gates, ...resolved.rails].find(gate => gate.id === gateId);
164
+ if (resolvedGate && resolvedGate.enabled === false) {
165
+ return { success: true, output: `gate ${gateId} is disabled — satisfied for ${issueId}` };
166
+ }
167
+
168
+ const approved = await isGateApproved(projectRoot, issueId, gateId, { deps: kernelDeps(opts) });
169
+ if (approved) {
170
+ return { success: true, output: `gate ${gateId} approved for ${issueId}` };
171
+ }
172
+ return { success: false, error: `gate ${gateId} not approved for ${issueId}` };
173
+ }
174
+
175
+ async function handler(args, flags = {}, projectRoot = process.cwd(), opts = {}) {
176
+ const [action, ...rest] = args;
177
+
178
+ // `gate doc [<doc-gate sub> ...]` → the standalone doc-gate handler, with the
179
+ // consumed `doc` token dropped so its own arg shape (detect/check/init/okf …)
180
+ // and flags (`--base`/`--head`/`--json`/`--skip` …) reach it byte-identically.
181
+ if (action === 'doc') {
182
+ return docGate.handler(rest, flags, projectRoot, opts);
183
+ }
184
+
185
+ if (TOGGLE_ACTIONS.has(action)) {
186
+ return handleToggle(action, rest[0], projectRoot);
187
+ }
188
+ if (EVENT_ACTIONS.has(action)) {
189
+ if (action === 'status') {
190
+ return handleStatus(rest[0], flags, projectRoot, opts);
191
+ }
192
+ if (action === 'check') {
193
+ return handleCheck(rest[0], rest[1], projectRoot, opts);
194
+ }
195
+ return handleDecision(action, rest[0], rest[1], flags, projectRoot, opts);
196
+ }
197
+
198
+ return {
199
+ success: false,
200
+ error: `Expected 'enable', 'disable', 'approve', 'reject', 'status', 'check', or 'doc'.\n${usage()}`,
201
+ };
202
+ }
203
+
204
+ module.exports = {
205
+ name: 'gate',
206
+ description: 'Toggle a workflow gate, or record/query human-gate approval events',
207
+ usage: usage(),
208
+ handler,
209
+ };