sneakoscope 7.1.0 → 7.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/config/architecture-budgets.v1.json +1 -8
- package/crates/sks-core/Cargo.lock +225 -1
- package/crates/sks-core/Cargo.toml +8 -1
- package/crates/sks-core/src/main.rs +7 -1
- package/crates/sks-core/src/search/files.rs +114 -0
- package/crates/sks-core/src/search/mod.rs +274 -0
- package/crates/sks-core/src/search/text.rs +175 -0
- package/dist/bin/sks-dispatch.js +4 -3
- package/dist/cli/command-manifest-lite.js +177 -6
- package/dist/cli/command-registry.js +42 -8
- package/dist/cli/help.js +30 -0
- package/dist/cli/install-helpers-codex-lb-config.js +9 -6
- package/dist/cli/install-helpers-codex-lb-selftest-chain.js +1 -1
- package/dist/cli/install-helpers-install-support.js +1 -1
- package/dist/cli/install-helpers.js +19 -9
- package/dist/cli/router.js +16 -3
- package/dist/commands/codex-app.js +40 -5
- package/dist/commands/doctor-profile.js +78 -0
- package/dist/commands/doctor.js +29 -69
- package/dist/commands/search.js +4 -0
- package/dist/config/skills-manifest.json +53 -60
- package/dist/core/agent-bridge/agent-manifest.js +22 -26
- package/dist/core/agent-bridge/host-capability-policy.js +109 -8
- package/dist/core/agent-bridge/host-capability-runtime.js +178 -50
- package/dist/core/agent-guidance/directive-registry.js +123 -0
- package/dist/core/agents/agent-effort-policy.js +45 -6
- package/dist/core/agents/agent-worker-pipeline.js +1 -3
- package/dist/core/agents/native-worker-backend-router.js +43 -19
- package/dist/core/auto-review.js +1 -3
- package/dist/core/code-structure.js +282 -19
- package/dist/core/codex/codex-config-guard.js +14 -4
- package/dist/core/codex/codex-config-toml.js +1 -3
- package/dist/core/codex-app/codex-agent-role-sync.js +1 -3
- package/dist/core/codex-app/codex-app-fast-ui-repair.js +14 -1
- package/dist/core/codex-app/codex-app-types.js +2 -3
- package/dist/core/codex-app/codex-desktop-routing-ownership.js +91 -0
- package/dist/core/codex-app/codex-hook-approval-probe.js +1 -3
- package/dist/core/codex-app/codex-hook-lifecycle.js +1 -3
- package/dist/core/codex-app/codex-init-deep.js +22 -10
- package/dist/core/codex-app/codex-model-catalog.js +384 -0
- package/dist/core/codex-app/codex-models-cache.js +160 -0
- package/dist/core/codex-app/desktop-routing-snapshot.js +233 -0
- package/dist/core/codex-app/glm-profile-installer.js +1 -3
- package/dist/core/codex-app/mcp-manager.js +1 -3
- package/dist/core/codex-app/menubar/constants.js +3 -0
- package/dist/core/codex-app/menubar/installer.js +11 -1
- package/dist/core/codex-app/multi-provider-router-support.js +202 -0
- package/dist/core/codex-app/multi-provider-router.js +379 -0
- package/dist/core/codex-app/openrouter-activate.js +189 -26
- package/dist/core/codex-app/openrouter-base-instructions.js +1 -0
- package/dist/core/codex-app/openrouter-model-catalog.js +217 -0
- package/dist/core/codex-app/role-model-catalog-priority.js +61 -0
- package/dist/core/codex-app.js +30 -6
- package/dist/core/codex-compat/codex-hook-semantic-validator.js +1 -3
- package/dist/core/codex-control/codex-app-server-v2-client.js +39 -2
- package/dist/core/codex-lb/codex-lb-env.js +1 -3
- package/dist/core/codex-lb/codex-lb-tool-catalog.js +6 -1
- package/dist/core/codex-native/codex-native-feature-broker.js +2 -6
- package/dist/core/codex-native/codex-native-interop-policy.js +1 -3
- package/dist/core/codex-native/codex-native-reference-cache.js +1 -3
- package/dist/core/codex-native/codex-native-reference-source.js +1 -3
- package/dist/core/codex-native/codex-native-repair-transaction.js +1 -3
- package/dist/core/codex-native/core-skill-manifest.js +3 -2
- package/dist/core/codex-native/native-capability-repair-matrix.js +1 -3
- package/dist/core/codex-plugins/codex-plugin-repair.js +1 -3
- package/dist/core/codex-runtime/codex-desktop-config-policy.js +4 -4
- package/dist/core/commands/agent-bridge-command.js +24 -3
- package/dist/core/commands/image-ux-review-command.js +5 -11
- package/dist/core/commands/menubar-command.js +1 -1
- package/dist/core/commands/naruto-command.js +40 -13
- package/dist/core/commands/pipeline-command.js +5 -2
- package/dist/core/commands/release-command.js +63 -1
- package/dist/core/commands/remote-command.js +18 -0
- package/dist/core/commands/search-command.js +151 -0
- package/dist/core/commands/telegram-command.js +251 -108
- package/dist/core/commands/uninstall-command.js +1 -1
- package/dist/core/config/secret-preservation.js +1 -3
- package/dist/core/context7-client.js +2 -1
- package/dist/core/db-review.js +704 -0
- package/dist/core/db-safety.js +17 -23
- package/dist/core/doctor/browser-use-repair.js +1 -3
- package/dist/core/doctor/codex-startup-config-repair.js +1 -3
- package/dist/core/doctor/computer-use-repair.js +1 -3
- package/dist/core/doctor/context7-mcp-repair.js +1 -3
- package/dist/core/doctor/current-project-guidance.js +1 -3
- package/dist/core/doctor/doctor-codex-startup-repair.js +1 -3
- package/dist/core/doctor/doctor-dirty-planner.js +2 -2
- package/dist/core/doctor/doctor-native-capability-repair.js +1 -3
- package/dist/core/doctor/doctor-transaction.js +1 -3
- package/dist/core/doctor/imagegen-repair.js +1 -3
- package/dist/core/doctor/legacy-global-hook-cleanup.js +1 -3
- package/dist/core/doctor/mcp-transport-collision-repair.js +1 -3
- package/dist/core/doctor/retired-managed-residue-private.js +1 -3
- package/dist/core/doctor/supabase-mcp-repair.js +1 -3
- package/dist/core/engineering-sanity-review.js +186 -0
- package/dist/core/errors/message.js +3 -0
- package/dist/core/evidence/evidence-schema.js +1 -3
- package/dist/core/feature-fixtures.js +1 -0
- package/dist/core/feature-registry.js +1 -3
- package/dist/core/fsx.js +13 -0
- package/dist/core/git-hygiene/shared-memory-publish.js +1 -3
- package/dist/core/git-hygiene/validators.js +1 -3
- package/dist/core/harness-guard.js +21 -3
- package/dist/core/hooks-runtime/hook-context.js +2 -2
- package/dist/core/image-ux-review/imagegen-adapter.js +52 -56
- package/dist/core/image-ux-review/real-callout-extractor.js +6 -1
- package/dist/core/image-ux-review.js +3 -5
- package/dist/core/imagegen/codex-lb-imagegen-target.js +70 -0
- package/dist/core/imagegen/imagegen-capability.js +11 -11
- package/dist/core/imagegen/imagegen-evidence.js +32 -0
- package/dist/core/init/skills.js +9 -11
- package/dist/core/init.js +4 -6
- package/dist/core/json/records.js +9 -0
- package/dist/core/json-schema-validator.js +1 -3
- package/dist/core/lean-engineering-policy.js +54 -0
- package/dist/core/loops/loop-continuation-enforcer.js +1 -3
- package/dist/core/mad-sks/sql-plane/mcp-executor.js +2 -1
- package/dist/core/mad-sks/sql-plane/policy.js +2 -1
- package/dist/core/managed-assets/managed-assets-manifest.js +4 -3
- package/dist/core/mcp-config/codex-cli-adapter.js +1 -3
- package/dist/core/mcp-config/config-reader.js +2 -3
- package/dist/core/mcp-config/guarded-patch.js +1 -1
- package/dist/core/mcp-config/health-check.js +2 -1
- package/dist/core/mcp-config/mutation.js +1 -1
- package/dist/core/mcp-config/restore.js +1 -1
- package/dist/core/mcp-config/secret-policy.js +1 -3
- package/dist/core/migration/migration-transaction-journal.js +3 -3
- package/dist/core/naruto/naruto-concurrency-governor.js +2 -2
- package/dist/core/perf/import-graph-budget.js +91 -1
- package/dist/core/pipeline/pipeline-plan-writer.js +1 -1
- package/dist/core/pipeline-internals/runtime-core.js +121 -23
- package/dist/core/pipeline-internals/runtime-gates.js +193 -4
- package/dist/core/pipeline.js +1 -1
- package/dist/core/ppt-review/slide-imagegen-review.js +7 -7
- package/dist/core/ppt.js +3 -3
- package/dist/core/product-design-app-server.js +2 -1
- package/dist/core/proof/fake-real-proof-policy.js +1 -3
- package/dist/core/proof/root-cause-policy.js +1 -3
- package/dist/core/proof/validation.js +1 -3
- package/dist/core/provider/model-router.js +4 -0
- package/dist/core/provider/provider-context.js +1 -3
- package/dist/core/providers/openrouter/openrouter-account.js +1 -3
- package/dist/core/quality/helper-dedup.js +0 -0
- package/dist/core/recallpulse.js +1 -1
- package/dist/core/release/file-ownership.js +26 -17
- package/dist/core/release/macos-menubar-proof.js +59 -1
- package/dist/core/release/main-push-guard.js +288 -24
- package/dist/core/release/main-push-receipt.js +10 -45
- package/dist/core/release/package-size-budget.js +1 -1
- package/dist/core/release/release-gate-contract.js +2 -0
- package/dist/core/release/release-pack-receipt.js +1 -1
- package/dist/core/release/release-proof-io.js +33 -0
- package/dist/core/release/release-upgrade-baseline.js +9 -0
- package/dist/core/release/runtime-script-pack-closure.js +153 -4
- package/dist/core/release/stage-publish.js +194 -0
- package/dist/core/remote/index.js +2 -0
- package/dist/core/remote/local-worker-client.js +35 -0
- package/dist/core/remote/machine-registry.js +18 -13
- package/dist/core/remote/owner-proof.js +1 -3
- package/dist/core/remote/protocol.js +1 -3
- package/dist/core/remote/readiness.js +1 -3
- package/dist/core/remote/session-binding.js +153 -0
- package/dist/core/remote/session-index.js +1 -3
- package/dist/core/remote/types.js +1 -0
- package/dist/core/remote/worker.js +228 -14
- package/dist/core/responses-stream.js +151 -0
- package/dist/core/routes/dollar-manifest-lite.js +1 -1
- package/dist/core/routes.js +8 -8
- package/dist/core/rust-accelerator.js +12 -2
- package/dist/core/safety/ssot-guard.js +1 -3
- package/dist/core/search/benchmark.js +358 -0
- package/dist/core/search/cache.js +65 -0
- package/dist/core/search/context.js +144 -0
- package/dist/core/search/doctor.js +74 -0
- package/dist/core/search/files.js +192 -0
- package/dist/core/search/index.js +5 -0
- package/dist/core/search/ipc.js +64 -0
- package/dist/core/search/provider.js +142 -0
- package/dist/core/search/rust-bridge.js +24 -0
- package/dist/core/search/structure.js +230 -0
- package/dist/core/search/symbol.js +272 -0
- package/dist/core/search/text.js +146 -0
- package/dist/core/search/types.js +22 -0
- package/dist/core/search/typescript-ls.js +215 -0
- package/dist/core/search-visibility/discovery.js +1 -3
- package/dist/core/skill-forge.js +1 -1
- package/dist/core/stop-gate/gate-evaluator.js +3 -3
- package/dist/core/stop-gate/stop-gate-check.js +1 -3
- package/dist/core/structured-output-adapter.js +62 -2
- package/dist/core/subagents/agent-catalog.js +56 -43
- package/dist/core/subagents/model-policy.js +17 -7
- package/dist/core/subagents/naruto-proof-projection.js +2 -6
- package/dist/core/subagents/official-subagent-config.js +1 -3
- package/dist/core/subagents/official-subagent-preparation.js +73 -10
- package/dist/core/subagents/official-subagent-prompt.js +85 -18
- package/dist/core/subagents/official-subagent-runner.js +10 -5
- package/dist/core/subagents/role-model-preferences.js +202 -44
- package/dist/core/subagents/subagent-evidence.js +1 -3
- package/dist/core/subagents/thread-budget.js +1 -1
- package/dist/core/subagents/triwiki-attention.js +1 -5
- package/dist/core/telegram/config.js +29 -12
- package/dist/core/telegram/hub.js +8 -2
- package/dist/core/telegram/index.js +2 -0
- package/dist/core/telegram/messages.js +8 -2
- package/dist/core/telegram/runtime-projection.js +8 -5
- package/dist/core/telegram/runtime.js +19 -9
- package/dist/core/telegram/service.js +181 -0
- package/dist/core/telegram/setup.js +220 -0
- package/dist/core/text/regex.js +3 -0
- package/dist/core/text/strings.js +6 -0
- package/dist/core/triwiki-wrongness/image-wrongness.js +1 -3
- package/dist/core/triwiki-wrongness/wrongness-ledger.js +1 -3
- package/dist/core/triwiki-wrongness/wrongness-proof-linker.js +1 -3
- package/dist/core/triwiki-wrongness/wrongness-retrieval.js +1 -3
- package/dist/core/triwiki-wrongness/wrongness-schema.js +1 -3
- package/dist/core/triwiki-wrongness/wrongness-trust-policy.js +1 -3
- package/dist/core/trust-kernel/completion-contract.js +1 -3
- package/dist/core/trust-kernel/route-contract.js +1 -3
- package/dist/core/update/update-migration-state.js +1 -3
- package/dist/core/update-check.js +20 -6
- package/dist/core/verification/diff-quality.js +3 -4
- package/dist/core/verification/impact-scan.js +36 -89
- package/dist/core/verification/mistake-rule-compiler.js +17 -4
- package/dist/core/version-manager.js +3 -20
- package/dist/core/version.js +1 -1
- package/dist/native/sks-menubar/Sources/ControlCenterWindowController.swift +23 -3
- package/dist/native/sks-menubar/Sources/ControlKit.swift +102 -0
- package/dist/native/sks-menubar/Sources/DiagnosticsViewController.swift +23 -11
- package/dist/native/sks-menubar/Sources/MCPServersViewController.swift +7 -3
- package/dist/native/sks-menubar/Sources/OperationCoordinator.swift +17 -1
- package/dist/native/sks-menubar/Sources/OverviewViewController.swift +22 -15
- package/dist/native/sks-menubar/Sources/ProcessClient.swift +15 -5
- package/dist/native/sks-menubar/Sources/ProvidersMultiProvider.swift +324 -0
- package/dist/native/sks-menubar/Sources/ProvidersOpenRouter.swift +154 -214
- package/dist/native/sks-menubar/Sources/ProvidersRoleModels.swift +252 -0
- package/dist/native/sks-menubar/Sources/ProvidersViewController.swift +77 -71
- package/dist/native/sks-menubar/Sources/RemoteTelegramViewController.swift +167 -51
- package/dist/native/sks-menubar/Sources/SettingsViewController.swift +14 -5
- package/dist/native/sks-menubar/Sources/SidebarItem.swift +15 -1
- package/dist/native/sks-menubar/Sources/StatusItemController.swift +2 -2
- package/dist/native/sks-menubar/Sources/UpdatesViewController.swift +16 -12
- package/dist/scripts/agent-guidance-dedup-check.js +23 -0
- package/dist/scripts/agent-message-bus-reader-check.js +1 -1
- package/dist/scripts/all-feature-deep-completion-check.js +1 -1
- package/dist/scripts/appshots-thread-attachment-discovery-check.js +1 -1
- package/dist/scripts/architecture-guard-check.js +1 -2
- package/dist/scripts/certificate-sla-check.js +1 -1
- package/dist/scripts/cli-output-consistency-check.js +1 -1
- package/dist/scripts/codex-0-134-runner-truth-check.js +1 -1
- package/dist/scripts/codex-0138-capability-artifact-check.js +1 -1
- package/dist/scripts/codex-0138-capability-check.js +1 -1
- package/dist/scripts/codex-0138-doctor-check.js +1 -1
- package/dist/scripts/codex-0138-feature-probes-check.js +1 -1
- package/dist/scripts/codex-0144-app-server-v2-check.js +1 -1
- package/dist/scripts/codex-0144-binary-identity-check.js +1 -1
- package/dist/scripts/codex-0144-capability-check.js +1 -1
- package/dist/scripts/codex-0144-core-real-probes-check.js +1 -1
- package/dist/scripts/codex-0144-manifest-check.js +1 -1
- package/dist/scripts/codex-0144-policy-check.js +1 -1
- package/dist/scripts/codex-0144-thread-store-check.js +1 -1
- package/dist/scripts/codex-agent-role-rich-content-check.js +2 -2
- package/dist/scripts/codex-agent-role-sync-check.js +2 -2
- package/dist/scripts/codex-agent-type-routing-check.js +2 -2
- package/dist/scripts/codex-app-execution-profile-check.js +2 -2
- package/dist/scripts/codex-app-handoff-check.js +1 -1
- package/dist/scripts/codex-app-handoff-launch-check.js +1 -1
- package/dist/scripts/codex-control-tool-output-continuity-audit-check.js +1 -1
- package/dist/scripts/codex-lb-fast-ui-preservation-check.js +1 -3
- package/dist/scripts/codex-native-feature-broker-blackbox.js +2 -2
- package/dist/scripts/codex-native-feature-broker-check.js +2 -2
- package/dist/scripts/{sks-3-1-6-directive-check-lib.js → codex-native-gate-lib.js} +5 -5
- package/dist/scripts/codex-native-harness-compat-check.js +2 -2
- package/dist/scripts/codex-native-hook-lifecycle-proof-check.js +2 -2
- package/dist/scripts/codex-plugin-app-template-policy-check.js +1 -1
- package/dist/scripts/codex-sdk-backend-router-check.js +1 -1
- package/dist/scripts/codex-sdk-capability-check.js +1 -1
- package/dist/scripts/context7-evidence-dedupe-check.js +1 -1
- package/dist/scripts/core-skill-card-schema-check.js +1 -1
- package/dist/scripts/core-skill-deployment-snapshot-check.js +1 -1
- package/dist/scripts/core-skill-heldout-validation-check.js +1 -1
- package/dist/scripts/core-skill-no-inference-optimizer-check.js +1 -1
- package/dist/scripts/core-skill-patch-check.js +1 -1
- package/dist/scripts/core-skill-route-runtime-integration-check.js +1 -1
- package/dist/scripts/current-command-surface-check.js +1 -1
- package/dist/scripts/current-surface-update-e2e-check.js +4 -1
- package/dist/scripts/current-upgrade-matrix-check.js +1 -1
- package/dist/scripts/dfix-fixture-check.js +1 -1
- package/dist/scripts/dfix-patch-handoff-check.js +1 -1
- package/dist/scripts/dfix-verification-check.js +1 -1
- package/dist/scripts/dfix-verification-recommendation-check.js +1 -1
- package/dist/scripts/docs-truthfulness-check.js +16 -3
- package/dist/scripts/doctor-codex-app-harness-check.js +2 -2
- package/dist/scripts/evidence-flagship-coverage-check.js +1 -1
- package/dist/scripts/{sks-1-18-gate-lib.js → gate-lib.js} +1 -1
- package/dist/scripts/gate-policy-audit-check.js +4 -1
- package/dist/scripts/git-worktree-checkpoint-check.js +1 -1
- package/dist/scripts/git-worktree-cross-rebase-check.js +1 -1
- package/dist/scripts/git-worktree-diff-envelope-check.js +1 -1
- package/dist/scripts/git-worktree-dirty-lock-check.js +1 -1
- package/dist/scripts/git-worktree-dirty-main-detection-check.js +1 -1
- package/dist/scripts/git-worktree-integration-primary-check.js +1 -1
- package/dist/scripts/git-worktree-manifest-append-check.js +1 -1
- package/dist/scripts/git-worktree-untracked-diff-check.js +1 -1
- package/dist/scripts/harness-benchmark-check.js +1 -1
- package/dist/scripts/helper-dedup-check.js +62 -0
- package/dist/scripts/hook-latency-budget-check.js +1 -1
- package/dist/scripts/image-artifact-path-contract-check.js +1 -1
- package/dist/scripts/imagegen-real-smoke-check.js +2 -5
- package/dist/scripts/installed-package-smoke-check.js +1 -1
- package/dist/scripts/legacy-gate-inventory-check.js +1 -1
- package/dist/scripts/legacy-gate-purge-check.js +1 -1
- package/dist/scripts/legacy-strong-inventory-check.js +1 -1
- package/dist/scripts/lib/codex-sdk-gate-lib.js +1 -1
- package/dist/scripts/mad-sks-launch-sql-plane-boundary-check.js +1 -1
- package/dist/scripts/mad-sks-sql-plane-capability-check.js +1 -1
- package/dist/scripts/mad-sks-sql-plane-lifecycle-hook-decision-check.js +1 -1
- package/dist/scripts/mad-sks-sql-plane-result-lifecycle-check.js +1 -1
- package/dist/scripts/managed-config-merge-check.js +1 -1
- package/dist/scripts/mcp-plugin-inventory-check.js +1 -1
- package/dist/scripts/model-call-concurrency-check.js +1 -1
- package/dist/scripts/mutation-callsite-coverage-check.js +1 -1
- package/dist/scripts/naruto-ssot-gate-aliases-check.js +1 -1
- package/dist/scripts/naruto-ssot-pipeline-default-check.js +1 -1
- package/dist/scripts/naruto-ssot-route-normalization-check.js +1 -1
- package/dist/scripts/naruto-ssot-routing-check.js +1 -1
- package/dist/scripts/naruto-worktree-coding-blackbox.js +1 -1
- package/dist/scripts/native-capability-repair-matrix-check.js +1 -1
- package/dist/scripts/native-image-generation-repair-check.js +1 -1
- package/dist/scripts/official-subagent-workflow-check.js +3 -3
- package/dist/scripts/package-published-contract-check.js +37 -4
- package/dist/scripts/packlist-performance-check.js +17 -1
- package/dist/scripts/pipeline-codex-native-doctor-mad-routing-real-blackbox.js +1 -3
- package/dist/scripts/ppt-real-export-adapter-check.js +1 -1
- package/dist/scripts/ppt-real-imagegen-wiring-check.js +1 -1
- package/dist/scripts/ppt-reexport-rereview-check.js +1 -1
- package/dist/scripts/prepublish-fast-check.js +1 -1
- package/dist/scripts/probe-memoization-check.js +2 -2
- package/dist/scripts/prompt-placeholder-guard-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-capability-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-cli-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-confirmation-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-gate-lifecycle-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-launch-check.js +1 -1
- package/dist/scripts/qa-loop-app-handoff-status-lifecycle-check.js +1 -1
- package/dist/scripts/qa-loop-budget-policy-check.js +1 -1
- package/dist/scripts/qa-loop-effort-escalation-check.js +1 -1
- package/dist/scripts/qa-loop-execution-profile-routing-check.js +2 -2
- package/dist/scripts/qa-loop-image-path-exposure-check.js +1 -1
- package/dist/scripts/qa-loop-image-path-prompt-injection-check.js +1 -1
- package/dist/scripts/{sks-1-12-real-execution-check-lib.js → real-execution-check-lib.js} +1 -1
- package/dist/scripts/release-affected-selector-check.js +1 -1
- package/dist/scripts/release-aggressive-resource-governor-check.js +1 -1
- package/dist/scripts/release-cache-glob-hashing-check.js +1 -1
- package/dist/scripts/release-cache-input-classifier-check.js +1 -1
- package/dist/scripts/release-cache-neutralization-report-check.js +1 -1
- package/dist/scripts/release-cache-version-neutral-fixture-check.js +1 -1
- package/dist/scripts/release-dynamic-presets-check.js +2 -2
- package/dist/scripts/release-full-parallelism-blackbox.js +1 -1
- package/dist/scripts/release-gate-batch-runner-check.js +1 -1
- package/dist/scripts/release-gate-budget-check.js +1 -1
- package/dist/scripts/release-gate-dag-runner-check.js +1 -1
- package/dist/scripts/release-latency-slo-check.js +1 -1
- package/dist/scripts/release-metadata-check.js +256 -2
- package/dist/scripts/release-parallel-speed-budget-check.js +1 -1
- package/dist/scripts/release-proof-truth-check.js +1 -1
- package/dist/scripts/release-provenance-check.js +4 -2
- package/dist/scripts/release-runtime-truth-matrix-check.js +1 -1
- package/dist/scripts/research-blueprint-densifier-check.js +1 -1
- package/dist/scripts/research-claim-builder-check.js +1 -1
- package/dist/scripts/research-complete-package-fixture-check.js +1 -1
- package/dist/scripts/research-execution-profile-routing-check.js +2 -2
- package/dist/scripts/research-final-reviewer-blackbox.js +1 -1
- package/dist/scripts/{sks-3-1-4-directive-check-lib.js → runtime-domain-gate-lib.js} +2 -2
- package/dist/scripts/runtime-proof-summary-check.js +1 -1
- package/dist/scripts/runtime-script-pack-closure-check.js +7 -1
- package/dist/scripts/scheduler-batch-dispatch-check.js +1 -1
- package/dist/scripts/scheduler-parallel-proof-consistency-check.js +1 -1
- package/dist/scripts/scheduler-utilization-integral-check.js +1 -1
- package/dist/scripts/search-visibility-gate-lib.js +1 -1
- package/dist/scripts/secret-preservation-check.js +1 -1
- package/dist/scripts/seo-geo-geo-disambiguation-check.js +1 -1
- package/dist/scripts/seo-geo-skill-rich-content-check.js +1 -1
- package/dist/scripts/side-effect-runtime-report-check.js +1 -1
- package/dist/scripts/{sks-3-1-8-check-lib.js → skill-fixture-check-lib.js} +1 -1
- package/dist/scripts/skill-name-canonicalizer-check.js +1 -1
- package/dist/scripts/skills-manifest-continuity-check.js +1 -1
- package/dist/scripts/sks-uninstall-regression-check.js +1 -1
- package/dist/scripts/sksd-daemon-check.js +1 -1
- package/dist/scripts/super-search-provider-interface-check.js +1 -1
- package/dist/scripts/triwiki-cache-key-check.js +1 -1
- package/dist/scripts/triwiki-proof-bank-blackbox.js +2 -2
- package/dist/scripts/triwiki-proof-bank-check.js +1 -1
- package/dist/scripts/triwiki-proof-card-check.js +1 -1
- package/dist/scripts/type-surface-codex-app-check.js +2 -2
- package/dist/scripts/{sks-3-1-5-directive-check-lib.js → typed-routing-gate-lib.js} +2 -2
- package/dist/scripts/ultra-router-auto-router-check.js +1 -1
- package/dist/scripts/ux-review-extract-wires-real-extractor-check.js +1 -1
- package/dist/scripts/ux-review-patch-diff-recheck-check.js +1 -1
- package/dist/scripts/ux-review-run-wires-imagegen-check.js +9 -2
- package/package.json +5 -7
- package/release-gates.v2.json +66 -11
- package/runtime-required-scripts.json +138 -14
- package/config/bench-baseline.json +0 -7
- package/dist/core/codex-app/sks-menubar.js +0 -1
- package/dist/core/release/release-closure-contract.js +0 -30
- package/dist/core/release/release-closure-helpers.js +0 -293
- package/dist/core/release/release-closure-validation.js +0 -284
- package/dist/core/release/release-closure.js +0 -163
- package/dist/scripts/build-dist.js +0 -124
- package/dist/scripts/build-once-runner-check.js +0 -6
- package/dist/scripts/canonical-test-runner.js +0 -234
- package/dist/scripts/changelog-check.js +0 -45
- package/dist/scripts/check-architecture.js +0 -295
- package/dist/scripts/check-cli-entrypoint.js +0 -41
- package/dist/scripts/check-command-module-budget.js +0 -77
- package/dist/scripts/check-feature-quality.js +0 -51
- package/dist/scripts/check-legacy-free.js +0 -64
- package/dist/scripts/check-pipeline-budget.js +0 -49
- package/dist/scripts/check-pipeline-runtime.js +0 -16
- package/dist/scripts/check-publish-tag.js +0 -56
- package/dist/scripts/check-route-modularity.js +0 -72
- package/dist/scripts/codex-0140-capability-check.js +0 -14
- package/dist/scripts/codex-0140-feature-probes-check.js +0 -23
- package/dist/scripts/codex-permission-profiles-check.js +0 -34
- package/dist/scripts/codex-project-config-policy-splitter-check.js +0 -49
- package/dist/scripts/competitor-scorecard-check.js +0 -24
- package/dist/scripts/core-skill-no-drift-check.js +0 -23
- package/dist/scripts/db-route-materialization-check.js +0 -32
- package/dist/scripts/doctor-context7-mcp-repair-blackbox.js +0 -15
- package/dist/scripts/doctor-fastpath-check.js +0 -25
- package/dist/scripts/doctor-fix-production-blackbox.js +0 -35
- package/dist/scripts/doctor-idempotence-check.js +0 -6
- package/dist/scripts/doctor-ops-semantics-check.js +0 -83
- package/dist/scripts/doctor-startup-config-repair-blackbox.js +0 -18
- package/dist/scripts/doctor-supabase-mcp-repair-blackbox.js +0 -13
- package/dist/scripts/ensure-bin-executable.js +0 -16
- package/dist/scripts/fsx-hotpath-check.js +0 -9
- package/dist/scripts/high-risk-contracts-check.js +0 -183
- package/dist/scripts/hook-latency-quantum-check.js +0 -120
- package/dist/scripts/import-graph-budget-check.js +0 -9
- package/dist/scripts/mcp-tool-naming-parity-check.js +0 -14
- package/dist/scripts/naruto-codex-e2e-check.js +0 -105
- package/dist/scripts/naruto-write-e2e-check.js +0 -31
- package/dist/scripts/native-capability-postcheck-check.js +0 -16
- package/dist/scripts/ops-diagnostics-bundle-check.js +0 -11
- package/dist/scripts/parallel-production-smoke-check.js +0 -20
- package/dist/scripts/perf-budget-check.js +0 -12
- package/dist/scripts/project-skill-dedupe-blackbox.js +0 -62
- package/dist/scripts/release-dag-full-coverage-check.js +0 -98
- package/dist/scripts/release-dist-freshness-check.js +0 -6
- package/dist/scripts/release-file-ownership-check.js +0 -35
- package/dist/scripts/release-gate-script-parity-check.js +0 -148
- package/dist/scripts/release-macos-menubar-proof.js +0 -167
- package/dist/scripts/release-main-push-guard.js +0 -37
- package/dist/scripts/release-main-push-receipt.js +0 -43
- package/dist/scripts/release-metadata-1-19-check.js +0 -257
- package/dist/scripts/release-version-truth-check.js +0 -138
- package/dist/scripts/retention-apply-smoke-check.js +0 -19
- package/dist/scripts/retention-budget-check.js +0 -6
- package/dist/scripts/retention-dry-run-check.js +0 -8
- package/dist/scripts/rollback-recovery-smoke-check.js +0 -70
- package/dist/scripts/route-intent-regression-check.js +0 -42
- package/dist/scripts/runtime-current-terminal-check.js +0 -108
- package/dist/scripts/runtime-dist-parity-check.js +0 -76
- package/dist/scripts/runtime-no-src-mjs-check.js +0 -30
- package/dist/scripts/runtime-ts-rust-boundary-check.js +0 -58
- package/dist/scripts/runtime-ts-source-of-truth-check.js +0 -53
- package/dist/scripts/secret-preservation-guard-check.js +0 -36
- package/dist/scripts/seo-marketing-truthfulness-check.js +0 -98
- package/dist/scripts/seo-metadata-sync-check.js +0 -60
- package/dist/scripts/sizecheck.js +0 -148
- package/dist/scripts/sks-menubar-install-check.js +0 -333
- package/dist/scripts/supabase-secret-preservation-blackbox.js +0 -28
- package/dist/scripts/super-search-live-smoke-check.js +0 -115
- package/dist/scripts/super-search-local-http-smoke-check.js +0 -16
- package/dist/scripts/super-search-offline-contract-check.js +0 -43
- package/dist/scripts/update-fastpath-check.js +0 -28
- package/dist/scripts/update-preserves-supabase-keys-blackbox.js +0 -26
- package/dist/scripts/upgrade-migration-matrix-check.js +0 -351
- package/dist/scripts/write-build-manifest.js +0 -70
- package/dist/scripts/zellij-capability-check.js +0 -13
- package/dist/scripts/zellij-developer-controls-check.js +0 -16
- package/dist/scripts/zellij-doctor-readiness-check.js +0 -49
- package/dist/scripts/zellij-dynamic-pane-lifecycle-check.js +0 -19
- package/dist/scripts/zellij-fake-adapter-check.js +0 -31
- package/dist/scripts/zellij-first-slot-down-stack-check.js +0 -20
- package/dist/scripts/zellij-first-slot-down-stack-real-check.js +0 -348
- package/dist/scripts/zellij-homebrew-policy-check.js +0 -3
- package/dist/scripts/zellij-initial-main-only-blackbox.js +0 -21
- package/dist/scripts/zellij-lane-renderer-check.js +0 -78
- package/dist/scripts/zellij-launch-command-truth-check.js +0 -62
- package/dist/scripts/zellij-layout-valid-check.js +0 -120
- package/dist/scripts/zellij-pane-creation-lock-metrics-check.js +0 -10
- package/dist/scripts/zellij-pane-lock-concurrency-blackbox.js +0 -78
- package/dist/scripts/zellij-pane-lock-does-not-block-worker-check.js +0 -12
- package/dist/scripts/zellij-pane-lock-open-worker-integration-blackbox.js +0 -134
- package/dist/scripts/zellij-qa-app-handoff-status-check.js +0 -7
- package/dist/scripts/zellij-right-column-geometry-proof.js +0 -158
- package/dist/scripts/zellij-right-column-headless-overflow-check.js +0 -20
- package/dist/scripts/zellij-right-column-manager-check.js +0 -24
- package/dist/scripts/zellij-self-heal-check.js +0 -3
- package/dist/scripts/zellij-self-heal-dry-run-check.js +0 -3
- package/dist/scripts/zellij-self-heal-status-contract-check.js +0 -3
- package/dist/scripts/zellij-self-heal-typed-blackbox.js +0 -3
- package/dist/scripts/zellij-slot-column-anchor-check.js +0 -65
- package/dist/scripts/zellij-slot-column-anchor-telemetry-check.js +0 -8
- package/dist/scripts/zellij-slot-only-ui-check.js +0 -29
- package/dist/scripts/zellij-slot-pane-renderer-check.js +0 -149
- package/dist/scripts/zellij-slot-pane-stale-detection-check.js +0 -65
- package/dist/scripts/zellij-slot-pane-telemetry-renderer-check.js +0 -11
- package/dist/scripts/zellij-slot-renderer-proof-semantics-check.js +0 -58
- package/dist/scripts/zellij-slot-telemetry-check.js +0 -38
- package/dist/scripts/zellij-slot-telemetry-incremental-check.js +0 -46
- package/dist/scripts/zellij-slot-telemetry-live-flush-check.js +0 -55
- package/dist/scripts/zellij-slot-telemetry-performance-check.js +0 -32
- package/dist/scripts/zellij-slot-telemetry-real-blackbox.js +0 -19
- package/dist/scripts/zellij-slot-telemetry-renderer-check.js +0 -11
- package/dist/scripts/zellij-slot-telemetry-runtime-check.js +0 -23
- package/dist/scripts/zellij-spawn-on-demand-layout-check.js +0 -45
- package/dist/scripts/zellij-stacked-capability-routing-check.js +0 -9
- package/dist/scripts/zellij-stacked-fallback-integration-blackbox.js +0 -78
- package/dist/scripts/zellij-stacked-version-matrix-check.js +0 -29
- package/dist/scripts/zellij-stacked-version-parser-check.js +0 -19
- package/dist/scripts/zellij-ui-design-check.js +0 -92
- package/dist/scripts/zellij-update-missing-self-heal-check.js +0 -3
- package/dist/scripts/zellij-update-prompt-matrix-check.js +0 -16
- package/dist/scripts/zellij-update-prompt-mode-check.js +0 -18
- package/dist/scripts/zellij-update-prompt-safety-check.js +0 -8
- package/dist/scripts/zellij-worker-pane-manager-check.js +0 -108
- package/dist/scripts/zellij-worker-pane-manager-single-owner-check.js +0 -47
- package/dist/scripts/zellij-worker-pane-real-ui-blackbox.js +0 -199
- /package/dist/scripts/{sks-1-11-gate-lib.js → sks-cli-gate-lib.js} +0 -0
package/dist/core/db-safety.js
CHANGED
|
@@ -346,25 +346,6 @@ function hasTableRemovalRisk(cls = {}) {
|
|
|
346
346
|
]);
|
|
347
347
|
return ['drop_table', 'truncate'].some((reason) => reasons.has(reason));
|
|
348
348
|
}
|
|
349
|
-
async function madSksOverrideState(root, state = {}) {
|
|
350
|
-
if (!isMadSksRouteState(state) || !state.mission_id || state.mad_sks_active === false)
|
|
351
|
-
return { active: false };
|
|
352
|
-
const gateFile = state.mad_sks_gate_file || state.stop_gate || MAD_SKS_GATE_FILE;
|
|
353
|
-
const gate = await readJson(path.join(missionDir(root, state.mission_id), gateFile), null);
|
|
354
|
-
const owner = gate?.gate_owner?.mission_id || gate?.mission_id || state.gate_owner_mission_id;
|
|
355
|
-
if (owner && String(owner) !== String(state.mission_id)) {
|
|
356
|
-
return { active: false, reason: 'mad_sks_gate_owner_mismatch', gate_file: gateFile, gate_owner_mission_id: owner };
|
|
357
|
-
}
|
|
358
|
-
if (gate?.passed === true || gate?.permissions_deactivated === true)
|
|
359
|
-
return { active: false, reason: 'mad_sks_gate_already_closed', gate_file: gateFile };
|
|
360
|
-
const confirmedUntil = Date.parse(state.mad_sks_table_delete_confirmed_until || '');
|
|
361
|
-
return {
|
|
362
|
-
active: true,
|
|
363
|
-
gateFile,
|
|
364
|
-
tableDeleteConfirmed: Number.isFinite(confirmedUntil) && confirmedUntil > Date.now(),
|
|
365
|
-
tableDeleteConfirmedUntil: Number.isFinite(confirmedUntil) ? new Date(confirmedUntil).toISOString() : null
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
349
|
export function evaluateDbSafety({ classification, policy = DEFAULT_DB_SAFETY_POLICY, contract = null, duringNoQuestion = false, madSks = null } = {}) {
|
|
369
350
|
const cls = classification || { level: 'none', reasons: [] };
|
|
370
351
|
const noQuestion = Boolean(duringNoQuestion);
|
|
@@ -427,6 +408,7 @@ export function evaluateDbSafety({ classification, policy = DEFAULT_DB_SAFETY_PO
|
|
|
427
408
|
reasons.push('database_write_target_not_local_or_branch');
|
|
428
409
|
if (policy.block_direct_execute_sql_writes && cls.toolReasons?.includes?.('database_tool'))
|
|
429
410
|
reasons.push('direct_mcp_execute_sql_writes_blocked');
|
|
411
|
+
reasons.push('database_mutation_requires_manual_sql_or_active_mad_sks_sql_plane');
|
|
430
412
|
}
|
|
431
413
|
if (effective.destructive)
|
|
432
414
|
reasons.push('contract_attempted_to_allow_destructive_but_policy_denies');
|
|
@@ -575,8 +557,15 @@ export async function checkDbOperation(root, state, payload, { duringNoQuestion
|
|
|
575
557
|
await appendJsonlBounded(path.join(missionDir(root, madSksSqlPlaneMissionId), 'db-safety.jsonl'), { ts: nowIso(), decision });
|
|
576
558
|
return decision;
|
|
577
559
|
}
|
|
578
|
-
const
|
|
579
|
-
|
|
560
|
+
const decision = evaluateDbSafety({ classification, policy, contract, duringNoQuestion, madSks: null });
|
|
561
|
+
if (isMadSksRouteState(state) && ['write', 'destructive'].includes(classification.level)) {
|
|
562
|
+
decision.reasons = [...new Set([
|
|
563
|
+
...(decision.reasons || []),
|
|
564
|
+
'mad_sks_sql_plane_capability_v2_required'
|
|
565
|
+
])];
|
|
566
|
+
decision.allowed = false;
|
|
567
|
+
decision.action = 'block';
|
|
568
|
+
}
|
|
580
569
|
if (decision.action === 'confirm')
|
|
581
570
|
await writeMadSksTableDeletePending(root, state, decision);
|
|
582
571
|
if (decision.action !== 'allow' && state?.mission_id) {
|
|
@@ -610,7 +599,8 @@ export function dbBlockReason(decision) {
|
|
|
610
599
|
return [
|
|
611
600
|
'Sneakoscope Codex Database Safety Gate blocked this operation.',
|
|
612
601
|
`Reasons: ${(decision.reasons || []).join(', ') || 'unknown'}.`,
|
|
613
|
-
'Default DB mode is read-only.
|
|
602
|
+
'Default DB mode is read-only. If a migration is required outside MAD-SKS, create one mission-local manual-migration.sql with forward SQL and an inactive rollback section, then ask the user to apply it manually.',
|
|
603
|
+
'All live database mutations require an explicit active MAD-SKS SQL-plane capability v2 opened by $MAD-SKS or sks mad-sks sql|apply-migration.',
|
|
614
604
|
'Use read-only/project-scoped Supabase MCP URLs outside MAD-SKS SQL-plane. Supabase project/account/billing/credential control-plane operations remain denied even there.'
|
|
615
605
|
].join(' ');
|
|
616
606
|
}
|
|
@@ -699,7 +689,11 @@ async function scanMissionMigrationFiles(root, opts = {}) {
|
|
|
699
689
|
for (const e of entries) {
|
|
700
690
|
const p = path.join(dir, e.name);
|
|
701
691
|
const rp = rel(root, p);
|
|
702
|
-
if (
|
|
692
|
+
if (e.name.startsWith('.')
|
|
693
|
+
|| ['node_modules', 'dist', 'build', 'coverage', 'vendor', 'archive'].includes(e.name)
|
|
694
|
+
|| rp.startsWith('.git/')
|
|
695
|
+
|| rp.startsWith('node_modules/')
|
|
696
|
+
|| rp.startsWith('.sneakoscope/'))
|
|
703
697
|
continue;
|
|
704
698
|
if (e.isDirectory())
|
|
705
699
|
await walk(p, depth + 1);
|
|
@@ -4,6 +4,7 @@ import { ensureCodexPlugins } from '../codex-plugins/codex-plugin-repair.js';
|
|
|
4
4
|
import { runDoctorCodexStartupRepair } from './doctor-codex-startup-repair.js';
|
|
5
5
|
import { ensureDir, nowIso, runProcess, which, writeJsonAtomic } from '../fsx.js';
|
|
6
6
|
import { redactString } from '../secret-redaction.js';
|
|
7
|
+
import { messageOf } from '../errors/message.js';
|
|
7
8
|
export const DOCTOR_BROWSER_USE_REPAIR_SCHEMA = 'sks.doctor-browser-use-repair.v1';
|
|
8
9
|
export async function repairBrowserUse(input) {
|
|
9
10
|
const root = path.resolve(input.root || process.cwd());
|
|
@@ -182,6 +183,3 @@ function tail(value, max = 2000) {
|
|
|
182
183
|
const text = redactString(String(value || ''));
|
|
183
184
|
return text.length > max ? text.slice(-max) : text;
|
|
184
185
|
}
|
|
185
|
-
function messageOf(err) {
|
|
186
|
-
return err instanceof Error ? err.message : String(err);
|
|
187
|
-
}
|
|
@@ -3,6 +3,7 @@ import { nowIso, writeJsonAtomic } from '../fsx.js';
|
|
|
3
3
|
import { repairAgentRoleConfigs } from '../agents/agent-role-config.js';
|
|
4
4
|
import { repairAgentConfigFileReferences } from '../codex/agent-config-file-repair.js';
|
|
5
5
|
import { postcheckCodexStartupConfig } from '../codex/codex-startup-config-postcheck.js';
|
|
6
|
+
import { messageOf } from '../errors/message.js';
|
|
6
7
|
export async function repairCodexStartupConfig(input) {
|
|
7
8
|
const root = path.resolve(input.root);
|
|
8
9
|
const roleRepair = await repairAgentRoleConfigs({
|
|
@@ -52,6 +53,3 @@ export async function repairCodexStartupConfig(input) {
|
|
|
52
53
|
}
|
|
53
54
|
return report;
|
|
54
55
|
}
|
|
55
|
-
function messageOf(err) {
|
|
56
|
-
return err instanceof Error ? err.message : String(err);
|
|
57
|
-
}
|
|
@@ -4,6 +4,7 @@ import { ensureCodexPlugins } from '../codex-plugins/codex-plugin-repair.js';
|
|
|
4
4
|
import { computerUseStatusReport } from '../computer-use-status.js';
|
|
5
5
|
import { ensureDir, nowIso, runProcess, which, writeJsonAtomic } from '../fsx.js';
|
|
6
6
|
import { redactString } from '../secret-redaction.js';
|
|
7
|
+
import { messageOf } from '../errors/message.js';
|
|
7
8
|
export const DOCTOR_COMPUTER_USE_REPAIR_SCHEMA = 'sks.doctor-computer-use-repair.v1';
|
|
8
9
|
export async function repairComputerUse(input) {
|
|
9
10
|
const root = path.resolve(input.root || process.cwd());
|
|
@@ -149,6 +150,3 @@ function tail(value, max = 2000) {
|
|
|
149
150
|
const text = redactString(String(value || ''));
|
|
150
151
|
return text.length > max ? text.slice(-max) : text;
|
|
151
152
|
}
|
|
152
|
-
function messageOf(err) {
|
|
153
|
-
return err instanceof Error ? err.message : String(err);
|
|
154
|
-
}
|
|
@@ -4,6 +4,7 @@ import { isUnmanagedProjectCodexConfig, writeCodexConfigGuarded } from '../codex
|
|
|
4
4
|
import { CONTEXT7_REMOTE_MCP_URL, mcpServerBlock, mcpServerExplicitlyDisabled, readProjectCodexConfig, replaceOrAppendMcpServerBlock } from '../mcp/mcp-config-preservation.js';
|
|
5
5
|
import { guardedWriteFile, guardContextForRoute } from '../safety/mutation-guard.js';
|
|
6
6
|
import { createRequestedScopeContract } from '../safety/requested-scope-contract.js';
|
|
7
|
+
import { messageOf } from '../errors/message.js';
|
|
7
8
|
export async function repairContext7Mcp(input) {
|
|
8
9
|
const root = path.resolve(input.root);
|
|
9
10
|
const config = await readProjectCodexConfig(root);
|
|
@@ -105,9 +106,6 @@ export async function repairContext7Mcp(input) {
|
|
|
105
106
|
}
|
|
106
107
|
return report;
|
|
107
108
|
}
|
|
108
|
-
function messageOf(err) {
|
|
109
|
-
return err instanceof Error ? err.message : String(err);
|
|
110
|
-
}
|
|
111
109
|
async function probeRemoteContext7() {
|
|
112
110
|
try {
|
|
113
111
|
const response = await fetch(CONTEXT7_REMOTE_MCP_URL, { method: 'HEAD' });
|
|
@@ -8,6 +8,7 @@ import { isSksGeneratedRetiredProfileText, reconcileRetiredSksConfigText, RETIRE
|
|
|
8
8
|
import { validateCodexConfigRoundTrip } from '../codex/codex-config-toml.js';
|
|
9
9
|
import { inspectConfinedPath, moveConfinedPath, removeManagedPathVerified, uniqueConfinedPath } from '../managed-path-safety.js';
|
|
10
10
|
import { collectNestedProjectRoots } from './current-project-guidance-nested.js';
|
|
11
|
+
import { escapeRegExp } from '../text/regex.js';
|
|
11
12
|
export const CURRENT_PROJECT_GUIDANCE_SCHEMA = 'sks.current-project-guidance.v1';
|
|
12
13
|
const AGENTS_MARKER = 'BEGIN Sneakoscope Codex GX MANAGED BLOCK';
|
|
13
14
|
const RETIRED_COMMAND_NAMES = ['team', 'mad-db', 'tmux', 'xai', 'swarm', 'agent', 'ralph', 'db', 'ui', 'glm'];
|
|
@@ -341,6 +342,3 @@ function uniqueScopes(scopes) {
|
|
|
341
342
|
}
|
|
342
343
|
return [...unique.values()];
|
|
343
344
|
}
|
|
344
|
-
function escapeRegExp(value) {
|
|
345
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
346
|
-
}
|
|
@@ -3,6 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import { exists, nowIso, readText, writeJsonAtomic } from '../fsx.js';
|
|
5
5
|
import { isUnmanagedProjectCodexConfig, writeCodexConfigGuarded } from '../codex/codex-config-guard.js';
|
|
6
|
+
import { escapeRegExp } from '../text/regex.js';
|
|
6
7
|
export const DOCTOR_CODEX_STARTUP_REPAIR_SCHEMA = 'sks.doctor-codex-startup-repair.v1';
|
|
7
8
|
export async function runDoctorCodexStartupRepair(input) {
|
|
8
9
|
const root = path.resolve(input.root || process.cwd());
|
|
@@ -370,6 +371,3 @@ function stringValues(text, key) {
|
|
|
370
371
|
function escapeToml(value) {
|
|
371
372
|
return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
372
373
|
}
|
|
373
|
-
function escapeRegExp(value) {
|
|
374
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
375
|
-
}
|
|
@@ -4,7 +4,7 @@ import { spawnSync } from 'node:child_process';
|
|
|
4
4
|
import { MANAGED_ASSET_VERSION } from '../managed-assets/managed-assets-manifest.js';
|
|
5
5
|
import { PACKAGE_VERSION, packageRoot, sha256 } from '../fsx.js';
|
|
6
6
|
import { hashJson } from '../triwiki/triwiki-cache-key.js';
|
|
7
|
-
import { SKS_MENUBAR_LABEL, sksMenuBarPaths } from '../codex-app/
|
|
7
|
+
import { SKS_MENUBAR_LABEL, sksMenuBarPaths } from '../codex-app/menubar/index.js';
|
|
8
8
|
export const DOCTOR_DIRTY_PLAN_SCHEMA = 'sks.doctor-dirty-plan.v2';
|
|
9
9
|
export function planDoctorDirtyRepair(root, phaseIds) {
|
|
10
10
|
const phases = phaseIds.map((id) => {
|
|
@@ -116,7 +116,7 @@ function phaseInputFiles(id) {
|
|
|
116
116
|
if (id.includes('supabase'))
|
|
117
117
|
return ['src/core/doctor/supabase-mcp-repair.ts', '.codex/config.toml'];
|
|
118
118
|
if (id.includes('menubar'))
|
|
119
|
-
return ['src/core/codex-app/
|
|
119
|
+
return ['src/core/codex-app/menubar/index.ts', 'src/commands/doctor.ts', 'package.json'];
|
|
120
120
|
if (id.includes('skill'))
|
|
121
121
|
return ['.agents/skills', 'src/scripts/skill-registry-ledger-check.ts'];
|
|
122
122
|
if (id.includes('native'))
|
|
@@ -8,6 +8,7 @@ import { withSecretPreservationGuard } from '../config/config-migration-journal.
|
|
|
8
8
|
import { ensureProductDesignPluginInstalled } from '../product-design-app-server.js';
|
|
9
9
|
import { cleanupLegacyGlobalSksHooks } from './legacy-global-hook-cleanup.js';
|
|
10
10
|
import { redactSecrets } from '../secret-redaction.js';
|
|
11
|
+
import { messageOf } from '../errors/message.js';
|
|
11
12
|
export async function runDoctorNativeCapabilityRepair(input) {
|
|
12
13
|
const root = path.resolve(input.root);
|
|
13
14
|
const fixRequested = input.fix || (input.flags || []).includes('--fix');
|
|
@@ -135,9 +136,6 @@ export async function cleanupNativeCapabilityProbeArtifacts(root, opts = { apply
|
|
|
135
136
|
preserved_non_probe_files: preserved
|
|
136
137
|
};
|
|
137
138
|
}
|
|
138
|
-
function messageOf(err) {
|
|
139
|
-
return err instanceof Error ? err.message : String(err);
|
|
140
|
-
}
|
|
141
139
|
function skippedNativeCapabilityDiagnostics(root) {
|
|
142
140
|
return {
|
|
143
141
|
schema: 'sks.native-capability-repair-matrix.v1',
|
|
@@ -2,6 +2,7 @@ import path from 'node:path';
|
|
|
2
2
|
import { nowIso, writeJsonAtomic } from '../fsx.js';
|
|
3
3
|
import { isDoctorPhaseClean, markDoctorPhaseClean } from './doctor-dirty-planner.js';
|
|
4
4
|
import { ui as cliUi } from '../../cli/cli-theme.js';
|
|
5
|
+
import { messageOf } from '../errors/message.js';
|
|
5
6
|
export async function runDoctorFixTransaction(input) {
|
|
6
7
|
const startedAt = nowIso();
|
|
7
8
|
const phases = [];
|
|
@@ -172,6 +173,3 @@ function mergePhase(phase, update) {
|
|
|
172
173
|
warnings: [...(phase.warnings || []), ...(update.warnings || [])]
|
|
173
174
|
};
|
|
174
175
|
}
|
|
175
|
-
function messageOf(err) {
|
|
176
|
-
return err instanceof Error ? err.message : String(err);
|
|
177
|
-
}
|
|
@@ -3,6 +3,7 @@ import { CODEX_APP_IMAGE_GENERATION_DOC_URL } from '../routes.js';
|
|
|
3
3
|
import { detectImagegenCapability } from '../imagegen/imagegen-capability.js';
|
|
4
4
|
import { ensureDir, nowIso, runProcess, which, writeJsonAtomic } from '../fsx.js';
|
|
5
5
|
import { redactString } from '../secret-redaction.js';
|
|
6
|
+
import { messageOf } from '../errors/message.js';
|
|
6
7
|
export const DOCTOR_IMAGEGEN_REPAIR_SCHEMA = 'sks.doctor-imagegen-repair.v1';
|
|
7
8
|
export async function repairCodexImagegen(input) {
|
|
8
9
|
const root = path.resolve(input.root || process.cwd());
|
|
@@ -197,6 +198,3 @@ function tail(value, max = 2000) {
|
|
|
197
198
|
const text = redactString(String(value || ''));
|
|
198
199
|
return text.length > max ? text.slice(-max) : text;
|
|
199
200
|
}
|
|
200
|
-
function messageOf(err) {
|
|
201
|
-
return err instanceof Error ? err.message : String(err);
|
|
202
|
-
}
|
|
@@ -2,6 +2,7 @@ import fs from 'node:fs/promises';
|
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { ensureDir, nowIso, readText, writeJsonAtomic } from '../fsx.js';
|
|
5
|
+
import { messageOf } from '../errors/message.js';
|
|
5
6
|
export const LEGACY_GLOBAL_HOOK_CLEANUP_SCHEMA = 'sks.legacy-global-hook-cleanup.v1';
|
|
6
7
|
export async function cleanupLegacyGlobalSksHooks(input) {
|
|
7
8
|
const root = path.resolve(input.root);
|
|
@@ -173,6 +174,3 @@ async function pruneOldBackups(globalPath, keepPath) {
|
|
|
173
174
|
if (row.file !== keepPath)
|
|
174
175
|
await fs.rm(row.file, { force: true }).catch(() => undefined);
|
|
175
176
|
}
|
|
176
|
-
function messageOf(err) {
|
|
177
|
-
return err instanceof Error ? err.message : String(err);
|
|
178
|
-
}
|
|
@@ -4,6 +4,7 @@ import fs from 'node:fs/promises';
|
|
|
4
4
|
import { nowIso, writeJsonAtomic } from '../fsx.js';
|
|
5
5
|
import { isUnmanagedProjectCodexConfig, writeCodexConfigGuarded } from '../codex/codex-config-guard.js';
|
|
6
6
|
import { mcpServerBlock, mcpServerExplicitlyDisabled, readProjectCodexConfig, tomlTableRange } from '../mcp/mcp-config-preservation.js';
|
|
7
|
+
import { messageOf } from '../errors/message.js';
|
|
7
8
|
export async function detectAndRepairMcpTransportCollisions(input) {
|
|
8
9
|
const root = path.resolve(input.root);
|
|
9
10
|
const apply = input.apply === true;
|
|
@@ -134,6 +135,3 @@ function commentOutMcpServerBlock(block, server, projectTransport, globalTranspo
|
|
|
134
135
|
.join('\n');
|
|
135
136
|
return `${note}${commented}\n`;
|
|
136
137
|
}
|
|
137
|
-
function messageOf(err) {
|
|
138
|
-
return err instanceof Error ? err.message : String(err);
|
|
139
|
-
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { inspectConfinedPath, moveConfinedPath, removeEmptyTreeVerified, uniqueConfinedPath, walkConfinedEntries } from '../managed-path-safety.js';
|
|
3
|
+
import { escapeRegExp } from '../text/regex.js';
|
|
3
4
|
export const REMOVED_PUBLIC_COMMANDS = ['team', 'mad-db', 'tmux', 'xai', 'swarm', 'agent', 'ralph', 'ui', 'glm'];
|
|
4
5
|
const RETIRED_COMMAND_TOMBSTONES = new Set(REMOVED_PUBLIC_COMMANDS);
|
|
5
6
|
const RETIRED_MISSION_MODES = new Set([
|
|
@@ -69,6 +70,3 @@ export async function walkEntries(boundary, root) {
|
|
|
69
70
|
export async function removeEmptyTree(boundary, root) {
|
|
70
71
|
return removeEmptyTreeVerified(boundary, root);
|
|
71
72
|
}
|
|
72
|
-
function escapeRegExp(value) {
|
|
73
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
74
|
-
}
|
|
@@ -4,6 +4,7 @@ import fs from 'node:fs/promises';
|
|
|
4
4
|
import { nowIso, writeJsonAtomic } from '../fsx.js';
|
|
5
5
|
import { isUnmanagedProjectCodexConfig, writeCodexConfigGuarded } from '../codex/codex-config-guard.js';
|
|
6
6
|
import { mcpServerBlock, mcpServerExplicitlyDisabled, readProjectCodexConfig, replaceOrAppendMcpServerBlock, tomlTableRange } from '../mcp/mcp-config-preservation.js';
|
|
7
|
+
import { messageOf } from '../errors/message.js';
|
|
7
8
|
export async function repairSupabaseMcp(input) {
|
|
8
9
|
const root = path.resolve(input.root);
|
|
9
10
|
const config = await readProjectCodexConfig(root);
|
|
@@ -136,9 +137,6 @@ export async function repairSupabaseMcp(input) {
|
|
|
136
137
|
}
|
|
137
138
|
return report;
|
|
138
139
|
}
|
|
139
|
-
function messageOf(err) {
|
|
140
|
-
return err instanceof Error ? err.message : String(err);
|
|
141
|
-
}
|
|
142
140
|
function setReadOnly(block) {
|
|
143
141
|
const lines = String(block || '').replace(/\s*$/, '').split(/\r?\n/);
|
|
144
142
|
const index = lines.findIndex((line) => /^\s*read[_-]?only\s*=/.test(line));
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { scanCodeStructure } from './code-structure.js';
|
|
3
|
+
import { readJson, readText, sha256 } from './fsx.js';
|
|
4
|
+
import { missionDir } from './mission.js';
|
|
5
|
+
export const ENGINEERING_SANITY_REVIEW_ARTIFACT = 'engineering-sanity-review.json';
|
|
6
|
+
export const ENGINEERING_SANITY_REVIEW_SCHEMA = 'sks.engineering-sanity-review.v1';
|
|
7
|
+
export const ENGINEERING_SANITY_CODE_STRUCTURE_REPORT = 'code-structure-report.json';
|
|
8
|
+
export const ENGINEERING_SANITY_CHECK_IDS = Object.freeze([
|
|
9
|
+
'solid_boundaries',
|
|
10
|
+
'n_plus_one_and_repeated_io',
|
|
11
|
+
'bounded_render_recursion_event_retry_polling',
|
|
12
|
+
'verification_bypass_absent'
|
|
13
|
+
]);
|
|
14
|
+
const FINAL_CHECK_STATUSES = new Set(['passed', 'not_applicable']);
|
|
15
|
+
export function createEngineeringSanityReviewSeed(route = null, report = null, reportText = '') {
|
|
16
|
+
const candidates = engineeringCandidates(report);
|
|
17
|
+
return {
|
|
18
|
+
schema: ENGINEERING_SANITY_REVIEW_SCHEMA,
|
|
19
|
+
passed: false,
|
|
20
|
+
route: route || null,
|
|
21
|
+
changed_files: sortedUniqueStrings(report?.changed_scope?.source_files),
|
|
22
|
+
added_hunks_reviewed: false,
|
|
23
|
+
real_callers_traced: false,
|
|
24
|
+
static_scan_role: 'candidate_detection_only_not_completion_proof',
|
|
25
|
+
code_structure_report: ENGINEERING_SANITY_CODE_STRUCTURE_REPORT,
|
|
26
|
+
code_structure_report_sha256: reportText ? `sha256:${sha256(reportText)}` : null,
|
|
27
|
+
changed_scope_sha256: report ? engineeringScopeHash(report) : null,
|
|
28
|
+
reviewed_candidate_ids: [],
|
|
29
|
+
candidate_dispositions: [],
|
|
30
|
+
checks: Object.fromEntries(ENGINEERING_SANITY_CHECK_IDS.map((id) => [id, {
|
|
31
|
+
status: 'pending',
|
|
32
|
+
reason: null,
|
|
33
|
+
evidence: []
|
|
34
|
+
}])),
|
|
35
|
+
candidate_findings: candidates,
|
|
36
|
+
resolved_findings: [],
|
|
37
|
+
unresolved_findings: [],
|
|
38
|
+
blockers: [],
|
|
39
|
+
notes: []
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function validateEngineeringSanityReview(review = {}) {
|
|
43
|
+
const blockers = [];
|
|
44
|
+
if (review?.schema !== ENGINEERING_SANITY_REVIEW_SCHEMA)
|
|
45
|
+
blockers.push('schema');
|
|
46
|
+
if (review?.passed !== true)
|
|
47
|
+
blockers.push('passed');
|
|
48
|
+
if (review?.added_hunks_reviewed !== true)
|
|
49
|
+
blockers.push('added_hunks_reviewed');
|
|
50
|
+
if (review?.real_callers_traced !== true)
|
|
51
|
+
blockers.push('real_callers_traced');
|
|
52
|
+
if (review?.static_scan_role !== 'candidate_detection_only_not_completion_proof')
|
|
53
|
+
blockers.push('static_scan_role');
|
|
54
|
+
if (!Array.isArray(review?.changed_files))
|
|
55
|
+
blockers.push('changed_files_invalid');
|
|
56
|
+
if (!Array.isArray(review?.candidate_findings))
|
|
57
|
+
blockers.push('candidate_findings_invalid');
|
|
58
|
+
if (!Array.isArray(review?.reviewed_candidate_ids))
|
|
59
|
+
blockers.push('reviewed_candidate_ids_invalid');
|
|
60
|
+
if (!Array.isArray(review?.candidate_dispositions))
|
|
61
|
+
blockers.push('candidate_dispositions_invalid');
|
|
62
|
+
if (!Array.isArray(review?.resolved_findings))
|
|
63
|
+
blockers.push('resolved_findings_invalid');
|
|
64
|
+
if (!Array.isArray(review?.unresolved_findings))
|
|
65
|
+
blockers.push('unresolved_findings_invalid');
|
|
66
|
+
else if (review.unresolved_findings.length > 0)
|
|
67
|
+
blockers.push('unresolved_findings');
|
|
68
|
+
if (!Array.isArray(review?.blockers))
|
|
69
|
+
blockers.push('blockers_invalid');
|
|
70
|
+
else if (review.blockers.length > 0)
|
|
71
|
+
blockers.push('blockers');
|
|
72
|
+
for (const id of ENGINEERING_SANITY_CHECK_IDS) {
|
|
73
|
+
const check = review?.checks?.[id];
|
|
74
|
+
const status = String(check?.status || '');
|
|
75
|
+
if (!FINAL_CHECK_STATUSES.has(status)) {
|
|
76
|
+
blockers.push(`checks:${id}:status`);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (!Array.isArray(check?.evidence) || check.evidence.length === 0 || check.evidence.some((item) => typeof item !== 'string' || !item.trim())) {
|
|
80
|
+
blockers.push(`checks:${id}:evidence`);
|
|
81
|
+
}
|
|
82
|
+
if (status === 'not_applicable' && (typeof check?.reason !== 'string' || !check.reason.trim())) {
|
|
83
|
+
blockers.push(`checks:${id}:reason`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { ok: blockers.length === 0, blockers: [...new Set(blockers)] };
|
|
87
|
+
}
|
|
88
|
+
export async function validateEngineeringSanityReviewArtifact(root, missionId, review = {}, opts = {}) {
|
|
89
|
+
const basic = validateEngineeringSanityReview(review);
|
|
90
|
+
const blockers = [...basic.blockers];
|
|
91
|
+
if (review?.code_structure_report !== ENGINEERING_SANITY_CODE_STRUCTURE_REPORT)
|
|
92
|
+
blockers.push('code_structure_report');
|
|
93
|
+
const reportFile = path.join(missionDir(root, missionId), ENGINEERING_SANITY_CODE_STRUCTURE_REPORT);
|
|
94
|
+
const persistedText = await readText(reportFile, '');
|
|
95
|
+
const persisted = persistedText ? await readJson(reportFile, null) : null;
|
|
96
|
+
if (persisted?.schema_version !== 1)
|
|
97
|
+
blockers.push(`${ENGINEERING_SANITY_CODE_STRUCTURE_REPORT}:schema_version`);
|
|
98
|
+
if (String(review?.code_structure_report_sha256 || '') !== `sha256:${sha256(persistedText)}`)
|
|
99
|
+
blockers.push('code_structure_report_sha256');
|
|
100
|
+
const declaredBase = scopeBase(opts.base);
|
|
101
|
+
const persistedBase = scopeBase(persisted?.changed_scope?.base);
|
|
102
|
+
if (declaredBase && persistedBase && declaredBase !== persistedBase) {
|
|
103
|
+
blockers.push(`${ENGINEERING_SANITY_CODE_STRUCTURE_REPORT}:changed_scope_base`);
|
|
104
|
+
}
|
|
105
|
+
const base = declaredBase || persistedBase || 'HEAD';
|
|
106
|
+
const fresh = await scanCodeStructure(root, { changedSince: base, includeOk: true });
|
|
107
|
+
const freshScopeHash = engineeringScopeHash(fresh);
|
|
108
|
+
if (review?.changed_scope_sha256 !== freshScopeHash)
|
|
109
|
+
blockers.push('changed_scope_sha256');
|
|
110
|
+
if (engineeringScopeHash(persisted) !== freshScopeHash)
|
|
111
|
+
blockers.push(`${ENGINEERING_SANITY_CODE_STRUCTURE_REPORT}:stale_changed_scope`);
|
|
112
|
+
const freshChangedFiles = sortedUniqueStrings(fresh?.changed_scope?.source_files);
|
|
113
|
+
if (JSON.stringify(sortedUniqueStrings(review?.changed_files)) !== JSON.stringify(freshChangedFiles))
|
|
114
|
+
blockers.push('changed_files');
|
|
115
|
+
const freshCandidates = engineeringCandidates(fresh);
|
|
116
|
+
const freshCandidateIds = freshCandidates.map((candidate) => candidate.id).sort();
|
|
117
|
+
const persistedCandidateIds = engineeringCandidates(persisted).map((candidate) => candidate.id).sort();
|
|
118
|
+
if (JSON.stringify(persistedCandidateIds) !== JSON.stringify(freshCandidateIds))
|
|
119
|
+
blockers.push(`${ENGINEERING_SANITY_CODE_STRUCTURE_REPORT}:stale_candidates`);
|
|
120
|
+
if (JSON.stringify(sortedUniqueStrings(review?.reviewed_candidate_ids)) !== JSON.stringify(freshCandidateIds))
|
|
121
|
+
blockers.push('reviewed_candidate_ids');
|
|
122
|
+
if (JSON.stringify(candidateFindingIds(review?.candidate_findings)) !== JSON.stringify(freshCandidateIds))
|
|
123
|
+
blockers.push('candidate_findings');
|
|
124
|
+
const dispositions = Array.isArray(review?.candidate_dispositions) ? review.candidate_dispositions : [];
|
|
125
|
+
const dispositionIds = sortedUniqueStrings(dispositions.map((row) => row?.candidate_id));
|
|
126
|
+
if (JSON.stringify(dispositionIds) !== JSON.stringify(freshCandidateIds))
|
|
127
|
+
blockers.push('candidate_dispositions');
|
|
128
|
+
const freshCandidatesById = new Map(freshCandidates.map((candidate) => [candidate.id, candidate]));
|
|
129
|
+
for (const row of dispositions) {
|
|
130
|
+
if (!['resolved', 'false_positive'].includes(String(row?.status || '')))
|
|
131
|
+
blockers.push('candidate_dispositions:status');
|
|
132
|
+
if (typeof row?.reason !== 'string' || !row.reason.trim())
|
|
133
|
+
blockers.push('candidate_dispositions:reason');
|
|
134
|
+
if (!Array.isArray(row?.evidence) || row.evidence.length === 0 || row.evidence.some((item) => typeof item !== 'string' || !item.trim()))
|
|
135
|
+
blockers.push('candidate_dispositions:evidence');
|
|
136
|
+
const candidate = freshCandidatesById.get(String(row?.candidate_id || ''));
|
|
137
|
+
if (!candidate || String(row?.source_scope || '') !== String(candidate?.source_scope || ''))
|
|
138
|
+
blockers.push('candidate_dispositions:source_scope');
|
|
139
|
+
if (JSON.stringify(normalizeLineRanges(row?.added_hunk_line_ranges)) !== JSON.stringify(normalizeLineRanges(candidate?.added_hunk_line_ranges))) {
|
|
140
|
+
blockers.push('candidate_dispositions:added_hunk_line_ranges');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return { ok: blockers.length === 0, blockers: [...new Set(blockers)], report: fresh };
|
|
144
|
+
}
|
|
145
|
+
export function engineeringScopeHash(report = {}) {
|
|
146
|
+
const scope = report?.changed_scope || {};
|
|
147
|
+
return `sha256:${sha256(JSON.stringify({
|
|
148
|
+
mode: scope.mode || null,
|
|
149
|
+
base: scope.base || null,
|
|
150
|
+
changed_files: sortedUniqueStrings(scope.changed_files),
|
|
151
|
+
source_files: sortedUniqueStrings(scope.source_files),
|
|
152
|
+
entries: Array.isArray(scope.entries)
|
|
153
|
+
? scope.entries
|
|
154
|
+
.map((entry) => ({
|
|
155
|
+
path: String(entry?.path || ''),
|
|
156
|
+
status: String(entry?.status || ''),
|
|
157
|
+
lines_added: Number(entry?.lines_added || 0),
|
|
158
|
+
lines_deleted: Number(entry?.lines_deleted || 0),
|
|
159
|
+
source_sha256: typeof entry?.source_sha256 === 'string' ? entry.source_sha256 : null
|
|
160
|
+
}))
|
|
161
|
+
.sort((left, right) => left.path.localeCompare(right.path))
|
|
162
|
+
: []
|
|
163
|
+
}))}`;
|
|
164
|
+
}
|
|
165
|
+
function scopeBase(value) {
|
|
166
|
+
const text = String(value ?? '').trim();
|
|
167
|
+
return text || '';
|
|
168
|
+
}
|
|
169
|
+
function engineeringCandidates(report = {}) {
|
|
170
|
+
const tags = new Set(['solid', 'n-plus-one', 'unbounded-loop', 'verification-bypass', 'db-pool', 'transaction']);
|
|
171
|
+
return (Array.isArray(report?.semantic_review?.findings) ? report.semantic_review.findings : [])
|
|
172
|
+
.filter((finding) => tags.has(String(finding?.tag || '')) && typeof finding?.id === 'string' && finding.id)
|
|
173
|
+
.sort((left, right) => left.id.localeCompare(right.id));
|
|
174
|
+
}
|
|
175
|
+
function candidateFindingIds(value) {
|
|
176
|
+
return sortedUniqueStrings(Array.isArray(value) ? value.map((row) => row?.id || row?.candidate_id) : []);
|
|
177
|
+
}
|
|
178
|
+
function sortedUniqueStrings(value) {
|
|
179
|
+
return [...new Set(Array.isArray(value) ? value.map((item) => String(item || '').trim()).filter(Boolean) : [])].sort();
|
|
180
|
+
}
|
|
181
|
+
function normalizeLineRanges(value) {
|
|
182
|
+
return (Array.isArray(value) ? value : [])
|
|
183
|
+
.map((row) => ({ start: Number(row?.start || 0), end: Number(row?.end || 0) }))
|
|
184
|
+
.filter((row) => Number.isInteger(row.start) && Number.isInteger(row.end) && row.start > 0 && row.end >= row.start)
|
|
185
|
+
.sort((left, right) => left.start - right.start || left.end - right.end);
|
|
186
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { nowIso, randomId } from '../fsx.js';
|
|
2
|
+
import { asRecordOrEmpty as asRecord } from '../json/records.js';
|
|
2
3
|
export const EVIDENCE_SCHEMA = 'sks.evidence.v1';
|
|
3
4
|
export const EVIDENCE_INDEX_SCHEMA = 'sks.evidence-index.v1';
|
|
4
5
|
export const PROJECT_EVIDENCE_INDEX_SCHEMA = 'sks.project-evidence-index.v1';
|
|
@@ -46,9 +47,6 @@ export const EVIDENCE_TRUST = Object.freeze([
|
|
|
46
47
|
'low',
|
|
47
48
|
'blocked'
|
|
48
49
|
]);
|
|
49
|
-
function asRecord(value) {
|
|
50
|
-
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
51
|
-
}
|
|
52
50
|
function stringOrNull(value) {
|
|
53
51
|
return typeof value === 'string' ? value : null;
|
|
54
52
|
}
|
|
@@ -100,6 +100,7 @@ const FIXTURES = Object.freeze({
|
|
|
100
100
|
}),
|
|
101
101
|
'cli-context7': fixture('real_optional', 'sks context7 check --json', [], 'pass'),
|
|
102
102
|
'cli-super-search': fixture('execute', 'sks super-search doctor --json', [], 'pass'),
|
|
103
|
+
'cli-search': fixture('execute', 'sks search status --json', [], 'pass'),
|
|
103
104
|
'cli-task': fixture('execute', 'sks task instant --plan --json', [], 'pass'),
|
|
104
105
|
'cli-release': fixture('execute', 'sks release affected --json', [], 'blocked', { reason: '18차: the phantom requiredSections schema mismatch (five_lane_review/integration_evidence/session_cleanup, from commit d4526f84 with no producer ever wired up) has been fixed -- missing_sections is now honestly empty. The release-gate DAG still legitimately fails/blocks on other real gates (e.g. release:readiness) independent of this fix, so the command still exits non-zero and this fixture stays honestly blocked rather than claiming full green.' }),
|
|
105
106
|
'cli-triwiki': fixture('execute', 'sks triwiki index --json', [], 'pass'),
|
|
@@ -8,6 +8,7 @@ import { COMMAND_CATALOG, DOLLAR_COMMAND_ALIASES, DOLLAR_COMMANDS, LEGACY_DOLLAR
|
|
|
8
8
|
import { FEATURE_QUALITY_LEVELS, fixtureForFeature, fixtureSummary, validateFeatureFixtures } from './feature-fixtures.js';
|
|
9
9
|
import { runFeatureFixture, writeFeatureFixtureReports } from './feature-fixture-runner.js';
|
|
10
10
|
import { PACKAGE_VERSION, exists, nowIso, packageRoot, readJson, readText, runProcess, writeJsonAtomic, writeTextAtomic } from './fsx.js';
|
|
11
|
+
import { uniqueStrings } from './text/strings.js';
|
|
11
12
|
export const FEATURE_REGISTRY_SCHEMA = 'sks.feature-registry.v1';
|
|
12
13
|
export const FEATURE_INVENTORY_SCHEMA = 'sks.feature-inventory.v1';
|
|
13
14
|
export const ALL_FEATURES_SELFTEST_SCHEMA = 'sks.all-features-selftest.v1';
|
|
@@ -815,9 +816,6 @@ function dedupeFeatureCommandSurface(feature) {
|
|
|
815
816
|
source_refs: sourceRefs
|
|
816
817
|
};
|
|
817
818
|
}
|
|
818
|
-
function uniqueStrings(values) {
|
|
819
|
-
return [...new Set(values.map((value) => String(value || '').trim()).filter(Boolean))];
|
|
820
|
-
}
|
|
821
819
|
function namespaceFeatureDollarReferences(value) {
|
|
822
820
|
if (typeof value === 'string')
|
|
823
821
|
return prefixKnownSksDollarReferences(value, FEATURE_DOLLAR_REFERENCE_NAMES);
|
package/dist/core/fsx.js
CHANGED
|
@@ -85,7 +85,20 @@ export async function readText(p, fallback) {
|
|
|
85
85
|
throw err;
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
|
+
export function assertTestHomeWriteAllowed(p) {
|
|
89
|
+
if (process.env.SKS_TEST_FORBID_REAL_HOME !== '1')
|
|
90
|
+
return;
|
|
91
|
+
const realHome = process.env.SKS_TEST_REAL_HOME;
|
|
92
|
+
if (!realHome)
|
|
93
|
+
return;
|
|
94
|
+
const forbidden = path.join(path.resolve(realHome), '.codex');
|
|
95
|
+
const target = path.resolve(p);
|
|
96
|
+
if (target === forbidden || target.startsWith(`${forbidden}${path.sep}`)) {
|
|
97
|
+
throw new Error(`sks_test_forbid_real_home_write: refusing to write ${target} while SKS_TEST_FORBID_REAL_HOME=1`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
88
100
|
export async function writeTextAtomic(p, text, opts = {}) {
|
|
101
|
+
assertTestHomeWriteAllowed(p);
|
|
89
102
|
await ensureDir(path.dirname(p));
|
|
90
103
|
try {
|
|
91
104
|
if ((await fsp.readFile(p, 'utf8')) === text) {
|
|
@@ -8,6 +8,7 @@ import { listSharedFiles } from './git-status.js';
|
|
|
8
8
|
import { ensureGitPolicy, ensureSharedMemoryDirs, readGitPolicy } from './git-policy.js';
|
|
9
9
|
import { isMockPositiveSharedClaim, redactSharedRecord, sharedRecordHasSecret } from './shared-memory-security.js';
|
|
10
10
|
import { validateGitPolicy, validateSharedMemoryManifest, validateSharedRecordFile } from './validators.js';
|
|
11
|
+
import { asRecordOrEmpty as asRecord } from '../json/records.js';
|
|
11
12
|
export async function publishSharedMemory(root, opts = {}) {
|
|
12
13
|
const target = opts.target || 'all';
|
|
13
14
|
const policy = await ensureGitPolicy(root, { write: true });
|
|
@@ -365,6 +366,3 @@ async function latestMissionId(root) {
|
|
|
365
366
|
}
|
|
366
367
|
return entries.filter((name) => name.startsWith('M-')).sort().at(-1) || null;
|
|
367
368
|
}
|
|
368
|
-
function asRecord(value) {
|
|
369
|
-
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
370
|
-
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fsp from 'node:fs/promises';
|
|
2
2
|
import { GIT_POLICY_SCHEMA, SHARED_MEMORY_MANIFEST_SCHEMA } from './git-policy.js';
|
|
3
3
|
import { isMockPositiveSharedClaim, sharedRecordHasSecret } from './shared-memory-security.js';
|
|
4
|
+
import { asRecordOrEmpty as asRecord } from '../json/records.js';
|
|
4
5
|
export function validateGitPolicy(policy) {
|
|
5
6
|
const issues = [];
|
|
6
7
|
const row = asRecord(policy);
|
|
@@ -56,6 +57,3 @@ export async function validateSharedRecordFile(file, policy) {
|
|
|
56
57
|
return { ok: false, checked: 1, issues: [`invalid_json:${err instanceof Error ? err.message : String(err)}`] };
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
|
-
function asRecord(value) {
|
|
60
|
-
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
61
|
-
}
|