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,135 @@
|
|
|
1
|
+
# Forge Kernel Storage Model
|
|
2
|
+
|
|
3
|
+
**Status**: Planning reference for the Forge Kernel authority reset.
|
|
4
|
+
**Canonical design**: [Forge Kernel authority control plane](../work/2026-04-28-skeleton-pivot/forge-kernel-authority-control-plane.md).
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
This document defines where Forge Kernel state lives, what is authoritative, what is cached, what is projected, and what is archived. It exists to prevent future implementation work from drifting back into Beads-first, GitHub-first, or harness-first storage.
|
|
9
|
+
|
|
10
|
+
## Storage Layers
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
Authority
|
|
14
|
+
Local mode: local SQLite WAL broker
|
|
15
|
+
Team mode: Cloudflare Durable Object per project
|
|
16
|
+
|
|
17
|
+
Read model
|
|
18
|
+
Local mode: SQLite query tables
|
|
19
|
+
Team mode: D1 query tables
|
|
20
|
+
|
|
21
|
+
Projection state
|
|
22
|
+
Beads export/import status
|
|
23
|
+
GitHub/Linear projection delivery status
|
|
24
|
+
dead letters and repair state
|
|
25
|
+
|
|
26
|
+
Repository exports
|
|
27
|
+
Explicit Kernel projection snapshots for clone/bootstrap/review only
|
|
28
|
+
Not the durability channel for routine local or team writes
|
|
29
|
+
|
|
30
|
+
Archive
|
|
31
|
+
Local evidence archive
|
|
32
|
+
R2 for server-side large evidence/log/artifact bundles
|
|
33
|
+
|
|
34
|
+
Configuration
|
|
35
|
+
.forge/workflow.yaml
|
|
36
|
+
.forge/providers/*.yaml
|
|
37
|
+
.forge/providers.lock later
|
|
38
|
+
generated harness files as projections only
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Authority Rules
|
|
42
|
+
|
|
43
|
+
1. Forge Kernel owns issue, claim, stage, run, and projection state.
|
|
44
|
+
2. Beads is import/export compatibility only.
|
|
45
|
+
3. GitHub and Linear are server-side projections only.
|
|
46
|
+
4. Harness files are generated projections only.
|
|
47
|
+
5. D1 is a read model, not the claim authority.
|
|
48
|
+
6. Queues retry projection work, not core issue mutations.
|
|
49
|
+
7. R2 stores large evidence and archives, not hot authority fields.
|
|
50
|
+
8. Routine close/verify state is never made durable by committing tracker metadata to the protected default branch.
|
|
51
|
+
9. Repository exports are explicit projection artifacts, not the write-ahead log for normal work.
|
|
52
|
+
|
|
53
|
+
## Local Mode
|
|
54
|
+
|
|
55
|
+
Local mode is for one user working across one or more local worktrees.
|
|
56
|
+
|
|
57
|
+
Local SQLite WAL broker stores:
|
|
58
|
+
|
|
59
|
+
- issue graph,
|
|
60
|
+
- dependencies and blockers,
|
|
61
|
+
- comments,
|
|
62
|
+
- priorities,
|
|
63
|
+
- claims and stale/reclaim state,
|
|
64
|
+
- stages and substages,
|
|
65
|
+
- worktrees,
|
|
66
|
+
- sessions,
|
|
67
|
+
- runs,
|
|
68
|
+
- event log,
|
|
69
|
+
- local outbox,
|
|
70
|
+
- projection/import/export status.
|
|
71
|
+
|
|
72
|
+
Local mode may work without a server. It must still prevent two local worktrees from double-claiming the same issue.
|
|
73
|
+
|
|
74
|
+
Local mode is intentionally local-only. Closing an issue, recording a run, updating a claim, or saving project knowledge in local mode must not require a Git commit or push. If the user wants another machine or teammate to see that state, Forge must use team mode server authority or an explicit export/import operation.
|
|
75
|
+
|
|
76
|
+
### SQLite Runtime Driver
|
|
77
|
+
|
|
78
|
+
Forge Kernel local mode uses a builtin SQLite runtime driver. Driver selection must feature-detect `bun:sqlite` first and backup-capable `node:sqlite` second, and must not add a native-compile SQLite package as the default install path.
|
|
79
|
+
|
|
80
|
+
The selected driver must pass conformance checks for WAL mode, `busy_timeout`, transactions, WAL checkpointing, backup creation, and FTS5 before Forge claims real local SQLite authority behavior.
|
|
81
|
+
|
|
82
|
+
## Team Mode
|
|
83
|
+
|
|
84
|
+
Team mode requires server authority.
|
|
85
|
+
|
|
86
|
+
Cloudflare components:
|
|
87
|
+
|
|
88
|
+
- Worker API validates auth, project membership, and routes requests.
|
|
89
|
+
- Durable Object serializes issue mutations and claims for a project.
|
|
90
|
+
- D1 stores queryable read models for dashboards and reports.
|
|
91
|
+
- Queues run retryable Beads/GitHub/Linear projections.
|
|
92
|
+
- R2 stores optional large evidence, validation artifacts, and archived session bundles.
|
|
93
|
+
|
|
94
|
+
Team mode must block claim/start/close/stage-transition writes when the server cannot accept them.
|
|
95
|
+
|
|
96
|
+
Team mode is the only shared write authority. Cross-machine and multi-user close/verify state must be accepted by the server before Forge reports it as shared truth. Projection workers may update GitHub, Linear, Beads, or explicit export artifacts after acceptance, but projection failure never rolls back the accepted server event.
|
|
97
|
+
|
|
98
|
+
## Local Versus Server Matrix
|
|
99
|
+
|
|
100
|
+
| Data | Local mode | Team mode | Rule |
|
|
101
|
+
| --- | --- | --- | --- |
|
|
102
|
+
| Issue identity/title/body/type | SQLite authority | Durable Object authority + D1 read model | Server acceptance required in team mode. |
|
|
103
|
+
| Priority/order | SQLite authority | Durable Object authority + D1 read model | Deterministic reorder events. |
|
|
104
|
+
| Dependencies/blockers | SQLite authority | Durable Object authority + D1 read model | Ready queue depends on this. |
|
|
105
|
+
| Comments | SQLite authority | Durable Object authority + D1 read model | Sensitive local-only notes allowed only in local mode. |
|
|
106
|
+
| Claims/leases | SQLite authority | Durable Object authority | Team claims are never offline-authoritative. |
|
|
107
|
+
| Worktree path | SQLite full path | Redacted/normalized server record | Avoid leaking full local paths by default. |
|
|
108
|
+
| Session state | SQLite | Durable Object + D1 read model | Required for team visibility. |
|
|
109
|
+
| Stage/substage state | SQLite | Durable Object + D1 read model | Source for gates and workflow progress. |
|
|
110
|
+
| Run events | SQLite | Durable Object + D1 read model | Raw details may be summarized before upload. |
|
|
111
|
+
| Evidence metadata | SQLite | D1 metadata + optional R2 object | Store pointers and hashes. |
|
|
112
|
+
| Raw prompts/tool logs | Local only by default | Optional redacted R2 archive | Never push by default. |
|
|
113
|
+
| Provider manifests | Project files + local cache | Optional server hash/copy | Required providers need revision agreement. |
|
|
114
|
+
| Workflow config | Project files + local cache | Server copy/hash in team mode | Team writes require config revision agreement. |
|
|
115
|
+
| Beads import source | Local archive | Not uploaded by default | Upload only migration summary if needed. |
|
|
116
|
+
| Beads export output | Local projection | Projection status only | Export failure never rolls back Kernel state. |
|
|
117
|
+
| Kernel repository export | Explicit local export | Explicit server export/projection | Repository files are reviewable snapshots, not hot authority. |
|
|
118
|
+
| GitHub/Linear projection | Local status cache | Server outbox/projection table | Server workers own external projection. |
|
|
119
|
+
| Dead letters/conflicts | SQLite | Durable Object/D1 dead-letter state | Must be visible before release readiness. |
|
|
120
|
+
|
|
121
|
+
## Drift Guard
|
|
122
|
+
|
|
123
|
+
Any PR that changes storage, authority, sync, projections, issue commands, workflow configuration, or provider loading must answer:
|
|
124
|
+
|
|
125
|
+
```text
|
|
126
|
+
What is authoritative?
|
|
127
|
+
What is cached?
|
|
128
|
+
What is projected?
|
|
129
|
+
What is archived?
|
|
130
|
+
What remains local-only?
|
|
131
|
+
What requires server acceptance?
|
|
132
|
+
What happens when projection fails?
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
If those answers change, update this document, the authority plan, and locked decisions.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Hermes Integration
|
|
2
|
+
|
|
3
|
+
> Roadmap lane: `forge-2agy.9.7.x` (Hermes adapter)
|
|
4
|
+
|
|
5
|
+
This document defines how the **Hermes** harness integrates with a Forge
|
|
6
|
+
project, and — most importantly — the boundary between **Forge Kernel state**
|
|
7
|
+
(shared, authoritative, cited) and **Hermes-native memory** (private to a Hermes
|
|
8
|
+
session or profile).
|
|
9
|
+
|
|
10
|
+
The consumption contract that Hermes sessions follow lives in
|
|
11
|
+
[skills/hermes-forge/SKILL.md](../../skills/hermes-forge/SKILL.md). The storage
|
|
12
|
+
model Hermes reads against is described in
|
|
13
|
+
[FORGE_KERNEL_STORAGE_MODEL.md](FORGE_KERNEL_STORAGE_MODEL.md), and the
|
|
14
|
+
writeback surface in
|
|
15
|
+
[forge-kernel-issue-command-contract.md](forge-kernel-issue-command-contract.md).
|
|
16
|
+
|
|
17
|
+
## Why a boundary is needed
|
|
18
|
+
|
|
19
|
+
Hermes carries its own conversational/profile memory. Forge carries the
|
|
20
|
+
project's durable, provenance-tracked state. If Hermes were allowed to write its
|
|
21
|
+
private memory into Forge state, the two would drift: Forge would accumulate
|
|
22
|
+
Hermes-specific context that other harnesses (Claude Code, Codex, Cursor) cannot
|
|
23
|
+
interpret, and the "single source of truth" guarantee behind `forge orient` /
|
|
24
|
+
`forge recap` would erode.
|
|
25
|
+
|
|
26
|
+
The integration therefore makes Forge state the authority and Hermes a
|
|
27
|
+
**consumer** that writes back only through the same audited CLI surface it reads
|
|
28
|
+
from.
|
|
29
|
+
|
|
30
|
+
## The two memory tiers
|
|
31
|
+
|
|
32
|
+
| | Forge Kernel state | Hermes-native memory |
|
|
33
|
+
| --- | --- | --- |
|
|
34
|
+
| **Owner** | Forge | Hermes |
|
|
35
|
+
| **Scope** | The project — shared across all harnesses | One Hermes session / profile |
|
|
36
|
+
| **Authority** | Source of truth | Convenience cache, never authoritative |
|
|
37
|
+
| **Read path** | `forge orient` / `forge recap` (bounded, cited JSON) | Hermes' own store |
|
|
38
|
+
| **Write path** | Forge CLI only (`forge comment`, `forge update`) | Hermes' own store |
|
|
39
|
+
| **Contains** | Issues, decisions, evidence, design snapshots, claims, queues | Prompts, session scratch, user preferences, Hermes profile data |
|
|
40
|
+
| **Provenance** | Every fact carries `{ path, source_kind, authority, role }` | Not part of the Forge provenance graph |
|
|
41
|
+
|
|
42
|
+
### What lives in Forge Kernel state
|
|
43
|
+
|
|
44
|
+
Anything that is a **project fact**: issue records, decisions, evidence,
|
|
45
|
+
design-snapshot content, ready queues, and active claims — all written back
|
|
46
|
+
exclusively through Forge CLI commands.
|
|
47
|
+
|
|
48
|
+
Not all of that state is surfaced by the bounded `forge orient` / `forge recap`
|
|
49
|
+
envelope. Today the envelope emits the project design snapshot, active-work
|
|
50
|
+
artifacts (`docs/work`), and — for `forge recap <issue-id>` — an issue summary;
|
|
51
|
+
ready queue and active claims currently appear as forward-looking kernel
|
|
52
|
+
placeholders. Issue **evidence/comments are not in the envelope** — read them
|
|
53
|
+
from the issue record itself (e.g. `forge show <id>`). Treat orient/recap as the
|
|
54
|
+
bounded entry point, not the exhaustive store.
|
|
55
|
+
|
|
56
|
+
### What lives in Hermes-native memory
|
|
57
|
+
|
|
58
|
+
Anything that only matters to **Hermes**: conversational history, session
|
|
59
|
+
scratchpads, per-user preferences, and the Hermes profile itself. None of this
|
|
60
|
+
belongs in Forge Kernel state.
|
|
61
|
+
|
|
62
|
+
## Authority rule
|
|
63
|
+
|
|
64
|
+
Forge Kernel state is the single source of truth. When Hermes needs project
|
|
65
|
+
state it MUST obtain it from `forge orient` / `forge recap` (JSON form) rather
|
|
66
|
+
than reconstructing it from raw files or kernel internals. When two sources
|
|
67
|
+
conflict, prefer the higher `authority` and surface the conflict instead of
|
|
68
|
+
silently choosing.
|
|
69
|
+
|
|
70
|
+
## Writeback rule
|
|
71
|
+
|
|
72
|
+
Evidence and decisions discovered in a Hermes session flow back into the Forge
|
|
73
|
+
Kernel **only** through Forge CLI commands:
|
|
74
|
+
|
|
75
|
+
- `forge comment <id> <body...>` — attach evidence, a decision, or a note to an issue.
|
|
76
|
+
- `forge update <id...> [flags]` — update issue state/fields.
|
|
77
|
+
- `forge create [title] [flags]` — open a follow-up issue.
|
|
78
|
+
|
|
79
|
+
(`forge audit` is verify-only — `forge audit verify` — and is not an
|
|
80
|
+
evidence-append path; record evidence as an issue comment.)
|
|
81
|
+
|
|
82
|
+
These writes land in the Forge Kernel issue store and become part of the issue's
|
|
83
|
+
durable history. Note the read/write asymmetry: the bounded `forge orient` /
|
|
84
|
+
`forge recap` envelope is assembled from project docs, `docs/work` artifacts, and
|
|
85
|
+
the issue summary — it surfaces issue/design/decision state but does **not** echo
|
|
86
|
+
individual issue comments back. Evidence added via `forge comment` lives in the
|
|
87
|
+
issue history (reachable from the issue record), not necessarily in the next
|
|
88
|
+
orient/recap payload.
|
|
89
|
+
|
|
90
|
+
## The no-profile-write guard
|
|
91
|
+
|
|
92
|
+
The hard boundary, enforced as a contract in the `hermes-forge` skill and
|
|
93
|
+
guarded by tests:
|
|
94
|
+
|
|
95
|
+
> **Hermes MUST NOT write Hermes profile state into Forge Kernel state.**
|
|
96
|
+
|
|
97
|
+
Concretely, a Hermes session must never:
|
|
98
|
+
|
|
99
|
+
- Persist Hermes profile or session memory into Forge Kernel storage.
|
|
100
|
+
- Edit Forge state files (design, decision, issue stores) directly to record
|
|
101
|
+
Hermes-side context.
|
|
102
|
+
- Use the Forge issue/evidence backend as a dumping ground for
|
|
103
|
+
Hermes-only data.
|
|
104
|
+
|
|
105
|
+
If a piece of context only matters to Hermes, it stays in Hermes-native memory.
|
|
106
|
+
If it is a project fact, decision, or evidence item, it is written through the
|
|
107
|
+
Forge CLI so it becomes part of the shared, cited source of truth.
|
|
108
|
+
|
|
109
|
+
## Token-budget & truncation expectations
|
|
110
|
+
|
|
111
|
+
`forge orient` and `forge recap <issue-id>` emit the deterministically bounded
|
|
112
|
+
envelope (default ~2000 estimated tokens, `chars_per_token: 4`). Truncation
|
|
113
|
+
follows the published `token_budget.truncation_order`, marks trimmed sections
|
|
114
|
+
with `[truncated deterministically by token budget]`, and sets `truncated: true`.
|
|
115
|
+
Hermes treats truncated sections as incomplete and re-requests with a higher
|
|
116
|
+
`--budget` when completeness matters. (Bare `forge recap` — no issue id —
|
|
117
|
+
returns the legacy activity summary, which is not the bounded envelope.) See the
|
|
118
|
+
skill for the full envelope and provenance model.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Insights And Recap
|
|
2
|
+
|
|
3
|
+
`forge insights` and `forge recap` summarize recurring local workflow evidence from existing Forge and Beads state.
|
|
4
|
+
|
|
5
|
+
## Commands
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
forge insights
|
|
9
|
+
forge insights --review-feedback
|
|
10
|
+
forge insights --min-count 2 --limit 5
|
|
11
|
+
forge insights --json
|
|
12
|
+
forge insights accept <candidate-id> --note "why this is useful"
|
|
13
|
+
forge insights reject <candidate-id> --note "why this is noise"
|
|
14
|
+
forge recap
|
|
15
|
+
forge recap --json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
`--review-feedback` is a compatibility alias. In this MVP it reads Beads interactions and issue evidence; it does not infer external review-provider comments.
|
|
19
|
+
|
|
20
|
+
## Evidence Sources
|
|
21
|
+
|
|
22
|
+
- `.beads/interactions.jsonl`: field changes and review/close outcome reasons.
|
|
23
|
+
- `.beads/issues.jsonl`: tokenized issue titles and descriptions for themes, plus statuses and timestamps for recap context.
|
|
24
|
+
- `.forge/log.jsonl` and `.forge/audit.log`: optional audit event counts when present.
|
|
25
|
+
- Beads-backed typed memory: accept/reject decisions are recorded through `lib/memory/typed-api.js`.
|
|
26
|
+
|
|
27
|
+
## What It Can Infer
|
|
28
|
+
|
|
29
|
+
- Repeated local workflow patterns.
|
|
30
|
+
- Candidate follow-ups based on frequency, source diversity, and evidence count.
|
|
31
|
+
- Recent issue activity and review outcome counts.
|
|
32
|
+
- Whether history is too sparse for a useful suggestion.
|
|
33
|
+
|
|
34
|
+
## What It Cannot Infer
|
|
35
|
+
|
|
36
|
+
- Does not prove a workflow is correct.
|
|
37
|
+
- Reviewer intent is not inferred from provider-specific systems.
|
|
38
|
+
- Trusted executable skills are not installed.
|
|
39
|
+
- It does not modify upgrade safety, lockfile/trust policy, patch intent internals, team dashboards, or issue sync surfaces.
|
|
40
|
+
|
|
41
|
+
## Example Output
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
Forge insights
|
|
45
|
+
Sources: interactions=16, issues=260, audit=0
|
|
46
|
+
Ranked candidates:
|
|
47
|
+
- insight-interaction-status-closed-merged-and-verified (55): status changed to closed (merged-and-verified)
|
|
48
|
+
Next: Review interaction evidence and consider a local workflow skill only if the pattern is still useful.
|
|
49
|
+
Limitations:
|
|
50
|
+
- Insights are local workflow signals, not proof of correctness.
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
Forge recap
|
|
55
|
+
Issues: 260 total, 94 open, 166 closed
|
|
56
|
+
Review outcomes found: 4
|
|
57
|
+
Recent work:
|
|
58
|
+
- forge-besw.12: forge insights --review-feedback PoC (Week 1 deliverable) [open]
|
|
59
|
+
Insight candidates:
|
|
60
|
+
- insight-interaction-status-closed-merged-and-verified: status changed to closed (merged-and-verified)
|
|
61
|
+
Limitations:
|
|
62
|
+
- Sparse Beads interactions or missing Forge audit logs reduce confidence.
|
|
63
|
+
```
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Installing Forge
|
|
2
|
+
|
|
3
|
+
Forge ships two ways to install:
|
|
4
|
+
|
|
5
|
+
1. **Standalone binary** (this page) — a single compiled executable, no Node or
|
|
6
|
+
Bun runtime required. Best for a global CLI you run everywhere.
|
|
7
|
+
2. **npm / npx** — the `forge-workflow` package, if you already live in Node and
|
|
8
|
+
want Forge as a project dev-dependency. See [npm / npx channel](#npm--npx-channel).
|
|
9
|
+
|
|
10
|
+
Both deliver the same Forge. The binary bundles Forge's own JavaScript, but **not**
|
|
11
|
+
its external prerequisites — see [Prerequisites](#prerequisites).
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## One-line install
|
|
16
|
+
|
|
17
|
+
### macOS / Linux
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
curl -fsSL https://raw.githubusercontent.com/harshanandak/forge/master/scripts/install.sh | sh
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Install a specific version:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
curl -fsSL https://raw.githubusercontent.com/harshanandak/forge/master/scripts/install.sh | sh -s -- --version v1.2.3
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
The script detects your OS, CPU architecture and (on Linux) your libc, downloads
|
|
30
|
+
the matching binary from the latest [GitHub Release](https://github.com/harshanandak/forge/releases),
|
|
31
|
+
makes it executable, and installs it to `~/.local/bin/forge`. If that directory
|
|
32
|
+
is not on your `PATH`, the script prints the line to add.
|
|
33
|
+
|
|
34
|
+
### Windows (PowerShell)
|
|
35
|
+
|
|
36
|
+
```powershell
|
|
37
|
+
irm https://raw.githubusercontent.com/harshanandak/forge/master/scripts/install.ps1 | iex
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Install a specific version (download the script, then run it with an argument):
|
|
41
|
+
|
|
42
|
+
```powershell
|
|
43
|
+
$s = irm https://raw.githubusercontent.com/harshanandak/forge/master/scripts/install.ps1
|
|
44
|
+
& ([scriptblock]::Create($s)) -Version v1.2.3
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
This installs `forge.exe` to `%LOCALAPPDATA%\Programs\forge\` and prints how to
|
|
48
|
+
add it to your `PATH`.
|
|
49
|
+
|
|
50
|
+
After installing, run `forge setup` inside a git repository to wire Forge up for
|
|
51
|
+
your agent.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Supported platforms
|
|
56
|
+
|
|
57
|
+
Each GitHub Release publishes these assets. The install scripts pick the right one
|
|
58
|
+
automatically; the table is for manual downloads.
|
|
59
|
+
|
|
60
|
+
| OS | Architecture | libc | Release asset |
|
|
61
|
+
|----|--------------|------|---------------|
|
|
62
|
+
| macOS | Apple Silicon (arm64) | — | `forge-darwin-arm64` |
|
|
63
|
+
| macOS | Intel (x64) | — | `forge-darwin-x64` |
|
|
64
|
+
| Linux | x64 | glibc | `forge-linux-x64` |
|
|
65
|
+
| Linux | arm64 | glibc | `forge-linux-arm64` |
|
|
66
|
+
| Linux | x64 | musl (e.g. Alpine) | `forge-linux-x64-musl` |
|
|
67
|
+
| Linux | arm64 | musl (e.g. Alpine) | `forge-linux-arm64-musl` |
|
|
68
|
+
| Windows | x64 | — | `forge-windows-x64.exe` |
|
|
69
|
+
|
|
70
|
+
On an unsupported platform the install script fails with a clear message. Use the
|
|
71
|
+
[npm / npx channel](#npm--npx-channel) instead.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Manual download and run
|
|
76
|
+
|
|
77
|
+
If you prefer not to pipe a script to your shell, download the asset for your
|
|
78
|
+
platform directly from the [latest release](https://github.com/harshanandak/forge/releases/latest)
|
|
79
|
+
and run it.
|
|
80
|
+
|
|
81
|
+
Every release also publishes a `checksums.txt` (SHA-256) manifest. **Verify the
|
|
82
|
+
asset before you run it** — the one-line install scripts do this automatically.
|
|
83
|
+
|
|
84
|
+
### macOS / Linux
|
|
85
|
+
|
|
86
|
+
```sh
|
|
87
|
+
# Pick the asset for your platform from the table above (here: linux x64 glibc)
|
|
88
|
+
curl -fsSL -o forge \
|
|
89
|
+
https://github.com/harshanandak/forge/releases/latest/download/forge-linux-x64
|
|
90
|
+
|
|
91
|
+
# Verify integrity against the release manifest before running:
|
|
92
|
+
curl -fsSL -o checksums.txt \
|
|
93
|
+
https://github.com/harshanandak/forge/releases/latest/download/checksums.txt
|
|
94
|
+
grep ' forge-linux-x64$' checksums.txt | sha256sum -c - # must print "forge-linux-x64: OK"
|
|
95
|
+
|
|
96
|
+
chmod +x forge
|
|
97
|
+
./forge --version
|
|
98
|
+
# Optionally move it onto your PATH:
|
|
99
|
+
mkdir -p ~/.local/bin && mv forge ~/.local/bin/forge
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
On macOS use `shasum -a 256 -c -` in place of `sha256sum -c -`.
|
|
103
|
+
|
|
104
|
+
### Windows (PowerShell)
|
|
105
|
+
|
|
106
|
+
```powershell
|
|
107
|
+
irm https://github.com/harshanandak/forge/releases/latest/download/forge-windows-x64.exe -OutFile forge.exe
|
|
108
|
+
|
|
109
|
+
# Verify integrity against the release manifest before running:
|
|
110
|
+
irm https://github.com/harshanandak/forge/releases/latest/download/checksums.txt -OutFile checksums.txt
|
|
111
|
+
$expected = ((Get-Content checksums.txt) -match ' \*?forge-windows-x64\.exe$') -replace '\s.*$',''
|
|
112
|
+
if ((Get-FileHash -Algorithm SHA256 forge.exe).Hash -ieq $expected) { "OK" } else { throw "checksum mismatch" }
|
|
113
|
+
|
|
114
|
+
.\forge.exe --version
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
A pinned version uses the same URLs with `download/<tag>/` instead of
|
|
118
|
+
`latest/download/`, e.g.
|
|
119
|
+
`https://github.com/harshanandak/forge/releases/download/v1.2.3/forge-linux-x64`.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## npm / npx channel
|
|
124
|
+
|
|
125
|
+
If you already have Node.js, you can skip the binary entirely:
|
|
126
|
+
|
|
127
|
+
```sh
|
|
128
|
+
# Global install
|
|
129
|
+
npm i -g forge-workflow
|
|
130
|
+
forge --version
|
|
131
|
+
|
|
132
|
+
# Or run once without installing
|
|
133
|
+
npx forge-workflow status
|
|
134
|
+
|
|
135
|
+
# Or as a project dev-dependency (recommended for teams)
|
|
136
|
+
bun add -D forge-workflow # or: npm install --save-dev forge-workflow
|
|
137
|
+
bunx forge setup --agents claude --yes
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
The npm package and the standalone binary are the same Forge and stay in lockstep
|
|
141
|
+
on every release.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Prerequisites
|
|
146
|
+
|
|
147
|
+
The binary bundles Forge's JavaScript, but relies on a few external tools being
|
|
148
|
+
installed and on your `PATH`:
|
|
149
|
+
|
|
150
|
+
- **git** — required for all repository operations.
|
|
151
|
+
- **gh** (GitHub CLI) — required for the PR / review workflow.
|
|
152
|
+
- **Git Bash** (Windows only) — Forge's helper-backed stage flows run under Git
|
|
153
|
+
Bash on Windows.
|
|
154
|
+
|
|
155
|
+
These are runtime prerequisites checked by `forge`'s own health checks; the
|
|
156
|
+
installer does not install them for you.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Uninstall
|
|
161
|
+
|
|
162
|
+
- Binary: delete the installed file (`~/.local/bin/forge`, or
|
|
163
|
+
`%LOCALAPPDATA%\Programs\forge\forge.exe` on Windows).
|
|
164
|
+
- npm: `npm rm -g forge-workflow`.
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Kernel Taxonomy, Readiness, and Validation
|
|
2
|
+
|
|
3
|
+
Reference for the Forge Kernel issue taxonomy collapse and its read-model/validation
|
|
4
|
+
layer, implemented per **D18** (see
|
|
5
|
+
[`docs/work/2026-06-06-kernel-backlog-memory-roadmap/decisions.md`](../work/2026-06-06-kernel-backlog-memory-roadmap/decisions.md))
|
|
6
|
+
and roadmap items `forge-2agy.9.2.1`, `.9.2.2`, `.9.2.6`, `.9.2.7`, `.9.2.8`, `.9.2.9`.
|
|
7
|
+
|
|
8
|
+
The four planning axes are kept **separate** (D5): stored **status**, parent/child
|
|
9
|
+
**hierarchy**, sprint/release planning **bucket**, and workflow **stage** execution. A
|
|
10
|
+
task can be in a sprint, have a parent epic, be derived-ready, and currently sit in the
|
|
11
|
+
`validate` stage — these are not the same field.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1. Issue types (4) — `lib/kernel/taxonomy-validator.js`
|
|
16
|
+
|
|
17
|
+
A type only earns existence if it changes Kernel behavior (routing, gates, board
|
|
18
|
+
grouping, rollup). `feature`, `story`, `chore`, and `spike` are **labels**, not types.
|
|
19
|
+
|
|
20
|
+
| Type | `canParent` | `claimable` | `blocksOthers` | `rollup` | Board group |
|
|
21
|
+
| --- | --- | --- | --- | --- | --- |
|
|
22
|
+
| `epic` | ✅ (only container) | ❌ | ❌ | ✅ | `roadmap` |
|
|
23
|
+
| `task` | ❌ | ✅ | ❌ | ❌ | `backlog` |
|
|
24
|
+
| `bug` | ❌ | ✅ | ❌ | ❌ | `backlog` |
|
|
25
|
+
| `decision` | ❌ | ❌ | ✅ (gates dependents) | ❌ | `decisions` |
|
|
26
|
+
|
|
27
|
+
`TYPE_BEHAVIORS` is the single source of truth for these mappings. Enums are enforced at
|
|
28
|
+
the **validation layer**, not as DB constraints, so label-based extensibility and derived
|
|
29
|
+
readiness stay outside the stored column set.
|
|
30
|
+
|
|
31
|
+
## 2. Status lifecycle (5 stored)
|
|
32
|
+
|
|
33
|
+
Stored statuses: `open`, `in_progress`, `review`, `done`, `cancelled`.
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
open ──► in_progress ──► review ──► done
|
|
37
|
+
▲ │ │
|
|
38
|
+
└───────────┘ │ (rework: review ──► in_progress, in_progress ──► open)
|
|
39
|
+
open / in_progress / review ──► cancelled (done, cancelled are terminal)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`STATUS_TRANSITIONS` encodes the legal moves. `validateStatusTransition(from, to)` throws
|
|
43
|
+
a `TaxonomyValidationError` for illegal moves and unknown statuses; a same-status
|
|
44
|
+
transition is treated as an idempotent no-op. `done` and `cancelled` are terminal — no
|
|
45
|
+
transition leaves them.
|
|
46
|
+
|
|
47
|
+
## 3. Derived readiness — `lib/kernel/readiness-model.js`
|
|
48
|
+
|
|
49
|
+
`ready` and `blocked` are **derived read-model facts, never stored statuses** (D18). A
|
|
50
|
+
blocker that clears makes the issue ready again in whatever stored status it held — there
|
|
51
|
+
is no "preserve previous status" hack. `backlog` is the fallback summary state when an
|
|
52
|
+
issue is neither terminal nor ready/blocked/gated/deferred/claimed/disabled — for example
|
|
53
|
+
`open` with readiness conditions unmet, or a non-workable status such as `review`.
|
|
54
|
+
|
|
55
|
+
`deriveReadiness(issue, context)` returns:
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"id": "forge-1",
|
|
60
|
+
"status": "open",
|
|
61
|
+
"ready": true,
|
|
62
|
+
"blocked": false,
|
|
63
|
+
"blocked_by": [],
|
|
64
|
+
"reasons": [],
|
|
65
|
+
"state": "ready"
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Readiness policy considers: blocking dependencies (upstream not in a terminal status —
|
|
70
|
+
`done` and `cancelled` both clear, so a cancelled blocker never wedges a dependent),
|
|
71
|
+
unresolved decision dependencies, projection **quarantine**/conflicts, required workflow
|
|
72
|
+
**gates**, **defer** windows, **policy-disabled** work, and an **active conflicting
|
|
73
|
+
claim** by another actor. Reason codes (`READINESS_REASONS`): `dependency` (carries a
|
|
74
|
+
`decision: true` flag when the blocker is a decision issue), `quarantine`, `conflict`,
|
|
75
|
+
`gate`, `claimed`, `deferred`, `policy_disabled`.
|
|
76
|
+
|
|
77
|
+
**Acceptance-criteria and due-date readiness** are modeled through the generic `gates`
|
|
78
|
+
input (an acceptance/definition-of-ready gate, or a due-window gate the caller supplies),
|
|
79
|
+
not as separate hardcoded field checks — so the policy stays open to caller-defined gates
|
|
80
|
+
without the read model owning every "definition of ready" rule.
|
|
81
|
+
|
|
82
|
+
Summary `state` (precedence high→low): `closed` → `blocked` → `gated` → `deferred` →
|
|
83
|
+
`claimed` → `disabled` → `ready` → `backlog`. `blocked` (dependencies/quarantine/conflict)
|
|
84
|
+
always outranks softer not-ready reasons. Because the single `state` collapses multiple
|
|
85
|
+
conditions, consumers picking next work should read the full `reasons[]` — e.g. a claim
|
|
86
|
+
hidden behind a defer window is in `reasons[]` even when `state` reports `deferred`.
|
|
87
|
+
Terminal issues are `closed` — neither ready nor blocked.
|
|
88
|
+
|
|
89
|
+
`buildReadinessIndex({ issues, dependencies, claims, conflicts, gates, now, actor,
|
|
90
|
+
policyDisabledIds })` computes readiness for a whole board, resolving each dependency's
|
|
91
|
+
status from the issue set and returning a `readyQueue` ordered by authoritative numeric
|
|
92
|
+
rank then id, plus the `blocked` id list. The ready-work queue excludes terminal,
|
|
93
|
+
deferred, gated, policy-disabled, and claimed-by-other issues.
|
|
94
|
+
|
|
95
|
+
## 4. Validation layer — `lib/kernel/taxonomy-validator.js`
|
|
96
|
+
|
|
97
|
+
| Function | Enforces |
|
|
98
|
+
| --- | --- |
|
|
99
|
+
| `validateIssueTaxonomy(issue)` | type/status enum membership; rejects self-parent |
|
|
100
|
+
| `validateStatusTransition(from, to)` | status lifecycle rules (throws) |
|
|
101
|
+
| `findDependencyCycles(deps)` / `assertAcyclicDependencies(deps)` | dependency graph acyclicity (only `blocks` edges) |
|
|
102
|
+
| `validateParentChild(issue, parent)` | parent exists, parent type `canParent`, no self-parent |
|
|
103
|
+
| `findParentCycle(issuesById, startId)` | parent-chain cycle detection |
|
|
104
|
+
| `validateClaim(claim, { now, issueType })` | actor present, valid claim state, claimable type, lease not expired |
|
|
105
|
+
| `validateActiveClaimUniqueness(claims)` | at most one active claim per issue |
|
|
106
|
+
|
|
107
|
+
These complement (do not replace) the broker/DB claim-lease invariants enforced
|
|
108
|
+
elsewhere; the validation layer is the pure, storage-agnostic checker.
|
|
109
|
+
|
|
110
|
+
## 5. Priority rank vs P0–P4 projection
|
|
111
|
+
|
|
112
|
+
A single numeric rank is authoritative for ordering; **P0–P4 is a display projection
|
|
113
|
+
only** (D18). `rankForPriorityLabel(label)` ingests a label/number to the authoritative
|
|
114
|
+
rank; `priorityLabelForRank(rank)` projects a rank to a display label clamped to `P0..P4`;
|
|
115
|
+
`normalizeRank(value)` coerces to a non-negative integer.
|
|
116
|
+
|
|
117
|
+
## 6. Planning bucket entities — `lib/kernel/planning-buckets-schema.js`
|
|
118
|
+
|
|
119
|
+
Sprint, release, and milestone are first-class Kernel entities (`forge-2agy.9.2.7`), not
|
|
120
|
+
string fields on issues. Each table (`kernel_sprint`, `kernel_release`,
|
|
121
|
+
`kernel_milestone`) carries `id`, `name`, `state`, `rank`, owner/goal, dates,
|
|
122
|
+
`entity_revision`, and **read-model rollup counters** (`total_count`, `completed_count`).
|
|
123
|
+
The schema reuses the shared `lib/kernel/schema.js` builders and passes
|
|
124
|
+
`validateKernelSchema`; `getPlanningBucketsSchema()` is migration-renderable through the
|
|
125
|
+
existing `buildSchemaMigration` renderer.
|
|
126
|
+
|
|
127
|
+
State vocabularies:
|
|
128
|
+
|
|
129
|
+
- Sprint: `planned`, `active`, `completed`, `cancelled`
|
|
130
|
+
- Release: `planned`, `in_progress`, `released`, `cancelled`
|
|
131
|
+
- Milestone: `planned`, `reached`, `missed`, `cancelled`
|
|
132
|
+
|
|
133
|
+
The extended `kernel_issues` columns wire issues to these buckets and to hierarchy and
|
|
134
|
+
stage: `parent_id` (self-referencing), `sprint_id`, `release_id`, `stage_state`,
|
|
135
|
+
`labels`, `acceptance_criteria`, `estimate`.
|
|
136
|
+
|
|
137
|
+
## 7. Board rank and mutation event model
|
|
138
|
+
|
|
139
|
+
Frontend drag/drop and assignment operations must produce Kernel events carrying
|
|
140
|
+
`expected_revision` and `idempotency_key` (`forge-2agy.9.2.6`). `BOARD_MUTATION_EVENT_TYPES`:
|
|
141
|
+
|
|
142
|
+
- `issue.reordered` — board rank change. Per D18 there is a **single** authoritative
|
|
143
|
+
numeric ordering rank (`priority_rank`); P0–P4 is its display projection. There is no
|
|
144
|
+
separate board-only rank column.
|
|
145
|
+
- `issue.status_changed`
|
|
146
|
+
- `issue.sprint_assigned`
|
|
147
|
+
- `issue.release_assigned`
|
|
148
|
+
- `issue.blocked` / `issue.unblocked` — recorded transitions of the derived readiness
|
|
149
|
+
edge, emitted for audit; readiness itself remains computed, not stored
|
|
150
|
+
- `issue.type_changed`
|
|
151
|
+
|
|
152
|
+
Each event is validated optimistically against the entity's current revision and is
|
|
153
|
+
idempotent on replay, consistent with the Kernel event/outbox contract.
|
|
154
|
+
|
|
155
|
+
## Board views (frontend implications)
|
|
156
|
+
|
|
157
|
+
- **Backlog board** — group by `type`, `priority`, `parent_id`, `release_id`.
|
|
158
|
+
- **Sprint board** — group by `sprint_id` and status.
|
|
159
|
+
- **Ready-work queue** — `buildReadinessIndex(...).readyQueue` (derived).
|
|
160
|
+
- **Agent work view** — filter by claim actor, lease, worktree/session, and `stage_state`.
|
|
161
|
+
- **Roadmap view** — group epics by release/milestone with child rollups.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Protected Path Manifest
|
|
2
|
+
|
|
3
|
+
Forge uses `.forge/protected-paths.yaml` as the canonical protected-path contract for the schema and integrity rail.
|
|
4
|
+
|
|
5
|
+
The manifest defines seven W1 categories:
|
|
6
|
+
|
|
7
|
+
- `forge_core`: checksum-verified Forge runtime files.
|
|
8
|
+
- `user_protocol`: user-facing protocol files that should be changed through Forge CLI surfaces.
|
|
9
|
+
- `generated_artifacts`: generated harness files that should come from renderers.
|
|
10
|
+
- `append_only_logs`: audit logs that must not be rewritten.
|
|
11
|
+
- `secrets`: env and secret-bearing files.
|
|
12
|
+
- `beads_state`: Beads state owned by `bd` or Forge issue adapters.
|
|
13
|
+
- `immutable`: VCS/runtime internals owned by their tools.
|
|
14
|
+
|
|
15
|
+
## Harness Enforcement
|
|
16
|
+
|
|
17
|
+
Claude and Codex use native hook contracts for write/edit enforcement. Cursor fallback remains Forge CLI/pre-commit or file-watcher enforcement until a native Cursor hook surface is proven by fixture evidence.
|
|
18
|
+
|
|
19
|
+
## Evidence Command
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
node scripts/spikes/protected-path-manifest.js
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The command emits machine-readable JSON containing the manifest categories, per-harness enforcement mapping, validation result, and known issue for Cursor fallback.
|