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
|
@@ -4,30 +4,19 @@ Complete reference for all tools integrated with the Forge workflow.
|
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
7
|
+
Forge is a local runtime control plane that coordinates several tool surfaces:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
Forge runtime control plane
|
|
11
|
+
- workflow templates and stage skills
|
|
12
|
+
- local project state and protected surfaces
|
|
13
|
+
- kernel-backed issue wrappers and sync (Beads is an opt-out backend)
|
|
14
|
+
- validation, packaging, and release evidence
|
|
15
|
+
- review adapters and external service hooks
|
|
16
|
+
- harness projections for agent-specific commands, prompts, workflows, and skills
|
|
7
17
|
```
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
├─────────────────────────────────────────────────────────────────┤
|
|
11
|
-
│ │
|
|
12
|
-
│ ┌─────────────┐ ┌─────────────────────┐ │
|
|
13
|
-
│ │ BEADS │ │ EXTERNAL SERVICES │ │
|
|
14
|
-
│ │ (bd) │ │ │ │
|
|
15
|
-
│ │ │ │ Parallel AI │ │
|
|
16
|
-
│ │ Git-backed │ │ Greptile │ │
|
|
17
|
-
│ │ Issue │ │ SonarCloud │ │
|
|
18
|
-
│ │ Tracking │ │ GitHub CLI │ │
|
|
19
|
-
│ └─────────────┘ └─────────────────────┘ │
|
|
20
|
-
│ │ │ │
|
|
21
|
-
│ └─────────────────────┘ │
|
|
22
|
-
│ │ │
|
|
23
|
-
│ ┌─────▼─────┐ │
|
|
24
|
-
│ │ FORGE │ │
|
|
25
|
-
│ │ 7-Stage │ │
|
|
26
|
-
│ │ Workflow │ │
|
|
27
|
-
│ └───────────┘ │
|
|
28
|
-
│ │
|
|
29
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
30
|
-
```
|
|
18
|
+
|
|
19
|
+
The default TDD-first workflow is a core template shipped by Forge. It is not the only runtime primitive. Toolchain docs should describe tools by the surface they support: setup, state, workflow stages, validation, review, release, sync, and recovery.
|
|
31
20
|
|
|
32
21
|
---
|
|
33
22
|
|
|
@@ -48,15 +37,17 @@ Windows gotchas:
|
|
|
48
37
|
|
|
49
38
|
---
|
|
50
39
|
|
|
51
|
-
## Beads - Dolt-Backed Issue
|
|
40
|
+
## Beads - Opt-Out Dolt-Backed Issue Backend
|
|
52
41
|
|
|
53
42
|
**Package**: `@beads/bd`
|
|
54
43
|
**Repository**: [github.com/steveyegge/beads](https://github.com/steveyegge/beads)
|
|
55
44
|
**Purpose**: Distributed issue tracking designed for AI coding agents
|
|
56
45
|
|
|
57
|
-
|
|
46
|
+
> Forge issue wrappers use the built-in **kernel** backend by default — no `bd` install or `bd init` is required, and a fresh clone can track issues immediately. Beads is an **opt-out** backend selected (precedence, highest first) with `--issue-backend beads`, `FORGE_ISSUE_BACKEND=beads`, or `issueBackend: beads` in `.forge/config.yaml`. The rest of this section applies only when Beads is selected.
|
|
58
47
|
|
|
59
|
-
|
|
48
|
+
### When Beads Is Selected
|
|
49
|
+
|
|
50
|
+
- Forge targets the stable Beads `v1.0.0` release for Beads-backed setup and CI.
|
|
60
51
|
- Routine team sync still goes through `forge sync`.
|
|
61
52
|
- Use `bd` directly for Beads features Forge does not wrap yet, such as `bd init`, `bd comments`, `bd dep`, `bd blocked`, `bd backup`, and `bd dolt *`.
|
|
62
53
|
|
|
@@ -91,19 +82,22 @@ bd doctor
|
|
|
91
82
|
|
|
92
83
|
### Supported Repo Layout
|
|
93
84
|
|
|
94
|
-
Forge treats `.beads/` as the repo-local Beads home directory.
|
|
85
|
+
Forge treats `.beads/` as the repo-local Beads home directory. `.beads/` is local runtime/export state and is not committed to the repository. `forge setup` writes local Git exclude rules under `.git/info/exclude` so Beads state does not dirty downstream projects.
|
|
86
|
+
|
|
87
|
+
A local initialized checkout may contain:
|
|
95
88
|
|
|
96
89
|
```text
|
|
97
90
|
.beads/
|
|
98
|
-
├── config.yaml
|
|
99
|
-
├── issues.jsonl
|
|
100
|
-
├── metadata.json
|
|
101
|
-
├── team-map.jsonl
|
|
102
|
-
├──
|
|
103
|
-
|
|
91
|
+
├── config.yaml # local Beads config
|
|
92
|
+
├── issues.jsonl # local/exported issue data
|
|
93
|
+
├── metadata.json # local Beads metadata
|
|
94
|
+
├── team-map.jsonl # local/team projection data
|
|
95
|
+
├── backup/ # local backup/export state
|
|
96
|
+
├── hooks/ # local hook shims created by Beads
|
|
97
|
+
└── .gitignore # local ignore guard for runtime files
|
|
104
98
|
```
|
|
105
99
|
|
|
106
|
-
Legacy local database cache files are no longer part of the supported Forge setup instructions. When you need JSONL snapshots for migration verification or CI diffing, generate them explicitly with `bd backup --force`.
|
|
100
|
+
No `.beads/` files are expected to appear in `git ls-files .beads`. Legacy local database cache files are no longer part of the supported Forge setup instructions. When you need JSONL snapshots for migration verification or CI diffing, generate them explicitly with `bd backup --force` and publish them through the intended sync/projection path, not by committing live `.beads/` runtime files.
|
|
107
101
|
|
|
108
102
|
### Migrate Legacy SQLite Data
|
|
109
103
|
|
|
@@ -140,6 +134,26 @@ See the script help for explicit path overrides:
|
|
|
140
134
|
bash scripts/beads-migrate-to-dolt.sh --help
|
|
141
135
|
```
|
|
142
136
|
|
|
137
|
+
### Project Memory
|
|
138
|
+
|
|
139
|
+
Forge project memory is a **kernel-backed** read model. `lib/project-memory.js` persists memories in the per-repo Forge Kernel store (the `kernel_memories` table, via the built-in SQLite driver) — it does **not** call `bd`. No Beads install is required for `forge remember` / `forge recall`.
|
|
140
|
+
|
|
141
|
+
`forge remember` / `forge recall` route through this same `kernel_memories` table (via `lib/memory/router.js`), indexed by **FTS5** for token-AND BM25 recall: a `recall` query does full-text matching, and a no-query `recall` returns the newest notes plus a total count (never a full dump). Because the insights engine also writes `kernel_memories`, what it learns is recallable. Any legacy `.forge/memory/notes.jsonl` is imported once on first use, then retired. The opt-in **`graphiti`** backend is **experimental** — its config/doctor checks ship but the runtime write-through emitter is a fast-follow, so selecting it today still writes the local kernel floor. See [docs/guides/memory-backends.md](../guides/memory-backends.md).
|
|
142
|
+
|
|
143
|
+
Typed memory helpers in `lib/memory/typed-api.js` add category and provenance conventions on top of the same kernel store; they do not create a new datastore. The supported categories are:
|
|
144
|
+
|
|
145
|
+
| Category | Key prefix | Durable backend |
|
|
146
|
+
| --- | --- | --- |
|
|
147
|
+
| decisions | `decisions:` | Kernel memory index for canonical docs/work decisions |
|
|
148
|
+
| episodes | `episodes:` | Kernel-backed memory/audit context |
|
|
149
|
+
| skills | `skills:` | Kernel memory index for skill references |
|
|
150
|
+
| state | `state:` | Forge-owned state references |
|
|
151
|
+
| issues | `issues:` | Issue references (`beadsRefs` may cross-link Beads issues when that backend is selected) |
|
|
152
|
+
| audit | `audit:` | Kernel-backed audit references |
|
|
153
|
+
| preferences | `preferences:` | Kernel memory preferences |
|
|
154
|
+
|
|
155
|
+
Every typed write must include provenance fields: `actor`, `reason`, and `source`.
|
|
156
|
+
|
|
143
157
|
### Post-Upgrade Smoke Verification
|
|
144
158
|
|
|
145
159
|
Run the repo smoke harness after upgrading:
|
|
@@ -224,17 +238,12 @@ Context7 provides current documentation that may be more recent than the AI's tr
|
|
|
224
238
|
"mcpServers": {
|
|
225
239
|
"context7": {
|
|
226
240
|
"command": "bunx",
|
|
227
|
-
"args": ["--bun", "@upstash/context7-mcp@
|
|
241
|
+
"args": ["--bun", "@upstash/context7-mcp@2"]
|
|
228
242
|
}
|
|
229
243
|
}
|
|
230
244
|
}
|
|
231
245
|
```
|
|
232
246
|
|
|
233
|
-
**Cline (VSCode)**:
|
|
234
|
-
1. Open VSCode Settings
|
|
235
|
-
2. Search for "Cline MCP"
|
|
236
|
-
3. Add Context7 server configuration
|
|
237
|
-
|
|
238
247
|
**Cursor**: Check Cursor Settings → MCP Servers for configuration options
|
|
239
248
|
|
|
240
249
|
**Other agents**: If your agent supports MCP, configure using the JSON format above
|
|
@@ -271,7 +280,7 @@ Add to `.mcp.json` in your project root:
|
|
|
271
280
|
"mcpServers": {
|
|
272
281
|
"context7": {
|
|
273
282
|
"command": "bunx",
|
|
274
|
-
"args": ["--bun", "@upstash/context7-mcp@
|
|
283
|
+
"args": ["--bun", "@upstash/context7-mcp@2"]
|
|
275
284
|
},
|
|
276
285
|
"grep-app": {
|
|
277
286
|
"command": "bunx",
|
|
@@ -501,7 +510,7 @@ volumes:
|
|
|
501
510
|
### GitHub CLI - PR Workflow
|
|
502
511
|
|
|
503
512
|
**Installation**: [cli.github.com](https://cli.github.com)
|
|
504
|
-
**Used in**: `/ship
|
|
513
|
+
**Used in**: `/ship` and `/review` stages
|
|
505
514
|
|
|
506
515
|
```bash
|
|
507
516
|
# Install
|
|
@@ -542,13 +551,18 @@ irm https://raw.githubusercontent.com/steveyegge/beads/main/install.ps1 | iex
|
|
|
542
551
|
```
|
|
543
552
|
|
|
544
553
|
> **Why Forge + Beads?** Forge wraps the supported day-to-day issue workflow
|
|
545
|
-
> (`forge ready`, `forge create`, `forge close`, `forge sync`)
|
|
546
|
-
>
|
|
547
|
-
> Dolt-backed sync internals
|
|
554
|
+
> (`forge ready`, `forge create`, `forge close`, `forge sync`). The kernel is the
|
|
555
|
+
> default underlying issue store for these commands; Beads is an opt-out backend
|
|
556
|
+
> for initialization, dependencies, comments, and Dolt-backed sync internals when
|
|
557
|
+
> selected. Backend selection precedence (highest first): the `--issue-backend`
|
|
558
|
+
> flag, then `FORGE_ISSUE_BACKEND`, then `.forge/config.yaml` (`issueBackend`),
|
|
559
|
+
> then the kernel default.
|
|
548
560
|
|
|
549
561
|
---
|
|
550
562
|
|
|
551
|
-
##
|
|
563
|
+
## Default Workflow Template Mapping
|
|
564
|
+
|
|
565
|
+
This table maps tools to the default workflow template. It is not the complete Forge product model and it is not a requirement that every project use every stage.
|
|
552
566
|
|
|
553
567
|
| Stage | Tools Used |
|
|
554
568
|
|-------|------------|
|
|
@@ -559,9 +573,10 @@ irm https://raw.githubusercontent.com/steveyegge/beads/main/install.ps1 | iex
|
|
|
559
573
|
| `/validate` | Type check, lint, tests, SonarCloud |
|
|
560
574
|
| `/ship` | `forge close`, `gh pr create` |
|
|
561
575
|
| `/review` | `gh pr view`, Greptile, SonarCloud |
|
|
562
|
-
| `/premerge` | `forge sync`, doc updates, hand off PR |
|
|
563
576
|
| `/verify` | Documentation cross-check |
|
|
564
577
|
|
|
578
|
+
Pre-merge is not a stage. Its work (`forge sync`, doc updates, hand off PR) runs inside the `/ship` and `/review` stages as an embedded documentation-and-handoff gate.
|
|
579
|
+
|
|
565
580
|
---
|
|
566
581
|
|
|
567
582
|
## Quick Reference Card
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Validation Reference
|
|
2
|
+
|
|
3
|
+
Forge validation is evidence, not a slogan. Record the command, result, and failure text when validation fails.
|
|
4
|
+
|
|
5
|
+
## Project Validation
|
|
6
|
+
|
|
7
|
+
In this repository:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
bun run check
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`bun run check` runs `scripts/validate.js` in this order:
|
|
14
|
+
|
|
15
|
+
1. `bun run typecheck`
|
|
16
|
+
2. `bun run lint`
|
|
17
|
+
3. `bun audit`
|
|
18
|
+
4. `node scripts/test.js --validate`
|
|
19
|
+
|
|
20
|
+
Security audit behavior distinguishes blocking high/critical vulnerabilities from lower-severity warnings.
|
|
21
|
+
|
|
22
|
+
## Supporting Commands
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
bun run typecheck
|
|
26
|
+
bun run lint
|
|
27
|
+
bun test --timeout 15000
|
|
28
|
+
bun run validate:yaml
|
|
29
|
+
npm pack --dry-run
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Use `npm pack --dry-run` for package contents and release-readiness checks. It does not publish.
|
|
33
|
+
|
|
34
|
+
## Agent Stage Validation
|
|
35
|
+
|
|
36
|
+
`/validate` is an agent workflow stage. It may include rebase/freshness checks, local validation, manual security review, and Beads context updates according to the installed stage instructions.
|
|
37
|
+
|
|
38
|
+
Do not confuse:
|
|
39
|
+
|
|
40
|
+
- `/validate` - agent stage workflow
|
|
41
|
+
- `forge-preflight` - prerequisite checker
|
|
42
|
+
- `bun run check` - repository validation script
|
|
43
|
+
|
|
44
|
+
## Work Artifact Paths
|
|
45
|
+
|
|
46
|
+
Current planning and validation evidence should point to:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
docs/work/YYYY-MM-DD-<slug>/
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Legacy `docs/research/` or `docs/plans/` examples are historical unless a specific tool documents a compatibility fallback.
|
|
53
|
+
|
|
54
|
+
## Failure Recovery
|
|
55
|
+
|
|
56
|
+
Fix failures in order:
|
|
57
|
+
|
|
58
|
+
1. Typecheck
|
|
59
|
+
2. Lint
|
|
60
|
+
3. Security audit
|
|
61
|
+
4. Tests
|
|
62
|
+
5. Packaging
|
|
63
|
+
|
|
64
|
+
For each failure:
|
|
65
|
+
|
|
66
|
+
1. Reproduce with the exact command.
|
|
67
|
+
2. Read the first real error.
|
|
68
|
+
3. Fix the root cause.
|
|
69
|
+
4. Rerun the full validation command.
|
|
70
|
+
|
|
71
|
+
Do not proceed to ship with "should pass" or stale output.
|
|
72
|
+
|
|
73
|
+
## Documentation Changes
|
|
74
|
+
|
|
75
|
+
For docs-only changes, still run:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
bun run check
|
|
79
|
+
npm pack --dry-run
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Run a Markdown link check when available. If adding docs tooling would broaden the PR, file follow-up work instead.
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Research: Per-Agent Permissions Configuration
|
|
2
|
+
|
|
3
|
+
> Historical research artifact. Do not treat this page as current setup behavior or current permission defaults. Current user-facing setup guidance lives in [Setup Guide](../guides/SETUP.md), and current skills/command packaging boundaries live in [Skills and command projections](SKILLS.md).
|
|
4
|
+
|
|
5
|
+
**Feature slug**: `agent-permissions`
|
|
6
|
+
**Beads issue**: forge-bo2
|
|
7
|
+
**Date**: 2026-02-24
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Objective
|
|
12
|
+
|
|
13
|
+
Every AI agent supported by Forge has its own permission/auto-approval system for terminal commands and file operations. Currently Forge ships no default permission config for any agent, meaning developers hit approval prompts constantly for safe, routine commands (git status, ls, bun run, bd list, etc.).
|
|
14
|
+
|
|
15
|
+
**Goal**: Ship project-level permission config files for all supported agents so that safe commands auto-run out of the box, while destructive commands still require explicit approval.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Codebase Analysis
|
|
20
|
+
|
|
21
|
+
### What already exists
|
|
22
|
+
|
|
23
|
+
| File | Agent | Status |
|
|
24
|
+
| ---- | ----- | ------ |
|
|
25
|
+
| `AGENTS.md` | Universal | ✅ Exists — workflow instructions only |
|
|
26
|
+
| `docs/SETUP.md` | All agents | ✅ Exists (635 lines) — no permissions section |
|
|
27
|
+
| `lib/agents/*.plugin.json` | 11 agents | ✅ All 11 plugin definitions exist |
|
|
28
|
+
| `.claude/settings.json` | Claude Code | ✅ Exists — project-level permissions present |
|
|
29
|
+
| `opencode.json` | Kilo/OpenCode | ❌ Missing |
|
|
30
|
+
| `.codex/config.toml` | Codex CLI | ❌ Missing |
|
|
31
|
+
| `.cursor/rules/permissions-guidance.mdc` | Cursor | ❌ Missing |
|
|
32
|
+
|
|
33
|
+
### Affected files
|
|
34
|
+
|
|
35
|
+
- `docs/SETUP.md` — add permissions section
|
|
36
|
+
- `opencode.json` — new file at project root
|
|
37
|
+
- `.codex/config.toml` — new file (directory must be created)
|
|
38
|
+
- `.cursor/rules/permissions-guidance.mdc` — new file (directory must be created)
|
|
39
|
+
|
|
40
|
+
### Integration points
|
|
41
|
+
|
|
42
|
+
- `docs/SETUP.md` has per-agent sections — permissions guidance slots naturally into each agent's section
|
|
43
|
+
- `.cursor/rules/` is referenced in `cursor.plugin.json` — adding a `.mdc` file there fits the existing pattern
|
|
44
|
+
- The `forge setup` command will need to be updated separately to copy these files to new projects (separate issue)
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Research Findings
|
|
49
|
+
|
|
50
|
+
### Agent Permission System Comparison
|
|
51
|
+
|
|
52
|
+
#### Claude Code — `.claude/settings.json`
|
|
53
|
+
- **Format**: JSON, `permissions.allow` array
|
|
54
|
+
- **Syntax**: `"Bash(git status:*)"` — command prefix with wildcard
|
|
55
|
+
- **Scope**: Project-level (committed) + global (`~/.claude/settings.json`) + local (gitignored)
|
|
56
|
+
- **Granularity**: Per-tool (Bash, Read, Edit, WebFetch, Skill, Task, MCP)
|
|
57
|
+
- **Evaluation**: First match in allow/deny wins
|
|
58
|
+
- **Status**: Already configured in this project's `.claude/settings.json`
|
|
59
|
+
|
|
60
|
+
#### Kilo Code + OpenCode — `opencode.json` (shared format)
|
|
61
|
+
- **Format**: JSON, `permission` object with nested patterns
|
|
62
|
+
- **Syntax**: `"git status *": "allow"` inside `bash` block
|
|
63
|
+
- **Scope**: Project root (project-level) OR `~/.config/kilo/opencode.json` (global)
|
|
64
|
+
- **Granularity**: bash, edit, external_directory, MCP, browser
|
|
65
|
+
- **Evaluation**: **Last matching rule wins** — put deny rules at the bottom
|
|
66
|
+
- **States**: `"allow"`, `"ask"`, `"deny"`
|
|
67
|
+
- **Sources**: [Kilo Code docs](https://kilo.ai/docs/features/auto-approving-actions), [OpenCode docs](https://opencode.ai/docs/permissions/)
|
|
68
|
+
|
|
69
|
+
#### OpenAI Codex CLI — `.codex/config.toml`
|
|
70
|
+
- **Format**: TOML
|
|
71
|
+
- **Syntax**: `approval_policy = "on-request"` + `sandbox_mode = "workspace-write"`
|
|
72
|
+
- **Scope**: `.codex/config.toml` (project) OR `~/.codex/config.toml` (global)
|
|
73
|
+
- **Granularity**: Policy-level (untrusted/on-request/never) + sandbox restrictions
|
|
74
|
+
- **States**: `untrusted` (approve all), `on-request` (agent decides), `never` (no prompts)
|
|
75
|
+
- **Best default**: `on-request` — agent uses built-in risk model, only asks when uncertain
|
|
76
|
+
- **Also supports**: `--full-auto` flag and `--yolo` (dangerous bypass)
|
|
77
|
+
- **Sources**: [Codex CLI config reference](https://developers.openai.com/codex/config-reference/)
|
|
78
|
+
|
|
79
|
+
#### Cursor — IDE Settings (YOLO Mode)
|
|
80
|
+
- **Format**: UI-only — configured in Cursor Settings > Features > Chat & Composer
|
|
81
|
+
- **Syntax**: `Bash(git status *)` in allow/deny lists (same format as Claude Code)
|
|
82
|
+
- **Scope**: IDE-level, not version-controlled — cannot be shipped as project file
|
|
83
|
+
- **Granularity**: Fine-grained per-command allow/deny lists
|
|
84
|
+
- **Approach for Forge**: Document recommended settings in `.cursor/rules/permissions-guidance.mdc`
|
|
85
|
+
- **Sources**: Cursor Settings UI
|
|
86
|
+
|
|
87
|
+
### Risk-Based Command Classification
|
|
88
|
+
|
|
89
|
+
| Risk Level | Commands | Default action |
|
|
90
|
+
| ---------- | -------- | -------------- |
|
|
91
|
+
| **Safe (read-only)** | git status/log/diff/branch, ls, cat, grep, find, pwd, which, bd list/show/stats | `allow` |
|
|
92
|
+
| **Safe (local write, reversible)** | git add, git commit, git stash, git checkout, bun/npm run, mkdir, touch, cp, mv | `allow` |
|
|
93
|
+
| **Medium (remote-affecting)** | git push, gh pr create, gh issue create | `allow` (intentional dev action) |
|
|
94
|
+
| **Careful (needs attention)** | git reset --hard, git rebase | `ask` |
|
|
95
|
+
| **Dangerous (destructive)** | rm -rf, git push --force, drop database | `deny` |
|
|
96
|
+
|
|
97
|
+
### Key Design Decisions
|
|
98
|
+
|
|
99
|
+
**Decision 1: Include `git push:*` in allow list**
|
|
100
|
+
- Reasoning: Developers push intentionally, constant prompting breaks flow
|
|
101
|
+
- Evidence: Volleyball project already allows it in settings.local.json
|
|
102
|
+
- Alternative: Keep as `ask` (rejected — too much friction for normal PRs)
|
|
103
|
+
|
|
104
|
+
**Decision 2: `on-request` not `never` for Codex CLI**
|
|
105
|
+
- Reasoning: `never` skips ALL prompts including network access and external edits; `on-request` lets the agent's risk model handle edge cases
|
|
106
|
+
- Evidence: Codex docs recommend `on-request` for interactive development
|
|
107
|
+
- Alternative: `never` for power users (can be documented as option)
|
|
108
|
+
|
|
109
|
+
**Decision 3: Documentation-only for Cursor**
|
|
110
|
+
- Reasoning: Cursor permissions are IDE-level settings, not project files — nothing to commit
|
|
111
|
+
- Evidence: No `settings.json`-like project file exists for Cursor
|
|
112
|
+
- Alternative: None — this is a platform limitation
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## TDD Test Scenarios
|
|
117
|
+
|
|
118
|
+
Since these are config files (not code), traditional unit tests don't apply. Verification is manual:
|
|
119
|
+
|
|
120
|
+
1. **opencode.json validity** — JSON parses without errors; `git status` and `bd list` run without prompt in Kilo Code or OpenCode
|
|
121
|
+
2. **.codex/config.toml validity** — TOML parses correctly; Codex CLI reads file at startup
|
|
122
|
+
3. **.cursor/rules/ presence** — File appears in Cursor's Rules panel; content is accurate
|
|
123
|
+
4. **docs/SETUP.md section** — Section is readable, links work, global config snippet is copy-pasteable and correct
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Security Analysis
|
|
128
|
+
|
|
129
|
+
### OWASP Top 10 Relevance
|
|
130
|
+
|
|
131
|
+
| Risk | Relevance | Mitigation |
|
|
132
|
+
| ---- | --------- | ---------- |
|
|
133
|
+
| **A01 Broken Access Control** | Medium — overly broad allow lists could let agents run unintended commands | Explicit deny rules for `rm -rf`, `git push --force`, `git reset --hard` |
|
|
134
|
+
| **A05 Security Misconfiguration** | Medium — shipping overly permissive defaults would be misconfigured | Conservative defaults: `approval_policy = "on-request"` |
|
|
135
|
+
| **A09 Security Logging** | Low — agent commands aren't logged by these configs | Mitigated by git history and Beads tracking |
|
|
136
|
+
|
|
137
|
+
### Agent-Specific Security Notes
|
|
138
|
+
|
|
139
|
+
- **opencode.json**: Deny rules must be at the bottom (last match wins) — putting them first would be ineffective
|
|
140
|
+
- **Codex CLI**: `sandbox_mode = "workspace-write"` prevents file access outside project root — keep this
|
|
141
|
+
- **Never ship**: `--dangerously-bypass-approvals-and-sandbox` (Codex) or global `"*": "allow"` (opencode.json)
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Scope Assessment
|
|
146
|
+
|
|
147
|
+
**Type**: Tactical (config files + docs update, no business logic)
|
|
148
|
+
**Complexity**: Low — all config formats researched, no code changes needed
|
|
149
|
+
**Parallelization**: All 3 config files can be created simultaneously; docs/SETUP.md update is sequential after
|
|
150
|
+
**Estimated files**: 4 new files, 1 modified
|
|
151
|
+
|
|
152
|
+
**Branch**: `feat/agent-permissions`
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Sources
|
|
157
|
+
|
|
158
|
+
- [Kilo Code - Auto-Approving Actions](https://kilo.ai/docs/features/auto-approving-actions)
|
|
159
|
+
- [OpenCode - Permissions](https://opencode.ai/docs/permissions/)
|
|
160
|
+
- [Codex CLI - Config Reference](https://developers.openai.com/codex/config-reference/)
|
|
161
|
+
- Forge project codebase analysis (2026-02-24)
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Next Step
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
/plan agent-permissions
|
|
169
|
+
```
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Beads To Kernel Migration UX
|
|
2
|
+
|
|
3
|
+
**Status**: 0.0.20 migration reference for Forge Kernel authority rollout.
|
|
4
|
+
|
|
5
|
+
**Related work**:
|
|
6
|
+
|
|
7
|
+
- PR A / `forge-2agy.2.1`: Kernel schema, migrations, and storage classifier.
|
|
8
|
+
- PR B / `forge-2agy.2.2`: Local SQLite WAL broker and command API contract.
|
|
9
|
+
- PR C / `forge-2agy.2.3`: Beads import/export adapter and fidelity report.
|
|
10
|
+
- PR D / `forge-2agy.2.4`: Conflict quarantine, idempotency, and evaluator fixtures.
|
|
11
|
+
- PR E / `forge-2agy.2.5`: Documentation and migration UX.
|
|
12
|
+
|
|
13
|
+
## User-Facing Position
|
|
14
|
+
|
|
15
|
+
Forge Kernel is the target issue authority. Beads remains compatibility input/output during the migration window so existing repositories can inspect, import, export, and recover issue state without treating `.beads` files as the new source of truth.
|
|
16
|
+
|
|
17
|
+
The migration UX should make three boundaries visible:
|
|
18
|
+
|
|
19
|
+
1. Import reads Beads state and creates Kernel-shaped records.
|
|
20
|
+
2. Export projects Kernel records back to Beads-compatible JSONL.
|
|
21
|
+
3. Projection failure does not invalidate Kernel authority.
|
|
22
|
+
|
|
23
|
+
## Current Compatibility
|
|
24
|
+
|
|
25
|
+
The Beads compatibility adapter is import/export only. It preserves issue IDs, statuses, priorities, parent-child dependencies, blockers, comments, close reasons, available timestamps, and fidelity counts where the current Beads projection exposes them.
|
|
26
|
+
|
|
27
|
+
Known compatibility gaps are explicit. Kernel schema v1 does not directly preserve every Beads field as first-class issue columns, so unsupported or non-authoritative fields must appear in the fidelity report rather than silently becoming Kernel authority.
|
|
28
|
+
|
|
29
|
+
## Recommended Operator Flow
|
|
30
|
+
|
|
31
|
+
1. Snapshot or back up the current Beads projection before migration.
|
|
32
|
+
2. Run import and review the fidelity report.
|
|
33
|
+
3. Keep export in dry-run mode until record counts, dependency edges, comments, close metadata, and unsupported-field gaps are understood.
|
|
34
|
+
4. If export writes are enabled, capture rollback snapshots for the Beads projection files before writing.
|
|
35
|
+
5. Treat any conflict or stale projection warning as a stop point until the quarantine report is reviewed.
|
|
36
|
+
|
|
37
|
+
## Rollback Boundaries
|
|
38
|
+
|
|
39
|
+
Import rollback is discard-only when import has not committed authoritative Kernel mutations. Discard the imported Kernel-shaped records and keep the original Beads projection unchanged.
|
|
40
|
+
|
|
41
|
+
Export rollback restores the previous Beads-compatible projection files captured before the export write. This rollback affects files such as `issues.jsonl`, `comments.jsonl`, and `dependencies.jsonl`; it does not roll back Kernel authority.
|
|
42
|
+
|
|
43
|
+
After Kernel command routing is active, a committed Kernel mutation must be reversed through a Kernel operation or a documented Kernel migration rollback. Do not use Beads export rollback as an authority rollback.
|
|
44
|
+
|
|
45
|
+
## Conflict Quarantine Boundary
|
|
46
|
+
|
|
47
|
+
Conflict quarantine is defined by the landed evaluator contract in [Kernel Conflict Evaluators](kernel-conflict-evaluators.md). Migration UX should reference that contract for exact quarantine behavior, evaluator evidence, and release-readiness checks.
|
|
48
|
+
|
|
49
|
+
The intended UX boundary is stable:
|
|
50
|
+
|
|
51
|
+
- stale revisions, duplicate writes, dependency cycles, and projection drift are detected before external projection;
|
|
52
|
+
- conflicting records are quarantined instead of projected as normal output;
|
|
53
|
+
- the operator gets enough detail to decide whether to repair source input, retry projection, or wait for a resolver path.
|
|
54
|
+
|
|
55
|
+
## Release Readiness Checklist
|
|
56
|
+
|
|
57
|
+
- Beads import fidelity report reviewed.
|
|
58
|
+
- Export dry-run reviewed before any write.
|
|
59
|
+
- Rollback snapshot path documented for write-enabled export.
|
|
60
|
+
- Projection failure behavior documented as non-authoritative rollback.
|
|
61
|
+
- Conflict quarantine behavior cross-checked against [Kernel Conflict Evaluators](kernel-conflict-evaluators.md).
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Control-plane guarantees — what each control state actually does
|
|
2
|
+
|
|
3
|
+
Status: beta (B6). Issues: `7dc59af2` (controls config + `forge control`),
|
|
4
|
+
`724356ea` (all-surface read + enforcement-locus badges). Epic: `363954dd`.
|
|
5
|
+
|
|
6
|
+
This document is the **contract** the cockpit badges and the `forge control`
|
|
7
|
+
command read from. It states, honestly and per surface, what a control state
|
|
8
|
+
*actually* does today — so the UI never sells enforcement Forge cannot deliver.
|
|
9
|
+
|
|
10
|
+
## Headline — the honest state of enforcement (as of 2026-07-15)
|
|
11
|
+
|
|
12
|
+
**The configurable gate/rail registry is NOT yet consumed by any runtime deny.**
|
|
13
|
+
An adversarial grep of every consumer of the resolved runtime graph found none
|
|
14
|
+
that refuses on `workflow.gates.<id>.enabled`. So setting a gate or rail to
|
|
15
|
+
`mandatory` vs `optional` today changes the **declared registry**, not runtime
|
|
16
|
+
behavior.
|
|
17
|
+
|
|
18
|
+
Real enforcement in Forge today lives **elsewhere, independent of these flags**:
|
|
19
|
+
|
|
20
|
+
- the **B3 lefthook TDD pre-commit hook** (blocks a commit that changes source
|
|
21
|
+
without tests),
|
|
22
|
+
- **B2 fail-closed `validate` / `preflight`** (these fail closed on their own
|
|
23
|
+
logic, *not* on `workflow.gates.<id>.enabled`),
|
|
24
|
+
- **`enforce-stage.js`** (blocks a stage on kernel-recorded stage **order +
|
|
25
|
+
completion**, again independent of these flags).
|
|
26
|
+
|
|
27
|
+
Because of this, **`ENFORCED` is reserved strictly for a wired runtime deny —
|
|
28
|
+
and that set is EMPTY for these flags today.** The badges below never say
|
|
29
|
+
`ENFORCED`; they say what is actually true (`DECLARED`, `DENY-ON-CHECK`,
|
|
30
|
+
`VERIFY (warn-only)`, `PRESENT (advisory)`). Wiring the registry to real
|
|
31
|
+
enforcement points is filed as separate post-beta work.
|
|
32
|
+
|
|
33
|
+
## The two axes
|
|
34
|
+
|
|
35
|
+
- **State** (author intent, written to config): `mandatory` · `optional` · `permission`.
|
|
36
|
+
- **Enforcement-locus** (what actually happens today, and *where*):
|
|
37
|
+
- `registry — declared, not yet enforced` — the flag is stored and reflected in
|
|
38
|
+
the resolved graph, but **no runtime code consumes it to deny**. (stage-exit
|
|
39
|
+
gates, rails)
|
|
40
|
+
- `run-time verify (warn-only, never denies)` — consumed at run time, but only
|
|
41
|
+
**warns**; never overturns the operation. (`gate.issue_verify`)
|
|
42
|
+
- `deny-on-check (no chokepoint yet)` — a real, deny-**capable** primitive
|
|
43
|
+
(`forge gate check`), but **no chokepoint auto-invokes it**, so nothing denies
|
|
44
|
+
on it yet. (human gates)
|
|
45
|
+
- `render-time presence-only` — written into harness config / discovered by
|
|
46
|
+
precedence; nothing denies at run time. **Advisory.** (mcp / rules / skills)
|
|
47
|
+
|
|
48
|
+
## The matrix — state × surface × what it actually does today
|
|
49
|
+
|
|
50
|
+
| Surface | Example ids | Controllable by `forge control`? | State it takes | Enforcement-locus | What it actually does today |
|
|
51
|
+
|---|---|---|---|---|---|
|
|
52
|
+
| **Stage gate** | `gate.plan-exit`, `gate.dev-exit`, `gate.validate-exit`, `gate.ship-entry` | **Yes** | `mandatory` / `optional` | `registry — declared, not yet enforced` | Writes the declared value into the resolved graph. **No runtime consumer reads it** — `enforce-stage.js` blocks on stage order + kernel completion, which is independent of this flag. Setting mandatory/optional changes nothing at run time (yet). Badge: `DECLARED (no runtime consumer yet)`. |
|
|
53
|
+
| **Issue-verify gate** | `gate.issue_verify` | **Yes** | `mandatory` / `optional` | `run-time verify (warn-only, never denies)` | Consumed by `lib/commands/_issue.js`: after a kernel write it re-reads and emits `verified` + `mismatches`, but **warn-only** — a mismatch prints a warning and never overturns the write's `ok`. `optional` skips the read-back. Badge: `VERIFY (warn-only)`. |
|
|
54
|
+
| **Human gate** | `gate.intent`, `gate.plan-approval`, `gate.merge` | **Yes** | `permission` / `optional` | `deny-on-check (no chokepoint yet)` | The `forge gate approve` / `forge gate check` primitives are real and deny-**capable**: with the gate active, `forge gate check <issue> <id>` exits non-zero until a durable `gate.approved` event exists (`lib/gate-events.js`). But **no chokepoint auto-invokes `forge gate check`**, so nothing denies on it unless a skill/CI explicitly calls it. Badge: `DENY-ON-CHECK`. |
|
|
55
|
+
| **L1 rail** | `rail.kernel_tracking` (unlocked); other rails (locked) | **Yes** (unlocked only) | `mandatory` / `optional` | `registry — declared, not yet enforced` | Writes the declared value; the resolved graph reflects it. **No runtime refusal exists** — the flag is read only by `gate.js` id-maps, not by an enforcement chokepoint. Locked rails cannot be lowered. Badge: `DECLARED (no runtime consumer yet)`. |
|
|
56
|
+
| **MCP server** | `mcp.*` | **No — refused** | — | `render-time presence-only` | Rendered into harness MCP config. Presence advises the agent a tool exists; Forge does **not** deny at run time. Not enforceable. Badge: `PRESENT (advisory)`. |
|
|
57
|
+
| **Rule** | `rule.*` (`rules/*.md`) | **No — refused** | — | `render-time presence-only` | Injected as agent guidance. No run-time deny. Advisory. Badge: `PRESENT (advisory)`. |
|
|
58
|
+
| **Skill** | `skill.*` | **No — refused** | — | `render-time presence-only` | Discovered by precedence (`.skills/` > `skills/` > packaged). Presence, not enforcement. Advisory. Badge: `PRESENT (advisory)`. |
|
|
59
|
+
|
|
60
|
+
## How the tri-state maps onto Forge's real config (single source of truth)
|
|
61
|
+
|
|
62
|
+
The one config field `forge control` writes is **`workflow.gates.<id>.enabled`**
|
|
63
|
+
in `.forge/config.yaml` — the field the resolver (`applyEnabledConfig` in
|
|
64
|
+
`lib/core/runtime-graph.js`) consumes into the resolved graph, shared by gates
|
|
65
|
+
and unlocked rails (`gate.*` / `rail.*` namespaces are disjoint). `forge control`
|
|
66
|
+
reuses exactly this field — it does **not** add a parallel `controls:` key,
|
|
67
|
+
because a key nothing reads would be doubly-fake. The tri-state is the
|
|
68
|
+
*vocabulary*; `enabled` is the stored *truth*; state is **derived**, never stored
|
|
69
|
+
twice.
|
|
70
|
+
|
|
71
|
+
**Important:** writing this field changes the **declared registry** the read view
|
|
72
|
+
and `forge options` reflect. It does **not**, today, change what any runtime
|
|
73
|
+
chokepoint does (see the headline). The mapping:
|
|
74
|
+
|
|
75
|
+
| State | Config written | Applies to | Effect today |
|
|
76
|
+
|---|---|---|---|
|
|
77
|
+
| `mandatory` | `workflow.gates.<id>.enabled = true` | stage gates, rails | declared active in the registry; no runtime consumer denies on it |
|
|
78
|
+
| `optional` | `workflow.gates.<id>.enabled = false` | unlocked gates & rails | declared off; for `gate.issue_verify`, actually skips the warn-only read-back |
|
|
79
|
+
| `permission` | `workflow.gates.<id>.enabled = true` | human gates only | keeps the gate active, so `forge gate check` *can* deny if a chokepoint calls it (none does yet) |
|
|
80
|
+
|
|
81
|
+
Read-back derives the label from `(enabled, locked, isHumanGate)`:
|
|
82
|
+
- human gate + enabled → `permission`; human gate + disabled → `optional`.
|
|
83
|
+
- non-human gate/rail + enabled → `mandatory`; + disabled → `optional`.
|
|
84
|
+
- `locked` primitives are always `mandatory` and render a `LOCKED` badge (cannot be lowered).
|
|
85
|
+
|
|
86
|
+
## What `forge control` refuses, and why
|
|
87
|
+
|
|
88
|
+
- **`permission` on a non-human gate or rail** — refused: the approve/check
|
|
89
|
+
primitive only applies to the three human gates; elsewhere `permission` has no
|
|
90
|
+
path at all.
|
|
91
|
+
- **`optional` on a `locked` primitive** — refused: mirrors
|
|
92
|
+
`Cannot disable locked gate` in `forge gate`.
|
|
93
|
+
- **Any `mcp.*` / `rule.*` / `skill.*` id** — refused with:
|
|
94
|
+
*"<id> is presence-only, not enforceable — Forge has no run-time deny for this
|
|
95
|
+
surface. See docs/reference/control-plane-guarantees.md."* These are read-only
|
|
96
|
+
in the cockpit; their badge is `PRESENT (advisory)`.
|
|
97
|
+
|
|
98
|
+
## Badge vocabulary (what the read view / dashboard renders)
|
|
99
|
+
|
|
100
|
+
Driven entirely by the honest enforcement-locus above — never by author intent:
|
|
101
|
+
|
|
102
|
+
- `DECLARED (no runtime consumer yet)` — `registry — declared, not yet enforced`
|
|
103
|
+
(stage-exit gates, rails).
|
|
104
|
+
- `VERIFY (warn-only)` — `run-time verify (warn-only, never denies)`
|
|
105
|
+
(`gate.issue_verify`).
|
|
106
|
+
- `DENY-ON-CHECK` — `deny-on-check (no chokepoint yet)` (human gates).
|
|
107
|
+
- `OFF (optional)` — a controllable flag set to `optional`.
|
|
108
|
+
- `PRESENT (advisory)` — `render-time presence-only` (mcp/rules/skills).
|
|
109
|
+
- `· LOCKED` — appended to a locked primitive that cannot be lowered.
|
|
110
|
+
- `ENFORCED (...)` — **reserved for a wired runtime deny; emitted by NOTHING
|
|
111
|
+
today** (the set is empty until the registry is wired to enforcement points).
|
|
112
|
+
|
|
113
|
+
A surface's badge reflects **where and whether** it is actually consumed, so the
|
|
114
|
+
UI can never imply enforcement it lacks.
|
|
115
|
+
|
|
116
|
+
## Deferred (out of B6 scope, filed separately)
|
|
117
|
+
|
|
118
|
+
- **Wire the configurable gates/rails to real enforcement points** — the bigger
|
|
119
|
+
work that would let a `mandatory` gate/rail actually deny at run time. Filed as
|
|
120
|
+
separate post-beta work; B6 deliberately does *not* attempt it. B6's deliverable
|
|
121
|
+
is the honest vocabulary + matrix, not new enforcement.
|
|
122
|
+
- **Control for advisory surfaces** (mcp/rules/skills) — no run-time deny path
|
|
123
|
+
exists; they stay read-only + `PRESENT (advisory)`.
|
|
124
|
+
- **Live/SSE updates** — a separate stubbed issue; the read view is a
|
|
125
|
+
point-in-time snapshot.
|