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.
Files changed (105) hide show
  1. package/README.md +2 -2
  2. package/config/perf-budgets.v1.json +1 -2
  3. package/config/skills-hash-ledger.v1.json +7 -2
  4. package/crates/sks-core/Cargo.lock +1 -1
  5. package/crates/sks-core/Cargo.toml +1 -1
  6. package/dist/bin/sks-dispatch.js +6 -3
  7. package/dist/cli/args.js +3 -1
  8. package/dist/cli/command-manifest-lite.js +48 -114
  9. package/dist/cli/command-registry.js +1 -18
  10. package/dist/cli/commands-fast.js +11 -4
  11. package/dist/cli/help-fast.js +11 -22
  12. package/dist/cli/help.js +3 -3
  13. package/dist/cli/install-helpers.js +1 -1
  14. package/dist/cli/router.js +12 -26
  15. package/dist/commands/codex-app.js +2 -2
  16. package/dist/commands/doctor-helpers.js +1 -1
  17. package/dist/commands/mad-sks.js +2 -2
  18. package/dist/config/skills-manifest.json +13 -8
  19. package/dist/core/agent-bridge/async-command.js +2 -2
  20. package/dist/core/agents/agent-recursion-guard.js +0 -2
  21. package/dist/core/auto-review.js +15 -172
  22. package/dist/core/code-structure.js +0 -1
  23. package/dist/core/codex-control/codex-reliability-shield.js +64 -15
  24. package/dist/core/codex-control/codex-sdk-adapter.js +38 -5
  25. package/dist/core/commands/agent-bridge-command.js +1 -1
  26. package/dist/core/commands/basic-cli.js +60 -233
  27. package/dist/core/commands/command-utils.js +1 -1
  28. package/dist/core/commands/gc-command.js +30 -29
  29. package/dist/core/commands/image-ux-review-command.js +1 -1
  30. package/dist/core/commands/install-package-command.js +1 -1
  31. package/dist/core/commands/intent-normalization/normalizer.js +2 -2
  32. package/dist/core/commands/pipeline-command.js +13 -5
  33. package/dist/core/commands/plan-command.js +2 -3
  34. package/dist/core/commands/research-command.js +0 -3
  35. package/dist/core/commands/review-command.js +1 -1
  36. package/dist/core/commands/seo-command.js +27 -20
  37. package/dist/core/commands/status-command.js +8 -2
  38. package/dist/core/doctor/command-alias-cleanup.js +6 -6
  39. package/dist/core/evaluation.js +1 -1
  40. package/dist/core/feature-fixtures.js +9 -43
  41. package/dist/core/feature-registry.js +9 -27
  42. package/dist/core/git-hygiene/shared-memory-publish.js +1 -1
  43. package/dist/core/hooks-runtime/stop-repeat-guard.js +0 -13
  44. package/dist/core/init/skills.js +5 -13
  45. package/dist/core/init.js +0 -9
  46. package/dist/core/install/installed-package-smoke.js +3 -1
  47. package/dist/core/perf/import-graph-budget.js +0 -1
  48. package/dist/core/perf/release-latency-slo.js +2 -30
  49. package/dist/core/pipeline-internals/pipeline-stage-builder.js +2 -4
  50. package/dist/core/pipeline-internals/runtime-core.js +2 -38
  51. package/dist/core/proof/route-proof-policy.js +2 -4
  52. package/dist/core/proof/runtime-truth-matrix.js +2 -2
  53. package/dist/core/proof-field.js +104 -39
  54. package/dist/core/questions.js +11 -7
  55. package/dist/core/release/gate-affected-globs.js +0 -2
  56. package/dist/core/research/research-reviewer-contract.js +34 -0
  57. package/dist/core/research/research-work-graph.js +1 -1
  58. package/dist/core/research.js +1 -1
  59. package/dist/core/routes/constants.js +0 -1
  60. package/dist/core/routes/diagnostic-allowlist.js +1 -3
  61. package/dist/core/routes/light-routes.js +1 -2
  62. package/dist/core/routes.js +1 -1
  63. package/dist/core/safety/command-contract/contracts.js +5 -1
  64. package/dist/core/search-visibility/marketing-truthfulness.js +10 -7
  65. package/dist/core/search-visibility/marketing.js +194 -149
  66. package/dist/core/skill-forge.js +1 -361
  67. package/dist/core/strategy/adhd-orchestrating-gate.js +3 -3
  68. package/dist/core/triwiki/context-graph/extractors/topology/commands.js +2 -6
  69. package/dist/core/triwiki-wrongness/wrongness-cli.js +9 -27
  70. package/dist/core/version.js +1 -1
  71. package/package.json +1 -2
  72. package/release-gates.v2.json +1 -32
  73. package/dist/cli/recallpulse-command.js +0 -144
  74. package/dist/commands/auto-review.js +0 -5
  75. package/dist/commands/codex-native.js +0 -77
  76. package/dist/commands/recallpulse.js +0 -5
  77. package/dist/core/codex-native/codex-native-interop-policy.js +0 -127
  78. package/dist/core/commands/autoresearch-command.js +0 -4
  79. package/dist/core/commands/code-structure-command.js +0 -52
  80. package/dist/core/commands/goal-command.js +0 -43
  81. package/dist/core/commands/recallpulse-command.js +0 -4
  82. package/dist/core/commands/remote-command.js +0 -119
  83. package/dist/core/commands/skill-dream-command.js +0 -43
  84. package/dist/core/commands/wrongness-command.js +0 -2
  85. package/dist/core/goal-workflow.js +0 -80
  86. package/dist/core/mcp/mcp-tool-name-normalizer.js +0 -28
  87. package/dist/core/recallpulse/policy.js +0 -207
  88. package/dist/core/recallpulse.js +0 -947
  89. package/dist/core/remote/audit-idempotency.js +0 -241
  90. package/dist/core/remote/index.js +0 -10
  91. package/dist/core/remote/machine-registry.js +0 -167
  92. package/dist/core/remote/owner-proof.js +0 -216
  93. package/dist/core/remote/protocol.js +0 -249
  94. package/dist/core/remote/readiness.js +0 -156
  95. package/dist/core/remote/session-index.js +0 -61
  96. package/dist/core/remote/session-snapshot.js +0 -197
  97. package/dist/core/remote/ssh-worker-client.js +0 -377
  98. package/dist/core/remote/types.js +0 -10
  99. package/dist/core/remote/worker.js +0 -360
  100. package/dist/core/search/context-graph-seeds.js +0 -15
  101. package/dist/core/verification/context-graph-affected.js +0 -312
  102. package/dist/core/verification/verification-artifact-lock.js +0 -21
  103. package/dist/core/verification/verification-dag.js +0 -89
  104. package/dist/core/verification/verification-result.js +0 -19
  105. 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
