@moretea-labs/forge 1.6.0 → 1.7.1
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 +4 -0
- package/CHANGELOG.md +39 -0
- package/CLAUDE.md +4 -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/02-operating-mode.partial.md +2 -0
- package/assets/partials-agents/03-orchestration.partial.md +1 -1
- package/assets/plugin-registry.v1.json +3 -3
- 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-architecture-sync.sh +17 -0
- 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/inspect-project-state.ts +8 -6
- package/assets/templates/helpers/migrate-project-template.sh +22 -45
- package/assets/templates/helpers/migrate-workflow-docs.ts +9 -7
- 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/helpers/workflow-contract.ts +5 -1
- 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 +178 -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-plugin-management.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 +143 -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 +33 -11
- package/scripts/activate-source-baseline.ts +17 -13
- package/scripts/architecture-event.ts +2 -820
- package/scripts/architecture-queue.sh +2 -645
- package/scripts/archive-architecture-request.sh +2 -242
- package/scripts/archive-workflow.sh +1 -291
- 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/capability-config.ts +2 -392
- package/scripts/capability-resolver.ts +2 -503
- package/scripts/capture-plan.sh +1 -332
- package/scripts/check-agent-tooling.sh +2 -1558
- package/scripts/check-architecture-sync.sh +2 -371
- package/scripts/check-brain-manifest.sh +2 -253
- package/scripts/check-context-files.sh +2 -47
- package/scripts/check-deploy-sql-order.sh +2 -115
- package/scripts/check-mcp-compatibility.ts +14 -0
- package/scripts/check-runtime-architecture.mjs +349 -79
- package/scripts/check-skill-version.ts +3 -191
- package/scripts/check-source-duplication.mjs +61 -0
- package/scripts/check-stable-baseline.ts +92 -0
- package/scripts/check-task-sync.sh +2 -63
- package/scripts/check-task-workflow.sh +2 -1000
- package/scripts/codex-handoff-resume.sh +2 -267
- package/scripts/context-contract-sync.sh +2 -514
- package/scripts/contract-run.ts +2 -463
- package/scripts/contract-worktree.sh +1 -722
- package/scripts/ensure-task-workflow.sh +1 -1225
- package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
- package/scripts/inspect-project-state.ts +4 -279
- package/scripts/install-standalone-recovery.ts +24 -0
- package/scripts/lib/project-init-lib.sh +22 -46
- package/scripts/lib/run-forge-helper.sh +19 -0
- package/scripts/lib/run-forge-helper.ts +26 -0
- package/scripts/migrate-project-template.sh +1 -1189
- package/scripts/migrate-workflow-docs.ts +4 -412
- package/scripts/new-plan.sh +1 -180
- package/scripts/new-spec.sh +1 -47
- package/scripts/new-sprint.sh +1 -46
- package/scripts/plan-to-todo.sh +1 -796
- package/scripts/prepare-codex-handoff.sh +2 -201
- package/scripts/prepare-handoff.sh +1 -78
- package/scripts/refresh-current-status.sh +2 -467
- package/scripts/run-governed-gate.ts +5 -1
- package/scripts/select-agent-context-blocks.sh +2 -64
- package/scripts/ship-worktrees.sh +1 -558
- package/scripts/smoke-ios-physical-device.ts +4 -2
- package/scripts/smoke-runtime-recovery.ts +1 -35
- package/scripts/smoke-schedule-engine.ts +1 -20
- package/scripts/sprint-backlog.sh +1 -834
- package/scripts/stage-runtime-release.ts +2 -1
- package/scripts/summarize-failures.sh +2 -123
- package/scripts/switch-plan.sh +1 -150
- package/scripts/sync-brain-docs.sh +2 -379
- package/scripts/sync-generated-authority.mjs +175 -0
- package/scripts/verify-contract.sh +2 -703
- package/scripts/verify-forge-runtime.sh +0 -1
- package/scripts/verify-sprint.sh +1 -677
- package/scripts/workflow-contract.ts +4 -205
- package/scripts/workstream-sync.sh +2 -261
- package/src/cli/agent-jobs/executor-health.ts +1 -1
- package/src/cli/commands/init-hook.ts +3 -3
- package/src/cli/commands/mcp.ts +9 -5
- package/src/cli/commands/plugin.ts +12 -3
- 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 +113 -5
- 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 +828 -487
- 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/contracts.ts +16 -0
- package/src/cli/github/github.ts +135 -16
- package/src/cli/github/session.ts +2 -1
- 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 +37 -264
- 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 +2 -515
- 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 +10 -222
- package/src/cli/mcp/multi-repository.ts +16 -5
- package/src/cli/mcp/oauth.ts +175 -26
- package/src/cli/mcp/post-finalize-work-attribution.ts +150 -0
- package/src/cli/mcp/repository-tools.ts +282 -146
- package/src/cli/mcp/server.ts +586 -116
- package/src/cli/mcp/tool-capability-cache.ts +1 -1
- package/src/cli/mcp/tool-contract.ts +14 -0
- package/src/cli/mcp/toolset-selection.ts +1 -1
- package/src/cli/mcp/toolset.ts +44 -7
- package/src/cli/mcp/transports/http.ts +124 -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 +103 -21
- package/src/cli/repositories/command-executor.ts +78 -526
- 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 +124 -0
- package/src/cli/repositories/selected-path-actions.ts +17 -9
- package/src/cli/repositories/structured-git.ts +118 -6
- package/src/cli/repository/inspector.ts +563 -65
- 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-contract.ts +61 -0
- package/src/runtime/context/semantic-navigation.ts +223 -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 +48 -16
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +106 -0
- package/src/runtime/control-plane/execution/retained-work-resume.ts +203 -0
- 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-completion-authority.ts +58 -0
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +200 -0
- package/src/runtime/control-plane/execution/work-execution-support.ts +386 -0
- package/src/runtime/control-plane/execution/work-finalization-service.ts +1913 -0
- package/src/runtime/control-plane/execution/work-handle-authority.ts +96 -0
- 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-operation-service.ts +468 -0
- package/src/runtime/control-plane/execution/work-path-scope.ts +37 -0
- package/src/runtime/control-plane/execution/work-preparation-service.ts +479 -0
- package/src/runtime/control-plane/execution/work-process-evidence.ts +129 -0
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
- package/src/runtime/control-plane/execution/work-task-receipt.ts +22 -18
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +156 -11
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
- package/src/runtime/control-plane/execution/work-verification-context.ts +56 -0
- package/src/runtime/control-plane/execution/work-verification-service.ts +388 -0
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +90 -9
- package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
- package/src/runtime/control-plane/facade/controller-round-relay.ts +1118 -0
- package/src/runtime/control-plane/facade/controller-session-store.ts +302 -12
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +17 -1
- package/src/runtime/control-plane/facade/goal-workloop.ts +928 -190
- package/src/runtime/control-plane/facade/index.ts +3 -0
- package/src/runtime/control-plane/facade/plan-contract-store.ts +275 -42
- package/src/runtime/control-plane/facade/repository-work-admission.ts +147 -0
- package/src/runtime/control-plane/facade/requirement-authority.ts +83 -0
- 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 +90 -10
- package/src/runtime/control-plane/facade/work-contract-store.ts +157 -261
- package/src/runtime/control-plane/facade/work-state-machine.ts +250 -0
- 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 +152 -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 +278 -543
- 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 +63 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +365 -117
- package/src/runtime/control-plane/launcher/launch-reservation-store.ts +89 -0
- package/src/runtime/control-plane/launcher/thin-launcher.ts +244 -11
- package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
- package/src/runtime/control-plane/persistence/requirement-store.ts +0 -12
- 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/repo-actor/registry.ts +4 -2
- package/src/runtime/control-plane/routing/route-policy.ts +24 -21
- package/src/runtime/control-plane/routing/workspace-admission.ts +70 -0
- 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/evidence/process-check-execution.ts +18 -0
- package/src/runtime/execution/jobs/child-reference.ts +6 -2
- 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 +88 -0
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +7 -1
- package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
- package/src/runtime/execution/process-runtime/command-facade.ts +367 -40
- package/src/runtime/execution/process-runtime/gc.ts +38 -6
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +1201 -0
- package/src/runtime/execution/process-runtime/persisted-check.ts +51 -5
- package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
- package/src/runtime/execution/process-runtime/runtime.ts +53 -3
- package/src/runtime/execution/process-runtime/store.ts +1 -0
- package/src/runtime/execution/process-runtime/types.ts +4 -12
- 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/work-activity.ts +21 -0
- package/src/runtime/execution/workers/executor.ts +18 -61
- package/src/runtime/gateway/mcp/execution-tools.ts +35 -1852
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +61 -0
- package/src/runtime/gateway/mcp/process-tools.ts +83 -37
- package/src/runtime/gateway/mcp/router.ts +186 -84
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +565 -0
- package/src/runtime/gateway/mcp/runtime-tools.ts +2378 -1947
- package/src/runtime/plugins/app-store-connect-adapter.ts +216 -47
- package/src/runtime/plugins/browser-adapter.ts +2662 -829
- package/src/runtime/plugins/browser-automation-service.ts +10 -0
- package/src/runtime/plugins/browser-handoff-host.ts +2 -25
- package/src/runtime/plugins/browser-handoff.ts +110 -5
- package/src/runtime/plugins/browser-macos-bridge.ts +701 -63
- package/src/runtime/plugins/browser-manifest-surface.ts +603 -0
- package/src/runtime/plugins/browser-native-session-service.ts +222 -0
- 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 +154 -0
- package/src/runtime/plugins/browser-runtime.ts +193 -0
- package/src/runtime/plugins/browser-session-authority.ts +332 -0
- package/src/runtime/plugins/browser-session-store.ts +121 -0
- package/src/runtime/plugins/browser-session-types.ts +98 -0
- package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
- package/src/runtime/plugins/desktop-operator-registration.ts +10 -4
- package/src/runtime/plugins/external-adapter.ts +358 -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 +47 -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 +330 -33
- package/src/runtime/plugins/types.ts +38 -3
- 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 +426 -25
- package/src/runtime/root/mcp-transport.ts +180 -10
- package/src/runtime/root/package-connector-service.ts +230 -10
- package/src/runtime/root/package-runtime-release.ts +143 -17
- package/src/runtime/root/package-runtime-service.ts +461 -22
- package/src/runtime/root/release-manifest.ts +144 -18
- package/src/runtime/root/release-materialize.ts +125 -32
- 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 +12 -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 +1079 -240
- package/src/runtime/standalone-recovery/entry.ts +100 -24
- package/src/runtime/standalone-recovery/installer.ts +20 -4
- 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 +364 -202
- package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
- package/src/runtime/workflow/schedules/settlement.ts +64 -17
- package/src/runtime/workflow/schedules/store.ts +209 -19
- 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
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# Personal assistant operator guide
|
|
2
|
-
|
|
3
|
-
This runtime is intended to be used with ChatGPT as the primary control plane. The Local Controller is the execution, policy, audit, and persistence layer.
|
|
4
|
-
|
|
5
|
-
## Recommended daily path
|
|
6
|
-
|
|
7
|
-
1. Ask ChatGPT for the goal in natural language.
|
|
8
|
-
2. ChatGPT calls the high-level assistant API or MCP tools.
|
|
9
|
-
3. The runtime plans safe plugin actions, submits durable jobs, and writes results into Assistant Inbox.
|
|
10
|
-
4. High-risk actions stay blocked until explicit human confirmation.
|
|
11
|
-
|
|
12
|
-
## Readiness check
|
|
13
|
-
|
|
14
|
-
Use `assistant_readiness` or `GET /api/assistant/readiness` before relying on the assistant.
|
|
15
|
-
|
|
16
|
-
The report separates:
|
|
17
|
-
|
|
18
|
-
- live Google capability
|
|
19
|
-
- mock-only capability
|
|
20
|
-
- disabled plugins
|
|
21
|
-
- routine, inbox, and memory state
|
|
22
|
-
- recommended next actions
|
|
23
|
-
|
|
24
|
-
Mock mode proves the execution path only. It does not read real Gmail, Calendar, or Tasks data.
|
|
25
|
-
|
|
26
|
-
## Gmail read self-test
|
|
27
|
-
|
|
28
|
-
A low-risk Gmail read test can be submitted through either:
|
|
29
|
-
|
|
30
|
-
- `plugin_action_execute` with `gmail.list_messages`
|
|
31
|
-
- `POST /api/assistant/self-test/gmail-read`
|
|
32
|
-
- `POST /api/assistant/intent` with an utterance such as `测试读取最近一周 Gmail`
|
|
33
|
-
|
|
34
|
-
When Gmail is in mock mode, the test returns deterministic mock messages. For real Gmail, configure the plugin with provider `google-workspace` and set one of the supported token environment variables documented by the plugin health message.
|
|
35
|
-
|
|
36
|
-
## Cleanup workflow
|
|
37
|
-
|
|
38
|
-
Use `runtime_cleanup_preview` or `POST /api/assistant/maintenance/cleanup-preview` first. It is non-destructive.
|
|
39
|
-
|
|
40
|
-
Use cleanup apply only after reviewing the preview:
|
|
41
|
-
|
|
42
|
-
- `runtime_cleanup_apply` with `confirm_cleanup=true`
|
|
43
|
-
- `POST /api/assistant/maintenance/cleanup-apply` with `confirmCleanup=true`
|
|
44
|
-
|
|
45
|
-
Cleanup is limited to explicit Forge candidates:
|
|
46
|
-
|
|
47
|
-
- old `Forge-*` temp directories that are not referenced by running processes
|
|
48
|
-
- terminal local jobs, when explicitly included
|
|
49
|
-
- historical attention acknowledgements, when explicitly included
|
|
50
|
-
|
|
51
|
-
Do not use cleanup apply as a substitute for reviewing active jobs, active leases, or running workers.
|
|
52
|
-
|
|
53
|
-
## What still needs real productization
|
|
54
|
-
|
|
55
|
-
The current runtime can route assistant intents and run safe data collection jobs. A full personal-assistant product still needs:
|
|
56
|
-
|
|
57
|
-
- real OAuth/token broker and refresh support
|
|
58
|
-
- wall-clock routine scheduling
|
|
59
|
-
- model-backed summarization of collected data
|
|
60
|
-
- approval summaries for risky actions
|
|
61
|
-
- cleanup apply integration in a dedicated maintenance UI
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# Provider configuration and routing
|
|
2
|
-
|
|
3
|
-
Forge does not require or privilege a specific model vendor. A fresh installation builds neutral routing from provider kind, declared capabilities, health, and the configured provider priority. Providers with the same priority use the provider id only as a deterministic tie-breaker.
|
|
4
|
-
|
|
5
|
-
## Where configuration lives
|
|
6
|
-
|
|
7
|
-
The Controller GUI and the JSON files below edit the same controller-scoped configuration:
|
|
8
|
-
|
|
9
|
-
- `<controllerHome>/global/provider-config.json`: enable/disable providers, priority, model and non-secret API settings.
|
|
10
|
-
- `<controllerHome>/global/executor-routing.json`: explicit provider order for each task intent.
|
|
11
|
-
- `<controllerHome>/global/provider-secrets.json`: locally stored API credentials. This file is outside the repository and must never be committed.
|
|
12
|
-
|
|
13
|
-
Opening the GUI or reading configuration does not rewrite these files. Existing routing and priority choices remain authoritative across upgrades.
|
|
14
|
-
|
|
15
|
-
## Precedence
|
|
16
|
-
|
|
17
|
-
Provider selection applies these rules in order:
|
|
18
|
-
|
|
19
|
-
1. Per-request provider preferences and allow/deny constraints.
|
|
20
|
-
2. An explicit order or default in `executor-routing.json`, including changes made in the GUI routing editor.
|
|
21
|
-
3. Neutral generated defaults based on provider kind and `provider-config.json` priority.
|
|
22
|
-
4. Availability, enablement, authentication, live-call policy, safety gates, and required capabilities.
|
|
23
|
-
5. A ChatGPT handoff packet when no direct provider can safely run.
|
|
24
|
-
|
|
25
|
-
An explicit routing order intentionally overrides the general provider priority. The GUI shows both controls so users can decide whether task types follow a specific route or the general provider preference. Use **Use automatic routing** in the routing panel to remove explicit overrides and resume generated priority-based routing; do not delete the whole controller configuration.
|
|
26
|
-
|
|
27
|
-
## Personal preferences
|
|
28
|
-
|
|
29
|
-
Maintainers and users may place Grok, Codex, Claude, an API provider, or another registered provider first in their own Controller configuration. Those preferences belong under `controllerHome`; they are not open-source defaults and are not copied into the repository.
|
|
30
|
-
|
|
31
|
-
Remote API calls remain double-gated: the provider must be enabled/configured in the GUI and `FORGE_ENABLE_LIVE_MODEL_PROVIDERS` must explicitly allow live calls. Without both, the API provider is proposal-only.
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
usage() {
|
|
5
|
-
cat <<'USAGE_EOF'
|
|
6
|
-
Usage: scripts/harness-trace-grade.sh --run <trace.json> [--repo <repo>] [--strict]
|
|
7
|
-
USAGE_EOF
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
run_file=""
|
|
11
|
-
repo="."
|
|
12
|
-
strict=0
|
|
13
|
-
|
|
14
|
-
while [[ $# -gt 0 ]]; do
|
|
15
|
-
case "$1" in
|
|
16
|
-
--run)
|
|
17
|
-
run_file="${2:-}"
|
|
18
|
-
shift 2
|
|
19
|
-
;;
|
|
20
|
-
--repo)
|
|
21
|
-
repo="${2:-.}"
|
|
22
|
-
shift 2
|
|
23
|
-
;;
|
|
24
|
-
--strict)
|
|
25
|
-
strict=1
|
|
26
|
-
shift
|
|
27
|
-
;;
|
|
28
|
-
--help|-h)
|
|
29
|
-
usage
|
|
30
|
-
exit 0
|
|
31
|
-
;;
|
|
32
|
-
*)
|
|
33
|
-
echo "Unknown argument: $1" >&2
|
|
34
|
-
usage
|
|
35
|
-
exit 1
|
|
36
|
-
;;
|
|
37
|
-
esac
|
|
38
|
-
done
|
|
39
|
-
|
|
40
|
-
[[ -n "$run_file" ]] || { usage >&2; exit 1; }
|
|
41
|
-
[[ -f "$run_file" ]] || { echo "Trace run file not found: $run_file" >&2; exit 1; }
|
|
42
|
-
command -v jq >/dev/null 2>&1 || { echo "jq is required for harness trace grading" >&2; exit 1; }
|
|
43
|
-
|
|
44
|
-
if REPO_ROOT="$(cd "$repo" && pwd -P 2>/dev/null)"; then
|
|
45
|
-
:
|
|
46
|
-
else
|
|
47
|
-
echo "Repo path not found: $repo" >&2
|
|
48
|
-
exit 1
|
|
49
|
-
fi
|
|
50
|
-
|
|
51
|
-
results_file="$(mktemp)"
|
|
52
|
-
trap 'rm -f "$results_file"' EXIT
|
|
53
|
-
: > "$results_file"
|
|
54
|
-
|
|
55
|
-
record() {
|
|
56
|
-
local id="$1"
|
|
57
|
-
local passed="$2"
|
|
58
|
-
local message="$3"
|
|
59
|
-
jq -n \
|
|
60
|
-
--arg id "$id" \
|
|
61
|
-
--argjson passed "$passed" \
|
|
62
|
-
--arg message "$message" \
|
|
63
|
-
'{id: $id, passed: $passed, message: $message}' >> "$results_file"
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
trace_get() {
|
|
67
|
-
local query="$1"
|
|
68
|
-
jq -r "$query // empty" "$run_file"
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
schema="$(trace_get '.schema')"
|
|
72
|
-
active_plan="$(trace_get '.active_plan')"
|
|
73
|
-
task_profile="$(trace_get '.task_profile')"
|
|
74
|
-
review_card_verdict="$(trace_get '.review.card.verdict')"
|
|
75
|
-
review_card_change_type="$(trace_get '.review.card.change_type')"
|
|
76
|
-
review_card_rollback="$(trace_get '.review.card.rollback')"
|
|
77
|
-
commands_count="$(jq '.commands | if type == "array" then length else 0 end' "$run_file")"
|
|
78
|
-
outside_count="$(jq '.allowed_paths_check.outside | if type == "array" then length else 0 end' "$run_file")"
|
|
79
|
-
allowed_status="$(trace_get '.allowed_paths_check.status')"
|
|
80
|
-
|
|
81
|
-
if [[ "$schema" == "forge-run-trace.v1" ]]; then
|
|
82
|
-
record "schema.v1" true "trace schema is forge-run-trace.v1"
|
|
83
|
-
else
|
|
84
|
-
record "schema.v1" false "trace schema is ${schema:-missing}"
|
|
85
|
-
fi
|
|
86
|
-
|
|
87
|
-
if [[ -n "$active_plan" && -f "$REPO_ROOT/$active_plan" ]]; then
|
|
88
|
-
record "active_plan.resolves" true "active plan resolves: $active_plan"
|
|
89
|
-
else
|
|
90
|
-
record "active_plan.resolves" false "active plan does not resolve: ${active_plan:-missing}"
|
|
91
|
-
fi
|
|
92
|
-
|
|
93
|
-
case "$task_profile" in
|
|
94
|
-
code-change|docs-only|ledger-closeout|migration|eval-only|delegated-run)
|
|
95
|
-
record "contract_profile.valid" true "contract profile is valid: $task_profile"
|
|
96
|
-
;;
|
|
97
|
-
*)
|
|
98
|
-
record "contract_profile.valid" false "contract profile is invalid: ${task_profile:-missing}"
|
|
99
|
-
;;
|
|
100
|
-
esac
|
|
101
|
-
|
|
102
|
-
if [[ "$review_card_verdict" == "pass" ]]; then
|
|
103
|
-
record "review_card.pass" true "Human Review Card verdict is pass"
|
|
104
|
-
else
|
|
105
|
-
record "review_card.pass" false "Human Review Card verdict is ${review_card_verdict:-missing}"
|
|
106
|
-
fi
|
|
107
|
-
|
|
108
|
-
if [[ -n "$review_card_change_type" && "$review_card_change_type" == "$task_profile" ]]; then
|
|
109
|
-
record "review_card.change_type" true "Human Review Card change type matches task profile"
|
|
110
|
-
else
|
|
111
|
-
record "review_card.change_type" false "Human Review Card change type ${review_card_change_type:-missing} does not match task profile ${task_profile:-missing}"
|
|
112
|
-
fi
|
|
113
|
-
|
|
114
|
-
rollback_token="$(printf '%s' "$review_card_rollback" | sed -E 's/[;,].*$//; s/[[:space:]].*$//; s/^[[:space:]]+//; s/[[:space:]]+$//' | tr '[:upper:]' '[:lower:]')"
|
|
115
|
-
case "$rollback_token" in
|
|
116
|
-
""|tbd|todo|n/a|na|none|unknown|unavailable|pending|...)
|
|
117
|
-
record "review_card.rollback" false "Human Review Card rollback is missing or not concrete"
|
|
118
|
-
;;
|
|
119
|
-
*)
|
|
120
|
-
record "review_card.rollback" true "Human Review Card rollback is concrete"
|
|
121
|
-
;;
|
|
122
|
-
esac
|
|
123
|
-
|
|
124
|
-
if [[ "$commands_count" -gt 0 ]] && jq -e '.commands[]? | select((.command // "") | length > 0)' "$run_file" >/dev/null; then
|
|
125
|
-
record "commands.present" true "commands evidence is present"
|
|
126
|
-
else
|
|
127
|
-
record "commands.present" false "commands evidence is missing"
|
|
128
|
-
fi
|
|
129
|
-
|
|
130
|
-
if [[ "$outside_count" -eq 0 && "$allowed_status" == "pass" ]]; then
|
|
131
|
-
record "allowed_paths.clean" true "no changed file is outside allowed paths"
|
|
132
|
-
else
|
|
133
|
-
record "allowed_paths.clean" false "allowed_paths status is ${allowed_status:-missing}; changed files outside allowed paths: $outside_count"
|
|
134
|
-
fi
|
|
135
|
-
|
|
136
|
-
failed="$(jq -s '[.[] | select(.passed == false)] | length' "$results_file")"
|
|
137
|
-
total="$(jq -s 'length' "$results_file")"
|
|
138
|
-
status="pass"
|
|
139
|
-
[[ "$failed" -eq 0 ]] || status="fail"
|
|
140
|
-
|
|
141
|
-
jq -s \
|
|
142
|
-
--arg status "$status" \
|
|
143
|
-
--arg run "$run_file" \
|
|
144
|
-
--argjson total "$total" \
|
|
145
|
-
--argjson failed "$failed" \
|
|
146
|
-
'{status: $status, run: $run, total: $total, failed: $failed, graders: .}' "$results_file"
|
|
147
|
-
|
|
148
|
-
if [[ "$strict" -eq 1 && "$failed" -ne 0 ]]; then
|
|
149
|
-
exit 1
|
|
150
|
-
fi
|
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
usage() {
|
|
5
|
-
cat <<'USAGE_EOF'
|
|
6
|
-
Usage: scripts/heartbeat-triage.sh [run] [--repo PATH] [--inbox PATH] [--run-id ID] [--source manual|scheduled] [--json]
|
|
7
|
-
|
|
8
|
-
Writes a heartbeat triage run to .ai/harness/triage/inbox.md. The command is
|
|
9
|
-
safe for cron/loop schedulers: findings are recorded as inbox entries and do
|
|
10
|
-
not make the process fail unless the runner itself is misconfigured.
|
|
11
|
-
USAGE_EOF
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
command="run"
|
|
15
|
-
repo="."
|
|
16
|
-
inbox_path=".ai/harness/triage/inbox.md"
|
|
17
|
-
run_id=""
|
|
18
|
-
run_source="manual"
|
|
19
|
-
json_output=0
|
|
20
|
-
|
|
21
|
-
if [[ "${1:-}" == "run" ]]; then
|
|
22
|
-
shift
|
|
23
|
-
elif [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
|
|
24
|
-
usage
|
|
25
|
-
exit 0
|
|
26
|
-
elif [[ "${1:-}" != "" && "${1:-}" != --* ]]; then
|
|
27
|
-
echo "heartbeat-triage: unknown command: $1" >&2
|
|
28
|
-
usage >&2
|
|
29
|
-
exit 2
|
|
30
|
-
fi
|
|
31
|
-
|
|
32
|
-
while [[ $# -gt 0 ]]; do
|
|
33
|
-
case "$1" in
|
|
34
|
-
--repo)
|
|
35
|
-
[[ -n "${2:-}" ]] || { echo "heartbeat-triage: --repo requires a value" >&2; exit 2; }
|
|
36
|
-
repo="$2"
|
|
37
|
-
shift 2
|
|
38
|
-
;;
|
|
39
|
-
--inbox)
|
|
40
|
-
[[ -n "${2:-}" ]] || { echo "heartbeat-triage: --inbox requires a value" >&2; exit 2; }
|
|
41
|
-
inbox_path="$2"
|
|
42
|
-
shift 2
|
|
43
|
-
;;
|
|
44
|
-
--run-id)
|
|
45
|
-
[[ -n "${2:-}" ]] || { echo "heartbeat-triage: --run-id requires a value" >&2; exit 2; }
|
|
46
|
-
run_id="$2"
|
|
47
|
-
shift 2
|
|
48
|
-
;;
|
|
49
|
-
--source)
|
|
50
|
-
[[ -n "${2:-}" ]] || { echo "heartbeat-triage: --source requires a value" >&2; exit 2; }
|
|
51
|
-
run_source="$2"
|
|
52
|
-
shift 2
|
|
53
|
-
;;
|
|
54
|
-
--json)
|
|
55
|
-
json_output=1
|
|
56
|
-
shift
|
|
57
|
-
;;
|
|
58
|
-
--help|-h)
|
|
59
|
-
usage
|
|
60
|
-
exit 0
|
|
61
|
-
;;
|
|
62
|
-
*)
|
|
63
|
-
echo "heartbeat-triage: unknown argument: $1" >&2
|
|
64
|
-
usage >&2
|
|
65
|
-
exit 2
|
|
66
|
-
;;
|
|
67
|
-
esac
|
|
68
|
-
done
|
|
69
|
-
|
|
70
|
-
[[ "$command" == "run" ]] || { echo "heartbeat-triage: unsupported command: $command" >&2; exit 2; }
|
|
71
|
-
|
|
72
|
-
repo="$(cd "$repo" 2>/dev/null && pwd -P)" || { echo "heartbeat-triage: repo not found: $repo" >&2; exit 2; }
|
|
73
|
-
cd "$repo"
|
|
74
|
-
|
|
75
|
-
timestamp="$(date '+%Y-%m-%dT%H:%M:%S%z')"
|
|
76
|
-
if [[ -z "$run_id" ]]; then
|
|
77
|
-
run_id="heartbeat-$(date '+%Y%m%dT%H%M%S')-$$"
|
|
78
|
-
fi
|
|
79
|
-
safe_run_id="$(printf '%s' "$run_id" | sed -E 's/[^A-Za-z0-9._-]+/-/g')"
|
|
80
|
-
|
|
81
|
-
if [[ "$inbox_path" = /* ]]; then
|
|
82
|
-
inbox_file="$inbox_path"
|
|
83
|
-
else
|
|
84
|
-
inbox_file="$repo/$inbox_path"
|
|
85
|
-
fi
|
|
86
|
-
|
|
87
|
-
runs_dir="$repo/.ai/harness/runs"
|
|
88
|
-
triage_dir="$(dirname "$inbox_file")"
|
|
89
|
-
run_file="$runs_dir/${safe_run_id}-heartbeat-triage.json"
|
|
90
|
-
mkdir -p "$triage_dir" "$runs_dir"
|
|
91
|
-
|
|
92
|
-
json_escape() {
|
|
93
|
-
local value="$1"
|
|
94
|
-
value="${value//\\/\\\\}"
|
|
95
|
-
value="${value//\"/\\\"}"
|
|
96
|
-
value="${value//$'\n'/\\n}"
|
|
97
|
-
value="${value//$'\r'/\\r}"
|
|
98
|
-
value="${value//$'\t'/\\t}"
|
|
99
|
-
printf '%s' "$value"
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
policy_get() {
|
|
103
|
-
local jq_path="$1"
|
|
104
|
-
local default_value="$2"
|
|
105
|
-
|
|
106
|
-
if [[ -f ".ai/harness/policy.json" ]] && command -v jq >/dev/null 2>&1; then
|
|
107
|
-
local value
|
|
108
|
-
value="$(jq -r "$jq_path // empty" ".ai/harness/policy.json" 2>/dev/null || true)"
|
|
109
|
-
if [[ -n "$value" ]]; then
|
|
110
|
-
printf '%s' "$value"
|
|
111
|
-
return 0
|
|
112
|
-
fi
|
|
113
|
-
fi
|
|
114
|
-
|
|
115
|
-
printf '%s' "$default_value"
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
helper_runtime_dir="$(policy_get '.harness.helper_runtime_dir' '.ai/harness/scripts')"
|
|
119
|
-
|
|
120
|
-
helper_path() {
|
|
121
|
-
local helper_name="$1"
|
|
122
|
-
|
|
123
|
-
if [[ -f "$helper_runtime_dir/$helper_name" ]]; then
|
|
124
|
-
printf '%s/%s' "$helper_runtime_dir" "$helper_name"
|
|
125
|
-
return 0
|
|
126
|
-
fi
|
|
127
|
-
|
|
128
|
-
if [[ -f "scripts/$helper_name" ]]; then
|
|
129
|
-
printf '%s/%s' "scripts" "$helper_name"
|
|
130
|
-
return 0
|
|
131
|
-
fi
|
|
132
|
-
|
|
133
|
-
printf '%s/%s' "$helper_runtime_dir" "$helper_name"
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
repo_relative() {
|
|
137
|
-
local path="$1"
|
|
138
|
-
case "$path" in
|
|
139
|
-
"$repo"/*) printf '%s' "${path#"$repo"/}" ;;
|
|
140
|
-
"$repo") printf '.' ;;
|
|
141
|
-
*) printf '%s' "$path" ;;
|
|
142
|
-
esac
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
first_line() {
|
|
146
|
-
awk 'NF { print; exit }'
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
date_plus_14_days() {
|
|
150
|
-
if date -v+14d '+%Y-%m-%d' >/dev/null 2>&1; then
|
|
151
|
-
date -v+14d '+%Y-%m-%d'
|
|
152
|
-
elif date -d '+14 days' '+%Y-%m-%d' >/dev/null 2>&1; then
|
|
153
|
-
date -d '+14 days' '+%Y-%m-%d'
|
|
154
|
-
else
|
|
155
|
-
date '+%Y-%m-%d'
|
|
156
|
-
fi
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
entry_kinds=()
|
|
160
|
-
entry_statuses=()
|
|
161
|
-
entry_summaries=()
|
|
162
|
-
entry_details=()
|
|
163
|
-
|
|
164
|
-
add_entry() {
|
|
165
|
-
entry_kinds+=("$1")
|
|
166
|
-
entry_statuses+=("$2")
|
|
167
|
-
entry_summaries+=("$3")
|
|
168
|
-
entry_details+=("$4")
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
run_workflow_check() {
|
|
172
|
-
local output status summary
|
|
173
|
-
local check_script
|
|
174
|
-
check_script="$(helper_path "check-task-workflow.sh")"
|
|
175
|
-
|
|
176
|
-
if [[ ! -f "$check_script" ]]; then
|
|
177
|
-
add_entry "workflow-check" "warning" "$check_script is missing" ""
|
|
178
|
-
return 0
|
|
179
|
-
fi
|
|
180
|
-
|
|
181
|
-
set +e
|
|
182
|
-
output="$(bash "$check_script" --strict 2>&1)"
|
|
183
|
-
status=$?
|
|
184
|
-
set -e
|
|
185
|
-
|
|
186
|
-
if [[ "$status" -eq 0 ]]; then
|
|
187
|
-
add_entry "workflow-check" "pass" "check-task-workflow.sh --strict passed" "$output"
|
|
188
|
-
else
|
|
189
|
-
summary="$(printf '%s\n' "$output" | first_line)"
|
|
190
|
-
add_entry "workflow-check" "fail" "${summary:-check-task-workflow.sh --strict failed}" "$output"
|
|
191
|
-
fi
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
extract_next_pending_from_sprint() {
|
|
195
|
-
local sprint_file="$1"
|
|
196
|
-
awk -F '|' '
|
|
197
|
-
function trim(s) {
|
|
198
|
-
gsub(/^[[:space:]]+|[[:space:]]+$/, "", s)
|
|
199
|
-
return s
|
|
200
|
-
}
|
|
201
|
-
/^## Backlog[[:space:]]*$/ { in_section = 1; next }
|
|
202
|
-
in_section && /^## / { exit }
|
|
203
|
-
!in_section { next }
|
|
204
|
-
/^\|[[:space:]]*[0-9]+[[:space:]]*\|/ {
|
|
205
|
-
idx = trim($2)
|
|
206
|
-
status = trim($3)
|
|
207
|
-
task = trim($4)
|
|
208
|
-
mode = trim($5)
|
|
209
|
-
acceptance = trim($6)
|
|
210
|
-
plan = trim($7)
|
|
211
|
-
if (status == "[ ]") {
|
|
212
|
-
printf "index: %s\ntask: %s\nmode: %s\nacceptance: %s\nplan: %s\n", idx, task, mode, acceptance, plan
|
|
213
|
-
exit
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
' "$sprint_file"
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
find_executing_sprint() {
|
|
220
|
-
local file status
|
|
221
|
-
local sprints_dir
|
|
222
|
-
sprints_dir="$(policy_get '.sprints.dir' 'plans/sprints')"
|
|
223
|
-
[[ -d "$sprints_dir" ]] || return 1
|
|
224
|
-
while IFS= read -r file; do
|
|
225
|
-
status="$(awk '/\*\*Status\*\*:/ { sub(/^.*\*\*Status\*\*: */, ""); gsub(/\r/, ""); print; exit }' "$file" | xargs)"
|
|
226
|
-
case "$status" in
|
|
227
|
-
Executing|Approved)
|
|
228
|
-
printf '%s\n' "$file"
|
|
229
|
-
return 0
|
|
230
|
-
;;
|
|
231
|
-
esac
|
|
232
|
-
done < <(find "$sprints_dir" -maxdepth 1 -name '*.sprint.md' -type f | sort -r)
|
|
233
|
-
return 1
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
run_sprint_next() {
|
|
237
|
-
local output status summary sprint_file task
|
|
238
|
-
local sprint_helper
|
|
239
|
-
sprint_helper="$(helper_path "sprint-backlog.sh")"
|
|
240
|
-
|
|
241
|
-
if [[ -f ".ai/harness/sprint/active-sprint" && -f "$sprint_helper" ]]; then
|
|
242
|
-
set +e
|
|
243
|
-
output="$(bash "$sprint_helper" next 2>&1)"
|
|
244
|
-
status=$?
|
|
245
|
-
set -e
|
|
246
|
-
if [[ "$status" -eq 0 ]]; then
|
|
247
|
-
task="$(printf '%s\n' "$output" | awk -F ': ' '/^task:/ { print $2; exit }')"
|
|
248
|
-
add_entry "sprint-next" "action" "next sprint task: ${task:-unknown}" "$output"
|
|
249
|
-
return 0
|
|
250
|
-
fi
|
|
251
|
-
if [[ "$status" -eq 3 ]]; then
|
|
252
|
-
add_entry "sprint-next" "pass" "no pending sprint task" "$output"
|
|
253
|
-
return 0
|
|
254
|
-
fi
|
|
255
|
-
fi
|
|
256
|
-
|
|
257
|
-
if sprint_file="$(find_executing_sprint)"; then
|
|
258
|
-
output="$(extract_next_pending_from_sprint "$sprint_file")"
|
|
259
|
-
if [[ -n "$output" ]]; then
|
|
260
|
-
task="$(printf '%s\n' "$output" | awk -F ': ' '/^task:/ { print $2; exit }')"
|
|
261
|
-
add_entry "sprint-next" "action" "next sprint task: ${task:-unknown}" "$output"
|
|
262
|
-
else
|
|
263
|
-
add_entry "sprint-next" "pass" "no pending sprint task in $sprint_file" ""
|
|
264
|
-
fi
|
|
265
|
-
else
|
|
266
|
-
add_entry "sprint-next" "info" "no active or executing sprint found" ""
|
|
267
|
-
fi
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
run_drift_requests() {
|
|
271
|
-
local details count
|
|
272
|
-
if [[ ! -d "docs/architecture/requests" ]]; then
|
|
273
|
-
add_entry "drift-requests" "pass" "no architecture request directory" ""
|
|
274
|
-
return 0
|
|
275
|
-
fi
|
|
276
|
-
|
|
277
|
-
details="$(find docs/architecture/requests -maxdepth 1 -type f ! -name '.gitkeep' | sort)"
|
|
278
|
-
if [[ -z "$details" ]]; then
|
|
279
|
-
add_entry "drift-requests" "pass" "no pending architecture drift requests" ""
|
|
280
|
-
return 0
|
|
281
|
-
fi
|
|
282
|
-
|
|
283
|
-
count="$(printf '%s\n' "$details" | sed '/^$/d' | wc -l | xargs)"
|
|
284
|
-
add_entry "drift-requests" "action" "${count} pending architecture drift request(s)" "$details"
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
write_json_snapshot() {
|
|
288
|
-
local target="$1"
|
|
289
|
-
local idx
|
|
290
|
-
{
|
|
291
|
-
echo "{"
|
|
292
|
-
printf ' "version": 1,\n'
|
|
293
|
-
printf ' "kind": "forge-heartbeat-triage",\n'
|
|
294
|
-
printf ' "run_id": "%s",\n' "$(json_escape "$run_id")"
|
|
295
|
-
printf ' "source": "%s",\n' "$(json_escape "$run_source")"
|
|
296
|
-
printf ' "generated_at": "%s",\n' "$(json_escape "$timestamp")"
|
|
297
|
-
printf ' "repo": "%s",\n' "$(json_escape "$repo")"
|
|
298
|
-
printf ' "inbox": "%s",\n' "$(json_escape "$(repo_relative "$inbox_file")")"
|
|
299
|
-
printf ' "run_file": "%s",\n' "$(json_escape "$(repo_relative "$run_file")")"
|
|
300
|
-
printf ' "adoption_review_due": "%s",\n' "$(json_escape "$adoption_review_due")"
|
|
301
|
-
echo ' "entries": ['
|
|
302
|
-
for idx in "${!entry_kinds[@]}"; do
|
|
303
|
-
[[ "$idx" -eq 0 ]] || echo ","
|
|
304
|
-
printf ' {"kind":"%s","status":"%s","summary":"%s","details":"%s"}' \
|
|
305
|
-
"$(json_escape "${entry_kinds[$idx]}")" \
|
|
306
|
-
"$(json_escape "${entry_statuses[$idx]}")" \
|
|
307
|
-
"$(json_escape "${entry_summaries[$idx]}")" \
|
|
308
|
-
"$(json_escape "${entry_details[$idx]}")"
|
|
309
|
-
done
|
|
310
|
-
echo
|
|
311
|
-
echo ' ]'
|
|
312
|
-
echo "}"
|
|
313
|
-
} > "$target"
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
write_inbox() {
|
|
317
|
-
local idx detail_line
|
|
318
|
-
if [[ ! -f "$inbox_file" ]]; then
|
|
319
|
-
{
|
|
320
|
-
echo "# Heartbeat Triage Inbox"
|
|
321
|
-
echo
|
|
322
|
-
echo "<!-- managed by scripts/heartbeat-triage.sh; append-only run log -->"
|
|
323
|
-
echo
|
|
324
|
-
} > "$inbox_file"
|
|
325
|
-
fi
|
|
326
|
-
|
|
327
|
-
{
|
|
328
|
-
echo "## Run ${run_id} - ${timestamp}"
|
|
329
|
-
echo
|
|
330
|
-
echo "- Source: ${run_source}"
|
|
331
|
-
echo "- Run snapshot: $(repo_relative "$run_file")"
|
|
332
|
-
echo "- Adoption review due: ${adoption_review_due}"
|
|
333
|
-
echo
|
|
334
|
-
echo "### Entries"
|
|
335
|
-
echo
|
|
336
|
-
for idx in "${!entry_kinds[@]}"; do
|
|
337
|
-
printf -- "- [%s] %s: %s\n" "${entry_statuses[$idx]}" "${entry_kinds[$idx]}" "${entry_summaries[$idx]}"
|
|
338
|
-
if [[ -n "${entry_details[$idx]}" ]]; then
|
|
339
|
-
while IFS= read -r detail_line; do
|
|
340
|
-
[[ -n "$detail_line" ]] || continue
|
|
341
|
-
printf ' - %s\n' "$detail_line"
|
|
342
|
-
done <<< "${entry_details[$idx]}"
|
|
343
|
-
fi
|
|
344
|
-
done
|
|
345
|
-
echo
|
|
346
|
-
} >> "$inbox_file"
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
adoption_review_due="$(date_plus_14_days)"
|
|
350
|
-
run_workflow_check
|
|
351
|
-
run_sprint_next
|
|
352
|
-
run_drift_requests
|
|
353
|
-
write_json_snapshot "$run_file"
|
|
354
|
-
write_inbox
|
|
355
|
-
|
|
356
|
-
if [[ "$json_output" -eq 1 ]]; then
|
|
357
|
-
cat "$run_file"
|
|
358
|
-
else
|
|
359
|
-
echo "[Heartbeat] wrote $(repo_relative "$inbox_file")"
|
|
360
|
-
echo "[Heartbeat] run snapshot: $(repo_relative "$run_file")"
|
|
361
|
-
fi
|