sneakoscope 10.6.2 → 10.7.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 +2 -2
- package/config/perf-budgets.v1.json +1 -2
- package/config/skills-hash-ledger.v1.json +7 -2
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/dist/bin/sks-dispatch.js +6 -3
- package/dist/cli/args.js +3 -1
- package/dist/cli/command-manifest-lite.js +48 -114
- package/dist/cli/command-registry.js +1 -18
- package/dist/cli/commands-fast.js +11 -4
- package/dist/cli/help-fast.js +11 -22
- package/dist/cli/help.js +3 -3
- package/dist/cli/install-helpers.js +1 -1
- package/dist/cli/router.js +12 -26
- package/dist/commands/codex-app.js +2 -2
- package/dist/commands/doctor-helpers.js +1 -1
- package/dist/commands/mad-sks.js +2 -2
- package/dist/config/skills-manifest.json +13 -8
- package/dist/core/agent-bridge/async-command.js +2 -2
- package/dist/core/agents/agent-recursion-guard.js +0 -2
- package/dist/core/auto-review.js +15 -172
- package/dist/core/code-structure.js +0 -1
- package/dist/core/codex-control/codex-reliability-shield.js +64 -15
- package/dist/core/codex-control/codex-sdk-adapter.js +38 -5
- package/dist/core/commands/agent-bridge-command.js +1 -1
- package/dist/core/commands/basic-cli.js +60 -233
- package/dist/core/commands/command-utils.js +1 -1
- package/dist/core/commands/gc-command.js +30 -29
- package/dist/core/commands/image-ux-review-command.js +1 -1
- package/dist/core/commands/install-package-command.js +1 -1
- package/dist/core/commands/intent-normalization/normalizer.js +2 -2
- package/dist/core/commands/pipeline-command.js +13 -5
- package/dist/core/commands/plan-command.js +2 -3
- package/dist/core/commands/research-command.js +0 -3
- package/dist/core/commands/review-command.js +1 -1
- package/dist/core/commands/seo-command.js +27 -20
- package/dist/core/commands/status-command.js +8 -2
- package/dist/core/doctor/command-alias-cleanup.js +6 -6
- package/dist/core/evaluation.js +1 -1
- package/dist/core/feature-fixtures.js +9 -43
- package/dist/core/feature-registry.js +9 -27
- package/dist/core/git-hygiene/shared-memory-publish.js +1 -1
- package/dist/core/hooks-runtime/stop-repeat-guard.js +0 -13
- package/dist/core/init/skills.js +5 -13
- package/dist/core/init.js +0 -9
- package/dist/core/install/installed-package-smoke.js +3 -1
- package/dist/core/perf/import-graph-budget.js +0 -1
- package/dist/core/perf/release-latency-slo.js +2 -30
- package/dist/core/pipeline-internals/pipeline-stage-builder.js +2 -4
- package/dist/core/pipeline-internals/runtime-core.js +2 -38
- package/dist/core/proof/route-proof-policy.js +2 -4
- package/dist/core/proof/runtime-truth-matrix.js +2 -2
- package/dist/core/proof-field.js +104 -39
- package/dist/core/questions.js +11 -7
- package/dist/core/release/gate-affected-globs.js +0 -2
- package/dist/core/research/research-reviewer-contract.js +34 -0
- package/dist/core/research/research-work-graph.js +1 -1
- package/dist/core/research.js +1 -1
- package/dist/core/routes/constants.js +0 -1
- package/dist/core/routes/diagnostic-allowlist.js +1 -3
- package/dist/core/routes/light-routes.js +1 -2
- package/dist/core/routes.js +1 -1
- package/dist/core/safety/command-contract/contracts.js +5 -1
- package/dist/core/search-visibility/marketing-truthfulness.js +10 -7
- package/dist/core/search-visibility/marketing.js +194 -149
- package/dist/core/skill-forge.js +1 -361
- package/dist/core/strategy/adhd-orchestrating-gate.js +3 -3
- package/dist/core/triwiki/context-graph/extractors/topology/commands.js +2 -6
- package/dist/core/triwiki-wrongness/wrongness-cli.js +9 -27
- package/dist/core/version.js +1 -1
- package/package.json +1 -2
- package/release-gates.v2.json +1 -32
- package/dist/cli/recallpulse-command.js +0 -144
- package/dist/commands/auto-review.js +0 -5
- package/dist/commands/codex-native.js +0 -77
- package/dist/commands/recallpulse.js +0 -5
- package/dist/core/codex-native/codex-native-interop-policy.js +0 -127
- package/dist/core/commands/autoresearch-command.js +0 -4
- package/dist/core/commands/code-structure-command.js +0 -52
- package/dist/core/commands/goal-command.js +0 -43
- package/dist/core/commands/recallpulse-command.js +0 -4
- package/dist/core/commands/remote-command.js +0 -119
- package/dist/core/commands/skill-dream-command.js +0 -43
- package/dist/core/commands/wrongness-command.js +0 -2
- package/dist/core/goal-workflow.js +0 -80
- package/dist/core/mcp/mcp-tool-name-normalizer.js +0 -28
- package/dist/core/recallpulse/policy.js +0 -207
- package/dist/core/recallpulse.js +0 -947
- package/dist/core/remote/audit-idempotency.js +0 -241
- package/dist/core/remote/index.js +0 -10
- package/dist/core/remote/machine-registry.js +0 -167
- package/dist/core/remote/owner-proof.js +0 -216
- package/dist/core/remote/protocol.js +0 -249
- package/dist/core/remote/readiness.js +0 -156
- package/dist/core/remote/session-index.js +0 -61
- package/dist/core/remote/session-snapshot.js +0 -197
- package/dist/core/remote/ssh-worker-client.js +0 -377
- package/dist/core/remote/types.js +0 -10
- package/dist/core/remote/worker.js +0 -360
- package/dist/core/search/context-graph-seeds.js +0 -15
- package/dist/core/verification/context-graph-affected.js +0 -312
- package/dist/core/verification/verification-artifact-lock.js +0 -21
- package/dist/core/verification/verification-dag.js +0 -89
- package/dist/core/verification/verification-result.js +0 -19
- package/dist/core/verification/verification-worker-pool.js +0 -204
|
@@ -73,8 +73,13 @@ export async function memoryCommand(sub, args = []) {
|
|
|
73
73
|
process.exitCode = 1;
|
|
74
74
|
return output;
|
|
75
75
|
}
|
|
76
|
-
|
|
76
|
+
if (action === 'gc')
|
|
77
|
+
return gcCommand(args || []);
|
|
78
|
+
console.error(`Usage: ${MEMORY_USAGE}`);
|
|
79
|
+
process.exitCode = 2;
|
|
80
|
+
return { schema: 'sks.memory-usage.v1', ok: false, status: 'unknown_subcommand', subcommand: action || null };
|
|
77
81
|
}
|
|
82
|
+
const MEMORY_USAGE = 'sks memory recall|promote|forget|build|gc ... (see `sks help memory`)';
|
|
78
83
|
export async function gcCommand(args = []) {
|
|
79
84
|
const action = String(args[0] || '').toLowerCase();
|
|
80
85
|
if (action === 'help' || args.includes('--help') || args.includes('-h'))
|
|
@@ -84,7 +89,7 @@ export async function gcCommand(args = []) {
|
|
|
84
89
|
const res = await enforceRetention(root, { dryRun: true, pruneReportLogs: true });
|
|
85
90
|
if (flag(args, '--json'))
|
|
86
91
|
return console.log(JSON.stringify(res.plan, null, 2));
|
|
87
|
-
console.log('
|
|
92
|
+
console.log('SKS GC plan');
|
|
88
93
|
console.log(`Plan hash: ${res.plan.plan_hash}`);
|
|
89
94
|
console.log(`Actions: ${res.actions.length}`);
|
|
90
95
|
return res.plan;
|
|
@@ -94,7 +99,7 @@ export async function gcCommand(args = []) {
|
|
|
94
99
|
const blocked = { schema: 'sks.retention-apply.v1', ok: false, applied: false, blockers: ['gc_apply_requires_yes'] };
|
|
95
100
|
if (flag(args, '--json'))
|
|
96
101
|
return console.log(JSON.stringify(blocked, null, 2));
|
|
97
|
-
console.log('
|
|
102
|
+
console.log('SKS GC apply blocked: pass --yes after reviewing `sks gc plan --json`.');
|
|
98
103
|
process.exitCode = 1;
|
|
99
104
|
return blocked;
|
|
100
105
|
}
|
|
@@ -104,7 +109,7 @@ export async function gcCommand(args = []) {
|
|
|
104
109
|
});
|
|
105
110
|
if (flag(args, '--json'))
|
|
106
111
|
return console.log(JSON.stringify(res, null, 2));
|
|
107
|
-
console.log(res.ok ? '
|
|
112
|
+
console.log(res.ok ? 'SKS GC applied' : 'SKS GC apply blocked');
|
|
108
113
|
console.log(`Actions: ${res.action_count || 0}`);
|
|
109
114
|
for (const blocker of res.blockers || [])
|
|
110
115
|
console.log(`- ${blocker}`);
|
|
@@ -114,18 +119,31 @@ export async function gcCommand(args = []) {
|
|
|
114
119
|
}
|
|
115
120
|
if (action === 'status') {
|
|
116
121
|
await refreshMissionIndex(root).catch(() => null);
|
|
117
|
-
const
|
|
122
|
+
const full = flag(args, '--full');
|
|
123
|
+
const [res, storage, packageBytes] = await Promise.all([
|
|
124
|
+
retentionStatus(root),
|
|
125
|
+
full ? storageReport(root) : lightweightStorageReport(root),
|
|
126
|
+
full ? dirSize(packageRoot()).catch(() => 0) : Promise.resolve(null)
|
|
127
|
+
]);
|
|
128
|
+
const output = {
|
|
129
|
+
...res,
|
|
130
|
+
storage,
|
|
131
|
+
package: packageBytes === null ? null : { bytes: packageBytes, human: formatBytes(packageBytes) }
|
|
132
|
+
};
|
|
118
133
|
if (flag(args, '--json'))
|
|
119
|
-
return console.log(JSON.stringify(
|
|
120
|
-
console.log('
|
|
134
|
+
return console.log(JSON.stringify(output, null, 2));
|
|
135
|
+
console.log('SKS GC status');
|
|
121
136
|
console.log(`Missions: ${res.mission_index?.mission_count ?? 'unknown'}`);
|
|
122
137
|
console.log(`Latest plan: ${res.latest_plan?.plan_hash || 'none'}`);
|
|
123
|
-
|
|
138
|
+
console.log(`State: ${storage?.total_human || 'not scanned (use --full)'}`);
|
|
139
|
+
if (output.package)
|
|
140
|
+
console.log(`Package: ${output.package.human}`);
|
|
141
|
+
return output;
|
|
124
142
|
}
|
|
125
143
|
const res = await enforceRetention(root, { dryRun: flag(args, '--dry-run'), pruneReportLogs: true });
|
|
126
144
|
if (flag(args, '--json'))
|
|
127
145
|
return console.log(JSON.stringify(res, null, 2));
|
|
128
|
-
console.log(flag(args, '--dry-run') ? '
|
|
146
|
+
console.log(flag(args, '--dry-run') ? 'SKS GC dry run' : 'SKS GC completed');
|
|
129
147
|
console.log(`Storage: ${res.report.total_human || '0 B'}`);
|
|
130
148
|
console.log(`Actions: ${res.actions.length}`);
|
|
131
149
|
console.log(`Protected: ${res.cleanup.protected_durable_context.length} durable context classes`);
|
|
@@ -136,11 +154,11 @@ function gcHelp(json = false) {
|
|
|
136
154
|
const help = {
|
|
137
155
|
schema: 'sks.gc-help.v1',
|
|
138
156
|
ok: true,
|
|
139
|
-
usage: 'sks gc [plan|apply|status] [--dry-run] [--json]',
|
|
157
|
+
usage: 'sks gc [plan|apply --yes|status [--full]] [--dry-run] [--json]',
|
|
140
158
|
commands: {
|
|
141
159
|
plan: 'Create a hashed dry-run plan using the configured retention policy.',
|
|
142
160
|
apply: 'Apply a reviewed plan with --yes and optional --plan-hash.',
|
|
143
|
-
status: 'Show the
|
|
161
|
+
status: 'Show the mission index, latest plan and cleanup, and current storage size (--full also sizes the installed package).'
|
|
144
162
|
}
|
|
145
163
|
};
|
|
146
164
|
if (json)
|
|
@@ -150,7 +168,7 @@ function gcHelp(json = false) {
|
|
|
150
168
|
console.log(' sks gc --dry-run');
|
|
151
169
|
console.log(' sks gc plan [--json]');
|
|
152
170
|
console.log(' sks gc apply --yes [--plan-hash <hash>] [--json]');
|
|
153
|
-
console.log(' sks gc status [--json]');
|
|
171
|
+
console.log(' sks gc status [--full] [--json]');
|
|
154
172
|
}
|
|
155
173
|
return help;
|
|
156
174
|
}
|
|
@@ -164,20 +182,3 @@ function readOption(args = [], name, fallback = null) {
|
|
|
164
182
|
function positionalMemoryId(args = []) {
|
|
165
183
|
return (args || []).find((arg) => !String(arg).startsWith('--')) || '';
|
|
166
184
|
}
|
|
167
|
-
export async function statsCommand(args = []) {
|
|
168
|
-
const root = await sksRoot();
|
|
169
|
-
const full = flag(args, '--full');
|
|
170
|
-
const report = full ? await storageReport(root) : await lightweightStorageReport(root);
|
|
171
|
-
const pkgBytes = full ? await dirSize(packageRoot()).catch(() => 0) : null;
|
|
172
|
-
const out = {
|
|
173
|
-
package: full
|
|
174
|
-
? { bytes: pkgBytes, human: formatBytes(pkgBytes), full_size: true }
|
|
175
|
-
: { bytes: null, human: null, full_size: false, note: 'Run `sks stats --full --json` for recursive package sizing.' },
|
|
176
|
-
storage: report
|
|
177
|
-
};
|
|
178
|
-
if (flag(args, '--json'))
|
|
179
|
-
return console.log(JSON.stringify(out, null, 2));
|
|
180
|
-
console.log('ㅅㅋㅅ Stats');
|
|
181
|
-
console.log(`Package: ${out.package.human || 'not scanned (use --full)'}`);
|
|
182
|
-
console.log(`State: ${report.total_human || 'not scanned (use --full)'}`);
|
|
183
|
-
}
|
|
@@ -961,5 +961,5 @@ function missingMission(args) {
|
|
|
961
961
|
return result;
|
|
962
962
|
}
|
|
963
963
|
function routeForCommand(command) {
|
|
964
|
-
return command === 'ux-review' ? '$UX-Review' :
|
|
964
|
+
return command === 'ux-review' ? '$UX-Review' : '$Image-UX-Review';
|
|
965
965
|
}
|
|
@@ -11,7 +11,7 @@ export async function installPackageCommand(args = process.argv.slice(2)) {
|
|
|
11
11
|
process.exitCode = 2;
|
|
12
12
|
return;
|
|
13
13
|
}
|
|
14
|
-
console.log('SKS installer -
|
|
14
|
+
console.log('SKS installer - open-source trust layer for Codex CLI and ChatGPT Desktop');
|
|
15
15
|
const previousProbe = spawnSync('sks', ['--version'], { encoding: 'utf8' });
|
|
16
16
|
const previousVersion = previousProbe.status === 0
|
|
17
17
|
? extractSemVer(`${previousProbe.stdout || ''}\n${previousProbe.stderr || ''}`)
|
|
@@ -61,8 +61,8 @@ function dollarRouteFallback(value) {
|
|
|
61
61
|
const fallbacks = {
|
|
62
62
|
answer: 'help', plan: 'plan', review: 'review', work: 'naruto', 'release-review': 'review',
|
|
63
63
|
'commit-and-push': 'commit-and-push', 'super-search': 'super-search', 'seo-geo-optimizer': 'seo-geo-optimizer',
|
|
64
|
-
db: 'mad-sks', wiki: 'wiki', help: 'help', goal: '
|
|
65
|
-
autoresearch: '
|
|
64
|
+
db: 'mad-sks', wiki: 'wiki', help: 'help', goal: 'help', align: 'align', gx: 'gx', ppt: 'ppt',
|
|
65
|
+
autoresearch: 'research', research: 'research', 'qa-loop': 'qa-loop', 'image-ux-review': 'image-ux-review',
|
|
66
66
|
'computer-use': 'computer-use', dfix: 'dfix', naruto: 'naruto', commit: 'commit', sks: 'root'
|
|
67
67
|
};
|
|
68
68
|
const command = fallbacks[value];
|
|
@@ -4,6 +4,7 @@ import { projectRoot, readJson, readStdin } from '../fsx.js';
|
|
|
4
4
|
import { isClarificationAwaiting } from '../clarification-gate-state.js';
|
|
5
5
|
import { listSessionStates, loadMission, loadOwnedRouteState, missionDir, setCurrent } from '../mission.js';
|
|
6
6
|
import { PIPELINE_PLAN_ARTIFACT, pipelinePlanState, projectGateStatus, sealRouteClarification, writePipelinePlan } from '../pipeline.js';
|
|
7
|
+
import { buildProofField } from '../proof-field.js';
|
|
7
8
|
import { routePrompt } from '../routes.js';
|
|
8
9
|
import { positionalArgs } from '../../cli/args.js';
|
|
9
10
|
import { flag, readFlagValue, resolveMissionId } from './command-utils.js';
|
|
@@ -23,7 +24,7 @@ export async function pipelineCommand(args = []) {
|
|
|
23
24
|
return;
|
|
24
25
|
}
|
|
25
26
|
if (action === 'plan') {
|
|
26
|
-
if (
|
|
27
|
+
if (hasReplanFlags(args)) {
|
|
27
28
|
const positionals = positionalArgs(args.slice(1));
|
|
28
29
|
const missionArg = positionals[0] || state.mission_id || 'latest';
|
|
29
30
|
const id = await resolveMissionId(root, missionArg);
|
|
@@ -40,13 +41,20 @@ export async function pipelineCommand(args = []) {
|
|
|
40
41
|
force: flag(args, '--force-agents'),
|
|
41
42
|
noAgents: flag(args, '--no-agents')
|
|
42
43
|
};
|
|
44
|
+
const task = routeContext.task || mission.prompt || state.prompt || '';
|
|
45
|
+
const changedRaw = readFlagValue(args, '--changed', '');
|
|
46
|
+
const proofField = flag(args, '--proof-field')
|
|
47
|
+
? await buildProofField(root, { intent: task, changedFiles: changedRaw ? changedRaw.split(',').filter(Boolean) : undefined })
|
|
48
|
+
: undefined;
|
|
43
49
|
const plan = await writePipelinePlan(dir, {
|
|
44
50
|
missionId: id,
|
|
45
51
|
route,
|
|
46
|
-
task
|
|
52
|
+
task,
|
|
47
53
|
required: Boolean(routeContext.context7_required || state.context7_required),
|
|
48
54
|
ambiguity: { required: true, auto_sealed: true, status: 'auto_sealed' },
|
|
49
|
-
agents
|
|
55
|
+
agents,
|
|
56
|
+
proofField,
|
|
57
|
+
changedFiles: proofField?.changed_files
|
|
50
58
|
});
|
|
51
59
|
if (id === state.mission_id) {
|
|
52
60
|
await setCurrent(root, { mission_id: id, ...pipelinePlanState(plan) }, { sessionKey: state._session_key });
|
|
@@ -140,6 +148,6 @@ function printSessionTable(sessions = []) {
|
|
|
140
148
|
console.log(` ${row.session_key} ${row.mission_id || 'none'} ${row.route || '-'} ${row.phase || '-'}`);
|
|
141
149
|
}
|
|
142
150
|
}
|
|
143
|
-
function
|
|
144
|
-
return flag(args, '--force-agents') || flag(args, '--no-agents') || args.includes('--agents');
|
|
151
|
+
function hasReplanFlags(args = []) {
|
|
152
|
+
return flag(args, '--force-agents') || flag(args, '--no-agents') || args.includes('--agents') || flag(args, '--proof-field');
|
|
145
153
|
}
|
|
@@ -25,7 +25,7 @@ export async function planCommand(args = []) {
|
|
|
25
25
|
``,
|
|
26
26
|
`## Scope`,
|
|
27
27
|
`- Inspect the smallest relevant code and docs surface before editing.`,
|
|
28
|
-
`-
|
|
28
|
+
`- Keep the project's existing conventions, tests, and safety checks.`,
|
|
29
29
|
``,
|
|
30
30
|
`## Implementation Steps`,
|
|
31
31
|
`- Identify exact files and ownership boundaries.`,
|
|
@@ -33,8 +33,7 @@ export async function planCommand(args = []) {
|
|
|
33
33
|
`- Update focused tests or release checks for changed behavior.`,
|
|
34
34
|
``,
|
|
35
35
|
`## Acceptance Checks`,
|
|
36
|
-
`-
|
|
37
|
-
`- Relevant SKS gate/report is written and current.`,
|
|
36
|
+
`- The project's typecheck or build and the tests covering the change pass.`,
|
|
38
37
|
`- Final summary separates verified from unverified work.`,
|
|
39
38
|
``,
|
|
40
39
|
`## Rollback Plan`,
|
|
@@ -38,9 +38,6 @@ export async function researchCommand(sub, args = []) {
|
|
|
38
38
|
console.error('Usage: sks research <prepare|run|status>');
|
|
39
39
|
process.exitCode = 1;
|
|
40
40
|
}
|
|
41
|
-
export async function autoresearchCommand(sub, args = []) {
|
|
42
|
-
return researchCommand(sub || 'status', args);
|
|
43
|
-
}
|
|
44
41
|
const REMOVED_RESEARCH_RUNTIME_FLAGS = new Set([
|
|
45
42
|
'--native-proof-only',
|
|
46
43
|
'--legacy-research-cycle',
|
|
@@ -12,7 +12,7 @@ export async function reviewCommand(args = []) {
|
|
|
12
12
|
if (flag(args, '--json'))
|
|
13
13
|
return printJson(report);
|
|
14
14
|
ui.banner('review');
|
|
15
|
-
ui.ok('
|
|
15
|
+
ui.ok('no changes to review');
|
|
16
16
|
return report;
|
|
17
17
|
}
|
|
18
18
|
const machine = await runMachineChecks(root, diff);
|
|
@@ -5,11 +5,21 @@ import { flag, readOption } from './command-utils.js';
|
|
|
5
5
|
import { runSearchVisibilityApply, runSearchVisibilityAudit, runSearchVisibilityDoctor, runSearchVisibilityFixture, runSearchVisibilityPlan, runSearchVisibilityResearch, runSearchVisibilityRollback, runSearchVisibilityStatus, runSearchVisibilityStrategy, runSearchVisibilityVerify, resolveSearchVisibilityMission, } from '../search-visibility/index.js';
|
|
6
6
|
import { evaluateGate } from '../stop-gate/gate-evaluator.js';
|
|
7
7
|
import { evaluateLocalGate } from './route-success-helpers.js';
|
|
8
|
+
const SEO_GEO_USAGE = [
|
|
9
|
+
'Usage: sks seo-geo-optimizer [seo|geo] doctor|audit|research|strategy|plan|apply|verify|status|rollback|fixture [mission|latest] [--mode seo|geo] [--root <path>] [--url <origin>] [--target auto|website|docs|package] [--framework auto|next-app|next-pages|static] [--offline] [--strict] [--include-marketing] [--json]',
|
|
10
|
+
' sks seo-geo-optimizer research [mission|latest] [--offline] [--include-competitors --competitor <url>...] [--json]',
|
|
11
|
+
' sks seo-geo-optimizer strategy <mission|latest> [--json]',
|
|
12
|
+
' sks seo-geo-optimizer apply <mission|latest> --mode seo|geo --apply [--include-marketing] [--include-llms-txt] [--scope <rule-or-path,...>] [--yes] [--json]',
|
|
13
|
+
' sks seo-geo-optimizer rollback <mission|latest> --mode seo|geo --apply [--yes] [--json]'
|
|
14
|
+
];
|
|
15
|
+
export function usage() {
|
|
16
|
+
return SEO_GEO_USAGE.join('\n');
|
|
17
|
+
}
|
|
8
18
|
export async function seoGeoOptimizerCommand(args = []) {
|
|
9
19
|
const normalized = normalizeOptimizerArgs(args);
|
|
10
|
-
return runSearchVisibilityCommand(normalized.mode, normalized.args
|
|
20
|
+
return runSearchVisibilityCommand(normalized.mode, normalized.args);
|
|
11
21
|
}
|
|
12
|
-
export async function runSearchVisibilityCommand(mode, args = []
|
|
22
|
+
export async function runSearchVisibilityCommand(mode, args = []) {
|
|
13
23
|
const action = args[0] || 'doctor';
|
|
14
24
|
const rest = args.slice(1);
|
|
15
25
|
const options = await parseOptions(rest);
|
|
@@ -63,7 +73,7 @@ export async function runSearchVisibilityCommand(mode, args = [], displayCommand
|
|
|
63
73
|
else if (action === 'fixture')
|
|
64
74
|
result = await runSearchVisibilityFixture(mode, options);
|
|
65
75
|
else
|
|
66
|
-
return
|
|
76
|
+
return invalidSubcommand(mode);
|
|
67
77
|
result = await applySearchVisibilityGateResult(mode, action, result, options);
|
|
68
78
|
if (isBlocked(result))
|
|
69
79
|
process.exitCode = 1;
|
|
@@ -152,6 +162,7 @@ async function parseOptions(args) {
|
|
|
152
162
|
includeLlmsTxt: flag(args, '--include-llms-txt'),
|
|
153
163
|
includeMarketing: flag(args, '--include-marketing'),
|
|
154
164
|
includeCompetitors: flag(args, '--include-competitors'),
|
|
165
|
+
competitorUrls: readRepeated(args, '--competitor'),
|
|
155
166
|
strategyRef: readOption(args, '--strategy-ref', null),
|
|
156
167
|
maxMarketingSources: Number(readOption(args, '--max-marketing-sources', '4')) || 4,
|
|
157
168
|
observeQueries: flag(args, '--observe-queries'),
|
|
@@ -159,6 +170,14 @@ async function parseOptions(args) {
|
|
|
159
170
|
scope: String(readOption(args, '--scope', '') || '').split(',').map((item) => item.trim()).filter(Boolean),
|
|
160
171
|
};
|
|
161
172
|
}
|
|
173
|
+
function readRepeated(args, name) {
|
|
174
|
+
const out = [];
|
|
175
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
176
|
+
if (args[i] === name && args[i + 1])
|
|
177
|
+
out.push(...String(args[i + 1]).split(','));
|
|
178
|
+
}
|
|
179
|
+
return out.map((value) => value.trim()).filter(Boolean);
|
|
180
|
+
}
|
|
162
181
|
function targetOption(value) {
|
|
163
182
|
return ['auto', 'website', 'docs', 'package'].includes(value) ? value : 'auto';
|
|
164
183
|
}
|
|
@@ -166,7 +185,7 @@ function frameworkOption(value) {
|
|
|
166
185
|
return ['auto', 'next-app', 'next-pages', 'static', 'package', 'unsupported'].includes(value) ? value : 'auto';
|
|
167
186
|
}
|
|
168
187
|
function firstPositional(args) {
|
|
169
|
-
const valueFlags = new Set(['--root', '--url', '--target', '--framework', '--scope', '--query-file', '--strategy-ref', '--max-marketing-sources']);
|
|
188
|
+
const valueFlags = new Set(['--root', '--url', '--target', '--framework', '--scope', '--query-file', '--strategy-ref', '--max-marketing-sources', '--competitor']);
|
|
170
189
|
for (let i = 0; i < args.length; i += 1) {
|
|
171
190
|
const value = args[i] || '';
|
|
172
191
|
if (valueFlags.has(value)) {
|
|
@@ -178,22 +197,10 @@ function firstPositional(args) {
|
|
|
178
197
|
}
|
|
179
198
|
return null;
|
|
180
199
|
}
|
|
181
|
-
function
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
console.error(' sks seo-geo-optimizer strategy <mission|latest> [--json]');
|
|
186
|
-
console.error(' sks seo-geo-optimizer apply <mission|latest> --mode seo|geo --apply [--include-marketing] [--include-llms-txt] [--scope <rule-or-path,...>] [--yes] [--json]');
|
|
187
|
-
console.error(' sks seo-geo-optimizer rollback <mission|latest> --mode seo|geo --apply [--yes] [--json]');
|
|
188
|
-
process.exitCode = exitCode;
|
|
189
|
-
return { schema: 'sks.search-visibility.usage.v1', ok: false, status: 'blocked', mode, command: displayCommand, reason: 'invalid_subcommand' };
|
|
190
|
-
}
|
|
191
|
-
const applyFlag = mode === 'geo' ? ' [--include-llms-txt]' : '';
|
|
192
|
-
console.error(`Usage: sks ${mode} doctor|audit|research|strategy|plan|apply|verify|status|rollback|fixture [mission|latest] [--root <path>] [--url <origin>] [--target auto|website|docs|package] [--framework auto|next-app|next-pages|static] [--offline] [--strict] [--include-marketing] [--json]`);
|
|
193
|
-
console.error(` sks ${mode} apply <mission|latest> --apply${applyFlag} [--include-marketing] [--scope <rule-or-path,...>] [--yes] [--json]`);
|
|
194
|
-
console.error(` sks ${mode} rollback <mission|latest> --apply [--yes] [--json]`);
|
|
195
|
-
process.exitCode = exitCode;
|
|
196
|
-
return { schema: 'sks.search-visibility.usage.v1', ok: false, status: 'blocked', mode, reason: 'invalid_subcommand' };
|
|
200
|
+
function invalidSubcommand(mode) {
|
|
201
|
+
console.error(usage());
|
|
202
|
+
process.exitCode = 2;
|
|
203
|
+
return { schema: 'sks.search-visibility.usage.v1', ok: false, status: 'blocked', mode, command: 'seo-geo-optimizer', reason: 'invalid_subcommand' };
|
|
197
204
|
}
|
|
198
205
|
function isBlocked(value) {
|
|
199
206
|
if (!value || typeof value !== 'object')
|
|
@@ -4,6 +4,7 @@ import { listSessionStates, stateFile } from '../mission.js';
|
|
|
4
4
|
import { readRouteProof } from '../proof/proof-reader.js';
|
|
5
5
|
import { latestTrustReport } from '../trust-kernel/trust-report.js';
|
|
6
6
|
import { flag } from './command-utils.js';
|
|
7
|
+
import { stopFinalizationRitualsEnforced } from '../verification-profile.js';
|
|
7
8
|
export async function statusCommand(args = []) {
|
|
8
9
|
const root = await projectRoot();
|
|
9
10
|
const state = await readJson(stateFile(root), {});
|
|
@@ -23,7 +24,7 @@ export async function statusCommand(args = []) {
|
|
|
23
24
|
agent_status: proof?.evidence?.agents?.status || (state.agents_required === false ? 'not_required' : 'not_recorded'),
|
|
24
25
|
image_voxel_status: proof?.evidence?.image_voxels?.status || 'not_recorded',
|
|
25
26
|
db_safety_status: proof?.evidence?.db || proof?.evidence?.db_safety ? 'recorded' : 'not_recorded',
|
|
26
|
-
next_action: nextAction(state, trust, proof),
|
|
27
|
+
next_action: nextAction(state, trust, proof, stopFinalizationRitualsEnforced(root)),
|
|
27
28
|
sessions: sessions.map(sessionStatusRow),
|
|
28
29
|
files: missionId ? {
|
|
29
30
|
mission: path.join(root, '.sneakoscope', 'missions', missionId),
|
|
@@ -61,9 +62,14 @@ function printSessionTable(sessions = []) {
|
|
|
61
62
|
console.log(` ${row.session_key} ${row.mission_id || 'none'} ${row.route || '-'} ${row.phase || '-'}`);
|
|
62
63
|
}
|
|
63
64
|
}
|
|
64
|
-
function nextAction(state = {}, trust = {}, proof = {}) {
|
|
65
|
+
function nextAction(state = {}, trust = {}, proof = {}, strict = false) {
|
|
65
66
|
if (!state.mission_id)
|
|
66
67
|
return 'no active mission; ask Codex directly, or use $sks-plan or $sks-naruto';
|
|
68
|
+
if (!strict) {
|
|
69
|
+
return trust?.issues?.length
|
|
70
|
+
? `resolve trust blocker: ${trust.issues[0]}`
|
|
71
|
+
: 'finish the route and state what changed and what was verified';
|
|
72
|
+
}
|
|
67
73
|
if (!proof?.schema)
|
|
68
74
|
return `write completion proof for ${state.mission_id}`;
|
|
69
75
|
if (trust?.ok)
|
|
@@ -4,7 +4,7 @@ import path from 'node:path';
|
|
|
4
4
|
import { COMMAND_CATALOG } from '../routes.js';
|
|
5
5
|
import { nowIso, writeJsonAtomic } from '../fsx.js';
|
|
6
6
|
import { cleanupRemovedSksSkillResidue } from '../init/skills.js';
|
|
7
|
-
import { COMMANDS,
|
|
7
|
+
import { COMMANDS, COMMAND_ALIASES, commandNames } from '../../cli/command-registry.js';
|
|
8
8
|
import { REMOVED_PUBLIC_COMMANDS } from './retired-managed-residue-private.js';
|
|
9
9
|
import { reconcileRetiredManagedResidue, RETIRED_MANAGED_RESIDUE_SCHEMA } from './retired-managed-residue.js';
|
|
10
10
|
import { CURRENT_PROJECT_GUIDANCE_SCHEMA, reconcileCurrentProjectGuidance } from './current-project-guidance.js';
|
|
@@ -121,15 +121,15 @@ function aggregateAgentBridgeManifest(reports) {
|
|
|
121
121
|
}
|
|
122
122
|
export function commandAliasCleanupReport(opts, skillResidue = emptySkillResidue(Boolean(opts.fix)), managedResidue = emptyManagedResidue(Boolean(opts.fix)), projectGuidance = emptyProjectGuidance(Boolean(opts.fix)), skillLegacySurface = emptySkillLegacySurface(Boolean(opts.fix))) {
|
|
123
123
|
const root = opts.root;
|
|
124
|
-
const
|
|
124
|
+
const aliases = Object.entries(COMMAND_ALIASES).map(([alias, canonical]) => ({ alias, canonical }));
|
|
125
125
|
const registeredRemovedCommands = REMOVED_PUBLIC_COMMANDS
|
|
126
126
|
.filter((name) => Object.prototype.hasOwnProperty.call(COMMANDS, name));
|
|
127
127
|
const catalogRemovedCommands = REMOVED_PUBLIC_COMMANDS
|
|
128
128
|
.filter((name) => COMMAND_CATALOG.some((row) => row.name === name));
|
|
129
129
|
const redirectingRemovedCommands = REMOVED_PUBLIC_COMMANDS
|
|
130
|
-
.filter((name) => Object.prototype.hasOwnProperty.call(
|
|
130
|
+
.filter((name) => Object.prototype.hasOwnProperty.call(COMMAND_ALIASES, name));
|
|
131
131
|
const canonical = commandNames();
|
|
132
|
-
const missingCanonicalTargets =
|
|
132
|
+
const missingCanonicalTargets = aliases
|
|
133
133
|
.filter((entry) => !canonical.includes(entry.canonical))
|
|
134
134
|
.map((entry) => `${entry.alias}->${entry.canonical}`);
|
|
135
135
|
const blockers = [
|
|
@@ -161,8 +161,8 @@ export function commandAliasCleanupReport(opts, skillResidue = emptySkillResidue
|
|
|
161
161
|
fix: Boolean(opts.fix),
|
|
162
162
|
report_path: path.join(root, '.sneakoscope', 'reports', 'command-alias-cleanup.json'),
|
|
163
163
|
canonical_command_count: canonical.length,
|
|
164
|
-
current_alias_count:
|
|
165
|
-
aliases
|
|
164
|
+
current_alias_count: aliases.length,
|
|
165
|
+
aliases,
|
|
166
166
|
detected: {
|
|
167
167
|
retired_registry_entry_count: registeredRemovedCommands.length,
|
|
168
168
|
retired_catalog_entry_count: catalogRemovedCommands.length,
|
package/dist/core/evaluation.js
CHANGED
|
@@ -364,7 +364,7 @@ export function defaultEvaluationScenario() {
|
|
|
364
364
|
['req-wiki-rgba', 'TriWiki stores RGBA-derived trigonometric wiki anchors so compressed context remains hydratable by id, hash, source, and coordinate.', 'code', 'high', 1.2],
|
|
365
365
|
['req-retention', 'runtime logs and mission artifacts are bounded through retention policy and sks gc.', 'code', 'medium', 0.85],
|
|
366
366
|
['req-selftest', 'selftest covers contract sealing, DB guard blocking, done-gate evaluation, GX render/validate/drift, snapshot, and retention report.', 'test', 'high', 1.1],
|
|
367
|
-
['req-skill', 'sks
|
|
367
|
+
['req-skill', 'sks setup installs one canonical repo-local Codex App skill set under .agents/skills so project workflows can trigger domain-specific guidance without duplicate commands.', 'code', 'medium', 0.9],
|
|
368
368
|
['req-design', 'design artifact work should gather design context, build an HTML artifact, expose variations when useful, and verify rendered output.', 'code', 'medium', 0.8]
|
|
369
369
|
];
|
|
370
370
|
const noise = [
|
|
@@ -37,15 +37,11 @@ const FIXTURES = Object.freeze({
|
|
|
37
37
|
'cli-mcp': fixture('execute', 'sks mcp config list --scope project --trusted-project --json', [], 'pass', {
|
|
38
38
|
reason: 'Project-scoped MCP inventory is a read-only, hermetic runtime probe when the trusted-project boundary is explicit; mutation, health, auth, and merge behavior remain covered by dedicated tests.'
|
|
39
39
|
}),
|
|
40
|
-
'cli-remote': fixture('real_optional', 'sks remote readiness --json', [], 'pass', {
|
|
41
|
-
reason: 'Remote readiness is environment-dependent on the official Codex host and local project capabilities; SSH worker behavior is covered by dedicated hermetic protocol and policy tests.'
|
|
42
|
-
}),
|
|
43
40
|
'cli-hooks': fixture('execute', 'sks hooks trust-report --json', [], 'pass'),
|
|
44
41
|
'cli-commands': fixture('execute', 'sks commands --json', [], 'pass'),
|
|
45
42
|
'cli-plan': fixture('execute', 'sks plan "fixture" --json', [], 'pass'),
|
|
46
43
|
'cli-review': fixture('execute', 'sks review --diff HEAD --json', [], 'pass'),
|
|
47
44
|
'cli-status': fixture('execute', 'sks status --json', [], 'pass'),
|
|
48
|
-
'cli-usage': fixture('execute', 'sks usage overview', [], 'pass'),
|
|
49
45
|
'cli-quickstart': fixture('execute', 'sks quickstart', [], 'pass'),
|
|
50
46
|
'cli-install': fixture('static', 'npm exec --yes --package=sneakoscope@latest -- sneakoscope install --yes', [], 'pass', {
|
|
51
47
|
quality: 'wiring_only',
|
|
@@ -55,15 +51,12 @@ const FIXTURES = Object.freeze({
|
|
|
55
51
|
'cli-update-check': fixture('static', 'sks update-check --json', [], 'pass'),
|
|
56
52
|
'cli-guard': fixture('execute', 'sks guard check --json', [], 'pass'),
|
|
57
53
|
'cli-conflicts': fixture('execute', 'sks conflicts check --json', [], 'pass'),
|
|
58
|
-
'cli-aliases': fixture('execute', 'sks aliases', [], 'pass'),
|
|
59
|
-
'cli-fix-path': fixture('execute', 'sks fix-path --json', [], 'pass'),
|
|
60
54
|
'cli-wiki-code': fixture('execute_and_validate_artifacts', 'sks align run --token-budget 20000 --json', [{ path: '.sneakoscope/wiki/code-pack.json', schema: 'sks.code-pack.v1', optional: true }], 'pass'),
|
|
61
55
|
'cli-agent-bridge': fixture('execute_and_validate_artifacts', 'sks agent-bridge setup --json', [{ path: '.sneakoscope/agent-bridge/manifest.json', schema: 'sks.agent-manifest.v2', optional: true }], 'pass'),
|
|
62
56
|
'cli-mcp-server': fixture('execute', 'sks mcp-server --probe', [], 'pass'),
|
|
63
57
|
'cli-selftest': fixture('execute', 'sks selftest --mock', [], 'pass'),
|
|
64
58
|
'cli-git': fixture('execute', 'sks git policy --json', [], 'pass'),
|
|
65
59
|
'cli-uninstall': fixture('execute', 'sks uninstall --dry-run --json', [], 'pass'),
|
|
66
|
-
'cli-goal': fixture('execute', 'sks goal create "Fixture smoke: create a minimal Node.js CLI health-check script" --json', [], 'pass', { reason: 'The compatibility command is stateless: it prints a detailed Codex native /goal request and writes no SKS mission, artifact, loop, or fallback state.' }),
|
|
67
60
|
'cli-align': fixture('execute_and_validate_artifacts', 'sks align prepare "fixture modernization contract" --json', ['work-order-ledger.json', 'align-plan.json', 'align-ledger.json', 'align-gate.json'], 'pass', {
|
|
68
61
|
reason: 'The CLI fixture exercises the real hermetic preparation path, including literal-request work-order registration. It intentionally leaves align-gate.json blocked because no external modernization work is fabricated.'
|
|
69
62
|
}),
|
|
@@ -74,43 +67,34 @@ const FIXTURES = Object.freeze({
|
|
|
74
67
|
'cli-image-ux-review': fixture('execute_and_validate_artifacts', 'sks image-ux-review fixture --mock --json', ['completion-proof.json', 'image-voxel-ledger.json', 'image-ux-generated-review-ledger.json'], 'blocked', { reason: 'Same as route-image-ux-review: the image-ux-review fixture command intentionally always exits 1 by design (honest mock, cannot claim a real completion), even though it does write all declared artifacts.' }),
|
|
75
68
|
'cli-computer-use': fixture('real_optional', 'sks computer-use status --json', [], 'pass'),
|
|
76
69
|
'cli-pipeline': fixture('execute_and_validate_artifacts', 'sks pipeline plan latest --agents 1 --json', ['pipeline-plan.json'], 'pass'),
|
|
77
|
-
'cli-recallpulse': fixture('execute_and_validate_artifacts', 'sks recallpulse run latest --json', ['mission-status-ledger.json'], 'pass'),
|
|
78
70
|
'cli-gx': fixture('execute_and_validate_artifacts', 'sks gx validate fixture --mock', ['gx-validation.json'], 'blocked', { reason: 'gxValidateFixture() intentionally exits non-zero (execution_class: mock_fixture) for an honest mock/blocked result; without --mock the command crashes on a missing cartridge instead.' }),
|
|
79
|
-
'cli-code-structure': fixture('execute', 'sks code-structure scan --json', [], 'pass', { timeout_ms: 180000 }),
|
|
80
71
|
'cli-decision': fixture('execute', 'sks decision status --json', [], 'pass'),
|
|
81
72
|
'cli-imagegen': fixture('execute', 'sks imagegen status --json', [], 'pass'),
|
|
82
|
-
'cli-skill-dream': fixture('execute', 'sks skill-dream status --json', [], 'pass'),
|
|
83
73
|
'cli-gc': fixture('execute', 'sks gc --dry-run --json', [], 'pass'),
|
|
84
74
|
'cli-eval': fixture('execute', 'sks eval run --mock --json', [], 'pass'),
|
|
85
75
|
'cli-cleanup': fixture('execute', 'sks cleanup plan --json', [], 'pass', {
|
|
86
76
|
reason: 'Destructive blank-state apply stays behind explicit `sks cleanup run --apply`; the contract fixture only exercises the read-only plan surface.'
|
|
87
77
|
}),
|
|
88
|
-
'cli-memory': fixture('execute', 'sks memory --dry-run --json', [], 'pass', { timeout_ms: 300000 }),
|
|
89
|
-
'cli-stats': fixture('execute', 'sks stats --json', [], 'pass'),
|
|
78
|
+
'cli-memory': fixture('execute', 'sks memory gc --dry-run --json', [], 'pass', { timeout_ms: 300000 }),
|
|
90
79
|
'cli-dollar-commands': fixture('execute', 'sks dollar-commands --json', [], 'pass'),
|
|
91
80
|
'cli-fast-mode': fixture('execute', 'sks fast-mode status --json', [], 'pass'),
|
|
92
81
|
'cli-dfix': fixture('execute_and_validate_artifacts', 'sks dfix fixture --json', ['completion-proof.json', 'dfix-gate.json', 'dfix-verification.json'], 'pass'),
|
|
93
82
|
'cli-wiki': fixture('execute_and_validate_artifacts', 'sks wiki image-ingest test/fixtures/images/one-by-one.png --json', [{ path: '.sneakoscope/wiki/image-voxel-ledger.json', schema: 'sks.image-voxel-ledger.v1', require_anchors: false }], 'pass'),
|
|
94
|
-
'cli-bootstrap': fixture('
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
'cli-codex-native': fixture('execute', 'sks codex-native status --json', [], 'pass'),
|
|
98
|
-
'cli-mad': fixture('execute', 'sks mad --help', [], 'pass'),
|
|
83
|
+
'cli-bootstrap': fixture('real_optional', 'sks bootstrap --json', [], 'pass', {
|
|
84
|
+
reason: 'Bootstrap is real project setup (`setup --local-only`) and refuses --dry-run, so it runs only on opt-in real runs.'
|
|
85
|
+
}),
|
|
99
86
|
'cli-mad-sks': fixture('static', 'sks mad-sks status --json', [], 'pass'),
|
|
100
|
-
'cli-auto-review': fixture('execute', 'sks auto-review status --json', [], 'pass'),
|
|
101
87
|
'cli-commit': fixture('mock', 'sks commit --dry-run', [], 'pass', {
|
|
102
|
-
reason: '
|
|
88
|
+
reason: '`--dry-run` prints the commit plan without touching git (simpleGitCommitPlan in git-simple.ts, covered by git-simple-dry-run.test.ts); the fixture stays mock because the hermetic fixture project is not a git repository.'
|
|
103
89
|
}),
|
|
104
90
|
'cli-commit-and-push': fixture('mock', 'sks commit-and-push --dry-run', [], 'pass', {
|
|
105
|
-
reason: 'Same
|
|
91
|
+
reason: 'Same handler as cli-commit plus a push; `--dry-run` prints the plan only. Mock for the same reason as cli-commit.'
|
|
106
92
|
}),
|
|
107
93
|
'cli-context7': fixture('real_optional', 'sks context7 check --json', [], 'pass'),
|
|
108
94
|
'cli-super-search': fixture('execute', 'sks super-search doctor --json', [], 'pass'),
|
|
109
95
|
'cli-search': fixture('execute', 'sks search status --json', [], 'pass'),
|
|
110
96
|
'cli-triwiki': fixture('execute', 'sks triwiki index --json', [], 'pass'),
|
|
111
|
-
'cli-init': fixture('execute', 'sks init --local-only --dry-run', [], 'pass'),
|
|
112
97
|
'cli-naruto': fixture('execute_and_validate_artifacts', 'sks naruto run "fixture" --agents 4 --max-threads 4 --json', ['subagent-plan.json', 'subagent-events.jsonl', 'subagent-evidence.json', 'naruto-summary.json', 'naruto-gate.json', 'work-order-ledger.json'], 'pass', preparationFixtureContract()),
|
|
113
|
-
'cli-reasoning': fixture('execute', 'sks reasoning status --json', [], 'pass'),
|
|
114
98
|
'skill-db-safety-guard': fixture('execute', 'node --test test/unit/db-safety.test.mjs', [], 'pass', { root_mode: 'source_checkout_required' }),
|
|
115
99
|
'skill-honest-mode': fixture('execute_and_validate_artifacts', 'sks proof smoke --json', ['completion-proof.json', 'trust-report.json'], 'pass'),
|
|
116
100
|
'skill-imagegen': fixture('execute_and_validate_artifacts', 'sks image-ux-review fixture --mock --json', ['image-ux-generated-review-ledger.json', 'image-voxel-ledger.json'], 'pass'),
|
|
@@ -124,9 +108,6 @@ const FIXTURES = Object.freeze({
|
|
|
124
108
|
'skill-context7-docs': fixture('real_optional', 'sks context7 check --json', [], 'pass'),
|
|
125
109
|
'skill-seo-geo-optimizer': fixture('execute_and_validate_artifacts', 'sks seo-geo-optimizer fixture --mode geo --json', ['search-visibility/site-inventory.json', 'search-visibility/geo-findings.json', 'geo-gate.json', 'completion-proof.json'], 'pass'),
|
|
126
110
|
'cli-proof': fixture('execute_and_validate_artifacts', 'sks proof smoke --json', ['.sneakoscope/proof/latest.json'], 'pass'),
|
|
127
|
-
'cli-wrongness': fixture('execute', 'sks wrongness validate project --json', [], 'pass', {
|
|
128
|
-
reason: 'Release fixtures must not add synthetic project-wide wrongness records. The read-only validator exercises the CLI and ledger schema without contaminating trust state for later route proofs.'
|
|
129
|
-
}),
|
|
130
111
|
'route-naruto': fixture('execute_and_validate_artifacts', 'sks naruto run "fixture" --agents 4 --max-threads 4 --json', ['subagent-plan.json', 'subagent-events.jsonl', 'subagent-evidence.json', 'naruto-summary.json', 'naruto-gate.json', 'work-order-ledger.json'], 'pass', preparationFixtureContract({ timeout_ms: 90000 })),
|
|
131
112
|
'route-work': fixture('static', '$Work compatibility alias for the Naruto Codex official subagent workflow', [], 'pass', { quality: 'wiring_only', reason: 'Pure alias of $Naruto; official workflow execution is covered by route-naruto.' }),
|
|
132
113
|
'route-plan': fixture('execute', 'sks plan "fixture" --json', [], 'pass'),
|
|
@@ -187,39 +168,24 @@ const FIXTURES = Object.freeze({
|
|
|
187
168
|
reason: 'Pure alias of the cli-help command; no independent behavior to verify beyond cli-help\'s own execute fixture.'
|
|
188
169
|
}),
|
|
189
170
|
'route-commit': fixture('mock', '$Commit git route', ['completion-proof.json'], 'pass', {
|
|
190
|
-
reason: 'Dollar-command alias of cli-commit;
|
|
171
|
+
reason: 'Dollar-command alias of cli-commit; documented mock alongside cli-commit.'
|
|
191
172
|
}),
|
|
192
173
|
'route-commit-and-push': fixture('mock', '$Commit-And-Push git route', ['completion-proof.json'], 'pass', {
|
|
193
|
-
reason: 'Dollar-command alias of cli-commit-and-push;
|
|
174
|
+
reason: 'Dollar-command alias of cli-commit-and-push; documented mock alongside cli-commit-and-push.'
|
|
194
175
|
}),
|
|
195
176
|
'route-release-review': fixture('execute_and_validate_artifacts', 'sks naruto run "$Release-Review release audit" --agents 3 --max-threads 3 --read-only --json', ['subagent-plan.json', 'subagent-events.jsonl', 'subagent-evidence.json', 'naruto-summary.json', 'naruto-gate.json', 'work-order-ledger.json'], 'pass', preparationFixtureContract({ timeout_ms: 90000 })),
|
|
196
177
|
'proof-official-subagent-evidence': fixture('execute_and_validate_artifacts', 'sks naruto run "fixture" --agents 2 --max-threads 2 --json', ['subagent-plan.json', 'subagent-events.jsonl', 'subagent-parent-summary.json', 'subagent-evidence.json', 'naruto-gate.json'], 'pass', preparationFixtureContract({ timeout_ms: 90000 }))
|
|
197
178
|
});
|
|
198
179
|
const STATIC_CONTRACT_FEATURES = new Set([
|
|
199
180
|
'cli-bootstrap',
|
|
200
|
-
'cli-deps',
|
|
201
|
-
'cli-auth',
|
|
202
|
-
'cli-codex-native',
|
|
203
|
-
'cli-mad',
|
|
204
|
-
'cli-auto-review',
|
|
205
181
|
'cli-commit',
|
|
206
182
|
'cli-commit-and-push',
|
|
207
183
|
'cli-context7',
|
|
208
184
|
'cli-naruto',
|
|
209
|
-
'cli-reasoning',
|
|
210
185
|
'cli-postinstall',
|
|
211
186
|
'cli-menubar',
|
|
212
187
|
'cli-route',
|
|
213
|
-
'cli-
|
|
214
|
-
'cli-hook',
|
|
215
|
-
'handler-$',
|
|
216
|
-
'handler-autoresearch',
|
|
217
|
-
'handler-autoreview',
|
|
218
|
-
'handler-computer-use',
|
|
219
|
-
'handler-cu',
|
|
220
|
-
'handler-dollars',
|
|
221
|
-
'handler-mad-sks',
|
|
222
|
-
'handler-postinstall'
|
|
188
|
+
'cli-hook'
|
|
223
189
|
]);
|
|
224
190
|
export function fixtureForFeature(featureId) {
|
|
225
191
|
const fixtures = FIXTURES;
|