@moretea-labs/forge 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +73 -7
- package/CHANGELOG.md +34 -0
- package/CLAUDE.md +17 -2
- package/CONTRIBUTING.md +3 -2
- package/README.en.md +24 -3
- package/README.md +10 -6
- package/README.zh-CN.md +5 -3
- package/THIRD_PARTY_NOTICES.md +1 -2
- package/adapters/chatgpt/browser-delivery-host.ts +7 -1
- package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
- package/adapters/chatgpt/controller-binding-store.ts +101 -22
- package/adapters/chatgpt/controller-round-host.ts +15 -25
- package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
- package/adapters/chatgpt/provider-delivery.ts +229 -2
- package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
- package/adapters/computer/chatgpt-extension-target.ts +708 -0
- package/adapters/computer/chrome-extension/background.js +541 -0
- package/adapters/computer/chrome-extension/content.js +402 -0
- package/adapters/computer/chrome-extension/core.js +24 -0
- package/adapters/computer/chrome-extension/manifest.json +32 -0
- package/adapters/computer/desktop-operator-discovery.ts +11 -31
- package/adapters/computer/desktop-operator-provider.ts +18 -6
- package/adapters/computer/interaction-target-authority.ts +178 -24
- package/adapters/mcp/access-mode.ts +18 -39
- package/adapters/mcp/auth.ts +2 -7
- package/adapters/mcp/instructions.ts +6 -5
- package/adapters/mcp/multi-repository.ts +10 -47
- package/adapters/mcp/oauth.ts +73 -0
- package/adapters/mcp/paths.ts +4 -1
- package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
- package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
- package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
- package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
- package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
- package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
- package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
- package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
- package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
- package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
- package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
- package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
- package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
- package/adapters/mcp/runtime-gateway/router.ts +19 -507
- package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
- package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
- package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
- package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
- package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
- package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
- package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
- package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
- package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
- package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
- package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
- package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
- package/adapters/mcp/server.ts +91 -26
- package/adapters/mcp/setup.ts +5 -13
- package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
- package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
- package/adapters/mcp/toolset-names.ts +11 -37
- package/adapters/mcp/toolset.ts +19 -92
- package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
- package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
- package/adapters/mcp/transports/http-observation.ts +377 -0
- package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
- package/adapters/mcp/transports/http.ts +200 -683
- package/adapters/mcp/transports/oauth-http.ts +322 -0
- package/adapters/mcp/transports/session-registry.ts +6 -0
- package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
- package/adapters/mcp/types.ts +0 -6
- package/assets/hooks/lib/session-state.sh +0 -38
- package/assets/hooks/post-bash.sh +1 -1
- package/assets/hooks/post-tool-observer.sh +0 -5
- package/assets/hooks/prompt-guard.sh +0 -55
- package/assets/partials/04-project-structure.partial.md +1 -1
- package/assets/partials/07-footer.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +1 -1
- package/assets/partials-agents/08-deep-docs.partial.md +1 -1
- package/assets/plugin-registry.v1.json +6 -4
- package/assets/reference-configs/agentic-development-flow.md +26 -1
- package/assets/reference-configs/external-tooling.md +0 -76
- package/assets/reference-configs/global-working-rules.md +19 -0
- package/assets/reference-configs/release-deploy.md +1 -1
- package/assets/templates/helpers/architecture-queue.sh +1 -1
- package/assets/templates/helpers/check-agent-tooling.sh +1 -327
- package/assets/templates/helpers/check-task-workflow.sh +1 -1
- package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
- package/assets/templates/helpers/migrate-project-template.sh +2 -2
- package/assets/workflow-contract.v1.json +0 -2
- package/docs/README.md +5 -2
- package/docs/architecture/CURRENT.md +205 -51
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
- package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
- package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
- package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
- package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
- package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
- package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
- package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
- package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
- package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
- package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
- package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
- package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
- package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
- package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
- package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
- package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
- package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
- package/docs/architecture/domains/public-surface.md +3 -5
- package/docs/architecture/domains/verification.md +6 -5
- package/docs/architecture/domains/workflow-engine.md +6 -0
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
- package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
- package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
- package/docs/forge-plugin-management.md +16 -4
- package/docs/operations/controller-browser-plugin.md +23 -0
- package/docs/operations/controller-performance-and-502.md +17 -0
- package/docs/operations/controller-reliability-runbook.md +2 -2
- package/docs/operations/features.md +6 -7
- package/docs/operations/features.zh-CN.md +1 -1
- package/docs/operations/github-repository.md +4 -4
- package/docs/operations/github-semantic-release-projection.md +20 -0
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +13 -52
- package/docs/operations/releasing.md +2 -0
- package/docs/operations/runtime-performance-diagnostics.md +8 -0
- package/docs/operations/standalone-disaster-recovery.md +15 -7
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/tutorials/03-first-repository-task.md +2 -0
- package/docs/wiki/Computer-and-Plugins.md +78 -0
- package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
- package/docs/wiki/Home.md +16 -2
- package/docs/wiki/Implementation.md +25 -13
- package/docs/wiki/Installation.md +28 -32
- package/docs/wiki/Integrations.md +4 -0
- package/docs/wiki/Quick-Start.md +35 -22
- package/docs/wiki/Releases-and-Upgrades.md +15 -25
- package/docs/wiki/_Sidebar.md +5 -1
- package/package.json +25 -25
- package/packages/kernel/cognition/api/index.ts +6 -0
- package/packages/kernel/cognition/application/activation-service.ts +451 -0
- package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
- package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
- package/packages/kernel/cognition/application/memory-service.ts +64 -0
- package/packages/kernel/cognition/domain/learning.ts +106 -0
- package/packages/kernel/cognition/domain/memory.ts +254 -0
- package/packages/kernel/controller/api/index.ts +1 -0
- package/packages/kernel/controller/application/continuation-service.ts +281 -0
- package/packages/kernel/controller/application/controller-round-service.ts +12 -0
- package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
- package/packages/kernel/controller/domain/controller-round.ts +4 -1
- package/packages/kernel/controller/domain/execution-quality.ts +3 -1
- package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
- package/packages/kernel/controller/ports/controller-host.ts +2 -0
- package/packages/kernel/identity/api/index.ts +10 -0
- package/packages/kernel/identity/domain/activity-projection.ts +43 -0
- package/packages/kernel/identity/domain/capability-broker.ts +60 -0
- package/packages/kernel/identity/domain/grant.ts +72 -0
- package/packages/kernel/identity/domain/owned-resource.ts +116 -0
- package/packages/kernel/identity/domain/user-request.ts +93 -0
- package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
- package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
- package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
- package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
- package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
- package/packages/kernel/scheduler/api/index.ts +0 -2
- package/packages/kernel/scheduler/application/eligibility.ts +4 -1
- package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
- package/packages/kernel/scheduler/application/settlement.ts +0 -15
- package/packages/kernel/scheduler/domain/schedule.ts +87 -0
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
- package/packages/kernel/work/api/index.ts +3 -2
- package/packages/kernel/work/application/work-service.ts +18 -42
- package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
- package/packages/kernel/work/domain/engineering-design.ts +10 -5
- package/packages/kernel/work/domain/engineering-profile.ts +8 -12
- package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
- package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
- package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
- package/packages/kernel/work/domain/implementation-review.ts +14 -331
- package/packages/kernel/work/domain/objective-graph.ts +119 -0
- package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
- package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
- package/packages/kernel/work/domain/state-machine.ts +34 -65
- package/packages/kernel/work/domain/types.ts +57 -51
- package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
- package/packages/kernel/work/ports/work-contract-store.ts +5 -2
- package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
- package/packages/plugin-runtime/browser/session-authority.ts +2 -1
- package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
- package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
- package/packages/plugin-runtime/computer/index.ts +2 -0
- package/packages/plugin-runtime/computer/target-authority.ts +26 -1
- package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
- package/packages/protocols/computer/contract.ts +27 -1
- package/scripts/activate-source-baseline.ts +7 -9
- package/scripts/assemble-template.ts +11 -72
- package/scripts/canary-controller-semantic-wait.ts +12 -24
- package/scripts/check-mcp-compatibility.ts +94 -201
- package/scripts/check-package-identity.mjs +0 -5
- package/scripts/check-runtime-architecture.mjs +921 -239
- package/scripts/forge-local-recovery-helper.mjs +93 -15
- package/scripts/init-project.sh +0 -46
- package/scripts/install-ios-hid-toolchain.sh +60 -0
- package/scripts/install-standalone-recovery.ts +1 -1
- package/scripts/lib/project-init-lib.sh +6 -3
- package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
- package/scripts/open-source-audit-allowlist.txt +1 -3
- package/scripts/run-bounded-command.mjs +5 -0
- package/scripts/run-governed-gate.ts +2 -1
- package/scripts/run-mobile-monitor-bridge.ts +0 -1
- package/scripts/smoke-control-plane-failure-domain.ts +94 -0
- package/scripts/smoke-ios-physical-device.ts +38 -10
- package/scripts/smoke-mcp-http-runtime.ts +12 -8
- package/scripts/smoke-mcp-tool-surface.ts +27 -41
- package/scripts/smoke-runtime-recovery.ts +12 -43
- package/scripts/smoke-schedule-engine.ts +23 -15
- package/scripts/smoke-unattended-transport-recovery.ts +223 -0
- package/scripts/smoke-user-request-continuation-restart.ts +232 -0
- package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
- package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
- package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
- package/scripts/smoke-workflow-supervisor.ts +103 -0
- package/scripts/sync-generated-authority.mjs +0 -1
- package/scripts/verify-forge-runtime.sh +2 -1
- package/src/cli/agent-jobs/executor-health.ts +12 -35
- package/src/cli/agent-jobs/integration.ts +20 -51
- package/src/cli/agent-jobs/job-manager.ts +7 -3
- package/src/cli/chatgpt-browser/file-policy.ts +2 -2
- package/src/cli/commands/brain-assistant.ts +27 -13
- package/src/cli/commands/brain.ts +13 -15
- package/src/cli/commands/chatgpt.ts +1 -163
- package/src/cli/commands/doctor.ts +1 -143
- package/src/cli/commands/global-runtime.ts +3 -196
- package/src/cli/commands/init-hook.ts +6 -23
- package/src/cli/commands/init.ts +3 -252
- package/src/cli/commands/mcp.ts +0 -5
- package/src/cli/commands/prompt-guard-decision.ts +0 -2
- package/src/cli/commands/recovery.ts +137 -135
- package/src/cli/commands/repository.ts +17 -1
- package/src/cli/commands/runtime.ts +3 -3
- package/src/cli/commands/setup-execution.ts +41 -0
- package/src/cli/commands/setup-profile.ts +8 -0
- package/src/cli/controller/check-runner.ts +13 -2
- package/src/cli/controller/completion-backlog.ts +3 -3
- package/src/cli/controller/completion-orchestrator.ts +5 -44
- package/src/cli/controller/completion-target.ts +3 -72
- package/src/cli/controller/composite-operations.ts +1 -1
- package/src/cli/controller/context/instruction-context.ts +1 -1
- package/src/cli/controller/context/known-paths.ts +2 -2
- package/src/cli/controller/context/query-planning.ts +11 -4
- package/src/cli/controller/context/rule-resolution.ts +2 -2
- package/src/cli/controller/context/source-materializer.ts +83 -102
- package/src/cli/controller/context/structural-provider.ts +84 -0
- package/src/cli/controller/context/structural.ts +6 -6
- package/src/cli/controller/context/types.ts +8 -9
- package/src/cli/controller/context-pack.ts +107 -84
- package/src/cli/controller/execution-completion.ts +4 -7
- package/src/cli/controller/execution-policy.ts +36 -153
- package/src/cli/controller/governance.ts +2 -3
- package/src/cli/controller/issue-store.ts +4 -99
- package/src/cli/controller/launch-agents.ts +59 -18
- package/src/cli/controller/operational-plan.ts +25 -52
- package/src/cli/controller/runtime-config.ts +5 -1
- package/src/cli/controller/stuck-state-migration.ts +2 -3
- package/src/cli/controller/systemd-user.ts +42 -10
- package/src/cli/editing/edit-session.ts +18 -12
- package/src/cli/github/github.ts +4 -4
- package/src/cli/github/semantic-projection.ts +174 -0
- package/src/cli/hook/prompt-intents.ts +0 -9
- package/src/cli/index.ts +1 -43
- package/src/cli/local-bridge/connector-freshness.ts +1 -12
- package/src/cli/local-bridge/console-automations.ts +19 -14
- package/src/cli/local-bridge/console-view-models.ts +4 -13
- package/src/cli/local-bridge/facade-api.ts +64 -193
- package/src/cli/local-bridge/server.ts +24 -147
- package/src/cli/local-bridge/types.ts +0 -1
- package/src/cli/mcp/oauth-client-retirement.ts +74 -0
- package/src/cli/repositories/command-classifier.ts +0 -9
- package/src/cli/repositories/command-executor.ts +29 -23
- package/src/cli/repositories/command-scope.ts +37 -18
- package/src/cli/repositories/controller-home.ts +48 -0
- package/src/cli/repositories/ephemeral-workspace.ts +20 -30
- package/src/cli/repositories/git-command-executor.ts +2 -2
- package/src/cli/repositories/locks.ts +20 -0
- package/src/cli/repositories/registry.ts +79 -12
- package/src/cli/repositories/safe-patch.ts +2 -12
- package/src/cli/repositories/structured-git.ts +101 -5
- package/src/cli/repository/inspector.ts +185 -343
- package/src/cli/repository/session-cache.ts +92 -6
- package/src/effects/process-runner.ts +17 -1
- package/src/runtime/context/assistant-context.ts +20 -7
- package/src/runtime/context/assistant-work-context.ts +89 -27
- package/src/runtime/context/automatic-learning.ts +565 -0
- package/src/runtime/context/cognitive-attention.ts +173 -0
- package/src/runtime/context/cognitive-skill-canary.ts +158 -0
- package/src/runtime/context/context-closure.ts +46 -9
- package/src/runtime/context/context-pack-process.ts +103 -0
- package/src/runtime/context/context-plane.ts +1 -9
- package/src/runtime/context/direct-controller-learning.ts +298 -0
- package/src/runtime/context/generic-lsp-provider.ts +1 -1
- package/src/runtime/context/semantic-navigation-contract.ts +16 -0
- package/src/runtime/context/semantic-navigation.ts +7 -35
- package/src/runtime/context/typescript-navigation-process.ts +145 -0
- package/src/runtime/context/typescript-navigation.ts +89 -3
- package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
- package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
- package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
- package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
- package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
- package/src/runtime/control-plane/execution/session-store.ts +31 -1
- package/src/runtime/control-plane/execution/validation.ts +6 -8
- package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
- package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
- package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
- package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
- package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
- package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
- package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
- package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
- package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
- package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
- package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
- package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
- package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
- package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
- package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
- package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
- package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
- package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
- package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
- package/src/runtime/control-plane/facade/index.ts +0 -1
- package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
- package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
- package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
- package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
- package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
- package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
- package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
- package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
- package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
- package/src/runtime/control-plane/facade/types.ts +49 -108
- package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
- package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
- package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
- package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
- package/src/runtime/control-plane/governance/access-policy.ts +19 -2
- package/src/runtime/control-plane/governance/authorization.ts +20 -3
- package/src/runtime/control-plane/governance/external-effects.ts +1 -1
- package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
- package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
- package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
- package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
- package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
- package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
- package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
- package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
- package/src/runtime/control-plane/release-retention.ts +135 -47
- package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
- package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
- package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
- package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
- package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
- package/src/runtime/diagnostics/incident-repair.ts +313 -146
- package/src/runtime/diagnostics/mcp-timing.ts +114 -0
- package/src/runtime/evidence/artifact-store.ts +158 -40
- package/src/runtime/evidence/evidence-store.ts +112 -8
- package/src/runtime/evidence/output-handle-index.ts +225 -0
- package/src/runtime/evidence/result-store.ts +158 -44
- package/src/runtime/evidence/sensitive-output.ts +22 -2
- package/src/runtime/execution/jobs/child-reference.ts +11 -0
- package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
- package/src/runtime/execution/jobs/store.ts +3 -4
- package/src/runtime/execution/managed-workspace.ts +57 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
- package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
- package/src/runtime/execution/process-runtime/check-result.ts +105 -1
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
- package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
- package/src/runtime/execution/process-runtime/gc.ts +15 -2
- package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
- package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
- package/src/runtime/execution/process-runtime/index.ts +3 -0
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
- package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
- package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
- package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
- package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
- package/src/runtime/execution/process-runtime/runtime.ts +55 -18
- package/src/runtime/execution/process-runtime/store.ts +30 -2
- package/src/runtime/execution/process-runtime/types.ts +6 -1
- package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
- package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
- package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
- package/src/runtime/execution/workers/executor.ts +3 -8
- package/src/runtime/maintenance/cleanup.ts +41 -5
- package/src/runtime/platform/service-inventory.ts +130 -0
- package/src/runtime/platform/service-manager.ts +8 -0
- package/src/runtime/plugins/action-application.ts +97 -29
- package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
- package/src/runtime/plugins/browser-adapter.ts +1124 -333
- package/src/runtime/plugins/browser-automation-service.ts +23 -3
- package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
- package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
- package/src/runtime/plugins/browser-native-session-service.ts +63 -13
- package/src/runtime/plugins/browser-registration.ts +18 -0
- package/src/runtime/plugins/browser-runtime.ts +40 -36
- package/src/runtime/plugins/browser-session-authority.ts +2 -2
- package/src/runtime/plugins/browser-session-store.ts +46 -76
- package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
- package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
- package/src/runtime/plugins/computer-registration.ts +298 -20
- package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
- package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
- package/src/runtime/plugins/external-adapter.ts +42 -6
- package/src/runtime/plugins/external-registration.ts +21 -1
- package/src/runtime/plugins/github-adapter.ts +30 -3
- package/src/runtime/plugins/gmail-adapter.ts +189 -3
- package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
- package/src/runtime/plugins/google-shared.ts +24 -12
- package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
- package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
- package/src/runtime/plugins/ios-adapter.ts +46 -41
- package/src/runtime/plugins/ios-agent-device.ts +54 -4
- package/src/runtime/plugins/ios-device-ownership.ts +103 -0
- package/src/runtime/plugins/ios-physical-device.ts +497 -79
- package/src/runtime/plugins/lightweight-action.ts +208 -2
- package/src/runtime/plugins/local-system-adapter.ts +12 -100
- package/src/runtime/plugins/managed-process-adapter.ts +12 -5
- package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
- package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +682 -435
- package/src/runtime/plugins/types.ts +24 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
- package/src/runtime/projections/git-status-sampler.ts +2 -19
- package/src/runtime/projections/invalidation.ts +7 -3
- package/src/runtime/projections/materialized-view.ts +80 -36
- package/src/runtime/recovery/actions.ts +4 -4
- package/src/runtime/recovery/capability-action-application.ts +46 -45
- package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
- package/src/runtime/recovery/maintenance-executor.ts +374 -123
- package/src/runtime/recovery/probe.ts +2 -2
- package/src/runtime/recovery/store.ts +29 -11
- package/src/runtime/release/release-coordinator.ts +312 -0
- package/src/runtime/release/release-session.ts +716 -0
- package/src/runtime/release/release-state-migration.ts +25 -0
- package/src/runtime/resources/leases/store.ts +56 -25
- package/src/runtime/root/computer-composition.ts +191 -6
- package/src/runtime/root/controller-progression-composition.ts +254 -0
- package/src/runtime/root/controller-round-composition.ts +20 -1
- package/src/runtime/root/deployment-topology.ts +106 -0
- package/src/runtime/root/entry.ts +4 -3
- package/src/runtime/root/known-good-recovery.ts +184 -0
- package/src/runtime/root/local-bridge.ts +0 -1
- package/src/runtime/root/mcp-transport.ts +111 -18
- package/src/runtime/root/ownership.ts +261 -9
- package/src/runtime/root/package-connector-service.ts +227 -29
- package/src/runtime/root/package-runtime-release.ts +117 -30
- package/src/runtime/root/package-runtime-service.ts +24 -24
- package/src/runtime/root/release-execution-canary.ts +57 -12
- package/src/runtime/root/release-loader.ts +90 -8
- package/src/runtime/root/release-manifest.ts +80 -40
- package/src/runtime/root/release-materialize.ts +372 -106
- package/src/runtime/root/release-store.ts +395 -36
- package/src/runtime/root/runtime-lane.ts +191 -0
- package/src/runtime/root/runtime.ts +160 -29
- package/src/runtime/root/scheduled-controller-composition.ts +29 -3
- package/src/runtime/root/service-runner.ts +2 -2
- package/src/runtime/root/service.ts +126 -44
- package/src/runtime/root/status.ts +48 -0
- package/src/runtime/root/types.ts +32 -9
- package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
- package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
- package/src/runtime/root/write-fence.ts +50 -2
- package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
- package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
- package/src/runtime/safe-tooling/ios-development.ts +22 -8
- package/src/runtime/safe-tooling/job-summary.ts +1 -1
- package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
- package/src/runtime/shared/atomic-text-file.ts +21 -0
- package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
- package/src/runtime/shared/json-files.ts +8 -3
- package/src/runtime/shared/process-environment.ts +20 -9
- package/src/runtime/shared/response-budget.ts +1 -3
- package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
- package/src/runtime/standalone-recovery/core.ts +3792 -417
- package/src/runtime/standalone-recovery/entry.ts +507 -45
- package/src/runtime/standalone-recovery/installer.ts +262 -148
- package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
- package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
- package/src/runtime/standalone-recovery/performance.ts +54 -16
- package/src/runtime/standalone-recovery/release.ts +53 -5
- package/src/runtime/standalone-recovery/service-labels.ts +5 -2
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
- package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
- package/src/runtime/workflow/schedules/engine.ts +166 -178
- package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
- package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
- package/src/runtime/workflows/runtime.ts +15 -19
- package/src/testing/test-governance.ts +5 -1
- package/supervisor/chatgpt-conversation.ts +23 -0
- package/supervisor/client.ts +218 -0
- package/supervisor/control-plane.ts +963 -0
- package/supervisor/entry.ts +15 -0
- package/supervisor/forge-validators.ts +147 -0
- package/supervisor/index.ts +5 -0
- package/supervisor/native-browser-adapter.ts +1151 -0
- package/supervisor/native-messaging/host.ts +58 -0
- package/supervisor/native-messaging/manifest.ts +26 -0
- package/supervisor/native-messaging/protocol.ts +27 -0
- package/supervisor/paths.ts +18 -0
- package/supervisor/protocol.ts +250 -0
- package/supervisor/server.ts +412 -0
- package/supervisor/store.ts +1870 -0
- package/supervisor/tsconfig.json +8 -0
- package/supervisor/types.ts +261 -0
- package/SKILL.md +0 -427
- package/adapters/chatgpt/controller-host.ts +0 -119
- package/adapters/mcp/controller-round-compatibility.ts +0 -184
- package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
- package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
- package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
- package/adapters/mcp/toolset-selection.ts +0 -41
- package/agents/openai.yaml +0 -4
- package/assets/skill-hooks.json +0 -41
- package/assets/skill-version.json +0 -189
- package/assets/skills/claude-review/SKILL.md +0 -231
- package/assets/skills/codex-review/SKILL.md +0 -103
- package/assets/templates/helpers/check-skill-version.ts +0 -193
- package/packages/kernel/progression/api/index.ts +0 -2
- package/packages/kernel/progression/application/projector.ts +0 -211
- package/packages/kernel/progression/domain/types.ts +0 -116
- package/packages/kernel/progression/index.ts +0 -1
- package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
- package/packages/kernel/scheduler/domain/continuation.ts +0 -38
- package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
- package/packages/kernel/work/domain/admission-policy.ts +0 -34
- package/scripts/benchmark-background-check-overlap.ts +0 -228
- package/scripts/benchmark-computer-hotpath.ts +0 -255
- package/scripts/benchmark-controller-hotpath.ts +0 -212
- package/scripts/benchmark-controller-round2.ts +0 -191
- package/scripts/benchmark-ios-agent-device.ts +0 -511
- package/scripts/benchmark-mcp-host.sh +0 -117
- package/scripts/benchmark-mcp-transport.ts +0 -169
- package/scripts/benchmark-operational-memory-activation.ts +0 -235
- package/scripts/benchmark-operational-shadow.ts +0 -28
- package/scripts/benchmark-quality-harness.ts +0 -146
- package/scripts/benchmark-route-session-concurrency.ts +0 -915
- package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
- package/scripts/benchmark-thin-harness.ts +0 -251
- package/scripts/benchmark-typescript-navigation.ts +0 -186
- package/scripts/benchmark-work-efficiency.ts +0 -334
- package/scripts/build-controller-ui.ts +0 -28
- package/scripts/check-npm-release.sh +0 -32
- package/scripts/check-public-release-surface.sh +0 -19
- package/scripts/check-release-published.sh +0 -57
- package/scripts/check-release-readiness.sh +0 -37
- package/scripts/check-release-version.mjs +0 -74
- package/scripts/check-skill-version.ts +0 -5
- package/scripts/check-tarball-install-smoke.sh +0 -150
- package/scripts/ensure-codegraph.sh +0 -16
- package/scripts/package-source-archive.sh +0 -147
- package/scripts/public-release-files.txt +0 -39
- package/scripts/public-release.ts +0 -174
- package/scripts/publish-release-tarball.sh +0 -27
- package/scripts/route-nl-vs-ts-eval.ts +0 -679
- package/scripts/run-skill-hook.ts +0 -244
- package/scripts/stage-runtime-release.ts +0 -44
- package/scripts/sync-codex-installed-copies.sh +0 -182
- package/src/cli/commands/tools.ts +0 -167
- package/src/cli/controller/progress.ts +0 -656
- package/src/cli/controller/work-mode.ts +0 -181
- package/src/cli/local-bridge/console-assets.ts +0 -17
- package/src/cli/local-bridge/dashboard.ts +0 -17
- package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
- package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
- package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
- package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
- package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
- package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/styles.css +0 -28
- package/src/cli/local-bridge/frontend/src/types.ts +0 -15
- package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
- package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
- package/src/cli/local-bridge/ui-dist/app.css +0 -1
- package/src/cli/local-bridge/ui-dist/app.js +0 -11228
- package/src/cli/mcp/access-mode.ts +0 -2
- package/src/cli/mcp/access-tools.ts +0 -2
- package/src/cli/mcp/audit.ts +0 -2
- package/src/cli/mcp/auth.ts +0 -2
- package/src/cli/mcp/instructions.ts +0 -2
- package/src/cli/mcp/legacy-context.ts +0 -2
- package/src/cli/mcp/legacy-tool-service.ts +0 -2
- package/src/cli/mcp/multi-repository.ts +0 -2
- package/src/cli/mcp/oauth.ts +0 -2
- package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
- package/src/cli/mcp/paths.ts +0 -2
- package/src/cli/mcp/policy.ts +0 -2
- package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
- package/src/cli/mcp/proxy-env.ts +0 -2
- package/src/cli/mcp/readiness-projection.ts +0 -2
- package/src/cli/mcp/redaction.ts +0 -2
- package/src/cli/mcp/repo.ts +0 -2
- package/src/cli/mcp/repository-tools.ts +0 -2
- package/src/cli/mcp/server.ts +0 -2
- package/src/cli/mcp/setup.ts +0 -2
- package/src/cli/mcp/tool-capability-cache.ts +0 -2
- package/src/cli/mcp/tool-contract.ts +0 -2
- package/src/cli/mcp/tools.ts +0 -2
- package/src/cli/mcp/toolset-names.ts +0 -2
- package/src/cli/mcp/toolset-selection.ts +0 -2
- package/src/cli/mcp/toolset.ts +0 -2
- package/src/cli/mcp/transports/http.ts +0 -2
- package/src/cli/mcp/transports/session-registry.ts +0 -2
- package/src/cli/mcp/transports/stdio.ts +0 -2
- package/src/cli/mcp/types.ts +0 -2
- package/src/cli/mcp/umbrella-tools.ts +0 -2
- package/src/cli/tools/codegraph.ts +0 -695
- package/src/core/adoption/helper-wrapper-plan.ts +0 -159
- package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
- package/src/runtime/context/codegraph-read-provider.ts +0 -611
- package/src/runtime/context/codegraph-sidecar.cjs +0 -248
- package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
- package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
- package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
- package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
- package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
- package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
- package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
- package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
- package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
- package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
- package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
- package/src/runtime/control-plane/routing/index.ts +0 -1
- package/src/runtime/control-plane/routing/route-policy.ts +0 -401
- package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
- package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
- package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
- package/src/runtime/gateway/mcp/process-tools.ts +0 -2
- package/src/runtime/gateway/mcp/router.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
- package/src/runtime/plugins/browser-provider-registry.ts +0 -2
|
@@ -18,13 +18,13 @@ export interface ControllerOperationalPlan {
|
|
|
18
18
|
reviewRequired: boolean;
|
|
19
19
|
};
|
|
20
20
|
validationStrategy: {
|
|
21
|
-
source: "
|
|
21
|
+
source: "declared-check-projection";
|
|
22
22
|
policy: "minimal" | "task-targeted" | "release-gate";
|
|
23
23
|
checks: string[];
|
|
24
24
|
reason: string;
|
|
25
25
|
};
|
|
26
26
|
recipeSystem: {
|
|
27
|
-
source: "
|
|
27
|
+
source: "legacy-recipe-projection";
|
|
28
28
|
recipes: Array<{
|
|
29
29
|
id: string;
|
|
30
30
|
label: string;
|
|
@@ -34,7 +34,7 @@ export interface ControllerOperationalPlan {
|
|
|
34
34
|
}>;
|
|
35
35
|
};
|
|
36
36
|
workerAbstraction: {
|
|
37
|
-
source: "
|
|
37
|
+
source: "execution-capability-projection";
|
|
38
38
|
workers: Array<{
|
|
39
39
|
id: string;
|
|
40
40
|
role: string;
|
|
@@ -107,11 +107,9 @@ export function buildControllerOperationalPlan(repoRoot: string, ledger: TaskLed
|
|
|
107
107
|
const dirty = changedFiles.length > 0;
|
|
108
108
|
const blocked = ledger.status.kind === "blocked" || ledger.status.kind === "needs_retry_decision";
|
|
109
109
|
const needsAttention = blocked || ledger.status.severity === "action" || ledger.status.severity === "warning" || dirty;
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
? "task-targeted" as const
|
|
114
|
-
: "minimal" as const;
|
|
110
|
+
// Compatibility projection only. Declared checks are facts the model may use;
|
|
111
|
+
// this projection does not choose a validation method or release gate.
|
|
112
|
+
const policy = "minimal" as const;
|
|
115
113
|
|
|
116
114
|
return {
|
|
117
115
|
schemaVersion: OPERATIONAL_PLAN_SCHEMA_VERSION,
|
|
@@ -122,70 +120,45 @@ export function buildControllerOperationalPlan(repoRoot: string, ledger: TaskLed
|
|
|
122
120
|
"task-ledger",
|
|
123
121
|
"context-pack",
|
|
124
122
|
"diff-projection",
|
|
125
|
-
"
|
|
126
|
-
"recipe-
|
|
127
|
-
"
|
|
123
|
+
"declared-check-projection",
|
|
124
|
+
"legacy-recipe-projection",
|
|
125
|
+
"execution-capability-projection",
|
|
128
126
|
"gui-interaction-model",
|
|
129
127
|
"mcp-tool-schema-convergence",
|
|
130
128
|
"controller-home-runtime-storage-policy",
|
|
131
129
|
"branch-worktree-cleanup-policy",
|
|
132
130
|
"task-recovery-loop",
|
|
133
131
|
],
|
|
134
|
-
remainingDecisionPoints:
|
|
135
|
-
? ["Review and commit or discard current diff before dispatching unrelated work."]
|
|
136
|
-
: [],
|
|
132
|
+
remainingDecisionPoints: [],
|
|
137
133
|
diffProjection: {
|
|
138
134
|
source: "live-git-diff-projection",
|
|
139
135
|
dirty,
|
|
140
136
|
changedFiles,
|
|
141
137
|
diffStat: diffStat.ok ? diffStat.stdout.trim() : diffStat.error || diffStat.stderr.trim(),
|
|
142
|
-
|
|
138
|
+
// Legacy field retained for UI ABI only. Dirty state is a fact, not an
|
|
139
|
+
// automatic review lifecycle decision.
|
|
140
|
+
reviewRequired: false,
|
|
143
141
|
},
|
|
144
142
|
validationStrategy: {
|
|
145
|
-
source: "
|
|
143
|
+
source: "declared-check-projection",
|
|
146
144
|
policy,
|
|
147
145
|
checks,
|
|
148
|
-
reason:
|
|
149
|
-
? "
|
|
150
|
-
:
|
|
151
|
-
? "Use checks declared on the focused task or ready queue; do not expand validation scope by default."
|
|
152
|
-
: "No task-specific checks were found; keep validation minimal and explicit.",
|
|
146
|
+
reason: checks.length > 0
|
|
147
|
+
? "These checks are declared context only; the model decides whether, when, and how to validate."
|
|
148
|
+
: "No declared checks were found; Forge does not invent a validation strategy.",
|
|
153
149
|
},
|
|
154
150
|
recipeSystem: {
|
|
155
|
-
source: "
|
|
156
|
-
recipes: [
|
|
157
|
-
{
|
|
158
|
-
id: "scoped-direct-edit",
|
|
159
|
-
label: "Scoped direct edit",
|
|
160
|
-
when: "Known files and low/medium-risk bounded changes.",
|
|
161
|
-
steps: ["build context pack", "read exact ranges", "apply bounded patch", "review diff projection", "run task-targeted checks"],
|
|
162
|
-
requiredEvidence: ["contextPack", "diffProjection", "validationStrategy"],
|
|
163
|
-
},
|
|
164
|
-
{
|
|
165
|
-
id: "isolated-worker-run",
|
|
166
|
-
label: "Isolated worker run",
|
|
167
|
-
when: "Large, risky, or long-running implementation requiring agent execution.",
|
|
168
|
-
steps: ["derive worker scope", "dispatch isolated run", "inspect run diff", "integrate through edit session", "verify exact revision"],
|
|
169
|
-
requiredEvidence: ["run", "task diff", "integration session", "checks"],
|
|
170
|
-
},
|
|
171
|
-
{
|
|
172
|
-
id: "recovery-resume",
|
|
173
|
-
label: "Fresh-session recovery",
|
|
174
|
-
when: "A controller session restarts or loses conversation state.",
|
|
175
|
-
steps: ["load task ledger", "read operational plan", "select continuation state", "expand only needed context", "resume or ask for the one missing decision"],
|
|
176
|
-
requiredEvidence: ["taskLedger", "operationalPlan", "recoveryArtifacts"],
|
|
177
|
-
},
|
|
178
|
-
],
|
|
151
|
+
source: "legacy-recipe-projection",
|
|
152
|
+
recipes: [],
|
|
179
153
|
},
|
|
180
154
|
workerAbstraction: {
|
|
181
|
-
source: "
|
|
155
|
+
source: "execution-capability-projection",
|
|
182
156
|
workers: [
|
|
183
|
-
{ id: "
|
|
184
|
-
{ id: "
|
|
185
|
-
{ id: "
|
|
186
|
-
{ id: "github_copilot", role: "visible cloud coding session", preferredFor: ["remote reviewable work", "GitHub issue flow"], avoidWhen: ["secret-local context", "offline tasks"] },
|
|
157
|
+
{ id: "direct_capability", role: "direct domain capability execution", preferredFor: [], avoidWhen: [] },
|
|
158
|
+
{ id: "isolated_process", role: "isolated process/workspace capability when explicitly useful", preferredFor: [], avoidWhen: [] },
|
|
159
|
+
{ id: "external_provider", role: "optional external model/provider capability", preferredFor: [], avoidWhen: [] },
|
|
187
160
|
],
|
|
188
|
-
recommendedWorker:
|
|
161
|
+
recommendedWorker: "model_selected",
|
|
189
162
|
},
|
|
190
163
|
guiInteraction: {
|
|
191
164
|
source: "controller-console-interaction-model",
|
|
@@ -196,7 +169,7 @@ export function buildControllerOperationalPlan(repoRoot: string, ledger: TaskLed
|
|
|
196
169
|
mcpToolSchemaConvergence: {
|
|
197
170
|
source: "mcp-tool-schema-convergence",
|
|
198
171
|
readModels: ["controller_context", "rh_context", "work_status_digest", "prepare_transfer_artifacts"],
|
|
199
|
-
commandModels: ["rh_work", "run_check", "
|
|
172
|
+
commandModels: ["rh_work", "run_check", "execute_command", "plugin_action_execute", "repository_safe_patch_apply"],
|
|
200
173
|
compatibilityRules: [
|
|
201
174
|
"compact reads are default",
|
|
202
175
|
"raw code and raw logs require explicit opt-in tools",
|
|
@@ -6,7 +6,11 @@ export { FORGE_VERSION } from '../../version';
|
|
|
6
6
|
/** Product identity exposed by every Forge runtime surface. */
|
|
7
7
|
export const FORGE_TOOL_SURFACE = FORGE_PRODUCT_ID;
|
|
8
8
|
/** Payload schema for MCP health/config records; this is not a product/component version. */
|
|
9
|
-
|
|
9
|
+
// 12: autonomous continuation is addressed by Workflow Supervisor task identity
|
|
10
|
+
// rather than optional Work identity. Tool names stay bounded; the served input
|
|
11
|
+
// schema changes and therefore must fence stale Connector schema snapshots.
|
|
12
|
+
// A served-schema change must be visible to connector freshness checks.
|
|
13
|
+
export const FORGE_MCP_SCHEMA_VERSION = 12;
|
|
10
14
|
|
|
11
15
|
type ToolSurfaceDefinition = {
|
|
12
16
|
name: string;
|
|
@@ -3,7 +3,7 @@ import { spawnSync } from 'child_process';
|
|
|
3
3
|
import { createHash } from 'crypto';
|
|
4
4
|
import { inspectCompletionBacklog, type CompletionBacklogItem } from './completion-backlog';
|
|
5
5
|
import { getIssue, listIssues, updateIssue, updateTask } from './issue-store';
|
|
6
|
-
import { completionEvidenceComplete,
|
|
6
|
+
import { completionEvidenceComplete, verificationEvidencePassed } from './execution-policy';
|
|
7
7
|
import type { CompletionReceipt, ControllerIssue, ControllerTask } from './types';
|
|
8
8
|
import { resolveCompletionTargetBranch } from './completion-target';
|
|
9
9
|
import { legacyIssueAuthorityRetired } from './legacy-issue-cutover';
|
|
@@ -174,8 +174,7 @@ function reachable(repoRoot: string, revision: string, branch: string): boolean
|
|
|
174
174
|
|
|
175
175
|
function historicalCompletionReceipt(repoRoot: string, issue: ControllerIssue, task: ControllerTask): CompletionReceipt | undefined {
|
|
176
176
|
if (!task.verification) return undefined;
|
|
177
|
-
const
|
|
178
|
-
const outcome = verificationEvidencePassed(task, task.verification, policy);
|
|
177
|
+
const outcome = verificationEvidencePassed(task, task.verification);
|
|
179
178
|
if (!outcome.ok) return undefined;
|
|
180
179
|
const target = currentTarget(repoRoot);
|
|
181
180
|
if (!target) return undefined;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { writeAtomicTextFile } from '../../runtime/shared/atomic-text-file';
|
|
1
2
|
import { spawnSync, type SpawnSyncReturns } from 'child_process';
|
|
2
|
-
import {
|
|
3
|
+
import { existsSync, rmSync } from 'fs';
|
|
3
4
|
import { homedir } from 'os';
|
|
4
|
-
import {
|
|
5
|
+
import { join } from 'path';
|
|
5
6
|
|
|
6
7
|
export interface SystemdUserUnitInput {
|
|
7
8
|
description?: string;
|
|
@@ -12,13 +13,6 @@ export interface SystemdUserUnitInput {
|
|
|
12
13
|
restartSec?: number;
|
|
13
14
|
}
|
|
14
15
|
|
|
15
|
-
function atomicWrite(path: string, content: string, mode = 0o644): void {
|
|
16
|
-
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
17
|
-
const temporary = `${path}.${process.pid}.tmp`;
|
|
18
|
-
writeFileSync(temporary, content, { encoding: 'utf8', mode });
|
|
19
|
-
renameSync(temporary, path);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
16
|
export function systemdEscape(value: string): string {
|
|
23
17
|
return `"${value.replaceAll('%', '%%').replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"`;
|
|
24
18
|
}
|
|
@@ -79,7 +73,7 @@ export function writeSystemdUserUnit(
|
|
|
79
73
|
env: NodeJS.ProcessEnv = process.env,
|
|
80
74
|
): string {
|
|
81
75
|
const unitPath = systemdUserUnitPath(unitName, env);
|
|
82
|
-
|
|
76
|
+
writeAtomicTextFile(unitPath, renderSystemdUserUnit(input), 0o644);
|
|
83
77
|
return unitPath;
|
|
84
78
|
}
|
|
85
79
|
|
|
@@ -108,3 +102,41 @@ export function systemdUserServicePid(unitName: string, env: NodeJS.ProcessEnv =
|
|
|
108
102
|
const pid = Number(result.stdout.trim());
|
|
109
103
|
return Number.isInteger(pid) && pid > 0 ? pid : undefined;
|
|
110
104
|
}
|
|
105
|
+
|
|
106
|
+
export interface ExactSystemdUserUnitRetirementResult {
|
|
107
|
+
unitName: string;
|
|
108
|
+
unitPath: string;
|
|
109
|
+
serviceWasPresent: boolean;
|
|
110
|
+
unitFileWasPresent: boolean;
|
|
111
|
+
absentAfter: boolean;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function systemdUnitLoaded(unitName: string, env: NodeJS.ProcessEnv): boolean {
|
|
115
|
+
const result = commandSucceeded('systemctl', ['--user', 'show', '--property', 'LoadState', '--value', systemdUserUnitName(unitName)], env);
|
|
116
|
+
return result.status === 0 && result.stdout.trim() !== '' && result.stdout.trim() !== 'not-found';
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function retireSystemdUserUnitExact(
|
|
120
|
+
input: { unitName: string; env?: NodeJS.ProcessEnv },
|
|
121
|
+
): ExactSystemdUserUnitRetirementResult {
|
|
122
|
+
const env = input.env ?? process.env;
|
|
123
|
+
const unitName = systemdUserUnitName(input.unitName);
|
|
124
|
+
const unitPath = systemdUserUnitPath(unitName, env);
|
|
125
|
+
const serviceWasPresent = systemdUnitLoaded(unitName, env);
|
|
126
|
+
const unitFileWasPresent = existsSync(unitPath);
|
|
127
|
+
if (serviceWasPresent || unitFileWasPresent) {
|
|
128
|
+
const disabled = commandSucceeded('systemctl', ['--user', 'disable', '--now', unitName], env);
|
|
129
|
+
const detail = `${disabled.stderr ?? ''}\n${disabled.stdout ?? ''}`;
|
|
130
|
+
if (disabled.status !== 0 && !/not loaded|not found|does not exist|not enabled|no files found/i.test(detail)) {
|
|
131
|
+
throw new Error(`SYSTEMD_USER_EXACT_RETIRE_FAILED: ${unitName}: ${detail.trim()}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
rmSync(unitPath, { force: true });
|
|
135
|
+
const reload = commandSucceeded('systemctl', ['--user', 'daemon-reload'], env);
|
|
136
|
+
if (reload.status !== 0) {
|
|
137
|
+
throw new Error(`SYSTEMD_USER_EXACT_RETIRE_RELOAD_FAILED: ${unitName}: ${(reload.stderr || reload.stdout || '').trim()}`);
|
|
138
|
+
}
|
|
139
|
+
const absentAfter = !systemdUnitLoaded(unitName, env) && !existsSync(unitPath);
|
|
140
|
+
if (!absentAfter) throw new Error(`SYSTEMD_USER_EXACT_RETIRE_VERIFY_FAILED: ${unitName}`);
|
|
141
|
+
return { unitName, unitPath, serviceWasPresent, unitFileWasPresent, absentAfter };
|
|
142
|
+
}
|
|
@@ -9,8 +9,8 @@ import {
|
|
|
9
9
|
type ControllerCheckResult,
|
|
10
10
|
} from '../controller/check-runner';
|
|
11
11
|
import { tryAppendControllerWorklogEvent } from '../controller/worklog';
|
|
12
|
-
import { globMatches, resolveMcpPath } from '
|
|
13
|
-
import type { McpPolicy } from '
|
|
12
|
+
import { globMatches, resolveMcpPath } from '../../../adapters/mcp/paths';
|
|
13
|
+
import type { McpPolicy } from '../../../adapters/mcp/types';
|
|
14
14
|
import type { ProcessCheckCompletionReceipt, ProcessCheckReceiptStatus } from '../../runtime/execution/process-runtime/check-receipt';
|
|
15
15
|
import { invalidateRepositoryReadCaches } from '../repository/inspector';
|
|
16
16
|
import type { EditOperation } from './edit-operation-contract';
|
|
@@ -86,7 +86,6 @@ export interface EditSessionBinding {
|
|
|
86
86
|
checkoutId?: string;
|
|
87
87
|
principalId?: string;
|
|
88
88
|
controllerInstanceId?: string;
|
|
89
|
-
routeDecisionFingerprint?: string;
|
|
90
89
|
}
|
|
91
90
|
|
|
92
91
|
export interface EditSession {
|
|
@@ -99,7 +98,6 @@ export interface EditSession {
|
|
|
99
98
|
checkoutId?: string;
|
|
100
99
|
principalId?: string;
|
|
101
100
|
controllerInstanceId?: string;
|
|
102
|
-
routeDecisionFingerprint?: string;
|
|
103
101
|
workspaceFingerprint?: string;
|
|
104
102
|
assurance?: EditSessionAssurance;
|
|
105
103
|
purpose: string;
|
|
@@ -293,8 +291,7 @@ export function assertEditSessionDurableBinding(
|
|
|
293
291
|
session.workId
|
|
294
292
|
|| session.repoId
|
|
295
293
|
|| session.checkoutId
|
|
296
|
-
|| session.principalId
|
|
297
|
-
|| session.routeDecisionFingerprint,
|
|
294
|
+
|| session.principalId,
|
|
298
295
|
);
|
|
299
296
|
if (options.requireBoundIdentity === true && hasDurableIdentity && !binding) {
|
|
300
297
|
throw new Error('EDIT_SESSION_IDENTITY_MISMATCH: binding');
|
|
@@ -305,7 +302,6 @@ export function assertEditSessionDurableBinding(
|
|
|
305
302
|
['repoId', session.repoId, binding.repoId],
|
|
306
303
|
['checkoutId', session.checkoutId, binding.checkoutId],
|
|
307
304
|
['principalId', session.principalId, binding.principalId],
|
|
308
|
-
['routeDecisionFingerprint', session.routeDecisionFingerprint, binding.routeDecisionFingerprint],
|
|
309
305
|
];
|
|
310
306
|
for (const [field, expected, observed] of pairs) {
|
|
311
307
|
if (expected && expected !== observed) throw new Error(`EDIT_SESSION_IDENTITY_MISMATCH: ${String(field)}`);
|
|
@@ -316,6 +312,10 @@ function bindSessionControllerInstance(repoRoot: string, session: EditSession, b
|
|
|
316
312
|
assertEditSessionDurableBinding(session, binding);
|
|
317
313
|
const nextInstanceId = binding?.controllerInstanceId?.trim();
|
|
318
314
|
if (!nextInstanceId || session.controllerInstanceId === nextInstanceId) return session;
|
|
315
|
+
// A non-Work Safe Patch session has no Controller instance owner to rebind.
|
|
316
|
+
// Its persisted repository identity is still checked above; never promote
|
|
317
|
+
// a caller-supplied transient Runtime identity into durable session authority.
|
|
318
|
+
if (!session.workId && !session.controllerInstanceId) return session;
|
|
319
319
|
const durableIdentity = [
|
|
320
320
|
[session.workId, binding?.workId],
|
|
321
321
|
[session.repoId, binding?.repoId],
|
|
@@ -404,7 +404,6 @@ function normalizeStoredSession(value: Partial<EditSession> & { sessionId: strin
|
|
|
404
404
|
checkoutId: value.checkoutId,
|
|
405
405
|
principalId: value.principalId,
|
|
406
406
|
controllerInstanceId: value.controllerInstanceId,
|
|
407
|
-
routeDecisionFingerprint: value.routeDecisionFingerprint,
|
|
408
407
|
workspaceFingerprint: value.workspaceFingerprint,
|
|
409
408
|
assurance: value.assurance,
|
|
410
409
|
purpose: value.purpose ?? 'Direct edit',
|
|
@@ -1149,7 +1148,7 @@ function sessionSummary(session: EditSession): EditSessionSummary {
|
|
|
1149
1148
|
};
|
|
1150
1149
|
}
|
|
1151
1150
|
|
|
1152
|
-
function findOccurrence(value: string, anchor: string, occurrence: number): number {
|
|
1151
|
+
export function findOccurrence(value: string, anchor: string, occurrence: number): number {
|
|
1153
1152
|
let from = 0;
|
|
1154
1153
|
for (let current = 1; current <= occurrence; current += 1) {
|
|
1155
1154
|
const index = value.indexOf(anchor, from);
|
|
@@ -1206,7 +1205,6 @@ export function beginEditSession(repoRoot: string, input: {
|
|
|
1206
1205
|
checkoutId: input.binding?.checkoutId?.trim() || undefined,
|
|
1207
1206
|
principalId: input.binding?.principalId?.trim() || undefined,
|
|
1208
1207
|
controllerInstanceId: input.binding?.controllerInstanceId?.trim() || undefined,
|
|
1209
|
-
routeDecisionFingerprint: input.binding?.routeDecisionFingerprint?.trim() || undefined,
|
|
1210
1208
|
workspaceFingerprint: workspaceFingerprint(repoRoot),
|
|
1211
1209
|
purpose,
|
|
1212
1210
|
status: 'open',
|
|
@@ -1919,9 +1917,17 @@ export function finalizeEditSession(repoRoot: string, sessionId: string, input:
|
|
|
1919
1917
|
} = {}): EditSession {
|
|
1920
1918
|
let session = getEditSession(repoRoot, sessionId);
|
|
1921
1919
|
session = bindSessionControllerInstance(repoRoot, session, input.binding);
|
|
1922
|
-
|
|
1923
|
-
|
|
1920
|
+
const baseRevisionChanged = Boolean(session.baseRevision && gitRevision(repoRoot) !== session.baseRevision);
|
|
1921
|
+
const workspaceFingerprintChanged = Boolean(session.workspaceFingerprint && workspaceFingerprint(repoRoot) !== session.workspaceFingerprint);
|
|
1924
1922
|
if (session.assurance?.approvalRequired && input.approvalConfirmed !== true) throw new Error('EDIT_SESSION_APPROVAL_REQUIRED');
|
|
1923
|
+
if (baseRevisionChanged || workspaceFingerprintChanged) {
|
|
1924
|
+
// A commit changes HEAD and Git's workspace fingerprint even when the exact edit-session after-images are now integrated.
|
|
1925
|
+
// Reconcile through the canonical after-image + clean-tracked-path checks before rejecting the stale snapshot.
|
|
1926
|
+
const reconciled = reconcileEditSession(repoRoot, session.sessionId, input);
|
|
1927
|
+
if (reconciled.status === 'finalized' || reconciled.status === 'superseded') return reconciled;
|
|
1928
|
+
if (baseRevisionChanged) throw new Error('EDIT_SESSION_BASE_REVISION_CHANGED');
|
|
1929
|
+
throw new Error('EDIT_SESSION_WORKSPACE_FINGERPRINT_CHANGED');
|
|
1930
|
+
}
|
|
1925
1931
|
const emptyOpenSession = session.status === 'open' && session.operations.length === 0;
|
|
1926
1932
|
if (!emptyOpenSession && !['dirty', 'checked', 'check_failed'].includes(session.status)) {
|
|
1927
1933
|
throw new Error(`edit session cannot be finalized from ${session.status}`);
|
package/src/cli/github/github.ts
CHANGED
|
@@ -121,7 +121,7 @@ export function buildGitHubWorkflowDispatchArgs(repository: string, input: GitHu
|
|
|
121
121
|
return args;
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
function gh(repoRoot: string, args: string[], input?: string, maxOutputBytes = 512 * 1024) {
|
|
124
|
+
export function gh(repoRoot: string, args: string[], input?: string, maxOutputBytes = 512 * 1024) {
|
|
125
125
|
return runProcess('gh', args, {
|
|
126
126
|
cwd: repoRoot,
|
|
127
127
|
timeoutMs: 120_000,
|
|
@@ -284,7 +284,7 @@ function parseIssueUrl(output: string): { url: string; number: number } {
|
|
|
284
284
|
return { url, number };
|
|
285
285
|
}
|
|
286
286
|
|
|
287
|
-
function addProjectItem(repoRoot: string, link: GitHubIssueLink, projectOwner?: string, projectNumber?: number): GitHubIssueLink {
|
|
287
|
+
export function addProjectItem(repoRoot: string, link: GitHubIssueLink, projectOwner?: string, projectNumber?: number): GitHubIssueLink {
|
|
288
288
|
if (!projectOwner || !projectNumber) return link;
|
|
289
289
|
const result = gh(repoRoot, ['project', 'item-add', String(projectNumber), '--owner', projectOwner, '--url', link.url, '--format', 'json']);
|
|
290
290
|
if (!result.ok) throw new Error(`failed to add ${link.url} to GitHub Project: ${result.error || result.stderr}`);
|
|
@@ -302,7 +302,7 @@ function withoutPairedOption(args: string[], option: string): string[] {
|
|
|
302
302
|
return args.filter((entry, index, all) => entry !== option && all[index - 1] !== option);
|
|
303
303
|
}
|
|
304
304
|
|
|
305
|
-
function createGitHubIssue(repoRoot: string, repo: GitHubRepositoryInfo, title: string, bodyPath: string, labels: string[], parentNumber?: number): GitHubIssueLink {
|
|
305
|
+
export function createGitHubIssue(repoRoot: string, repo: GitHubRepositoryInfo, title: string, bodyPath: string, labels: string[], parentNumber?: number): GitHubIssueLink {
|
|
306
306
|
const args = ['issue', 'create', '--repo', repo.nameWithOwner, '--title', title, '--body-file', bodyPath];
|
|
307
307
|
for (const label of labels) args.push('--label', label);
|
|
308
308
|
if (parentNumber) args.push('--parent', String(parentNumber));
|
|
@@ -323,7 +323,7 @@ function createGitHubIssue(repoRoot: string, repo: GitHubRepositoryInfo, title:
|
|
|
323
323
|
return { owner: repo.owner, repo: repo.repo, number: parsed.number, url: parsed.url, syncedAt: new Date().toISOString() };
|
|
324
324
|
}
|
|
325
325
|
|
|
326
|
-
function updateGitHubIssue(repoRoot: string, repo: GitHubRepositoryInfo, link: GitHubIssueLink, title: string, bodyPath: string): GitHubIssueLink {
|
|
326
|
+
export function updateGitHubIssue(repoRoot: string, repo: GitHubRepositoryInfo, link: GitHubIssueLink, title: string, bodyPath: string): GitHubIssueLink {
|
|
327
327
|
const result = gh(repoRoot, ['issue', 'edit', String(link.number), '--repo', repo.nameWithOwner, '--title', title, '--body-file', bodyPath]);
|
|
328
328
|
if (!result.ok) throw new Error(`failed to update GitHub issue #${link.number}: ${result.error || result.stderr}`);
|
|
329
329
|
return { ...link, owner: repo.owner, repo: repo.repo, syncedAt: new Date().toISOString() };
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'fs';
|
|
2
|
+
import { tmpdir } from 'os';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { listRepositories } from '../repositories/registry';
|
|
5
|
+
import { resolveRepoPreferredControllerHome } from '../repositories/controller-home';
|
|
6
|
+
import { getWorkContract, listWorkContracts, type WorkContract } from '../../../packages/kernel/work/api/index';
|
|
7
|
+
import { getPlanContract, planSemanticView } from '../../runtime/control-plane/facade/plan-contract-store';
|
|
8
|
+
import { readRequirement } from '../../runtime/control-plane/persistence/requirement-store';
|
|
9
|
+
import type { GitHubIssueLink } from '../controller/types';
|
|
10
|
+
import { gh, createGitHubIssue, updateGitHubIssue, addProjectItem, resolveGitHubRepository } from './github';
|
|
11
|
+
|
|
12
|
+
interface RemoteIssue { number: number; url: string; title: string; body: string }
|
|
13
|
+
export interface SemanticReleaseProjectionInput {
|
|
14
|
+
releaseWorkId: string;
|
|
15
|
+
repository?: string;
|
|
16
|
+
projectOwner?: string;
|
|
17
|
+
projectNumber?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface SemanticReleaseProjectionResult {
|
|
20
|
+
releaseIssue: string;
|
|
21
|
+
children: Array<{ workId: string; issue: string }>;
|
|
22
|
+
created: number;
|
|
23
|
+
updated: number;
|
|
24
|
+
unchanged: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function safeIdentity(value: string): string {
|
|
28
|
+
if (!/^[A-Za-z0-9_.:-]{1,200}$/.test(value)) throw new Error('GITHUB_SEMANTIC_ID_INVALID');
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function marker(workId: string): string {
|
|
33
|
+
return '<!-- forge-semantic-work:' + safeIdentity(workId) + ' -->';
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function lines(values: readonly string[] | undefined, prefix = '- '): string {
|
|
37
|
+
return values?.length ? values.map((line) => prefix + line).join('\n') : '- 尚无记录';
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function workDisplayTitle(work: WorkContract, home: string): string {
|
|
41
|
+
const requirement = work.requirementId
|
|
42
|
+
? readRequirement({ controllerHome: home }, work.requirementId)?.value
|
|
43
|
+
: undefined;
|
|
44
|
+
return (requirement?.title || work.objective).replace(/\s+/g, ' ').slice(0, 96);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function semanticWorkText(work: WorkContract, home: string): string {
|
|
48
|
+
const requirement = work.requirementId
|
|
49
|
+
? readRequirement({ controllerHome: home }, work.requirementId)?.value
|
|
50
|
+
: undefined;
|
|
51
|
+
const plan = work.planId
|
|
52
|
+
? getPlanContract({ controllerHome: home, repoId: work.repoId }, work.planId)
|
|
53
|
+
: undefined;
|
|
54
|
+
const planView = plan ? planSemanticView(plan) : undefined;
|
|
55
|
+
const text = [
|
|
56
|
+
marker(work.workId),
|
|
57
|
+
'> Forge 生成视图(单向投影)。Requirement / Plan / Work 的正式状态只由 Forge 持有。GitHub 上的勾选或评论不改变执行授权。',
|
|
58
|
+
'',
|
|
59
|
+
'## 工作目标', work.objective,
|
|
60
|
+
'',
|
|
61
|
+
'## Forge 当前事实',
|
|
62
|
+
'- Work: `' + work.workId + '`',
|
|
63
|
+
'- 语义状态: `' + work.semanticState + '`',
|
|
64
|
+
'- Requirement: `' + (work.requirementId || '未绑定') + '`',
|
|
65
|
+
'- Plan: `' + (work.planId || '未绑定') + '`',
|
|
66
|
+
'- 父 Work: `' + (work.semanticParentWorkId || '无') + '`',
|
|
67
|
+
'- 最近语义更新: ' + (work.semanticUpdatedAt || work.updatedAt),
|
|
68
|
+
'',
|
|
69
|
+
'## 已选择的交付结果引用',
|
|
70
|
+
lines(work.semanticResultRefs),
|
|
71
|
+
];
|
|
72
|
+
if (requirement) {
|
|
73
|
+
text.push('', '## 原始需求:' + requirement.title, requirement.outcomeStatement, '',
|
|
74
|
+
'### 验收标准', lines(requirement.acceptanceCriteria));
|
|
75
|
+
if (requirement.needsAttention && requirement.attentionSummary) {
|
|
76
|
+
text.push('', '### Forge 记录的需关注事项', requirement.attentionSummary);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (planView) {
|
|
80
|
+
text.push('', '## 当前方案', planView.goal, '',
|
|
81
|
+
'### 方案决定', lines(planView.resolvedDecisions), '',
|
|
82
|
+
'### 方案项(描述性工作记忆,不是自动审批状态)',
|
|
83
|
+
lines(planView.items.map((item) => item.id + ' — ' + item.objective)));
|
|
84
|
+
}
|
|
85
|
+
text.push('', '> 未明确记录的用户产品审批、测试、发布均不能推断为通过。');
|
|
86
|
+
return text.join('\n') + '\n';
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function syncGitHubSemanticRelease(
|
|
90
|
+
repoRoot: string,
|
|
91
|
+
input: SemanticReleaseProjectionInput,
|
|
92
|
+
): SemanticReleaseProjectionResult {
|
|
93
|
+
const home = resolveRepoPreferredControllerHome(repoRoot);
|
|
94
|
+
const repositoryRecord = listRepositories(home).find((record) =>
|
|
95
|
+
record.canonicalRoot === repoRoot || record.localRoot === repoRoot ||
|
|
96
|
+
record.checkouts.some((checkout) => checkout.canonicalRoot === repoRoot || checkout.localRoot === repoRoot));
|
|
97
|
+
if (!repositoryRecord) throw new Error('GITHUB_SEMANTIC_REPOSITORY_NOT_REGISTERED');
|
|
98
|
+
const repoId = repositoryRecord.repoId;
|
|
99
|
+
const store = { controllerHome: home, repoId };
|
|
100
|
+
const releaseWorkId = safeIdentity(input.releaseWorkId);
|
|
101
|
+
const parent = getWorkContract(store, releaseWorkId);
|
|
102
|
+
if (!parent || parent.lifecycleRole === 'execution_child') throw new Error('GITHUB_SEMANTIC_RELEASE_WORK_NOT_FOUND');
|
|
103
|
+
if (parent.semanticParentWorkId) throw new Error('GITHUB_SEMANTIC_RELEASE_MUST_BE_ROOT');
|
|
104
|
+
const all: WorkContract[] = [];
|
|
105
|
+
for (let offset = 0; offset < 10_000; offset += 100) {
|
|
106
|
+
const page = listWorkContracts({ ...store, state: 'all', limit: 100, offset });
|
|
107
|
+
all.push(...page);
|
|
108
|
+
if (page.length < 100) break;
|
|
109
|
+
if (offset + 100 >= 10_000) throw new Error('GITHUB_SEMANTIC_WORK_INVENTORY_TOO_LARGE');
|
|
110
|
+
}
|
|
111
|
+
const children = all.filter((work) => work.semanticParentWorkId === releaseWorkId &&
|
|
112
|
+
work.lifecycleRole !== 'execution_child').sort((a, b) => a.workId.localeCompare(b.workId));
|
|
113
|
+
|
|
114
|
+
// The GitHub Issue is a projection; never import remote status back into Work.
|
|
115
|
+
if (Boolean(input.projectOwner) !== Boolean(input.projectNumber)) throw new Error('GITHUB_SEMANTIC_PROJECT_CONFIG_INCOMPLETE');
|
|
116
|
+
const repo = resolveGitHubRepository(repoRoot, input.repository);
|
|
117
|
+
const inventory = gh(repoRoot,
|
|
118
|
+
['issue', 'list', '--repo', repo.nameWithOwner, '--state', 'all', '--limit', '1000',
|
|
119
|
+
'--json', 'number,url,title,body'], undefined, 4 * 1024 * 1024);
|
|
120
|
+
if (!inventory.ok) throw new Error('GITHUB_SEMANTIC_ISSUE_INVENTORY_FAILED: ' + (inventory.error || inventory.stderr));
|
|
121
|
+
const remote = JSON.parse(inventory.stdout) as RemoteIssue[];
|
|
122
|
+
if (!Array.isArray(remote) || remote.length === 1000) {
|
|
123
|
+
throw new Error('GITHUB_SEMANTIC_ISSUE_INVENTORY_UNBOUNDED');
|
|
124
|
+
}
|
|
125
|
+
let created = 0;
|
|
126
|
+
let updated = 0;
|
|
127
|
+
let unchanged = 0;
|
|
128
|
+
const tmp = mkdtempSync(join(tmpdir(), 'forge-semantic-github-'));
|
|
129
|
+
function ensureIssue(workId: string, title: string, body: string): string {
|
|
130
|
+
const matches = remote.filter((issue) => issue.body?.includes(marker(workId)));
|
|
131
|
+
if (matches.length > 1) throw new Error('GITHUB_SEMANTIC_DUPLICATE_REMOTE_IDENTITY: ' + workId);
|
|
132
|
+
const file = join(tmp, 'issue.md');
|
|
133
|
+
writeFileSync(file, body, 'utf8');
|
|
134
|
+
let link: GitHubIssueLink;
|
|
135
|
+
if (matches.length === 1) {
|
|
136
|
+
const current = matches[0]!;
|
|
137
|
+
link = { owner: repo.owner, repo: repo.repo, number: current.number, url: current.url, syncedAt: '' };
|
|
138
|
+
if (current.title === title && current.body === body) unchanged++;
|
|
139
|
+
else { link = updateGitHubIssue(repoRoot, repo, link, title, file); updated++; }
|
|
140
|
+
} else {
|
|
141
|
+
link = createGitHubIssue(repoRoot, repo, title, file, []);
|
|
142
|
+
remote.push({ number: link.number, title, body, url: link.url });
|
|
143
|
+
created++;
|
|
144
|
+
}
|
|
145
|
+
if (input.projectOwner && input.projectNumber) {
|
|
146
|
+
addProjectItem(repoRoot, link, input.projectOwner, input.projectNumber);
|
|
147
|
+
}
|
|
148
|
+
return link.url;
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
const linked = children.map((work) => ({
|
|
152
|
+
workId: work.workId,
|
|
153
|
+
title: workDisplayTitle(work, home),
|
|
154
|
+
issue: ensureIssue(work.workId, workDisplayTitle(work, home),
|
|
155
|
+
semanticWorkText(work, home)),
|
|
156
|
+
}));
|
|
157
|
+
const counts = {
|
|
158
|
+
open: children.filter((work) => work.semanticState === 'open').length,
|
|
159
|
+
completed: children.filter((work) => work.semanticState === 'completed').length,
|
|
160
|
+
cancelled: children.filter((work) => work.semanticState === 'cancelled').length,
|
|
161
|
+
};
|
|
162
|
+
const releaseBody = semanticWorkText(parent, home) + '\n## 版本关联工作\n' +
|
|
163
|
+
(linked.length
|
|
164
|
+
? linked.map((child) => '- [' + child.title + '](' + child.issue + ') — \`' + child.workId + '\`').join('\n')
|
|
165
|
+
: '- 暂无已关联子 Work') +
|
|
166
|
+
'\n\n## 版本进度(真实 Work 事实,不是提交/发布证明)\n' +
|
|
167
|
+
'- 关联:' + linked.length + '\n- Open:' + counts.open +
|
|
168
|
+
'\n- Completed:' + counts.completed + '\n- Cancelled:' + counts.cancelled + '\n';
|
|
169
|
+
const releaseIssue = ensureIssue(releaseWorkId, workDisplayTitle(parent, home), releaseBody);
|
|
170
|
+
return { releaseIssue, children: linked, created, updated, unchanged };
|
|
171
|
+
} finally {
|
|
172
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
@@ -465,15 +465,6 @@ export function isAgenticPackagingIntent(ctx: PromptIntentContext): boolean {
|
|
|
465
465
|
return AGENTIC_PACKAGING.test(ctx.text);
|
|
466
466
|
}
|
|
467
467
|
|
|
468
|
-
const CODEGRAPH_ROUTE = re(
|
|
469
|
-
String.raw`(who calls|what calls|callers|callees|impact|impact radius|trace\s+(flow|path|call)|where\s.*(defined|definition)|definition of|symbol named|调用关系|谁调用|调用了谁|哪里定义|定义在哪|影响面|调用链|追踪(路径|调用|链)|从.*到.*怎么走)`,
|
|
470
|
-
);
|
|
471
|
-
|
|
472
|
-
export function isCodegraphRouteIntent(ctx: PromptIntentContext): boolean {
|
|
473
|
-
if (isTriggerQuestionPrompt(ctx)) return false;
|
|
474
|
-
return CODEGRAPH_ROUTE.test(ctx.text);
|
|
475
|
-
}
|
|
476
|
-
|
|
477
468
|
const GIT_STATUS_LINE = re(
|
|
478
469
|
String.raw`^${SP}*(git\s+(status|log|show|diff|push|pull|commit)|status|commit|push|merge|提交|推送|合并|看状态|看看状态)(${SP}|$)`,
|
|
479
470
|
);
|