forge-workflow 0.0.9 → 0.1.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/rules/{greptile-review-process.md → review-process.md} +56 -41
- package/.claude/scripts/{greptile-resolve.sh → review-resolve.sh} +13 -3
- package/.cursor/rules/permissions-guidance.mdc +2 -2
- package/.forge/hooks/check-tdd.js +3 -0
- package/.forge/hooks/forge-native-hook.js +245 -0
- package/.forge/protected-paths.yaml +157 -0
- package/AGENTS.md +151 -61
- package/CHANGELOG.md +681 -0
- package/CLAUDE.md +9 -106
- package/QUICKSTART.md +171 -0
- package/README.md +271 -363
- package/bin/forge-cmd.js +120 -9
- package/bin/forge-preflight.js +26 -5
- package/bin/forge.js +466 -489
- package/docs/INDEX.md +93 -0
- package/docs/PROJECT_DESIGN.md +685 -0
- package/docs/architecture/index.md +66 -0
- package/docs/architecture/notes/README.md +35 -0
- package/docs/architecture/subsystems/README.md +46 -0
- package/docs/{TOOLCHAIN.md → forge/TOOLCHAIN.md} +56 -47
- package/docs/forge/VALIDATION.md +82 -0
- package/docs/{AGENT_INSTALL_PROMPT.md → guides/AGENT_INSTALL_PROMPT.md} +3 -3
- package/docs/guides/BEADS_GITHUB_SYNC.md +32 -0
- package/docs/{ENHANCED_ONBOARDING.md → guides/ENHANCED_ONBOARDING.md} +16 -12
- package/docs/guides/GREPTILE_SETUP.md +46 -0
- package/docs/guides/MANUAL_REVIEW_GUIDE.md +58 -0
- package/docs/guides/MIGRATION.md +56 -0
- package/docs/guides/SETUP.md +118 -0
- package/docs/guides/SUPPORT.md +185 -0
- package/docs/guides/WORKFLOW_TEMPLATES.md +74 -0
- package/docs/guides/memory-backends.md +183 -0
- package/docs/reference/ADAPTERS.md +128 -0
- package/docs/reference/AGENT_SKILL_PARITY.md +175 -0
- package/docs/reference/COMMANDS.md +205 -0
- package/docs/reference/DECISION_DRIFT_GUARDS.md +97 -0
- package/docs/{EXAMPLES.md → reference/EXAMPLES.md} +7 -5
- package/docs/reference/FORGE_KERNEL_STORAGE_MODEL.md +135 -0
- package/docs/reference/HERMES_INTEGRATION.md +118 -0
- package/docs/reference/INSIGHTS_RECAP.md +63 -0
- package/docs/reference/INSTALL.md +164 -0
- package/docs/reference/KERNEL_TAXONOMY_VALIDATION.md +161 -0
- package/docs/reference/PROTECTED_PATH_MANIFEST.md +25 -0
- package/docs/reference/RELEASE.md +68 -0
- package/docs/reference/RESEARCH_TEMPLATE.md +292 -0
- package/docs/{ROADMAP.md → reference/ROADMAP.md} +12 -9
- package/docs/reference/SKILLS.md +35 -0
- package/docs/reference/STATUS_BOARD.md +80 -0
- package/docs/reference/TEMPLATES.md +106 -0
- package/docs/reference/TOOLCHAIN.md +658 -0
- package/docs/reference/VALIDATION.md +82 -0
- package/docs/reference/agent-permissions.md +169 -0
- package/docs/reference/beads-to-kernel-migration-ux.md +61 -0
- package/docs/reference/control-plane-guarantees.md +125 -0
- package/docs/reference/dependency-chain.md +331 -0
- package/docs/reference/forge-kernel-issue-command-contract.md +161 -0
- package/docs/reference/forge-kernel-schema.md +72 -0
- package/docs/reference/kernel-conflict-evaluators.md +27 -0
- package/docs/reference/patch-md-format.md +77 -0
- package/docs/reference/protected-state-surfaces.md +59 -0
- package/docs/reference/shepherd.md +115 -0
- package/docs/reference/superpowers-analysis.md +320 -0
- package/docs/reference/superpowers-integration-options.md +404 -0
- package/docs/reference/test-environment.md +519 -0
- package/docs/reference/upgrade-safety.md +59 -0
- package/lefthook.yml +18 -0
- package/lib/adapter-cli.js +307 -0
- package/lib/adapters/beads-issue-adapter.js +127 -0
- package/lib/adapters/beads-kernel-compat.js +1042 -0
- package/lib/adapters/greptile-review-adapter.js +141 -0
- package/lib/adapters/kernel-issue-adapter.js +101 -0
- package/lib/adapters/pr-state-adapter.js +484 -0
- package/lib/adoption-profiles.js +126 -0
- package/lib/agents/README.md +2 -6
- package/lib/agents/claude.plugin.json +3 -8
- package/lib/agents/codex.plugin.json +9 -1
- package/lib/agents/cursor.plugin.json +2 -6
- package/lib/agents/hermes.plugin.json +22 -0
- package/lib/agents-config.js +39 -1236
- package/lib/audit-evidence.js +282 -0
- package/lib/beads-setup.js +225 -28
- package/lib/beads-sync-scaffold.js +36 -107
- package/lib/codex-skills.js +51 -1
- package/lib/commands/_issue.js +744 -70
- package/lib/commands/_manifest.js +91 -0
- package/lib/commands/_registry.js +85 -34
- package/lib/commands/_resolve-command-opts.js +261 -0
- package/lib/commands/_serve-security.js +270 -0
- package/lib/commands/adapter.js +12 -0
- package/lib/commands/add.js +118 -0
- package/lib/commands/audit.js +70 -0
- package/lib/commands/blocked.js +5 -0
- package/lib/commands/board.js +64 -0
- package/lib/commands/claim.js +21 -2
- package/lib/commands/claims.js +7 -0
- package/lib/commands/clean.js +485 -75
- package/lib/commands/close.js +2 -2
- package/lib/commands/comment.js +5 -0
- package/lib/commands/control.js +148 -0
- package/lib/commands/create.js +2 -2
- package/lib/commands/dev.js +185 -7
- package/lib/commands/doc-gate.js +336 -0
- package/lib/commands/doctor.js +156 -0
- package/lib/commands/explain.js +15 -0
- package/lib/commands/export.js +237 -0
- package/lib/commands/gate.js +192 -0
- package/lib/commands/hooks.js +242 -0
- package/lib/commands/inbox.js +118 -0
- package/lib/commands/init.js +598 -0
- package/lib/commands/insights.js +79 -0
- package/lib/commands/issue.js +12 -1
- package/lib/commands/issues.js +66 -0
- package/lib/commands/lint.js +5 -0
- package/lib/commands/list.js +2 -2
- package/lib/commands/merge.js +312 -0
- package/lib/commands/migrate.js +523 -0
- package/lib/commands/new.js +12 -0
- package/lib/commands/options.js +241 -0
- package/lib/commands/orient.js +13 -0
- package/lib/commands/orphans.js +5 -0
- package/lib/commands/patch.js +67 -0
- package/lib/commands/plan.js +436 -24
- package/lib/commands/preflight.js +211 -0
- package/lib/commands/prime.js +13 -0
- package/lib/commands/push.js +69 -2
- package/lib/commands/ready.js +2 -2
- package/lib/commands/recall.js +116 -0
- package/lib/commands/recap.js +61 -0
- package/lib/commands/recommend.js +22 -2
- package/lib/commands/release.js +91 -0
- package/lib/commands/remember.js +74 -0
- package/lib/commands/role.js +99 -0
- package/lib/commands/serve.js +581 -0
- package/lib/commands/setup.js +851 -979
- package/lib/commands/shepherd.js +436 -0
- package/lib/commands/ship.js +23 -1
- package/lib/commands/show.js +2 -2
- package/lib/commands/stage.js +192 -0
- package/lib/commands/stale.js +5 -0
- package/lib/commands/status.js +329 -11
- package/lib/commands/sync.js +34 -46
- package/lib/commands/team.js +15 -2
- package/lib/commands/test.js +58 -7
- package/lib/commands/update.js +2 -2
- package/lib/commands/upgrade.js +47 -0
- package/lib/commands/validate.js +56 -25
- package/lib/commands/worktree.js +308 -128
- package/lib/config-writer.js +202 -0
- package/lib/control-plane.js +236 -0
- package/lib/core/runtime-graph.js +946 -0
- package/lib/dep-guard/keyword-ripple.js +184 -0
- package/lib/deprecated-sync-cleanup.js +362 -0
- package/lib/detect-agent.js +2 -28
- package/lib/detect-worktree.js +42 -17
- package/lib/doc-gate/declaration.js +177 -0
- package/lib/doc-gate/detect.js +289 -0
- package/lib/doc-gate/gate.js +375 -0
- package/lib/doc-gate/okf-config.js +128 -0
- package/lib/doc-gate/okf.js +429 -0
- package/lib/docs-command.js +1161 -6
- package/lib/forge-issues.js +697 -0
- package/lib/forge-lock.js +262 -0
- package/lib/gate-events.js +193 -0
- package/lib/global-flags.js +74 -0
- package/lib/greptile-match.js +7 -63
- package/lib/harness-capability-matrix.js +380 -0
- package/lib/hook-global-installer.js +347 -0
- package/lib/hook-renderer.js +451 -0
- package/lib/inbox.js +391 -0
- package/lib/insights.js +397 -0
- package/lib/issue-adapter.js +156 -0
- package/lib/issue-backend.js +145 -0
- package/lib/issue-render.js +220 -0
- package/lib/issue-sync/authority.js +100 -0
- package/lib/issue-sync/github-pull.js +184 -0
- package/lib/issue-sync/import-primitives.js +98 -0
- package/lib/issue-sync/legacy-link-bridge.js +436 -0
- package/lib/issue-sync/link-store.js +292 -0
- package/lib/issue-sync/project-github.js +123 -0
- package/lib/issue-sync/reconcile.js +195 -0
- package/lib/issue-sync/schema.js +126 -0
- package/lib/kernel/backing-issue.js +305 -0
- package/lib/kernel/broker.js +1218 -0
- package/lib/kernel/cli-broker-factory.js +130 -0
- package/lib/kernel/conflict-signal.js +82 -0
- package/lib/kernel/evaluators.js +195 -0
- package/lib/kernel/fs-class.js +495 -0
- package/lib/kernel/issue-command-contract.js +559 -0
- package/lib/kernel/issue-id-resolver.js +186 -0
- package/lib/kernel/lease-enforcer.js +158 -0
- package/lib/kernel/migrations.js +333 -0
- package/lib/kernel/planning-buckets-schema.js +109 -0
- package/lib/kernel/projection-jsonl-writer.js +450 -0
- package/lib/kernel/readiness-model.js +329 -0
- package/lib/kernel/schema.js +356 -0
- package/lib/kernel/sqlite-driver.js +2504 -0
- package/lib/kernel/taxonomy-validator.js +394 -0
- package/lib/lefthook-check.js +8 -4
- package/lib/lefthook-wiring.js +413 -0
- package/lib/mcp-config-renderer.js +288 -0
- package/lib/memory/graphiti-mcp.js +106 -0
- package/lib/memory/router.js +387 -0
- package/lib/memory/typed-api.js +102 -0
- package/lib/memory-digest.js +195 -0
- package/lib/merge-rules.js +395 -0
- package/lib/migrate-dry-run.js +466 -0
- package/lib/orientation.js +863 -0
- package/lib/package-manager-remediation.js +103 -0
- package/lib/package-root.js +381 -0
- package/lib/patch-intent.js +890 -0
- package/lib/plugin-catalog.js +3 -4
- package/lib/plugin-manager.js +0 -5
- package/lib/pr-bundle.js +186 -0
- package/lib/pr-monitor/differ.js +195 -0
- package/lib/pr-monitor/events.js +0 -0
- package/lib/pr-monitor/gather.js +124 -0
- package/lib/pr-monitor/journal.js +299 -0
- package/lib/pr-monitor/monitor.js +146 -0
- package/lib/pr-monitor/render-sticky.js +157 -0
- package/lib/pr-monitor/watch-lifecycle.js +95 -0
- package/lib/pr-monitor/watch.js +247 -0
- package/lib/pr-pull.js +1273 -0
- package/lib/pr-shepherd.js +494 -0
- package/lib/pr-state-validator.js +59 -0
- package/lib/preflight/gates.js +237 -0
- package/lib/preflight/runner.js +116 -0
- package/lib/project-discovery.js +0 -53
- package/lib/project-memory.js +166 -0
- package/lib/protected-path-manifest.js +281 -0
- package/lib/protected-state-surfaces.js +387 -0
- package/lib/release-readiness.js +2089 -0
- package/lib/reset.js +59 -45
- package/lib/review-adapter.js +68 -0
- package/lib/rules-sync.js +260 -0
- package/lib/runtime-health.js +332 -23
- package/lib/safety-config-renderer.js +268 -0
- package/lib/setup-action-log.js +1 -7
- package/lib/setup.js +27 -65
- package/lib/shell-utils.js +76 -6
- package/lib/skills-sync.js +330 -0
- package/lib/smart-status/conflicts.js +205 -0
- package/lib/smart-status/scoring.js +191 -0
- package/lib/status/beads-snapshot.js +145 -0
- package/lib/status/presenter.js +216 -0
- package/lib/status/snapshot.js +186 -0
- package/lib/sync-backend.js +202 -0
- package/lib/untrusted-content.js +52 -0
- package/lib/upgrade-safety.js +199 -0
- package/lib/workflow/enforce-stage.js +298 -47
- package/lib/workflow/stage-transition.js +115 -0
- package/lib/workflow/stages.js +30 -6
- package/lib/workflow/state-manager.js +159 -14
- package/lib/workflow/state.js +23 -1
- package/lib/workflow-profiles.js +17 -5
- package/package.json +46 -36
- package/rules/documentation.md +19 -0
- package/rules/kernel-tracking.md +26 -0
- package/rules/security.md +22 -0
- package/rules/tdd.md +20 -0
- package/rules/workflow.md +27 -0
- package/scripts/auto-backing-issue.js +47 -0
- package/scripts/beads-context.sh +165 -22
- package/scripts/beads-migrate-to-dolt.sh +7 -0
- package/scripts/beads-upgrade-smoke.sh +284 -0
- package/scripts/behavioral-judge.sh +115 -11
- package/scripts/benchmark.js +349 -63
- package/scripts/bootstrap-windows-tools.sh +78 -0
- package/scripts/branch-protection.js +2 -3
- package/scripts/check-agents.js +34 -137
- package/scripts/commitlint.js +3 -1
- package/scripts/conflict-detect.sh +3 -0
- package/scripts/dep-guard-analyze.js +52 -17
- package/scripts/dep-guard-keyword-ripple.js +29 -0
- package/scripts/dep-guard-render-review.js +86 -0
- package/scripts/dep-guard.sh +64 -232
- package/scripts/file-index.sh +3 -0
- package/scripts/forge-team/lib/claim.sh +34 -18
- package/scripts/forge-team/lib/dashboard.sh +61 -86
- package/scripts/forge-team/lib/epic.sh +99 -263
- package/scripts/forge-team/lib/hooks.sh +26 -28
- package/scripts/forge-team/lib/identity.sh +4 -4
- package/scripts/forge-team/lib/sync-github.sh +144 -47
- package/scripts/forge-team/lib/verify.sh +93 -83
- package/scripts/forge-team/lib/workload.sh +41 -65
- package/scripts/forge-team/tests/claim.test.sh +25 -19
- package/scripts/forge-team/tests/dashboard.test.sh +31 -46
- package/scripts/forge-team/tests/epic.test.sh +52 -71
- package/scripts/forge-team/tests/hooks.test.sh +38 -50
- package/scripts/forge-team/tests/identity.test.sh +3 -3
- package/scripts/forge-team/tests/integration.test.sh +44 -66
- package/scripts/forge-team/tests/sync-github.test.sh +183 -79
- package/scripts/forge-team/tests/verify.test.sh +37 -46
- package/scripts/forge-team/tests/workflow-integration.test.sh +4 -4
- package/scripts/forge-team/tests/workload.test.sh +32 -66
- package/scripts/gen-command-manifest.js +153 -0
- package/scripts/gen-embedded-assets.mjs +129 -0
- package/scripts/install.ps1 +139 -0
- package/scripts/install.sh +268 -0
- package/scripts/lib/beads-migrate-to-dolt.mjs +503 -0
- package/scripts/lib/release-asset.mjs +84 -0
- package/scripts/parity-check.mjs +145 -0
- package/scripts/parity-check.test.mjs +58 -0
- package/scripts/pin-agentic-workflow-images.js +112 -0
- package/scripts/pr-coordinator.sh +3 -0
- package/scripts/preflight-sonar.eslint.config.mjs +44 -0
- package/scripts/preflight.sh +108 -0
- package/scripts/protected-state-check.js +104 -0
- package/scripts/smart-status-score.js +31 -0
- package/scripts/smart-status-sessions.js +51 -0
- package/scripts/smart-status.sh +117 -369
- package/scripts/spikes/config-race-bench.js +111 -0
- package/scripts/spikes/harness-capability-matrix.js +13 -0
- package/scripts/spikes/patch-anchor-stability-bench.js +125 -0
- package/scripts/spikes/protected-path-manifest.js +20 -0
- package/scripts/spikes/skill-auto-invoke-parity.js +292 -0
- package/scripts/sync-agent-skills.js +62 -0
- package/scripts/sync-agentic-workflow.js +48 -0
- package/scripts/sync-utils.sh +3 -0
- package/scripts/test-ci-shard.js +251 -0
- package/scripts/test-dashboard.js +188 -52
- package/scripts/test-full-suite.js +186 -0
- package/scripts/test-profile.js +278 -0
- package/scripts/test.js +302 -28
- package/scripts/validate.js +143 -0
- package/scripts/validate.sh +18 -1
- package/skills/claim-safety/SKILL.md +102 -0
- package/skills/claim-safety/evals/evals.json +46 -0
- package/{.github/prompts/dev.prompt.md → skills/dev/SKILL.md} +46 -52
- package/skills/dev/evals/evals.json +50 -0
- package/skills/hermes-forge/SKILL.md +185 -0
- package/skills/hermes-forge/evals/evals.json +46 -0
- package/skills/issue-basics/SKILL.md +111 -0
- package/skills/issue-basics/evals/evals.json +46 -0
- package/skills/kernel/SKILL.md +166 -0
- package/skills/kernel/evals/evals.json +50 -0
- package/skills/memory/SKILL.md +102 -0
- package/skills/parallel-deep-research/SKILL.md +14 -11
- package/skills/parallel-deep-research/evals/evals.json +11 -27
- package/{.github/prompts/plan.prompt.md → skills/plan/SKILL.md} +134 -159
- package/skills/plan/evals/evals.json +42 -0
- package/skills/research/SKILL.md +195 -0
- package/skills/research/evals/evals.json +42 -0
- package/{.github/prompts/review.prompt.md → skills/review/SKILL.md} +98 -62
- package/skills/review/evals/evals.json +42 -0
- package/skills/rollback/SKILL.md +110 -0
- package/skills/rollback/evals/evals.json +46 -0
- package/skills/rollback/references/methods.md +204 -0
- package/{.cursor/commands/rollback.md → skills/rollback/references/workflow-integration.md} +10 -284
- package/skills/shepherd/SKILL.md +66 -0
- package/skills/shepherd/evals/evals.json +42 -0
- package/skills/ship/SKILL.md +251 -0
- package/skills/ship/evals/evals.json +42 -0
- package/skills/smith/SKILL.md +142 -0
- package/skills/smith/evals/evals.json +46 -0
- package/skills/smith/references/autonomy-and-gates.md +94 -0
- package/{.github/prompts/sonarcloud.prompt.md → skills/sonarcloud/SKILL.md} +14 -3
- package/skills/sonarcloud/evals/evals.json +46 -0
- package/skills/sonarcloud-analysis/SKILL.md +18 -13
- package/skills/sonarcloud-analysis/evals/evals.json +11 -15
- package/skills/status/SKILL.md +102 -0
- package/skills/status/evals/evals.json +50 -0
- package/skills/triage-ready/SKILL.md +121 -0
- package/skills/triage-ready/evals/evals.json +42 -0
- package/{.github/prompts/validate.prompt.md → skills/validate/SKILL.md} +52 -29
- package/skills/validate/evals/evals.json +42 -0
- package/skills/verify/SKILL.md +299 -0
- package/skills/verify/evals/evals.json +50 -0
- package/.claude/commands/dev.md +0 -345
- package/.claude/commands/plan.md +0 -566
- package/.claude/commands/premerge.md +0 -186
- package/.claude/commands/research.md +0 -42
- package/.claude/commands/review.md +0 -451
- package/.claude/commands/rollback.md +0 -721
- package/.claude/commands/ship.md +0 -213
- package/.claude/commands/sonarcloud.md +0 -152
- package/.claude/commands/status.md +0 -90
- package/.claude/commands/validate.md +0 -288
- package/.claude/commands/verify.md +0 -269
- package/.claude/rules/workflow.md +0 -121
- package/.cline/workflows/dev.md +0 -342
- package/.cline/workflows/plan.md +0 -563
- package/.cline/workflows/premerge.md +0 -183
- package/.cline/workflows/research.md +0 -39
- package/.cline/workflows/review.md +0 -448
- package/.cline/workflows/rollback.md +0 -718
- package/.cline/workflows/ship.md +0 -210
- package/.cline/workflows/sonarcloud.md +0 -146
- package/.cline/workflows/status.md +0 -87
- package/.cline/workflows/validate.md +0 -285
- package/.cline/workflows/verify.md +0 -266
- package/.codex/config.toml +0 -11
- package/.codex/skills/dev/SKILL.md +0 -345
- package/.codex/skills/plan/SKILL.md +0 -566
- package/.codex/skills/premerge/SKILL.md +0 -186
- package/.codex/skills/research/SKILL.md +0 -42
- package/.codex/skills/review/SKILL.md +0 -451
- package/.codex/skills/rollback/SKILL.md +0 -721
- package/.codex/skills/ship/SKILL.md +0 -213
- package/.codex/skills/sonarcloud/SKILL.md +0 -149
- package/.codex/skills/status/SKILL.md +0 -90
- package/.codex/skills/validate/SKILL.md +0 -288
- package/.codex/skills/verify/SKILL.md +0 -269
- package/.cursor/commands/dev.md +0 -342
- package/.cursor/commands/plan.md +0 -563
- package/.cursor/commands/premerge.md +0 -183
- package/.cursor/commands/research.md +0 -39
- package/.cursor/commands/review.md +0 -448
- package/.cursor/commands/ship.md +0 -210
- package/.cursor/commands/sonarcloud.md +0 -146
- package/.cursor/commands/status.md +0 -87
- package/.cursor/commands/validate.md +0 -285
- package/.cursor/commands/verify.md +0 -266
- package/.cursorrules +0 -149
- package/.github/prompts/premerge.prompt.md +0 -188
- package/.github/prompts/research.prompt.md +0 -44
- package/.github/prompts/rollback.prompt.md +0 -723
- package/.github/prompts/ship.prompt.md +0 -215
- package/.github/prompts/status.prompt.md +0 -92
- package/.github/prompts/verify.prompt.md +0 -271
- package/.github/workflows/beads-to-github.yml +0 -56
- package/.github/workflows/github-to-beads.yml +0 -97
- package/.kilocode/workflows/dev.md +0 -346
- package/.kilocode/workflows/plan.md +0 -567
- package/.kilocode/workflows/premerge.md +0 -187
- package/.kilocode/workflows/research.md +0 -43
- package/.kilocode/workflows/review.md +0 -452
- package/.kilocode/workflows/rollback.md +0 -722
- package/.kilocode/workflows/ship.md +0 -214
- package/.kilocode/workflows/sonarcloud.md +0 -150
- package/.kilocode/workflows/status.md +0 -91
- package/.kilocode/workflows/validate.md +0 -289
- package/.kilocode/workflows/verify.md +0 -270
- package/.opencode/commands/dev.md +0 -345
- package/.opencode/commands/plan.md +0 -566
- package/.opencode/commands/premerge.md +0 -186
- package/.opencode/commands/research.md +0 -42
- package/.opencode/commands/review.md +0 -451
- package/.opencode/commands/rollback.md +0 -721
- package/.opencode/commands/ship.md +0 -213
- package/.opencode/commands/sonarcloud.md +0 -149
- package/.opencode/commands/status.md +0 -90
- package/.opencode/commands/validate.md +0 -288
- package/.opencode/commands/verify.md +0 -269
- package/.roo/commands/dev.md +0 -346
- package/.roo/commands/plan.md +0 -567
- package/.roo/commands/premerge.md +0 -187
- package/.roo/commands/research.md +0 -43
- package/.roo/commands/review.md +0 -452
- package/.roo/commands/rollback.md +0 -722
- package/.roo/commands/ship.md +0 -214
- package/.roo/commands/sonarcloud.md +0 -150
- package/.roo/commands/status.md +0 -91
- package/.roo/commands/validate.md +0 -289
- package/.roo/commands/verify.md +0 -270
- package/docs/BEADS_GITHUB_SYNC.md +0 -255
- package/docs/GREPTILE_SETUP.md +0 -400
- package/docs/MANUAL_REVIEW_GUIDE.md +0 -106
- package/docs/SETUP.md +0 -663
- package/docs/VALIDATION.md +0 -363
- package/lib/agents/cline.plugin.json +0 -29
- package/lib/agents/copilot.plugin.json +0 -24
- package/lib/agents/kilocode.plugin.json +0 -22
- package/lib/agents/opencode.plugin.json +0 -23
- package/lib/agents/roo.plugin.json +0 -30
- package/lib/beads-health-check.js +0 -143
- package/lib/commands/commands-reset.js +0 -147
- package/opencode.json +0 -67
- package/scripts/beads-context.test.js +0 -567
- package/scripts/github-beads-sync/comment.mjs +0 -64
- package/scripts/github-beads-sync/config.mjs +0 -148
- package/scripts/github-beads-sync/github-api.mjs +0 -131
- package/scripts/github-beads-sync/index.mjs +0 -332
- package/scripts/github-beads-sync/label-mapper.mjs +0 -54
- package/scripts/github-beads-sync/mapping.mjs +0 -78
- package/scripts/github-beads-sync/reverse-sync-cli.mjs +0 -31
- package/scripts/github-beads-sync/reverse-sync.mjs +0 -138
- package/scripts/github-beads-sync/run-bd.mjs +0 -161
- package/scripts/github-beads-sync/sanitize.mjs +0 -121
- package/scripts/github-beads-sync.config.json +0 -26
- package/scripts/sync-commands.js +0 -600
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
# Forge Workflow: Dependency Chain Research
|
|
2
|
+
|
|
3
|
+
> Historical note: this file describes an older setup dependency map. Current user-facing setup guidance lives in [Setup Guide](../guides/SETUP.md) and [Command Reference](COMMANDS.md).
|
|
4
|
+
> Known-stale content may appear below because this file is retained as research context for maintainers, not as current setup authority.
|
|
5
|
+
|
|
6
|
+
**Date**: 2026-02-23
|
|
7
|
+
**Branch**: feat/skills-restructure
|
|
8
|
+
**Objective**: Map every dependency the Forge workflow installs, how it installs them, what their own prerequisites are, and how the user is informed throughout.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. What Forge Installs — Complete Map
|
|
13
|
+
|
|
14
|
+
### Quick Setup Flow (`bunx forge setup --quick`)
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
quickSetup()
|
|
18
|
+
├── checkPrerequisites()
|
|
19
|
+
├── Copy AGENTS.md
|
|
20
|
+
├── setupCoreDocs()
|
|
21
|
+
├── autoInstallLefthook()
|
|
22
|
+
├── autoSetupToolsInQuickMode()
|
|
23
|
+
│ ├── autoSetupBeadsInQuickMode()
|
|
24
|
+
│ ├── initializeOpenSpec() (only if already installed)
|
|
25
|
+
│ └── initializeSkills() (only if already installed)
|
|
26
|
+
├── loadAndSetupClaudeCommands()
|
|
27
|
+
├── setupSelectedAgents()
|
|
28
|
+
├── installGitHooks()
|
|
29
|
+
└── configureDefaultExternalServices()
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Every Tool — Install Method and Command
|
|
33
|
+
|
|
34
|
+
| Tool | Install Method | Command Used | Platform Branch |
|
|
35
|
+
|------|---------------|--------------|-----------------|
|
|
36
|
+
| **Lefthook** | npm/bun devDep | `bun add -d lefthook` | No |
|
|
37
|
+
| **Beads** | npm global | `npm install -g @beads/bd` | ⚠️ No Windows branch |
|
|
38
|
+
| **OpenSpec** | Skip if missing | `openspec init` only if found | No |
|
|
39
|
+
| **Skills** | Skip if missing | `skills init` only if found | No |
|
|
40
|
+
| **Git hooks** | via lefthook | `lefthook install` → hooks from lefthook.yml | No |
|
|
41
|
+
| **Context7 MCP** | npx/bunx at runtime | pin `@upstash/context7-mcp@2` in current examples | Auto for configured agents |
|
|
42
|
+
| **Grep.app MCP** | npx at runtime | `npx -y @ai-tools-all/grep_app_mcp` | Auto for Claude Code, Continue |
|
|
43
|
+
| **Agent config files** | File copy | Copies .claude/, .cursor/, .github/, etc. | Yes (path handling) |
|
|
44
|
+
| **AGENTS.md** | File copy | from package | No |
|
|
45
|
+
| **docs/forge/TOOLCHAIN.md / docs/forge/VALIDATION.md** | File copy | from package | No |
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 2. Dependencies of Each Tool
|
|
50
|
+
|
|
51
|
+
### Beads (`@beads/bd`)
|
|
52
|
+
|
|
53
|
+
- **Language**: Go binary (pre-compiled, ~114MB `.exe` on Windows)
|
|
54
|
+
- **Runtime deps**: None — self-contained binary
|
|
55
|
+
- **Install prerequisites**:
|
|
56
|
+
|
|
57
|
+
| Install Path | Prerequisites | Works on Windows? |
|
|
58
|
+
|-------------|--------------|-------------------|
|
|
59
|
+
| `npm install -g @beads/bd` | npm/bun | ⚠️ Broken — Issue #1031, closed "not planned" |
|
|
60
|
+
| `irm .../install.ps1 \| iex` | PowerShell 5+ | ✅ Recommended on Windows |
|
|
61
|
+
| `curl .../install.sh \| bash` | bash, curl | ❌ Needs Git Bash or WSL |
|
|
62
|
+
| `go install .../bd@latest` | Go 1.24+ | ✅ Works |
|
|
63
|
+
| `brew install beads` | Homebrew | macOS/Linux only |
|
|
64
|
+
|
|
65
|
+
- **Build-from-source deps** (only if no pre-compiled binary):
|
|
66
|
+
- macOS: `icu4c`, `zstd`
|
|
67
|
+
- Linux: `libicu-dev`, `libzstd-dev`
|
|
68
|
+
- Windows: Go 1.24+ (no ICU required — uses pure Go regex backend)
|
|
69
|
+
|
|
70
|
+
- **What `bd init` creates**: `.beads/` directory with `issues.jsonl`, `metadata.json`, `config.yaml`, `README.md`, `.gitignore`
|
|
71
|
+
|
|
72
|
+
- **Critical gap**: forge.js uses `npm install -g @beads/bd` on ALL platforms including Windows, where this is broken. The PowerShell installer (`install.ps1`) is never called.
|
|
73
|
+
|
|
74
|
+
### OpenSpec (`@fission-ai/openspec`)
|
|
75
|
+
|
|
76
|
+
- **Language**: Node.js (pure JS/TS, not a compiled binary)
|
|
77
|
+
- **Runtime**: Node.js ≥ 20.19.0
|
|
78
|
+
- **Own dependencies** (transitive, pulled on install):
|
|
79
|
+
- `@inquirer/core`, `@inquirer/prompts` — CLI prompts
|
|
80
|
+
- `commander` — CLI argument parsing
|
|
81
|
+
- `chalk` — terminal colors
|
|
82
|
+
- `fast-glob` — file pattern matching
|
|
83
|
+
- `ora` — **spinner** (ironically OpenSpec has a spinner, Forge doesn't)
|
|
84
|
+
- `yaml` — YAML parsing
|
|
85
|
+
- `zod` — schema validation
|
|
86
|
+
- `posthog-node` — analytics (sends usage telemetry)
|
|
87
|
+
- **Install prerequisites**: Node.js 20+ only
|
|
88
|
+
- **Works on Windows**: ✅ Yes — pure Node.js
|
|
89
|
+
- **What `openspec init` creates**: `openspec/` directory with proposal templates
|
|
90
|
+
- **Forge behavior**: Only initialized if already installed. Never force-installed. If not on machine, silently skipped.
|
|
91
|
+
|
|
92
|
+
### Lefthook
|
|
93
|
+
|
|
94
|
+
- **Language**: Go binary (same distribution model as Beads)
|
|
95
|
+
- **Runtime deps**: None — zero dependencies
|
|
96
|
+
- **Own npm dependencies**: Uses `optionalDependencies` for platform-specific binaries:
|
|
97
|
+
- `lefthook-darwin-arm64`, `lefthook-darwin-x64`
|
|
98
|
+
- `lefthook-linux-arm64`, `lefthook-linux-x64`
|
|
99
|
+
- `lefthook-win32-x64`, `lefthook-win32-arm64`
|
|
100
|
+
- **Install prerequisites**: npm/bun only (binary bundled in npm package)
|
|
101
|
+
- **Works on Windows**: ✅ Yes — ships Windows binary via npm optionalDependencies
|
|
102
|
+
- **What lefthook installs** (via lefthook.yml): 3 git hooks:
|
|
103
|
+
- `commit-msg`: `bunx commitlint --edit {1}` — enforces conventional commits
|
|
104
|
+
- `pre-commit`: `node .forge/hooks/check-tdd.js` — TDD enforcement
|
|
105
|
+
- `pre-push`: branch protection + ESLint + test suite
|
|
106
|
+
- **Pre-push hooks use bash syntax** (`if [ $? -ne 0 ]`) — ⚠️ breaks on Windows without Git Bash
|
|
107
|
+
- **Transitive from hooks**: `commitlint` pulled via bunx at runtime (not pre-installed)
|
|
108
|
+
|
|
109
|
+
### GitHub CLI (`gh`)
|
|
110
|
+
|
|
111
|
+
- **Not installed by Forge** — must be pre-installed by user
|
|
112
|
+
- **Checked in**: `checkPrerequisites()` — fatal error if missing
|
|
113
|
+
- **Auth status**: checked as warning (not fatal)
|
|
114
|
+
- **Download**: https://cli.github.com
|
|
115
|
+
- **No version requirement specified** in forge.js
|
|
116
|
+
|
|
117
|
+
### MCP Servers (Context7, Grep.app)
|
|
118
|
+
|
|
119
|
+
- **Not pre-installed** — downloaded at runtime when agent first uses them
|
|
120
|
+
- **Mechanism**: current examples pin `@upstash/context7-mcp@2`; older notes used on-demand `@latest`
|
|
121
|
+
- **Prerequisites**: npx (comes with npm) or bunx
|
|
122
|
+
- **Context7 own deps**: Historical note; current examples pin `@upstash/context7-mcp@2`.
|
|
123
|
+
- **Grep.app own deps**: Unknown — no version pinned
|
|
124
|
+
- **Version pinning gap**: Both use `@latest` — breaking changes can silently break research workflow
|
|
125
|
+
- **Auto-configured for**: Claude Code (`.mcp.json`)
|
|
126
|
+
- **Manual setup required for**: Cursor, Cline
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 3. Transitive Dependencies (What Each Tool Pulls In)
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
Forge setup triggers:
|
|
134
|
+
│
|
|
135
|
+
├── npm install -g @beads/bd
|
|
136
|
+
│ └── Pre-compiled Go binary (no transitive npm deps)
|
|
137
|
+
│
|
|
138
|
+
├── bun add -d lefthook
|
|
139
|
+
│ └── lefthook-win32-x64 (or platform binary) via optionalDeps
|
|
140
|
+
│ └── No further deps
|
|
141
|
+
│
|
|
142
|
+
├── lefthook install (from lefthook.yml)
|
|
143
|
+
│ ├── commit-msg hook → bunx commitlint (runtime, not pre-installed)
|
|
144
|
+
│ │ └── @commitlint/cli + @commitlint/config-conventional (in devDeps ✓)
|
|
145
|
+
│ ├── pre-commit hook → node .forge/hooks/check-tdd.js (local file)
|
|
146
|
+
│ └── pre-push hook → bunx eslint (runtime)
|
|
147
|
+
│ └── eslint (in devDeps ✓)
|
|
148
|
+
│
|
|
149
|
+
├── pinned Context7 MCP runtime (at agent runtime)
|
|
150
|
+
│ └── Unknown — @latest, not audited
|
|
151
|
+
│
|
|
152
|
+
└── npx @ai-tools-all/grep_app_mcp (at agent runtime)
|
|
153
|
+
└── Unknown — no version pinned
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**Key finding**: Beads and Lefthook have zero transitive npm dependencies (Go binaries). OpenSpec has ~8 transitive Node.js deps but all are benign utilities. The MCP servers are the unknown — they run as subprocesses with whatever deps they pull.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 4. User-Facing Progress Reporting
|
|
161
|
+
|
|
162
|
+
### What the user currently sees
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
[ASCII Banner]
|
|
166
|
+
Forge v1.6.0
|
|
167
|
+
Quick Setup
|
|
168
|
+
|
|
169
|
+
Checking prerequisites...
|
|
170
|
+
✓ git version 2.x
|
|
171
|
+
✓ gh version 2.x
|
|
172
|
+
✓ node v22.x
|
|
173
|
+
✓ bun v1.x
|
|
174
|
+
|
|
175
|
+
Created: AGENTS.md (universal standard)
|
|
176
|
+
|
|
177
|
+
📦 Installing lefthook for git hooks...
|
|
178
|
+
✓ Lefthook installed
|
|
179
|
+
|
|
180
|
+
📦 Installing Beads globally...
|
|
181
|
+
✓ Beads installed globally
|
|
182
|
+
📦 Initializing Beads...
|
|
183
|
+
✓ Beads initialized
|
|
184
|
+
|
|
185
|
+
[1/1] Setting up Claude Code...
|
|
186
|
+
✓ ...
|
|
187
|
+
|
|
188
|
+
Installing git hooks (TDD enforcement)...
|
|
189
|
+
✓ Lefthook hooks installed (local)
|
|
190
|
+
|
|
191
|
+
==============================================
|
|
192
|
+
Forge v1.6.0 Quick Setup Complete!
|
|
193
|
+
==============================================
|
|
194
|
+
|
|
195
|
+
Next steps:
|
|
196
|
+
1. Start with: /status
|
|
197
|
+
2. Read the current setup and command guides under docs/guides/ and docs/reference/
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### What's MISSING from the UX
|
|
201
|
+
|
|
202
|
+
| Missing Element | Impact |
|
|
203
|
+
|----------------|--------|
|
|
204
|
+
| No spinner/progress bar | User can't tell if it's hung or working |
|
|
205
|
+
| No step counter in quick mode | "Step 3 of 6" would orient the user |
|
|
206
|
+
| No post-install verification | "Beads installed" ≠ `bd version` actually works |
|
|
207
|
+
| Silent skips for OpenSpec/Skills | User doesn't know they weren't installed |
|
|
208
|
+
| No total time estimate | Network-heavy steps (beads download) feel like hangs |
|
|
209
|
+
| No retry feedback | If npm fails, just says "run manually" with no context |
|
|
210
|
+
| No success summary with versions | Should show: `bd 0.49.1 ✓`, `lefthook 1.10.x ✓` |
|
|
211
|
+
|
|
212
|
+
### Interactive mode step counter (exists but only in agent setup)
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
[1/1] Setting up Claude Code... ← This exists for agent files
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
But NOT for the tool installation steps (beads, openspec, lefthook).
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 5. Windows-Specific Gaps
|
|
223
|
+
|
|
224
|
+
### What forge.js does detect on Windows
|
|
225
|
+
- `process.platform === 'win32'` → uses `where.exe` instead of `which`
|
|
226
|
+
- CRLF handling (line 85): `.split(/\r?\n/)` on path resolution
|
|
227
|
+
- chmod skipped with warning (line 2886)
|
|
228
|
+
|
|
229
|
+
### What forge.js does NOT do on Windows
|
|
230
|
+
- Does NOT detect Windows and switch to `install.ps1` for beads
|
|
231
|
+
- Does NOT warn about bash-syntax lefthook hooks
|
|
232
|
+
- Does NOT check for Git Bash or WSL
|
|
233
|
+
- Does NOT offer PowerShell alternative for beads
|
|
234
|
+
|
|
235
|
+
### Windows failure sequence (current behavior)
|
|
236
|
+
```
|
|
237
|
+
1. forge.js runs npm install -g @beads/bd
|
|
238
|
+
2. npm postinstall runs PowerShell Expand-Archive
|
|
239
|
+
3. File locking error (EPERM) — bd.exe never lands
|
|
240
|
+
4. forge.js catches error, prints "Run manually: npm install -g @beads/bd && bd init"
|
|
241
|
+
5. User retries npm install → same EPERM → stuck in loop
|
|
242
|
+
6. pre-push hook runs bash syntax → fails on Windows CMD
|
|
243
|
+
7. User has lefthook installed but hooks don't fire correctly
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Correct Windows flow (not yet implemented)
|
|
247
|
+
```
|
|
248
|
+
1. Detect win32
|
|
249
|
+
2. Run: powershell -Command "irm https://.../install.ps1 | iex"
|
|
250
|
+
3. Verify: bd version
|
|
251
|
+
4. Run: bd init
|
|
252
|
+
5. For lefthook hooks: verify Git Bash is available, or use Node.js equivalents
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## 6. Full Flow — Zero to Working
|
|
258
|
+
|
|
259
|
+
### macOS / Linux
|
|
260
|
+
```bash
|
|
261
|
+
# Prerequisites (manual)
|
|
262
|
+
# - git (https://git-scm.com)
|
|
263
|
+
# - gh (https://cli.github.com) + gh auth login
|
|
264
|
+
# - Node.js 20+ (https://nodejs.org)
|
|
265
|
+
# - bun (https://bun.sh)
|
|
266
|
+
|
|
267
|
+
# Install Forge (triggers postinstall → copies AGENTS.md baseline)
|
|
268
|
+
npx forge-workflow
|
|
269
|
+
# OR add to project:
|
|
270
|
+
bun add -d forge-workflow
|
|
271
|
+
|
|
272
|
+
# Full setup (single command)
|
|
273
|
+
bunx forge setup --quick
|
|
274
|
+
|
|
275
|
+
# Verify
|
|
276
|
+
bd version # should show 0.49.x
|
|
277
|
+
lefthook version # should show 1.10.x
|
|
278
|
+
bd ready # should show open issues
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Windows (correct flow — not what forge currently does)
|
|
282
|
+
```powershell
|
|
283
|
+
# Prerequisites (manual)
|
|
284
|
+
# - Git for Windows (https://git-scm.com) — includes bash
|
|
285
|
+
# - gh CLI (https://cli.github.com) + gh auth login
|
|
286
|
+
# - Node.js 20+ (https://nodejs.org)
|
|
287
|
+
# - bun (https://bun.sh)
|
|
288
|
+
|
|
289
|
+
# Install beads FIRST (before forge setup) — npm is broken on Windows
|
|
290
|
+
irm https://raw.githubusercontent.com/steveyegge/beads/main/install.ps1 | iex
|
|
291
|
+
|
|
292
|
+
# Then install Forge
|
|
293
|
+
npx forge-workflow
|
|
294
|
+
|
|
295
|
+
# Full setup
|
|
296
|
+
bunx forge setup --quick
|
|
297
|
+
|
|
298
|
+
# Verify
|
|
299
|
+
bd version # should work now (was pre-installed)
|
|
300
|
+
lefthook version # should work (ships Windows binary via npm)
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## 7. Key Gaps — Priority Order
|
|
306
|
+
|
|
307
|
+
| Priority | Gap | Fix |
|
|
308
|
+
|----------|-----|-----|
|
|
309
|
+
| P0 | Beads npm install broken on Windows | Detect win32, use install.ps1 |
|
|
310
|
+
| P0 | No post-install verification | Run `bd version` after install, fail loudly if not working |
|
|
311
|
+
| P1 | OpenSpec/Skills silently skipped | Show clear message: "OpenSpec not found — install with: ..." |
|
|
312
|
+
| P1 | lefthook.yml pre-push uses bash syntax | Replace `if [ $? -ne 0 ]` with cross-platform Node.js scripts |
|
|
313
|
+
| P1 | Historical MCP server notes used `@latest` | Current examples pin `@upstash/context7-mcp@2` |
|
|
314
|
+
| P2 | No spinner during installs | Add ora (already a dep of OpenSpec — ironic) |
|
|
315
|
+
| P2 | No step counter in quick mode | "Step 3/6: Installing Beads..." |
|
|
316
|
+
| P2 | No versions in success summary | Show installed versions at end |
|
|
317
|
+
| P3 | Go not mentioned as Windows fallback | Document: if install.ps1 fails → go install |
|
|
318
|
+
| P3 | OpenSpec telemetry (posthog-node) | Document/allow opt-out |
|
|
319
|
+
| P3 | GitHub integration not set up post-install | Add `bd config set github.org/repo` prompt |
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## Sources
|
|
324
|
+
|
|
325
|
+
- [Beads Installation Docs](https://steveyegge.github.io/beads/getting-started/installation)
|
|
326
|
+
- [npm install broken on Windows #1031](https://github.com/steveyegge/beads/issues/1031) — closed "not planned"
|
|
327
|
+
- [OpenSpec GitHub](https://github.com/Fission-AI/OpenSpec)
|
|
328
|
+
- [OpenSpec package.json](https://github.com/Fission-AI/OpenSpec/blob/main/package.json)
|
|
329
|
+
- [Lefthook npm](https://www.npmjs.com/package/lefthook) — 0 dependencies, platform binaries via optionalDeps
|
|
330
|
+
- [Lefthook Installation Docs](https://lefthook.dev/installation/node.html)
|
|
331
|
+
- [Beads install.ps1](https://github.com/steveyegge/beads/blob/main/install.ps1)
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Forge Kernel Issue Command Contract
|
|
2
|
+
|
|
3
|
+
**Status**: Contract slice for Kernel-backed issue commands.
|
|
4
|
+
**Code contract**: `lib/kernel/issue-command-contract.js`.
|
|
5
|
+
**Storage model**: [Forge Kernel storage model](FORGE_KERNEL_STORAGE_MODEL.md).
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
This document defines the stable command contract for the Forge Kernel issue surface before the full Beads execution path is replaced. The command schemas, error envelope, next-command hints, and exit behavior are the contract. Skills and harness files must wrap these CLI commands rather than inventing alternate behavior.
|
|
10
|
+
|
|
11
|
+
This PR does not make every command Kernel-backed at runtime. Verified Beads-compatible passthroughs may remain during migration. Commands without a verified Beads equivalent, such as `forge release <id>`, are contract-defined for the Kernel backend and must not pretend to be supported through Beads.
|
|
12
|
+
|
|
13
|
+
## Commands
|
|
14
|
+
|
|
15
|
+
Read commands must support `--json` and return `next_commands`:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
forge issue ready --json
|
|
19
|
+
forge issue list --json
|
|
20
|
+
forge issue show <id> --json
|
|
21
|
+
forge issue search <query> --json
|
|
22
|
+
forge issue stats --json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Mutation commands must return the affected issue id, the resulting revision, and `next_commands`:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
forge issue create
|
|
29
|
+
forge issue update
|
|
30
|
+
forge issue close
|
|
31
|
+
forge issue comment
|
|
32
|
+
forge issue dep add
|
|
33
|
+
forge issue dep remove
|
|
34
|
+
forge claim <id>
|
|
35
|
+
forge release <id>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The operation names behind those commands are stable:
|
|
39
|
+
|
|
40
|
+
| Command | Operation | Mode |
|
|
41
|
+
| --- | --- | --- |
|
|
42
|
+
| `forge issue ready --json` | `ready` | read |
|
|
43
|
+
| `forge issue list --json` | `list` | read |
|
|
44
|
+
| `forge issue show <id> --json` | `show` | read |
|
|
45
|
+
| `forge issue search <query> --json` | `search` | read |
|
|
46
|
+
| `forge issue stats --json` | `stats` | read |
|
|
47
|
+
| `forge issue create` | `create` | mutation |
|
|
48
|
+
| `forge issue update` | `update` | mutation |
|
|
49
|
+
| `forge issue close` | `close` | mutation |
|
|
50
|
+
| `forge issue comment` | `comment` | mutation |
|
|
51
|
+
| `forge issue dep add` | `dep.add` | mutation |
|
|
52
|
+
| `forge issue dep remove` | `dep.remove` | mutation |
|
|
53
|
+
| `forge claim <id>` | `claim` | mutation |
|
|
54
|
+
| `forge release <id>` | `release` | mutation |
|
|
55
|
+
|
|
56
|
+
## Success Envelopes
|
|
57
|
+
|
|
58
|
+
All successful JSON responses use schema version `forge.issue.v1`.
|
|
59
|
+
|
|
60
|
+
Single-issue reads return:
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"ok": true,
|
|
65
|
+
"schema_version": "forge.issue.v1",
|
|
66
|
+
"command": "forge issue show forge-123 --json",
|
|
67
|
+
"data": {
|
|
68
|
+
"id": "forge-123",
|
|
69
|
+
"title": "Define command contract",
|
|
70
|
+
"type": "task",
|
|
71
|
+
"status": "open",
|
|
72
|
+
"revision": 7
|
|
73
|
+
},
|
|
74
|
+
"next_commands": [
|
|
75
|
+
"forge claim forge-123",
|
|
76
|
+
"forge issue comment forge-123 \"<note>\""
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
List-style reads return `data.issues[]`, optional counts, and `next_commands`. `forge issue stats --json` returns `data.counts` plus ready, blocked, and claim counts when available.
|
|
82
|
+
|
|
83
|
+
Mutations return:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"ok": true,
|
|
88
|
+
"schema_version": "forge.issue.v1",
|
|
89
|
+
"command": "forge claim forge-123",
|
|
90
|
+
"data": {
|
|
91
|
+
"id": "forge-123",
|
|
92
|
+
"revision": 8,
|
|
93
|
+
"projection": {
|
|
94
|
+
"status": "pending",
|
|
95
|
+
"targets": ["beads"]
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"next_commands": [
|
|
99
|
+
"forge issue show forge-123 --json",
|
|
100
|
+
"forge release forge-123"
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Error Envelope
|
|
106
|
+
|
|
107
|
+
All command failures that render JSON use `forge.issue.error.v1`:
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"ok": false,
|
|
112
|
+
"schema_version": "forge.issue.error.v1",
|
|
113
|
+
"command": "forge issue show forge-missing --json",
|
|
114
|
+
"error": {
|
|
115
|
+
"code": "ISSUE_NOT_FOUND",
|
|
116
|
+
"message": "Issue not found: forge-missing",
|
|
117
|
+
"exit_code": 3,
|
|
118
|
+
"retryable": false
|
|
119
|
+
},
|
|
120
|
+
"next_commands": [
|
|
121
|
+
"forge issue search \"forge-missing\" --json"
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
`error.code` is stable for scripts. `error.message` is for humans. `error.details` may be present for structured diagnostics, but consumers must not require it.
|
|
127
|
+
|
|
128
|
+
## Exit Codes
|
|
129
|
+
|
|
130
|
+
| Exit code | Meaning |
|
|
131
|
+
| --- | --- |
|
|
132
|
+
| `0` | Success. |
|
|
133
|
+
| `1` | Internal or unclassified command failure. |
|
|
134
|
+
| `2` | Usage error, invalid flags, or missing required arguments. |
|
|
135
|
+
| `3` | Requested issue, dependency, claim, or comment was not found. |
|
|
136
|
+
| `4` | Revision conflict, claim conflict, or dependency-cycle conflict. |
|
|
137
|
+
| `5` | Required backend, broker, projection target, or local filesystem authority is unavailable. |
|
|
138
|
+
| `6` | Validation failure for command input or payload shape. |
|
|
139
|
+
|
|
140
|
+
## Revision And Idempotency
|
|
141
|
+
|
|
142
|
+
Kernel writes are guarded by `expected_revision` and idempotency at the broker boundary. The CLI owns both:
|
|
143
|
+
|
|
144
|
+
- The CLI derives idempotency metadata from the command, normalized payload, actor/session/worktree context, and retry attempt.
|
|
145
|
+
- The CLI fetches or refreshes the current issue revision before submitting a guarded mutation.
|
|
146
|
+
- Skills must not hand-generate idempotency keys.
|
|
147
|
+
- Skills must not require agents to supply `expected_revision` for normal commands.
|
|
148
|
+
- A later escape hatch may expose an explicit revision flag for advanced repair flows, but that flag is not part of the agent happy path.
|
|
149
|
+
|
|
150
|
+
Successful mutation responses expose the resulting `revision`; they do not require the caller to understand the broker event internals.
|
|
151
|
+
|
|
152
|
+
## Beads Migration Boundary
|
|
153
|
+
|
|
154
|
+
During migration, these verified Beads-compatible passthroughs may remain:
|
|
155
|
+
|
|
156
|
+
- `ready`, `list`, `show`, `search`, and `stats`,
|
|
157
|
+
- `create`, `update`, `close`, and `comment`,
|
|
158
|
+
- `dep.add` and `dep.remove`,
|
|
159
|
+
- legacy `claim` through `bd update --claim` until Kernel claim leases become the default.
|
|
160
|
+
|
|
161
|
+
`release` is Kernel-only in this contract because no verified Beads release operation is documented by the current Beads help surface. Implementing real Kernel execution for `release` belongs to the follow-up broker command PR.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Forge Kernel Schema And Migrations
|
|
2
|
+
|
|
3
|
+
**Status**: 0.0.20 schema slice reference.
|
|
4
|
+
**Storage model**: [Forge Kernel storage model](FORGE_KERNEL_STORAGE_MODEL.md).
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
This document records the contract for the 0.0.20 Forge Kernel schema slice. It is a release reference for the schema registry, local migration plans, and storage-class metadata. It does not define the broker runtime, importer/exporter behavior, or conflict resolver behavior; those remain follow-up PRs.
|
|
9
|
+
|
|
10
|
+
## Schema registry contract
|
|
11
|
+
|
|
12
|
+
`lib/kernel/schema.js` is the source of truth for Kernel table definitions in this slice. The registry must keep table names, fields, primary keys, indexes, storage classes, and field authority metadata together so later broker and adapter work can consume one deterministic definition.
|
|
13
|
+
|
|
14
|
+
The schema registry covers these Kernel surfaces:
|
|
15
|
+
|
|
16
|
+
- issues,
|
|
17
|
+
- dependencies,
|
|
18
|
+
- comments,
|
|
19
|
+
- priority events,
|
|
20
|
+
- claims,
|
|
21
|
+
- sessions,
|
|
22
|
+
- worktrees,
|
|
23
|
+
- stage runs,
|
|
24
|
+
- evidence,
|
|
25
|
+
- projections,
|
|
26
|
+
- conflicts,
|
|
27
|
+
- events,
|
|
28
|
+
- outbox entries,
|
|
29
|
+
- dead letters.
|
|
30
|
+
|
|
31
|
+
Kernel events persist `expected_revision` alongside the idempotency key and payload. Conflict evaluators depend on that revision metadata to distinguish a true equivalent retry from a later intentional write that returns an entity to an earlier payload.
|
|
32
|
+
|
|
33
|
+
Every table and field must declare a storage class and field authority that match [FORGE_KERNEL_STORAGE_MODEL.md](FORGE_KERNEL_STORAGE_MODEL.md). Drift guard failures should name the missing or invalid table or field.
|
|
34
|
+
|
|
35
|
+
## Migration contract
|
|
36
|
+
|
|
37
|
+
`lib/kernel/migrations.js` owns reversible local migration plans for this slice. Migration definitions must:
|
|
38
|
+
|
|
39
|
+
- apply in declared order,
|
|
40
|
+
- roll back in reverse order,
|
|
41
|
+
- reject duplicate migration IDs,
|
|
42
|
+
- produce deterministic SQL,
|
|
43
|
+
- avoid introducing a database runtime dependency.
|
|
44
|
+
|
|
45
|
+
Migration SQL generation should stay small and explicit. Runtime connection management, broker coordination, and remote execution are outside this slice.
|
|
46
|
+
|
|
47
|
+
`expected_revision` on `kernel_events` is added by the additive `002_kernel_events_expected_revision` migration so existing local Kernel databases created by the initial schema migration gain the column during upgrade.
|
|
48
|
+
|
|
49
|
+
## Storage-class contract
|
|
50
|
+
|
|
51
|
+
Storage-class metadata must answer the storage model questions before a table or field lands:
|
|
52
|
+
|
|
53
|
+
- What is authoritative?
|
|
54
|
+
- What is cached?
|
|
55
|
+
- What is projected?
|
|
56
|
+
- What is archived?
|
|
57
|
+
- What remains local-only?
|
|
58
|
+
- What requires server acceptance?
|
|
59
|
+
- What happens when projection fails?
|
|
60
|
+
|
|
61
|
+
The valid classes and authority rules are inherited from [FORGE_KERNEL_STORAGE_MODEL.md](FORGE_KERNEL_STORAGE_MODEL.md). This schema reference links that model so changes to schema, migrations, or storage classification cannot drift into undocumented authority behavior.
|
|
62
|
+
|
|
63
|
+
## Follow-up PRs
|
|
64
|
+
|
|
65
|
+
This document intentionally limits 0.0.20 to schema, migration, and storage-class contracts. Follow-up PRs should cover:
|
|
66
|
+
|
|
67
|
+
- broker read/write execution,
|
|
68
|
+
- Beads import and export adapters,
|
|
69
|
+
- conflict detection and resolution workflows,
|
|
70
|
+
- projection delivery workers,
|
|
71
|
+
- dead-letter repair operations,
|
|
72
|
+
- team-mode server acceptance paths.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Kernel Conflict Evaluators
|
|
2
|
+
|
|
3
|
+
**Status**: 0.0.20 conflict quarantine slice.
|
|
4
|
+
|
|
5
|
+
## Contract
|
|
6
|
+
|
|
7
|
+
Kernel event writes are evaluated before projection. The evaluator can accept a write, return a prior accepted idempotency result, dedupe an equivalent write, or quarantine the write as a conflict.
|
|
8
|
+
|
|
9
|
+
Quarantined writes insert `kernel_conflicts` records and do not enqueue projection outbox entries. This keeps Beads, GitHub, Linear, and other downstream projections from resolving authority conflicts.
|
|
10
|
+
|
|
11
|
+
## Guarded Cases
|
|
12
|
+
|
|
13
|
+
- Stale `expected_revision` values quarantine the write with the actual entity revision.
|
|
14
|
+
- Duplicate idempotency keys return the original accepted event without creating a second event or projection.
|
|
15
|
+
- Equivalent duplicate writes dedupe even when the retry uses a different idempotency key.
|
|
16
|
+
- Dependency writes that would create a dependency cycle quarantine before projection.
|
|
17
|
+
- Fixture cases cover import fidelity, priority ordering, dependency correctness, idempotency, and drift guard violations.
|
|
18
|
+
|
|
19
|
+
## Broker Ordering
|
|
20
|
+
|
|
21
|
+
The local broker remains dependency-free. Drivers provide the storage runtime and the broker enforces this order:
|
|
22
|
+
|
|
23
|
+
1. Load the authority entity revision, prior events, and dependencies.
|
|
24
|
+
2. Evaluate the event.
|
|
25
|
+
3. Insert a conflict for quarantined writes and stop.
|
|
26
|
+
4. Insert accepted events.
|
|
27
|
+
5. Enqueue projection outbox rows only after event acceptance.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# patch.md Format
|
|
2
|
+
|
|
3
|
+
`patch.md` records user patch intent against stable Forge anchors. It is a reviewable markdown file, not an upgrade engine. Later upgrade and rollback work can consume these records to explain conflicts, preserve local edits, or refuse unsafe operations with a clear hint.
|
|
4
|
+
|
|
5
|
+
## Anchor Declaration
|
|
6
|
+
|
|
7
|
+
Managed files declare stable anchors with HTML comments:
|
|
8
|
+
|
|
9
|
+
```md
|
|
10
|
+
<!-- forge-anchor:stage.validate -->
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The anchor ID is the durable identity. File paths can change. When a file is renamed, Forge scans the workspace and resolves the record to the file that still declares the anchor.
|
|
14
|
+
|
|
15
|
+
## Record Block
|
|
16
|
+
|
|
17
|
+
Each patch intent record is a markdown block with YAML metadata and a unified diff:
|
|
18
|
+
|
|
19
|
+
````md
|
|
20
|
+
<!-- forge-patch-intent:v1
|
|
21
|
+
id: patch_stage_validate_8f14e45fceea
|
|
22
|
+
anchorId: stage.validate
|
|
23
|
+
path: .claude/commands/validate.md
|
|
24
|
+
createdAt: 2026-05-13T00:00:00.000Z
|
|
25
|
+
source: git-diff
|
|
26
|
+
status: active
|
|
27
|
+
anchorLine: 3
|
|
28
|
+
baseAnchorHash: sha256:72a7d2a11b2ef199
|
|
29
|
+
-->
|
|
30
|
+
```diff
|
|
31
|
+
diff --git a/.claude/commands/validate.md b/.claude/commands/validate.md
|
|
32
|
+
--- a/.claude/commands/validate.md
|
|
33
|
+
+++ b/.claude/commands/validate.md
|
|
34
|
+
@@ -1,4 +1,4 @@
|
|
35
|
+
# Validate
|
|
36
|
+
<!-- forge-anchor:stage.validate -->
|
|
37
|
+
-Run checks.
|
|
38
|
+
+Run checks carefully.
|
|
39
|
+
```
|
|
40
|
+
<!-- /forge-patch-intent -->
|
|
41
|
+
````
|
|
42
|
+
|
|
43
|
+
Record IDs are deterministic from the anchor ID and diff body. Recording the same diff replaces the same block instead of appending duplicates.
|
|
44
|
+
|
|
45
|
+
## Example 1: Basic Edit
|
|
46
|
+
|
|
47
|
+
1. A managed file declares `<!-- forge-anchor:stage.dev -->`.
|
|
48
|
+
2. The user edits text below that anchor.
|
|
49
|
+
3. `forge patch record --from-diff` writes a record whose `anchorId` is `stage.dev` and whose diff can be reapplied to recreate the edit.
|
|
50
|
+
|
|
51
|
+
## Example 2: Rename
|
|
52
|
+
|
|
53
|
+
If `.claude/commands/validate.md` moves to `.codex/skills/validate/SKILL.md` but keeps `<!-- forge-anchor:stage.validate -->`, Forge resolves the record as `renamed` with `currentPath: .codex/skills/validate/SKILL.md`. Later upgrade code can use that resolved path instead of treating the patch as lost.
|
|
54
|
+
|
|
55
|
+
## Example 3: Orphan
|
|
56
|
+
|
|
57
|
+
If a record references `stage.ship` and no file declares that anchor, `forge patch status` reports it as orphaned. Later upgrade work should refuse to apply that record automatically and tell the user to re-record or restore the anchor.
|
|
58
|
+
|
|
59
|
+
## Config
|
|
60
|
+
|
|
61
|
+
`.forge/config.yaml` may configure patch intent:
|
|
62
|
+
|
|
63
|
+
```yaml
|
|
64
|
+
patchIntent:
|
|
65
|
+
enabled: true
|
|
66
|
+
path: .forge/patch.md
|
|
67
|
+
anchorAliases:
|
|
68
|
+
stage.old-validate: stage.validate
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
- `enabled: false` disables `forge patch record --from-diff`.
|
|
72
|
+
- `path` moves the record file.
|
|
73
|
+
- `anchorAliases` lets renamed anchors resolve without editing historical records.
|
|
74
|
+
|
|
75
|
+
## Later Upgrade and Rollback Safety
|
|
76
|
+
|
|
77
|
+
Upgrade can use patch intent records to decide whether a local edit is anchored, moved, or orphaned before touching managed files. Rollback can use the same metadata to explain which user edits were intentionally preserved. This baseline does not implement upgrade application, rollback snapshots, self-heal, marketplace, or adapter behavior.
|