@moretea-labs/forge 1.5.1 → 1.7.0
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/AGENTS.md +2 -0
- package/CHANGELOG.md +46 -0
- package/CLAUDE.md +2 -0
- package/DESIGN.md +7 -2
- package/README.md +4 -4
- package/README.zh-CN.md +2 -2
- package/SKILL.md +2 -2
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/agents/openai.yaml +1 -1
- package/assets/hooks/hook-input.sh +11 -8
- package/assets/hooks/lib/session-state.sh +10 -7
- package/assets/hooks/lib/workflow-state.sh +13 -177
- package/assets/hooks/post-tool-observer.sh +8 -2
- package/assets/hooks/pre-edit-guard.sh +8 -39
- package/assets/hooks/prompt-guard.sh +7 -83
- package/assets/hooks/session-start-context.sh +56 -1
- package/assets/partials/05-workflow.partial.md +1 -1
- package/assets/partials-agents/03-orchestration.partial.md +1 -1
- package/assets/plugin-registry.v1.json +54 -3
- package/assets/reference-configs/document-generation.md +1 -1
- package/assets/reference-configs/harness-overview.md +1 -1
- package/assets/reference-configs/hook-operations.md +1 -1
- package/assets/reference-configs/sprint-contracts.md +3 -3
- package/assets/skill-version.json +2 -2
- package/assets/templates/contract.template.md +2 -7
- package/assets/templates/helpers/capture-plan.sh +2 -2
- package/assets/templates/helpers/check-task-workflow.sh +4 -4
- package/assets/templates/helpers/contract-worktree.sh +1 -21
- package/assets/templates/helpers/ensure-task-workflow.sh +13 -38
- package/assets/templates/helpers/migrate-project-template.sh +22 -45
- package/assets/templates/helpers/new-plan.sh +1 -1
- package/assets/templates/helpers/plan-to-todo.sh +12 -37
- package/assets/templates/helpers/ship-worktrees.sh +2 -29
- package/assets/templates/helpers/sprint-backlog.sh +6 -6
- package/assets/templates/helpers/verify-contract.sh +1 -111
- package/assets/templates/helpers/verify-sprint.sh +3 -180
- package/assets/templates/plan.template.md +1 -1
- package/assets/templates/review.template.md +9 -34
- package/assets/workflow-contract.v1.json +10 -19
- package/docs/README.md +10 -10
- package/docs/architecture/CURRENT.md +170 -0
- package/docs/architecture/EVOLUTION.md +42 -0
- package/docs/architecture/current/README.md +4 -156
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
- package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
- package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
- package/docs/architecture/history/README.md +7 -0
- package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
- package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
- package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
- package/docs/architecture/history.md +3 -34
- package/docs/architecture/index.md +15 -98
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
- package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
- package/docs/architecture/versions/1.6.md +38 -0
- package/docs/architecture/versions/1.7.md +41 -0
- package/docs/forge-chatgpt-browser-engine.md +2 -2
- package/docs/forge-chatgpt-mcp-setup.md +4 -28
- package/docs/forge-chatgpt-supervised-automation.md +3 -3
- package/docs/forge-github-issue-launcher.md +1 -1
- package/docs/forge-runtime-self-healing-loop.md +1 -1
- package/docs/operations/controller-browser-plugin.md +38 -22
- package/docs/operations/controller-performance-and-502.md +124 -0
- package/docs/operations/controller-reliability-runbook.md +1 -1
- package/docs/operations/features.md +3 -3
- package/docs/operations/github-repository.md +1 -1
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +5 -3
- package/docs/tutorials/01-install-and-start.md +1 -1
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/wiki/Architecture.md +6 -6
- package/docs/wiki/Implementation.md +2 -2
- package/docs/wiki/Installation.md +1 -1
- package/docs/wiki/Integrations.md +2 -2
- package/docs/wiki/Quick-Start.md +1 -1
- package/docs/wiki/Work-Lifecycle.md +1 -1
- package/package.json +29 -10
- package/scripts/activate-source-baseline.ts +17 -13
- package/scripts/benchmark-background-check-overlap.ts +228 -0
- package/scripts/benchmark-mcp-host.sh +117 -0
- package/scripts/benchmark-mcp-transport.ts +170 -0
- package/scripts/benchmark-quality-harness.ts +146 -0
- package/scripts/benchmark-route-session-concurrency.ts +207 -6
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
- package/scripts/benchmark-typescript-navigation.ts +186 -0
- package/scripts/benchmark-work-efficiency.ts +334 -0
- package/scripts/capture-plan.sh +3 -3
- package/scripts/check-agent-tooling.sh +8 -35
- package/scripts/check-architecture-sync.sh +17 -86
- package/scripts/check-mcp-compatibility.ts +14 -0
- package/scripts/check-public-docs.sh +14 -1
- package/scripts/check-runtime-architecture.mjs +107 -64
- package/scripts/check-stable-baseline.ts +92 -0
- package/scripts/check-task-workflow.sh +4 -4
- package/scripts/contract-worktree.sh +1 -21
- package/scripts/ensure-task-workflow.sh +22 -55
- package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
- package/scripts/install-standalone-recovery.ts +24 -0
- package/scripts/lib/project-init-lib.sh +15 -44
- package/scripts/migrate-chatgpt-automation-schedules.ts +64 -0
- package/scripts/migrate-project-template.sh +23 -1179
- package/scripts/new-plan.sh +1 -1
- package/scripts/plan-to-todo.sh +11 -36
- package/scripts/run-governed-gate.ts +2 -1
- package/scripts/ship-worktrees.sh +2 -29
- package/scripts/smoke-ios-physical-device.ts +4 -2
- package/scripts/smoke-runtime-recovery.ts +1 -35
- package/scripts/smoke-schedule-engine.ts +1 -20
- package/scripts/sprint-backlog.sh +1 -1
- package/scripts/verify-contract.sh +1 -111
- package/scripts/verify-forge-runtime.sh +0 -1
- package/scripts/verify-sprint.sh +3 -180
- package/scripts/workflow-contract.ts +1 -5
- package/src/cli/commands/chatgpt.ts +31 -2
- package/src/cli/commands/init-hook.ts +3 -3
- package/src/cli/commands/mcp.ts +9 -5
- package/src/cli/commands/plugin.ts +37 -10
- package/src/cli/commands/recovery.ts +25 -3
- package/src/cli/commands/runtime.ts +55 -3
- package/src/cli/commands/security.ts +12 -1
- package/src/cli/commands/setup-profile.ts +31 -21
- package/src/cli/controller/check-runner.ts +106 -3
- package/src/cli/controller/composite-result.ts +1 -1
- package/src/cli/controller/context/focus.ts +51 -0
- package/src/cli/controller/context/instruction-context.ts +114 -0
- package/src/cli/controller/context/known-paths.ts +76 -0
- package/src/cli/controller/context/query-planning.ts +110 -0
- package/src/cli/controller/context/rule-resolution.ts +532 -0
- package/src/cli/controller/context/source-materializer.ts +278 -0
- package/src/cli/controller/context/structural.ts +16 -0
- package/src/cli/controller/context/types.ts +286 -0
- package/src/cli/controller/context-pack.ts +898 -430
- package/src/cli/controller/launch-agents.ts +77 -2
- package/src/cli/controller/operational-plan.ts +2 -2
- package/src/cli/controller/work-mode.ts +6 -4
- package/src/cli/editing/edit-session.ts +60 -7
- package/src/cli/github/github.ts +133 -0
- package/src/cli/hook/prompt-guard-decision.ts +17 -18
- package/src/cli/hook/prompt-intents.ts +1 -1
- package/src/cli/installer/managed-entries.ts +15 -1
- package/src/cli/local-bridge/console-automations.ts +225 -67
- package/src/cli/local-bridge/console-view-models.ts +3 -35
- package/src/cli/local-bridge/facade-api.ts +2 -217
- package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +153 -3
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +183 -3
- package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +1 -1
- package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +4 -3
- package/src/cli/local-bridge/frontend/src/lib/api.ts +18 -11
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
- package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +1 -1
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +4 -3
- package/src/cli/local-bridge/frontend/src/styles.css +27 -11
- package/src/cli/local-bridge/frontend/src/types.ts +8 -7
- package/src/cli/local-bridge/job-store.ts +1 -490
- package/src/cli/local-bridge/server.ts +29 -532
- package/src/cli/local-bridge/ui-dist/app.css +1 -1
- package/src/cli/local-bridge/ui-dist/app.js +5101 -4967
- package/src/cli/mcp/auth.ts +5 -5
- package/src/cli/mcp/instructions.ts +3 -2
- package/src/cli/mcp/legacy-tool-service.ts +0 -189
- package/src/cli/mcp/multi-repository.ts +16 -5
- package/src/cli/mcp/oauth.ts +175 -26
- package/src/cli/mcp/paths.ts +8 -2
- package/src/cli/mcp/repository-tools.ts +356 -101
- package/src/cli/mcp/server.ts +625 -54
- package/src/cli/mcp/tool-capability-cache.ts +1 -1
- package/src/cli/mcp/toolset-selection.ts +1 -1
- package/src/cli/mcp/toolset.ts +42 -5
- package/src/cli/mcp/transports/http.ts +125 -15
- package/src/cli/mcp/transports/session-registry.ts +67 -5
- package/src/cli/mcp/types.ts +3 -3
- package/src/cli/repositories/command-classifier.ts +209 -14
- package/src/cli/repositories/command-executor.ts +55 -521
- package/src/cli/repositories/command-process.ts +108 -0
- package/src/cli/repositories/command-scope.ts +99 -41
- package/src/cli/repositories/controller-home.ts +7 -8
- package/src/cli/repositories/git-command-executor.ts +2 -0
- package/src/cli/repositories/locks.ts +53 -16
- package/src/cli/repositories/repository-snapshot.ts +121 -0
- package/src/cli/repositories/safe-patch.ts +6 -4
- package/src/cli/repositories/selected-path-actions.ts +17 -9
- package/src/cli/repositories/structured-git.ts +110 -10
- package/src/cli/repository/inspector.ts +565 -62
- package/src/cli/repository/session-cache.ts +58 -17
- package/src/cli/v81-entry.ts +1 -4
- package/src/effects/fs-transaction.ts +85 -17
- package/src/runtime/context/codegraph-read-provider.ts +233 -2
- package/src/runtime/context/codegraph-sidecar.cjs +74 -40
- package/src/runtime/context/generic-lsp-provider.ts +355 -0
- package/src/runtime/context/lsp-client.ts +283 -0
- package/src/runtime/context/semantic-navigation.ts +275 -0
- package/src/runtime/context/swift-navigation.ts +565 -0
- package/src/runtime/context/typescript-navigation.ts +226 -0
- package/src/runtime/control-plane/dispatch-priority.ts +28 -0
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +196 -2
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
- package/src/runtime/control-plane/execution/execution-identity.ts +65 -14
- package/src/runtime/control-plane/execution/session-store.ts +18 -0
- package/src/runtime/control-plane/execution/validation.ts +15 -2
- package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
- package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
- package/src/runtime/control-plane/execution/work-task-receipt.ts +54 -11
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +175 -8
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -21
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +87 -9
- package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
- package/src/runtime/control-plane/facade/controller-round-relay.ts +991 -0
- package/src/runtime/control-plane/facade/controller-session-store.ts +144 -14
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +9 -2
- package/src/runtime/control-plane/facade/goal-workloop.ts +885 -105
- package/src/runtime/control-plane/facade/index.ts +1 -0
- package/src/runtime/control-plane/facade/plan-contract-store.ts +211 -26
- package/src/runtime/control-plane/facade/requirement-board.ts +24 -8
- package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
- package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
- package/src/runtime/control-plane/facade/types.ts +55 -11
- package/src/runtime/control-plane/facade/work-contract-store.ts +204 -73
- package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
- package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
- package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +145 -0
- package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +273 -542
- package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
- package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
- package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
- package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
- package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
- package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
- package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
- package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
- package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
- package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +50 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +642 -51
- package/src/runtime/control-plane/launcher/launch-reservation-store.ts +40 -0
- package/src/runtime/control-plane/launcher/thin-launcher.ts +194 -10
- package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
- package/src/runtime/control-plane/persistence/requirement-store.ts +15 -11
- package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
- package/src/runtime/control-plane/release-retention.ts +62 -2
- package/src/runtime/control-plane/routing/route-policy.ts +7 -16
- package/src/runtime/control-plane/runtime-status-client.ts +0 -2
- package/src/runtime/diagnostics/mcp-timing.ts +19 -0
- package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
- package/src/runtime/diagnostics/performance.ts +24 -1
- package/src/runtime/evidence/event-ledger.ts +1 -1
- package/src/runtime/execution/jobs/store.ts +58 -4
- package/src/runtime/execution/jobs/types.ts +1 -1
- package/src/runtime/execution/managed-workspace.ts +203 -1
- package/src/runtime/execution/process-runtime/check-facade.ts +52 -14
- package/src/runtime/execution/process-runtime/check-result.ts +63 -2
- package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
- package/src/runtime/execution/process-runtime/command-facade.ts +346 -40
- package/src/runtime/execution/process-runtime/gc.ts +98 -12
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
- package/src/runtime/execution/process-runtime/persisted-check.ts +57 -6
- package/src/runtime/execution/process-runtime/resource-claims.ts +97 -8
- package/src/runtime/execution/process-runtime/runtime.ts +59 -4
- package/src/runtime/execution/process-runtime/store.ts +7 -0
- package/src/runtime/execution/process-runtime/types.ts +2 -0
- package/src/runtime/execution/thin-harness/async-process.ts +12 -2
- package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
- package/src/runtime/execution/workers/executor.ts +0 -48
- package/src/runtime/gateway/mcp/execution-tools.ts +1219 -126
- package/src/runtime/gateway/mcp/process-tools.ts +83 -37
- package/src/runtime/gateway/mcp/router.ts +185 -83
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
- package/src/runtime/gateway/mcp/runtime-tools.ts +2555 -1616
- package/src/runtime/model-clients/deepseek-adapter.ts +0 -32
- package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
- package/src/runtime/plugins/browser-adapter.ts +2925 -318
- package/src/runtime/plugins/browser-automation-service.ts +10 -0
- package/src/runtime/plugins/browser-handoff-host.ts +6 -31
- package/src/runtime/plugins/browser-handoff.ts +92 -5
- package/src/runtime/plugins/browser-macos-bridge.ts +586 -45
- package/src/runtime/plugins/browser-node-bridge.ts +6 -34
- package/src/runtime/plugins/browser-provider-registry.ts +109 -0
- package/src/runtime/plugins/browser-runtime-contract.ts +152 -0
- package/src/runtime/plugins/browser-runtime.ts +183 -0
- package/src/runtime/plugins/browser-session-authority.ts +332 -0
- package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
- package/src/runtime/plugins/desktop-operator-registration.ts +15 -12
- package/src/runtime/plugins/external-adapter.ts +324 -3
- package/src/runtime/plugins/external-registration.ts +84 -5
- package/src/runtime/plugins/external-unix-socket.ts +7 -1
- package/src/runtime/plugins/first-party-registry.ts +4 -2
- package/src/runtime/plugins/github-adapter.ts +125 -0
- package/src/runtime/plugins/gmail-adapter.ts +28 -2
- package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
- package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
- package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
- package/src/runtime/plugins/ios-adapter.ts +106 -16
- package/src/runtime/plugins/ios-agent-device.ts +234 -64
- package/src/runtime/plugins/ios-physical-device.ts +1143 -392
- package/src/runtime/plugins/lightweight-action.ts +153 -0
- package/src/runtime/plugins/local-system-adapter.ts +125 -8
- package/src/runtime/plugins/macos-capability-broker.ts +55 -9
- package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
- package/src/runtime/plugins/plugin-management-adapter.ts +181 -0
- package/src/runtime/plugins/resend-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +366 -24
- package/src/runtime/plugins/types.ts +39 -2
- package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
- package/src/runtime/projections/git-status-sampler.ts +16 -16
- package/src/runtime/projections/materialized-view.ts +28 -10
- package/src/runtime/recovery/actions.ts +0 -10
- package/src/runtime/recovery/classifier.ts +0 -9
- package/src/runtime/recovery/maintenance-executor.ts +415 -18
- package/src/runtime/recovery/probe.ts +0 -1
- package/src/runtime/recovery/types.ts +0 -1
- package/src/runtime/root/mcp-transport.ts +180 -10
- package/src/runtime/root/package-connector-service.ts +186 -8
- package/src/runtime/root/package-runtime-release.ts +143 -17
- package/src/runtime/root/package-runtime-service.ts +430 -22
- package/src/runtime/root/release-manifest.ts +7 -2
- package/src/runtime/root/release-materialize.ts +162 -19
- package/src/runtime/root/release-store.ts +48 -11
- package/src/runtime/root/runtime.ts +23 -5
- package/src/runtime/root/service.ts +100 -27
- package/src/runtime/root/types.ts +2 -0
- package/src/runtime/safe-tooling/index.ts +0 -1
- package/src/runtime/safe-tooling/ios-development.ts +321 -63
- package/src/runtime/safe-tooling/types.ts +0 -30
- package/src/runtime/shared/trusted-executable.ts +62 -0
- package/src/runtime/shared/trusted-node-executable.ts +48 -0
- package/src/runtime/standalone-recovery/core.ts +702 -94
- package/src/runtime/standalone-recovery/entry.ts +99 -23
- package/src/runtime/standalone-recovery/installer.ts +19 -3
- package/src/runtime/standalone-recovery/service-labels.ts +2 -0
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
- package/src/runtime/workflow/schedules/browser-probe.ts +258 -0
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +40 -0
- package/src/runtime/workflow/schedules/engine.ts +509 -80
- package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
- package/src/runtime/workflow/schedules/settlement.ts +48 -4
- package/src/runtime/workflow/schedules/store.ts +131 -10
- package/src/runtime/workflow/schedules/types.ts +6 -3
- package/src/runtime/workflow/schedules/work-continuation.ts +120 -34
- package/src/testing/test-governance.ts +8 -40
- package/assets/reference-configs/heartbeat-triage.md +0 -57
- package/assets/templates/helpers/harness-trace-grade.sh +0 -150
- package/assets/templates/helpers/heartbeat-triage.sh +0 -361
- package/assets/templates/helpers/maintenance-triage.sh +0 -167
- package/bin/forge-desktop-helper.mjs +0 -204
- package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
- package/docs/architecture/current/architecture-invariants.md +0 -331
- package/docs/architecture/current/automation-and-schedule-engine.md +0 -453
- package/docs/architecture/current/codegraph-context-provider.md +0 -226
- package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
- package/docs/architecture/current/controller-repository-decoupling.md +0 -148
- package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -354
- package/docs/architecture/current/entity-model.md +0 -592
- package/docs/architecture/current/external-plugin-governance.md +0 -396
- package/docs/architecture/current/failure-recovery.md +0 -447
- package/docs/architecture/current/governance.md +0 -213
- package/docs/architecture/current/human-interaction-plane.md +0 -87
- package/docs/architecture/current/implementation-status.md +0 -128
- package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
- package/docs/architecture/current/legacy-governance.md +0 -58
- package/docs/architecture/current/local-workspace-target-grants.md +0 -70
- package/docs/architecture/current/migration-roadmap.md +0 -105
- package/docs/architecture/current/multi-repository-execution.md +0 -371
- package/docs/architecture/current/operations-runbook.md +0 -45
- package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
- package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
- package/docs/architecture/current/repository-access-modes.md +0 -102
- package/docs/architecture/current/route-policy.md +0 -15
- package/docs/architecture/current/route-session-concurrency.md +0 -85
- package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
- package/docs/architecture/current/runtime-directory-map.md +0 -49
- package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
- package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
- package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
- package/docs/architecture/current/system-overview.md +0 -144
- package/docs/architecture/current/target-requirements-traceability.md +0 -202
- package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
- package/docs/architecture/current/thin-harness-v1.md +0 -311
- package/docs/architecture/current/verification-and-release-gates.md +0 -391
- package/docs/forge-autonomous-goal-loop.md +0 -9
- package/docs/forge-provider-configuration.md +0 -7
- package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -83
- package/docs/operations/controller-desktop-plugin.md +0 -112
- package/docs/operations/gmail-assistant-routines.md +0 -186
- package/docs/operations/personal-assistant-operator-guide.md +0 -61
- package/docs/operations/provider-configuration.md +0 -31
- package/scripts/harness-trace-grade.sh +0 -150
- package/scripts/heartbeat-triage.sh +0 -361
- package/scripts/maintenance-triage.sh +0 -167
- package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
- package/src/cli/repositories/goal-registry.ts +0 -239
- package/src/runtime/assistant/action-proposals.ts +0 -279
- package/src/runtime/assistant/intent.ts +0 -395
- package/src/runtime/assistant/model-provider.ts +0 -460
- package/src/runtime/assistant/openapi.ts +0 -223
- package/src/runtime/assistant/policy.ts +0 -89
- package/src/runtime/assistant/readiness.ts +0 -258
- package/src/runtime/assistant/routine-runtime.ts +0 -477
- package/src/runtime/assistant/schedule-binding.ts +0 -171
- package/src/runtime/assistant/standing-grants.ts +0 -375
- package/src/runtime/assistant/store.ts +0 -243
- package/src/runtime/assistant/types.ts +0 -135
- package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
- package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
- package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
- package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
- package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
- package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
- package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
- package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
- package/src/runtime/control-plane/goal-loop/index.ts +0 -13
- package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
- package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
- package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
- package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
- package/src/runtime/control-plane/goal-loop/types.ts +0 -378
- package/src/runtime/control-plane/startup-recovery.ts +0 -198
- package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
- package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
- package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
- package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
- package/src/runtime/plugins/desktop-adapter.ts +0 -374
- package/src/runtime/safe-tooling/browser-safe.ts +0 -133
- package/src/runtime/workflow/findings/store.ts +0 -204
- package/src/runtime/workflow/findings/types.ts +0 -58
- package/src/runtime/workflow/portfolio/engine.ts +0 -20
- package/src/runtime/workflow/portfolio/store.ts +0 -185
- package/src/runtime/workflow/portfolio/types.ts +0 -29
package/AGENTS.md
CHANGED
|
@@ -43,6 +43,8 @@ Treat ChatGPT as the controller and Forge as its repository execution layer. Cha
|
|
|
43
43
|
|
|
44
44
|
## Operating Rules
|
|
45
45
|
|
|
46
|
+
- After a managed repository change is verified and committed/merged, push the delivered target branch to its configured remote promptly. Do not leave a successfully delivered commit only on local refs unless the user explicitly requested local-only delivery or the push is blocked by safety, permissions, authentication, or branch policy; surface the exact blocker when a push cannot complete.
|
|
47
|
+
- Treat the Google Cloud `forge-cloud` VM experiment as retired infrastructure. Do not restart or reuse that VM for Forge Cloud. Any future remote Forge maintainer must use a separately evaluated host/transport and must demonstrate better latency and reliability than the local Forge path before adoption.
|
|
46
48
|
- Sync `tasks/` whenever substantive repo changes are made.
|
|
47
49
|
- Use `tasks/notes/<plan-stem>.notes.md` only for non-obvious slice decisions, deviations, tradeoffs, and open questions; `<plan-stem>` is the active plan filename without `plan-` and `.md` (for example `20260531-0045-governance-workflow`). Do not use notes as durable memory or a task log, and archive/promote them deliberately when the slice closes.
|
|
48
50
|
- Treat hook execution as central-first: trusted repos run `~/.forge/hooks/` (bash shim) or the packaged CLI copy; this self-host repo pins `"hook_source": "repo"` in `.ai/harness/policy.json` so `.ai/hooks/` stays the live development runtime, with `assets/hooks/` as the product source mirrored on install. User-level `~/.claude/settings.json` and `~/.codex/hooks.json` are the host adapters.
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,52 @@ All notable public Forge changes are recorded here. Release entries are tied to
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 1.7.0 - 2026-08-27
|
|
8
|
+
|
|
9
|
+
### Persistent autonomous control
|
|
10
|
+
|
|
11
|
+
- Add the durable Schedule → Work → ChatGPT conversation continuation contract, explicit round dispositions, effect-only Work/finalization semantics, and tab settlement after Controller release instead of immediately after prompt dispatch.
|
|
12
|
+
- Keep transient Browser/connector readiness failures on bounded backoff without permanently disabling schedules, while authentication, consent, destructive actions, and other hard boundaries remain fail-closed.
|
|
13
|
+
- Make real timer-origin continuation and the Continuous Evolution Supervisor a stable-release gate rather than treating schedule configuration alone as proof of autonomous operation.
|
|
14
|
+
|
|
15
|
+
### Browser Runtime V3
|
|
16
|
+
|
|
17
|
+
- Promote Browser Runtime V3 as the current browser architecture with one Controller Home BrowserSession authority, stable plugin-owned native tab identity, background-safe navigation, exact rebind, and explicit physical-input fallback.
|
|
18
|
+
- Harden native replacement with strict postconditions, HTTP(S) settlement that rejects transitional `about:*` pages, destination-origin authorization, and preservation of user-owned tabs.
|
|
19
|
+
- Improve Chrome/Vivaldi provider behavior, postcondition evidence, restart/rebind handling, and visual evidence integration without adding a second Browser authority.
|
|
20
|
+
|
|
21
|
+
### Capabilities, plugins, and iOS
|
|
22
|
+
|
|
23
|
+
- Add deterministic natural-intent capability discovery while keeping `plugin_action_execute` as the sole typed plugin executor and preserving the stable ChatGPT facade.
|
|
24
|
+
- Add controller-global plugin profiles with repository overlays, including reusable App Store Connect credential references without copying private-key contents into repository state or tool output.
|
|
25
|
+
- Add typed physical-device iOS build destinations and opt-in Xcode provisioning updates using file-backed App Store Connect key references, with bounded/redacted execution evidence.
|
|
26
|
+
|
|
27
|
+
### Runtime, recovery, and governance
|
|
28
|
+
|
|
29
|
+
- Continue converging Work/Plan/finalizer lifecycle authority, target-advancement validation, process/session fencing, source coherence, and whole-Runtime immutable activation/rollback under the independent Recovery boundary.
|
|
30
|
+
- Keep ChatGPT as the semantic controller and Forge as the deterministic execution/control plane, with Direct-first execution and durable Work/Plan state only where continuity, isolation, recovery, scheduling, or external effects require it.
|
|
31
|
+
- Tighten maintained architecture/documentation authority and capability-closure governance so stale Work or superseded design documents do not become parallel current truth.
|
|
32
|
+
|
|
33
|
+
## 1.6.0 - 2026-08-16
|
|
34
|
+
|
|
35
|
+
### Architecture V2 and execution governance
|
|
36
|
+
|
|
37
|
+
- Complete the V2 Direct / bounded Work / Plan execution model, including isolated Work materialization, authoritative finalization, dead-Plan recovery, duplicate-writer prevention, and safer Work validation.
|
|
38
|
+
- Decouple durable Work ownership from transient MCP transport sessions so scheduled and interactive ChatGPT execution can resume against stable controller leases and checkout identity.
|
|
39
|
+
- Add bounded impact context and CodeGraph-aware retrieval while keeping routing, semantic context, and repository authority converged on one deterministic control path.
|
|
40
|
+
|
|
41
|
+
### Performance and Runtime
|
|
42
|
+
|
|
43
|
+
- Reduce controller hot-path overhead with canonical repository-root reuse, exact-file retrieval fast paths, Runtime proxy session reuse, batched Process identity probes, narrower service claims, and read-only SQLite diagnostics.
|
|
44
|
+
- Preserve resumable Process/check execution while improving persisted-check retry idempotency, stale-process handling, worktree reconciliation, and release/runtime identity safety.
|
|
45
|
+
- Keep the stable 19-tool ChatGPT surface while moving more domain behavior behind typed capability and plugin contracts.
|
|
46
|
+
|
|
47
|
+
### Automation and plugins
|
|
48
|
+
|
|
49
|
+
- Add Forge-native ChatGPT workflows, schedules, Work-bound browser watchers, cross-session workflow attribution, and more reliable ChatGPT mode/reasoning selection.
|
|
50
|
+
- Add trusted external-plugin registration lifecycle support and official Forge Figma Bridge catalog installation; retire the bundled desktop helper in favor of the external provider boundary.
|
|
51
|
+
- Improve plugin scope/compatibility handling, browser URL behavior, image artifact delivery, Gmail Unicode subjects, and automation history/configuration surfaces.
|
|
52
|
+
|
|
7
53
|
## 1.5.1 - 2026-08-13
|
|
8
54
|
|
|
9
55
|
### ChatGPT Secure Tunnel and package setup
|
package/CLAUDE.md
CHANGED
|
@@ -43,6 +43,8 @@ Treat ChatGPT as the controller and Forge as its repository execution layer. Cha
|
|
|
43
43
|
|
|
44
44
|
## Operating Rules
|
|
45
45
|
|
|
46
|
+
- After a managed repository change is verified and committed/merged, push the delivered target branch to its configured remote promptly. Do not leave a successfully delivered commit only on local refs unless the user explicitly requested local-only delivery or the push is blocked by safety, permissions, authentication, or branch policy; surface the exact blocker when a push cannot complete.
|
|
47
|
+
- Treat the Google Cloud `forge-cloud` VM experiment as retired infrastructure. Do not restart or reuse that VM for Forge Cloud. Any future remote Forge maintainer must use a separately evaluated host/transport and must demonstrate better latency and reliability than the local Forge path before adoption.
|
|
46
48
|
- Sync `tasks/` whenever substantive repo changes are made.
|
|
47
49
|
- Use `tasks/notes/<plan-stem>.notes.md` only for non-obvious slice decisions, deviations, tradeoffs, and open questions; `<plan-stem>` is the active plan filename without `plan-` and `.md` (for example `20260531-0045-governance-workflow`). Do not use notes as durable memory or a task log, and archive/promote them deliberately when the slice closes.
|
|
48
50
|
- Treat hook execution as central-first: trusted repos run `~/.forge/hooks/` (bash shim) or the packaged CLI copy; this self-host repo pins `"hook_source": "repo"` in `.ai/harness/policy.json` so `.ai/hooks/` stays the live development runtime, with `assets/hooks/` as the product source mirrored on install. User-level `~/.claude/settings.json` and `~/.codex/hooks.json` are the host adapters.
|
package/DESIGN.md
CHANGED
|
@@ -218,9 +218,14 @@ Dark, persistent and quiet. It contains Forge identity, grouped navigation, and
|
|
|
218
218
|
### Command bar
|
|
219
219
|
Each route owns a compact command bar: eyebrow, title, one-line purpose, refreshed time and route actions. `Open ChatGPT` remains globally available but visually secondary.
|
|
220
220
|
|
|
221
|
+
## Page composition rules
|
|
222
|
+
Each workspace has **one dominant information region** and at most one contextual secondary region. Pages are not collections of cards; layout, typography, aligned columns, whitespace and hairlines establish hierarchy before enclosure.
|
|
223
|
+
|
|
224
|
+
Collections use rows or tables. A selected entity uses one contextual detail pane. Configuration uses titled sections with field rows. Metrics stay inline or in compact definition rows unless direct metric comparison is the task. Normal state is visually neutral; semantic color is reserved for exceptions, attention and explicit interaction.
|
|
225
|
+
|
|
221
226
|
## Core component grammar
|
|
222
227
|
### Metric strip
|
|
223
|
-
|
|
228
|
+
Metric strips are exceptional. Use them only when comparing coarse operational facts is itself useful; never make equal metric cards the default page composition.
|
|
224
229
|
|
|
225
230
|
### Data list
|
|
226
231
|
Primary scanning surface for Work, Capabilities and Repositories. Rows use hairline separators and bounded one-line context.
|
|
@@ -236,7 +241,7 @@ Use a 7px dot plus short text. Filled badges are exceptional.
|
|
|
236
241
|
|
|
237
242
|
## Page grammar
|
|
238
243
|
### Overview
|
|
239
|
-
|
|
244
|
+
Overview is a **cross-workspace status and attention surface**, not a collection manager. Keep it single-column and lightweight: first surface a bounded, deduplicated Needs attention list across Work, Automations, Capabilities, Repositories and System; then show one compact Workspace summary row for each owning workspace. Overview does not enumerate ordinary Work, group content by repository, expose collection filters or open a detail pane. It routes the user to the owning workspace for management. Healthy state stays compact and neutral. Activity feeds require authoritative event semantics and must never be inferred from `updatedAt` or other incidental timestamps. No prompt composer, run timeline, repository portfolio, equal metric grid or decorative posture hero.
|
|
240
245
|
|
|
241
246
|
### Automations
|
|
242
247
|
Use a configuration-first table with Name, Schedule, Scope, Delivery, Status, Last and Next; filters Enabled / Paused / Attention / All; selected detail pane with exact source and Run/Pause/Resume. Never duplicate report body.
|
package/README.md
CHANGED
|
@@ -48,7 +48,7 @@ Setup persists progress and guides the selected path through the user-level Pack
|
|
|
48
48
|
|
|
49
49
|
Then follow [Install and start](docs/tutorials/01-install-and-start.md) and [Connect ChatGPT](docs/tutorials/02-connect-chatgpt.md). A repository is optional during initial setup; add one later with `forge adopt --repo /path/to/your-project`. Upgrade an existing install with `npm install -g @moretea-labs/forge@latest`, verify with `forge --version`, then run `forge setup next` to reconcile newer Runtime/connector setup contracts.
|
|
50
50
|
|
|
51
|
-
For a reviewed source checkout: `git clone https://github.com/moretea-labs/forge.git && cd forge &&
|
|
51
|
+
For a reviewed source checkout: `git clone https://github.com/moretea-labs/forge.git && cd forge && bun install --frozen-lockfile && npm install -g . --omit=optional --no-audit --no-fund`.
|
|
52
52
|
|
|
53
53
|
## Built in, and extensible
|
|
54
54
|
|
|
@@ -58,7 +58,7 @@ Forge ships typed local/browser/desktop/iOS/GitHub/Gmail/Calendar/Tasks/App Stor
|
|
|
58
58
|
|
|
59
59
|
Local read/write grants are explicit and expiring; remote or destructive effects are distinguished from ordinary local work; high-impact actions require stronger confirmation. Full Access reduces repetitive prompts for normal work without removing the hard boundaries around secrets, destructive actions, and outside-workspace access. See [Security](SECURITY.md) and the [Security Model](docs/wiki/Security-Model.md).
|
|
60
60
|
|
|
61
|
-
**Docs:** [Wiki](docs/wiki/Home.md) · [Support](SUPPORT.md) · [Contributing](CONTRIBUTING.md) · [Changelog](CHANGELOG.md). Current stable release: `1.
|
|
61
|
+
**Docs:** [Wiki](docs/wiki/Home.md) · [Support](SUPPORT.md) · [Contributing](CONTRIBUTING.md) · [Changelog](CHANGELOG.md). Current stable release: `1.7.0`; stable installs use npm `latest`.
|
|
62
62
|
|
|
63
63
|
---
|
|
64
64
|
<a id="zh-cn"></a>
|
|
@@ -103,10 +103,10 @@ forge setup next # 按每次显示的 Next 动作继续
|
|
|
103
103
|
|
|
104
104
|
远程主控的 setup 会继续引导 Package Runtime、远程连接、主控配置和连接验证;对 ChatGPT,`--tunnel auto` 现在明确表示 **优先 OpenAI Secure MCP Tunnel**。Forge 保持 Canonical Runtime 私有,并安装一个仅监听 loopback 的 OAuth Gateway,再由官方 `tunnel-client` 出站连接 OpenAI。只有 Secure Tunnel 不可用时才显式选择 Cloudflare Tunnel、Tailscale Funnel、已有 HTTPS `/mcp` 或暂缓远程连接。本地 Codex/Claude 主控不需要 tunnel。ChatGPT App/connector 是应用身份,Secure Tunnel 只是网络传输层,因此切换网络不会产生另一套 Forge 工具 schema。
|
|
105
105
|
|
|
106
|
-
继续阅读[安装与启动](docs/tutorials/01-install-and-start.zh-CN.md)和[连接 ChatGPT](docs/tutorials/02-connect-chatgpt.zh-CN.md)。仓库不是首次 setup 的前置条件,需要开发能力时再运行 `forge adopt --repo /path/to/your-project`。已安装用户升级:`npm install -g @moretea-labs/forge@latest`,确认 `forge --version` 后运行 `forge setup next` 让新版 setup 自动补齐 Runtime/connector 配置。源码安装:`git clone https://github.com/moretea-labs/forge.git && cd forge &&
|
|
106
|
+
继续阅读[安装与启动](docs/tutorials/01-install-and-start.zh-CN.md)和[连接 ChatGPT](docs/tutorials/02-connect-chatgpt.zh-CN.md)。仓库不是首次 setup 的前置条件,需要开发能力时再运行 `forge adopt --repo /path/to/your-project`。已安装用户升级:`npm install -g @moretea-labs/forge@latest`,确认 `forge --version` 后运行 `forge setup next` 让新版 setup 自动补齐 Runtime/connector 配置。源码安装:`git clone https://github.com/moretea-labs/forge.git && cd forge && bun install --frozen-lockfile && npm install -g . --omit=optional --no-audit --no-fund`。
|
|
107
107
|
|
|
108
108
|
Forge 内置本机、Browser、Desktop、iOS、GitHub、Gmail、Calendar、Tasks、App Store Connect、Resend 等类型化能力;公开 Provider 目录还有 **Forge Desktop Operator / Forge Design / Personal Knowledge Assistant**。详见[功能清单](docs/operations/features.zh-CN.md)与[插件管理](docs/forge-plugin-management.md)。
|
|
109
109
|
|
|
110
110
|
安全上,普通本地修改、远程影响、破坏性操作、密钥和工作区外访问是不同边界;Full Access 不会取消高风险确认。详见[安全说明](SECURITY.md)和[安全模型](docs/wiki/Security-Model.md)。
|
|
111
111
|
|
|
112
|
-
**文档:** [Wiki](docs/wiki/Home.md) · [支持](SUPPORT.md) · [贡献](CONTRIBUTING.md) · [更新日志](CHANGELOG.md)。当前稳定版为 `1.
|
|
112
|
+
**文档:** [Wiki](docs/wiki/Home.md) · [支持](SUPPORT.md) · [贡献](CONTRIBUTING.md) · [更新日志](CHANGELOG.md)。当前稳定版为 `1.7.0`,稳定安装使用 npm `latest`。
|
package/README.zh-CN.md
CHANGED
|
@@ -62,7 +62,7 @@ forge setup next # 按每次显示的 Next 动作继续
|
|
|
62
62
|
|
|
63
63
|
```bash
|
|
64
64
|
git clone https://github.com/moretea-labs/forge.git && cd forge
|
|
65
|
-
|
|
65
|
+
bun install --frozen-lockfile
|
|
66
66
|
npm install -g . --omit=optional --no-audit --no-fund
|
|
67
67
|
```
|
|
68
68
|
|
|
@@ -78,4 +78,4 @@ Forge 把读取、普通本地写入、远程操作、破坏性操作、工作
|
|
|
78
78
|
|
|
79
79
|
[中文文档中心](docs/README.zh-CN.md) · [Wiki](docs/wiki/Home.md) · [SUPPORT.md](SUPPORT.md) · [CONTRIBUTING.md](CONTRIBUTING.md) · [CHANGELOG.md](CHANGELOG.md)
|
|
80
80
|
|
|
81
|
-
当前稳定版本是 `1.
|
|
81
|
+
当前稳定版本是 `1.7.0`,稳定安装使用 npm `latest`。
|
package/SKILL.md
CHANGED
|
@@ -40,8 +40,8 @@ Automatic routing remains authoritative when the user does not provide a mode di
|
|
|
40
40
|
|
|
41
41
|
A leading mode directive is an opt-in instruction to ChatGPT's Forge router. It applies only to the current request, is removed from the objective before execution, and never bypasses permissions, Runtime authority, protected-path rules, approvals, or destructive/remote-write confirmation.
|
|
42
42
|
|
|
43
|
-
- `-plan` or `/plan`: force the reviewed planning path. Planning is read-only: inspect repository state and call `
|
|
44
|
-
- `-debug` or `/debug`: force evidence-first debugging. Reproduce or characterize the failure, then prefer `
|
|
43
|
+
- `-plan` or `/plan`: force the reviewed planning path. Planning is read-only: inspect repository state and call `rh_context` search with `structural_context=required` so CodeGraph symbol/reference/dependency/impact evidence is used when the index is ready; load only relevant architecture/ADR/design/README material, then create or revise the existing PlanContract. Review the PlanContract before approval. Do not start mutation until the reviewed plan is approved and execution is explicitly bound to an approved plan step. If CodeGraph is unavailable or stale, keep the degraded evidence warning visible and use bounded current-source context instead of pretending graph coverage exists.
|
|
44
|
+
- `-debug` or `/debug`: force evidence-first debugging. Reproduce or characterize the failure, then prefer repeated `rh_context` search with `structural_context=auto` to isolate callers, dependencies, and the smallest causal surface before patching and focused verification. The directive does not force an Agent or durable Work; existing routing still chooses Direct, bounded Work, or an optional worker from the actual scope and risk.
|
|
45
45
|
|
|
46
46
|
A bare directive with no objective should return/explain that mode's working contract and must not mutate repository state. Mode directives are not sticky across turns unless the user repeats them or explicitly asks to continue the same active Plan/Work.
|
|
47
47
|
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Third-party notices
|
|
2
2
|
|
|
3
|
-
This inventory covers the direct runtime and development dependencies declared by `@moretea-labs/forge@1.
|
|
3
|
+
This inventory covers the direct runtime and development dependencies declared by `@moretea-labs/forge@1.7.0`.
|
|
4
4
|
|
|
5
5
|
License values come from `package-lock.json` where available. For lock entries without a license field, the declared license was verified from package metadata during release preparation. This file is informational and does not replace the license text distributed by each dependency.
|
|
6
6
|
|
package/agents/openai.yaml
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: "forge"
|
|
3
3
|
short_description: "Operate Forge workflows for repository planning, execution, verification, migration, audit, and repair"
|
|
4
|
-
default_prompt: "Use Forge to inspect this repository, choose the smallest appropriate workflow, and carry out or plan the requested work with bounded evidence and verification."
|
|
4
|
+
default_prompt: "Use Forge to inspect this repository, choose the smallest appropriate workflow, and carry out or plan the requested work with bounded evidence and verification. After verified repository delivery, promptly push the committed/merged target branch to its configured remote unless the user explicitly requested local-only delivery or the push is blocked; report any blocker precisely."
|
|
@@ -26,10 +26,12 @@ hook_read_stdin_once() {
|
|
|
26
26
|
|
|
27
27
|
if [[ -t 0 ]]; then
|
|
28
28
|
HOOK_STDIN_JSON=""
|
|
29
|
+
export HOOK_STDIN_JSON
|
|
29
30
|
return
|
|
30
31
|
fi
|
|
31
32
|
|
|
32
33
|
HOOK_STDIN_JSON="$(cat 2>/dev/null || true)"
|
|
34
|
+
export HOOK_STDIN_JSON
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
hook_json_extract_with_bun() {
|
|
@@ -275,11 +277,6 @@ hook_get_session_id() {
|
|
|
275
277
|
local arg="${1:-}"
|
|
276
278
|
local parsed=""
|
|
277
279
|
|
|
278
|
-
if [[ -n "${HOOK_SESSION_ID:-}" ]]; then
|
|
279
|
-
printf '%s' "$HOOK_SESSION_ID"
|
|
280
|
-
return
|
|
281
|
-
fi
|
|
282
|
-
|
|
283
280
|
parsed="$(hook_json_get '.session_id' '')"
|
|
284
281
|
if [[ -n "$parsed" ]]; then
|
|
285
282
|
HOOK_SESSION_ID="$parsed"
|
|
@@ -296,13 +293,19 @@ hook_get_session_id() {
|
|
|
296
293
|
return
|
|
297
294
|
fi
|
|
298
295
|
|
|
299
|
-
if [[ -n "${
|
|
300
|
-
HOOK_SESSION_ID="${CLAUDE_SESSION_ID:-${CODEX_SESSION_ID:-}}"
|
|
301
|
-
export HOOK_SESSION_ID
|
|
296
|
+
if [[ -n "${HOOK_SESSION_ID:-}" ]]; then
|
|
302
297
|
printf '%s' "$HOOK_SESSION_ID"
|
|
303
298
|
return
|
|
304
299
|
fi
|
|
305
300
|
|
|
301
|
+
parsed="${CLAUDE_SESSION_ID:-${CODEX_SESSION_ID:-${SESSION_KEY:-}}}"
|
|
302
|
+
if [[ -n "$parsed" ]]; then
|
|
303
|
+
HOOK_SESSION_ID="$parsed"
|
|
304
|
+
export HOOK_SESSION_ID
|
|
305
|
+
printf '%s' "$parsed"
|
|
306
|
+
return
|
|
307
|
+
fi
|
|
308
|
+
|
|
306
309
|
printf '%s' ""
|
|
307
310
|
}
|
|
308
311
|
|
|
@@ -17,16 +17,15 @@ session_state_new_session_id() {
|
|
|
17
17
|
session_state_resolve_key() {
|
|
18
18
|
local session_id_file="$1"
|
|
19
19
|
local arg="${2:-}"
|
|
20
|
-
local session_key="
|
|
20
|
+
local session_key=""
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
# An event payload is more specific than ambient host state. This matters for
|
|
23
|
+
# forwarded or replayed hook input, where the parent process can belong to a
|
|
24
|
+
# different host session than the event being handled.
|
|
25
|
+
if declare -F hook_get_session_id >/dev/null 2>&1; then
|
|
23
26
|
session_key="$(hook_get_session_id "$arg")"
|
|
24
27
|
fi
|
|
25
28
|
|
|
26
|
-
if [[ -z "$session_key" ]]; then
|
|
27
|
-
session_key="${CLAUDE_SESSION_ID:-${CODEX_SESSION_ID:-${SESSION_KEY:-}}}"
|
|
28
|
-
fi
|
|
29
|
-
|
|
30
29
|
if [[ -n "$session_key" ]]; then
|
|
31
30
|
mkdir -p "$(dirname "$session_id_file")" 2>/dev/null || true
|
|
32
31
|
printf '%s\n' "$session_key" > "$session_id_file" 2>/dev/null || true
|
|
@@ -34,10 +33,14 @@ session_state_resolve_key() {
|
|
|
34
33
|
return
|
|
35
34
|
fi
|
|
36
35
|
|
|
37
|
-
if [[ -
|
|
36
|
+
if [[ -s "$session_id_file" ]]; then
|
|
38
37
|
session_key="$(cat "$session_id_file" 2>/dev/null || true)"
|
|
39
38
|
fi
|
|
40
39
|
|
|
40
|
+
if [[ -z "$session_key" ]]; then
|
|
41
|
+
session_key="${HOOK_SESSION_ID:-${CLAUDE_SESSION_ID:-${CODEX_SESSION_ID:-${SESSION_KEY:-}}}}"
|
|
42
|
+
fi
|
|
43
|
+
|
|
41
44
|
if [[ -z "$session_key" ]]; then
|
|
42
45
|
session_key="$(session_state_new_session_id)"
|
|
43
46
|
mkdir -p "$(dirname "$session_id_file")" 2>/dev/null || true
|
|
@@ -575,16 +575,21 @@ workflow_cleanup_candidate() {
|
|
|
575
575
|
[[ -e "$metadata" ]] || continue
|
|
576
576
|
slug="$(basename "$metadata" .json)"
|
|
577
577
|
[[ -n "$slug" ]] || continue
|
|
578
|
-
|
|
579
|
-
|
|
578
|
+
branch="${branch_prefix}${slug}"
|
|
579
|
+
# Controller metadata can outlive a terminal worktree after a Home
|
|
580
|
+
# migration. It is not cleanup work unless a Git branch or worktree still
|
|
581
|
+
# exists; otherwise it must never keep a fresh resume packet stale.
|
|
582
|
+
if git show-ref --verify --quiet "refs/heads/${branch}"; then
|
|
583
|
+
printf '%s\t%s\t\n' "$slug" "$branch"
|
|
584
|
+
return 0
|
|
585
|
+
fi
|
|
580
586
|
done
|
|
581
587
|
|
|
582
588
|
return 1
|
|
583
589
|
}
|
|
584
590
|
|
|
585
591
|
workflow_next_action() {
|
|
586
|
-
local active_plan task_state total done next_pending contract_file
|
|
587
|
-
local external_status external_state external_reviewer external_source external_message expected_source
|
|
592
|
+
local active_plan task_state total done next_pending contract_file checks_file checks_error
|
|
588
593
|
local target current_branch slug candidate branch worktree command message
|
|
589
594
|
|
|
590
595
|
active_plan="$(get_active_plan || true)"
|
|
@@ -602,38 +607,19 @@ workflow_next_action() {
|
|
|
602
607
|
fi
|
|
603
608
|
|
|
604
609
|
contract_file="$(workflow_active_contract || true)"
|
|
605
|
-
review_file="$(workflow_active_review || true)"
|
|
606
610
|
checks_file="$(workflow_checks_file)"
|
|
607
611
|
|
|
608
|
-
if [[ -z "$review_file" || ! -f "$review_file" ]]; then
|
|
609
|
-
printf 'review\t/review\tStage the completed module diff first; then run /review and record a sprint review before finishing this worktree.\n'
|
|
610
|
-
return 0
|
|
611
|
-
fi
|
|
612
|
-
|
|
613
|
-
if ! workflow_review_recommends_pass "$review_file"; then
|
|
614
|
-
printf 'review\t/review\tStage the completed module diff first; then run /review until %s records Recommendation: pass.\n' "$review_file"
|
|
615
|
-
return 0
|
|
616
|
-
fi
|
|
617
|
-
|
|
618
612
|
if [[ -z "$contract_file" || ! -f "$contract_file" ]]; then
|
|
619
613
|
printf 'check\t/check\tStage the completed module diff first; then regenerate the active sprint contract and run /review.\n'
|
|
620
614
|
return 0
|
|
621
615
|
fi
|
|
622
616
|
|
|
623
|
-
external_status="$(workflow_external_acceptance_status "$review_file")"
|
|
624
|
-
IFS=$'\t' read -r external_state external_reviewer external_source external_message <<< "$external_status"
|
|
625
|
-
if [[ "$external_state" != "pass" && "$external_state" != "manual_override" ]]; then
|
|
626
|
-
expected_source="$(workflow_external_acceptance_expected_source)"
|
|
627
|
-
printf 'check\t/check\tStage the completed module diff first; then %s Run external acceptance via %s and record ## External Acceptance Advice in %s.\n' "${external_message:-External acceptance is missing.}" "$expected_source" "$review_file"
|
|
628
|
-
return 0
|
|
629
|
-
fi
|
|
630
|
-
|
|
631
617
|
if [[ ! -f "$checks_file" ]]; then
|
|
632
618
|
printf 'review\t/review\tStage the completed module diff first; then run /review and verify-sprint so %s exists.\n' "$checks_file"
|
|
633
619
|
return 0
|
|
634
620
|
fi
|
|
635
621
|
|
|
636
|
-
if ! checks_error="$(workflow_checks_pass "$checks_file" "$contract_file"
|
|
622
|
+
if ! checks_error="$(workflow_checks_pass "$checks_file" "$contract_file")"; then
|
|
637
623
|
printf 'check\t/check\tStage the completed module diff first; then resolve check evidence: %s\n' "$checks_error"
|
|
638
624
|
return 0
|
|
639
625
|
fi
|
|
@@ -641,7 +627,7 @@ workflow_next_action() {
|
|
|
641
627
|
target="$(workflow_target_branch)"
|
|
642
628
|
current_branch="$(workflow_current_branch)"
|
|
643
629
|
if workflow_is_linked_worktree && [[ -n "$current_branch" && "$current_branch" != "$target" ]]; then
|
|
644
|
-
printf '
|
|
630
|
+
printf 'review\t/review\tCheck evidence passed. Freshly review user intent, affected domains, downstream consumers, and state transitions; then finish this contract worktree.\n'
|
|
645
631
|
return 0
|
|
646
632
|
fi
|
|
647
633
|
fi
|
|
@@ -1282,151 +1268,10 @@ workflow_write_run_summary() {
|
|
|
1282
1268
|
EOF_RUN
|
|
1283
1269
|
}
|
|
1284
1270
|
|
|
1285
|
-
workflow_review_recommends_pass() {
|
|
1286
|
-
local review_file="${1:-}"
|
|
1287
|
-
[[ -n "$review_file" && -f "$review_file" ]] || return 1
|
|
1288
|
-
grep -Eq '^> \*\*Recommendation\*\*:[[:space:]]*pass[[:space:]]*$' "$review_file"
|
|
1289
|
-
}
|
|
1290
|
-
|
|
1291
|
-
workflow_external_acceptance_expected_reviewer() {
|
|
1292
|
-
local host="${HOOK_HOST:-}"
|
|
1293
|
-
|
|
1294
|
-
if [[ -z "$host" ]]; then
|
|
1295
|
-
if [[ -n "${CODEX_RUN_ID:-}${CODEX_SESSION_ID:-}${CODEX_THREAD_ID:-}${CODEX_SHELL:-}${CODEX_INTERNAL_ORIGINATOR_OVERRIDE:-}" ]]; then
|
|
1296
|
-
host="codex"
|
|
1297
|
-
elif [[ -n "${CLAUDE_RUN_ID:-}${CLAUDE_SESSION_ID:-}" ]]; then
|
|
1298
|
-
host="claude"
|
|
1299
|
-
else
|
|
1300
|
-
host="claude"
|
|
1301
|
-
fi
|
|
1302
|
-
fi
|
|
1303
|
-
|
|
1304
|
-
if [[ "$host" == "codex" ]]; then
|
|
1305
|
-
printf 'Claude'
|
|
1306
|
-
else
|
|
1307
|
-
printf 'Codex'
|
|
1308
|
-
fi
|
|
1309
|
-
}
|
|
1310
|
-
|
|
1311
|
-
workflow_external_acceptance_source_for_reviewer() {
|
|
1312
|
-
local reviewer="${1:-}"
|
|
1313
|
-
case "$(printf '%s' "$reviewer" | tr '[:upper:]' '[:lower:]')" in
|
|
1314
|
-
claude) printf 'claude-review' ;;
|
|
1315
|
-
*) printf 'codex-review' ;;
|
|
1316
|
-
esac
|
|
1317
|
-
}
|
|
1318
|
-
|
|
1319
|
-
workflow_external_acceptance_expected_source() {
|
|
1320
|
-
local reviewer="${1:-}"
|
|
1321
|
-
reviewer="${reviewer:-$(workflow_external_acceptance_expected_reviewer)}"
|
|
1322
|
-
workflow_external_acceptance_source_for_reviewer "$reviewer"
|
|
1323
|
-
}
|
|
1324
|
-
|
|
1325
|
-
workflow_external_acceptance_section() {
|
|
1326
|
-
local review_file="${1:-}"
|
|
1327
|
-
[[ -n "$review_file" && -f "$review_file" ]] || return 1
|
|
1328
|
-
awk '
|
|
1329
|
-
/^##[[:space:]]+External Acceptance Advice[[:space:]]*$/ { in_section = 1; next }
|
|
1330
|
-
/^##[[:space:]]+/ && in_section { exit }
|
|
1331
|
-
in_section { print }
|
|
1332
|
-
' "$review_file"
|
|
1333
|
-
}
|
|
1334
|
-
|
|
1335
|
-
workflow_external_acceptance_field() {
|
|
1336
|
-
local section="${1:-}"
|
|
1337
|
-
local label="${2:-}"
|
|
1338
|
-
printf '%s\n' "$section" |
|
|
1339
|
-
sed -nE "s/^> \\*\\*${label}\\*\\*:[[:space:]]*([^[:space:]].*)[[:space:]]*$/\\1/p" |
|
|
1340
|
-
head -n 1 |
|
|
1341
|
-
sed -E 's/[[:space:]]+$//'
|
|
1342
|
-
}
|
|
1343
|
-
|
|
1344
|
-
workflow_external_acceptance_status() {
|
|
1345
|
-
local review_file="${1:-}"
|
|
1346
|
-
local expected_reviewer="${2:-}"
|
|
1347
|
-
local expected_source section acceptance reviewer source p1_blockers manual_override
|
|
1348
|
-
local acceptance_lc reviewer_lc source_lc expected_reviewer_lc expected_source_lc p1_lc
|
|
1349
|
-
|
|
1350
|
-
expected_reviewer="${expected_reviewer:-$(workflow_external_acceptance_expected_reviewer)}"
|
|
1351
|
-
expected_source="$(workflow_external_acceptance_expected_source "$expected_reviewer")"
|
|
1352
|
-
|
|
1353
|
-
if [[ -z "$review_file" || ! -f "$review_file" ]]; then
|
|
1354
|
-
printf 'missing\t-\t-\tExternal acceptance review file is missing: %s\n' "${review_file:-tasks/reviews/<slug>.review.md}"
|
|
1355
|
-
return 0
|
|
1356
|
-
fi
|
|
1357
|
-
|
|
1358
|
-
section="$(workflow_external_acceptance_section "$review_file" || true)"
|
|
1359
|
-
if [[ -z "$section" ]]; then
|
|
1360
|
-
printf 'missing\t-\t-\tExternal acceptance section is missing from %s.\n' "$review_file"
|
|
1361
|
-
return 0
|
|
1362
|
-
fi
|
|
1363
|
-
|
|
1364
|
-
acceptance="$(workflow_external_acceptance_field "$section" "External Acceptance")"
|
|
1365
|
-
reviewer="$(workflow_external_acceptance_field "$section" "External Reviewer")"
|
|
1366
|
-
source="$(workflow_external_acceptance_field "$section" "External Source")"
|
|
1367
|
-
p1_blockers="$(
|
|
1368
|
-
printf '%s\n' "$section" |
|
|
1369
|
-
sed -nE 's/^- P1 blockers:[[:space:]]*([^[:space:]].*)[[:space:]]*$/\1/p' |
|
|
1370
|
-
head -n 1 |
|
|
1371
|
-
sed -E 's/[[:space:]]+$//'
|
|
1372
|
-
)"
|
|
1373
|
-
manual_override="$(
|
|
1374
|
-
printf '%s\n' "$section" |
|
|
1375
|
-
sed -nE 's/^-?[[:space:]]*Manual Override:[[:space:]]*([^[:space:]].*)[[:space:]]*$/\1/p' |
|
|
1376
|
-
head -n 1 |
|
|
1377
|
-
sed -E 's/[[:space:]]+$//'
|
|
1378
|
-
)"
|
|
1379
|
-
|
|
1380
|
-
if [[ -n "$manual_override" ]]; then
|
|
1381
|
-
printf 'manual_override\t%s\t%s\tManual override recorded for external acceptance: %s\n' "${reviewer:--}" "${source:--}" "$manual_override"
|
|
1382
|
-
return 0
|
|
1383
|
-
fi
|
|
1384
|
-
|
|
1385
|
-
acceptance_lc="$(printf '%s' "$acceptance" | tr '[:upper:]' '[:lower:]')"
|
|
1386
|
-
reviewer_lc="$(printf '%s' "$reviewer" | tr '[:upper:]' '[:lower:]')"
|
|
1387
|
-
source_lc="$(printf '%s' "$source" | tr '[:upper:]' '[:lower:]')"
|
|
1388
|
-
expected_reviewer_lc="$(printf '%s' "$expected_reviewer" | tr '[:upper:]' '[:lower:]')"
|
|
1389
|
-
expected_source_lc="$(printf '%s' "$expected_source" | tr '[:upper:]' '[:lower:]')"
|
|
1390
|
-
p1_lc="$(printf '%s' "$p1_blockers" | tr '[:upper:]' '[:lower:]')"
|
|
1391
|
-
|
|
1392
|
-
if [[ "$acceptance_lc" != "pass" ]]; then
|
|
1393
|
-
printf 'fail\t%s\t%s\tExternal acceptance is %s; expected pass from %s via %s.\n' "${reviewer:--}" "${source:--}" "${acceptance:-missing}" "$expected_reviewer" "$expected_source"
|
|
1394
|
-
return 0
|
|
1395
|
-
fi
|
|
1396
|
-
|
|
1397
|
-
if [[ "$reviewer_lc" != "$expected_reviewer_lc" ]]; then
|
|
1398
|
-
printf 'fail\t%s\t%s\tExternal reviewer is %s; expected %s.\n' "${reviewer:--}" "${source:--}" "${reviewer:-missing}" "$expected_reviewer"
|
|
1399
|
-
return 0
|
|
1400
|
-
fi
|
|
1401
|
-
|
|
1402
|
-
if [[ "$source_lc" != "$expected_source_lc" ]]; then
|
|
1403
|
-
printf 'fail\t%s\t%s\tExternal source is %s; expected %s.\n' "${reviewer:--}" "${source:--}" "${source:-missing}" "$expected_source"
|
|
1404
|
-
return 0
|
|
1405
|
-
fi
|
|
1406
|
-
|
|
1407
|
-
if [[ "$p1_lc" != "none" ]]; then
|
|
1408
|
-
printf 'fail\t%s\t%s\tExternal acceptance has P1 blockers: %s\n' "${reviewer:--}" "${source:--}" "${p1_blockers:-missing}"
|
|
1409
|
-
return 0
|
|
1410
|
-
fi
|
|
1411
|
-
|
|
1412
|
-
printf 'pass\t%s\t%s\tExternal acceptance passed.\n' "$reviewer" "$source"
|
|
1413
|
-
}
|
|
1414
|
-
|
|
1415
|
-
workflow_external_acceptance_pass() {
|
|
1416
|
-
local review_file="${1:-}"
|
|
1417
|
-
local expected_reviewer="${2:-}"
|
|
1418
|
-
local row status
|
|
1419
|
-
|
|
1420
|
-
row="$(workflow_external_acceptance_status "$review_file" "$expected_reviewer")"
|
|
1421
|
-
status="${row%%$'\t'*}"
|
|
1422
|
-
[[ "$status" == "pass" || "$status" == "manual_override" ]]
|
|
1423
|
-
}
|
|
1424
|
-
|
|
1425
1271
|
workflow_checks_pass() {
|
|
1426
1272
|
local checks_file="${1:-}"
|
|
1427
1273
|
local contract_file="${2:-}"
|
|
1428
|
-
local
|
|
1429
|
-
local status source exit_code check_contract check_review
|
|
1274
|
+
local status source exit_code check_contract
|
|
1430
1275
|
|
|
1431
1276
|
if [[ -z "$checks_file" || ! -s "$checks_file" ]]; then
|
|
1432
1277
|
echo "Structured checks file is missing or empty: ${checks_file:-"(none)"}"
|
|
@@ -1438,7 +1283,6 @@ workflow_checks_pass() {
|
|
|
1438
1283
|
source="$(jq -r '.source // empty' "$checks_file" 2>/dev/null || true)"
|
|
1439
1284
|
exit_code="$(jq -r '.exit_code // empty' "$checks_file" 2>/dev/null || true)"
|
|
1440
1285
|
check_contract="$(jq -r '.contract.file // .contract // empty' "$checks_file" 2>/dev/null || true)"
|
|
1441
|
-
check_review="$(jq -r '.review.file // .review // empty' "$checks_file" 2>/dev/null || true)"
|
|
1442
1286
|
|
|
1443
1287
|
if [[ "$status" != "pass" ]]; then
|
|
1444
1288
|
echo "Structured checks are not passing in $checks_file (status=${status:-missing})."
|
|
@@ -1456,10 +1300,6 @@ workflow_checks_pass() {
|
|
|
1456
1300
|
echo "Structured checks are stale for contract ${check_contract:-missing}; expected $contract_file."
|
|
1457
1301
|
return 1
|
|
1458
1302
|
fi
|
|
1459
|
-
if [[ -n "$review_file" && "$check_review" != "$review_file" ]]; then
|
|
1460
|
-
echo "Structured checks are stale for review ${check_review:-missing}; expected $review_file."
|
|
1461
|
-
return 1
|
|
1462
|
-
fi
|
|
1463
1303
|
return 0
|
|
1464
1304
|
fi
|
|
1465
1305
|
|
|
@@ -1479,10 +1319,6 @@ workflow_checks_pass() {
|
|
|
1479
1319
|
echo "Structured checks do not reference current contract $contract_file."
|
|
1480
1320
|
return 1
|
|
1481
1321
|
fi
|
|
1482
|
-
if [[ -n "$review_file" ]] && ! grep -Fq "\"file\":\"$review_file\"" "$checks_file" && ! grep -Fq "\"file\": \"$review_file\"" "$checks_file"; then
|
|
1483
|
-
echo "Structured checks do not reference current review $review_file."
|
|
1484
|
-
return 1
|
|
1485
|
-
fi
|
|
1486
1322
|
}
|
|
1487
1323
|
|
|
1488
1324
|
workflow_contract_allows_path() {
|
|
@@ -1512,7 +1348,7 @@ workflow_contract_allows_path() {
|
|
|
1512
1348
|
section="allowed_paths"
|
|
1513
1349
|
continue
|
|
1514
1350
|
;;
|
|
1515
|
-
exit_criteria:|files_exist:|tests_pass:|commands_succeed:|files_contain:|artifacts_exist
|
|
1351
|
+
exit_criteria:|files_exist:|tests_pass:|commands_succeed:|files_contain:|artifacts_exist:)
|
|
1516
1352
|
section=""
|
|
1517
1353
|
continue
|
|
1518
1354
|
;;
|
|
@@ -47,9 +47,15 @@ case "$tool_name" in
|
|
|
47
47
|
;;
|
|
48
48
|
esac
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
# An event source is explicit evidence. Inherited host variables are only a
|
|
51
|
+
# fallback for payloads that omit it, such as local compatibility shims.
|
|
52
|
+
if [[ "$session_source" =~ [Cc]odex ]]; then
|
|
51
53
|
host="codex"
|
|
52
|
-
elif [[
|
|
54
|
+
elif [[ "$session_source" =~ [Cc]laude ]]; then
|
|
55
|
+
host="claude"
|
|
56
|
+
elif [[ -n "${CODEX_SESSION_ID:-${CODEX_AGENT_NAME:-}}" ]]; then
|
|
57
|
+
host="codex"
|
|
58
|
+
elif [[ -n "${CLAUDE_SESSION_ID:-${CLAUDE_AGENT_NAME:-}}" ]]; then
|
|
53
59
|
host="claude"
|
|
54
60
|
fi
|
|
55
61
|
|
|
@@ -79,17 +79,13 @@ is_workflow_surface_path() {
|
|
|
79
79
|
|
|
80
80
|
edit_plan_gate_mode() {
|
|
81
81
|
local mode="${FORGE_EDIT_PLAN_GATE:-}"
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
fi
|
|
85
|
-
printf '%s' "$mode"
|
|
82
|
+
[[ -z "$mode" ]] && mode="$(workflow_policy_get '.guards.edit_plan_gate' 'advice')"
|
|
83
|
+
[[ "$mode" == "off" ]] && printf 'off' || printf 'advice'
|
|
86
84
|
}
|
|
87
85
|
|
|
88
|
-
#
|
|
89
|
-
#
|
|
90
|
-
#
|
|
91
|
-
# off path + plan state. Modes: advice (default) | enforce | off, via
|
|
92
|
-
# FORGE_EDIT_PLAN_GATE or policy .guards.edit_plan_gate.
|
|
86
|
+
# Plan/spec lifecycle is Controller context, never write authorization. This
|
|
87
|
+
# compatibility hook may advise; real enforcement remains path/private-surface,
|
|
88
|
+
# authorization, lease and fencing boundaries.
|
|
93
89
|
run_edit_plan_gate() {
|
|
94
90
|
local mode gate_plan gate_status
|
|
95
91
|
mode="$(edit_plan_gate_mode)"
|
|
@@ -99,31 +95,13 @@ run_edit_plan_gate() {
|
|
|
99
95
|
|
|
100
96
|
if [[ ! -f "docs/spec.md" ]]; then
|
|
101
97
|
echo "[SpecGuard] Implementation edit without docs/spec.md: $FILE_PATH"
|
|
102
|
-
|
|
103
|
-
echo "[SpecGuard] Advisory: run bash scripts/new-spec.sh and capture stable product intent."
|
|
104
|
-
else
|
|
105
|
-
hook_structured_error \
|
|
106
|
-
"SpecGuard" \
|
|
107
|
-
"Implementation edit to $FILE_PATH without docs/spec.md." \
|
|
108
|
-
"Run bash scripts/new-spec.sh and capture stable product intent before implementing." \
|
|
109
|
-
"missing_artifact"
|
|
110
|
-
exit 2
|
|
111
|
-
fi
|
|
98
|
+
echo "[SpecGuard] Advisory: capture stable product intent when it materially helps this change."
|
|
112
99
|
fi
|
|
113
100
|
|
|
114
101
|
gate_plan="$(get_active_plan || true)"
|
|
115
102
|
if [[ -z "$gate_plan" || ! -f "$gate_plan" ]]; then
|
|
116
103
|
echo "[PlanStatusGuard] No active plan covers implementation edit: $FILE_PATH"
|
|
117
|
-
|
|
118
|
-
echo "[PlanStatusGuard] Advisory: capture the approved plan with bash scripts/capture-plan.sh --slug <slug> --title <title> --status Approved --execute"
|
|
119
|
-
else
|
|
120
|
-
hook_structured_error \
|
|
121
|
-
"PlanStatusGuard" \
|
|
122
|
-
"Implementation edit to $FILE_PATH without an active plan." \
|
|
123
|
-
"Capture the approved planning output with bash scripts/capture-plan.sh --slug <slug> --title <title> --status Approved --execute, or set policy .guards.edit_plan_gate to advice/off for this repo." \
|
|
124
|
-
"missing_artifact"
|
|
125
|
-
exit 2
|
|
126
|
-
fi
|
|
104
|
+
echo "[PlanStatusGuard] Advisory: use a Plan only when ChatGPT has chosen staged/dependency coordination."
|
|
127
105
|
return 0
|
|
128
106
|
fi
|
|
129
107
|
|
|
@@ -131,16 +109,7 @@ run_edit_plan_gate() {
|
|
|
131
109
|
case "$gate_status" in
|
|
132
110
|
Draft|Annotating)
|
|
133
111
|
echo "[PlanStatusGuard] Plan status is '$gate_status' in $gate_plan; implementation edit: $FILE_PATH"
|
|
134
|
-
|
|
135
|
-
echo "[PlanStatusGuard] Advisory: complete the annotation cycle and move the plan to Approved before implementation."
|
|
136
|
-
else
|
|
137
|
-
hook_structured_error \
|
|
138
|
-
"PlanStatusGuard" \
|
|
139
|
-
"Implementation edit to $FILE_PATH while plan status is $gate_status in $gate_plan." \
|
|
140
|
-
"Complete the annotation cycle and move the plan to Approved before implementation." \
|
|
141
|
-
"state_violation"
|
|
142
|
-
exit 2
|
|
143
|
-
fi
|
|
112
|
+
echo "[PlanStatusGuard] Advisory: this Plan is not execution-ready; ordinary Direct work remains independent."
|
|
144
113
|
;;
|
|
145
114
|
esac
|
|
146
115
|
}
|