- return gcCommand(sub ? [sub, ...(args || [])] : (args || []));
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('ㅅㅋㅅ GC plan');
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('ㅅㅋㅅ GC apply blocked: pass --yes after reviewing `sks gc plan --json`.');
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 ? 'ㅅㅋㅅ GC applied' : 'ㅅㅋㅅ GC apply blocked');
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 res = await retentionStatus(root);
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(res, null, 2));
120
- console.log('ㅅㅋㅅ GC status');
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
- return res;
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') ? 'ㅅㅋㅅ GC dry run' : 'ㅅㅋㅅ GC completed');
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 latest mission index, plan, cleanup, and storage status.'
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' : command === 'visual-review' ? '$Visual-Review' : command === 'ui-ux-review' ? '$UI-UX-Review' : '$Image-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 - proof-first Codex harness');
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: 'goal', align: 'align', gx: 'gx', ppt: 'ppt',
65
- autoresearch: 'autoresearch', research: 'research', 'qa-loop': 'qa-loop', 'image-ux-review': 'image-ux-review',
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 (hasAgentPlanFlags(args)) {
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: routeContext.task || mission.prompt || state.prompt || '',
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 hasAgentPlanFlags(args = []) {
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
- `- Preserve existing SKS proof-first gates and lean-engineering policy.`,
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
- `- Typecheck or targeted build passes.`,
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, 'seo-geo-optimizer');
20
+ return runSearchVisibilityCommand(normalized.mode, normalized.args);
11
21
  }
12
- export async function runSearchVisibilityCommand(mode, args = [], displayCommand = mode) {
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 usage(mode, 2, displayCommand);
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 usage(mode, exitCode, displayCommand = mode) {
182
- if (displayCommand === 'seo-geo-optimizer') {
183
- console.error('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]');
184
- console.error(' sks seo-geo-optimizer research [mission|latest] [--offline] [--include-competitors] [--json]');
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, LEGACY_COMMAND_ALIASES, commandNames } from '../../cli/command-registry.js';
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 legacyAliases = Object.entries(LEGACY_COMMAND_ALIASES).map(([alias, canonical]) => ({ alias, canonical }));
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(LEGACY_COMMAND_ALIASES, name));
130
+ .filter((name) => Object.prototype.hasOwnProperty.call(COMMAND_ALIASES, name));
131
131
  const canonical = commandNames();
132
- const missingCanonicalTargets = legacyAliases
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: legacyAliases.length,
165
- aliases: legacyAliases,
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,
@@ -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 init 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],
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('execute', 'sks bootstrap --dry-run', [], 'pass'),
95
- 'cli-deps': fixture('execute', 'sks deps check --json', [], 'pass'),
96
- 'cli-auth': fixture('execute', 'sks auth status --json', [], 'pass'),
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: 'simpleGitCommitCommand() in git-simple.ts performs a real `git add -A && git commit` against whatever repo cwd it runs in; it has no --dry-run implementation (argValue() only reads --message/-m/--json, so --dry-run is silently ignored) and would mutate git history if actually spawned by an automated fixture runner. Left as documented mock rather than execute a real commit or invent an unsupported --dry-run mode.'
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 underlying simpleGitCommitCommand() as cli-commit plus a real `git push`; genuinely destructive (commits and pushes to the remote) with no real --dry-run support. Left as documented mock rather than execute a real commit+push or invent an unsupported --dry-run mode.'
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; dispatches to the same simpleGitCommitCommand() that performs a real `git add -A && git commit` with no working --dry-run mode, so it is not safe to execute from an automated fixture runner. Left as documented mock alongside 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; dispatches to the same simpleGitCommitCommand() that performs a real commit and `git push` with no working --dry-run mode. Left as documented mock alongside 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-autoresearch',
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;