sneakoscope 6.0.3 → 6.1.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/README.md +29 -12
- package/config/codex-releases/{rust-v0.142.0.json → rust-v0.144.1.json} +6 -6
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/dist/bin/fast-inline.js +18 -14
- package/dist/bin/sks-dispatch.js +2 -4
- package/dist/cli/args.js +2 -0
- package/dist/cli/command-manifest-lite.js +2 -3
- package/dist/cli/command-registry.js +3 -4
- package/dist/cli/help-fast.js +1 -1
- package/dist/cli/install-helpers.js +348 -763
- package/dist/cli/install-tool-helpers.js +287 -0
- package/dist/cli/router.js +91 -6
- package/dist/commands/codex-lb.js +188 -53
- package/dist/commands/codex.js +44 -5
- package/dist/commands/doctor.js +302 -46
- package/dist/commands/tmux.js +5 -1
- package/dist/commands/versioning.js +7 -0
- package/dist/commands/zellij-monitor-pane.js +2 -0
- package/dist/commands/zellij-viewport-pane.js +3 -1
- package/dist/commands/zellij.js +1 -1
- package/dist/config/skills-manifest.json +59 -59
- package/dist/core/agent-bridge/agent-manifest.js +48 -0
- package/dist/core/agents/agent-central-ledger.js +9 -0
- package/dist/core/agents/agent-cleanup-executor.js +334 -41
- package/dist/core/agents/agent-cleanup.js +20 -1
- package/dist/core/agents/agent-command-surface.js +3 -1
- package/dist/core/agents/agent-effort-policy.js +30 -38
- package/dist/core/agents/agent-janitor.js +9 -10
- package/dist/core/agents/agent-namespace-safety.js +56 -0
- package/dist/core/agents/agent-orchestrator.js +25 -3
- package/dist/core/agents/agent-output-validator.js +1 -1
- package/dist/core/agents/agent-plan.js +100 -21
- package/dist/core/agents/agent-role-config.js +43 -49
- package/dist/core/agents/agent-runner-codex-exec.js +18 -3
- package/dist/core/agents/agent-runner-process.js +1 -0
- package/dist/core/agents/agent-schema.js +3 -2
- package/dist/core/agents/fast-mode-policy.js +3 -5
- package/dist/core/agents/native-cli-session-swarm.js +1 -1
- package/dist/core/agents/native-worker-backend-router.js +2 -1
- package/dist/core/agents/work-partition/repo-inventory.js +68 -7
- package/dist/core/agents/zellij-right-lane-cockpit.js +2 -2
- package/dist/core/code-structure.js +5 -4
- package/dist/core/codex/agent-config-file-repair.js +94 -193
- package/dist/core/codex/codex-cli-update.js +723 -0
- package/dist/core/codex/codex-config-guard.js +38 -11
- package/dist/core/codex/codex-project-config-policy.js +3 -6
- package/dist/core/codex/codex-startup-config-postcheck.js +52 -42
- package/dist/core/codex-adapter.js +35 -22
- package/dist/core/codex-app/codex-agent-role-sync.js +13 -54
- package/dist/core/codex-app/codex-app-fast-ui-repair.js +51 -20
- package/dist/core/codex-app/codex-app-launcher.js +48 -17
- package/dist/core/codex-app/codex-app-restart.js +23 -2
- package/dist/core/codex-app/codex-app-ui-state-snapshot.js +11 -3
- package/dist/core/codex-app/sks-menubar.js +136 -5
- package/dist/core/codex-app.js +35 -14
- package/dist/core/codex-compat/codex-hook-warning-detector.js +10 -1
- package/dist/core/codex-compat/codex-release-manifest.js +6 -6
- package/dist/core/codex-control/codex-0139-doctor-real-probe.js +7 -1
- package/dist/core/codex-control/codex-0139-image-path-real-probe.js +29 -12
- package/dist/core/codex-control/codex-0139-probe-runner.js +103 -28
- package/dist/core/codex-control/codex-0139-real-probe-summary.js +7 -3
- package/dist/core/codex-control/codex-0139-real-probes.js +21 -6
- package/dist/core/codex-control/codex-0139-sandbox-real-probe.js +39 -13
- package/dist/core/codex-control/codex-0139-web-search-probe.js +28 -14
- package/dist/core/codex-control/{codex-0142-capability.js → codex-0144-capability.js} +22 -22
- package/dist/core/codex-control/codex-0144-collab-agent-real-probe.js +63 -0
- package/dist/core/codex-control/codex-lb-launch-recovery.js +278 -0
- package/dist/core/codex-control/codex-multi-agent-event-normalizer.js +5 -1
- package/dist/core/codex-control/codex-reliability-shield.js +93 -30
- package/dist/core/codex-control/codex-sdk-adapter.js +96 -13
- package/dist/core/codex-control/codex-sdk-config-policy.js +2 -1
- package/dist/core/codex-control/codex-sdk-sandbox-policy.js +6 -3
- package/dist/core/codex-control/codex-task-runner.js +62 -9
- package/dist/core/codex-control/python-codex-sdk-adapter.js +30 -3
- package/dist/core/codex-exec-output-schema.js +35 -6
- package/dist/core/codex-lb/codex-lb-env.js +30 -1
- package/dist/core/codex-lb/codex-lb-tool-catalog.js +478 -0
- package/dist/core/codex-lb/codex-lb-tool-output-recovery.js +291 -0
- package/dist/core/codex-native/codex-native-feature-broker.js +31 -38
- package/dist/core/codex-native/codex-native-feature-matrix.js +2 -2
- package/dist/core/codex-native/codex-native-repair-transaction.js +1 -1
- package/dist/core/codex-native/core-skill-manifest.js +8 -4
- package/dist/core/codex-native/native-capability-postcheck.js +16 -8
- package/dist/core/codex-native/native-capability-repair-matrix.js +76 -27
- package/dist/core/codex-plugins/codex-plugin-json.js +67 -21
- package/dist/core/codex-plugins/codex-plugin-repair.js +118 -0
- package/dist/core/codex-runtime/codex-desktop-config-policy.js +305 -0
- package/dist/core/commands/agent-bridge-command.js +23 -2
- package/dist/core/commands/agent-command.js +38 -5
- package/dist/core/commands/basic-cli.js +77 -30
- package/dist/core/commands/command-utils.js +1 -1
- package/dist/core/commands/gc-command.js +27 -4
- package/dist/core/commands/image-ux-review-command.js +55 -24
- package/dist/core/commands/mad-sks-command.js +182 -137
- package/dist/core/commands/naruto-command.js +643 -1153
- package/dist/core/commands/pipeline-command.js +1 -0
- package/dist/core/commands/research-command.js +293 -231
- package/dist/core/commands/run-command.js +100 -23
- package/dist/core/commands/team-command.js +2 -3
- package/dist/core/commands/team-legacy-observe-command.js +94 -359
- package/dist/core/commands/wiki-command.js +179 -83
- package/dist/core/computer-use-live-evidence.js +166 -3
- package/dist/core/computer-use-status.js +5 -2
- package/dist/core/daemon/sksd-hook-daemon-entrypoint.js +2 -2
- package/dist/core/daemon/sksd-hook-daemon.js +171 -28
- package/dist/core/daemon/sksd-hook-dispatch.js +2 -2
- package/dist/core/db-safety.js +2 -2
- package/dist/core/decision-lattice.js +6 -6
- package/dist/core/dfix/verification-selector.js +6 -4
- package/dist/core/doctor/browser-use-repair.js +54 -13
- package/dist/core/doctor/codex-0139-doctor.js +3 -2
- package/dist/core/doctor/codex-startup-config-repair.js +8 -3
- package/dist/core/doctor/computer-use-repair.js +28 -39
- package/dist/core/doctor/doctor-codex-startup-repair.js +24 -149
- package/dist/core/doctor/doctor-context7-repair.js +1 -1
- package/dist/core/doctor/doctor-dirty-planner.js +1 -1
- package/dist/core/doctor/doctor-native-capability-repair.js +74 -3
- package/dist/core/doctor/imagegen-repair.js +47 -12
- package/dist/core/doctor/legacy-global-hook-cleanup.js +179 -0
- package/dist/core/feature-fixture-executor.js +71 -7
- package/dist/core/feature-fixture-runner.js +53 -12
- package/dist/core/feature-fixtures.js +47 -14
- package/dist/core/feature-registry.js +53 -58
- package/dist/core/fsx.js +54 -6
- package/dist/core/harness-conflicts.js +19 -10
- package/dist/core/hooks-runtime/code-pack-freshness-preflight.js +5 -4
- package/dist/core/hooks-runtime/hook-invocation-dedupe.js +147 -0
- package/dist/core/hooks-runtime/hook-io.js +14 -4
- package/dist/core/hooks-runtime/light-turn.js +70 -0
- package/dist/core/hooks-runtime/payload-signals.js +270 -0
- package/dist/core/hooks-runtime/team-digest.js +0 -1
- package/dist/core/hooks-runtime/tool-output-quarantine.js +93 -0
- package/dist/core/hooks-runtime.js +418 -250
- package/dist/core/image/image-artifact-path-contract.js +8 -6
- package/dist/core/image/image-artifact-registry.js +5 -1
- package/dist/core/image-ux-review/imagegen-adapter.js +5 -2
- package/dist/core/imagegen/imagegen-capability.js +10 -13
- package/dist/core/imagegen/require-imagegen.js +37 -11
- package/dist/core/init/skills.js +16 -30
- package/dist/core/init.js +144 -36
- package/dist/core/managed-assets/managed-assets-manifest.js +417 -14
- package/dist/core/mission.js +24 -1
- package/dist/core/naruto/naruto-work-graph.js +70 -4
- package/dist/core/ops/reporting.js +3 -0
- package/dist/core/pipeline-internals/runtime-core.js +578 -180
- package/dist/core/pipeline-internals/runtime-gates.js +191 -49
- package/dist/core/ppt/style-tokens.js +1 -1
- package/dist/core/ppt-review/index.js +1 -1
- package/dist/core/ppt-review/slide-exporter.js +23 -17
- package/dist/core/ppt-review/slide-imagegen-review.js +1 -1
- package/dist/core/ppt-review/slide-issue-extraction.js +4 -2
- package/dist/core/preflight/parallel-preflight-engine.js +50 -1
- package/dist/core/product-design-plugin.js +2 -2
- package/dist/core/proof/route-finalizer.js +1 -1
- package/dist/core/proof/route-proof-gate.js +7 -2
- package/dist/core/proof-field.js +3 -3
- package/dist/core/provider/model-router.js +38 -32
- package/dist/core/recallpulse/policy.js +12 -28
- package/dist/core/recallpulse.js +11 -6
- package/dist/core/release/gate-manifest.js +18 -12
- package/dist/core/release/gate-pack-manifest.js +1 -1
- package/dist/core/release/npm-pack-proof.js +247 -0
- package/dist/core/release/package-dist-snapshot.js +151 -0
- package/dist/core/release/package-size-budget.js +5 -0
- package/dist/core/release/release-authorization-snapshot.js +115 -0
- package/dist/core/release/release-gate-affected-selector.js +15 -3
- package/dist/core/release/release-gate-cache-v2.js +30 -0
- package/dist/core/release/release-gate-contract.js +161 -0
- package/dist/core/release/release-gate-dag.js +44 -3
- package/dist/core/release/release-gate-hermetic-env.js +28 -17
- package/dist/core/release/release-real-contract.js +496 -0
- package/dist/core/release-parallel-full-coverage.js +31 -143
- package/dist/core/research/claim-evidence-matrix.js +41 -6
- package/dist/core/research/experiment-plan.js +14 -10
- package/dist/core/research/falsification.js +9 -2
- package/dist/core/research/implementation-blueprint-densifier.js +82 -60
- package/dist/core/research/implementation-blueprint.js +32 -26
- package/dist/core/research/mock-result.js +122 -11
- package/dist/core/research/replication-pack.js +15 -8
- package/dist/core/research/research-adversarial-review.js +1068 -0
- package/dist/core/research/research-claim-builder.js +69 -17
- package/dist/core/research/research-claim-synthesizer.js +343 -0
- package/dist/core/research/research-cycle-runner.js +53 -3
- package/dist/core/research/research-falsification-runner.js +176 -0
- package/dist/core/research/research-final-reviewer.js +44 -125
- package/dist/core/research/research-realistic-report.js +14 -6
- package/dist/core/research/research-review-artifact-digest.js +66 -0
- package/dist/core/research/research-source-evidence.js +144 -0
- package/dist/core/research/research-source-layer-catalog.js +68 -0
- package/dist/core/research/research-source-ledger-merge.js +250 -12
- package/dist/core/research/research-source-shards.js +26 -70
- package/dist/core/research/research-stage-runner.js +237 -247
- package/dist/core/research/research-super-search.js +184 -0
- package/dist/core/research/research-synthesis-prompt.js +20 -1
- package/dist/core/research/research-synthesis-writer.js +86 -5
- package/dist/core/research/research-work-graph.js +25 -18
- package/dist/core/research/source-quality-report.js +21 -0
- package/dist/core/research.js +429 -280
- package/dist/core/retention/retention-budget.js +25 -6
- package/dist/core/retention.js +980 -101
- package/dist/core/routes/constants.js +1 -1
- package/dist/core/routes/dollar-manifest-lite.js +11 -11
- package/dist/core/routes/evidence.js +4 -4
- package/dist/core/routes/ppt-policy.js +1 -1
- package/dist/core/routes.js +92 -64
- package/dist/core/runtime/task-profile.js +66 -0
- package/dist/core/runtime/verification-budget.js +12 -0
- package/dist/core/secret-redaction.js +4 -0
- package/dist/core/security/high-risk-contracts.js +6 -6
- package/dist/core/stop-gate/stop-gate-check.js +49 -12
- package/dist/core/subagents/agent-catalog.js +215 -0
- package/dist/core/subagents/model-policy.js +118 -0
- package/dist/core/subagents/naruto-help-contract.js +40 -0
- package/dist/core/subagents/official-subagent-config.js +488 -0
- package/dist/core/subagents/official-subagent-preparation.js +251 -0
- package/dist/core/subagents/official-subagent-prompt.js +137 -0
- package/dist/core/subagents/official-subagent-runner.js +129 -0
- package/dist/core/subagents/subagent-evidence.js +663 -0
- package/dist/core/subagents/terminology.js +16 -0
- package/dist/core/subagents/thread-budget.js +21 -0
- package/dist/core/subagents/triwiki-attention.js +65 -0
- package/dist/core/super-search/runtime-helpers.js +173 -19
- package/dist/core/super-search/runtime.js +140 -15
- package/dist/core/super-search/source-records.js +49 -8
- package/dist/core/team-review-policy.js +15 -0
- package/dist/core/triwiki/code-pack.js +8 -2
- package/dist/core/triwiki/triwiki-cache-key.js +108 -29
- package/dist/core/triwiki/triwiki-module-card.js +1 -1
- package/dist/core/triwiki-attention.js +13 -6
- package/dist/core/triwiki-provenance.js +274 -0
- package/dist/core/triwiki-runtime.js +21 -7
- package/dist/core/triwiki-wrongness/wrongness-ledger.js +187 -61
- package/dist/core/triwiki-wrongness/wrongness-retrieval.js +11 -2
- package/dist/core/triwiki-wrongness/wrongness-trust-policy.js +2 -0
- package/dist/core/update-check.js +23 -15
- package/dist/core/version-manager.js +51 -1
- package/dist/core/version.js +1 -1
- package/dist/core/wiki-coordinate.js +128 -12
- package/dist/core/work-order-ledger.js +208 -10
- package/dist/core/zellij/zellij-command.js +12 -1
- package/dist/core/zellij/zellij-dashboard-pane.js +3 -3
- package/dist/core/zellij/zellij-fake-adapter.js +3 -1
- package/dist/core/zellij/zellij-launcher.js +51 -21
- package/dist/core/zellij/zellij-layout-builder.js +14 -5
- package/dist/core/zellij/zellij-official-subagent-activity.js +477 -0
- package/dist/core/zellij/zellij-official-subagent-telemetry.js +264 -0
- package/dist/core/zellij/zellij-pane-proof.js +32 -6
- package/dist/core/zellij/zellij-slot-pane-renderer.js +17 -5
- package/dist/core/zellij/zellij-slot-telemetry.js +15 -3
- package/dist/core/zellij/zellij-ui-mode.js +1 -1
- package/dist/core/zellij/zellij-viewport-binder.js +3 -0
- package/dist/core/zellij/zellij-worker-pane-manager.js +5 -3
- package/dist/scripts/agent-fast-mode-default-check.js +48 -29
- package/dist/scripts/agent-role-config-repair-check.js +34 -15
- package/dist/scripts/agent-wiki-context-proof-check.js +16 -2
- package/dist/scripts/all-feature-deep-completion-check.js +14 -4
- package/dist/scripts/architecture-guard-check.js +8 -1
- package/dist/scripts/build-dist.js +17 -5
- package/dist/scripts/canonical-test-runner.js +188 -0
- package/dist/scripts/check-command-module-budget.js +38 -16
- package/dist/scripts/check-legacy-free.js +1 -1
- package/dist/scripts/check-route-modularity.js +0 -1
- package/dist/scripts/check-ts-contracts.js +1 -1
- package/dist/scripts/codex-0139-interrupt-agent-check.js +5 -1
- package/dist/scripts/{codex-0142-app-server-v2-check.js → codex-0144-app-server-v2-check.js} +11 -10
- package/dist/scripts/{codex-0142-binary-identity-check.js → codex-0144-binary-identity-check.js} +4 -4
- package/dist/scripts/codex-0144-capability-check.js +21 -0
- package/dist/scripts/{codex-0139-real-probes-check.js → codex-0144-core-real-probes-check.js} +19 -5
- package/dist/scripts/{codex-0142-doctor-wiring-check.js → codex-0144-doctor-wiring-check.js} +6 -6
- package/dist/scripts/{codex-0142-manifest-check.js → codex-0144-manifest-check.js} +11 -3
- package/dist/scripts/{codex-0142-policy-check.js → codex-0144-policy-check.js} +2 -2
- package/dist/scripts/{codex-0142-thread-store-check.js → codex-0144-thread-store-check.js} +3 -3
- package/dist/scripts/codex-app-provider-model-ui-check.js +53 -19
- package/dist/scripts/codex-app-ui-preservation-check.js +35 -4
- package/dist/scripts/codex-control-all-pipelines-check.js +7 -3
- package/dist/scripts/codex-control-side-effect-scope-check.js +2 -2
- package/dist/scripts/codex-control-tool-output-continuity-audit-check.js +27 -0
- package/dist/scripts/codex-effort-auto-discovery-check.js +1 -1
- package/dist/scripts/codex-lb-fast-mode-truth-check.js +1 -0
- package/dist/scripts/{codex-lb-gpt55-fast-profile-check.js → codex-lb-gpt56-fast-profile-check.js} +56 -5
- package/dist/scripts/codex-model-metadata-check.js +1 -1
- package/dist/scripts/codex-native-agent-role-content-check.js +15 -7
- package/dist/scripts/codex-native-repair-transaction-check.js +3 -1
- package/dist/scripts/codex-sdk-all-pipelines-check.js +7 -4
- package/dist/scripts/codex-sdk-research-pipeline-check.js +30 -8
- package/dist/scripts/codex-sdk-sandbox-policy-check.js +5 -1
- package/dist/scripts/codex-sdk-version-compat-check.js +2 -1
- package/dist/scripts/db-route-materialization-check.js +33 -0
- package/dist/scripts/dfix-fixture-check.js +1 -1
- package/dist/scripts/docs-truthfulness-check.js +4 -2
- package/dist/scripts/doctor-codex-startup-repair-check.js +47 -25
- package/dist/scripts/doctor-context7-repair-check.js +2 -1
- package/dist/scripts/doctor-fix-production-blackbox.js +12 -2
- package/dist/scripts/doctor-fixes-codex-app-fast-ui-check.js +34 -7
- package/dist/scripts/doctor-imagegen-repair-check.js +14 -4
- package/dist/scripts/doctor-startup-config-repair-blackbox.js +9 -3
- package/dist/scripts/doctor-startup-config-repair-check.js +13 -3
- package/dist/scripts/install-update-preserves-config-check.js +7 -2
- package/dist/scripts/legacy-gate-inventory-check.js +7 -5
- package/dist/scripts/legacy-strong-inventory-check.js +7 -5
- package/dist/scripts/legacy-upgrade-matrix-check.js +4 -4
- package/dist/scripts/lib/native-cli-session-swarm-check-lib.js +173 -13
- package/dist/scripts/mad-sks-app-ui-no-mutation-check.js +165 -6
- package/dist/scripts/managed-role-manifest-parity-check.js +5 -4
- package/dist/scripts/mutation-callsite-coverage-check.js +0 -11
- package/dist/scripts/naruto-codex-e2e-check.js +14 -7
- package/dist/scripts/naruto-shadow-clone-swarm-check.js +4 -201
- package/dist/scripts/npm-publish-performance-check.js +20 -12
- package/dist/scripts/official-subagent-workflow-check.js +145 -0
- package/dist/scripts/package-published-contract-check.js +6 -20
- package/dist/scripts/packlist-performance-check.js +17 -3
- package/dist/scripts/parallel-verification-engine-check.js +2 -2
- package/dist/scripts/postinstall-safe-side-effects-check.js +8 -3
- package/dist/scripts/ppt-no-mock-as-real-check.js +3 -1
- package/dist/scripts/prepublish-release-check-or-fast.js +23 -86
- package/dist/scripts/product-design-plugin-routing-check.js +1 -1
- package/dist/scripts/release-affected-selector-check.js +74 -1
- package/dist/scripts/release-check-stamp.js +324 -239
- package/dist/scripts/release-dag-full-coverage-check.js +7 -15
- package/dist/scripts/release-dynamic-presets-check.js +10 -1
- package/dist/scripts/release-gate-dag-runner-check.js +3 -3
- package/dist/scripts/release-gate-dag-runner.js +35 -11
- package/dist/scripts/release-gate-existence-audit.js +1 -2
- package/dist/scripts/release-gate-script-parity-check.js +1 -1
- package/dist/scripts/release-parallel-full-coverage-check.js +12 -6
- package/dist/scripts/release-parallel-speed-budget-check.js +18 -2
- package/dist/scripts/release-real-check.js +390 -157
- package/dist/scripts/release-registry-check.js +61 -16
- package/dist/scripts/release-runtime-truth-matrix-check.js +22 -0
- package/dist/scripts/research-blueprint-densifier-check.js +2 -2
- package/dist/scripts/research-real-cycle-no-legacy-final-md-check.js +11 -7
- package/dist/scripts/route-proof-artifact-structure-check.js +1 -0
- package/dist/scripts/search-visibility-gate-lib.js +1 -1
- package/dist/scripts/seo-geo-route-identity-check.js +30 -4
- package/dist/scripts/sizecheck.js +4 -4
- package/dist/scripts/sks-1-11-gate-lib.js +53 -6
- package/dist/scripts/sks-3-1-4-directive-check-lib.js +8 -2
- package/dist/scripts/sks-3-1-5-directive-check-lib.js +3 -2
- package/dist/scripts/sks-3-1-6-directive-check-lib.js +5 -3
- package/dist/scripts/sks-menubar-install-check.js +8 -0
- package/dist/scripts/sks-uninstall-regression-check.js +1 -1
- package/dist/scripts/sksd-daemon-check.js +16 -6
- package/dist/scripts/trust-fixture-check.js +32 -10
- package/dist/scripts/write-build-manifest.js +2 -1
- package/dist/scripts/wrongness-fixture-check.js +1 -1
- package/dist/scripts/zellij-layout-valid-check.js +36 -11
- package/dist/scripts/zellij-pane-proof-check.js +33 -2
- package/dist/scripts/zellij-real-session-cleanup-check.js +122 -2
- package/dist/scripts/zellij-real-session-launch-check.js +76 -5
- package/dist/scripts/zellij-slot-pane-renderer-check.js +4 -4
- package/dist/scripts/zellij-spawn-on-demand-layout-check.js +3 -3
- package/docs/demo.tape +1 -1
- package/infra-harness-gates.json +1486 -0
- package/package.json +32 -19
- package/release-gates.v2.json +4060 -0
- package/runtime-required-scripts.json +9 -0
- package/schemas/codex/{app-server-0.142 → app-server-0.144}/codex_app_server_protocol.v2.schemas.json +1146 -781
- package/schemas/codex/codex-0139-real-probe-result.schema.json +39 -5
- package/schemas/codex/ppt-slide-issue-ledger.schema.json +2 -1
- package/dist/commands/db.js +0 -6
- package/dist/core/codex-control/codex-0139-multi-agent-real-probe.js +0 -107
- package/dist/core/commands/db-command.js +0 -146
- package/dist/core/research/prompt.js +0 -15
- package/dist/scripts/agent-native-release-gate.js +0 -274
- package/dist/scripts/codex-0142-capability-check.js +0 -21
- package/dist/scripts/codex-control-tool-call-sequence-repair-check.js +0 -14
- package/dist/scripts/command-performance-scorecard-check.js +0 -204
- package/dist/scripts/config-managed-merge-callsite-coverage-check.js +0 -212
- package/dist/scripts/dollar-performance-scorecard-check.js +0 -257
- package/dist/scripts/gate-timing-check.js +0 -16
- package/dist/scripts/ops-maturity-scorecard-check.js +0 -12
- package/dist/scripts/performance-baseline-check.js +0 -12
- package/dist/scripts/performance-improvement-report-check.js +0 -58
- package/dist/scripts/release-parallel-check.js +0 -389
- package/dist/scripts/release-runner-efficiency-check.js +0 -15
- package/dist/scripts/retention-long-run-smoke-check.js +0 -299
- package/docs/assets/sneakoscope-architecture-pipeline.jpg +0 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { DEFAULT_CODEX_APP_PLUGINS } from '../routes.js';
|
|
4
|
+
import { ensureDir, PACKAGE_VERSION, readText, writeTextAtomic } from '../fsx.js';
|
|
5
|
+
import { removeLegacyTopLevelCodexModeLocks, writeCodexConfigGuarded } from '../codex/codex-config-guard.js';
|
|
6
|
+
import { cleanupCodexConfigBackups, validateCodexConfigRoundTrip } from '../codex/codex-config-toml.js';
|
|
7
|
+
export async function ensureGlobalCodexFastModeDuringInstall(opts = {}) {
|
|
8
|
+
if (process.env.SKS_SKIP_CODEX_FAST_MODE_REPAIR === '1')
|
|
9
|
+
return { status: 'skipped', reason: 'SKS_SKIP_CODEX_FAST_MODE_REPAIR=1' };
|
|
10
|
+
const home = opts.home || process.env.HOME || os.homedir();
|
|
11
|
+
const configPath = opts.configPath || path.join(home, '.codex', 'config.toml');
|
|
12
|
+
try {
|
|
13
|
+
await ensureDir(path.dirname(configPath));
|
|
14
|
+
const current = await readText(configPath, '');
|
|
15
|
+
if (current.trim()) {
|
|
16
|
+
const currentSmoke = codexConfigParseSmoke(current);
|
|
17
|
+
if (!currentSmoke.ok) {
|
|
18
|
+
const backupPath = await backupCodexConfig(configPath, current, 'unparseable');
|
|
19
|
+
return { status: 'unparseable_config_preserved', config_path: configPath, backup_path: backupPath, parse_smoke: currentSmoke };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const next = normalizeCodexFastModeUiConfig(current, {
|
|
23
|
+
forceFastMode: opts.forceFastMode === true,
|
|
24
|
+
forceFastModeOff: opts.forceFastModeOff === true
|
|
25
|
+
});
|
|
26
|
+
if (next === ensureTrailingNewline(current)) {
|
|
27
|
+
const guarded = await safeWriteCodexConfigToml(configPath, current, next, 'codex-fast-mode-install-present', {
|
|
28
|
+
preserveFastUiKeys: opts.forceFastModeOff !== true
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
status: guarded.status,
|
|
32
|
+
config_path: configPath,
|
|
33
|
+
backup_path: guarded.backup_path,
|
|
34
|
+
parse_smoke: guarded.ok ? undefined : guarded
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const safeWrite = await safeWriteCodexConfigToml(configPath, current, next, 'codex-fast-mode-install', {
|
|
38
|
+
preserveFastUiKeys: opts.forceFastModeOff !== true
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
status: safeWrite.status === 'written' ? 'updated' : safeWrite.status,
|
|
42
|
+
config_path: configPath,
|
|
43
|
+
backup_path: safeWrite.backup_path,
|
|
44
|
+
parse_smoke: safeWrite.ok ? undefined : safeWrite
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
return { status: 'failed', config_path: configPath, error: err.message };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function normalizeCodexFastModeUiConfig(text = '', opts = {}) {
|
|
52
|
+
return normalizeCodexFastModeUiConfigOnce(normalizeCodexFastModeUiConfigOnce(text, opts), opts);
|
|
53
|
+
}
|
|
54
|
+
function normalizeCodexFastModeUiConfigOnce(text = '', opts = {}) {
|
|
55
|
+
let next = String(text || '');
|
|
56
|
+
next = removeLegacyTopLevelCodexModeLocks(next);
|
|
57
|
+
next = removeTopLevelTomlKeyIfValue(next, 'default_profile', 'sks-fast-high');
|
|
58
|
+
next = removeTomlTable(next, 'user.fast_mode');
|
|
59
|
+
next = removeTomlTable(next, 'profiles.sks-fast-high');
|
|
60
|
+
next = removeTomlTableKey(next, 'notice', 'fast_default_opt_out');
|
|
61
|
+
for (const legacyFlag of ['codex_hooks', 'remote_control', 'fast_mode_ui', 'codex_git_commit']) {
|
|
62
|
+
next = removeTomlTableKey(next, 'features', legacyFlag, 'true');
|
|
63
|
+
}
|
|
64
|
+
if (opts.forceFastMode === true) {
|
|
65
|
+
next = upsertTopLevelTomlString(next, 'service_tier', 'fast');
|
|
66
|
+
}
|
|
67
|
+
else if (opts.forceFastModeOff === true) {
|
|
68
|
+
next = removeTopLevelTomlKey(next, 'service_tier');
|
|
69
|
+
}
|
|
70
|
+
next = upsertTopLevelTomlBooleanIfAbsent(next, 'suppress_unstable_features_warning', true);
|
|
71
|
+
for (const featureLine of [
|
|
72
|
+
'hooks = true',
|
|
73
|
+
'multi_agent = true',
|
|
74
|
+
'fast_mode = true',
|
|
75
|
+
'apps = true',
|
|
76
|
+
'computer_use = true',
|
|
77
|
+
'browser_use = true',
|
|
78
|
+
'browser_use_external = true',
|
|
79
|
+
'image_generation = true',
|
|
80
|
+
'in_app_browser = true',
|
|
81
|
+
'guardian_approval = true',
|
|
82
|
+
'tool_suggest = true',
|
|
83
|
+
'plugins = true'
|
|
84
|
+
]) {
|
|
85
|
+
next = upsertTomlTableKeyIfAbsent(next, 'features', featureLine);
|
|
86
|
+
}
|
|
87
|
+
// Global postinstall must not impose a project concurrency policy. Existing
|
|
88
|
+
// user [agents] values are preserved verbatim; project setup owns defaults.
|
|
89
|
+
next = removeTomlTable(next, 'features.multi_agent_v2');
|
|
90
|
+
if (process.env.SKS_MANAGE_CODEX_APP_PLUGINS === '1') {
|
|
91
|
+
for (const [name, marketplace] of DEFAULT_CODEX_APP_PLUGINS) {
|
|
92
|
+
const table = `plugins."${name}@${marketplace}"`;
|
|
93
|
+
if (!hasTomlTable(next, table))
|
|
94
|
+
next = upsertTomlTable(next, table, `[${table}]\nenabled = true`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return ensureTrailingNewline(next);
|
|
98
|
+
}
|
|
99
|
+
function removeTopLevelTomlKey(text = '', key = '') {
|
|
100
|
+
const lines = String(text || '').split('\n');
|
|
101
|
+
const firstTable = lines.findIndex((line) => /^\s*\[.+\]\s*$/.test(line));
|
|
102
|
+
const end = firstTable === -1 ? lines.length : firstTable;
|
|
103
|
+
const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
|
|
104
|
+
return lines.filter((line, index) => index >= end || !keyPattern.test(line)).join('\n').replace(/^\n+/, '').replace(/\n{3,}/g, '\n\n');
|
|
105
|
+
}
|
|
106
|
+
function removeTomlTable(text, table) {
|
|
107
|
+
const lines = String(text || '').trimEnd().split('\n');
|
|
108
|
+
const header = `[${table}]`;
|
|
109
|
+
const start = lines.findIndex((line) => line.trim() === header);
|
|
110
|
+
if (start === -1)
|
|
111
|
+
return String(text || '');
|
|
112
|
+
let end = lines.length;
|
|
113
|
+
for (let i = start + 1; i < lines.length; i += 1) {
|
|
114
|
+
if (/^\s*\[.+\]\s*$/.test(lines[i] || '')) {
|
|
115
|
+
end = i;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return lines.filter((_, index) => index < start || index >= end).join('\n').replace(/^\n+/, '').replace(/\n{3,}/g, '\n\n');
|
|
120
|
+
}
|
|
121
|
+
export function removeTopLevelTomlKeyIfValue(text = '', key = '', value = '') {
|
|
122
|
+
const lines = String(text || '').split('\n');
|
|
123
|
+
const firstTable = lines.findIndex((line) => /^\s*\[.+\]\s*$/.test(line));
|
|
124
|
+
const end = firstTable === -1 ? lines.length : firstTable;
|
|
125
|
+
const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=\\s*"${escapeRegExp(value)}"\\s*(?:#.*)?$`);
|
|
126
|
+
return lines.filter((line, index) => index >= end || !keyPattern.test(line)).join('\n').replace(/^\n+/, '').replace(/\n{3,}/g, '\n\n');
|
|
127
|
+
}
|
|
128
|
+
function removeTomlTableKey(text, table, key, expectedValue = null) {
|
|
129
|
+
const lines = String(text || '').trimEnd().split('\n');
|
|
130
|
+
if (lines.length === 1 && lines[0] === '')
|
|
131
|
+
return '';
|
|
132
|
+
const start = lines.findIndex((line) => line.trim() === `[${table}]`);
|
|
133
|
+
if (start === -1)
|
|
134
|
+
return String(text || '');
|
|
135
|
+
let end = lines.length;
|
|
136
|
+
for (let i = start + 1; i < lines.length; i += 1) {
|
|
137
|
+
if (/^\s*\[.+\]\s*$/.test(lines[i] || '')) {
|
|
138
|
+
end = i;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const valuePattern = expectedValue === null ? '' : `\\s*${escapeRegExp(String(expectedValue))}\\s*(?:#.*)?$`;
|
|
143
|
+
const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=${valuePattern}`);
|
|
144
|
+
return lines.filter((line, index) => index <= start || index >= end || !keyPattern.test(line)).join('\n').replace(/\n{3,}/g, '\n\n');
|
|
145
|
+
}
|
|
146
|
+
function upsertTomlTableKey(text, table, line) {
|
|
147
|
+
const key = String(line).split('=')[0]?.trim() ?? '';
|
|
148
|
+
const lines = String(text || '').trimEnd().split('\n');
|
|
149
|
+
if (lines.length === 1 && lines[0] === '')
|
|
150
|
+
lines.length = 0;
|
|
151
|
+
const start = lines.findIndex((entry) => entry.trim() === `[${table}]`);
|
|
152
|
+
if (start === -1)
|
|
153
|
+
return [...lines, ...(lines.length ? [''] : []), `[${table}]`, line].join('\n').replace(/\n{3,}/g, '\n\n');
|
|
154
|
+
let end = lines.length;
|
|
155
|
+
for (let i = start + 1; i < lines.length; i += 1) {
|
|
156
|
+
if (/^\s*\[.+\]\s*$/.test(lines[i] || '')) {
|
|
157
|
+
end = i;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
|
|
162
|
+
for (let i = start + 1; i < end; i += 1) {
|
|
163
|
+
if (keyPattern.test(lines[i] || '')) {
|
|
164
|
+
lines[i] = line;
|
|
165
|
+
return lines.join('\n').replace(/\n{3,}/g, '\n\n');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
lines.splice(end, 0, line);
|
|
169
|
+
return lines.join('\n').replace(/\n{3,}/g, '\n\n');
|
|
170
|
+
}
|
|
171
|
+
function hasTomlTableKey(text, table, key) {
|
|
172
|
+
const lines = String(text || '').split('\n');
|
|
173
|
+
const start = lines.findIndex((line) => line.trim() === `[${table}]`);
|
|
174
|
+
if (start === -1)
|
|
175
|
+
return false;
|
|
176
|
+
const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
|
|
177
|
+
for (let i = start + 1; i < lines.length; i += 1) {
|
|
178
|
+
if (/^\s*\[.+\]\s*$/.test(lines[i] || ''))
|
|
179
|
+
break;
|
|
180
|
+
if (keyPattern.test(lines[i] || ''))
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
function upsertTomlTableKeyIfAbsent(text, table, line) {
|
|
186
|
+
const key = String(line).split('=')[0]?.trim() ?? '';
|
|
187
|
+
return hasTomlTableKey(text, table, key) ? String(text || '') : upsertTomlTableKey(text, table, line);
|
|
188
|
+
}
|
|
189
|
+
function upsertTopLevelTomlBooleanIfAbsent(text, key, value) {
|
|
190
|
+
return hasTopLevelTomlKey(text, key) ? String(text || '') : upsertTopLevelTomlBoolean(text, key, value);
|
|
191
|
+
}
|
|
192
|
+
export function ensureTrailingNewline(text = '') {
|
|
193
|
+
const value = String(text || '').trimEnd();
|
|
194
|
+
return value ? `${value}\n` : '';
|
|
195
|
+
}
|
|
196
|
+
export function upsertTopLevelTomlString(text, key, value) {
|
|
197
|
+
const line = `${key} = "${value}"`;
|
|
198
|
+
const lines = String(text || '').split('\n');
|
|
199
|
+
const firstTable = lines.findIndex((entry) => /^\s*\[.+\]\s*$/.test(entry));
|
|
200
|
+
const end = firstTable === -1 ? lines.length : firstTable;
|
|
201
|
+
const keyPattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
|
|
202
|
+
for (let i = 0; i < end; i += 1) {
|
|
203
|
+
if (keyPattern.test(lines[i] || '')) {
|
|
204
|
+
lines[i] = line;
|
|
205
|
+
return lines.join('\n').replace(/\n{3,}/g, '\n\n');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
lines.splice(end, 0, line);
|
|
209
|
+
return lines.join('\n').replace(/^\n+/, '').replace(/\n{3,}/g, '\n\n');
|
|
210
|
+
}
|
|
211
|
+
function hasTopLevelTomlKey(text, key) {
|
|
212
|
+
const lines = String(text || '').split('\n');
|
|
213
|
+
const firstTable = lines.findIndex((entry) => /^\s*\[.+\]\s*$/.test(entry));
|
|
214
|
+
const end = firstTable === -1 ? lines.length : firstTable;
|
|
215
|
+
const pattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
|
|
216
|
+
return lines.slice(0, end).some((line) => pattern.test(line));
|
|
217
|
+
}
|
|
218
|
+
function codexConfigParseSmoke(text = '') {
|
|
219
|
+
const value = String(text || '');
|
|
220
|
+
const unterminatedTriple = (value.match(/"""|'''/g) || []).length % 2 !== 0;
|
|
221
|
+
const invalidHeader = value.split('\n').find((line) => /^\s*\[/.test(line) && !/^\s*\[\[?[^\]]+\]\]?\s*(?:#.*)?$/.test(line)) || null;
|
|
222
|
+
return { ok: !unterminatedTriple && !invalidHeader, unterminated_multiline_string: unterminatedTriple, invalid_table_header: invalidHeader };
|
|
223
|
+
}
|
|
224
|
+
async function backupCodexConfig(configPath, text, tag) {
|
|
225
|
+
try {
|
|
226
|
+
const backupPath = `${configPath}.sks-${tag}-${PACKAGE_VERSION}-${Date.now().toString(36)}.bak`;
|
|
227
|
+
await writeTextAtomic(backupPath, text, { mode: 0o600 });
|
|
228
|
+
await cleanupCodexConfigBackups(configPath, { keepPerTag: 3, maxAgeMs: 30 * 24 * 60 * 60 * 1000 }).catch(() => undefined);
|
|
229
|
+
return backupPath;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
export async function safeWriteCodexConfigToml(configPath, current, next, tag = 'codex-lb', opts = {}) {
|
|
236
|
+
return writeCodexConfigGuarded({
|
|
237
|
+
configPath,
|
|
238
|
+
before: String(current || ''),
|
|
239
|
+
cause: tag,
|
|
240
|
+
removeTopLevelModeLocks: true,
|
|
241
|
+
...(opts.preserveFastUiKeys === undefined ? {} : { preserveFastUiKeys: opts.preserveFastUiKeys }),
|
|
242
|
+
mutate: () => String(next || '')
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
export function codexFastModeDesktopStatus(text = '') {
|
|
246
|
+
const validation = validateCodexConfigRoundTrip(String(text || ''));
|
|
247
|
+
const globalOn = validation.ok && validation.service_tier === 'fast';
|
|
248
|
+
return {
|
|
249
|
+
schema: 'sks.codex-fast-mode-desktop-status.v2',
|
|
250
|
+
ok: validation.ok,
|
|
251
|
+
on: Boolean(globalOn),
|
|
252
|
+
service_tier: validation.service_tier ?? null,
|
|
253
|
+
model: validation.model ?? null,
|
|
254
|
+
legacy_keys: validation.legacy_keys,
|
|
255
|
+
validation: {
|
|
256
|
+
ok: validation.ok,
|
|
257
|
+
blockers: validation.blockers,
|
|
258
|
+
parse_error: validation.parse_error || null,
|
|
259
|
+
service_tier: validation.service_tier ?? null,
|
|
260
|
+
model: validation.model ?? null,
|
|
261
|
+
model_reasoning_effort: validation.model_reasoning_effort ?? null,
|
|
262
|
+
legacy_keys: validation.legacy_keys
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function upsertTopLevelTomlBoolean(text, key, value) {
|
|
267
|
+
const line = `${key} = ${value ? 'true' : 'false'}`;
|
|
268
|
+
const lines = String(text || '').split('\n');
|
|
269
|
+
const firstTable = lines.findIndex((entry) => /^\s*\[.+\]\s*$/.test(entry));
|
|
270
|
+
const end = firstTable === -1 ? lines.length : firstTable;
|
|
271
|
+
const pattern = new RegExp(`^\\s*${escapeRegExp(key)}\\s*=`);
|
|
272
|
+
for (let i = 0; i < end; i += 1) {
|
|
273
|
+
if (pattern.test(lines[i] || '')) {
|
|
274
|
+
lines[i] = line;
|
|
275
|
+
return lines.join('\n').replace(/\n{3,}/g, '\n\n');
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
lines.splice(end, 0, line);
|
|
279
|
+
return lines.join('\n').replace(/^\n+/, '').replace(/\n{3,}/g, '\n\n');
|
|
280
|
+
}
|
|
281
|
+
function hasTomlTable(text, table) {
|
|
282
|
+
return String(text || '').split('\n').some((line) => String(line).trim() === `[${table}]`);
|
|
283
|
+
}
|
|
284
|
+
export function upsertTomlTable(text, table, block) {
|
|
285
|
+
let lines = String(text || '').trimEnd().split('\n');
|
|
286
|
+
if (lines.length === 1 && lines[0] === '')
|
|
287
|
+
lines = [];
|
|
288
|
+
const start = lines.findIndex((entry) => entry.trim() === `[${table}]`);
|
|
289
|
+
const blockLines = String(block || '').trim().split('\n');
|
|
290
|
+
if (start === -1)
|
|
291
|
+
return [...lines, ...(lines.length ? [''] : []), ...blockLines].join('\n').replace(/\n{3,}/g, '\n\n');
|
|
292
|
+
let end = lines.length;
|
|
293
|
+
for (let i = start + 1; i < lines.length; i += 1) {
|
|
294
|
+
if (/^\s*\[.+\]\s*$/.test(lines[i] || '')) {
|
|
295
|
+
end = i;
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
lines.splice(start, end - start, ...blockLines);
|
|
300
|
+
return lines.join('\n').replace(/\n{3,}/g, '\n\n');
|
|
301
|
+
}
|
|
302
|
+
function escapeRegExp(value) {
|
|
303
|
+
return String(value).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=codex-desktop-config-policy.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
import { ensureDir, exists, nowIso, projectRoot, runProcess, writeJsonAtomic } from '../fsx.js';
|
|
4
|
-
import { buildAgentManifest } from '../agent-bridge/agent-manifest.js';
|
|
4
|
+
import { buildAgentManifest, validateAgentManifest } from '../agent-bridge/agent-manifest.js';
|
|
5
5
|
import { flag } from './command-utils.js';
|
|
6
6
|
async function resolveSksEntrypoint() {
|
|
7
7
|
// Mirrors src/core/agent-bridge/mcp-server.ts's own bin resolution: prefer the
|
|
@@ -14,7 +14,10 @@ async function runNonInteractiveSmoke(entrypoint) {
|
|
|
14
14
|
const result = await runProcess(process.execPath, [entrypoint, 'status', '--json'], {
|
|
15
15
|
env: { SKS_AGENT_MODE: '1' },
|
|
16
16
|
timeoutMs: 15_000,
|
|
17
|
-
|
|
17
|
+
// Status is intentionally bounded but can exceed 32 KiB when several
|
|
18
|
+
// session summaries are present. Truncating otherwise-valid JSON makes the
|
|
19
|
+
// bridge report a false non-interactive failure.
|
|
20
|
+
maxOutputBytes: 512 * 1024
|
|
18
21
|
}).catch((err) => ({ code: 1, stdout: '', stderr: err instanceof Error ? err.message : String(err) }));
|
|
19
22
|
let stdoutIsCleanJson = false;
|
|
20
23
|
try {
|
|
@@ -56,7 +59,24 @@ export async function agentBridgeCommand(subcommand, args = []) {
|
|
|
56
59
|
}
|
|
57
60
|
const root = await projectRoot();
|
|
58
61
|
const manifest = buildAgentManifest();
|
|
62
|
+
const manifestValidation = validateAgentManifest(manifest);
|
|
59
63
|
const manifestPath = path.join(root, '.sneakoscope', 'agent-bridge', 'manifest.json');
|
|
64
|
+
if (!manifestValidation.ok) {
|
|
65
|
+
const result = {
|
|
66
|
+
schema: 'sks.agent-bridge-setup.v1',
|
|
67
|
+
generated_at: nowIso(),
|
|
68
|
+
ok: false,
|
|
69
|
+
status: 'manifest_validation_failed',
|
|
70
|
+
manifest_path: manifestPath,
|
|
71
|
+
manifest_validation: manifestValidation
|
|
72
|
+
};
|
|
73
|
+
process.exitCode = 1;
|
|
74
|
+
if (flag(args, '--json'))
|
|
75
|
+
console.log(JSON.stringify(result, null, 2));
|
|
76
|
+
else
|
|
77
|
+
console.error(`Agent bridge manifest validation failed: ${manifestValidation.issues.join(', ')}`);
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
60
80
|
await ensureDir(path.dirname(manifestPath));
|
|
61
81
|
await writeJsonAtomic(manifestPath, manifest);
|
|
62
82
|
const entrypoint = await resolveSksEntrypoint();
|
|
@@ -67,6 +87,7 @@ export async function agentBridgeCommand(subcommand, args = []) {
|
|
|
67
87
|
ok: smoke.ok,
|
|
68
88
|
manifest_path: manifestPath,
|
|
69
89
|
tool_count: manifest.tools.length,
|
|
90
|
+
manifest_validation: manifestValidation,
|
|
70
91
|
registration_snippets: registrationSnippets(),
|
|
71
92
|
non_interactive_smoke: smoke
|
|
72
93
|
};
|
|
@@ -12,6 +12,8 @@ import { runNativeCliWorkerFromArgs } from '../agents/native-cli-worker.js';
|
|
|
12
12
|
const AGENT_ACTION_SCHEMA = 'sks.agent-command-result.v1';
|
|
13
13
|
export async function agentCommand(commandOrArgs = 'agent', maybeArgs = []) {
|
|
14
14
|
const args = Array.isArray(commandOrArgs) ? commandOrArgs : maybeArgs;
|
|
15
|
+
if (args.includes('--help') || args.includes('-h') || args[0] === 'help')
|
|
16
|
+
return agentHelp(args.includes('--json'));
|
|
15
17
|
const parsed = parseAgentCommandArgs('agent', args);
|
|
16
18
|
if (parsed.action === 'worker')
|
|
17
19
|
return runNativeCliWorkerFromArgs(args.slice(args[0] === 'worker' ? 1 : 0));
|
|
@@ -21,7 +23,40 @@ export async function agentCommand(commandOrArgs = 'agent', maybeArgs = []) {
|
|
|
21
23
|
return agentPlan(parsed);
|
|
22
24
|
return agentMissionAction(parsed);
|
|
23
25
|
}
|
|
26
|
+
function agentHelp(json = false) {
|
|
27
|
+
const result = {
|
|
28
|
+
schema: 'sks.agent-help.v1',
|
|
29
|
+
ok: true,
|
|
30
|
+
action: 'help',
|
|
31
|
+
read_only: true,
|
|
32
|
+
usage: 'sks agent run <prompt> [--mission <id>] [--agents <n>] [--concurrency <n>] [--readonly] [--json]',
|
|
33
|
+
actions: ['run', 'plan', 'status', 'watch', 'dashboard', 'cockpit', 'lane', 'board', 'ledger', 'collect', 'consensus', 'close', 'cleanup', 'proof', 'explain', 'rollback-patches']
|
|
34
|
+
};
|
|
35
|
+
if (json)
|
|
36
|
+
console.log(JSON.stringify(result, null, 2));
|
|
37
|
+
else {
|
|
38
|
+
console.log(result.usage);
|
|
39
|
+
console.log('Actions: ' + result.actions.join(', '));
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
24
43
|
async function agentRun(parsed) {
|
|
44
|
+
if (normalizeRouteName(parsed.route) === 'release-review' && parsed.legacyNativeRuntime !== true) {
|
|
45
|
+
const result = {
|
|
46
|
+
schema: AGENT_ACTION_SCHEMA,
|
|
47
|
+
ok: false,
|
|
48
|
+
status: 'blocked',
|
|
49
|
+
route: '$Release-Review',
|
|
50
|
+
blocker: 'release_review_official_subagents_required',
|
|
51
|
+
blockers: ['release_review_official_subagents_required'],
|
|
52
|
+
next_command: `sks naruto run "$Release-Review ${String(parsed.prompt || 'release audit').replace(/"/g, '\\"')}" --agents ${Math.max(1, Number(parsed.agents || 1))} --read-only --json`,
|
|
53
|
+
legacy_escape_hatch: 'Pass --legacy-native-runtime only for an explicitly approved legacy compatibility run.'
|
|
54
|
+
};
|
|
55
|
+
process.exitCode = 2;
|
|
56
|
+
return emit(parsed, result, () => {
|
|
57
|
+
console.error('Release Review is owned by the Codex official subagent workflow. Use the suggested sks naruto command.');
|
|
58
|
+
});
|
|
59
|
+
}
|
|
25
60
|
const result = await runNativeAgentOrchestrator({ ...parsed, routeCommand: 'sks agent run', routeBlackboxKind: 'actual_agent_command' });
|
|
26
61
|
if (normalizeRouteName(parsed.route) === 'release-review' && result.mission_id) {
|
|
27
62
|
await writeReleaseReviewNativeAgentPlan(parsed, result);
|
|
@@ -37,11 +72,9 @@ function normalizeRouteName(route = '') {
|
|
|
37
72
|
return String(route || '').replace(/^\$/, '').trim().toLowerCase();
|
|
38
73
|
}
|
|
39
74
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* so `route-release-review`'s fixture contract (plan file + agent proof evidence +
|
|
44
|
-
* agent effort policy) is genuinely satisfied by this command rather than only partially.
|
|
75
|
+
* Legacy compatibility fixtures may explicitly opt into the historical native
|
|
76
|
+
* Release-Review runner with --legacy-native-runtime. Public $Release-Review
|
|
77
|
+
* execution is owned by the official Codex subagent workflow.
|
|
45
78
|
*/
|
|
46
79
|
async function writeReleaseReviewNativeAgentPlan(parsed, result) {
|
|
47
80
|
const root = await sksRoot();
|
|
@@ -5,7 +5,7 @@ import { COMMAND_MANIFEST_LITE } from '../../cli/command-manifest-lite.js';
|
|
|
5
5
|
import { flag } from '../../cli/args.js';
|
|
6
6
|
import { printJson, sksTextLogo } from '../../cli/output.js';
|
|
7
7
|
import { ui as cliUi } from '../../cli/cli-theme.js';
|
|
8
|
-
import { PACKAGE_VERSION, ensureDir, exists, nowIso, projectRoot, readJson, sksRoot, tmpdir, writeJsonAtomic } from '../fsx.js';
|
|
8
|
+
import { PACKAGE_VERSION, ensureDir, exists, nowIso, projectRoot, readJson, rmrf, sksRoot, tmpdir, writeJsonAtomic } from '../fsx.js';
|
|
9
9
|
import { DOLLAR_COMMAND_ALIASES, DOLLAR_COMMANDS, USAGE_TOPICS, routePrompt, routeReasoning, reasoningInstruction } from '../routes.js';
|
|
10
10
|
import { DOLLAR_COMMAND_ALIASES_LITE, DOLLAR_COMMANDS_LITE } from '../routes/dollar-manifest-lite.js';
|
|
11
11
|
import { initProject, normalizeInstallScope, sksCommandPrefix } from '../init.js';
|
|
@@ -17,6 +17,7 @@ import { createMission } from '../mission.js';
|
|
|
17
17
|
import { formatSksUpdateCheckText, runSksUpdateCheck, runSksUpdateNow } from '../update-check.js';
|
|
18
18
|
import { persistSksUpdateNoticeFromVersions } from '../update/update-notice.js';
|
|
19
19
|
import { withSecretPreservationGuard } from '../config/config-migration-journal.js';
|
|
20
|
+
const REMOVED_USAGE_TOPICS = new Set(['db']);
|
|
20
21
|
export async function helpCommand(args = []) {
|
|
21
22
|
const topic = args[0];
|
|
22
23
|
if (topic)
|
|
@@ -100,7 +101,9 @@ export function usageCommand(args = []) {
|
|
|
100
101
|
console.log(row.description);
|
|
101
102
|
return;
|
|
102
103
|
}
|
|
103
|
-
const route =
|
|
104
|
+
const route = REMOVED_USAGE_TOPICS.has(String(topic).toLowerCase())
|
|
105
|
+
? null
|
|
106
|
+
: DOLLAR_COMMANDS.find((entry) => entry.command.toLowerCase() === `$${topic}`.toLowerCase());
|
|
104
107
|
if (route) {
|
|
105
108
|
console.log(`${route.command}\n`);
|
|
106
109
|
console.log(`${route.route}: ${route.description}`);
|
|
@@ -205,6 +208,27 @@ export async function setupCommand(args = []) {
|
|
|
205
208
|
if (flag(args, '--help') || flag(args, '-h'))
|
|
206
209
|
return usageCommand(['setup']);
|
|
207
210
|
const root = await projectRoot();
|
|
211
|
+
const { formatHarnessConflictReport, scanHarnessConflicts } = await import('../harness-conflicts.js');
|
|
212
|
+
const conflictScan = await scanHarnessConflicts(root);
|
|
213
|
+
if (conflictScan.hard_block) {
|
|
214
|
+
const blocked = {
|
|
215
|
+
schema: 'sks.setup.v1',
|
|
216
|
+
ok: false,
|
|
217
|
+
status: 'blocked_harness_conflict',
|
|
218
|
+
root,
|
|
219
|
+
blockers: conflictScan.hard.map((item) => `${item.name || 'harness'}:${item.path}`),
|
|
220
|
+
conflicts: conflictScan.conflicts,
|
|
221
|
+
cleanup_prompt_command: 'sks conflicts prompt'
|
|
222
|
+
};
|
|
223
|
+
process.exitCode = 1;
|
|
224
|
+
if (flag(args, '--json')) {
|
|
225
|
+
printJson(blocked);
|
|
226
|
+
return blocked;
|
|
227
|
+
}
|
|
228
|
+
console.error(formatHarnessConflictReport(conflictScan, { includePrompt: false }));
|
|
229
|
+
console.error('Run `sks conflicts prompt` and obtain explicit human approval before cleanup.');
|
|
230
|
+
return blocked;
|
|
231
|
+
}
|
|
208
232
|
const installScope = installScopeFromArgs(args);
|
|
209
233
|
let res = null;
|
|
210
234
|
let cliTools = null;
|
|
@@ -218,24 +242,41 @@ export async function setupCommand(args = []) {
|
|
|
218
242
|
const { ensureRelatedCliTools } = await import('../../cli/install-helpers.js');
|
|
219
243
|
cliTools = await ensureRelatedCliTools(args);
|
|
220
244
|
});
|
|
245
|
+
const blockers = [
|
|
246
|
+
...(res.codex_config_install?.manual_blockers || []),
|
|
247
|
+
...(res.agent_install?.manual_blockers || [])
|
|
248
|
+
];
|
|
249
|
+
const warnings = res.codex_config_install?.warnings || [];
|
|
221
250
|
const result = {
|
|
222
251
|
schema: 'sks.setup.v1',
|
|
223
|
-
ok:
|
|
252
|
+
ok: blockers.length === 0 && res.codex_config_install?.ok !== false && res.agent_install?.ok !== false,
|
|
253
|
+
status: blockers.length ? 'manual_blocked' : 'completed',
|
|
224
254
|
root,
|
|
225
255
|
install_scope: installScope,
|
|
226
256
|
command_prefix: sksCommandPrefix(installScope, { globalCommand: 'sks' }),
|
|
227
257
|
created: res.created || [],
|
|
228
258
|
local_only: flag(args, '--local-only'),
|
|
229
|
-
cli_tools: cliTools
|
|
259
|
+
cli_tools: cliTools,
|
|
260
|
+
blockers,
|
|
261
|
+
warnings
|
|
230
262
|
};
|
|
231
|
-
if (
|
|
232
|
-
|
|
233
|
-
|
|
263
|
+
if (!result.ok)
|
|
264
|
+
process.exitCode = 1;
|
|
265
|
+
if (flag(args, '--json')) {
|
|
266
|
+
printJson(result);
|
|
267
|
+
return result;
|
|
268
|
+
}
|
|
269
|
+
console.log(`${result.ok ? 'Setup complete' : 'Setup blocked'}: ${root}`);
|
|
234
270
|
console.log(`Install scope: ${installScope}`);
|
|
235
271
|
console.log(`Codex CLI: ${cliTools.codex.status}${cliTools.codex.version ? ` ${cliTools.codex.version}` : ''}`);
|
|
236
272
|
console.log(`Zellij: ${cliTools.zellij.ok ? 'ok' : cliTools.zellij.repair.status}${cliTools.zellij.version ? ` ${cliTools.zellij.version}` : ''}`);
|
|
237
273
|
for (const file of result.created)
|
|
238
274
|
console.log(`- ${file}`);
|
|
275
|
+
for (const warning of warnings)
|
|
276
|
+
console.log(`Warning: ${warning}`);
|
|
277
|
+
for (const blocker of blockers)
|
|
278
|
+
console.error(`Blocker: ${blocker}`);
|
|
279
|
+
return result;
|
|
239
280
|
}
|
|
240
281
|
export async function bootstrapCommand(args = []) {
|
|
241
282
|
if (flag(args, '--help') || flag(args, '-h'))
|
|
@@ -317,29 +358,35 @@ export async function selftestCommand(args = []) {
|
|
|
317
358
|
const root = await projectRoot();
|
|
318
359
|
const tmp = tmpdir('sks-selftest-');
|
|
319
360
|
await ensureDir(tmp);
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
361
|
+
try {
|
|
362
|
+
const registry = await buildFeatureRegistry({ root });
|
|
363
|
+
const coverage = validateFeatureRegistry(registry);
|
|
364
|
+
if (!coverage.ok)
|
|
365
|
+
throw new Error(`selftest: feature registry blocked: ${coverage.blockers.join(', ')}`);
|
|
366
|
+
const mission = await createMission(tmp, { mode: 'team', prompt: 'selftest route proof fixture' });
|
|
367
|
+
await writeSelftestRouteProof(tmp, { missionId: mission.id, kind: 'team_gate' });
|
|
368
|
+
const proof = await readJson(path.join(tmp, '.sneakoscope', 'missions', mission.id, 'completion-proof.json'), null);
|
|
369
|
+
if (!proof?.mission_id)
|
|
370
|
+
throw new Error('selftest: completion proof fixture missing');
|
|
371
|
+
const hookExplain = hooksExplainReport();
|
|
372
|
+
if (!hookExplain.events.includes('Stop'))
|
|
373
|
+
throw new Error('selftest: hook explain missing Stop');
|
|
374
|
+
const result = {
|
|
375
|
+
schema: 'sks.selftest.v1',
|
|
376
|
+
ok: true,
|
|
377
|
+
version: PACKAGE_VERSION,
|
|
378
|
+
generated_at: nowIso(),
|
|
379
|
+
checks: ['feature_registry', 'route_completion_proof_fixture', 'hooks_policy_surface'],
|
|
380
|
+
tmp_root: tmp,
|
|
381
|
+
tmp_cleaned: true
|
|
382
|
+
};
|
|
383
|
+
if (flag(args, '--json'))
|
|
384
|
+
return printJson(result);
|
|
385
|
+
console.log('SKS selftest passed');
|
|
386
|
+
}
|
|
387
|
+
finally {
|
|
388
|
+
await rmrf(tmp);
|
|
389
|
+
}
|
|
343
390
|
}
|
|
344
391
|
/**
|
|
345
392
|
* `sks selftest --real`: actually spawns every feature fixture whose kind is
|
|
@@ -53,7 +53,7 @@ export function positionalArgs(args = []) {
|
|
|
53
53
|
'--lines', '--intent', '--changed', '--route', '--skills', '--prompt-signature',
|
|
54
54
|
'--mission-id', '--source', '--image-id', '--bbox', '--label', '--evidence',
|
|
55
55
|
'--claim-id', '--type', '--before', '--after', '--anchors', '--verification',
|
|
56
|
-
'--status', '--agents', '--target-active-slots', '--work-items', '--minimum-work-items',
|
|
56
|
+
'--status', '--agents', '--clones', '--max-threads', '--target-active-slots', '--work-items', '--minimum-work-items',
|
|
57
57
|
'--max-queue-expansion', '--engine', '--kind', '--severity', '--claim',
|
|
58
58
|
'--prior-status', '--artifact', '--reason', '--root-cause', '--corrective-action',
|
|
59
59
|
'--required-evidence', '--patch-status', '--avoid', '--applies-to', '--files',
|
|
@@ -25,10 +25,12 @@ export async function memoryCommand(sub, args = []) {
|
|
|
25
25
|
return gcCommand(args || []);
|
|
26
26
|
}
|
|
27
27
|
export async function gcCommand(args = []) {
|
|
28
|
-
const root = await sksRoot();
|
|
29
28
|
const action = String(args[0] || '').toLowerCase();
|
|
29
|
+
if (action === 'help' || args.includes('--help') || args.includes('-h'))
|
|
30
|
+
return gcHelp(flag(args, '--json'));
|
|
31
|
+
const root = await sksRoot();
|
|
30
32
|
if (action === 'plan') {
|
|
31
|
-
const res = await enforceRetention(root, { dryRun: true, pruneReportLogs: true
|
|
33
|
+
const res = await enforceRetention(root, { dryRun: true, pruneReportLogs: true });
|
|
32
34
|
if (flag(args, '--json'))
|
|
33
35
|
return console.log(JSON.stringify(res.plan, null, 2));
|
|
34
36
|
console.log('ㅅㅋㅅ GC plan');
|
|
@@ -47,7 +49,6 @@ export async function gcCommand(args = []) {
|
|
|
47
49
|
}
|
|
48
50
|
const res = await applyRetentionPlan(root, {
|
|
49
51
|
pruneReportLogs: true,
|
|
50
|
-
policy: { max_tmp_age_hours: 0 },
|
|
51
52
|
planHash: readOption(args, '--plan-hash', null)
|
|
52
53
|
});
|
|
53
54
|
if (flag(args, '--json'))
|
|
@@ -70,7 +71,7 @@ export async function gcCommand(args = []) {
|
|
|
70
71
|
console.log(`Latest plan: ${res.latest_plan?.plan_hash || 'none'}`);
|
|
71
72
|
return res;
|
|
72
73
|
}
|
|
73
|
-
const res = await enforceRetention(root, { dryRun: flag(args, '--dry-run'), pruneReportLogs: true
|
|
74
|
+
const res = await enforceRetention(root, { dryRun: flag(args, '--dry-run'), pruneReportLogs: true });
|
|
74
75
|
if (flag(args, '--json'))
|
|
75
76
|
return console.log(JSON.stringify(res, null, 2));
|
|
76
77
|
console.log(flag(args, '--dry-run') ? 'ㅅㅋㅅ GC dry run' : 'ㅅㅋㅅ GC completed');
|
|
@@ -80,6 +81,28 @@ export async function gcCommand(args = []) {
|
|
|
80
81
|
for (const a of res.actions.slice(0, 20))
|
|
81
82
|
console.log(`- ${a.action} ${a.path || a.mission || ''} ${a.bytes ? formatBytes(a.bytes) : ''}`);
|
|
82
83
|
}
|
|
84
|
+
function gcHelp(json = false) {
|
|
85
|
+
const help = {
|
|
86
|
+
schema: 'sks.gc-help.v1',
|
|
87
|
+
ok: true,
|
|
88
|
+
usage: 'sks gc [plan|apply|status] [--dry-run] [--json]',
|
|
89
|
+
commands: {
|
|
90
|
+
plan: 'Create a hashed dry-run plan using the configured retention policy.',
|
|
91
|
+
apply: 'Apply a reviewed plan with --yes and optional --plan-hash.',
|
|
92
|
+
status: 'Show the latest mission index, plan, cleanup, and storage status.'
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
if (json)
|
|
96
|
+
console.log(JSON.stringify(help, null, 2));
|
|
97
|
+
else {
|
|
98
|
+
console.log(`Usage: ${help.usage}`);
|
|
99
|
+
console.log(' sks gc --dry-run');
|
|
100
|
+
console.log(' sks gc plan [--json]');
|
|
101
|
+
console.log(' sks gc apply --yes [--plan-hash <hash>] [--json]');
|
|
102
|
+
console.log(' sks gc status [--json]');
|
|
103
|
+
}
|
|
104
|
+
return help;
|
|
105
|
+
}
|
|
83
106
|
function readOption(args = [], name, fallback = null) {
|
|
84
107
|
const index = args.indexOf(name);
|
|
85
108
|
if (index >= 0 && args[index + 1] && !String(args[index + 1]).startsWith('--'))
|