forge-workflow 0.0.10 → 0.1.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +150 -61
- package/CHANGELOG.md +681 -0
- package/CLAUDE.md +9 -118
- 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 +461 -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/forge/TOOLCHAIN.md +670 -0
- 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/{TOOLCHAIN.md → reference/TOOLCHAIN.md} +62 -47
- 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 +121 -0
- package/lib/beads-sync-scaffold.js +25 -101
- package/lib/codex-skills.js +51 -1
- package/lib/commands/_issue.js +741 -77
- 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 +17 -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 +0 -1
- 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 +838 -972
- 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 +158 -21
- package/lib/commands/sync.js +34 -46
- package/lib/commands/team.js +4 -1
- package/lib/commands/test.js +43 -27
- package/lib/commands/update.js +2 -2
- package/lib/commands/upgrade.js +47 -0
- package/lib/commands/validate.js +43 -18
- package/lib/commands/worktree.js +307 -100
- 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 +2 -2
- package/lib/deprecated-sync-cleanup.js +362 -0
- package/lib/detect-agent.js +2 -28
- package/lib/detect-worktree.js +35 -9
- 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 +382 -11
- 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/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 +3 -2
- 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 +99 -497
- 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 +241 -20
- 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/scoring.js +17 -3
- package/lib/status/beads-snapshot.js +45 -2
- package/lib/status/presenter.js +169 -18
- 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 +296 -47
- package/lib/workflow/stage-transition.js +115 -0
- package/lib/workflow/stages.js +30 -6
- package/lib/workflow/state-manager.js +11 -22
- package/lib/workflow/state.js +23 -1
- package/lib/workflow-profiles.js +17 -5
- package/package.json +37 -35
- 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 +81 -57
- package/scripts/beads-upgrade-smoke.sh +24 -3
- 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.sh +22 -3
- 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 +49 -84
- 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 +50 -83
- 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/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 +21 -94
- package/scripts/protected-state-check.js +104 -0
- package/scripts/smart-status.sh +60 -57
- 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-utils.sh +3 -0
- package/scripts/test-ci-shard.js +13 -6
- package/scripts/test.js +95 -12
- 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} +44 -50
- 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} +132 -157
- 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/{.github/prompts/ship.prompt.md → skills/ship/SKILL.md} +81 -45
- 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/{.github/prompts/status.prompt.md → skills/status/SKILL.md} +20 -10
- 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/verify.prompt.md +0 -271
- package/.github/workflows/beads-to-github.yml +0 -89
- package/.github/workflows/github-to-beads.yml +0 -100
- 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 -281
- 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-bootstrap.js +0 -225
- package/lib/beads-health-check.js +0 -188
- package/lib/commands/commands-reset.js +0 -147
- package/opencode.json +0 -67
- package/scripts/beads-context.test.js +0 -584
- 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 -356
- package/scripts/github-beads-sync/label-mapper.mjs +0 -54
- package/scripts/github-beads-sync/mapping.mjs +0 -132
- package/scripts/github-beads-sync/reverse-sync-cli.mjs +0 -31
- package/scripts/github-beads-sync/reverse-sync.mjs +0 -162
- 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,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.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Release Reference
|
|
2
|
+
|
|
3
|
+
This page documents release readiness. Package publishing still requires the explicit publish step after merge.
|
|
4
|
+
|
|
5
|
+
## v0.0.11 Boundary
|
|
6
|
+
|
|
7
|
+
v0.0.11 is the public documentation and positioning package release. The release branch bumps package metadata to `0.0.11`; publish only after the release PR is merged, tagged, and validated.
|
|
8
|
+
|
|
9
|
+
Keep these release steps explicit:
|
|
10
|
+
|
|
11
|
+
- Release PR with documentation and package metadata
|
|
12
|
+
- GitHub Release
|
|
13
|
+
- npm publish
|
|
14
|
+
- DeepWiki refresh
|
|
15
|
+
|
|
16
|
+
## Pre-Release Validation
|
|
17
|
+
|
|
18
|
+
Run from a clean release branch or worktree:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
git status --short --branch
|
|
22
|
+
bun run check
|
|
23
|
+
npm pack --dry-run
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
For docs-heavy changes, also run a Markdown link check if available. If no docs checker exists and adding one would broaden the PR, create a follow-up issue instead.
|
|
27
|
+
|
|
28
|
+
## Packaging Check
|
|
29
|
+
|
|
30
|
+
`npm pack --dry-run` should show the package contents without publishing. Confirm new canonical docs that should ship are included and generated junk is not.
|
|
31
|
+
|
|
32
|
+
## Release Notes
|
|
33
|
+
|
|
34
|
+
Release notes should include:
|
|
35
|
+
|
|
36
|
+
- user value
|
|
37
|
+
- migration notes
|
|
38
|
+
- feature flags or experimental areas
|
|
39
|
+
- known limitations
|
|
40
|
+
- rollback path
|
|
41
|
+
- adapter compatibility
|
|
42
|
+
- DeepWiki refresh checklist
|
|
43
|
+
|
|
44
|
+
The v0.0.11 release notes live in [CHANGELOG.md](../../CHANGELOG.md).
|
|
45
|
+
|
|
46
|
+
## Rollback
|
|
47
|
+
|
|
48
|
+
For a release PR:
|
|
49
|
+
|
|
50
|
+
1. Revert the PR if the combined package metadata and public docs create release confusion.
|
|
51
|
+
2. Do not publish until README, CHANGELOG, quickstart, package metadata, and support docs agree.
|
|
52
|
+
3. If DeepWiki generated output is wrong, fix repository docs first, then refresh DeepWiki.
|
|
53
|
+
|
|
54
|
+
## Post-Merge DeepWiki Checklist
|
|
55
|
+
|
|
56
|
+
After merge to `master`:
|
|
57
|
+
|
|
58
|
+
1. Refresh DeepWiki for `harshanandak/forge`.
|
|
59
|
+
2. Confirm the generated index date and commit changed to the merged commit.
|
|
60
|
+
3. Compare generated Overview, Getting Started, and Core Concepts against:
|
|
61
|
+
- [README](../../README.md)
|
|
62
|
+
- [Quickstart](../../QUICKSTART.md)
|
|
63
|
+
- [Docs index](../INDEX.md)
|
|
64
|
+
- [Workflow templates](../guides/WORKFLOW_TEMPLATES.md)
|
|
65
|
+
- [Skills and command projections](SKILLS.md)
|
|
66
|
+
- [Command reference](COMMANDS.md)
|
|
67
|
+
4. File a follow-up issue if generated docs still reflect old seven-stage-only framing.
|
|
68
|
+
5. Record evidence in a PR comment or follow-up issue: DeepWiki index date, indexed commit, pages checked, pass/fail result, and any repository-doc corrections needed.
|