sneakoscope 4.8.6 → 5.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 +51 -726
- package/bench/tasks/t01-off-by-one/repo/package.json +9 -0
- package/bench/tasks/t01-off-by-one/repo/src/pagination.js +5 -0
- package/bench/tasks/t01-off-by-one/repo/test.js +5 -0
- package/bench/tasks/t01-off-by-one/task.json +13 -0
- package/bench/tasks/t02-signature-cochange/repo/package.json +9 -0
- package/bench/tasks/t02-signature-cochange/repo/src/admin.js +5 -0
- package/bench/tasks/t02-signature-cochange/repo/src/audit.js +5 -0
- package/bench/tasks/t02-signature-cochange/repo/src/labels.js +3 -0
- package/bench/tasks/t02-signature-cochange/repo/src/profile.js +5 -0
- package/bench/tasks/t02-signature-cochange/repo/test.js +9 -0
- package/bench/tasks/t02-signature-cochange/task.json +12 -0
- package/bench/tasks/t03-type-puzzle/repo/package.json +9 -0
- package/bench/tasks/t03-type-puzzle/repo/src/config.js +4 -0
- package/bench/tasks/t03-type-puzzle/repo/test.js +6 -0
- package/bench/tasks/t03-type-puzzle/task.json +13 -0
- package/bench/tasks/t04-refactor-preserve/repo/package.json +9 -0
- package/bench/tasks/t04-refactor-preserve/repo/src/cart.js +8 -0
- package/bench/tasks/t04-refactor-preserve/repo/test.js +4 -0
- package/bench/tasks/t04-refactor-preserve/task.json +12 -0
- package/bench/tasks/t05-performance/repo/package.json +9 -0
- package/bench/tasks/t05-performance/repo/src/pairs.js +9 -0
- package/bench/tasks/t05-performance/repo/test.js +11 -0
- package/bench/tasks/t05-performance/task.json +12 -0
- package/bench/tasks/t06-mistake-rule/repo/package.json +9 -0
- package/bench/tasks/t06-mistake-rule/repo/src/loader.js +6 -0
- package/bench/tasks/t06-mistake-rule/repo/test.js +7 -0
- package/bench/tasks/t06-mistake-rule/task.json +12 -0
- package/config/bench-baseline.json +7 -0
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/crates/sks-core/src/main.rs +1 -1
- package/dist/bin/install.js +35 -0
- package/dist/bin/sks.js +1 -1
- package/dist/cli/cli-theme.js +51 -0
- package/dist/cli/command-registry.js +75 -42
- package/dist/cli/help-fast.js +18 -8
- package/dist/cli/insane-search-command.js +36 -8
- package/dist/cli/install-helpers.js +147 -47
- package/dist/cli/router.js +58 -2
- package/dist/commands/codex-lb.js +6 -4
- package/dist/commands/doctor.js +146 -8
- package/dist/commands/proof.js +6 -3
- package/dist/commands/zellij-monitor-pane.js +25 -0
- package/dist/commands/zellij-slot-pane.js +39 -2
- package/dist/commands/zellij-viewport-pane.js +56 -0
- package/dist/commands/zellij.js +55 -2
- package/dist/config/skills-manifest.json +493 -0
- package/dist/core/agents/agent-conflict-graph.js +5 -0
- package/dist/core/agents/agent-lease.js +5 -0
- package/dist/core/agents/agent-ledger-schemas.js +1 -0
- package/dist/core/agents/agent-lifecycle.js +86 -35
- package/dist/core/agents/agent-orchestrator.js +287 -72
- package/dist/core/agents/agent-output-validator.js +14 -3
- package/dist/core/agents/agent-patch-queue-store.js +108 -4
- package/dist/core/agents/agent-patch-queue.js +10 -3
- package/dist/core/agents/agent-patch-schema.js +13 -0
- package/dist/core/agents/agent-proof-evidence.js +6 -1
- package/dist/core/agents/agent-runner-fake.js +40 -0
- package/dist/core/agents/agent-scheduler.js +2 -3
- package/dist/core/agents/agent-worker-pipeline.js +36 -2
- package/dist/core/agents/codex-exec-worker-adapter.js +2 -0
- package/dist/core/agents/native-cli-session-swarm.js +30 -13
- package/dist/core/agents/native-cli-worker.js +2 -1
- package/dist/core/agents/native-worker-backend-router.js +58 -1
- package/dist/core/auto-review.js +25 -4
- package/dist/core/codex/agent-config-file-repair.js +15 -2
- package/dist/core/codex/codex-config-eperm-repair.js +8 -2
- package/dist/core/codex/codex-config-guard.js +289 -0
- package/dist/core/codex/codex-config-toml.js +122 -0
- package/dist/core/codex/codex-project-config-policy.js +59 -7
- package/dist/core/codex-app/sks-menubar.js +780 -122
- package/dist/core/codex-app.js +1 -0
- package/dist/core/codex-control/codex-fake-sdk-adapter.js +6 -4
- package/dist/core/codex-control/codex-sdk-config-policy.js +2 -1
- package/dist/core/codex-control/codex-sdk-env-policy.js +1 -1
- package/dist/core/codex-control/codex-task-runner.js +32 -14
- package/dist/core/codex-control/python-codex-sdk-adapter.js +4 -1
- package/dist/core/codex-control/schemas/agent-worker-result.schema.js +12 -3
- package/dist/core/codex-hooks/codex-hook-managed-install.js +5 -0
- package/dist/core/codex-hooks/codex-hook-state-writer.js +70 -11
- package/dist/core/codex-hooks/codex-hook-trust-doctor.js +2 -2
- package/dist/core/codex-lb/codex-lb-env.js +20 -1
- package/dist/core/codex-lb/codex-lb-setup.js +2 -5
- package/dist/core/codex-native/skill-registry-ledger.js +24 -5
- package/dist/core/commands/basic-cli.js +21 -2
- package/dist/core/commands/check-command.js +37 -5
- package/dist/core/commands/command-utils.js +22 -2
- package/dist/core/commands/computer-use-command.js +62 -7
- package/dist/core/commands/db-command.js +31 -5
- package/dist/core/commands/fast-mode-command.js +39 -11
- package/dist/core/commands/gate-result-contract.js +43 -0
- package/dist/core/commands/gates-command.js +6 -1
- package/dist/core/commands/gc-command.js +29 -2
- package/dist/core/commands/goal-command.js +9 -2
- package/dist/core/commands/gx-command.js +79 -7
- package/dist/core/commands/image-ux-review-command.js +188 -13
- package/dist/core/commands/mad-db-command.js +85 -176
- package/dist/core/commands/mad-sks-command.js +248 -34
- package/dist/core/commands/menubar-command.js +146 -0
- package/dist/core/commands/naruto-command.js +64 -10
- package/dist/core/commands/pipeline-command.js +21 -2
- package/dist/core/commands/plan-command.js +76 -0
- package/dist/core/commands/ppt-command.js +159 -24
- package/dist/core/commands/qa-loop-command.js +6 -2
- package/dist/core/commands/release-command.js +55 -2
- package/dist/core/commands/research-command.js +1 -1
- package/dist/core/commands/review-command.js +217 -0
- package/dist/core/commands/route-command.js +62 -0
- package/dist/core/commands/route-success-helpers.js +59 -0
- package/dist/core/commands/run-command.js +19 -7
- package/dist/core/commands/seo-command.js +49 -1
- package/dist/core/commands/status-command.js +21 -1
- package/dist/core/commands/team-legacy-observe-command.js +221 -3
- package/dist/core/commands/ui-command.js +161 -0
- package/dist/core/commands/uninstall-command.js +312 -0
- package/dist/core/db-safety.js +7 -3
- package/dist/core/doctor/codex-startup-config-repair.js +14 -3
- package/dist/core/doctor/confirm-repair.js +27 -0
- package/dist/core/doctor/context7-mcp-repair.js +35 -7
- package/dist/core/doctor/doctor-codex-startup-repair.js +10 -3
- package/dist/core/doctor/doctor-context7-repair.js +17 -4
- package/dist/core/doctor/doctor-dirty-planner.js +27 -9
- package/dist/core/doctor/doctor-native-capability-repair.js +12 -2
- package/dist/core/doctor/doctor-readiness-matrix.js +27 -2
- package/dist/core/doctor/doctor-repair-postcheck.js +4 -0
- package/dist/core/doctor/doctor-transaction.js +21 -5
- package/dist/core/doctor/doctor-zellij-repair.js +1 -0
- package/dist/core/doctor/imagegen-repair.js +161 -0
- package/dist/core/doctor/supabase-mcp-repair.js +23 -5
- package/dist/core/feature-fixture-runner.js +2 -2
- package/dist/core/feature-fixtures.js +65 -37
- package/dist/core/feature-registry.js +106 -3
- package/dist/core/fsx.js +91 -2
- package/dist/core/hooks-runtime/skill-reconcile-preflight.js +43 -0
- package/dist/core/hooks-runtime.js +86 -46
- package/dist/core/image-ux-review/imagegen-adapter.js +48 -11
- package/dist/core/image-ux-review.js +16 -0
- package/dist/core/imagegen/imagegen-capability.js +11 -5
- package/dist/core/imagegen/require-imagegen.js +57 -0
- package/dist/core/init/skills.js +271 -14
- package/dist/core/init.js +13 -10
- package/dist/core/mad-db/mad-db-coordinator.js +96 -20
- package/dist/core/mad-db/mad-db-policy.js +12 -10
- package/dist/core/mad-sks/executors/executor-base.js +8 -2
- package/dist/core/mad-sks/executors/index.js +4 -0
- package/dist/core/mad-sks/executors/sql-plane-executor.js +194 -0
- package/dist/core/mission.js +138 -5
- package/dist/core/naruto/naruto-active-pool.js +84 -30
- package/dist/core/naruto/naruto-backpressure.js +5 -1
- package/dist/core/naruto/naruto-real-worker-child.js +10 -0
- package/dist/core/naruto/naruto-real-worker-runtime.js +9 -7
- package/dist/core/naruto/naruto-role-policy.js +3 -0
- package/dist/core/naruto/naruto-task-hints.js +10 -0
- package/dist/core/naruto/naruto-work-graph.js +8 -2
- package/dist/core/naruto/naruto-work-item.js +6 -0
- package/dist/core/naruto/resource-pressure-monitor.js +33 -15
- package/dist/core/naruto/solution-tournament.js +101 -0
- package/dist/core/permission-gates.js +30 -0
- package/dist/core/pipeline-internals/runtime-core.js +72 -222
- package/dist/core/pipeline-internals/runtime-gates.js +140 -24
- package/dist/core/ppt-review/index.js +6 -1
- package/dist/core/ppt-review/slide-imagegen-review.js +75 -10
- package/dist/core/ppt.js +70 -2
- package/dist/core/proof/auto-finalize.js +70 -11
- package/dist/core/proof/proof-schema.js +2 -0
- package/dist/core/proof/route-adapter.js +5 -1
- package/dist/core/proof/route-finalizer.js +8 -5
- package/dist/core/proof/selftest-proof-fixtures.js +18 -5
- package/dist/core/proof/validation.js +2 -0
- package/dist/core/provider/model-router.js +53 -0
- package/dist/core/questions.js +1 -1
- package/dist/core/recallpulse.js +1 -1
- package/dist/core/release/gate-manifest.js +2 -2
- package/dist/core/release/release-gate-affected-selector.js +3 -10
- package/dist/core/release/release-gate-batch-runner.js +4 -2
- package/dist/core/release/release-gate-cache-v2.js +27 -14
- package/dist/core/release/release-gate-dag.js +6 -1
- package/dist/core/release/release-gate-hermetic-env.js +10 -0
- package/dist/core/release/release-gate-node.js +3 -0
- package/dist/core/release/release-gate-resource-governor.js +1 -0
- package/dist/core/retention.js +89 -4
- package/dist/core/routes/constants.js +1 -1
- package/dist/core/routes/diagnostic-allowlist.js +55 -0
- package/dist/core/routes.js +83 -33
- package/dist/core/safety/mutation-guard.js +5 -1
- package/dist/core/skill-forge.js +9 -4
- package/dist/core/stop-gate/gate-evaluator.js +102 -0
- package/dist/core/stop-gate/stop-gate-check.js +26 -4
- package/dist/core/stop-gate/stop-gate-resolver.js +19 -3
- package/dist/core/stop-gate/stop-gate-writer.js +20 -1
- package/dist/core/team-dag.js +12 -465
- package/dist/core/team-dashboard-renderer.js +13 -94
- package/dist/core/team-live.js +68 -804
- package/dist/core/triwiki/agents-md-projector.js +184 -0
- package/dist/core/triwiki-wrongness/wrongness-schema.js +3 -1
- package/dist/core/trust-kernel/trust-kernel-schema.js +1 -0
- package/dist/core/trust-kernel/trust-report.js +1 -1
- package/dist/core/trust-kernel/trust-status.js +2 -0
- package/dist/core/ui/dashboard-html.js +111 -0
- package/dist/core/update/update-migration-state.js +383 -42
- package/dist/core/update-check.js +201 -78
- package/dist/core/verification/diff-quality.js +100 -0
- package/dist/core/verification/impact-scan.js +164 -0
- package/dist/core/verification/machine-feedback.js +146 -0
- package/dist/core/verification/mistake-rule-compiler.js +195 -0
- package/dist/core/version.js +1 -1
- package/dist/core/zellij/zellij-layout-builder.js +44 -16
- package/dist/core/zellij/zellij-monitor-renderer.js +53 -0
- package/dist/core/zellij/zellij-self-heal.js +27 -32
- package/dist/core/zellij/zellij-slot-pane-renderer.js +162 -153
- package/dist/core/zellij/zellij-slot-telemetry.js +2 -0
- package/dist/core/zellij/zellij-theme.js +67 -0
- package/dist/core/zellij/zellij-ui-mode.js +16 -0
- package/dist/core/zellij/zellij-viewport-binder.js +59 -0
- package/dist/core/zellij/zellij-worker-pane-manager.js +53 -5
- package/dist/scripts/agent-patch-swarm-gate-lib.js +2 -2
- package/dist/scripts/build-dist.js +8 -0
- package/dist/scripts/check-feature-quality.js +2 -2
- package/dist/scripts/cli-output-consistency-check.js +57 -0
- package/dist/scripts/codex-lb-fast-ui-preservation-check.js +106 -0
- package/dist/scripts/codex-lb-gpt55-fast-profile-check.js +105 -0
- package/dist/scripts/codex-lb-missing-env-regression.js +2 -3
- package/dist/scripts/codex-project-config-policy-merge-regression.js +3 -3
- package/dist/scripts/coding-bench-check.js +136 -0
- package/dist/scripts/concurrent-session-collision-check.js +67 -0
- package/dist/scripts/docs-truthfulness-check.js +1 -1
- package/dist/scripts/doctor-imagegen-repair-check.js +62 -0
- package/dist/scripts/ensure-bin-executable.js +11 -3
- package/dist/scripts/gate-policy-audit-check.js +130 -0
- package/dist/scripts/harness-benchmark-check.js +104 -0
- package/dist/scripts/hook-latency-budget-check.js +45 -0
- package/dist/scripts/legacy-update-e2e-check.js +228 -0
- package/dist/scripts/lib/codex-sdk-gate-lib.js +2 -2
- package/dist/scripts/lib/real-codex-parallel-gate.js +2 -2
- package/dist/scripts/loop-directive-check-lib.js +1 -1
- package/dist/scripts/mad-db-command-check.js +11 -8
- package/dist/scripts/mad-db-real-supabase-e2e.js +2 -2
- package/dist/scripts/mad-db-route-identity-check.js +8 -6
- package/dist/scripts/mad-db-safety-conflict-matrix-check.js +31 -8
- package/dist/scripts/mad-db-skill-policy-snapshot-check.js +4 -5
- package/dist/scripts/mad-sks-zellij-default-pane-worker-check.js +3 -2
- package/dist/scripts/mad-sks-zellij-launch-check.js +1 -1
- package/dist/scripts/naruto-zellij-dynamic-right-column-check.js +7 -7
- package/dist/scripts/parallel-claim-enforcement-check.js +14 -5
- package/dist/scripts/ppt-real-imagegen-wiring-check.js +5 -1
- package/dist/scripts/project-skill-dedupe-check.js +23 -5
- package/dist/scripts/proof-root-cause-policy-check.js +2 -0
- package/dist/scripts/release-affected-selector-check.js +2 -2
- package/dist/scripts/release-cache-glob-hashing-check.js +1 -0
- package/dist/scripts/release-dag-full-coverage-check.js +13 -4
- package/dist/scripts/release-gate-dag-runner-check.js +10 -2
- package/dist/scripts/release-gate-dag-runner.js +22 -0
- package/dist/scripts/release-gate-existence-audit.js +2 -1
- package/dist/scripts/release-gate-planner.js +2 -1
- package/dist/scripts/release-gate-script-parity-check.js +1 -1
- package/dist/scripts/release-metadata-1-19-check.js +2 -1
- package/dist/scripts/release-readiness-report.js +38 -7
- package/dist/scripts/release-stability-report-check.js +12 -8
- package/dist/scripts/search-visibility-gate-lib.js +2 -2
- package/dist/scripts/seo-geo-feature-fixture-quality-check.js +1 -1
- package/dist/scripts/skills-manifest-continuity-check.js +46 -0
- package/dist/scripts/sks-1-11-gate-lib.js +8 -6
- package/dist/scripts/sks-menubar-install-check.js +87 -21
- package/dist/scripts/sks-uninstall-regression-check.js +54 -0
- package/dist/scripts/uninstall-inventory-check.js +3 -0
- package/dist/scripts/ux-review-real-loop-fixture-check.js +9 -4
- package/dist/scripts/ux-review-run-wires-imagegen-check.js +4 -0
- package/dist/scripts/zellij-layout-valid-check.js +18 -11
- package/dist/scripts/zellij-right-column-geometry-proof.js +2 -4
- package/dist/scripts/zellij-slot-pane-renderer-check.js +9 -9
- package/dist/scripts/zellij-slot-pane-stale-detection-check.js +3 -4
- package/dist/scripts/zellij-slot-pane-telemetry-renderer-check.js +3 -2
- package/dist/scripts/zellij-slot-telemetry-renderer-check.js +4 -2
- package/dist/scripts/zellij-spawn-on-demand-layout-check.js +8 -2
- package/dist/scripts/zellij-viewport-binder-check.js +9 -0
- package/docs/assets/sneakoscope-architecture-pipeline.jpg +0 -0
- package/docs/demo.tape +28 -0
- package/package.json +70 -3
- package/schemas/codex/completion-proof.schema.json +3 -2
- package/schemas/release/release-gate-node.schema.json +2 -1
- package/dist/scripts/agent-backfill-route-blackbox.js +0 -5
- package/dist/scripts/agent-dynamic-pool-route-blackbox.js +0 -5
- package/dist/scripts/agent-parallel-write-blackbox.js +0 -56
- package/dist/scripts/agent-patch-swarm-route-blackbox.js +0 -10
- package/dist/scripts/agent-route-blackbox-lib.js +0 -132
- package/dist/scripts/blackbox-command-import-smoke.js +0 -143
- package/dist/scripts/blackbox-global-shim.js +0 -77
- package/dist/scripts/blackbox-matrix.js +0 -70
- package/dist/scripts/blackbox-npx-one-shot.js +0 -69
- package/dist/scripts/blackbox-pack-install.js +0 -174
- package/dist/scripts/brand-neutrality-zero-leakage-blackbox.js +0 -4
- package/dist/scripts/build-once-runner-blackbox.js +0 -34
- package/dist/scripts/codex-0140-integration-blackbox.js +0 -13
- package/dist/scripts/codex-agent-type-blackbox.js +0 -4
- package/dist/scripts/codex-app-harness-blackbox.js +0 -4
- package/dist/scripts/codex-app-skill-agent-blackbox.js +0 -4
- package/dist/scripts/codex-hook-approval-blackbox.js +0 -4
- package/dist/scripts/codex-init-deep-directory-local-blackbox.js +0 -4
- package/dist/scripts/codex-native-feature-broker-blackbox.js +0 -4
- package/dist/scripts/codex-native-pattern-analysis-blackbox.js +0 -4
- package/dist/scripts/codex-native-read-repair-split-blackbox.js +0 -55
- package/dist/scripts/codex-native-reference-cache-blackbox.js +0 -41
- package/dist/scripts/core-skill-integrity-blackbox.js +0 -33
- package/dist/scripts/dfix-fast-blackbox-check.js +0 -37
- package/dist/scripts/dfix-parallel-write-blackbox.js +0 -48
- package/dist/scripts/dfix-patch-swarm-route-blackbox.js +0 -10
- package/dist/scripts/doctor-context7-mcp-repair-blackbox.js +0 -16
- package/dist/scripts/doctor-dirty-repair-blackbox.js +0 -22
- package/dist/scripts/doctor-dirty-semantic-blackbox.js +0 -8
- package/dist/scripts/doctor-fix-production-blackbox.js +0 -26
- package/dist/scripts/doctor-native-capability-repair-blackbox.js +0 -39
- package/dist/scripts/doctor-startup-config-repair-blackbox.js +0 -13
- package/dist/scripts/doctor-supabase-mcp-repair-blackbox.js +0 -14
- package/dist/scripts/doctor-transaction-engine-blackbox.js +0 -28
- package/dist/scripts/doctor-zellij-fix-blackbox.js +0 -4
- package/dist/scripts/doctor-zellij-no-homebrew-blackbox.js +0 -4
- package/dist/scripts/doctor-zellij-upgrade-blackbox.js +0 -4
- package/dist/scripts/gate-pack-runner-blackbox.js +0 -27
- package/dist/scripts/gate-pack-v2-blackbox.js +0 -18
- package/dist/scripts/geo-cli-blackbox-check.js +0 -18
- package/dist/scripts/loop-collision-blackbox.js +0 -3
- package/dist/scripts/loop-concurrency-oversubscription-blackbox.js +0 -3
- package/dist/scripts/loop-fixture-production-misuse-blackbox.js +0 -3
- package/dist/scripts/loop-kill-interrupt-real-blackbox.js +0 -3
- package/dist/scripts/loop-merge-strategy-blackbox.js +0 -3
- package/dist/scripts/loop-mesh-production-e2e-blackbox.js +0 -3
- package/dist/scripts/loop-side-effect-blackbox.js +0 -3
- package/dist/scripts/mad-db-operation-lifecycle-blackbox.js +0 -29
- package/dist/scripts/mad-sks-actual-executor-blackbox.js +0 -5
- package/dist/scripts/mad-zellij-headless-fallback-blackbox.js +0 -4
- package/dist/scripts/mad-zellij-self-heal-blackbox.js +0 -4
- package/dist/scripts/naruto-loop-mesh-blackbox.js +0 -3
- package/dist/scripts/naruto-real-parallelism-blackbox.js +0 -307
- package/dist/scripts/naruto-worktree-coding-blackbox.js +0 -29
- package/dist/scripts/parallel-runtime-real-blackbox.js +0 -44
- package/dist/scripts/pipeline-codex-native-doctor-mad-routing-real-blackbox.js +0 -77
- package/dist/scripts/pipeline-codex-native-e2e-blackbox.js +0 -13
- package/dist/scripts/pipeline-codex-native-image-routing-real-blackbox.js +0 -50
- package/dist/scripts/pipeline-codex-native-loop-routing-real-blackbox.js +0 -74
- package/dist/scripts/pipeline-codex-native-qa-routing-real-blackbox.js +0 -51
- package/dist/scripts/pipeline-codex-native-research-routing-real-blackbox.js +0 -45
- package/dist/scripts/pipeline-execution-profile-routing-blackbox.js +0 -4
- package/dist/scripts/postinstall-global-doctor-blackbox.js +0 -12
- package/dist/scripts/ppt-full-e2e-blackbox-check.js +0 -109
- package/dist/scripts/ppt-imagegen-blackbox-check.js +0 -46
- package/dist/scripts/project-skill-dedupe-blackbox.js +0 -36
- package/dist/scripts/qa-backfill-route-blackbox.js +0 -5
- package/dist/scripts/qa-patch-swarm-route-blackbox.js +0 -10
- package/dist/scripts/release-full-parallelism-blackbox.js +0 -41
- package/dist/scripts/release-triwiki-first-runner-blackbox.js +0 -48
- package/dist/scripts/release-wiring-3110-blackbox.js +0 -27
- package/dist/scripts/release-wiring-3112-blackbox.js +0 -17
- package/dist/scripts/release-wiring-3113-blackbox.js +0 -17
- package/dist/scripts/research-backfill-route-blackbox.js +0 -5
- package/dist/scripts/research-final-reviewer-blackbox.js +0 -70
- package/dist/scripts/research-stage-cycle-runtime-blackbox.js +0 -40
- package/dist/scripts/research-synthesis-writer-blackbox.js +0 -24
- package/dist/scripts/route-blackbox-realism-check.js +0 -21
- package/dist/scripts/scheduler-resource-claim-blackbox.js +0 -24
- package/dist/scripts/seo-cli-blackbox-check.js +0 -18
- package/dist/scripts/sks-3110-all-feature-regression-blackbox.js +0 -116
- package/dist/scripts/sks-3112-all-feature-regression-blackbox.js +0 -29
- package/dist/scripts/sks-3113-all-feature-regression-blackbox.js +0 -17
- package/dist/scripts/sks-400-all-feature-regression-blackbox.js +0 -21
- package/dist/scripts/sks-400-extreme-parallel-blackbox.js +0 -8
- package/dist/scripts/sks-400-five-minute-blackbox.js +0 -9
- package/dist/scripts/sks-400-legacy-purge-blackbox.js +0 -8
- package/dist/scripts/sks-401-all-feature-regression-blackbox.js +0 -46
- package/dist/scripts/sks-401-five-minute-actual-blackbox.js +0 -23
- package/dist/scripts/sks-402-all-feature-regression-blackbox.js +0 -9
- package/dist/scripts/sks-402-five-minute-real-blackbox.js +0 -22
- package/dist/scripts/sksd-warm-cache-blackbox.js +0 -12
- package/dist/scripts/supabase-secret-preservation-blackbox.js +0 -29
- package/dist/scripts/team-backfill-route-blackbox.js +0 -5
- package/dist/scripts/team-parallel-write-blackbox.js +0 -55
- package/dist/scripts/team-patch-swarm-route-blackbox.js +0 -10
- package/dist/scripts/triwiki-affected-graph-blackbox.js +0 -28
- package/dist/scripts/triwiki-proof-bank-blackbox.js +0 -30
- package/dist/scripts/triwiki-proof-bank-lock-blackbox.js +0 -7
- package/dist/scripts/update-preserves-supabase-keys-blackbox.js +0 -27
- package/dist/scripts/ux-patch-swarm-route-blackbox.js +0 -10
- package/dist/scripts/ux-review-imagegen-blackbox-check.js +0 -67
- package/dist/scripts/zellij-initial-main-only-blackbox.js +0 -28
- package/dist/scripts/zellij-pane-lock-concurrency-blackbox.js +0 -80
- package/dist/scripts/zellij-pane-lock-open-worker-integration-blackbox.js +0 -137
- package/dist/scripts/zellij-self-heal-typed-blackbox.js +0 -4
- package/dist/scripts/zellij-slot-telemetry-real-blackbox.js +0 -20
- package/dist/scripts/zellij-stacked-fallback-integration-blackbox.js +0 -81
- package/dist/scripts/zellij-worker-pane-real-ui-blackbox.js +0 -202
|
@@ -1,16 +1,30 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
+
import { PACKAGE_VERSION } from '../core/fsx.js';
|
|
4
5
|
import { installSksMenuBar } from '../core/codex-app/sks-menubar.js';
|
|
5
6
|
const temp = await fs.mkdtemp(path.join(os.tmpdir(), 'sks-menubar-check-'));
|
|
6
7
|
const envHomeTemp = await fs.mkdtemp(path.join(os.tmpdir(), 'sks-menubar-env-home-check-'));
|
|
8
|
+
const fakeRoot = path.join(temp, 'project-root');
|
|
9
|
+
await fs.mkdir(fakeRoot, { recursive: true });
|
|
7
10
|
const launchGuardEnv = { ...process.env, SKS_SKIP_SKS_MENUBAR_LAUNCH: '0' };
|
|
11
|
+
const localEntry = path.join(fakeRoot, 'dist', 'bin', 'sks.js');
|
|
12
|
+
await fs.mkdir(path.dirname(localEntry), { recursive: true });
|
|
13
|
+
await fs.writeFile(localEntry, '#!/usr/bin/env node\n', 'utf8');
|
|
8
14
|
const result = await installSksMenuBar({
|
|
9
15
|
apply: true,
|
|
10
16
|
launch: true,
|
|
11
17
|
home: temp,
|
|
12
|
-
root:
|
|
13
|
-
sksEntry:
|
|
18
|
+
root: fakeRoot,
|
|
19
|
+
sksEntry: localEntry,
|
|
20
|
+
env: launchGuardEnv
|
|
21
|
+
});
|
|
22
|
+
const secondResult = await installSksMenuBar({
|
|
23
|
+
apply: true,
|
|
24
|
+
launch: true,
|
|
25
|
+
home: temp,
|
|
26
|
+
root: fakeRoot,
|
|
27
|
+
sksEntry: localEntry,
|
|
14
28
|
env: launchGuardEnv
|
|
15
29
|
});
|
|
16
30
|
const envHomeResult = await installSksMenuBar({
|
|
@@ -23,25 +37,56 @@ const envHomeResult = await installSksMenuBar({
|
|
|
23
37
|
const executableExists = result.executable_path ? await exists(result.executable_path) : false;
|
|
24
38
|
const launchAgentExists = result.launch_agent_path ? await exists(result.launch_agent_path) : false;
|
|
25
39
|
const actionScriptExists = result.action_script_path ? await exists(result.action_script_path) : false;
|
|
40
|
+
const buildStampExists = result.build_stamp_path ? await exists(result.build_stamp_path) : false;
|
|
26
41
|
const generatedSourcePath = result.app_path ? path.join(path.dirname(result.app_path), 'SKSMenuBar.swift') : null;
|
|
27
42
|
const generatedSource = generatedSourcePath ? await fs.readFile(generatedSourcePath, 'utf8').catch(() => '') : '';
|
|
43
|
+
const actionScript = result.action_script_path ? await fs.readFile(result.action_script_path, 'utf8').catch(() => '') : '';
|
|
28
44
|
const launchAgentSource = result.launch_agent_path ? await fs.readFile(result.launch_agent_path, 'utf8').catch(() => '') : '';
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
45
|
+
const infoPlistPath = result.app_path ? path.join(result.app_path, 'Contents', 'Info.plist') : null;
|
|
46
|
+
const infoPlist = infoPlistPath ? await fs.readFile(infoPlistPath, 'utf8').catch(() => '') : '';
|
|
47
|
+
const commandRegistry = await fs.readFile(path.join(process.cwd(), 'src', 'cli', 'command-registry.ts'), 'utf8');
|
|
48
|
+
const installHelpers = await fs.readFile(path.join(process.cwd(), 'src', 'cli', 'install-helpers.ts'), 'utf8');
|
|
49
|
+
const hasVisibleStatusSource = generatedSource.includes('NSStatusItem.variableLength')
|
|
50
|
+
&& generatedSource.includes('configureStatusButton(button, title: state.title)')
|
|
51
|
+
&& generatedSource.includes('SKS ⚠')
|
|
52
|
+
&& generatedSource.includes('SKS ↑')
|
|
53
|
+
&& generatedSource.includes('Timer.scheduledTimer(withTimeInterval: 30.0');
|
|
54
|
+
const hasBackgroundReadonlyActions = generatedSource.includes('runSksBackground(["codex-lb", "fast-check"]')
|
|
55
|
+
&& generatedSource.includes('runSksBackground(["update", "check"]')
|
|
56
|
+
&& generatedSource.includes('display notification')
|
|
57
|
+
&& !generatedSource.includes('@objc func fastCheck() {\n runSksInTerminal');
|
|
58
|
+
const hasTerminalFailureAlert = generatedSource.includes('output.contains("-1743")')
|
|
59
|
+
&& generatedSource.includes('Privacy & Security > Automation');
|
|
60
|
+
const hasTerminalExit = generatedSource.includes('; exit');
|
|
36
61
|
const hasAutosaveNameSource = generatedSource.includes('statusItem.autosaveName = "com.sneakoscope.sks-menubar"');
|
|
37
62
|
const hasExplicitVisibleSource = generatedSource.includes('statusItem.isVisible = true');
|
|
38
|
-
const terminalCommandLine = generatedSource.split(/\r?\n/)
|
|
39
|
-
.find((line) => line.includes('do script') && line.includes('escaped')) || '';
|
|
40
|
-
const hasTerminalCommandInterpolation = terminalCommandLine.includes(String.raw `\(escaped)`)
|
|
41
|
-
&& !terminalCommandLine.includes(String.raw `\"(escaped)\"`);
|
|
42
63
|
const hasNoUnconditionalKeepAlive = !launchAgentSource.includes('<key>KeepAlive</key>');
|
|
64
|
+
const hasNoLaunchAgentSecrets = !launchAgentSource.includes('EnvironmentVariables')
|
|
65
|
+
&& !launchAgentSource.includes('CODEX_LB_API_KEY')
|
|
66
|
+
&& !launchAgentSource.includes('OPENROUTER_API_KEY');
|
|
43
67
|
const hasInteractiveProcessType = launchAgentSource.includes('<key>ProcessType</key>')
|
|
44
68
|
&& launchAgentSource.includes('<string>Interactive</string>');
|
|
69
|
+
const hasPackagePlistVersion = infoPlist.includes(`<string>${PACKAGE_VERSION}</string>`)
|
|
70
|
+
&& infoPlist.includes('<key>CFBundleShortVersionString</key>')
|
|
71
|
+
&& infoPlist.includes('<key>CFBundleVersion</key>');
|
|
72
|
+
const hasActionFallbacks = actionScript.includes('.nvm/versions/node/*/bin/node(Nn[-1])')
|
|
73
|
+
&& actionScript.includes('/bin/zsh -lc')
|
|
74
|
+
&& actionScript.includes('command -v sks');
|
|
75
|
+
const hasEntryWarning = result.warnings.includes('sks_entry_project_local_ignored_global_package_used')
|
|
76
|
+
|| result.warnings.includes('sks_entry_resolved_under_project_root');
|
|
77
|
+
const hasBuildStamp = buildStampExists
|
|
78
|
+
&& result.build_stamp?.package_version === PACKAGE_VERSION
|
|
79
|
+
&& result.build_stamp?.codesign_identifier === 'com.sneakoscope.sks-menubar';
|
|
80
|
+
const isIdempotent = secondResult.actions.includes('menubar_up_to_date')
|
|
81
|
+
&& secondResult.build_stamp?.action_script_sha256 === result.build_stamp?.action_script_sha256;
|
|
82
|
+
const hasCommandRegistry = commandRegistry.includes('menubar:')
|
|
83
|
+
&& commandRegistry.includes('menubarCommand')
|
|
84
|
+
&& commandRegistry.includes('dist/core/commands/menubar-command.js');
|
|
85
|
+
const noLaunchctlSecretSetenv = !installHelpers.includes('{ CODEX_LB_API_KEY: apiKey')
|
|
86
|
+
&& !installHelpers.includes("['setenv', 'CODEX_LB_API_KEY")
|
|
87
|
+
&& !installHelpers.includes("['setenv', 'OPENROUTER_API_KEY");
|
|
88
|
+
const hasLaunchctlUnsetenv = installHelpers.includes('cleanupMacLaunchSecretEnvironment')
|
|
89
|
+
&& installHelpers.includes('skipped_secret_variables');
|
|
45
90
|
const expectedMenuItems = [
|
|
46
91
|
'Use codex-lb',
|
|
47
92
|
'Use ChatGPT OAuth',
|
|
@@ -59,9 +104,6 @@ const launchSkippedForTempHome = result.launch?.requested === false
|
|
|
59
104
|
const launchSkippedForEnvHome = envHomeResult.launch?.requested === false
|
|
60
105
|
&& envHomeResult.launch?.method === 'skipped'
|
|
61
106
|
&& envHomeResult.warnings.includes('launch_skipped_non_user_home');
|
|
62
|
-
// Temp-path guard: a temp-rooted install must never request a launch, even if
|
|
63
|
-
// some caller forgets SKS_SKIP_SKS_MENUBAR_LAUNCH. Both fixtures live under
|
|
64
|
-
// os.tmpdir(), so both results must carry the temp-install skip warning.
|
|
65
107
|
const launchSkippedForTempInstall = result.launch?.requested === false
|
|
66
108
|
&& result.warnings.includes('launch_skipped_temp_install')
|
|
67
109
|
&& envHomeResult.launch?.requested === false
|
|
@@ -71,18 +113,30 @@ const preferredPositionSkippedForTempInstall = !result.actions.includes('seeded
|
|
|
71
113
|
const ok = process.platform === 'darwin'
|
|
72
114
|
? result.ok === true
|
|
73
115
|
&& result.status === 'installed_launch_skipped'
|
|
116
|
+
&& secondResult.ok === true
|
|
74
117
|
&& envHomeResult.ok === true
|
|
75
118
|
&& envHomeResult.status === 'installed_launch_skipped'
|
|
76
119
|
&& executableExists
|
|
77
120
|
&& launchAgentExists
|
|
78
121
|
&& actionScriptExists
|
|
79
122
|
&& hasExpectedItems
|
|
80
|
-
&&
|
|
123
|
+
&& hasVisibleStatusSource
|
|
124
|
+
&& hasBackgroundReadonlyActions
|
|
125
|
+
&& hasTerminalFailureAlert
|
|
126
|
+
&& hasTerminalExit
|
|
81
127
|
&& hasAutosaveNameSource
|
|
82
128
|
&& hasExplicitVisibleSource
|
|
83
|
-
&& hasTerminalCommandInterpolation
|
|
84
129
|
&& hasNoUnconditionalKeepAlive
|
|
130
|
+
&& hasNoLaunchAgentSecrets
|
|
85
131
|
&& hasInteractiveProcessType
|
|
132
|
+
&& hasPackagePlistVersion
|
|
133
|
+
&& hasActionFallbacks
|
|
134
|
+
&& hasEntryWarning
|
|
135
|
+
&& hasBuildStamp
|
|
136
|
+
&& isIdempotent
|
|
137
|
+
&& hasCommandRegistry
|
|
138
|
+
&& noLaunchctlSecretSetenv
|
|
139
|
+
&& hasLaunchctlUnsetenv
|
|
86
140
|
&& launchSkippedForTempHome
|
|
87
141
|
&& launchSkippedForEnvHome
|
|
88
142
|
&& launchSkippedForTempInstall
|
|
@@ -94,18 +148,30 @@ const report = {
|
|
|
94
148
|
temp,
|
|
95
149
|
env_home_temp: envHomeTemp,
|
|
96
150
|
result,
|
|
151
|
+
second_result: secondResult,
|
|
97
152
|
env_home_result: envHomeResult,
|
|
98
153
|
executable_exists: executableExists,
|
|
99
154
|
launch_agent_exists: launchAgentExists,
|
|
100
155
|
action_script_exists: actionScriptExists,
|
|
156
|
+
build_stamp_exists: buildStampExists,
|
|
101
157
|
generated_source_path: generatedSourcePath,
|
|
102
|
-
|
|
103
|
-
|
|
158
|
+
has_visible_status_source: hasVisibleStatusSource,
|
|
159
|
+
has_background_readonly_actions: hasBackgroundReadonlyActions,
|
|
160
|
+
has_terminal_failure_alert: hasTerminalFailureAlert,
|
|
161
|
+
has_terminal_exit: hasTerminalExit,
|
|
104
162
|
has_autosave_name_source: hasAutosaveNameSource,
|
|
105
163
|
has_explicit_visible_source: hasExplicitVisibleSource,
|
|
106
|
-
has_terminal_command_interpolation: hasTerminalCommandInterpolation,
|
|
107
164
|
has_no_unconditional_keepalive: hasNoUnconditionalKeepAlive,
|
|
165
|
+
has_no_launch_agent_secrets: hasNoLaunchAgentSecrets,
|
|
108
166
|
has_interactive_process_type: hasInteractiveProcessType,
|
|
167
|
+
has_package_plist_version: hasPackagePlistVersion,
|
|
168
|
+
has_action_fallbacks: hasActionFallbacks,
|
|
169
|
+
has_entry_warning: hasEntryWarning,
|
|
170
|
+
has_build_stamp: hasBuildStamp,
|
|
171
|
+
is_idempotent: isIdempotent,
|
|
172
|
+
has_command_registry: hasCommandRegistry,
|
|
173
|
+
no_launchctl_secret_setenv: noLaunchctlSecretSetenv,
|
|
174
|
+
has_launchctl_unsetenv: hasLaunchctlUnsetenv,
|
|
109
175
|
launch_skipped_for_temp_home: launchSkippedForTempHome,
|
|
110
176
|
launch_skipped_for_env_home: launchSkippedForEnvHome,
|
|
111
177
|
launch_skipped_for_temp_install: launchSkippedForTempInstall,
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { assertGate, emitGate, makeTempRoot, writeText } from './sks-3-1-8-check-lib.js';
|
|
5
|
+
import { uninstallCommand } from '../core/commands/uninstall-command.js';
|
|
6
|
+
const home = await makeTempRoot('sks-uninstall-home-');
|
|
7
|
+
const project = await makeTempRoot('sks-uninstall-project-');
|
|
8
|
+
process.env.SKS_UNINSTALL_SKIP_TMP_SWEEP = '1';
|
|
9
|
+
await writeText(path.join(home, '.agents', 'skills', 'answer', 'SKILL.md'), '---\nname: answer\ndescription: SKS fixture\n---\n\nSKS managed official fixture.\n');
|
|
10
|
+
await writeText(path.join(home, '.agents', 'skills', 'user-global', 'SKILL.md'), '---\nname: user-global\ndescription: User global\n---\n\nUser global skill.\n');
|
|
11
|
+
await writeText(path.join(home, '.codex', 'agents', 'lazycodex-executor.toml'), 'name = "lazycodex-executor"\n');
|
|
12
|
+
await writeText(path.join(home, '.codex', 'hooks.json'), JSON.stringify({
|
|
13
|
+
UserPromptSubmit: [{ hooks: [{ type: 'command', command: 'sks hook user-prompt-submit' }] }],
|
|
14
|
+
Stop: [{ hooks: [{ type: 'command', command: 'custom-stop' }] }]
|
|
15
|
+
}, null, 2));
|
|
16
|
+
await writeText(path.join(home, '.codex', 'config.toml'), [
|
|
17
|
+
'default_profile = "sks-fast-high"',
|
|
18
|
+
'service_tier = "fast"',
|
|
19
|
+
'[profiles.sks-fast-high]',
|
|
20
|
+
'model = "gpt-5.5"',
|
|
21
|
+
'[user.fast_mode]',
|
|
22
|
+
'enabled = true',
|
|
23
|
+
'[mcp_servers.user]',
|
|
24
|
+
'url = "https://example.test"'
|
|
25
|
+
].join('\n'));
|
|
26
|
+
await writeText(path.join(home, '.sneakoscope', 'state.json'), '{}\n');
|
|
27
|
+
await writeText(path.join(project, '.agents', 'skills', 'answer', 'SKILL.md'), '---\nname: answer\ndescription: SKS legacy fixture\n---\n\nDollar-command route generated by SKS.\n');
|
|
28
|
+
await writeText(path.join(project, '.agents', 'skills', 'forge-one', 'SKILL.md'), '---\nname: forge-one\ndescription: Forge\n---\n\n<!-- BEGIN SKS FORGE SKILL project=x generator=sks@test created=now -->\n');
|
|
29
|
+
await writeText(path.join(project, '.agents', 'skills', 'user-one', 'SKILL.md'), '---\nname: user-one\ndescription: User\n---\n\nUser content.\n');
|
|
30
|
+
const dry = await uninstallCommand(['--dry-run', '--json', '--home', home]);
|
|
31
|
+
assertGate(dry.dry_run === true, 'dry-run must not mutate', dry);
|
|
32
|
+
assertGate(dry.inventory.some((item) => item.id === 'global-skills' && item.exists === true), 'inventory must include global skills', dry);
|
|
33
|
+
const originalCwd = process.cwd();
|
|
34
|
+
process.chdir(project);
|
|
35
|
+
const applied = await uninstallCommand(['--yes', '--home', home, '--purge-projects', '--keep-data']);
|
|
36
|
+
process.chdir(originalCwd);
|
|
37
|
+
assertGate(applied.ok === true, 'uninstall apply must pass', applied);
|
|
38
|
+
assertGate(!(await exists(path.join(home, '.agents', 'skills', 'answer'))), 'global SKS official skill must be removed');
|
|
39
|
+
assertGate(await exists(path.join(home, '.agents', 'skills', 'user-global', 'SKILL.md')), 'global user-authored skill must be preserved');
|
|
40
|
+
assertGate(await exists(path.join(home, '.sneakoscope')), '--keep-data must preserve ~/.sneakoscope');
|
|
41
|
+
const hooks = JSON.parse(await fs.readFile(path.join(home, '.codex', 'hooks.json'), 'utf8'));
|
|
42
|
+
assertGate(JSON.stringify(hooks).includes('custom-stop') && !JSON.stringify(hooks).includes('sks hook'), 'hooks-json must strip SKS entries and preserve user hooks', hooks);
|
|
43
|
+
const cfg = await fs.readFile(path.join(home, '.codex', 'config.toml'), 'utf8');
|
|
44
|
+
assertGate(cfg.includes('[mcp_servers.user]') && !cfg.includes('sks-fast-high') && !cfg.includes('[user.fast_mode]'), 'config strip must preserve user table and remove SKS-owned fast profile', cfg);
|
|
45
|
+
assertGate(!(await exists(path.join(project, '.agents', 'skills', 'answer'))), 'project official residue must be removed');
|
|
46
|
+
assertGate(await exists(path.join(project, '.agents', 'skills', 'forge-one', 'SKILL.md')), 'forge skill must be preserved');
|
|
47
|
+
assertGate(await exists(path.join(project, '.agents', 'skills', 'user-one', 'SKILL.md')), 'user skill must be preserved');
|
|
48
|
+
const second = await uninstallCommand(['--yes', '--home', home, '--keep-config', '--keep-data']);
|
|
49
|
+
assertGate(second.ok === true, 'uninstall must be idempotent', second);
|
|
50
|
+
emitGate('sks:uninstall-regression', { removed_steps: applied.removed.length, inventory: dry.inventory.length });
|
|
51
|
+
async function exists(file) {
|
|
52
|
+
return fs.stat(file).then(() => true, () => false);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=sks-uninstall-regression-check.js.map
|
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// @ts-nocheck
|
|
3
3
|
import assert from 'node:assert/strict';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import os from 'node:os';
|
|
4
6
|
import { spawnSync } from 'node:child_process';
|
|
5
7
|
import path from 'node:path';
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
+
const repoRoot = process.cwd();
|
|
9
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'sks-ux-review-real-loop-fixture-'));
|
|
10
|
+
const result = spawnSync(process.execPath, [path.join(repoRoot, 'dist/bin/sks.js'), 'image-ux-review', 'fixture', '--mock', '--json'], {
|
|
8
11
|
cwd: root,
|
|
9
12
|
encoding: 'utf8',
|
|
10
|
-
env: { ...process.env, SKS_SKIP_NPM_FRESHNESS_CHECK: '1', CI: 'true' },
|
|
13
|
+
env: { ...process.env, SKS_SKIP_NPM_FRESHNESS_CHECK: '1', SKS_UPDATE_MIGRATION_GATE_DISABLED: '1', CI: 'true' },
|
|
11
14
|
timeout: Number(process.env.SKS_UX_REVIEW_REAL_LOOP_FIXTURE_TIMEOUT_MS || 180_000)
|
|
12
15
|
});
|
|
13
|
-
assert.
|
|
16
|
+
assert.ok([0, 1].includes(result.status), JSON.stringify({
|
|
14
17
|
stderr: result.stderr,
|
|
15
18
|
stdout: result.stdout,
|
|
16
19
|
signal: result.signal,
|
|
17
20
|
error: result.error?.message || null
|
|
18
21
|
}, null, 2));
|
|
19
22
|
const json = JSON.parse(result.stdout);
|
|
23
|
+
assert.equal(json.ok, false);
|
|
20
24
|
assert.equal(json.artifacts.gate.mock_fixture_cannot_claim_real, true);
|
|
21
25
|
assert.equal(json.artifacts.generated_review_ledger.real_generated_count, 0);
|
|
22
26
|
assert.equal(json.artifacts.generated_review_ledger.generated_count, 1);
|
|
27
|
+
assert.equal(json.proof.status, 'mock_only');
|
|
23
28
|
console.log(JSON.stringify({ schema: 'sks.ux-review-real-loop-fixture.v1', ok: true, mission_id: json.mission_id }, null, 2));
|
|
24
29
|
//# sourceMappingURL=ux-review-real-loop-fixture-check.js.map
|
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
import { emitGate, requireContains } from './sks-1-12-real-execution-check-lib.js';
|
|
4
4
|
requireContains('ux-review:run-wires-imagegen', 'src/core/commands/image-ux-review-command.ts', [
|
|
5
5
|
'const shouldGenerateCallouts = flag(args, \'--generate-callouts\') || flag(args, \'--fix\')',
|
|
6
|
+
'requireCodexImagegen',
|
|
6
7
|
'generateGptImage2CalloutReview',
|
|
8
|
+
'evidence_class',
|
|
9
|
+
'output_sha256',
|
|
10
|
+
'imagegen_response_non_codex_api_fallback_not_full_evidence',
|
|
7
11
|
'extractRealCallouts',
|
|
8
12
|
'buildImageUxCalloutExtractionReport'
|
|
9
13
|
]);
|
|
@@ -11,15 +11,21 @@ if (!freshness.ok)
|
|
|
11
11
|
const layoutMod = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-layout-builder.js')).href);
|
|
12
12
|
const capabilityMod = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-capability.js')).href);
|
|
13
13
|
const commandMod = await import(pathToFileURL(path.join(root, 'dist', 'core', 'zellij', 'zellij-command.js')).href);
|
|
14
|
-
|
|
14
|
+
process.env.SKS_ZELLIJ_VIEWPORTS = '4';
|
|
15
|
+
const built = layoutMod.buildZellijLayoutKdl({ missionId: 'M-layout-check', ledgerRoot: path.join(root, '.sneakoscope', 'tmp', 'layout-check'), cwd: root, kind: 'mad', slotCount: 2, codexArgs: ['--profile', 'sks-mad-high', '-c', 'service_tier=fast'] });
|
|
15
16
|
const staticValidation = layoutMod.validateZellijLayoutKdl(built.layout_kdl);
|
|
16
|
-
const
|
|
17
|
+
const viewportLayoutOk = built.initial_worker_panes === 0
|
|
18
|
+
&& built.viewport_count === 4
|
|
19
|
+
&& built.ui_architecture === 'monitor_plus_viewports'
|
|
17
20
|
&& built.lane_runtime_policies.length === 0
|
|
18
21
|
&& built.layout_kdl.includes('pane name="orchestrator"')
|
|
22
|
+
&& built.layout_kdl.includes('pane size="35%" name="sks-monitor"')
|
|
19
23
|
&& !built.layout_kdl.includes('zellij-lane')
|
|
20
|
-
&& !
|
|
24
|
+
&& !built.layout_kdl.includes('zellij-slot-pane')
|
|
25
|
+
&& (built.layout_kdl.match(/pane name="sks-viewport-/g) || []).length === 4
|
|
21
26
|
&& built.lane_dispatch_policy?.mode === 'jsonl_nonblocking'
|
|
22
|
-
&& built.lane_dispatch_policy?.fifo_policy === 'disabled_to_avoid_writer_blocking'
|
|
27
|
+
&& built.lane_dispatch_policy?.fifo_policy === 'disabled_to_avoid_writer_blocking'
|
|
28
|
+
&& built.lane_dispatch_policy?.pane_transport === 'monitor_plus_viewports';
|
|
23
29
|
const narutoFanoutLayout = layoutMod.buildZellijLayoutKdl({
|
|
24
30
|
missionId: 'M-layout-naruto-fanout',
|
|
25
31
|
ledgerRoot: path.join(root, '.sneakoscope', 'tmp', 'layout-naruto-fanout'),
|
|
@@ -27,7 +33,7 @@ const narutoFanoutLayout = layoutMod.buildZellijLayoutKdl({
|
|
|
27
33
|
kind: 'naruto',
|
|
28
34
|
slotCount: 24
|
|
29
35
|
});
|
|
30
|
-
const narutoFanoutPaneCount = (narutoFanoutLayout.layout_kdl.match(/pane name="
|
|
36
|
+
const narutoFanoutPaneCount = (narutoFanoutLayout.layout_kdl.match(/pane name="sks-viewport-/g) || []).length;
|
|
31
37
|
const kindsValidated = ['mad', 'agent', 'team', 'naruto'].map((kind) => {
|
|
32
38
|
const b = layoutMod.buildZellijLayoutKdl({
|
|
33
39
|
missionId: `M-layout-${kind}`,
|
|
@@ -38,8 +44,9 @@ const kindsValidated = ['mad', 'agent', 'team', 'naruto'].map((kind) => {
|
|
|
38
44
|
codexArgs: kind === 'mad' ? ['--profile', 'sks-mad-high', '-c', 'service_tier=fast'] : []
|
|
39
45
|
});
|
|
40
46
|
const hasCodexPane = kind !== 'mad' || (b.main_pane_kind === 'codex_interactive' && /exec\s+'?codex'?/.test(b.layout_kdl) && b.layout_kdl.includes('sks-mad-high') && b.layout_kdl.includes('--no-alt-screen'));
|
|
41
|
-
const
|
|
42
|
-
|
|
47
|
+
const viewportPaneCount = (b.layout_kdl.match(/pane name="sks-viewport-/g) || []).length;
|
|
48
|
+
const noLanePane = !b.layout_kdl.includes('zellij-lane');
|
|
49
|
+
return { kind, ok: layoutMod.validateZellijLayoutKdl(b.layout_kdl).ok && hasCodexPane && noLanePane && viewportPaneCount === 4 && b.initial_worker_panes === 0 && b.viewport_count === 4, main_pane_kind: b.main_pane_kind, has_codex_pane: hasCodexPane, no_lane_pane: noLanePane, viewport_pane_count: viewportPaneCount };
|
|
43
50
|
});
|
|
44
51
|
const allKindsOk = kindsValidated.every((k) => k.ok);
|
|
45
52
|
const invalidValidation = layoutMod.validateZellijLayoutKdl('layout { pane command="zellij-lane" {');
|
|
@@ -63,10 +70,10 @@ if (realRun) {
|
|
|
63
70
|
realRun.ok = realRun.create_background.ok === true;
|
|
64
71
|
}
|
|
65
72
|
const ok = staticValidation.ok
|
|
66
|
-
&&
|
|
73
|
+
&& viewportLayoutOk
|
|
67
74
|
&& allKindsOk
|
|
68
75
|
&& layoutMod.validateZellijLayoutKdl(narutoFanoutLayout.layout_kdl).ok
|
|
69
|
-
&& narutoFanoutPaneCount ===
|
|
76
|
+
&& narutoFanoutPaneCount === 4
|
|
70
77
|
&& invalidValidation.ok === false
|
|
71
78
|
&& capability.ok
|
|
72
79
|
&& (requireReal ? realRun?.ok === true : true);
|
|
@@ -74,9 +81,9 @@ emit({
|
|
|
74
81
|
schema: 'sks.zellij-layout-valid-check.v1',
|
|
75
82
|
ok,
|
|
76
83
|
layout: { ...built, layout_kdl: undefined, layout_path: layoutPath },
|
|
77
|
-
|
|
84
|
+
viewport_layout_ok: viewportLayoutOk,
|
|
78
85
|
kinds_validated: kindsValidated,
|
|
79
|
-
naruto_fanout_layout: {
|
|
86
|
+
naruto_fanout_layout: { viewport_count: narutoFanoutLayout.viewport_count, pane_count: narutoFanoutPaneCount, initial_worker_panes: narutoFanoutLayout.initial_worker_panes },
|
|
80
87
|
static_validation: staticValidation,
|
|
81
88
|
invalid_fixture: invalidValidation,
|
|
82
89
|
capability,
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// @ts-nocheck
|
|
3
|
-
import os from 'node:os';
|
|
4
3
|
import path from 'node:path';
|
|
5
4
|
import { assertGate, emitGate } from './sks-1-18-gate-lib.js';
|
|
6
|
-
import { writeTextAtomic } from '../core/fsx.js';
|
|
5
|
+
import { tmpdir, writeTextAtomic } from '../core/fsx.js';
|
|
7
6
|
import { checkZellijCapability } from '../core/zellij/zellij-capability.js';
|
|
8
7
|
import { runZellij } from '../core/zellij/zellij-command.js';
|
|
9
8
|
const requireReal = process.argv.includes('--require-real') || process.env.SKS_REQUIRE_ZELLIJ === '1';
|
|
@@ -153,8 +152,7 @@ function buildRealGeometryLayout(cwd) {
|
|
|
153
152
|
].join('\n');
|
|
154
153
|
}
|
|
155
154
|
async function fsTempDir() {
|
|
156
|
-
|
|
157
|
-
return fs.mkdtemp(path.join(os.tmpdir(), 'sks-zellij-geometry-'));
|
|
155
|
+
return tmpdir('sks-zellij-geometry-');
|
|
158
156
|
}
|
|
159
157
|
function sleep(ms) {
|
|
160
158
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
@@ -131,21 +131,21 @@ const command = renderer.buildZellijSlotPaneCommand({
|
|
|
131
131
|
const report = {
|
|
132
132
|
schema: 'sks.zellij-slot-pane-renderer-check.v1',
|
|
133
133
|
line_count: lines.length,
|
|
134
|
-
max_compact_lines:
|
|
135
|
-
contains_slot:
|
|
134
|
+
max_compact_lines: 14,
|
|
135
|
+
contains_slot: /┌─ slot-003/.test(text) && /slot-003/.test(text),
|
|
136
136
|
contains_status: /coding/.test(text),
|
|
137
|
-
contains_runtime: /
|
|
138
|
-
contains_files: /src\/core\/foo\.ts/.test(text)
|
|
139
|
-
contains_live_event: /
|
|
140
|
-
artifact_hydrates_runtime: /
|
|
141
|
-
artifact_hydrates_live_event: /
|
|
137
|
+
contains_runtime: /gpt-5\.5·fast/.test(text),
|
|
138
|
+
contains_files: /src\/core\/foo\.ts/.test(text),
|
|
139
|
+
contains_live_event: /renderer updated live pane output/.test(text),
|
|
140
|
+
artifact_hydrates_runtime: /gpt-5\.5·fast/.test(hydrated),
|
|
141
|
+
artifact_hydrates_live_event: /renderer stdout tail/.test(hydrated),
|
|
142
142
|
artifact_hydrates_planned_file: /zellij-slot-pane-renderer\.ts/.test(hydrated),
|
|
143
|
-
|
|
143
|
+
mission_live_telemetry_wins: /mission telemetry stale fixture/.test(missionHydrated) && /renderer stdout tail/.test(missionHydrated),
|
|
144
144
|
command_uses_slot_pane: command.includes('zellij-slot-pane') && command.includes('--watch'),
|
|
145
145
|
snapshot: text,
|
|
146
146
|
hydrated_snapshot: hydrated,
|
|
147
147
|
mission_hydrated_snapshot: missionHydrated
|
|
148
148
|
};
|
|
149
|
-
assertGate(lines.length <=
|
|
149
|
+
assertGate(lines.length <= 14 && report.contains_slot && report.contains_status && report.contains_runtime && report.contains_files && report.contains_live_event && report.artifact_hydrates_runtime && report.artifact_hydrates_live_event && report.artifact_hydrates_planned_file && report.mission_live_telemetry_wins && report.command_uses_slot_pane, 'compact slot pane renderer must render one live work pane per slot', report);
|
|
150
150
|
emitGate('zellij:compact-slot-renderer', report);
|
|
151
151
|
//# sourceMappingURL=zellij-slot-pane-renderer-check.js.map
|
|
@@ -56,19 +56,18 @@ snapshot.updated_at = new Date(Date.now() - 3500).toISOString();
|
|
|
56
56
|
await fs.writeFile(file, `${JSON.stringify(snapshot)}\n`, 'utf8');
|
|
57
57
|
const freshStatus = await renderZellijSlotPaneStatusFromArtifacts({ artifactDir, artifactRoot: root, missionId, slotId: 'slot-001', generationIndex: 1 });
|
|
58
58
|
assertGate(freshStatus.telemetry_stale === false, 'slot pane status JSON must treat 3.5s-old telemetry as fresh under new 15s threshold', freshStatus);
|
|
59
|
-
// Between 15s and 60s the
|
|
59
|
+
// Between 15s and 60s the status JSON marks staleness; the pane keeps showing live telemetry
|
|
60
|
+
// merged with fresh artifact/log detail instead of replacing it with stale-only prose.
|
|
60
61
|
snapshot.updated_at = new Date(Date.now() - 16000).toISOString();
|
|
61
62
|
await fs.writeFile(file, `${JSON.stringify(snapshot)}\n`, 'utf8');
|
|
62
63
|
const staleText = await renderZellijSlotPaneFromArtifacts({ artifactDir, artifactRoot: root, missionId, slotId: 'slot-001', generationIndex: 1 });
|
|
63
64
|
const staleStatus = await renderZellijSlotPaneStatusFromArtifacts({ artifactDir, artifactRoot: root, missionId, slotId: 'slot-001', generationIndex: 1 });
|
|
64
|
-
assertGate(/telemetry stale 1[0-9]\.\d+s/.test(staleText), 'slot pane must show numeric stale telemetry warning above 15s', { staleText, staleStatus });
|
|
65
65
|
assertGate(staleStatus.telemetry_stale === true && staleStatus.telemetry_age_ms >= 15000, 'slot pane status JSON must expose stale telemetry above 15s', staleStatus);
|
|
66
66
|
assertGate(staleText.includes('fresh worker stdout fallback') || staleText.includes('apply_patch'), 'stale slot pane must show fresh artifact/log fallback', { staleText });
|
|
67
|
-
// Past 60s the
|
|
67
|
+
// Past 60s the status JSON remains stale and the watch loop owns zombie closure.
|
|
68
68
|
snapshot.updated_at = new Date(Date.now() - 61000).toISOString();
|
|
69
69
|
await fs.writeFile(file, `${JSON.stringify(snapshot)}\n`, 'utf8');
|
|
70
70
|
const blockedText = await renderZellijSlotPaneFromArtifacts({ artifactDir, artifactRoot: root, missionId, slotId: 'slot-001', generationIndex: 1 });
|
|
71
|
-
assertGate(blockedText.includes('telemetry stale; worker may still be running'), 'slot pane must show >60s stale blocker line', { blockedText });
|
|
72
71
|
assertGate(blockedText.includes('fresh worker stdout fallback') || blockedText.includes('apply_patch'), 'blocked stale slot pane must keep artifact/log fallback', { blockedText });
|
|
73
72
|
emitGate('zellij:slot-pane-stale-detection', { stale_age_ms: staleStatus.telemetry_age_ms, artifact_fallback: true });
|
|
74
73
|
//# sourceMappingURL=zellij-slot-pane-stale-detection-check.js.map
|
|
@@ -3,9 +3,10 @@ import { assertGate, emitGate, readText } from './sks-1-18-gate-lib.js';
|
|
|
3
3
|
const pane = readText('src/core/zellij/zellij-slot-pane-renderer.ts');
|
|
4
4
|
const command = readText('src/commands/zellij-slot-pane.ts');
|
|
5
5
|
assertGate(pane.includes('readZellijSlotTelemetrySnapshot'), 'slot pane renderer must read telemetry snapshots');
|
|
6
|
-
assertGate(pane.includes('
|
|
7
|
-
assertGate(pane.includes('
|
|
6
|
+
assertGate(pane.includes('mergeRenderInputWithLiveTelemetry'), 'slot pane renderer must prefer live telemetry over artifact detail');
|
|
7
|
+
assertGate(pane.includes('renderInputFromArtifactDir') && pane.includes('stdoutTail'), 'slot pane renderer must preserve artifact/log fallback details');
|
|
8
8
|
assertGate(pane.includes('latest_heartbeat') || pane.includes('heartbeat'), 'slot pane renderer must surface heartbeat/progress state');
|
|
9
9
|
assertGate(command.includes('artifactRoot') && command.includes('--artifact-root'), 'slot pane command must pass artifact root for telemetry lookup');
|
|
10
|
+
assertGate(command.includes('staleTicks') && command.includes('worker heartbeat lost >5m'), 'slot pane command must close zombie panes instead of freezing');
|
|
10
11
|
emitGate('zellij:slot-pane-telemetry-renderer', { telemetry_with_artifact_fallback: true });
|
|
11
12
|
//# sourceMappingURL=zellij-slot-pane-telemetry-renderer-check.js.map
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { assertGate, emitGate, readText } from './sks-1-18-gate-lib.js';
|
|
3
3
|
const pane = readText('src/core/zellij/zellij-slot-pane-renderer.ts');
|
|
4
|
+
const command = readText('src/commands/zellij-slot-pane.ts');
|
|
4
5
|
const anchor = readText('src/core/zellij/zellij-slot-column-anchor.ts');
|
|
5
|
-
assertGate(pane.includes('readZellijSlotTelemetrySnapshot') && pane.includes('
|
|
6
|
-
assertGate(pane.includes('
|
|
6
|
+
assertGate(pane.includes('readZellijSlotTelemetrySnapshot') && pane.includes('mergeRenderInputWithLiveTelemetry'), 'slot pane must read telemetry first and merge it with artifact detail');
|
|
7
|
+
assertGate(pane.includes('renderInputFromArtifactDir') && pane.includes('stdoutTail'), 'slot pane must preserve artifact/log fallback while live telemetry wins');
|
|
8
|
+
assertGate(command.includes('staleTicks') && command.includes('worker heartbeat lost >5m'), 'slot pane watch loop must close frozen heartbeat panes');
|
|
7
9
|
assertGate(anchor.includes('readZellijSlotTelemetrySnapshot') && anchor.includes('SLOTS telemetry stale'), 'slot anchor must render telemetry snapshot and stale state');
|
|
8
10
|
assertGate(anchor.includes('update-notice.json') && anchor.includes('MAD-DB ACTIVE'), 'anchor must surface update notice and Mad-DB state');
|
|
9
11
|
emitGate('zellij:slot-telemetry-renderer', { telemetry_with_artifact_fallback: true });
|
|
@@ -5,16 +5,21 @@ import { packageRoot } from '../core/fsx.js';
|
|
|
5
5
|
import { buildZellijLayoutKdl, validateZellijLayoutKdl, writeZellijLayout } from '../core/zellij/zellij-layout-builder.js';
|
|
6
6
|
const root = packageRoot();
|
|
7
7
|
const tmpRoot = path.join(root, '.sneakoscope', 'tmp', 'spawn-on-demand-layout-check');
|
|
8
|
+
process.env.SKS_ZELLIJ_VIEWPORTS = '4';
|
|
8
9
|
const built = buildZellijLayoutKdl({ missionId: 'M-spawn-on-demand-layout', ledgerRoot: tmpRoot, cwd: root, kind: 'naruto', slotCount: 24 });
|
|
9
10
|
const validation = validateZellijLayoutKdl(built.layout_kdl);
|
|
10
11
|
const writeBuilt = await writeZellijLayout(root, { missionId: 'M-spawn-on-demand-layout-write', ledgerRoot: tmpRoot, cwd: root, kind: 'agent', slotCount: 5 });
|
|
11
12
|
const manifest = JSON.parse(await fs.readFile(path.join(tmpRoot, 'zellij-lane-runtime.json'), 'utf8'));
|
|
12
13
|
const workerPaneMatches = built.layout_kdl.match(/pane name="slot-/g) || [];
|
|
14
|
+
const viewportPaneMatches = built.layout_kdl.match(/pane name="sks-viewport-/g) || [];
|
|
13
15
|
const laneCommandMatches = built.layout_kdl.match(/\bzellij-lane\b/g) || [];
|
|
14
16
|
const ok = validation.ok
|
|
15
17
|
&& built.initial_worker_panes === 0
|
|
18
|
+
&& built.viewport_count === 4
|
|
19
|
+
&& built.ui_architecture === 'monitor_plus_viewports'
|
|
16
20
|
&& built.lane_runtime_policies.length === 0
|
|
17
21
|
&& workerPaneMatches.length === 0
|
|
22
|
+
&& viewportPaneMatches.length === 4
|
|
18
23
|
&& laneCommandMatches.length === 0
|
|
19
24
|
&& manifest.lanes.length === 0
|
|
20
25
|
&& writeBuilt.initial_worker_panes === 0;
|
|
@@ -22,15 +27,16 @@ emit({
|
|
|
22
27
|
schema: 'sks.zellij-spawn-on-demand-layout-check.v1',
|
|
23
28
|
ok,
|
|
24
29
|
initial_worker_panes: built.initial_worker_panes,
|
|
25
|
-
|
|
30
|
+
viewport_count: built.viewport_count,
|
|
26
31
|
lane_runtime_policy_count: built.lane_runtime_policies.length,
|
|
27
32
|
worker_pane_matches: workerPaneMatches.length,
|
|
33
|
+
viewport_pane_matches: viewportPaneMatches.length,
|
|
28
34
|
lane_command_matches: laneCommandMatches.length,
|
|
29
35
|
monitor_pane_enabled: built.monitor_pane_enabled,
|
|
30
36
|
validation,
|
|
31
37
|
manifest_lane_count: manifest.lanes.length,
|
|
32
38
|
layout_path: writeBuilt.layout_path,
|
|
33
|
-
blockers: ok ? [] : ['
|
|
39
|
+
blockers: ok ? [] : ['zellij_dynamic_viewport_layout_contract_failed']
|
|
34
40
|
});
|
|
35
41
|
function emit(report) {
|
|
36
42
|
console.log(JSON.stringify(report, null, 2));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import '../core/zellij/__tests__/zellij-viewport-binder.test.js';
|
|
3
|
+
console.log(JSON.stringify({
|
|
4
|
+
schema: 'sks.zellij-viewport-binder-check.v1',
|
|
5
|
+
ok: true,
|
|
6
|
+
cases: ['pins', 'hysteresis', 'rebinding', 'idle', 'recent_failed_priority'],
|
|
7
|
+
blockers: []
|
|
8
|
+
}, null, 2));
|
|
9
|
+
//# sourceMappingURL=zellij-viewport-binder-check.js.map
|
|
Binary file
|
package/docs/demo.tape
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
Output docs/assets/sks-v5-demo.gif
|
|
2
|
+
Set Shell "zsh"
|
|
3
|
+
Set FontSize 16
|
|
4
|
+
Set Width 1280
|
|
5
|
+
Set Height 720
|
|
6
|
+
Set TypingSpeed 20ms
|
|
7
|
+
|
|
8
|
+
Type "npx sneakoscope install --yes"
|
|
9
|
+
Sleep 500ms
|
|
10
|
+
Enter
|
|
11
|
+
Sleep 1s
|
|
12
|
+
Ctrl+C
|
|
13
|
+
|
|
14
|
+
Type "sks plan \"ship a proof-first review flow\""
|
|
15
|
+
Enter
|
|
16
|
+
Sleep 1s
|
|
17
|
+
|
|
18
|
+
Type "sks review --staged"
|
|
19
|
+
Enter
|
|
20
|
+
Sleep 1s
|
|
21
|
+
|
|
22
|
+
Type "sks ui --once"
|
|
23
|
+
Enter
|
|
24
|
+
Sleep 1s
|
|
25
|
+
|
|
26
|
+
Type "sks naruto run \"demo no-op swarm\" --backend fake --clones 4 --work-items 4 --no-open-zellij --json"
|
|
27
|
+
Enter
|
|
28
|
+
Sleep 2s
|