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,135 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Lazy `.forge/` home creation (activation foundation).
5
+ *
6
+ * Discovery ≠ initialization. The global Forge plugin (SessionStart hook +
7
+ * `activation` skill) must create NOTHING in a user's repo. The FIRST verb that
8
+ * performs a real MUTATION (e.g. `forge claim`, `forge create`, `forge
9
+ * remember`) is what lazily materializes the bare-minimum `.forge/` skeleton.
10
+ * Read-only verbs (`ready`, `show`, `status`, `recap`, …) never call this, so a
11
+ * bare repo stays untouched until the user actually changes state.
12
+ *
13
+ * "Bare-minimum" here is strictly LESS than `forge init --minimal`: this writes
14
+ * ONLY `.forge/config.yaml` with every gate disabled (the `minimal` adoption
15
+ * profile). It installs NO git hooks, NO lefthook.yml, NO protected-paths
16
+ * manifest, NO `.mcp.json`, and NO scripts tree — those remain the opt-in
17
+ * payload of `forge setup`, never forced. Progressive growth: heavier slices
18
+ * initialize themselves on first use.
19
+ *
20
+ * @module activation/ensure-forge-home
21
+ */
22
+
23
+ const fs = require('node:fs');
24
+ const path = require('node:path');
25
+
26
+ const { renderAdoptionConfigYaml } = require('../adoption-profiles');
27
+
28
+ /**
29
+ * Core verbs that MUTATE project state and therefore need `.forge/` to exist.
30
+ *
31
+ * Deliberately excludes `init`/`setup` — they own `.forge/` creation with their
32
+ * own (richer) logic, and pre-creating a minimal config would trip their
33
+ * no-clobber guard. Also excludes every read-only verb, so those write nothing.
34
+ *
35
+ * Deliberately EXCLUDES `gate` and `stage`: each has read-only subcommands
36
+ * (`gate status`/`gate check`, `stage --list`/`--current`) that must not create
37
+ * `.forge/` — a verb-level trigger would violate the foundation's own
38
+ * "read-only writes nothing" invariant. Their genuinely-mutating forms
39
+ * self-manage without ensureForgeHome: `gate enable|disable` and `role` write
40
+ * via the config writer (which creates `.forge/config.yaml` if absent), while
41
+ * `gate approve|reject` and `stage --start|--complete` write kernel events/runs
42
+ * through the broker (which lazily creates its own store). Subcommand-level
43
+ * granularity is deferred; excluding the whole verb is the correct, safe default
44
+ * because the read-only forms are the common case. `role` is retained: it has NO
45
+ * read-only form (every valid invocation writes config), so it violates nothing.
46
+ *
47
+ * A command module may override membership by exporting `mutating: true|false`;
48
+ * this Set is the default classification for the foundation.
49
+ */
50
+ const MUTATING_VERBS = new Set([
51
+ 'claim',
52
+ 'close',
53
+ 'create',
54
+ 'comment',
55
+ 'update',
56
+ 'add',
57
+ 'new',
58
+ 'remember',
59
+ 'role',
60
+ 'patch',
61
+ ]);
62
+
63
+ /**
64
+ * Decide whether a verb should lazily ensure the `.forge/` home.
65
+ *
66
+ * A command module's explicit `mutating` boolean wins; otherwise fall back to
67
+ * the default {@link MUTATING_VERBS} classification.
68
+ *
69
+ * @param {string} name - Command/verb name being dispatched.
70
+ * @param {object} [command] - The resolved command module (may declare `mutating`).
71
+ * @returns {boolean}
72
+ */
73
+ function isMutatingVerb(name, command) {
74
+ if (command && typeof command === 'object' && typeof command.mutating === 'boolean') {
75
+ return command.mutating;
76
+ }
77
+ return MUTATING_VERBS.has(name);
78
+ }
79
+
80
+ /**
81
+ * Render the bare-minimum, gates-disabled config body.
82
+ *
83
+ * Reuses the canonical `minimal` adoption profile so the produced YAML is
84
+ * schema-valid and identical in spirit to `forge init --minimal` (minus the
85
+ * hooks/protected-paths side effects). Overridable via `deps.renderConfig` for
86
+ * tests that don't want to depend on the profile renderer.
87
+ *
88
+ * @param {object} [deps]
89
+ * @returns {string} config.yaml contents
90
+ */
91
+ function renderMinimalConfig(deps = {}) {
92
+ const render = deps.renderConfig || (() => renderAdoptionConfigYaml('minimal'));
93
+ return render();
94
+ }
95
+
96
+ /**
97
+ * Idempotently create the bare-minimum `.forge/` skeleton for a mutating verb.
98
+ *
99
+ * No-clobber by construction: if `.forge/` already exists (inited repo, or a
100
+ * partially-created home), this is a NO-OP and never touches the user's files.
101
+ * The kernel/issue store (`.forge/kernel/…`) is created lazily by the broker on
102
+ * the mutating verb itself — this function only guarantees the config skeleton.
103
+ *
104
+ * @param {string} [projectRoot=process.cwd()] - Repo root to initialize.
105
+ * @param {object} [deps] - Injectable seams: `fs`, `renderConfig`.
106
+ * @returns {{ created: boolean, reason?: string, configPath: string }}
107
+ */
108
+ function ensureForgeHome(projectRoot = process.cwd(), deps = {}) {
109
+ const fsImpl = deps.fs || fs;
110
+ const forgeDir = path.join(projectRoot, '.forge');
111
+ const configPath = path.join(forgeDir, 'config.yaml');
112
+
113
+ // Idempotent + self-healing. The presence of `config.yaml` — NOT the `.forge/`
114
+ // directory alone — is what marks the home as initialized. Keying the
115
+ // no-clobber check on the config FILE means a half-init (dir created but config
116
+ // never written: disk full, permission error, or the process killed between
117
+ // mkdir and write) is COMPLETED on the next call instead of being permanently
118
+ // stuck behind a dir-exists early-return. We only ever ADD a missing
119
+ // config.yaml and never overwrite an existing one, so a real inited repo is
120
+ // still never clobbered. `mkdirSync({recursive})` is a no-op if the dir exists.
121
+ if (fsImpl.existsSync(configPath)) {
122
+ return { created: false, reason: 'config-exists', configPath };
123
+ }
124
+
125
+ fsImpl.mkdirSync(forgeDir, { recursive: true });
126
+ fsImpl.writeFileSync(configPath, renderMinimalConfig(deps), 'utf8');
127
+ return { created: true, configPath };
128
+ }
129
+
130
+ module.exports = {
131
+ ensureForgeHome,
132
+ isMutatingVerb,
133
+ renderMinimalConfig,
134
+ MUTATING_VERBS,
135
+ };
@@ -0,0 +1,307 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+ const { GreptileReviewAdapter } = require('./adapters/greptile-review-adapter');
6
+ const { validateReviewAdapter } = require('./review-adapter');
7
+
8
+ const RESERVED_ADAPTER_NAMES = new Set(['greptile']);
9
+ const REQUIRED_NORMALIZED_THREAD_KEYS = ['id', 'commentId', 'file', 'line', 'body', 'author', 'isResolved', 'raw'];
10
+
11
+ function parseOption(args, name, fallback = undefined) {
12
+ const prefix = `--${name}=`;
13
+ const inline = args.find((arg) => arg.startsWith(prefix));
14
+ if (inline) {
15
+ return inline.slice(prefix.length);
16
+ }
17
+ const index = args.indexOf(`--${name}`);
18
+ if (index !== -1 && args[index + 1] && !args[index + 1].startsWith('--')) {
19
+ return args[index + 1];
20
+ }
21
+ if (index !== -1) {
22
+ return '';
23
+ }
24
+ return fallback;
25
+ }
26
+
27
+ function validateAdapterName(name) {
28
+ if (!name || typeof name !== 'string') {
29
+ return 'Adapter name is required';
30
+ }
31
+ if (!/^[a-z][a-z0-9-]*$/.test(name)) {
32
+ return 'Adapter name must start with a lowercase letter and contain only lowercase letters, numbers, and hyphens';
33
+ }
34
+ return null;
35
+ }
36
+
37
+ function assertValidAdapterName(name) {
38
+ const error = validateAdapterName(name);
39
+ if (error) {
40
+ throw new Error(error);
41
+ }
42
+ }
43
+
44
+ function isReservedAdapterName(name) {
45
+ return RESERVED_ADAPTER_NAMES.has(name);
46
+ }
47
+
48
+ function adapterNameToClassName(name) {
49
+ return `${name
50
+ .split(/[^a-zA-Z0-9]+/)
51
+ .filter(Boolean)
52
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
53
+ .join('')}ReviewAdapter`;
54
+ }
55
+
56
+ function getReviewAdapterDir(projectRoot) {
57
+ return path.join(projectRoot, '.forge', 'adapters', 'review');
58
+ }
59
+
60
+ function getAdapterPath(projectRoot, name, kind = 'review') {
61
+ assertValidAdapterName(name);
62
+ const adapterDir = path.resolve(projectRoot, '.forge', 'adapters', kind);
63
+ const adapterPath = path.resolve(adapterDir, `${name}.js`);
64
+ if (!adapterPath.startsWith(`${adapterDir}${path.sep}`)) {
65
+ throw new Error('Adapter path must stay under .forge/adapters');
66
+ }
67
+ return adapterPath;
68
+ }
69
+
70
+ function renderReviewAdapterScaffold(name, template) {
71
+ const className = adapterNameToClassName(name);
72
+ return `'use strict';
73
+
74
+ class ${className} {
75
+ constructor(options = {}) {
76
+ this.id = options.id || '${name}';
77
+ this.kind = 'review';
78
+ this.name = options.name || '${className}';
79
+ }
80
+
81
+ async fetchThreads(_context) {
82
+ throw new Error('${name}.fetchThreads must connect to the review provider');
83
+ }
84
+
85
+ parse(_payload) {
86
+ // Start from the ${template} template and normalize provider payloads into:
87
+ // { id, commentId, file, line, body, author, isResolved, raw }
88
+ throw new Error('${name}.parse must normalize provider payloads before use');
89
+ }
90
+
91
+ async reply(_context) {
92
+ throw new Error('${name}.reply must post a review-thread reply');
93
+ }
94
+
95
+ async resolve(_context) {
96
+ throw new Error('${name}.resolve must mark a review thread resolved');
97
+ }
98
+
99
+ score(threads) {
100
+ return threads.map((thread) => ({ ...thread, resolved: false, reason: 'not scored' }));
101
+ }
102
+ }
103
+
104
+ module.exports = { ${className} };
105
+ `;
106
+ }
107
+
108
+ function scaffoldAdapter(args, projectRoot) {
109
+ const subcommand = args[0];
110
+ const name = args[1];
111
+ const kind = parseOption(args, 'kind', 'review');
112
+ const template = parseOption(args, 'template', 'greptile');
113
+
114
+ if (subcommand !== 'adapter' || !name) {
115
+ return { success: false, error: 'Usage: forge new adapter <name> --kind=review --template=greptile' };
116
+ }
117
+ const nameError = validateAdapterName(name);
118
+ if (nameError) {
119
+ return { success: false, error: nameError };
120
+ }
121
+ if (isReservedAdapterName(name)) {
122
+ return { success: false, error: `Adapter name is reserved: ${name}` };
123
+ }
124
+ if (kind !== 'review') {
125
+ return { success: false, error: 'Only --kind=review is supported in this foundation PR' };
126
+ }
127
+ if (template !== 'greptile') {
128
+ return { success: false, error: 'Only --template=greptile is supported in this foundation PR' };
129
+ }
130
+
131
+ const adapterDir = getReviewAdapterDir(projectRoot);
132
+ const adapterPath = getAdapterPath(projectRoot, name, kind);
133
+ fs.mkdirSync(adapterDir, { recursive: true });
134
+
135
+ if (fs.existsSync(adapterPath)) {
136
+ return { success: false, error: `Adapter already exists: ${path.relative(projectRoot, adapterPath)}` };
137
+ }
138
+
139
+ fs.writeFileSync(adapterPath, renderReviewAdapterScaffold(name, template));
140
+
141
+ return {
142
+ success: true,
143
+ output: `Created review adapter scaffold: ${path.relative(projectRoot, adapterPath).split(path.sep).join('/')}`,
144
+ };
145
+ }
146
+
147
+ function loadAdapter(name, projectRoot) {
148
+ if (name === 'greptile') {
149
+ return new GreptileReviewAdapter();
150
+ }
151
+
152
+ const adapterPath = getAdapterPath(projectRoot, name);
153
+ if (!fs.existsSync(adapterPath)) {
154
+ throw new Error(`Adapter not found: ${name}`);
155
+ }
156
+
157
+ const mod = require(adapterPath);
158
+ const exported = mod.default || mod[adapterNameToClassName(name)] || mod.adapter || mod;
159
+ return typeof exported === 'function' ? new exported() : exported;
160
+ }
161
+
162
+ function hasNormalizedReviewThreadShape(thread) {
163
+ return Boolean(thread)
164
+ && REQUIRED_NORMALIZED_THREAD_KEYS.every((key) => Object.prototype.hasOwnProperty.call(thread, key));
165
+ }
166
+
167
+ async function runFixtureReplay(args, projectRoot) {
168
+ const name = args[1];
169
+ const fixturePath = parseOption(args, 'fixture');
170
+
171
+ if (!name || !fixturePath) {
172
+ return { success: false, error: 'Usage: forge adapter test <name> --fixture=<path>' };
173
+ }
174
+
175
+ let adapter;
176
+ try {
177
+ adapter = loadAdapter(name, projectRoot);
178
+ } catch (error) {
179
+ return { success: false, error: error.message };
180
+ }
181
+ const validation = validateReviewAdapter(adapter);
182
+ if (!validation.valid) {
183
+ return { success: false, error: validation.errors.join('; ') };
184
+ }
185
+
186
+ const absoluteFixturePath = path.isAbsolute(fixturePath)
187
+ ? fixturePath
188
+ : path.join(projectRoot, fixturePath);
189
+ let fixture;
190
+ let parsed;
191
+ let scores;
192
+ try {
193
+ fixture = JSON.parse(fs.readFileSync(absoluteFixturePath, 'utf8'));
194
+ const fixtureInput = Object.prototype.hasOwnProperty.call(fixture, 'input')
195
+ ? fixture.input
196
+ : fixture;
197
+ parsed = adapter.parse(fixtureInput);
198
+ if (!Array.isArray(parsed)) {
199
+ throw new Error('Adapter parse must return an array');
200
+ }
201
+ if (!parsed.every(hasNormalizedReviewThreadShape)) {
202
+ throw new Error('Adapter parse must return normalized review threads');
203
+ }
204
+ scores = await adapter.score(parsed, {
205
+ projectRoot,
206
+ sinceCommit: fixture.sinceCommit || null,
207
+ _exec: fixture.gitOutput ? () => fixture.gitOutput : () => '',
208
+ });
209
+ if (!Array.isArray(scores)) {
210
+ throw new Error('Adapter score must return an array');
211
+ }
212
+ } catch (error) {
213
+ return { success: false, error: `Fixture replay failed: ${error.message}` };
214
+ }
215
+
216
+ if (fixture.expect?.threads !== undefined && parsed.length !== fixture.expect.threads) {
217
+ return {
218
+ success: false,
219
+ error: `Expected ${fixture.expect.threads} parsed threads, got ${parsed.length}`,
220
+ };
221
+ }
222
+
223
+ return {
224
+ success: true,
225
+ output: `Adapter ${name} fixture replay passed: ${parsed.length} parsed thread${parsed.length === 1 ? '' : 's'}, ${scores.length} scored result${scores.length === 1 ? '' : 's'}`,
226
+ };
227
+ }
228
+
229
+ function listAdapters(projectRoot) {
230
+ const adapterDir = getReviewAdapterDir(projectRoot);
231
+ const local = fs.existsSync(adapterDir)
232
+ ? fs.readdirSync(adapterDir)
233
+ .filter((file) => file.endsWith('.js'))
234
+ .map((file) => file.replace(/\.js$/, ''))
235
+ .filter((name) => !isReservedAdapterName(name))
236
+ : [];
237
+ return ['greptile', ...local].sort((left, right) => left.localeCompare(right));
238
+ }
239
+
240
+ function setAdapterEnabled(args, projectRoot, enabled) {
241
+ const name = args[1];
242
+ if (!name) {
243
+ return { success: false, error: `Usage: forge adapter ${enabled ? 'enable' : 'disable'} <name>` };
244
+ }
245
+ const nameError = validateAdapterName(name);
246
+ if (nameError) {
247
+ return { success: false, error: nameError };
248
+ }
249
+ let config;
250
+ try {
251
+ const configDir = path.join(projectRoot, '.forge');
252
+ const configPath = path.join(configDir, 'adapters.json');
253
+ fs.mkdirSync(configDir, { recursive: true });
254
+ const parsedConfig = fs.existsSync(configPath)
255
+ ? JSON.parse(fs.readFileSync(configPath, 'utf8'))
256
+ : null;
257
+ config = parsedConfig && typeof parsedConfig === 'object' && !Array.isArray(parsedConfig)
258
+ ? parsedConfig
259
+ : { review: {} };
260
+ config.review = config.review && typeof config.review === 'object' && !Array.isArray(config.review)
261
+ ? config.review
262
+ : {};
263
+ config.review[name] = { ...(config.review[name] || {}), enabled };
264
+ fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\n`);
265
+ } catch (error) {
266
+ return { success: false, error: `Failed to update adapter config: ${error.message}` };
267
+ }
268
+ return {
269
+ success: true,
270
+ output: `${enabled ? 'Enabled' : 'Disabled'} review adapter: ${name}`,
271
+ };
272
+ }
273
+
274
+ async function handleAdapterCommand(args, projectRoot) {
275
+ const action = args[0];
276
+
277
+ if (action === 'test') {
278
+ return runFixtureReplay(args, projectRoot);
279
+ }
280
+ if (action === 'list') {
281
+ return { success: true, output: listAdapters(projectRoot).join('\n') };
282
+ }
283
+ if (action === 'enable') {
284
+ return setAdapterEnabled(args, projectRoot, true);
285
+ }
286
+ if (action === 'disable') {
287
+ return setAdapterEnabled(args, projectRoot, false);
288
+ }
289
+
290
+ return {
291
+ success: false,
292
+ error: 'Usage: forge adapter <test|list|enable|disable> ...',
293
+ };
294
+ }
295
+
296
+ module.exports = {
297
+ adapterNameToClassName,
298
+ getAdapterPath,
299
+ handleAdapterCommand,
300
+ hasNormalizedReviewThreadShape,
301
+ isReservedAdapterName,
302
+ listAdapters,
303
+ runFixtureReplay,
304
+ scaffoldAdapter,
305
+ setAdapterEnabled,
306
+ validateAdapterName,
307
+ };
@@ -0,0 +1,127 @@
1
+ 'use strict';
2
+
3
+ const {
4
+ IssueAdapter,
5
+ decideIssueAuthority,
6
+ normalizeIssueStatus,
7
+ } = require('../issue-adapter.js');
8
+
9
+ class BeadsIssueAdapter extends IssueAdapter {
10
+ constructor(options = {}) {
11
+ super({
12
+ id: options.id || 'beads',
13
+ kind: 'issue',
14
+ name: options.name || 'Beads Issue Adapter',
15
+ version: options.version || '0.1.0',
16
+ });
17
+ this.runBeadsOperation = options.runBeadsOperation;
18
+ }
19
+
20
+ run(operation, args = [], context = {}) {
21
+ if (typeof this.runBeadsOperation !== 'function') {
22
+ throw new TypeError('runBeadsOperation is not configured on this adapter');
23
+ }
24
+
25
+ return this.runBeadsOperation(operation, args, context, context.deps || {});
26
+ }
27
+
28
+ list(args = [], context = {}) {
29
+ return this.run('list', args, context);
30
+ }
31
+
32
+ ready(args = [], context = {}) {
33
+ return this.run('ready', args, context);
34
+ }
35
+
36
+ read(args = [], context = {}) {
37
+ return this.run('show', args, context);
38
+ }
39
+
40
+ show(args = [], context = {}) {
41
+ return this.read(args, context);
42
+ }
43
+
44
+ create(args = [], context = {}) {
45
+ return this.run('create', args, context);
46
+ }
47
+
48
+ search(args = [], context = {}) {
49
+ return this.run('search', args, context);
50
+ }
51
+
52
+ stats(args = [], context = {}) {
53
+ return this.run('stats', args, context);
54
+ }
55
+
56
+ update(args = [], context = {}) {
57
+ return this.run('update', args, context);
58
+ }
59
+
60
+ close(args = [], context = {}) {
61
+ return this.run('close', args, context);
62
+ }
63
+
64
+ comment(args = [], context = {}) {
65
+ return this.run('comment', args, context);
66
+ }
67
+
68
+ depAdd(args = [], context = {}) {
69
+ return this.run('dep.add', args, context);
70
+ }
71
+
72
+ depRemove(args = [], context = {}) {
73
+ return this.run('dep.remove', args, context);
74
+ }
75
+
76
+ // De-bead parity: claim/release and the KAP-7/KAP-12 derived reads now route
77
+ // through the backend abstraction (the translations moved out of _issue.js). The
78
+ // beads layer maps claim -> `update <id> --claim`; release has no bd equivalent
79
+ // and returns the Kernel-only contract error (handled in runBeadsOperation).
80
+ claim(args = [], context = {}) {
81
+ return this.run('claim', args, context);
82
+ }
83
+
84
+ release(args = [], context = {}) {
85
+ return this.run('release', args, context);
86
+ }
87
+
88
+ blocked(args = [], context = {}) {
89
+ return this.run('blocked', args, context);
90
+ }
91
+
92
+ stale(args = [], context = {}) {
93
+ return this.run('stale', args, context);
94
+ }
95
+
96
+ orphans(args = [], context = {}) {
97
+ return this.run('orphans', args, context);
98
+ }
99
+
100
+ lint(args = [], context = {}) {
101
+ return this.run('lint', args, context);
102
+ }
103
+
104
+ // Lease ownership is Kernel-only; the beads layer returns the Kernel-only contract
105
+ // error (handled in runBeadsOperation), matching the release passthrough.
106
+ owns(args = [], context = {}) {
107
+ return this.run('owns', args, context);
108
+ }
109
+
110
+ // Active-lease listing is Kernel-only (kernel_claims); the beads layer returns the
111
+ // Kernel-only contract error (handled in runBeadsOperation), matching owns/release.
112
+ claims(args = [], context = {}) {
113
+ return this.run('claims', args, context);
114
+ }
115
+
116
+ mapStatus(status, context = {}) {
117
+ return normalizeIssueStatus(status, context);
118
+ }
119
+
120
+ decideAuthority(change = {}, context = {}) {
121
+ return decideIssueAuthority(change, context);
122
+ }
123
+ }
124
+
125
+ module.exports = {
126
+ BeadsIssueAdapter,
127
+ };