sneakoscope 5.7.0 → 5.8.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 +1 -1
- 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/sks.js +1 -1
- package/dist/cli/command-registry.js +1 -2
- package/dist/cli/{insane-search-command.js → super-search-command.js} +96 -55
- package/dist/cli/xai-command.js +7 -7
- package/dist/config/skills-manifest.json +63 -70
- package/dist/core/agents/agent-codex-cockpit.js +3 -3
- package/dist/core/agents/agent-orchestrator.js +20 -2
- package/dist/core/agents/agent-wrongness.js +1 -1
- package/dist/core/agents/native-cli-session-swarm.js +14 -1
- package/dist/core/agents/parallel-runtime-proof.js +82 -8
- package/dist/core/commands/gc-command.js +12 -6
- package/dist/core/commands/run-command.js +20 -18
- package/dist/core/feature-fixtures.js +15 -8
- package/dist/core/fsx.js +1 -1
- package/dist/core/init/skills.js +1 -2
- package/dist/core/mission.js +41 -15
- package/dist/core/release-parallel-full-coverage.js +1 -1
- package/dist/core/retention.js +1 -1
- package/dist/core/routes/constants.js +2 -2
- package/dist/core/routes.js +150 -52
- package/dist/core/source-intelligence/source-intelligence-policy.js +5 -5
- package/dist/core/source-intelligence/source-intelligence-proof.js +8 -8
- package/dist/core/source-intelligence/source-intelligence-runner.js +16 -16
- package/dist/core/strategy/strategy-gate.js +2 -1
- package/dist/core/super-search/runtime-helpers.js +289 -0
- package/dist/core/super-search/runtime.js +259 -0
- package/dist/core/super-search/source-records.js +96 -0
- package/dist/core/super-search/types.js +3 -0
- package/dist/core/trust-kernel/trust-report.js +3 -3
- package/dist/core/verification/real-evidence-policy.js +55 -0
- package/dist/core/version.js +1 -1
- package/dist/scripts/agent-visual-consistency-check.js +1 -1
- package/dist/scripts/check-architecture.js +0 -1
- package/dist/scripts/mutation-callsite-coverage-check.js +7 -0
- package/dist/scripts/release-metadata-1-19-check.js +2 -2
- package/dist/scripts/release-parallel-check.js +2 -2
- package/dist/scripts/release-parallel-full-coverage-check.js +1 -1
- package/dist/scripts/sks-1-18-gate-lib.js +2 -2
- package/dist/scripts/source-intelligence-all-modes-check.js +2 -2
- package/dist/scripts/source-intelligence-policy-check.js +1 -1
- package/dist/scripts/super-search-name-guard-check.js +98 -0
- package/dist/scripts/{ultra-search-provider-interface-check.js → super-search-provider-interface-check.js} +9 -9
- package/dist/scripts/trust-fixture-check.js +19 -6
- package/package.json +9 -3
- package/schemas/agents/parallel-runtime-proof.schema.json +17 -1
- package/dist/core/ultra-search/runtime.js +0 -502
- package/dist/core/ultra-search/types.js +0 -3
- package/dist/scripts/release-readiness-report.js +0 -1262
- /package/dist/core/{ultra-search → super-search}/index.js +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { appendJsonlBounded, ensureDir, nowIso, readJson, readText, writeJsonAtomic } from '../fsx.js';
|
|
3
3
|
export const PARALLEL_RUNTIME_EVENT_SCHEMA = 'sks.parallel-runtime-event.v1';
|
|
4
|
-
export const PARALLEL_RUNTIME_PROOF_SCHEMA = 'sks.parallel-runtime-proof.
|
|
4
|
+
export const PARALLEL_RUNTIME_PROOF_SCHEMA = 'sks.parallel-runtime-proof.v2';
|
|
5
5
|
export function parallelRuntimeEventPath(root, missionId) {
|
|
6
6
|
return path.join(inferAgentsDir(root, missionId), 'parallel-runtime.events.jsonl');
|
|
7
7
|
}
|
|
@@ -100,7 +100,7 @@ export async function buildParallelRuntimeProof(root, missionId, opts = {}) {
|
|
|
100
100
|
? workerDurations.reduce((sum, value) => sum + value, 0)
|
|
101
101
|
: requestedWorkers * positiveInt(opts.expectedWorkerRuntimeMs, 4000);
|
|
102
102
|
const visiblePanes = nonNegativeInt(opts.visiblePanes, sorted.filter((event) => event.placement === 'zellij-pane').length ? new Set(sorted.filter((event) => event.placement === 'zellij-pane').map((event) => event.slot_id || event.session_id || '')).size : 0);
|
|
103
|
-
const observedHeadlessWorkers = sorted.filter((event) => event.placement === 'headless' && (event.event_type === 'worker_launch_invoked' || event.event_type === 'worker_process_spawned')).length;
|
|
103
|
+
const observedHeadlessWorkers = sorted.filter((event) => (event.placement === 'headless' || event.placement === 'headless_by_design_viewport_ui') && (event.event_type === 'worker_launch_invoked' || event.event_type === 'worker_process_spawned')).length;
|
|
104
104
|
const headlessWorkers = Math.max(observedHeadlessWorkers, Math.max(0, targetActiveSlots - visiblePanes));
|
|
105
105
|
const minActiveWorkers = opts.minActiveWorkers === undefined
|
|
106
106
|
? Math.min(targetActiveSlots, requestedWorkers)
|
|
@@ -112,6 +112,7 @@ export async function buildParallelRuntimeProof(root, missionId, opts = {}) {
|
|
|
112
112
|
const firstBatchLimit = positiveInt(opts.firstBatchLaunchSpanLimitMs, requestedWorkers >= 16 ? 2500 : 30000);
|
|
113
113
|
const schedulerState = await readJson(path.join(root, 'agent-scheduler-state.json'), null).catch(() => null);
|
|
114
114
|
const coalescedOverlapWindows = coalesceOverlapWindows(overlapWindows);
|
|
115
|
+
const workerEvidence = buildWorkerRuntimeEvidence(sorted, firstMs, lastMs);
|
|
115
116
|
const utilizationProofConsistency = buildUtilizationProofConsistency(schedulerState, {
|
|
116
117
|
proofMaxActive: maxWorkers,
|
|
117
118
|
proofWallMs: wallMs,
|
|
@@ -130,15 +131,27 @@ export async function buildParallelRuntimeProof(root, missionId, opts = {}) {
|
|
|
130
131
|
blockers.push('speedup_ratio_below_target');
|
|
131
132
|
if (firstBatchLaunchSpanMs > firstBatchLimit)
|
|
132
133
|
blockers.push('first_batch_launch_span_above_limit');
|
|
134
|
+
if (minActiveWorkers > 1 && workerEvidence.unique_worker_ids.length < Math.min(minActiveWorkers, 2))
|
|
135
|
+
blockers.push('worker_id_diversity_below_target');
|
|
136
|
+
if (minActiveWorkers > 1 && workerEvidence.overlap_windows.length === 0)
|
|
137
|
+
blockers.push('worker_timestamp_overlap_missing');
|
|
138
|
+
if (opts.requireChangedFiles === true && workerEvidence.changed_file_count < positiveInt(opts.minChangedFiles, Math.min(2, requestedWorkers)))
|
|
139
|
+
blockers.push('parallel_write_changed_files_below_target');
|
|
140
|
+
const passed = blockers.length === 0;
|
|
133
141
|
return {
|
|
134
142
|
schema: PARALLEL_RUNTIME_PROOF_SCHEMA,
|
|
135
143
|
mission_id: missionId,
|
|
136
144
|
generated_at: nowIso(),
|
|
145
|
+
ok: passed,
|
|
137
146
|
proof_mode: proofMode,
|
|
147
|
+
production_runtime: proofMode === 'production',
|
|
148
|
+
mock_only: proofMode !== 'production',
|
|
138
149
|
require_worker_pids: requireWorkerPids,
|
|
139
150
|
allow_missing_pids: allowMissingPids,
|
|
140
151
|
requested_workers: requestedWorkers,
|
|
141
152
|
target_active_slots: targetActiveSlots,
|
|
153
|
+
observed_worker_count: workerEvidence.unique_worker_ids.length,
|
|
154
|
+
unique_worker_ids: workerEvidence.unique_worker_ids,
|
|
142
155
|
max_observed_active_workers: maxWorkers,
|
|
143
156
|
max_observed_worker_processes: Math.max(maxProcesses, workerPids.size ? maxProcesses : maxWorkers),
|
|
144
157
|
unique_worker_pids: workerPids.size,
|
|
@@ -149,11 +162,13 @@ export async function buildParallelRuntimeProof(root, missionId, opts = {}) {
|
|
|
149
162
|
wall_ms: wallMs,
|
|
150
163
|
sequential_estimate_ms: sequentialEstimateMs,
|
|
151
164
|
speedup_ratio: speedupRatio,
|
|
152
|
-
overlap_windows: coalescedOverlapWindows,
|
|
165
|
+
overlap_windows: [...coalescedOverlapWindows, ...workerEvidence.overlap_windows],
|
|
166
|
+
changed_file_count: workerEvidence.changed_file_count,
|
|
167
|
+
changed_files_by_worker: workerEvidence.changed_files_by_worker,
|
|
153
168
|
visible_panes: visiblePanes,
|
|
154
169
|
headless_workers: headlessWorkers,
|
|
155
170
|
utilization_proof_consistency: utilizationProofConsistency,
|
|
156
|
-
passed
|
|
171
|
+
passed,
|
|
157
172
|
blockers
|
|
158
173
|
};
|
|
159
174
|
}
|
|
@@ -200,7 +215,7 @@ function normalizeParallelRuntimeEvent(missionId, event) {
|
|
|
200
215
|
}
|
|
201
216
|
function normalizePlacement(value) {
|
|
202
217
|
const text = String(value || 'unknown');
|
|
203
|
-
if (text === 'zellij-pane' || text === 'process' || text === 'headless')
|
|
218
|
+
if (text === 'zellij-pane' || text === 'process' || text === 'headless' || text === 'headless_by_design_viewport_ui')
|
|
204
219
|
return text;
|
|
205
220
|
return 'unknown';
|
|
206
221
|
}
|
|
@@ -253,14 +268,73 @@ function buildUtilizationProofConsistency(state, input) {
|
|
|
253
268
|
};
|
|
254
269
|
}
|
|
255
270
|
function activeSlotTimeMsFromWindows(windows) {
|
|
256
|
-
return windows.reduce((sum, window) => sum + Math.max(0, window.end_ms - window.start_ms) * Math.max(0, window.active_workers), 0);
|
|
271
|
+
return windows.reduce((sum, window) => sum + Math.max(0, Number(window.end_ms || 0) - Number(window.start_ms || 0)) * Math.max(0, Number(window.active_workers || 0)), 0);
|
|
257
272
|
}
|
|
258
273
|
function coalesceOverlapWindows(windows) {
|
|
259
274
|
return windows
|
|
260
|
-
.filter((window) => window.end_ms > window.start_ms)
|
|
261
|
-
.filter((window) => window.active_workers > 0 || window.active_model_calls > 0)
|
|
275
|
+
.filter((window) => Number(window.end_ms || 0) > Number(window.start_ms || 0))
|
|
276
|
+
.filter((window) => Number(window.active_workers || 0) > 0 || Number(window.active_model_calls || 0) > 0)
|
|
262
277
|
.slice(0, 2000);
|
|
263
278
|
}
|
|
279
|
+
function buildWorkerRuntimeEvidence(events, firstMs, lastMs) {
|
|
280
|
+
const intervals = new Map();
|
|
281
|
+
for (const event of events) {
|
|
282
|
+
const workerId = workerRuntimeId(event);
|
|
283
|
+
if (!workerId)
|
|
284
|
+
continue;
|
|
285
|
+
if (event.event_type === 'worker_launch_invoked' || event.event_type === 'worker_process_spawned') {
|
|
286
|
+
const current = intervals.get(workerId);
|
|
287
|
+
if (current)
|
|
288
|
+
current.start = Math.min(current.start, event.ms);
|
|
289
|
+
else
|
|
290
|
+
intervals.set(workerId, { start: event.ms, end: event.ms, changedFiles: new Set() });
|
|
291
|
+
}
|
|
292
|
+
if (event.event_type === 'worker_completed' || event.event_type === 'worker_failed') {
|
|
293
|
+
const current = intervals.get(workerId) || { start: event.ms, end: event.ms, changedFiles: new Set() };
|
|
294
|
+
current.end = event.ms;
|
|
295
|
+
for (const file of eventChangedFiles(event))
|
|
296
|
+
current.changedFiles.add(file);
|
|
297
|
+
intervals.set(workerId, current);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const uniqueWorkerIds = [...intervals.keys()].sort();
|
|
301
|
+
const changedFilesByWorker = Object.fromEntries(uniqueWorkerIds.map((id) => [id, [...(intervals.get(id)?.changedFiles || new Set())].sort()]));
|
|
302
|
+
const changedFileCount = new Set(Object.values(changedFilesByWorker).flat()).size;
|
|
303
|
+
const overlapWindows = [];
|
|
304
|
+
for (let i = 0; i < uniqueWorkerIds.length; i++) {
|
|
305
|
+
for (let j = i + 1; j < uniqueWorkerIds.length; j++) {
|
|
306
|
+
const a = uniqueWorkerIds[i];
|
|
307
|
+
const b = uniqueWorkerIds[j];
|
|
308
|
+
const left = intervals.get(a);
|
|
309
|
+
const right = intervals.get(b);
|
|
310
|
+
const overlapMs = Math.max(0, Math.min(left.end, right.end) - Math.max(left.start, right.start));
|
|
311
|
+
if (overlapMs > 0 && Math.max(left.start, right.start) < Math.min(left.end, right.end)) {
|
|
312
|
+
overlapWindows.push({
|
|
313
|
+
worker_a: a,
|
|
314
|
+
worker_b: b,
|
|
315
|
+
overlap_ms: overlapMs,
|
|
316
|
+
start_ms: Math.max(left.start, right.start) - firstMs,
|
|
317
|
+
end_ms: Math.min(left.end, right.end) - firstMs,
|
|
318
|
+
active_workers: 2,
|
|
319
|
+
active_model_calls: 0
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
unique_worker_ids: uniqueWorkerIds,
|
|
326
|
+
changed_files_by_worker: changedFilesByWorker,
|
|
327
|
+
changed_file_count: changedFileCount,
|
|
328
|
+
overlap_windows: overlapWindows.slice(0, 2000)
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
function workerRuntimeId(event) {
|
|
332
|
+
return event.slot_id || event.session_id || (event.pid == null ? null : `pid:${event.pid}`);
|
|
333
|
+
}
|
|
334
|
+
function eventChangedFiles(event) {
|
|
335
|
+
const fromMeta = Array.isArray(event.meta?.changed_files) ? event.meta.changed_files : [];
|
|
336
|
+
return fromMeta.map((file) => String(file || '').replace(/\\/g, '/').replace(/^\.\/+/, '')).filter(Boolean);
|
|
337
|
+
}
|
|
264
338
|
function inferAgentsDir(root, missionId) {
|
|
265
339
|
const resolved = path.resolve(root);
|
|
266
340
|
if (path.basename(resolved) === 'agents' && path.basename(path.dirname(resolved)) === missionId)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { dirSize, formatBytes, packageRoot, projectRoot, sksRoot } from '../fsx.js';
|
|
2
|
-
import { enforceRetention, storageReport } from '../retention.js';
|
|
2
|
+
import { enforceRetention, lightweightStorageReport, storageReport } from '../retention.js';
|
|
3
3
|
import { flag } from './command-utils.js';
|
|
4
4
|
import { projectTriwikiToAgentsMd } from '../triwiki/agents-md-projector.js';
|
|
5
5
|
import { compileMistakeRules } from '../verification/mistake-rule-compiler.js';
|
|
@@ -45,13 +45,19 @@ function readOption(args = [], name, fallback = null) {
|
|
|
45
45
|
}
|
|
46
46
|
export async function statsCommand(args = []) {
|
|
47
47
|
const root = await sksRoot();
|
|
48
|
-
const
|
|
49
|
-
const
|
|
50
|
-
const
|
|
48
|
+
const full = flag(args, '--full');
|
|
49
|
+
const report = full ? await storageReport(root) : await lightweightStorageReport(root);
|
|
50
|
+
const pkgBytes = full ? await dirSize(packageRoot()).catch(() => 0) : null;
|
|
51
|
+
const out = {
|
|
52
|
+
package: full
|
|
53
|
+
? { bytes: pkgBytes, human: formatBytes(pkgBytes), full_size: true }
|
|
54
|
+
: { bytes: null, human: null, full_size: false, note: 'Run `sks stats --full --json` for recursive package sizing.' },
|
|
55
|
+
storage: report
|
|
56
|
+
};
|
|
51
57
|
if (flag(args, '--json'))
|
|
52
58
|
return console.log(JSON.stringify(out, null, 2));
|
|
53
59
|
console.log('ㅅㅋㅅ Stats');
|
|
54
|
-
console.log(`Package: ${out.package.human}`);
|
|
55
|
-
console.log(`State: ${report.total_human || '
|
|
60
|
+
console.log(`Package: ${out.package.human || 'not scanned (use --full)'}`);
|
|
61
|
+
console.log(`State: ${report.total_human || 'not scanned (use --full)'}`);
|
|
56
62
|
}
|
|
57
63
|
//# sourceMappingURL=gc-command.js.map
|
|
@@ -378,8 +378,8 @@ function runNextAction(route, id, args) {
|
|
|
378
378
|
function safeRouteExecutionArgs(route, prompt, { auto = false } = {}) {
|
|
379
379
|
if (route.command === '$DB')
|
|
380
380
|
return ['db', 'check', '--sql', 'SELECT 1', '--json'];
|
|
381
|
-
if (route.command === '$
|
|
382
|
-
return
|
|
381
|
+
if (route.command === '$Super-Search')
|
|
382
|
+
return superSearchExecutionArgs(prompt);
|
|
383
383
|
if (route.command === '$SEO-GEO-OPTIMIZER')
|
|
384
384
|
return ['seo-geo-optimizer', searchVisibilityActionFromPrompt(prompt), '--mode', searchVisibilityModeFromPrompt(prompt), '--target', searchVisibilityTargetFromPrompt(prompt), '--offline', '--json'];
|
|
385
385
|
if (route.command === '$Wiki')
|
|
@@ -394,32 +394,34 @@ function safeRouteExecutionArgs(route, prompt, { auto = false } = {}) {
|
|
|
394
394
|
return ['commit-and-push', '--json'];
|
|
395
395
|
return ['team', prompt, '--mock', '--json', ...(auto ? ['--no-open-zellij'] : [])];
|
|
396
396
|
}
|
|
397
|
-
function
|
|
398
|
-
const stripped =
|
|
397
|
+
function superSearchExecutionArgs(prompt = '') {
|
|
398
|
+
const stripped = stripSuperSearchPrompt(prompt);
|
|
399
399
|
const lower = stripped.toLowerCase();
|
|
400
400
|
if (!stripped || /^(?:doctor|check|status)\b/.test(lower))
|
|
401
|
-
return ['
|
|
401
|
+
return ['super-search', 'doctor', '--json'];
|
|
402
402
|
if (/^(?:x|x-search|x_search)\b/.test(lower)) {
|
|
403
403
|
const query = stripped.replace(/^(?:x|x-search|x_search)\b[:\s-]*/i, '').trim() || 'source intelligence fixture';
|
|
404
|
-
return ['
|
|
404
|
+
return ['super-search', 'x', query, '--json'];
|
|
405
405
|
}
|
|
406
406
|
const url = stripped.match(/\bhttps?:\/\/\S+/)?.[0];
|
|
407
|
-
if (/^(?:fetch|url)\b/.test(lower) || url)
|
|
408
|
-
|
|
407
|
+
if (/^(?:fetch|url)\b/.test(lower) || url) {
|
|
408
|
+
const fetchTarget = url || stripped.replace(/^(?:fetch|url)\b[:\s-]*/i, '').trim();
|
|
409
|
+
return fetchTarget ? ['super-search', 'fetch', fetchTarget, '--json'] : ['super-search', 'fetch', '--json'];
|
|
410
|
+
}
|
|
409
411
|
const query = stripped.replace(/^run\b[:\s-]*/i, '').trim() || 'source intelligence fixture';
|
|
410
|
-
return ['
|
|
412
|
+
return ['super-search', 'run', query, '--mode', 'balanced', '--json'];
|
|
411
413
|
}
|
|
412
|
-
function
|
|
414
|
+
function stripSuperSearchPrompt(prompt = '') {
|
|
413
415
|
return String(prompt || '')
|
|
414
416
|
.trim()
|
|
415
|
-
.replace(/^\[\$
|
|
416
|
-
.replace(/^\[\$
|
|
417
|
-
.replace(/^\[\$
|
|
418
|
-
.replace(/^\[\$
|
|
419
|
-
.replace(/^\$
|
|
420
|
-
.replace(/^\$
|
|
421
|
-
.replace(/^\$
|
|
422
|
-
.replace(/^\$
|
|
417
|
+
.replace(/^\[\$Super-Search\]\([^)]+\)(?:\s|:)?\s*/i, '')
|
|
418
|
+
.replace(/^\[\$Super-Search\]\([^)]+\)(?:\s|:)?\s*/i, '')
|
|
419
|
+
.replace(/^\[\$Super-Search\]\([^)]+\)(?:\s|:)?\s*/i, '')
|
|
420
|
+
.replace(/^\[\$Super-Search\]\([^)]+\)(?:\s|:)?\s*/i, '')
|
|
421
|
+
.replace(/^\$Super-Search(?:\s|:)?\s*/i, '')
|
|
422
|
+
.replace(/^\$Super-Search(?:\s|:)?\s*/i, '')
|
|
423
|
+
.replace(/^\$Super-Search(?:\s|:)?\s*/i, '')
|
|
424
|
+
.replace(/^\$Super-Search(?:\s|:)?\s*/i, '')
|
|
423
425
|
.trim();
|
|
424
426
|
}
|
|
425
427
|
function searchVisibilityActionFromPrompt(prompt = '') {
|
|
@@ -12,7 +12,9 @@ const FIXTURES = Object.freeze({
|
|
|
12
12
|
'cli-help': fixture('execute', 'sks help', [], 'pass'),
|
|
13
13
|
'cli-version': fixture('execute', 'sks --version', [], 'pass'),
|
|
14
14
|
'cli-root': fixture('execute', 'sks root --json', [], 'pass'),
|
|
15
|
-
'cli-doctor': fixture('
|
|
15
|
+
'cli-doctor': fixture('execute', 'sks doctor --json', [], 'pass', {
|
|
16
|
+
reason: 'doctor without --fix is a read-only runtime readiness command, so the release fixture can execute it directly instead of counting it as optional integration evidence.'
|
|
17
|
+
}),
|
|
16
18
|
'doctor:imagegen-repair': fixture('execute_and_validate_artifacts', 'sks doctor --json', [{ path: '.sneakoscope/reports/feature-fixtures/doctor-imagegen-repair.json', schema: 'sks.doctor-imagegen-repair.v1', optional: true }], 'pass', {
|
|
17
19
|
quality: 'runtime_verified',
|
|
18
20
|
validates_json_fields: ['imagegen_repair', 'repair.imagegen']
|
|
@@ -90,7 +92,7 @@ const FIXTURES = Object.freeze({
|
|
|
90
92
|
'cli-codex-native': fixture('execute', 'sks codex-native status --json', [], 'pass'),
|
|
91
93
|
'cli-zellij': fixture('execute', 'npm run zellij:capability --silent', [], 'pass'),
|
|
92
94
|
'cli-tmux': fixture('not_available', null, [], 'not_required', {
|
|
93
|
-
quality: '
|
|
95
|
+
quality: 'static_contract',
|
|
94
96
|
reason: 'tmux runtime was removed from SKS (see tmuxCommand in basic-cli.ts and `sks tmux` deprecation notice); the prior fixture command string was not a real invocable command ("removed runtime migration notice: sks tmux --json"), so it is reclassified as not_available instead of being mislabeled mock.',
|
|
95
97
|
root_mode: 'source_checkout_required'
|
|
96
98
|
}),
|
|
@@ -104,8 +106,7 @@ const FIXTURES = Object.freeze({
|
|
|
104
106
|
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.'
|
|
105
107
|
}),
|
|
106
108
|
'cli-context7': fixture('real_optional', 'sks context7 check --json', [], 'pass'),
|
|
107
|
-
'cli-
|
|
108
|
-
'cli-ultra-search': fixture('execute', 'sks ultra-search doctor --json', [], 'pass'),
|
|
109
|
+
'cli-super-search': fixture('execute', 'sks super-search doctor --json', [], 'pass'),
|
|
109
110
|
'cli-xai': fixture('real_optional', 'sks xai check --json', [], 'pass'),
|
|
110
111
|
'cli-task': fixture('execute', 'sks task instant --plan --json', [], 'pass'),
|
|
111
112
|
'cli-release': fixture('execute', 'sks release affected --json', [], 'blocked', { reason: '18차: the phantom requiredSections schema mismatch (five_lane_review/integration_evidence/session_cleanup, from commit d4526f84 with no producer ever wired up) has been fixed -- missing_sections is now honestly empty. The release-gate DAG still legitimately fails/blocks on other real gates (e.g. release:readiness) independent of this fix, so the command still exits non-zero and this fixture stays honestly blocked rather than claiming full green.' }),
|
|
@@ -142,9 +143,11 @@ const FIXTURES = Object.freeze({
|
|
|
142
143
|
'route-plan': fixture('execute', 'sks plan "fixture" --json', [], 'pass'),
|
|
143
144
|
'route-review': fixture('execute', 'sks review --diff HEAD --json', [], 'pass'),
|
|
144
145
|
'route-shadowclone': fixture('static', '$ShadowClone alias of $Naruto shadow-clone swarm route', [], 'pass', {
|
|
146
|
+
quality: 'wiring_only',
|
|
145
147
|
reason: 'Pure alias of $Naruto; no independent behavior to verify beyond route-naruto\'s own execute_and_validate_artifacts fixture.'
|
|
146
148
|
}),
|
|
147
149
|
'route-kagebunshin': fixture('static', '$Kagebunshin alias of $Naruto shadow-clone swarm route', [], 'pass', {
|
|
150
|
+
quality: 'wiring_only',
|
|
148
151
|
reason: 'Pure alias of $Naruto; no independent behavior to verify beyond route-naruto\'s own execute_and_validate_artifacts fixture.'
|
|
149
152
|
}),
|
|
150
153
|
'route-qa-loop': fixture('execute_and_validate_artifacts', 'sks qa-loop run latest --mock --json', ['completion-proof.json', 'qa-gate.json'], 'blocked', { timeout_ms: 180000, reason: 'qaLoopRun() resolves "latest" via the same globally-unscoped findLatestMission used everywhere else and qa-loop is a two-step prepare-then-run workflow gated between steps by an active-route-not-closed check a single fixture command cannot express.' }),
|
|
@@ -157,15 +160,13 @@ const FIXTURES = Object.freeze({
|
|
|
157
160
|
}),
|
|
158
161
|
'route-dfix': fixture('execute_and_validate_artifacts', 'sks dfix fixture --json', ['completion-proof.json', 'dfix-gate.json', 'dfix-verification.json'], 'pass'),
|
|
159
162
|
'route-answer': fixture('static', '$Answer answer-only route policy', [], 'pass', {
|
|
163
|
+
quality: 'wiring_only',
|
|
160
164
|
reason: 'Policy-only route (answer-only conversational mode with no writes); nothing executable to run beyond static contract text.'
|
|
161
165
|
}),
|
|
162
166
|
'route-goal': fixture('mock', '$Goal bridge route', ['goal-workflow.json', 'completion-proof.json'], 'pass', {
|
|
163
167
|
reason: 'sks goal create "<prompt>" --json never calls maybeFinalizeRoute, so it does not write completion-proof.json even on success; live-testing it also surfaced a real defect (loop-worker-runtime.ts omitted an explicit `agents` value, so buildAgentRoster() fell back to DEFAULT_AGENT_COUNT=5 while maxAgentCount was capped to the loop\'s smaller worker budget, throwing "Agent count 5 exceeds max N" for any ordinary fixture prompt) which has been fixed in this change, but goal-workflow.json/completion-proof.json parity still requires either wiring maybeFinalizeRoute into goalCreate or relaxing this fixture\'s expected_artifacts, both out of scope here; left as documented mock.'
|
|
164
168
|
}),
|
|
165
|
-
'route-
|
|
166
|
-
'route-insanesearch': fixture('execute', 'sks run "$InsaneSearch source intelligence fixture" --execute --json', [], 'pass'),
|
|
167
|
-
'route-ultra-search': fixture('execute', 'sks run "$Ultra-Search source intelligence fixture" --execute --json', [], 'pass'),
|
|
168
|
-
'route-ultrasearch': fixture('execute', 'sks run "$UltraSearch source intelligence fixture" --execute --json', [], 'pass'),
|
|
169
|
+
'route-super-search': fixture('execute', 'sks run "$Super-Search doctor" --execute --json', [], 'pass'),
|
|
169
170
|
'route-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', 'search-visibility/verification-report.json', 'geo-gate.json', 'completion-proof.json'], 'pass'),
|
|
170
171
|
'route-autoresearch': fixture('mock', '$AutoResearch fixture route', ['research-gate.json', 'completion-proof.json'], 'pass', {
|
|
171
172
|
reason: 'Producing research-gate.json + completion-proof.json requires the two-step `research prepare` then `research run latest --mock --autoresearch --json` sequence (same as route-research\'s safe-args setup step), which a single spawned command cannot express; the $AutoResearch pipeline-dispatch route (`sks run "$AutoResearch ..."`) instead writes autoresearch-gate.json, a different contract. Left as documented mock pending multi-step fixture setup support.'
|
|
@@ -184,23 +185,29 @@ const FIXTURES = Object.freeze({
|
|
|
184
185
|
'route-wiki': fixture('execute_and_validate_artifacts', 'sks wiki image-ingest test/fixtures/images/one-by-one.png --json', [{ path: 'completion-proof.json', schema: 'sks.completion-proof.v1' }, { path: 'image-voxel-ledger.json', schema: 'sks.image-voxel-ledger.v1' }], 'pass'),
|
|
185
186
|
'route-gx': fixture('execute_and_validate_artifacts', 'sks gx validate fixture --mock --json', ['completion-proof.json', { path: 'image-voxel-ledger.json', schema: 'sks.image-voxel-ledger.v1' }, 'gx-validation.json'], 'blocked', { reason: 'gxValidateFixture() intentionally exits non-zero (execution_class: mock_fixture) for an honest mock/blocked result; it does write all three declared artifacts.' }),
|
|
186
187
|
'route-sks': fixture('static', '$SKS control-surface route', ['completion-proof.json'], 'pass', {
|
|
188
|
+
quality: 'wiring_only',
|
|
187
189
|
reason: 'Pure control-surface alias route with no independent behavior beyond the underlying CLI command fixtures it dispatches to.'
|
|
188
190
|
}),
|
|
189
191
|
'route-fast-mode': fixture('execute', 'sks fast-mode status --json', [], 'pass'),
|
|
190
192
|
'route-fast-on': fixture('static', '$Fast-On covered by hermetic fast-mode blackbox toggle test', [], 'pass', {
|
|
193
|
+
quality: 'wiring_only',
|
|
191
194
|
reason: 'Toggle-only dollar-command alias; behavior is covered by the hermetic fast-mode blackbox toggle test suite, not a standalone CLI invocation.'
|
|
192
195
|
}),
|
|
193
196
|
'route-fast-off': fixture('static', '$Fast-Off covered by hermetic fast-mode blackbox toggle test', [], 'pass', {
|
|
197
|
+
quality: 'wiring_only',
|
|
194
198
|
reason: 'Toggle-only dollar-command alias; behavior is covered by the hermetic fast-mode blackbox toggle test suite, not a standalone CLI invocation.'
|
|
195
199
|
}),
|
|
196
200
|
'route-local-model': fixture('execute', 'sks with-local-llm status --json', [], 'pass'),
|
|
197
201
|
'route-with-local-llm-on': fixture('static', '$with-local-llm-on covered by hermetic local-model dollar-command blackbox toggle test', [], 'pass', {
|
|
202
|
+
quality: 'wiring_only',
|
|
198
203
|
reason: 'Toggle-only dollar-command alias; behavior is covered by the hermetic local-model dollar-command blackbox toggle test suite, not a standalone CLI invocation.'
|
|
199
204
|
}),
|
|
200
205
|
'route-with-local-llm-off': fixture('static', '$with-local-llm-off covered by hermetic local-model dollar-command blackbox toggle test', [], 'pass', {
|
|
206
|
+
quality: 'wiring_only',
|
|
201
207
|
reason: 'Toggle-only dollar-command alias; behavior is covered by the hermetic local-model dollar-command blackbox toggle test suite, not a standalone CLI invocation.'
|
|
202
208
|
}),
|
|
203
209
|
'route-help': fixture('static', '$Help lightweight route', [], 'pass', {
|
|
210
|
+
quality: 'wiring_only',
|
|
204
211
|
reason: 'Pure alias of the cli-help command; no independent behavior to verify beyond cli-help\'s own execute fixture.'
|
|
205
212
|
}),
|
|
206
213
|
'route-commit': fixture('mock', '$Commit git route', ['completion-proof.json'], 'pass', {
|
package/dist/core/fsx.js
CHANGED
|
@@ -5,7 +5,7 @@ import os from 'node:os';
|
|
|
5
5
|
import crypto from 'node:crypto';
|
|
6
6
|
import { spawn } from 'node:child_process';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
8
|
-
export const PACKAGE_VERSION = '5.
|
|
8
|
+
export const PACKAGE_VERSION = '5.8.0';
|
|
9
9
|
export const DEFAULT_PROCESS_TAIL_BYTES = 256 * 1024;
|
|
10
10
|
export const DEFAULT_PROCESS_TIMEOUT_MS = 30 * 60 * 1000;
|
|
11
11
|
export function nowIso() {
|
package/dist/core/init/skills.js
CHANGED
|
@@ -66,8 +66,7 @@ async function installOfficialSkills(root) {
|
|
|
66
66
|
'reasoning-router': `---\nname: reasoning-router\ndescription: Temporary SKS reasoning-effort routing for every command and pipeline route.\n---\n\nmedium: simple copy/color/discovery/setup/mechanical edits. high: logic, safety, architecture, DB, orchestration, refactor, multi-file work. xhigh: research, AutoResearch, falsification, benchmarks, SEO/GEO, open-ended discovery, and From-Chat-IMG image work-order analysis. Routing is temporary; return to default after the gate. Inspect with sks reasoning and sks pipeline status.\n`,
|
|
67
67
|
'pipeline-runner': `---\nname: pipeline-runner\ndescription: Execute SKS dollar-command routes as stateful pipelines with mission artifacts, route gates, Context7 evidence, temporary reasoning routing, reflection, and Honest Mode.\n---\n\nEvery $ command is a route. Use current.json, mission artifacts, and pipeline-plan.json as the execution plan: it records the lane, skipped stages, kept stages, verification, lean_decision, and no-unrequested-fallback invariant. Use temporary reasoning, TriWiki before stages, source hydration, Context7 when required, Team cleanup before reflection, reflection for full routes, and completion summary plus Honest Mode before final. Surface guard/scopes, record evidence, refresh/pack/validate TriWiki, and check sks pipeline status/resume/plan. ${leanEngineeringCompactText()} ${speedLanePolicyText()} ${skillDreamPolicyText()}\n`,
|
|
68
68
|
'context7-docs': `---\nname: context7-docs\ndescription: Enforce Context7 MCP documentation evidence for SKS routes that depend on external libraries, frameworks, APIs, MCPs, package managers, DB SDKs, or generated docs.\n---\n\nWhen required, resolve-library-id, then query-docs for the resolved id. Legacy get-library-docs evidence is accepted. Prefer sks context7 tools/resolve/docs/evidence and finish only after both evidence stages exist. Check setup with sks context7 check.\n`,
|
|
69
|
-
'
|
|
70
|
-
'ultra-search': `---\nname: ultra-search\ndescription: Compatibility alias for $Insane-Search/$InsaneSearch provider-independent source intelligence.\n---\n\nUse when the user invokes legacy $Ultra-Search/$UltraSearch or asks for InsaneSearch source intelligence, source acquisition, X-search-style collection, URL acquisition, source normalization, claim ledgers, or citation proof. Prefer \`sks ultra-search doctor --json\` for readiness and \`sks ultra-search run "<query>" --mode balanced --json\` for provider-independent source proof; use \`sks ultra-search x "<query>" --json\` for X-search intent and \`sks ultra-search fetch "<url>" --json\` for URL acquisition. Context7 is required only when the query depends on current package/API/framework/MCP/generated documentation behavior. xAI/Grok credentials are optional and must not be required for route readiness. Evidence/artifacts live under \`.sneakoscope/missions/<ultra-* or route mission>/ultra-search/\`: intent.json, axes.json, query-variants.json, provider-plan.json, source-ledger.json, lead-ledger.json, claim-ledger.json, synthesis.md, ultra-search-proof.json, ultra-search-gate.json, and ultra-search-result.json. Do not turn weak discovery into supported claims; finish with an Honest Mode summary of verified sources, blockers, and unverified external coverage.\n`,
|
|
69
|
+
'super-search': `---\nname: super-search\ndescription: Dollar-command route for $Super-Search provider-independent source intelligence.\n---\n\nUse when the user invokes $Super-Search or asks for Super-Search source intelligence, source acquisition, X-search-style collection, URL acquisition, source normalization, claim ledgers, or citation proof. Prefer \`sks super-search doctor --json\` for readiness and \`sks super-search run "<query>" --mode balanced --json\` for provider-independent source proof; use \`sks super-search x "<query>" --json\` for X-search intent and \`sks super-search fetch "<url>" --json\` for URL acquisition. Context7 is required only when the query depends on current package/API/framework/MCP/generated documentation behavior. xAI/Grok credentials are optional and must not be required for route readiness. Evidence/artifacts remain under \`.sneakoscope/missions/<super-search-* or route mission>/super-search/\`: intent.json, axes.json, query-variants.json, provider-plan.json, source-ledger.json, lead-ledger.json, claim-ledger.json, attempt-ledger.json, synthesis.md, super-search-proof.json, super-search-gate.json, and super-search-result.json. Do not turn weak discovery into supported claims; finish with an Honest Mode summary of verified sources, blockers, and unverified external coverage.\n`,
|
|
71
70
|
'search-visibility-core': `---\nname: search-visibility-core\ndescription: Shared kernel for seo-geo-optimizer audit, plan, explicit apply, rollback, verification, gates, and Completion Proof.\n---\n\nPurpose: keep Search Engine Optimization and Generative Engine Optimization on one typed search-visibility kernel instead of duplicate implementations. Use when $SEO-GEO-OPTIMIZER or \`sks seo-geo-optimizer\` is selected. Workflow: doctor detects package/static/Next evidence; audit writes source-backed inventory and findings; plan compiles safe mutation operations; apply requires explicit \`--apply\`; verify separates source, build, HTTP, browser, production, and measured outcome; rollback only reverses mission-owned operations. Safety: default read-only, never overwrite unmanaged robots.txt, sitemap, llms.txt, metadata, or structured data; do not hard-code customer routes; do not invent prices, reviews, availability, rankings, traffic, or AI citation outcomes. Evidence/artifacts: search-visibility/intake.json, adapter-detection.json, site-inventory.json, route-graph.json, robots-policy.json, structured-data-ledger.json, mutation-plan.json, mutation-journal.jsonl, rollback-manifest.json, verification-report.json, route gate, and completion-proof.json. Failure/recovery: unsupported frameworks stay audit/plan-only; missing production/browser/Search Console evidence remains unverified, not fabricated. CLI entrypoint: \`sks seo-geo-optimizer ... --mode seo|geo\`.\n`,
|
|
72
71
|
'seo-geo-optimizer': `---\nname: seo-geo-optimizer\ndescription: Unified $SEO-GEO-OPTIMIZER route for Search Engine Optimization and Generative Engine Optimization.\n---\n\nPurpose: use one route name for SEO and GEO work while keeping the internal search-visibility mode explicit. Use when: the user asks for SEO audit/fix/verification, package/npm/GitHub search visibility, canonical, sitemap, robots.txt, hreflang, metadata, structured data, AI answer visibility, LLM citation readiness, answerability, entity/claim provenance, crawler policy, OAI-SearchBot/GPTBot/ChatGPT-User, Claude-SearchBot/ClaudeBot/Claude-User, or optional llms.txt planning. GEO means Generative Engine Optimization, not geolocation, GeoIP, maps, CDN geography, location permission, or regional redirect bugs. Workflow: run \`sks seo-geo-optimizer doctor --mode seo|geo\`, then audit, plan, explicit apply, verify, status, and rollback. Use \`--mode seo\` for technical/package search optimization and \`--mode geo\` for entity facts, claim evidence, answerability, crawler policy, and optional llms.txt. Safety: audit and plan must not mutate source; apply checks base hashes, ownership, scope, protected paths, rollback manifest, and post-verify. AI crawler policy must split search, training, user-directed retrieval, and ads/other; never use one allow_ai toggle and never auto-allow training crawlers. Evidence/artifacts: site-inventory.json, route-graph.json, seo-findings.json or geo-findings.json, entity-facts.json, claim-evidence-ledger.json, answerability-report.json, ai-crawler-policy.json, llms-txt-plan.json, mutation-plan.json, verification-report.json, seo-gate.json or geo-gate.json, completion-proof.json. Failure/recovery: unsupported frameworks stay plan-only; browser/production/Search Console/analytics outcomes are marked unverified when not actually run. Forbidden claims: no ranking, indexing, traffic lift, rich-result, answer inclusion, or AI citation guarantee; no keyword stuffing, doorway pages, fake reviews, fake prices, fake availability, fake shipping, fake awards, hidden AI-only text, or scaled spam. CLI entrypoint: \`sks seo-geo-optimizer doctor|audit|plan|apply|verify|status|rollback|fixture --mode seo|geo\`.\n`,
|
|
73
72
|
'reflection': `---\nname: reflection\ndescription: Post-route self-review for full SKS routes that records real misses, gaps, and corrective lessons into TriWiki memory.\n---\n\nUse after full route work/tests and before final. DFix, Answer, Help, Wiki, SKS discovery are exempt. Do not invent faults. Write reflection.md; append real lessons to ${REFLECTION_MEMORY_PATH}; refresh/pack, validate context-pack.json, pass reflection-gate.json.\n\n${reflectionInstructionText()}\n`,
|
package/dist/core/mission.js
CHANGED
|
@@ -116,21 +116,7 @@ export async function closeRouteState(root, input = {}) {
|
|
|
116
116
|
if (input.missionId && current.mission_id && String(current.mission_id) !== String(input.missionId)) {
|
|
117
117
|
return { ok: false, status: 'mission_mismatch', mission_id: missionId, current_mission_id: current.mission_id };
|
|
118
118
|
}
|
|
119
|
-
const next =
|
|
120
|
-
...current,
|
|
121
|
-
mission_id: missionId || current.mission_id || null,
|
|
122
|
-
route_closed: true,
|
|
123
|
-
route_closed_at: nowIso(),
|
|
124
|
-
route_close_reason: input.reason || 'route_close_command',
|
|
125
|
-
implementation_allowed: false,
|
|
126
|
-
questions_allowed: true,
|
|
127
|
-
mad_sks_active: false,
|
|
128
|
-
permission_gate_active: false,
|
|
129
|
-
gate_owner_mission_id: null,
|
|
130
|
-
phase: current.phase ? `${current.phase}_CLOSED` : 'ROUTE_CLOSED',
|
|
131
|
-
updated_at: nowIso(),
|
|
132
|
-
...(sessionKey ? { _session_key: sessionKey } : {})
|
|
133
|
-
};
|
|
119
|
+
const next = closedRouteState(current, missionId, input.reason, sessionKey);
|
|
134
120
|
if (sessionKey) {
|
|
135
121
|
await ensureDir(stateSessionsDir(root));
|
|
136
122
|
await writeJsonAtomic(targetFile, next);
|
|
@@ -138,6 +124,9 @@ export async function closeRouteState(root, input = {}) {
|
|
|
138
124
|
}
|
|
139
125
|
else {
|
|
140
126
|
await writeJsonAtomic(stateFile(root), next);
|
|
127
|
+
for (const row of await matchingSessionStates(root, missionId, current._session_key)) {
|
|
128
|
+
await writeJsonAtomic(row.path, closedRouteState(row.state, missionId, input.reason, row.session_key));
|
|
129
|
+
}
|
|
141
130
|
}
|
|
142
131
|
if (missionId) {
|
|
143
132
|
await appendJsonl(path.join(missionDir(root, missionId), 'events.jsonl'), {
|
|
@@ -150,6 +139,43 @@ export async function closeRouteState(root, input = {}) {
|
|
|
150
139
|
return { ok: true, status: 'closed', mission_id: missionId || null, state_file: targetFile };
|
|
151
140
|
});
|
|
152
141
|
}
|
|
142
|
+
function closedRouteState(current, missionId, reason, sessionKey) {
|
|
143
|
+
const phase = String(current.phase || '');
|
|
144
|
+
return {
|
|
145
|
+
...current,
|
|
146
|
+
mission_id: missionId || current.mission_id || null,
|
|
147
|
+
route_closed: true,
|
|
148
|
+
route_closed_at: nowIso(),
|
|
149
|
+
route_close_reason: reason || 'route_close_command',
|
|
150
|
+
implementation_allowed: false,
|
|
151
|
+
questions_allowed: true,
|
|
152
|
+
mad_sks_active: false,
|
|
153
|
+
permission_gate_active: false,
|
|
154
|
+
gate_owner_mission_id: null,
|
|
155
|
+
phase: phase ? (/_CLOSED$/i.test(phase) ? phase : `${phase}_CLOSED`) : 'ROUTE_CLOSED',
|
|
156
|
+
updated_at: nowIso(),
|
|
157
|
+
...(sessionKey ? { _session_key: sessionKey } : {})
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async function matchingSessionStates(root, missionId, preferredSessionKey) {
|
|
161
|
+
const dir = stateSessionsDir(root);
|
|
162
|
+
const rows = [];
|
|
163
|
+
if (!(await exists(dir)))
|
|
164
|
+
return rows;
|
|
165
|
+
const fs = await import('node:fs/promises');
|
|
166
|
+
const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
167
|
+
for (const entry of entries) {
|
|
168
|
+
if (!entry.isFile() || !entry.name.endsWith('.json'))
|
|
169
|
+
continue;
|
|
170
|
+
const file = path.join(dir, entry.name);
|
|
171
|
+
const state = await readJson(file, {}).catch(() => ({}));
|
|
172
|
+
const key = String(state._session_key || entry.name.replace(/\.json$/, ''));
|
|
173
|
+
if (String(state.mission_id || '') === missionId || (preferredSessionKey && key === String(preferredSessionKey))) {
|
|
174
|
+
rows.push({ session_key: key, path: file, state });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return rows;
|
|
178
|
+
}
|
|
153
179
|
function withStateLock(root, fn) {
|
|
154
180
|
return withFileLock({ lockPath: stateLockPath(root), timeoutMs: 20_000, staleMs: 120_000 }, fn);
|
|
155
181
|
}
|
|
@@ -17,7 +17,7 @@ export const RELEASE_1_17_GATE_SNAPSHOT = Object.freeze([
|
|
|
17
17
|
'release:readiness'
|
|
18
18
|
]);
|
|
19
19
|
export const RELEASE_1_18_REQUIRED_GATES = Object.freeze([
|
|
20
|
-
'
|
|
20
|
+
'super-search:provider-interface',
|
|
21
21
|
'source-intelligence:policy',
|
|
22
22
|
'source-intelligence:all-modes',
|
|
23
23
|
'codex-web:adapter',
|
package/dist/core/retention.js
CHANGED
|
@@ -109,7 +109,7 @@ export async function storageReport(root) {
|
|
|
109
109
|
report.total_human = formatBytes(report.total_bytes);
|
|
110
110
|
return report;
|
|
111
111
|
}
|
|
112
|
-
async function lightweightStorageReport(root) {
|
|
112
|
+
export async function lightweightStorageReport(root) {
|
|
113
113
|
const sks = path.join(root, '.sneakoscope');
|
|
114
114
|
const report = {
|
|
115
115
|
root,
|
|
@@ -9,7 +9,7 @@ export const FROM_CHAT_IMG_CHECKLIST_ARTIFACT = 'from-chat-img-checklist.md';
|
|
|
9
9
|
export const FROM_CHAT_IMG_TEMP_TRIWIKI_ARTIFACT = 'from-chat-img-temp-triwiki.json';
|
|
10
10
|
export const FROM_CHAT_IMG_QA_LOOP_ARTIFACT = 'from-chat-img-qa-loop.json';
|
|
11
11
|
export const FROM_CHAT_IMG_TEMP_TRIWIKI_SESSIONS = 5;
|
|
12
|
-
export const USAGE_TOPICS = 'install|setup|bootstrap|root|deps|zellij|tmux|auto-review|team|qa-loop|ppt|image-ux-review|computer-use|goal|fast-mode|review|ui|research|seo-geo-optimizer|db|git|codex|codex-app|codex-native|hooks|features|all-features|dfix|commit|commit-and-push|design|imagegen|dollar|context7|
|
|
12
|
+
export const USAGE_TOPICS = 'install|setup|bootstrap|root|deps|zellij|tmux|auto-review|team|qa-loop|ppt|image-ux-review|computer-use|goal|fast-mode|review|ui|research|seo-geo-optimizer|db|git|codex|codex-app|codex-native|hooks|features|all-features|dfix|commit|commit-and-push|design|imagegen|dollar|context7|super-search|xai|pipeline|reasoning|guard|conflicts|versioning|eval|harness|hproof|gx|wiki|memory|wrongness|code-structure|proof-field|skill-dream|rust';
|
|
13
13
|
export const RECOMMENDED_MCP_SERVERS = [
|
|
14
14
|
{
|
|
15
15
|
id: 'context7',
|
|
@@ -30,7 +30,7 @@ export const RECOMMENDED_SKILLS = [
|
|
|
30
30
|
'pipeline-runner',
|
|
31
31
|
'solution-scout',
|
|
32
32
|
'context7-docs',
|
|
33
|
-
'
|
|
33
|
+
'super-search',
|
|
34
34
|
'search-visibility-core',
|
|
35
35
|
'seo-geo-optimizer',
|
|
36
36
|
'autoresearch-loop',
|