@moretea-labs/forge 1.6.0 → 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 +26 -0
- package/CLAUDE.md +2 -0
- package/README.md +2 -2
- package/README.zh-CN.md +1 -1
- 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/prompt-guard.sh +5 -81
- 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 +1 -1
- package/assets/reference-configs/document-generation.md +1 -1
- package/assets/reference-configs/harness-overview.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 +11 -36
- 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/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 +26 -6
- package/docs/operations/controller-performance-and-502.md +124 -0
- package/docs/operations/controller-reliability-runbook.md +1 -1
- package/docs/operations/features.md +2 -2
- 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/wiki/Architecture.md +6 -6
- package/docs/wiki/Implementation.md +2 -2
- package/docs/wiki/Integrations.md +2 -2
- 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-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-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/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/init-hook.ts +3 -3
- package/src/cli/commands/mcp.ts +9 -5
- package/src/cli/commands/plugin.ts +1 -1
- 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 +785 -469
- 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/installer/managed-entries.ts +15 -1
- package/src/cli/local-bridge/console-automations.ts +54 -78
- package/src/cli/local-bridge/console-view-models.ts +1 -35
- package/src/cli/local-bridge/facade-api.ts +0 -217
- package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
- package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
- package/src/cli/local-bridge/frontend/src/styles.css +1 -1
- package/src/cli/local-bridge/frontend/src/types.ts +5 -8
- package/src/cli/local-bridge/job-store.ts +1 -490
- package/src/cli/local-bridge/server.ts +0 -513
- package/src/cli/local-bridge/ui-dist/app.css +1 -1
- package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
- 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/repository-tools.ts +247 -107
- package/src/cli/mcp/server.ts +537 -111
- 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 +101 -14
- package/src/cli/mcp/transports/session-registry.ts +43 -5
- package/src/cli/mcp/types.ts +3 -3
- package/src/cli/repositories/command-classifier.ts +101 -19
- 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/selected-path-actions.ts +17 -9
- package/src/cli/repositories/structured-git.ts +61 -3
- package/src/cli/repository/inspector.ts +553 -63
- 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 +47 -8
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
- package/src/runtime/control-plane/execution/session-store.ts +18 -0
- 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 +143 -8
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +85 -8
- 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 +132 -1
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +2 -0
- package/src/runtime/control-plane/facade/goal-workloop.ts +686 -129
- package/src/runtime/control-plane/facade/index.ts +1 -0
- package/src/runtime/control-plane/facade/plan-contract-store.ts +185 -20
- 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 +22 -5
- package/src/runtime/control-plane/facade/work-contract-store.ts +175 -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 +355 -116
- 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/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 +13 -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 +51 -4
- package/src/runtime/execution/process-runtime/check-result.ts +53 -0
- package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
- package/src/runtime/execution/process-runtime/command-facade.ts +345 -40
- package/src/runtime/execution/process-runtime/gc.ts +38 -6
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
- package/src/runtime/execution/process-runtime/persisted-check.ts +47 -4
- package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
- package/src/runtime/execution/process-runtime/runtime.ts +43 -3
- package/src/runtime/execution/process-runtime/store.ts +1 -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 +1192 -114
- package/src/runtime/gateway/mcp/process-tools.ts +83 -37
- package/src/runtime/gateway/mcp/router.ts +184 -82
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
- package/src/runtime/gateway/mcp/runtime-tools.ts +2224 -1589
- package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
- package/src/runtime/plugins/browser-adapter.ts +2901 -241
- package/src/runtime/plugins/browser-automation-service.ts +10 -0
- package/src/runtime/plugins/browser-handoff.ts +92 -2
- package/src/runtime/plugins/browser-macos-bridge.ts +582 -49
- 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 +8 -2
- package/src/runtime/plugins/external-adapter.ts +324 -3
- package/src/runtime/plugins/external-unix-socket.ts +7 -1
- package/src/runtime/plugins/first-party-registry.ts +2 -0
- package/src/runtime/plugins/github-adapter.ts +125 -0
- 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 +123 -6
- 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 +49 -8
- package/src/runtime/plugins/resend-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +269 -29
- package/src/runtime/plugins/types.ts +35 -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/maintenance-executor.ts +393 -28
- 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 +19 -0
- package/src/runtime/root/release-store.ts +48 -11
- package/src/runtime/root/runtime.ts +23 -5
- package/src/runtime/root/service.ts +100 -29
- package/src/runtime/root/types.ts +2 -0
- package/src/runtime/safe-tooling/ios-development.ts +321 -63
- 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 +700 -92
- 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 +81 -3
- package/src/runtime/workflow/schedules/engine.ts +287 -151
- 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 +2 -4
- package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
- 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/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 -459
- package/docs/architecture/current/codegraph-context-provider.md +0 -238
- 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 -373
- package/docs/architecture/current/entity-model.md +0 -612
- 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 -169
- 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 -321
- 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 -93
- 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/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
|
@@ -456,8 +456,7 @@ finish_worktree() {
|
|
|
456
456
|
exit 1
|
|
457
457
|
fi
|
|
458
458
|
|
|
459
|
-
local current_branch slug active_plan contract_file
|
|
460
|
-
local external_status external_state external_reviewer external_source external_message
|
|
459
|
+
local current_branch slug active_plan contract_file target_worktree artifact_stem
|
|
461
460
|
current_branch="$(git branch --show-current)"
|
|
462
461
|
[[ -n "$current_branch" ]] || { echo "contract-worktree: detached HEAD is not supported" >&2; exit 1; }
|
|
463
462
|
[[ "$current_branch" != "$target_branch" ]] || { echo "contract-worktree: already on target branch $target_branch" >&2; exit 1; }
|
|
@@ -470,7 +469,6 @@ finish_worktree() {
|
|
|
470
469
|
active_plan="$(get_active_plan || true)"
|
|
471
470
|
if [[ -n "$active_plan" ]]; then
|
|
472
471
|
contract_file="$(workflow_active_contract || true)"
|
|
473
|
-
review_file="$(workflow_active_review || true)"
|
|
474
472
|
fi
|
|
475
473
|
fi
|
|
476
474
|
|
|
@@ -483,27 +481,9 @@ finish_worktree() {
|
|
|
483
481
|
contract_file="tasks/contracts/${artifact_stem}.contract.md"
|
|
484
482
|
fi
|
|
485
483
|
fi
|
|
486
|
-
if [[ -n "${active_plan:-}" && -z "${review_file:-}" ]]; then
|
|
487
|
-
artifact_stem="${artifact_stem:-$(derive_artifact_stem_from_plan "$active_plan")}"
|
|
488
|
-
if [[ -f "tasks/reviews/${artifact_stem}.review.md" ]] || [[ ! -f "tasks/reviews/${slug}.review.md" ]]; then
|
|
489
|
-
review_file="tasks/reviews/${artifact_stem}.review.md"
|
|
490
|
-
fi
|
|
491
|
-
fi
|
|
492
484
|
contract_file="${contract_file:-tasks/contracts/${slug}.contract.md}"
|
|
493
|
-
review_file="${review_file:-tasks/reviews/${slug}.review.md}"
|
|
494
485
|
|
|
495
486
|
[[ -n "$contract_file" && -f "$contract_file" ]] || { echo "contract-worktree: no active sprint contract found" >&2; exit 1; }
|
|
496
|
-
[[ -n "$review_file" && -f "$review_file" ]] || { echo "contract-worktree: no active sprint review found" >&2; exit 1; }
|
|
497
|
-
|
|
498
|
-
if declare -F workflow_external_acceptance_status >/dev/null 2>&1; then
|
|
499
|
-
external_status="$(workflow_external_acceptance_status "$review_file")"
|
|
500
|
-
IFS=$'\t' read -r external_state external_reviewer external_source external_message <<< "$external_status"
|
|
501
|
-
if [[ "$external_state" != "pass" && "$external_state" != "manual_override" ]]; then
|
|
502
|
-
echo "contract-worktree: external acceptance gate failed: ${external_message:-missing external acceptance}" >&2
|
|
503
|
-
echo "contract-worktree: record ## External Acceptance Advice in $review_file via $(workflow_external_acceptance_expected_source) before finish" >&2
|
|
504
|
-
exit 1
|
|
505
|
-
fi
|
|
506
|
-
fi
|
|
507
487
|
|
|
508
488
|
check_architecture_freshness "$target_branch"
|
|
509
489
|
bash "scripts/verify-sprint.sh"
|
|
@@ -348,7 +348,7 @@ Complete this inventory before implementation. If any line is unknown, keep the
|
|
|
348
348
|
|
|
349
349
|
- **State/progress path**:
|
|
350
350
|
- **Verification evidence**:
|
|
351
|
-
- **
|
|
351
|
+
- **Impact review**:
|
|
352
352
|
- **Stop condition**:
|
|
353
353
|
- **Rollback surface**:
|
|
354
354
|
|
|
@@ -391,7 +391,7 @@ Describe the exact outcome this task must deliver.
|
|
|
391
391
|
- Checks file: `.ai/harness/checks/latest.json`
|
|
392
392
|
- Run snapshots: `.ai/harness/runs/`
|
|
393
393
|
- Scope gate: edit only paths listed under `allowed_paths`; update this contract before widening scope.
|
|
394
|
-
- Completion
|
|
394
|
+
- Completion evidence: `scripts/verify-sprint.sh` reports this contract's direct checks and declared scope. Then perform a fresh semantic impact review.
|
|
395
395
|
|
|
396
396
|
## Allowed Paths
|
|
397
397
|
|
|
@@ -473,48 +473,23 @@ CONTRACT_TEMPLATE_EOF
|
|
|
473
473
|
> **Notes File**: {{NOTES_FILE}}
|
|
474
474
|
> **Checks File**: {{CHECKS_FILE}}
|
|
475
475
|
> **Last Updated**: {{TIMESTAMP}}
|
|
476
|
-
> **
|
|
476
|
+
> **Summary**:
|
|
477
477
|
|
|
478
|
-
##
|
|
478
|
+
## Semantic Impact Review
|
|
479
479
|
|
|
480
|
-
-
|
|
481
|
-
-
|
|
482
|
-
-
|
|
483
|
-
-
|
|
484
|
-
-
|
|
485
|
-
- External acceptance: unavailable
|
|
486
|
-
- Residual risks:
|
|
487
|
-
- Reviewer action required: inspect diff and card
|
|
488
|
-
- Rollback:
|
|
480
|
+
- User intent:
|
|
481
|
+
- Affected domains and downstream consumers:
|
|
482
|
+
- State transitions and persistence/restart impact:
|
|
483
|
+
- Missing impact areas or uncertainty:
|
|
484
|
+
- Residual risks and recovery:
|
|
489
485
|
|
|
490
486
|
## Verification Evidence
|
|
491
487
|
|
|
492
|
-
-
|
|
488
|
+
- Focused/full checks:
|
|
493
489
|
- Commands run:
|
|
494
490
|
- Manual checks:
|
|
495
491
|
- Supporting artifacts:
|
|
496
492
|
|
|
497
|
-
## External Acceptance Advice
|
|
498
|
-
|
|
499
|
-
> **External Acceptance**: unavailable
|
|
500
|
-
> **External Reviewer**:
|
|
501
|
-
> **External Source**:
|
|
502
|
-
> **External Started**:
|
|
503
|
-
> **External Completed**:
|
|
504
|
-
|
|
505
|
-
- P1 blockers:
|
|
506
|
-
- P2 advisories:
|
|
507
|
-
- Acceptance checklist:
|
|
508
|
-
|
|
509
|
-
## Scorecard
|
|
510
|
-
|
|
511
|
-
| Dimension | Score | Notes |
|
|
512
|
-
|-----------|-------|-------|
|
|
513
|
-
| Functionality | 0/10 | |
|
|
514
|
-
| Product depth | 0/10 | |
|
|
515
|
-
| Design quality | 0/10 | |
|
|
516
|
-
| Code quality | 0/10 | |
|
|
517
|
-
|
|
518
493
|
## Failing Items
|
|
519
494
|
|
|
520
495
|
- ...
|
|
@@ -908,7 +883,7 @@ ARCHITECTURE_INDEX_EOF
|
|
|
908
883
|
"plan_capture": {
|
|
909
884
|
"script": "scripts/capture-plan.sh",
|
|
910
885
|
"sources": ["host-plan-mode", "forge-plan"],
|
|
911
|
-
"rule": "
|
|
886
|
+
"rule": "Codex Plan mode and Waza think planning should capture decision-complete plans into plans/plan-*.md; implementation approval then projects the active approved plan through scripts/plan-to-todo.sh"
|
|
912
887
|
},
|
|
913
888
|
"planning": {
|
|
914
889
|
"pending_orchestration_file": ".ai/harness/planning/pending.json",
|
|
@@ -916,8 +891,8 @@ ARCHITECTURE_INDEX_EOF
|
|
|
916
891
|
},
|
|
917
892
|
"guards": {
|
|
918
893
|
"edit_plan_gate": "advice",
|
|
919
|
-
"edit_plan_gate_modes": ["
|
|
920
|
-
"rule": "pre-edit-guard
|
|
894
|
+
"edit_plan_gate_modes": ["advice", "off"],
|
|
895
|
+
"rule": "pre-edit-guard may expose Plan/spec context, but Plan lifecycle never authorizes implementation; only real safety/resource boundaries block execution"
|
|
921
896
|
},
|
|
922
897
|
"sidecar_research": {
|
|
923
898
|
"default": true,
|
|
@@ -998,16 +973,16 @@ ARCHITECTURE_INDEX_EOF
|
|
|
998
973
|
"routing": {
|
|
999
974
|
"primary": "forge",
|
|
1000
975
|
"optional_complex_helper": "gstack",
|
|
1001
|
-
"
|
|
976
|
+
"optional_daily_helper": "waza",
|
|
1002
977
|
"optional_knowledge_helper": "gbrain"
|
|
1003
978
|
},
|
|
1004
979
|
"hosts": [
|
|
1005
980
|
"claude-code",
|
|
1006
981
|
"codex"
|
|
1007
982
|
],
|
|
1008
|
-
"mode": "optional-
|
|
983
|
+
"mode": "optional-enhancements",
|
|
1009
984
|
"detection": "init-migrate",
|
|
1010
|
-
"
|
|
985
|
+
"readiness_report": "scripts/check-agent-tooling.sh --host codex",
|
|
1011
986
|
"waza": {
|
|
1012
987
|
"source_repo": "tw93/Waza",
|
|
1013
988
|
"source_url": "https://github.com/tw93/Waza.git",
|
|
@@ -1021,12 +996,12 @@ ARCHITECTURE_INDEX_EOF
|
|
|
1021
996
|
"codex_automation_profile": {
|
|
1022
997
|
"required_skills": [],
|
|
1023
998
|
"optional_skills": ["health", "check", "mermaid"],
|
|
1024
|
-
"mode": "codex-runtime-reference",
|
|
999
|
+
"mode": "optional-codex-runtime-reference",
|
|
1025
1000
|
"source": "~/.codex/skills",
|
|
1026
1001
|
"routes": {
|
|
1027
|
-
"
|
|
1028
|
-
"
|
|
1029
|
-
"
|
|
1002
|
+
"workflow_health_optional": "waza:health",
|
|
1003
|
+
"review_helper_optional": "waza:check",
|
|
1004
|
+
"architecture_diagram_optional": "mermaid"
|
|
1030
1005
|
},
|
|
1031
1006
|
"vendoring_policy": "do-not-vendor-skill-body"
|
|
1032
1007
|
},
|
|
@@ -1047,7 +1022,7 @@ ARCHITECTURE_INDEX_EOF
|
|
|
1047
1022
|
"codex_config_path": "~/.codex/config.toml",
|
|
1048
1023
|
"claude_config_path": "~/.claude.json",
|
|
1049
1024
|
"index_dir": ".codegraph",
|
|
1050
|
-
"readiness": "
|
|
1025
|
+
"readiness": "forge-bundled-backend; host-mcp-optional",
|
|
1051
1026
|
"hook_policy": "do-not-block-hooks",
|
|
1052
1027
|
"install_command": "bun add -g @colbymchenry/codegraph && forge tools configure codegraph --target codex --location global",
|
|
1053
1028
|
"project_init_command": "codegraph init -i .",
|
|
@@ -1057,14 +1032,6 @@ ARCHITECTURE_INDEX_EOF
|
|
|
1057
1032
|
},
|
|
1058
1033
|
"agentic_development": {
|
|
1059
1034
|
"routing": {
|
|
1060
|
-
"small_bounded_change": "forge:/direct",
|
|
1061
|
-
"planning": "forge:/plan",
|
|
1062
|
-
"bug_or_regression": "forge:/debug",
|
|
1063
|
-
"post_implementation_review": "forge:/review",
|
|
1064
|
-
"release": "forge:/release",
|
|
1065
|
-
"scale": "forge:/scale"
|
|
1066
|
-
},
|
|
1067
|
-
"optional_enhancements": {
|
|
1068
1035
|
"direct": "forge:/direct",
|
|
1069
1036
|
"plan": "forge:/plan",
|
|
1070
1037
|
"debug": "forge:/debug",
|
|
@@ -1074,7 +1041,7 @@ ARCHITECTURE_INDEX_EOF
|
|
|
1074
1041
|
},
|
|
1075
1042
|
"due_diligence": {
|
|
1076
1043
|
"levels": ["P1_GLOBAL_ARCHITECTURE", "P2_DATA_FLOW_TRACE", "P3_DESIGN_DECISION"],
|
|
1077
|
-
"explicit_report_required_for": ["
|
|
1044
|
+
"explicit_report_required_for": ["architecture", "debug", "risky_refactor", "deployment", "auth_payment_data", "shared_contract"]
|
|
1078
1045
|
}
|
|
1079
1046
|
},
|
|
1080
1047
|
"enforcement": {
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
5
|
+
BUN_BIN="${BUN_BIN:-bun}"
|
|
6
|
+
RUNTIME_PORT="${FORGE_CLOUD_MCP_RUNTIME_PORT:-18765}"
|
|
7
|
+
GATEWAY_PORT="${FORGE_CLOUD_MCP_GATEWAY_PORT:-18767}"
|
|
8
|
+
HOLD_SECONDS="${FORGE_CLOUD_MCP_HOLD_SECONDS:-1500}"
|
|
9
|
+
TUNNEL_ID="${FORGE_CLOUD_TUNNEL_ID:-}"
|
|
10
|
+
TUNNEL_ALIAS="${FORGE_CLOUD_TUNNEL_ALIAS:-forge-cloud-ci}"
|
|
11
|
+
TUNNEL_CLIENT_VERSION="${FORGE_TUNNEL_CLIENT_VERSION:-v0.0.12}"
|
|
12
|
+
MCP_AUTH_MODE="${FORGE_CLOUD_MCP_AUTH_MODE:-none}"
|
|
13
|
+
RUNTIME_API_KEY="${FORGE_CLOUD_TUNNEL_RUNTIME_API_KEY:-}"
|
|
14
|
+
|
|
15
|
+
if [[ -z "$TUNNEL_ID" ]]; then
|
|
16
|
+
echo 'FORGE_CLOUD_TUNNEL_ID is required' >&2
|
|
17
|
+
exit 2
|
|
18
|
+
fi
|
|
19
|
+
if [[ -z "$RUNTIME_API_KEY" ]]; then
|
|
20
|
+
echo 'FORGE_CLOUD_TUNNEL_RUNTIME_API_KEY is required' >&2
|
|
21
|
+
exit 2
|
|
22
|
+
fi
|
|
23
|
+
if ! [[ "$HOLD_SECONDS" =~ ^[0-9]+$ ]]; then
|
|
24
|
+
echo 'FORGE_CLOUD_MCP_HOLD_SECONDS must be a non-negative integer' >&2
|
|
25
|
+
exit 2
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
TMP_ROOT="$(mktemp -d "${RUNNER_TEMP:-${TMPDIR:-/tmp}}/forge-cloud-mcp-e2e.XXXXXX")"
|
|
29
|
+
CONTROLLER_HOME="$TMP_ROOT/controller-home"
|
|
30
|
+
SETUP_LOG="$TMP_ROOT/setup.log"
|
|
31
|
+
INSTALL_JSON="$TMP_ROOT/runtime-install.json"
|
|
32
|
+
GATEWAY_LOG="$TMP_ROOT/gateway.log"
|
|
33
|
+
TUNNEL_ARCHIVE="$TMP_ROOT/tunnel-client.zip"
|
|
34
|
+
TUNNEL_DIR="$TMP_ROOT/tunnel-client"
|
|
35
|
+
TUNNEL_CLIENT="$TUNNEL_DIR/tunnel-client"
|
|
36
|
+
TUNNEL_STATUS_JSON="$TMP_ROOT/tunnel-status.json"
|
|
37
|
+
RUNTIME_PID=''
|
|
38
|
+
GATEWAY_PID=''
|
|
39
|
+
|
|
40
|
+
stop_pid() {
|
|
41
|
+
local pid="$1"
|
|
42
|
+
[[ -n "$pid" ]] || return 0
|
|
43
|
+
kill -0 "$pid" 2>/dev/null || return 0
|
|
44
|
+
kill "$pid" 2>/dev/null || true
|
|
45
|
+
for _ in $(seq 1 40); do
|
|
46
|
+
kill -0 "$pid" 2>/dev/null || return 0
|
|
47
|
+
sleep 0.25
|
|
48
|
+
done
|
|
49
|
+
kill -KILL "$pid" 2>/dev/null || true
|
|
50
|
+
for _ in $(seq 1 20); do
|
|
51
|
+
kill -0 "$pid" 2>/dev/null || return 0
|
|
52
|
+
sleep 0.1
|
|
53
|
+
done
|
|
54
|
+
return 1
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
tunnel_status_ready() {
|
|
58
|
+
"$TUNNEL_CLIENT" runtimes status "$TUNNEL_ALIAS" --json > "$TUNNEL_STATUS_JSON" 2>/dev/null || return 1
|
|
59
|
+
node - "$TUNNEL_STATUS_JSON" <<'NODE'
|
|
60
|
+
const fs = require('node:fs');
|
|
61
|
+
const status = JSON.parse(fs.readFileSync(process.argv[2], 'utf8'));
|
|
62
|
+
process.exit(status.process_running === true && status.healthy === true && status.ready === true ? 0 : 1);
|
|
63
|
+
NODE
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
print_tunnel_status_summary() {
|
|
67
|
+
if [[ ! -s "$TUNNEL_STATUS_JSON" ]]; then
|
|
68
|
+
printf 'FORGE_CLOUD_TUNNEL_STATUS unavailable\n' >&2
|
|
69
|
+
return
|
|
70
|
+
fi
|
|
71
|
+
node - "$TUNNEL_STATUS_JSON" <<'NODE'
|
|
72
|
+
const fs = require('node:fs');
|
|
73
|
+
try {
|
|
74
|
+
const status = JSON.parse(fs.readFileSync(process.argv[2], 'utf8'));
|
|
75
|
+
const flag = (name) => status[name] === true ? 'true' : status[name] === false ? 'false' : 'unknown';
|
|
76
|
+
console.error(`FORGE_CLOUD_TUNNEL_STATUS process_running=${flag('process_running')} healthy=${flag('healthy')} ready=${flag('ready')}`);
|
|
77
|
+
} catch {
|
|
78
|
+
console.error('FORGE_CLOUD_TUNNEL_STATUS unreadable');
|
|
79
|
+
}
|
|
80
|
+
NODE
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
wait_for_tunnel_ready() {
|
|
84
|
+
local attempts="$1"
|
|
85
|
+
for _ in $(seq 1 "$attempts"); do
|
|
86
|
+
if tunnel_status_ready; then
|
|
87
|
+
return 0
|
|
88
|
+
fi
|
|
89
|
+
sleep 1
|
|
90
|
+
done
|
|
91
|
+
print_tunnel_status_summary
|
|
92
|
+
return 1
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
cleanup() {
|
|
96
|
+
local original_status=$?
|
|
97
|
+
local cleanup_failed=0
|
|
98
|
+
trap - EXIT INT TERM
|
|
99
|
+
if [[ -x "$TUNNEL_CLIENT" ]]; then
|
|
100
|
+
"$TUNNEL_CLIENT" runtimes stop "$TUNNEL_ALIAS" --json >/dev/null 2>&1 || cleanup_failed=1
|
|
101
|
+
fi
|
|
102
|
+
stop_pid "$GATEWAY_PID" || cleanup_failed=1
|
|
103
|
+
stop_pid "$RUNTIME_PID" || cleanup_failed=1
|
|
104
|
+
unset RUNTIME_API_KEY
|
|
105
|
+
for _ in $(seq 1 20); do
|
|
106
|
+
rm -rf "$TMP_ROOT" 2>/dev/null || true
|
|
107
|
+
[[ ! -e "$TMP_ROOT" ]] && break
|
|
108
|
+
sleep 0.25
|
|
109
|
+
done
|
|
110
|
+
if [[ -e "$TMP_ROOT" ]]; then
|
|
111
|
+
echo 'FORGE_CLOUD_MCP_CLEANUP_FAILED: temporary root remained after bounded teardown' >&2
|
|
112
|
+
cleanup_failed=1
|
|
113
|
+
fi
|
|
114
|
+
if (( cleanup_failed != 0 )); then
|
|
115
|
+
exit 1
|
|
116
|
+
fi
|
|
117
|
+
exit "$original_status"
|
|
118
|
+
}
|
|
119
|
+
trap cleanup EXIT INT TERM
|
|
120
|
+
|
|
121
|
+
cd "$ROOT"
|
|
122
|
+
|
|
123
|
+
"$BUN_BIN" bin/forge.mjs mcp setup chatgpt \
|
|
124
|
+
--user-level \
|
|
125
|
+
--controller-home "$CONTROLLER_HOME" \
|
|
126
|
+
--host 127.0.0.1 \
|
|
127
|
+
--port "$RUNTIME_PORT" \
|
|
128
|
+
--local-controller-port $((RUNTIME_PORT + 1)) \
|
|
129
|
+
--connector-port "$GATEWAY_PORT" > "$SETUP_LOG"
|
|
130
|
+
|
|
131
|
+
# Package Runtime normally materializes its own persistent OAuth Connector from
|
|
132
|
+
# chatgpt.localEndpoint. This temporary Secure Tunnel benchmark owns the
|
|
133
|
+
# connector port itself with the explicit MCP_AUTH_MODE below, so suppress the
|
|
134
|
+
# package connector in this disposable Controller Home before installation.
|
|
135
|
+
MCP_LOCAL_CONFIG="$CONTROLLER_HOME/mcp/mcp.local.json"
|
|
136
|
+
node - "$MCP_LOCAL_CONFIG" <<'NODE'
|
|
137
|
+
const fs = require('node:fs');
|
|
138
|
+
const path = process.argv[2];
|
|
139
|
+
const config = JSON.parse(fs.readFileSync(path, 'utf8'));
|
|
140
|
+
if (!config.chatgpt || typeof config.chatgpt.localEndpoint !== 'string') {
|
|
141
|
+
console.error('FORGE_CLOUD_MCP_SETUP_LOCAL_ENDPOINT_MISSING');
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
delete config.chatgpt.localEndpoint;
|
|
145
|
+
fs.writeFileSync(path, `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
|
|
146
|
+
NODE
|
|
147
|
+
|
|
148
|
+
"$BUN_BIN" bin/forge.mjs repo register "$ROOT" \
|
|
149
|
+
--controller-home "$CONTROLLER_HOME" \
|
|
150
|
+
--json > "$TMP_ROOT/repository.json"
|
|
151
|
+
|
|
152
|
+
"$BUN_BIN" bin/forge.mjs runtime service install-package \
|
|
153
|
+
--controller-home "$CONTROLLER_HOME" \
|
|
154
|
+
--host 127.0.0.1 \
|
|
155
|
+
--port "$RUNTIME_PORT" \
|
|
156
|
+
--portable > "$INSTALL_JSON"
|
|
157
|
+
RUNTIME_PID="$(node -e "const x=require(process.argv[1]); const pid=x?.pid; if(!Number.isInteger(pid)||pid<=0) process.exit(2); process.stdout.write(String(pid))" "$INSTALL_JSON")"
|
|
158
|
+
|
|
159
|
+
curl --fail --silent --show-error \
|
|
160
|
+
--retry 30 --retry-delay 1 --retry-connrefused \
|
|
161
|
+
"http://127.0.0.1:${RUNTIME_PORT}/ready" > "$TMP_ROOT/runtime-ready.json"
|
|
162
|
+
|
|
163
|
+
FORGE_CONTROLLER_LIFECYCLE_OWNER=1 \
|
|
164
|
+
"$BUN_BIN" bin/forge.mjs mcp serve \
|
|
165
|
+
--repo "$ROOT" \
|
|
166
|
+
--controller-home "$CONTROLLER_HOME" \
|
|
167
|
+
--transport http \
|
|
168
|
+
--host 127.0.0.1 \
|
|
169
|
+
--port "$GATEWAY_PORT" \
|
|
170
|
+
--profile controller \
|
|
171
|
+
--auth "$MCP_AUTH_MODE" > "$GATEWAY_LOG" 2>&1 &
|
|
172
|
+
GATEWAY_PID=$!
|
|
173
|
+
|
|
174
|
+
case "$MCP_AUTH_MODE" in
|
|
175
|
+
oauth)
|
|
176
|
+
for _ in $(seq 1 30); do
|
|
177
|
+
if curl --fail --silent "http://127.0.0.1:${GATEWAY_PORT}/.well-known/oauth-authorization-server" > "$TMP_ROOT/local-oauth.json" 2>/dev/null; then
|
|
178
|
+
break
|
|
179
|
+
fi
|
|
180
|
+
if ! kill -0 "$GATEWAY_PID" 2>/dev/null; then
|
|
181
|
+
cat "$GATEWAY_LOG" >&2
|
|
182
|
+
exit 1
|
|
183
|
+
fi
|
|
184
|
+
sleep 1
|
|
185
|
+
done
|
|
186
|
+
test -s "$TMP_ROOT/local-oauth.json"
|
|
187
|
+
;;
|
|
188
|
+
none)
|
|
189
|
+
MCP_INITIALIZE_HEADERS="$TMP_ROOT/mcp-initialize.headers"
|
|
190
|
+
MCP_INITIALIZE_BODY="$TMP_ROOT/mcp-initialize.body"
|
|
191
|
+
MCP_INITIALIZE_PAYLOAD='{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"forge-cloud-readiness","version":"1"}}}'
|
|
192
|
+
for _ in $(seq 1 30); do
|
|
193
|
+
if curl --fail --silent --show-error \
|
|
194
|
+
--dump-header "$MCP_INITIALIZE_HEADERS" \
|
|
195
|
+
--output "$MCP_INITIALIZE_BODY" \
|
|
196
|
+
--request POST \
|
|
197
|
+
--header 'content-type: application/json' \
|
|
198
|
+
--header 'accept: application/json, text/event-stream' \
|
|
199
|
+
--data "$MCP_INITIALIZE_PAYLOAD" \
|
|
200
|
+
"http://127.0.0.1:${GATEWAY_PORT}/mcp" 2>/dev/null \
|
|
201
|
+
&& grep -Eiq '^mcp-session-id:[[:space:]]*[^[:space:]]+' "$MCP_INITIALIZE_HEADERS" \
|
|
202
|
+
&& grep -q 'forge-mcp' "$MCP_INITIALIZE_BODY"; then
|
|
203
|
+
break
|
|
204
|
+
fi
|
|
205
|
+
if ! kill -0 "$GATEWAY_PID" 2>/dev/null; then
|
|
206
|
+
cat "$GATEWAY_LOG" >&2
|
|
207
|
+
exit 1
|
|
208
|
+
fi
|
|
209
|
+
sleep 1
|
|
210
|
+
done
|
|
211
|
+
grep -Eiq '^mcp-session-id:[[:space:]]*[^[:space:]]+' "$MCP_INITIALIZE_HEADERS"
|
|
212
|
+
grep -q 'forge-mcp' "$MCP_INITIALIZE_BODY"
|
|
213
|
+
;;
|
|
214
|
+
bearer)
|
|
215
|
+
echo 'FORGE_CLOUD_MCP_AUTH_MODE=bearer is not supported by the unauthenticated Secure Tunnel connector path; use oauth or none.' >&2
|
|
216
|
+
exit 2
|
|
217
|
+
;;
|
|
218
|
+
*)
|
|
219
|
+
echo "unsupported FORGE_CLOUD_MCP_AUTH_MODE: $MCP_AUTH_MODE" >&2
|
|
220
|
+
exit 2
|
|
221
|
+
;;
|
|
222
|
+
esac
|
|
223
|
+
|
|
224
|
+
mkdir -p "$TUNNEL_DIR"
|
|
225
|
+
TUNNEL_CLIENT_ASSET="tunnel-client-${TUNNEL_CLIENT_VERSION}-linux-amd64.zip"
|
|
226
|
+
curl -LfsS \
|
|
227
|
+
"https://github.com/openai/tunnel-client/releases/download/${TUNNEL_CLIENT_VERSION}/${TUNNEL_CLIENT_ASSET}" \
|
|
228
|
+
-o "$TUNNEL_ARCHIVE"
|
|
229
|
+
unzip -q "$TUNNEL_ARCHIVE" -d "$TUNNEL_DIR"
|
|
230
|
+
chmod +x "$TUNNEL_CLIENT" "$TUNNEL_DIR/cloudflared"
|
|
231
|
+
|
|
232
|
+
FORGE_RUNTIME_API_KEY="$RUNTIME_API_KEY" \
|
|
233
|
+
"$TUNNEL_CLIENT" runtimes connect \
|
|
234
|
+
--alias "$TUNNEL_ALIAS" \
|
|
235
|
+
--tunnel-id "$TUNNEL_ID" \
|
|
236
|
+
--runtime-api-key 'env:FORGE_RUNTIME_API_KEY' \
|
|
237
|
+
--mcp-server-url "http://127.0.0.1:${GATEWAY_PORT}/mcp" \
|
|
238
|
+
--profile "$TUNNEL_ALIAS" \
|
|
239
|
+
--profile-dir "$TMP_ROOT/tunnel-profiles" \
|
|
240
|
+
--json > "$TMP_ROOT/tunnel-connect.json"
|
|
241
|
+
|
|
242
|
+
if ! wait_for_tunnel_ready 30; then
|
|
243
|
+
echo 'FORGE_CLOUD_TUNNEL_NOT_READY' >&2
|
|
244
|
+
exit 1
|
|
245
|
+
fi
|
|
246
|
+
|
|
247
|
+
printf 'FORGE_CLOUD_TUNNEL_ID=%s\n' "$TUNNEL_ID"
|
|
248
|
+
printf 'FORGE_CLOUD_TUNNEL_ALIAS=%s\n' "$TUNNEL_ALIAS"
|
|
249
|
+
printf 'FORGE_CLOUD_MCP_RUN_ID=%s\n' "${GITHUB_RUN_ID:-unknown}"
|
|
250
|
+
printf 'FORGE_CLOUD_MCP_RUNNER_OS=%s\n' "${RUNNER_OS:-unknown}"
|
|
251
|
+
printf 'FORGE_CLOUD_MCP_RUNNER_ARCH=%s\n' "${RUNNER_ARCH:-unknown}"
|
|
252
|
+
printf 'FORGE_CLOUD_MCP_AUTH_MODE=%s\n' "$MCP_AUTH_MODE"
|
|
253
|
+
|
|
254
|
+
elapsed=0
|
|
255
|
+
while (( elapsed < HOLD_SECONDS )); do
|
|
256
|
+
kill -0 "$RUNTIME_PID" 2>/dev/null || { echo 'runtime exited' >&2; exit 1; }
|
|
257
|
+
kill -0 "$GATEWAY_PID" 2>/dev/null || { cat "$GATEWAY_LOG" >&2; exit 1; }
|
|
258
|
+
if ! wait_for_tunnel_ready 5; then
|
|
259
|
+
echo 'FORGE_CLOUD_TUNNEL_LOST_READINESS' >&2
|
|
260
|
+
exit 1
|
|
261
|
+
fi
|
|
262
|
+
sleep 60
|
|
263
|
+
elapsed=$((elapsed + 60))
|
|
264
|
+
printf 'FORGE_CLOUD_MCP_HEARTBEAT elapsed=%ss tunnel_id=%s\n' "$elapsed" "$TUNNEL_ID"
|
|
265
|
+
done
|
|
@@ -44,6 +44,22 @@ const recoveryTunnelService = launchdService(
|
|
|
44
44
|
'RECOVERY_TUNNEL_SERVICE',
|
|
45
45
|
);
|
|
46
46
|
if (Boolean(recoveryTunnelService) !== Boolean(recoveryPublicUrl)) throw new Error('RECOVERY_PUBLIC_URL_AND_TUNNEL_SERVICE_MUST_BE_CONFIGURED_TOGETHER');
|
|
47
|
+
const primaryConnectorLocalUrl = endpointOption('--primary-connector-local-url');
|
|
48
|
+
const primaryConnectorBase = launchdService(
|
|
49
|
+
option('--primary-connector-service-label'),
|
|
50
|
+
option('--primary-connector-service-plist'),
|
|
51
|
+
'RECOVERY_PRIMARY_CONNECTOR',
|
|
52
|
+
);
|
|
53
|
+
if (primaryConnectorLocalUrl && !primaryConnectorBase) throw new Error('RECOVERY_PRIMARY_CONNECTOR_LABEL_REQUIRED_FOR_LOCAL_URL');
|
|
54
|
+
const primaryConnectorService = primaryConnectorBase
|
|
55
|
+
? { ...primaryConnectorBase, ...(primaryConnectorLocalUrl ? { localMcpUrl: primaryConnectorLocalUrl } : {}) }
|
|
56
|
+
: undefined;
|
|
57
|
+
const primaryPublicTunnelService = launchdService(
|
|
58
|
+
option('--primary-tunnel-service-label'),
|
|
59
|
+
option('--primary-tunnel-service-plist'),
|
|
60
|
+
'RECOVERY_PRIMARY_TUNNEL',
|
|
61
|
+
);
|
|
62
|
+
if (primaryPublicTunnelService && !primaryConnectorService) throw new Error('RECOVERY_PRIMARY_CONNECTOR_REQUIRED_FOR_PRIMARY_TUNNEL');
|
|
47
63
|
|
|
48
64
|
const result = await installStandaloneRecovery({
|
|
49
65
|
controllerHome,
|
|
@@ -54,6 +70,8 @@ const result = await installStandaloneRecovery({
|
|
|
54
70
|
publicMcpUrl,
|
|
55
71
|
recoveryPublicUrl,
|
|
56
72
|
recoveryTunnelService,
|
|
73
|
+
primaryPublicTunnelService,
|
|
74
|
+
primaryConnectorService,
|
|
57
75
|
});
|
|
58
76
|
const config = result.config;
|
|
59
77
|
console.log(JSON.stringify({
|
|
@@ -70,5 +88,11 @@ console.log(JSON.stringify({
|
|
|
70
88
|
recoveryTunnelService: config.recoveryTunnelService
|
|
71
89
|
? { platform: config.recoveryTunnelService.platform, label: config.recoveryTunnelService.label, plistPath: config.recoveryTunnelService.plistPath }
|
|
72
90
|
: undefined,
|
|
91
|
+
primaryConnectorService: config.primaryConnectorService
|
|
92
|
+
? { platform: config.primaryConnectorService.platform, label: config.primaryConnectorService.label, plistPath: config.primaryConnectorService.plistPath, localMcpUrl: config.primaryConnectorService.localMcpUrl }
|
|
93
|
+
: undefined,
|
|
94
|
+
primaryPublicTunnelService: config.primaryPublicTunnelService
|
|
95
|
+
? { platform: config.primaryPublicTunnelService.platform, label: config.primaryPublicTunnelService.label, plistPath: config.primaryPublicTunnelService.plistPath }
|
|
96
|
+
: undefined,
|
|
73
97
|
},
|
|
74
98
|
}, null, 2));
|
|
@@ -64,8 +64,6 @@ tasks/.current.md.tmp.*
|
|
|
64
64
|
.ai/harness/chatgpt/bridge-extension/
|
|
65
65
|
.ai/harness/chatgpt/tmp/
|
|
66
66
|
.ai/harness/chatgpt/sessions/
|
|
67
|
-
.ai/harness/triage/*
|
|
68
|
-
!.ai/harness/triage/.gitkeep
|
|
69
67
|
.forge/chatgpt-browser.local.json
|
|
70
68
|
.forge/chatgpt-browser.tokens.json
|
|
71
69
|
.forge/interactions/
|
|
@@ -208,7 +206,7 @@ Complete this inventory before implementation. If any line is unknown, keep the
|
|
|
208
206
|
|
|
209
207
|
- **State/progress path**:
|
|
210
208
|
- **Verification evidence**:
|
|
211
|
-
- **
|
|
209
|
+
- **Impact review**:
|
|
212
210
|
- **Stop condition**:
|
|
213
211
|
- **Rollback surface**:
|
|
214
212
|
|
|
@@ -249,7 +247,7 @@ Describe the exact outcome this task must deliver.
|
|
|
249
247
|
- Checks file: `.ai/harness/checks/latest.json`
|
|
250
248
|
- Run snapshots: `.ai/harness/runs/`
|
|
251
249
|
- Scope gate: edit only paths listed under `allowed_paths`; update this contract before widening scope.
|
|
252
|
-
- Completion
|
|
250
|
+
- Completion evidence: `scripts/verify-sprint.sh` reports the direct checks and declared scope. Then perform a fresh semantic impact review.
|
|
253
251
|
|
|
254
252
|
## Allowed Paths
|
|
255
253
|
|
|
@@ -302,7 +300,7 @@ exit_criteria:
|
|
|
302
300
|
tests_pass:
|
|
303
301
|
- path: tests/unit/{{TASK_SLUG}}.test.ts
|
|
304
302
|
commands_succeed:
|
|
305
|
-
- bun run
|
|
303
|
+
- bun run check:type
|
|
306
304
|
files_contain:
|
|
307
305
|
- path: src/modules/{{TASK_SLUG}}/index.ts
|
|
308
306
|
pattern: "export"
|
|
@@ -329,40 +327,24 @@ PI_TEMPLATE_REVIEW=$(cat <<'EOF_TEMPLATE_REVIEW'
|
|
|
329
327
|
> **Notes File**: {{NOTES_FILE}}
|
|
330
328
|
> **Checks File**: {{CHECKS_FILE}}
|
|
331
329
|
> **Last Updated**: {{TIMESTAMP}}
|
|
332
|
-
> **
|
|
330
|
+
> **Summary**:
|
|
333
331
|
|
|
334
|
-
##
|
|
332
|
+
## Semantic Impact Review
|
|
335
333
|
|
|
336
|
-
-
|
|
337
|
-
-
|
|
338
|
-
-
|
|
339
|
-
-
|
|
340
|
-
-
|
|
341
|
-
- External acceptance: unavailable
|
|
342
|
-
- Residual risks:
|
|
343
|
-
- Reviewer action required: inspect diff and card
|
|
344
|
-
- Rollback:
|
|
334
|
+
- User intent:
|
|
335
|
+
- Affected domains and downstream consumers:
|
|
336
|
+
- State transitions and persistence/restart impact:
|
|
337
|
+
- Missing impact areas or uncertainty:
|
|
338
|
+
- Residual risks and recovery:
|
|
345
339
|
|
|
346
340
|
## Verification Evidence
|
|
347
341
|
|
|
348
|
-
-
|
|
342
|
+
- Focused/full checks:
|
|
349
343
|
- Commands run:
|
|
350
344
|
- Manual checks:
|
|
351
345
|
- Supporting artifacts:
|
|
352
346
|
|
|
353
|
-
##
|
|
354
|
-
|
|
355
|
-
> **External Acceptance**: unavailable
|
|
356
|
-
> **External Reviewer**:
|
|
357
|
-
> **External Source**:
|
|
358
|
-
> **External Started**:
|
|
359
|
-
> **External Completed**:
|
|
360
|
-
|
|
361
|
-
- P1 blockers:
|
|
362
|
-
- P2 advisories:
|
|
363
|
-
- Acceptance checklist:
|
|
364
|
-
|
|
365
|
-
## Behavior Diff Notes
|
|
347
|
+
## Scenario Evidence
|
|
366
348
|
|
|
367
349
|
- ...
|
|
368
350
|
|
|
@@ -370,15 +352,6 @@ PI_TEMPLATE_REVIEW=$(cat <<'EOF_TEMPLATE_REVIEW'
|
|
|
370
352
|
|
|
371
353
|
- ...
|
|
372
354
|
|
|
373
|
-
## Scorecard
|
|
374
|
-
|
|
375
|
-
| Dimension | Score | Notes |
|
|
376
|
-
|-----------|-------|-------|
|
|
377
|
-
| Functionality | 0/10 | |
|
|
378
|
-
| Product depth | 0/10 | |
|
|
379
|
-
| Design quality | 0/10 | |
|
|
380
|
-
| Code quality | 0/10 | |
|
|
381
|
-
|
|
382
355
|
## Failing Items
|
|
383
356
|
|
|
384
357
|
- ...
|
|
@@ -441,8 +414,8 @@ PI_EVALUATION_PROFILE_DEFAULT="browser-qa"
|
|
|
441
414
|
PI_HANDOFF_PROFILE_DEFAULT="artifact-aware"
|
|
442
415
|
PI_DOCUMENTATION_PROFILE_DEFAULT="minimal-agentic"
|
|
443
416
|
PI_DEFAULT_LSP_PROFILE="typescript-lsp"
|
|
444
|
-
PI_MINIMAL_REFERENCE_CONFIGS="harness-overview.md agentic-development-flow.md external-tooling.md sprint-contracts.md
|
|
445
|
-
PI_FULL_REFERENCE_CONFIGS="agentic-development-flow.md ai-workflows.md changelog-versioning.md coding-standards.md development-protocol.md document-generation.md evaluator-rubric.md external-tooling.md git-strategy.md global-working-rules.md
|
|
417
|
+
PI_MINIMAL_REFERENCE_CONFIGS="harness-overview.md agentic-development-flow.md external-tooling.md sprint-contracts.md handoff-protocol.md document-generation.md global-working-rules.md"
|
|
418
|
+
PI_FULL_REFERENCE_CONFIGS="agentic-development-flow.md ai-workflows.md changelog-versioning.md coding-standards.md development-protocol.md document-generation.md evaluator-rubric.md external-tooling.md git-strategy.md global-working-rules.md handoff-protocol.md harness-overview.md hook-operations.md release-deploy.md spa-day-protocol.md sprint-contracts.md workflow-orchestration.md"
|
|
446
419
|
PI_REFERENCE_CONFIG_STUB_MARKER="<!-- forge: reference-config-stub v1 -->"
|
|
447
420
|
|
|
448
421
|
pi_write_file_if_apply() {
|
|
@@ -1066,7 +1039,7 @@ pi_install_helpers() {
|
|
|
1066
1039
|
local target_dir="$1"
|
|
1067
1040
|
local helpers_dir="$2"
|
|
1068
1041
|
local mode="${3:-apply}"
|
|
1069
|
-
local helper_names="${4:-new-spec.sh new-sprint.sh new-plan.sh capture-plan.sh plan-to-todo.sh contract-run.ts contract-worktree.sh ship-worktrees.sh archive-workflow.sh refresh-current-status.sh prepare-handoff.sh verify-contract.sh summarize-failures.sh verify-sprint.sh
|
|
1042
|
+
local helper_names="${4:-new-spec.sh new-sprint.sh new-plan.sh capture-plan.sh plan-to-todo.sh contract-run.ts contract-worktree.sh ship-worktrees.sh archive-workflow.sh refresh-current-status.sh prepare-handoff.sh verify-contract.sh summarize-failures.sh verify-sprint.sh sprint-backlog.sh check-task-sync.sh check-deploy-sql-order.sh check-architecture-sync.sh check-agent-tooling.sh check-context-files.sh check-brain-manifest.sh sync-brain-docs.sh check-skill-version.ts select-agent-context-blocks.sh ensure-task-workflow.sh check-task-workflow.sh switch-plan.sh workflow-contract.ts inspect-project-state.ts migrate-workflow-docs.ts migrate-project-template.sh capability-resolver.ts architecture-event.ts capability-config.ts architecture-queue.sh archive-architecture-request.sh context-contract-sync.sh workstream-sync.sh prepare-codex-handoff.sh codex-handoff-resume.sh}"
|
|
1070
1043
|
local scripts_dir="$target_dir/scripts"
|
|
1071
1044
|
local runtime_dir="$target_dir/.ai/harness/scripts"
|
|
1072
1045
|
local helper_name
|
|
@@ -2411,7 +2384,6 @@ pi_ensure_harness_state_surface() {
|
|
|
2411
2384
|
"$target_dir/.ai/harness/worktrees" \
|
|
2412
2385
|
"$target_dir/.ai/harness/controller" \
|
|
2413
2386
|
"$target_dir/.ai/harness/local-jobs" \
|
|
2414
|
-
"$target_dir/.ai/harness/triage" \
|
|
2415
2387
|
"$target_dir/docs/researches" \
|
|
2416
2388
|
"$target_dir/docs/architecture/domains" \
|
|
2417
2389
|
"$target_dir/docs/architecture/modules" \
|
|
@@ -2433,7 +2405,6 @@ pi_ensure_harness_state_surface() {
|
|
|
2433
2405
|
[[ -f "$target_dir/.ai/harness/planning/.gitkeep" ]] || : > "$target_dir/.ai/harness/planning/.gitkeep"
|
|
2434
2406
|
[[ -f "$target_dir/.ai/harness/worktrees/.gitkeep" ]] || : > "$target_dir/.ai/harness/worktrees/.gitkeep"
|
|
2435
2407
|
[[ -f "$target_dir/.ai/harness/runs/.gitkeep" ]] || : > "$target_dir/.ai/harness/runs/.gitkeep"
|
|
2436
|
-
[[ -f "$target_dir/.ai/harness/triage/.gitkeep" ]] || : > "$target_dir/.ai/harness/triage/.gitkeep"
|
|
2437
2408
|
[[ -f "$target_dir/tasks/workstreams/.gitkeep" ]] || : > "$target_dir/tasks/workstreams/.gitkeep"
|
|
2438
2409
|
if [[ ! -f "$target_dir/docs/researches/README.md" ]]; then
|
|
2439
2410
|
cat > "$target_dir/docs/researches/README.md" <<'RESEARCH_README_EOF'
|