sneakoscope 7.3.0 → 7.5.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 +117 -5
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/dist/cli/codex-app-command.js +1 -1
- package/dist/cli/command-manifest-lite.js +2 -1
- package/dist/cli/install-helpers-codex-lb-selftest.js +2 -1
- package/dist/cli/install-helpers-install-support.js +6 -16
- package/dist/cli/install-helpers.js +59 -50
- package/dist/cli/router.js +9 -1
- package/dist/config/skills-manifest.json +50 -71
- package/dist/core/codex-app.js +5 -5
- package/dist/core/codex-native/core-skill-manifest.js +9 -6
- package/dist/core/commands/image-ux-review-command.js +243 -50
- package/dist/core/commands/naruto-command.js +245 -8
- package/dist/core/commands/ppt-command.js +2 -2
- package/dist/core/commands/telegram-command.js +123 -10
- package/dist/core/commands/triwiki-command.js +11 -1
- package/dist/core/commands/triwiki-graph-command.js +160 -0
- package/dist/core/commands/wiki-command.js +100 -20
- package/dist/core/errors/message.js +3 -0
- package/dist/core/feature-registry.js +2 -2
- package/dist/core/fsx.js +7 -3
- package/dist/core/hooks-runtime/codex-commit-hooks-selftest.js +82 -0
- package/dist/core/hooks-runtime/context-graph-freshness-preflight.js +113 -0
- package/dist/core/hooks-runtime/official-subagent-lifecycle.js +1 -1
- package/dist/core/hooks-runtime/tool-output-quarantine.js +1 -1
- package/dist/core/hooks-runtime.js +28 -86
- package/dist/core/image-ux-review/callout-extraction.js +6 -0
- package/dist/core/image-ux-review/imagegen-adapter.js +54 -18
- package/dist/core/image-ux-review/real-callout-extractor.js +1 -0
- package/dist/core/image-ux-review.js +182 -7
- package/dist/core/imagegen/codex-lb-imagegen-target.js +22 -7
- package/dist/core/imagegen/imagegen-capability.js +11 -4
- package/dist/core/imagegen/require-imagegen.js +29 -5
- package/dist/core/init/skills.js +22 -10
- package/dist/core/install/installed-package-smoke.js +157 -4
- package/dist/core/managed-path-safety.js +8 -10
- package/dist/core/mcp-config/backup.js +2 -4
- package/dist/core/mcp-config/config-reader.js +2 -4
- package/dist/core/mcp-config/scope.js +3 -5
- package/dist/core/naruto/context-graph-advisor-scope.js +242 -0
- package/dist/core/naruto/context-graph-advisor.js +0 -0
- package/dist/core/pipeline-internals/runtime-core.js +44 -0
- package/dist/core/policy/latest-version-guidance.js +113 -0
- package/dist/core/ppt.js +8 -8
- package/dist/core/release/gate-manifest.js +32 -1
- package/dist/core/release/npm-stage-contract.js +21 -0
- package/dist/core/release/package-size-budget.js +2 -2
- package/dist/core/release/release-gate-contract.js +5 -0
- package/dist/core/release/stage-publish.js +27 -0
- package/dist/core/responses-stream.js +65 -19
- package/dist/core/routes/design-policy.js +7 -2
- package/dist/core/routes/dollar-manifest-lite.js +0 -4
- package/dist/core/routes/evidence.js +1 -1
- package/dist/core/routes.js +12 -8
- package/dist/core/safety/command-contract/contracts.js +2 -0
- package/dist/core/safety/command-contract/types.js +1 -1
- package/dist/core/search/context-graph-seeds.js +205 -0
- package/dist/core/search/context.js +0 -0
- package/dist/core/search/provider.js +2 -2
- package/dist/core/subagents/naruto-help-contract.js +2 -1
- package/dist/core/subagents/naruto-host-credentials.js +161 -0
- package/dist/core/subagents/official-subagent-preparation.js +4 -1
- package/dist/core/subagents/official-subagent-prompt.js +44 -2
- package/dist/core/subagents/official-subagent-runner.js +26 -8
- package/dist/core/subagents/triwiki-attention.js +135 -123
- package/dist/core/telegram/bot-api.js +59 -4
- package/dist/core/telegram/config.js +3 -2
- package/dist/core/telegram/hub.js +3 -2
- package/dist/core/telegram/owner-lock.js +4 -6
- package/dist/core/telegram/setup.js +223 -73
- package/dist/core/triwiki/code-pack.js +12 -120
- package/dist/core/triwiki/context-graph/compiler/cache-key.js +277 -0
- package/dist/core/triwiki/context-graph/compiler/extract.js +104 -0
- package/dist/core/triwiki/context-graph/compiler/freshness.js +108 -0
- package/dist/core/triwiki/context-graph/compiler/index.js +237 -0
- package/dist/core/triwiki/context-graph/compiler/merge.js +0 -0
- package/dist/core/triwiki/context-graph/compiler/serialize.js +115 -0
- package/dist/core/triwiki/context-graph/contracts.js +236 -0
- package/dist/core/triwiki/context-graph/extractors/code/builders.js +150 -0
- package/dist/core/triwiki/context-graph/extractors/code/declarations.js +161 -0
- package/dist/core/triwiki/context-graph/extractors/code/index.js +265 -0
- package/dist/core/triwiki/context-graph/extractors/code/inventory.js +237 -0
- package/dist/core/triwiki/context-graph/extractors/code/module-graph.js +252 -0
- package/dist/core/triwiki/context-graph/extractors/code/modules.js +79 -0
- package/dist/core/triwiki/context-graph/extractors/code/references.js +184 -0
- package/dist/core/triwiki/context-graph/extractors/code/selection.js +100 -0
- package/dist/core/triwiki/context-graph/extractors/code/ts-config.js +161 -0
- package/dist/core/triwiki/context-graph/extractors/code/types.js +18 -0
- package/dist/core/triwiki/context-graph/extractors/evidence/claims.js +289 -0
- package/dist/core/triwiki/context-graph/extractors/evidence/index.js +54 -0
- package/dist/core/triwiki/context-graph/extractors/evidence/proof-index.js +213 -0
- package/dist/core/triwiki/context-graph/extractors/evidence/proofs.js +266 -0
- package/dist/core/triwiki/context-graph/extractors/evidence/redaction.js +177 -0
- package/dist/core/triwiki/context-graph/extractors/evidence/shared.js +0 -0
- package/dist/core/triwiki/context-graph/extractors/evidence/sources.js +154 -0
- package/dist/core/triwiki/context-graph/extractors/index.js +7 -0
- package/dist/core/triwiki/context-graph/extractors/topology/commands.js +207 -0
- package/dist/core/triwiki/context-graph/extractors/topology/gate-edges.js +201 -0
- package/dist/core/triwiki/context-graph/extractors/topology/gates.js +182 -0
- package/dist/core/triwiki/context-graph/extractors/topology/globs.js +124 -0
- package/dist/core/triwiki/context-graph/extractors/topology/index.js +92 -0
- package/dist/core/triwiki/context-graph/extractors/topology/routes.js +135 -0
- package/dist/core/triwiki/context-graph/extractors/topology/shared.js +215 -0
- package/dist/core/triwiki/context-graph/graph-index.js +143 -0
- package/dist/core/triwiki/context-graph/ids.js +0 -0
- package/dist/core/triwiki/context-graph/lint/index.js +0 -0
- package/dist/core/triwiki/context-graph/lint/rules.js +232 -0
- package/dist/core/triwiki/context-graph/lint/warnings.js +93 -0
- package/dist/core/triwiki/context-graph/paths.js +116 -0
- package/dist/core/triwiki/context-graph/profiles.js +78 -0
- package/dist/core/triwiki/context-graph/projections/anchors.js +91 -0
- package/dist/core/triwiki/context-graph/projections/attention.js +58 -0
- package/dist/core/triwiki/context-graph/projections/code-pack-workspace.js +62 -0
- package/dist/core/triwiki/context-graph/projections/code-pack.js +144 -0
- package/dist/core/triwiki/context-graph/projections/index.js +7 -0
- package/dist/core/triwiki/context-graph/projections/module-view.js +140 -0
- package/dist/core/triwiki/context-graph/projections/node-summary.js +118 -0
- package/dist/core/triwiki/context-graph/projections/pack-contract.js +6 -0
- package/dist/core/triwiki/context-graph/query/explain.js +0 -0
- package/dist/core/triwiki/context-graph/query/index.js +178 -0
- package/dist/core/triwiki/context-graph/query/load.js +116 -0
- package/dist/core/triwiki/context-graph/query/pack.js +117 -0
- package/dist/core/triwiki/context-graph/query/rank.js +142 -0
- package/dist/core/triwiki/context-graph/query/ranking-config.js +64 -0
- package/dist/core/triwiki/context-graph/query/seeds.js +241 -0
- package/dist/core/triwiki/context-graph/query/snapshot-cache.js +72 -0
- package/dist/core/triwiki/context-graph/query/traverse.js +154 -0
- package/dist/core/triwiki/context-graph/query-types.js +29 -0
- package/dist/core/triwiki/context-graph/store/compile-lock.js +21 -0
- package/dist/core/triwiki/context-graph/store/event-log.js +48 -0
- package/dist/core/triwiki/context-graph/store/fragment-cache.js +85 -0
- package/dist/core/triwiki/context-graph/store/graph-status.js +85 -0
- package/dist/core/triwiki/context-graph/store/snapshot-store.js +155 -0
- package/dist/core/triwiki/triwiki-proof-bank-index-repair.js +115 -0
- package/dist/core/triwiki/triwiki-proof-bank-index-store.js +290 -0
- package/dist/core/triwiki/triwiki-proof-bank-index.js +126 -0
- package/dist/core/triwiki/triwiki-proof-bank.js +7 -1
- package/dist/core/verification/context-graph-affected.js +271 -0
- package/dist/core/version.js +1 -1
- package/dist/scripts/context-graph-check.js +191 -0
- package/dist/scripts/helper-dedup-check.js +0 -1
- package/dist/scripts/installed-package-smoke-check.js +4 -1
- package/dist/scripts/latest-version-guidance-check.js +74 -0
- package/dist/scripts/release-metadata-check.js +20 -3
- package/dist/scripts/ux-review-imagegen-blackbox-check.js +25 -1
- package/dist/scripts/ux-review-run-wires-imagegen-check.js +9 -1
- package/package.json +5 -3
- package/release-gates.v2.json +174 -0
- package/schemas/triwiki/context-graph.schema.json +119 -0
- package/dist/core/triwiki/code-index-scanner.js +0 -309
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
export const LATEST_VERSION_GUIDANCE_SCHEMA = 'sks.latest-version-guidance.v1';
|
|
2
|
+
const SEMVER_RE = /\b\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?\b/g;
|
|
3
|
+
export const GUIDANCE_TRIGGERS = [
|
|
4
|
+
'current release',
|
|
5
|
+
'current version',
|
|
6
|
+
'currently',
|
|
7
|
+
'preferred',
|
|
8
|
+
'minimum',
|
|
9
|
+
'at least',
|
|
10
|
+
'requires',
|
|
11
|
+
'required',
|
|
12
|
+
'require',
|
|
13
|
+
'must be',
|
|
14
|
+
'must use',
|
|
15
|
+
'update to',
|
|
16
|
+
'upgrade to',
|
|
17
|
+
'recommend',
|
|
18
|
+
'recommended',
|
|
19
|
+
'or later',
|
|
20
|
+
'or newer',
|
|
21
|
+
'or above',
|
|
22
|
+
'supported version',
|
|
23
|
+
'baseline remains',
|
|
24
|
+
'이상',
|
|
25
|
+
'권장',
|
|
26
|
+
'최소',
|
|
27
|
+
'필요합니다',
|
|
28
|
+
'사용하세요'
|
|
29
|
+
];
|
|
30
|
+
export const HISTORICAL_MARKERS = [
|
|
31
|
+
'changelog',
|
|
32
|
+
'historical',
|
|
33
|
+
'history',
|
|
34
|
+
'previously',
|
|
35
|
+
'fixed in',
|
|
36
|
+
'regression',
|
|
37
|
+
'released in',
|
|
38
|
+
'shipped in',
|
|
39
|
+
'was released',
|
|
40
|
+
'compatibility matrix',
|
|
41
|
+
'compatibility snapshot',
|
|
42
|
+
'schema revision',
|
|
43
|
+
'fixture',
|
|
44
|
+
'reproduces',
|
|
45
|
+
'as of the',
|
|
46
|
+
'no longer'
|
|
47
|
+
];
|
|
48
|
+
const STRING_LITERAL_RE = /'(?:[^'\\\n]|\\.)*'|"(?:[^"\\\n]|\\.)*"|`(?:[^`\\]|\\.)*`/g;
|
|
49
|
+
const WINDOW_CHARS = 90;
|
|
50
|
+
function containsTrigger(haystack) {
|
|
51
|
+
const lower = haystack.toLowerCase();
|
|
52
|
+
for (const trigger of GUIDANCE_TRIGGERS) {
|
|
53
|
+
if (lower.includes(trigger.toLowerCase()))
|
|
54
|
+
return trigger;
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
function isHistorical(haystack) {
|
|
59
|
+
const lower = haystack.toLowerCase();
|
|
60
|
+
return HISTORICAL_MARKERS.some((marker) => lower.includes(marker));
|
|
61
|
+
}
|
|
62
|
+
function excerpt(line) {
|
|
63
|
+
const compact = line.trim().replace(/\s+/g, ' ');
|
|
64
|
+
return compact.length > 160 ? `${compact.slice(0, 157)}...` : compact;
|
|
65
|
+
}
|
|
66
|
+
export function scanLatestVersionGuidance(relativePath, text, options = {}) {
|
|
67
|
+
const findings = [];
|
|
68
|
+
const lines = text.split(/\r?\n/);
|
|
69
|
+
for (const [index, rawLine] of lines.entries()) {
|
|
70
|
+
const line = rawLine ?? '';
|
|
71
|
+
const candidates = [];
|
|
72
|
+
if (options.stringLiteralsOnly) {
|
|
73
|
+
STRING_LITERAL_RE.lastIndex = 0;
|
|
74
|
+
let match;
|
|
75
|
+
while ((match = STRING_LITERAL_RE.exec(line)))
|
|
76
|
+
candidates.push(match[0]);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
candidates.push(line);
|
|
80
|
+
}
|
|
81
|
+
if (!candidates.length)
|
|
82
|
+
continue;
|
|
83
|
+
let reported = false;
|
|
84
|
+
for (const candidate of candidates) {
|
|
85
|
+
if (reported)
|
|
86
|
+
break;
|
|
87
|
+
SEMVER_RE.lastIndex = 0;
|
|
88
|
+
let match;
|
|
89
|
+
while ((match = SEMVER_RE.exec(candidate))) {
|
|
90
|
+
const window = candidate.slice(Math.max(0, match.index - WINDOW_CHARS), match.index + match[0].length + WINDOW_CHARS);
|
|
91
|
+
if (isHistorical(window))
|
|
92
|
+
continue;
|
|
93
|
+
const trigger = containsTrigger(window);
|
|
94
|
+
if (!trigger)
|
|
95
|
+
continue;
|
|
96
|
+
findings.push({ path: relativePath, line: index + 1, version: match[0], trigger, excerpt: excerpt(line) });
|
|
97
|
+
reported = true;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return findings;
|
|
103
|
+
}
|
|
104
|
+
export const LATEST_VERSION_GUIDANCE_TEXT = 'Use the official latest stable SKS and Codex CLI releases. Run `sks update-check` and read the capability report for the current state — feature support is decided by capability probes, not by a pinned version number.';
|
|
105
|
+
export function latestVersionGuidanceReport(findings, scannedFiles, exemptions) {
|
|
106
|
+
return {
|
|
107
|
+
schema: LATEST_VERSION_GUIDANCE_SCHEMA,
|
|
108
|
+
ok: findings.length === 0,
|
|
109
|
+
scannedFiles,
|
|
110
|
+
findings: [...findings].sort((left, right) => left.path.localeCompare(right.path) || left.line - right.line),
|
|
111
|
+
exemptions: [...exemptions].sort()
|
|
112
|
+
};
|
|
113
|
+
}
|
package/dist/core/ppt.js
CHANGED
|
@@ -478,7 +478,7 @@ export async function buildPptImageAssetLedger(dir, contract = {}, storyboard =
|
|
|
478
478
|
created_at: nowIso(),
|
|
479
479
|
contract_hash: contract.sealed_hash || null,
|
|
480
480
|
required,
|
|
481
|
-
policy: 'Required PPT image resources must be generated
|
|
481
|
+
policy: 'Required PPT image resources must be generated with gpt-image-2 through the selected Codex provider and recorded as real output files; unrelated API fallback, partial preview frames, fabricated files, and placeholder ledgers do not satisfy this gate.',
|
|
482
482
|
codex_app_imagegen_doc: CODEX_APP_IMAGE_GENERATION_DOC_URL,
|
|
483
483
|
imagegen_execution: {
|
|
484
484
|
required_skill: 'imagegen',
|
|
@@ -511,9 +511,9 @@ export async function buildPptImageAssetLedger(dir, contract = {}, storyboard =
|
|
|
511
511
|
passed,
|
|
512
512
|
notes: [
|
|
513
513
|
required
|
|
514
|
-
? 'The sealed PPT contract requires generated image assets; missing
|
|
514
|
+
? 'The sealed PPT contract requires generated image assets; missing completed gpt-image-2 output from the selected Codex provider blocks the PPT gate.'
|
|
515
515
|
: 'No generated image asset requirement was detected; assets remain optional and are not generated to avoid unrequested API cost.',
|
|
516
|
-
'
|
|
516
|
+
'Generate each blocked asset with gpt-image-2 through Codex App $imagegen or the selected codex-lb provider, place the completed raster under assets/, then rerun the PPT build so existing generated files are verified.'
|
|
517
517
|
]
|
|
518
518
|
};
|
|
519
519
|
}
|
|
@@ -598,7 +598,7 @@ export function buildPptReviewLedger({ contract = {}, storyboard, styleTokens, f
|
|
|
598
598
|
: 'Optional generated image assets were planned but not generated.',
|
|
599
599
|
source: 'ppt_image_asset_ledger',
|
|
600
600
|
action: imageAssetLedger?.required
|
|
601
|
-
? 'Generate the required assets with
|
|
601
|
+
? 'Generate the required assets with gpt-image-2 through the selected Codex provider, place the completed raster files under assets/, then rerun sks ppt build.'
|
|
602
602
|
: 'Generate only if the sealed PPT contract needs image resources.'
|
|
603
603
|
}));
|
|
604
604
|
}
|
|
@@ -638,9 +638,9 @@ export function buildPptReviewLedger({ contract = {}, storyboard, styleTokens, f
|
|
|
638
638
|
id: 'codex-app-imagegen-review-missing',
|
|
639
639
|
severity: 'P1',
|
|
640
640
|
title: 'Required gpt-image-2 visual review evidence missing',
|
|
641
|
-
detail: 'The sealed PPT contract explicitly requested image/gpt-image-2 visual critique, but no
|
|
641
|
+
detail: 'The sealed PPT contract explicitly requested image/gpt-image-2 visual critique, but no completed selected-provider imagegen review evidence was supplied.',
|
|
642
642
|
source: 'codex_app_imagegen_gate',
|
|
643
|
-
action: 'Invoke
|
|
643
|
+
action: 'Invoke gpt-image-2 through Codex App $imagegen or the selected codex-lb provider, run the bounded slide review loop, and record evidence paths before final output.'
|
|
644
644
|
}));
|
|
645
645
|
}
|
|
646
646
|
const blocking = issues.filter((issue) => ['P0', 'P1'].includes(issue.severity));
|
|
@@ -673,7 +673,7 @@ export function buildPptReviewLedger({ contract = {}, storyboard, styleTokens, f
|
|
|
673
673
|
passed: blocking.length === 0 && overallScore >= 0.88,
|
|
674
674
|
notes: [
|
|
675
675
|
'This ledger is an executable deterministic QA pass, not a fake gpt-image-2 result.',
|
|
676
|
-
'When image review is required, missing
|
|
676
|
+
'When image review is required, missing completed selected-provider imagegen evidence blocks the gate instead of being simulated.'
|
|
677
677
|
]
|
|
678
678
|
};
|
|
679
679
|
}
|
|
@@ -1040,7 +1040,7 @@ export function defaultPptGate(contract = {}) {
|
|
|
1040
1040
|
'Do not pass this gate until the HTML/PDF artifact work is actually complete or the PDF export is explicitly deferred with evidence.',
|
|
1041
1041
|
'Audience strategy must stay linked to STP, target pain points, proof, and three or more aha moments.',
|
|
1042
1042
|
'Fact ledger must keep user input separate from verified web evidence and block unsupported critical external claims.',
|
|
1043
|
-
'Image asset ledger must require
|
|
1043
|
+
'Image asset ledger must require completed gpt-image-2 output from the selected Codex provider for required resources, or block with evidence instead of faking files.',
|
|
1044
1044
|
'Review loop must be bounded by score thresholds, P0/P1 issue count, max passes, and explicit imagegen evidence requirements when requested.',
|
|
1045
1045
|
'Preserve the editable HTML source under source-html/ and remove PPT-only temporary build files before completion.',
|
|
1046
1046
|
'Record independent PPT build phases in ppt-parallel-report.json so research/design/render work can stay parallel-friendly.'
|
|
@@ -103,7 +103,19 @@ export function affectedGlobsFor(id) {
|
|
|
103
103
|
case 'publish':
|
|
104
104
|
return ['package.json', '.npmignore', 'src/scripts/packlist-performance-check.ts', 'src/scripts/npm-publish-performance-check.ts', 'dist/**'];
|
|
105
105
|
case 'postinstall':
|
|
106
|
-
return [
|
|
106
|
+
return [
|
|
107
|
+
'src/cli/install-helpers.ts',
|
|
108
|
+
'src/cli/install-helpers-codex-lb-selftest.ts',
|
|
109
|
+
'src/cli/install-helpers-install-support.ts',
|
|
110
|
+
'src/core/init.ts',
|
|
111
|
+
'src/core/install/installed-package-smoke.ts',
|
|
112
|
+
'src/core/routes/design-policy.ts',
|
|
113
|
+
'src/scripts/installed-package-smoke-check.ts',
|
|
114
|
+
'src/scripts/postinstall-safe-side-effects-check.ts',
|
|
115
|
+
'test/blackbox/postinstall-safe-side-effects-packed.test.mjs',
|
|
116
|
+
'test/unit/postinstall-command.test.mjs',
|
|
117
|
+
'test/unit/publish-workflow-safety.test.mjs'
|
|
118
|
+
];
|
|
107
119
|
case 'runtime':
|
|
108
120
|
return ['src/**', 'src/scripts/runtime-*.ts', 'src/scripts/build-dist.ts', 'src/scripts/clean-dist.ts', 'package.json'];
|
|
109
121
|
case 'agent':
|
|
@@ -131,6 +143,25 @@ export function affectedGlobsFor(id) {
|
|
|
131
143
|
'src/core/codex-lb-circuit.ts',
|
|
132
144
|
`src/scripts/${prefix}-*.ts`
|
|
133
145
|
];
|
|
146
|
+
case 'context-graph':
|
|
147
|
+
return [
|
|
148
|
+
'src/core/triwiki/context-graph/**',
|
|
149
|
+
'src/core/search/context.ts',
|
|
150
|
+
'src/core/search/context-graph-seeds.ts',
|
|
151
|
+
'src/core/subagents/triwiki-attention.ts',
|
|
152
|
+
'src/core/triwiki/code-pack.ts',
|
|
153
|
+
'src/core/naruto/context-graph-advisor.ts',
|
|
154
|
+
'src/core/naruto/context-graph-advisor-scope.ts',
|
|
155
|
+
'src/core/verification/context-graph-affected.ts',
|
|
156
|
+
'src/core/commands/wiki-command.ts',
|
|
157
|
+
'src/core/commands/triwiki-graph-command.ts',
|
|
158
|
+
'config/context-graph-benchmark.json',
|
|
159
|
+
'schemas/triwiki/context-graph.schema.json',
|
|
160
|
+
'src/scripts/context-graph-check.ts',
|
|
161
|
+
'package.json'
|
|
162
|
+
];
|
|
163
|
+
case 'latest-version':
|
|
164
|
+
return ['README.md', 'docs/**', 'src/**', 'native/**', 'src/scripts/latest-version-guidance-check.ts', 'package.json'];
|
|
134
165
|
case 'release':
|
|
135
166
|
return ['src/core/release/**', 'src/scripts/release-parallel-check.ts', 'src/scripts/release-*.ts', 'package.json'];
|
|
136
167
|
default:
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const REQUIRED_NPM_STAGE_CLI_VERSION = '11.15.0';
|
|
2
|
+
export function exactNpmStageCliInvocation(platform = process.platform) {
|
|
3
|
+
return {
|
|
4
|
+
command: platform === 'win32' ? 'npx.cmd' : 'npx',
|
|
5
|
+
args: ['--yes', `npm@${REQUIRED_NPM_STAGE_CLI_VERSION}`]
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function localNpmStageReviewEnvironmentBlocker(env) {
|
|
9
|
+
const oidcKeys = [
|
|
10
|
+
'ACTIONS_ID_TOKEN_REQUEST_TOKEN',
|
|
11
|
+
'ACTIONS_ID_TOKEN_REQUEST_URL',
|
|
12
|
+
'NPM_ID_TOKEN',
|
|
13
|
+
'SIGSTORE_ID_TOKEN'
|
|
14
|
+
];
|
|
15
|
+
if (env.GITHUB_ACTIONS === 'true' || oidcKeys.some((key) => Boolean(String(env[key] || '').trim()))) {
|
|
16
|
+
return 'oidc_environment_not_allowed';
|
|
17
|
+
}
|
|
18
|
+
if (env.CI === 'true' || env.CI === '1')
|
|
19
|
+
return 'ci_environment_not_allowed';
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const DEFAULT_MAX_PACK_BYTES =
|
|
2
|
-
export const DEFAULT_MAX_UNPACKED_BYTES =
|
|
1
|
+
export const DEFAULT_MAX_PACK_BYTES = 2650 * 1024;
|
|
2
|
+
export const DEFAULT_MAX_UNPACKED_BYTES = 11_950_000;
|
|
@@ -33,6 +33,10 @@ export const RELEASE_GATE_CONTRACT_IDS = Object.freeze([
|
|
|
33
33
|
'codex:app-handoff-comprehensive',
|
|
34
34
|
'codex:product-design-plugin-routing',
|
|
35
35
|
'config:managed-merge',
|
|
36
|
+
'context-graph:contract',
|
|
37
|
+
'context-graph:legacy-closure',
|
|
38
|
+
'context-graph:performance',
|
|
39
|
+
'context-graph:quality',
|
|
36
40
|
'context7:evidence-dedupe',
|
|
37
41
|
'core-skill:card-schema-deployment-snapshot',
|
|
38
42
|
'core-skill:heldout-validation',
|
|
@@ -62,6 +66,7 @@ export const RELEASE_GATE_CONTRACT_IDS = Object.freeze([
|
|
|
62
66
|
'hooks:concurrent-session-collision',
|
|
63
67
|
'image:artifact-path-contract',
|
|
64
68
|
'init-deep:backup-retention',
|
|
69
|
+
'latest-version:guidance',
|
|
65
70
|
'legacy:gate-inventory',
|
|
66
71
|
'legacy:gate-purge',
|
|
67
72
|
'legacy:strong-inventory',
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import { RELEASE_ORIGIN_IDENTITY, releaseOriginIdentity } from './release-origin.js';
|
|
4
|
+
import { exactNpmStageCliInvocation, localNpmStageReviewEnvironmentBlocker, REQUIRED_NPM_STAGE_CLI_VERSION } from './npm-stage-contract.js';
|
|
4
5
|
export const STAGE_PUBLISH_SCHEMA = 'sks.release-stage-publish.v1';
|
|
5
6
|
export const STAGE_WORKFLOW_FILE = 'publish-npm.yml';
|
|
6
7
|
export const RELEASE_BRANCH = 'main';
|
|
@@ -100,6 +101,26 @@ function runPreflight(opts, version) {
|
|
|
100
101
|
const origin = releaseOriginIdentity(opts.root);
|
|
101
102
|
const originOk = origin.identity === RELEASE_ORIGIN_IDENTITY;
|
|
102
103
|
steps.push(step('origin', originOk, origin.identity || null, originOk ? null : 'stage_origin_identity_mismatch'));
|
|
104
|
+
const stampVerifier = path.join(opts.root, 'dist', 'scripts', 'release-check-stamp.js');
|
|
105
|
+
const stamp = opts.run(process.execPath, [stampVerifier, 'verify']);
|
|
106
|
+
const stampOk = stamp.status === 0;
|
|
107
|
+
steps.push(step('release_stamp', stampOk, stampOk ? 'current source-bound full release stamp verified' : compactProcessOutput(stamp), stampOk ? null : 'stage_release_stamp_invalid'));
|
|
108
|
+
const verifier = path.join(opts.root, 'dist', 'scripts', 'npm-stage-tarball-verifier.js');
|
|
109
|
+
const verifierReady = fs.existsSync(verifier);
|
|
110
|
+
steps.push(step('local_review_verifier', verifierReady, verifierReady ? verifier : null, verifierReady ? null : 'stage_verifier_unavailable_outside_checkout'));
|
|
111
|
+
const reviewEnvironmentBlocker = localNpmStageReviewEnvironmentBlocker(opts.env || process.env);
|
|
112
|
+
steps.push(step('local_review_environment', reviewEnvironmentBlocker === null, reviewEnvironmentBlocker === null ? 'maintainer-local' : reviewEnvironmentBlocker, reviewEnvironmentBlocker === null ? null : `stage_${reviewEnvironmentBlocker}`));
|
|
113
|
+
const npmInvocation = exactNpmStageCliInvocation();
|
|
114
|
+
const npmStageCli = opts.run(npmInvocation.command, [...npmInvocation.args, '--version']);
|
|
115
|
+
const npmStageCliVersion = text(npmStageCli);
|
|
116
|
+
const npmStageCliReady = npmStageCli.status === 0 && npmStageCliVersion === REQUIRED_NPM_STAGE_CLI_VERSION;
|
|
117
|
+
steps.push(step('npm_stage_cli', npmStageCliReady, npmStageCliReady
|
|
118
|
+
? `${npmStageCliVersion} via ${[npmInvocation.command, ...npmInvocation.args].join(' ')}`
|
|
119
|
+
: compactProcessOutput(npmStageCli) || npmStageCliVersion || null, npmStageCliReady
|
|
120
|
+
? null
|
|
121
|
+
: npmStageCli.status === 0
|
|
122
|
+
? 'stage_npm_cli_version_mismatch'
|
|
123
|
+
: 'stage_npm_cli_unavailable'));
|
|
103
124
|
const gh = opts.run('gh', ['auth', 'status']);
|
|
104
125
|
steps.push(step('gh_auth', gh.status === 0, gh.status === 0 ? 'authenticated' : null, gh.status === 0 ? null : 'stage_gh_not_authenticated'));
|
|
105
126
|
const commit = text(opts.run('git', ['rev-parse', 'HEAD'])) || null;
|
|
@@ -186,6 +207,12 @@ function safeJsonArray(value) {
|
|
|
186
207
|
function text(result) {
|
|
187
208
|
return String(result.stdout || '').trim();
|
|
188
209
|
}
|
|
210
|
+
function compactProcessOutput(result) {
|
|
211
|
+
return String(result.stderr || result.stdout || '')
|
|
212
|
+
.trim()
|
|
213
|
+
.replace(/\s+/g, ' ')
|
|
214
|
+
.slice(0, 240) || null;
|
|
215
|
+
}
|
|
189
216
|
function step(id, ok, detail = null, blocker = null) {
|
|
190
217
|
return { id, ok, attempted: true, detail, blocker };
|
|
191
218
|
}
|
|
@@ -37,21 +37,29 @@ export function findStreamedImageOutput(events) {
|
|
|
37
37
|
for (const event of events) {
|
|
38
38
|
const type = String(event?.type || '');
|
|
39
39
|
const item = event?.item;
|
|
40
|
-
|
|
40
|
+
const partialEvent = type === 'response.image_generation_call.partial_image'
|
|
41
|
+
|| type.endsWith('.image_generation_call.partial_image');
|
|
42
|
+
if (partialEvent) {
|
|
43
|
+
const partialB64 = b64Of(event?.partial_image_b64)
|
|
44
|
+
|| b64Of(event?.b64_json)
|
|
45
|
+
|| b64Of(event?.result)
|
|
46
|
+
|| b64Of(item?.partial_image_b64)
|
|
47
|
+
|| b64Of(item?.b64_json)
|
|
48
|
+
|| b64Of(item?.result);
|
|
49
|
+
if (partialB64)
|
|
50
|
+
partial = { id: event?.item_id || item?.id || null, b64: partialB64, partial: true };
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (type === 'response.output_item.done' && item && String(item.type || '') === 'image_generation_call') {
|
|
41
54
|
const b64 = b64Of(item.result) || b64Of(item.b64_json);
|
|
42
55
|
if (b64)
|
|
43
56
|
final = { id: item.id || event?.item_id || null, b64, partial: false };
|
|
44
57
|
continue;
|
|
45
58
|
}
|
|
46
|
-
if (
|
|
59
|
+
if (type === 'response.image_generation_call.completed' || type === 'response.image_generation_call.done') {
|
|
47
60
|
const b64 = b64Of(event?.result) || b64Of(event?.b64_json);
|
|
48
|
-
if (b64)
|
|
61
|
+
if (b64)
|
|
49
62
|
final = { id: event?.item_id || event?.id || null, b64, partial: false };
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
const partialB64 = b64Of(event?.partial_image_b64);
|
|
53
|
-
if (partialB64)
|
|
54
|
-
partial = { id: event?.item_id || null, b64: partialB64, partial: true };
|
|
55
63
|
}
|
|
56
64
|
}
|
|
57
65
|
return final || partial;
|
|
@@ -86,22 +94,46 @@ export function parseResponsesSsePayload(text) {
|
|
|
86
94
|
if (output.length) {
|
|
87
95
|
if (hasImageGenerationResult(completed.response) || !streamedImage)
|
|
88
96
|
return completed.response;
|
|
97
|
+
if (streamedImage.partial) {
|
|
98
|
+
return {
|
|
99
|
+
...completed.response,
|
|
100
|
+
image_output_partial_frame: true,
|
|
101
|
+
partial_image_output_present: true
|
|
102
|
+
};
|
|
103
|
+
}
|
|
89
104
|
return {
|
|
90
105
|
...completed.response,
|
|
91
106
|
output: [...output, streamedImageItem(streamedImage)],
|
|
92
107
|
image_output_recovered_from_stream: true,
|
|
93
|
-
image_output_partial_frame:
|
|
108
|
+
image_output_partial_frame: false,
|
|
109
|
+
image_output_provenance: 'response.output_item.done'
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (!recovered.length) {
|
|
113
|
+
if (!streamedImage?.partial)
|
|
114
|
+
return completed.response;
|
|
115
|
+
return {
|
|
116
|
+
...completed.response,
|
|
117
|
+
image_output_partial_frame: true,
|
|
118
|
+
partial_image_output_present: true
|
|
94
119
|
};
|
|
95
120
|
}
|
|
96
|
-
if (!recovered.length)
|
|
97
|
-
return completed.response;
|
|
98
121
|
return {
|
|
99
122
|
...completed.response,
|
|
100
123
|
output: recovered,
|
|
101
124
|
output_recovered_from_stream: true,
|
|
102
|
-
...(streamedImage
|
|
103
|
-
? {
|
|
104
|
-
|
|
125
|
+
...(streamedImage?.partial
|
|
126
|
+
? {
|
|
127
|
+
image_output_partial_frame: true,
|
|
128
|
+
partial_image_output_present: true
|
|
129
|
+
}
|
|
130
|
+
: streamedImage
|
|
131
|
+
? {
|
|
132
|
+
image_output_recovered_from_stream: true,
|
|
133
|
+
image_output_partial_frame: false,
|
|
134
|
+
image_output_provenance: 'response.output_item.done'
|
|
135
|
+
}
|
|
136
|
+
: {})
|
|
105
137
|
};
|
|
106
138
|
}
|
|
107
139
|
if (recovered.length) {
|
|
@@ -110,13 +142,27 @@ export function parseResponsesSsePayload(text) {
|
|
|
110
142
|
status: 'completed',
|
|
111
143
|
output: recovered,
|
|
112
144
|
output_recovered_from_stream: true,
|
|
113
|
-
...(streamedImage
|
|
114
|
-
? {
|
|
115
|
-
|
|
145
|
+
...(streamedImage?.partial
|
|
146
|
+
? {
|
|
147
|
+
image_output_partial_frame: true,
|
|
148
|
+
partial_image_output_present: true
|
|
149
|
+
}
|
|
150
|
+
: streamedImage
|
|
151
|
+
? {
|
|
152
|
+
image_output_recovered_from_stream: true,
|
|
153
|
+
image_output_partial_frame: false,
|
|
154
|
+
image_output_provenance: 'response.output_item.done'
|
|
155
|
+
}
|
|
156
|
+
: {}),
|
|
116
157
|
events: eventTypes
|
|
117
158
|
};
|
|
118
159
|
}
|
|
119
|
-
return {
|
|
160
|
+
return {
|
|
161
|
+
object: 'response.sse',
|
|
162
|
+
status: 'unknown',
|
|
163
|
+
...(streamedImage?.partial ? { image_output_partial_frame: true, partial_image_output_present: true } : {}),
|
|
164
|
+
events: eventTypes
|
|
165
|
+
};
|
|
120
166
|
}
|
|
121
167
|
export function responsesOutputText(payload) {
|
|
122
168
|
const direct = typeof payload?.output_text === 'string' ? payload.output_text : '';
|
|
@@ -134,7 +180,7 @@ export function responsesOutputText(payload) {
|
|
|
134
180
|
function recoveredOutput(items, streamedImage) {
|
|
135
181
|
const output = [...items];
|
|
136
182
|
const hasImage = output.some((item) => String(item?.type || '') === 'image_generation_call' && b64Of(item?.result));
|
|
137
|
-
if (streamedImage && !hasImage)
|
|
183
|
+
if (streamedImage && !streamedImage.partial && !hasImage)
|
|
138
184
|
output.push(streamedImageItem(streamedImage));
|
|
139
185
|
return output;
|
|
140
186
|
}
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import { PRODUCT_DESIGN_PLUGIN, PRODUCT_DESIGN_REQUIRED_SKILLS, productDesignPluginPolicyText } from '../product-design-plugin.js';
|
|
2
2
|
import { CODEX_APP_IMAGE_GENERATION_DOC_URL, CODEX_COMPUTER_USE_ONLY_POLICY, CODEX_IMAGEGEN_REQUIRED_POLICY, CODEX_WEB_VERIFICATION_POLICY } from './evidence.js';
|
|
3
3
|
export { productDesignPluginPolicyText };
|
|
4
|
+
const GETDESIGN_CODEX_SKILL_REPOSITORY = 'MohtashamMurshid/getdesign';
|
|
5
|
+
const GETDESIGN_CODEX_SKILL_REF = '83e9840d4a5744b5f10117ec00b855059e5abc25';
|
|
4
6
|
export const GETDESIGN_REFERENCE = {
|
|
5
7
|
id: 'getdesign',
|
|
6
8
|
url: 'https://getdesign.md/',
|
|
7
9
|
docs_url: 'https://docs.getdesign.app/',
|
|
8
10
|
official_urls_url: 'https://docs.getdesign.app/resources/official-urls/',
|
|
9
11
|
codex_guide_url: 'https://docs.getdesign.app/guides/use-with-codex/',
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
codex_skill_repository: GETDESIGN_CODEX_SKILL_REPOSITORY,
|
|
13
|
+
codex_skill_ref: GETDESIGN_CODEX_SKILL_REF,
|
|
14
|
+
codex_skill: GETDESIGN_CODEX_SKILL_REPOSITORY,
|
|
15
|
+
codex_skill_install: `skills add ${GETDESIGN_CODEX_SKILL_REPOSITORY} -g -a codex -y`,
|
|
16
|
+
codex_skill_install_mode: 'manual_only',
|
|
12
17
|
npm_cli: '@getdesign/cli',
|
|
13
18
|
npm_sdk: '@getdesign/sdk',
|
|
14
19
|
official_mcp_available: false,
|
|
@@ -18,7 +18,6 @@ const DOLLAR_COMMANDS_LITE_BASE = [
|
|
|
18
18
|
{ command: '$QA-LOOP', route: 'QA loop', description: 'Dogfood UI/API as human proxy with safety gates, Codex Chrome Extension-first web UI evidence, safe fixes, rechecks, Honest Mode.' },
|
|
19
19
|
{ command: '$PPT', route: 'HTML/PDF presentation pipeline', description: 'Create restrained, information-first HTML/PDF presentation artifacts after delivery context, audience profile, STP, decision context, pain-point, research, design-system, and verification questions are sealed.' },
|
|
20
20
|
{ command: '$Image-UX-Review', route: 'image-generation UI/UX review loop', description: 'Review UI/UX through the imagegen/gpt-image-2 visual critique loop: source screenshots become generated annotated review images, those images become issue ledgers, then fixes are rechecked.' },
|
|
21
|
-
{ command: '$UX-Review', route: 'image-generation UI/UX review loop', description: 'Review UI/UX through the imagegen/gpt-image-2 visual critique loop: source screenshots become generated annotated review images, those images become issue ledgers, then fixes are rechecked.' },
|
|
22
21
|
{ command: '$Computer-Use', route: 'native Computer Use fast lane', description: COMPUTER_USE_DESCRIPTION },
|
|
23
22
|
{ command: '$CU', route: 'native Computer Use fast lane', description: COMPUTER_USE_DESCRIPTION },
|
|
24
23
|
{ command: '$Goal', route: 'Codex native /goal control', description: 'Use Codex native Goal directly with detailed completion criteria; SKS creates no Goal mission, artifact, loop, or fallback state.' },
|
|
@@ -52,9 +51,6 @@ const DOLLAR_COMMAND_ALIASES_LITE_BASE = [
|
|
|
52
51
|
{ canonical: '$QA-LOOP', app_skill: '$qa-loop' },
|
|
53
52
|
{ canonical: '$PPT', app_skill: '$ppt' },
|
|
54
53
|
{ canonical: '$Image-UX-Review', app_skill: '$image-ux-review' },
|
|
55
|
-
{ canonical: '$Image-UX-Review', app_skill: '$ux-review' },
|
|
56
|
-
{ canonical: '$Image-UX-Review', app_skill: '$visual-review' },
|
|
57
|
-
{ canonical: '$Image-UX-Review', app_skill: '$ui-ux-review' },
|
|
58
54
|
{ canonical: '$Computer-Use', app_skill: '$computer-use-fast' },
|
|
59
55
|
{ canonical: '$Computer-Use', app_skill: '$cu' },
|
|
60
56
|
{ canonical: '$Goal', app_skill: '$goal' },
|
|
@@ -24,7 +24,7 @@ export const CODEX_QA_SURFACE_ROUTING_POLICY = `Codex QA surface routing follows
|
|
|
24
24
|
export const CODEX_WEB_VERIFICATION_POLICY = CODEX_QA_SURFACE_ROUTING_POLICY;
|
|
25
25
|
export const CODEX_COMPUTER_USE_ONLY_POLICY = `Codex Computer Use is a live GUI surface for supported macOS and Windows environments, invoked with @Computer or @AppName for native apps, OS settings, browser contexts that truly require GUI-level operation, and cross-app workflows. Do not replace @Browser localhost/public-page checks or @Chrome signed-in checks with Computer Use unless the surface router records a specific GUI-only/cross-app reason. If live Computer Use tools, permissions, or app access are unavailable, mark the affected native/GUI evidence blocked or unverified instead of fabricating screenshots or actions. Codex App readiness/config checks are capability evidence only, not target interaction proof.`;
|
|
26
26
|
export const IMAGEGEN_SOCIAL_SOURCE_POLICY = 'Use public X/social/community reports only as prompt-quality and workflow-sentiment hints after official OpenAI/Codex docs. Social posts are not capability specs, evidence of tool availability, or proof that a generated asset was created.';
|
|
27
|
-
export const CODEX_IMAGEGEN_REQUIRED_POLICY = 'Pipeline image generation, raster asset creation/editing, and generated image-review evidence must use
|
|
27
|
+
export const CODEX_IMAGEGEN_REQUIRED_POLICY = 'Pipeline image generation, raster asset creation/editing, and generated image-review evidence must use gpt-image-2 through the user-selected Codex provider when that evidence is required for full verification: Codex App imagegen/$imagegen, or the selected and ready codex-lb Responses provider. Only completed response output or a final response.output_item.done image result qualifies; streamed partial preview frames never count as generated-image evidence. For newest-model image requests, prompt explicitly for "ChatGPT Images 2.0 / GPT Image 2.0 with gpt-image-2" instead of relying on generic image-generation wording. Do not substitute placeholder SVG/HTML/CSS, prose-only critique, stock-like stand-ins, manually fabricated files, or missing-output ledgers for requested/generated raster assets or required generated review images. If imagegen/gpt-image-2 is unavailable or generated annotated images cannot be created/linked, record the blocker and cap any closeout at verified_partial/reference-only instead of claiming generated-image evidence or full route verification; that partial closeout requires source screenshots plus hashes, docs evidence, source Image Voxel anchors, and Honest Mode evidence. In Codex App prompts, invoke $imagegen when live image generation is needed; SKS hooks and skills can require the policy but cannot attach missing host image-generation tools to an already-started turn. Official OpenAI/Codex docs are authoritative for capabilities, surfaces, limits, and evidence rules; X/social/community reports may inform prompt style only.';
|
|
28
28
|
export const DEFAULT_CODEX_APP_PLUGINS = Object.freeze([
|
|
29
29
|
['browser', 'openai-bundled'],
|
|
30
30
|
['chrome', 'openai-bundled'],
|
package/dist/core/routes.js
CHANGED
|
@@ -258,7 +258,7 @@ export const ROUTES = [
|
|
|
258
258
|
reasoningPolicy: 'high',
|
|
259
259
|
stopGate: 'naruto-gate.json',
|
|
260
260
|
coverage_required: true,
|
|
261
|
-
cliEntrypoint: 'sks naruto run "task" [--agents N] [--max-threads N] [--trusted-project] | sks naruto status|subagents|proof',
|
|
261
|
+
cliEntrypoint: 'sks naruto run "task" [--agents N] [--max-threads N] [--trusted-project] | sks naruto status|subagents|proof | sks naruto parent-summary --mission M-... --stdin',
|
|
262
262
|
examples: ['$Naruto run review twelve independent packages with --agents 12', '$Work']
|
|
263
263
|
},
|
|
264
264
|
{
|
|
@@ -310,8 +310,7 @@ export const ROUTES = [
|
|
|
310
310
|
route: 'image-generation UI/UX review loop',
|
|
311
311
|
description: 'Review UI/UX through the imagegen/gpt-image-2 visual critique loop: source screenshots become generated annotated review images, those images become issue ledgers, then fixes are rechecked.',
|
|
312
312
|
requiredSkills: ['image-ux-review', 'imagegen', 'cu', 'pipeline-runner', REFLECTION_SKILL_NAME, 'honest-mode'],
|
|
313
|
-
|
|
314
|
-
appSkillAliases: ['ux-review', 'visual-review', 'ui-ux-review'],
|
|
313
|
+
hiddenDollarAliases: ['$UX-Review', '$Visual-Review', '$UI-UX-Review'],
|
|
315
314
|
lifecycle: ['target_and_capture_inventory', 'source_screenshots', 'gpt_image_2_annotated_review_image', 'generated_image_text_extraction', 'issue_ledger', 'optional_safe_fixes', 'changed_screen_recheck', 'post_route_reflection', 'honest_mode'],
|
|
316
315
|
context7Policy: 'if_external_docs',
|
|
317
316
|
reasoningPolicy: 'high',
|
|
@@ -632,7 +631,7 @@ export const COMMAND_CATALOG = [
|
|
|
632
631
|
{ name: 'uninstall', usage: 'sks uninstall [--dry-run] [--yes] [--keep-config] [--keep-data] [--purge-projects] [--json]', description: 'Remove SKS global skills, hooks, menu bar, state, temp files, and optional project residue while preserving user-owned content by default.' },
|
|
633
632
|
{ name: 'deps', usage: 'sks deps check [--json] [--yes]', description: 'Check Node/npm, Codex CLI, and Zellij readiness; pass --yes to repair missing Codex CLI/Zellij tooling when supported.' },
|
|
634
633
|
{ name: 'codex', usage: 'sks codex compatibility|version|update-status [--refresh]|update|doctor|schema|0.144 [--json]', description: 'Check Codex CLI compatibility/version/update status, run the official `codex update`, and inspect current manifest, capability, and hook-schema evidence.' },
|
|
635
|
-
{ name: 'codex-app', usage: 'sks codex-app [check|set-openrouter-key --api-key-stdin|use-openrouter --model <id>|openrouter-status|product-design|chrome-extension|pat status|remote-control]', description: 'Check Codex App install, OpenRouter provider activation, codex-lb key-entry guidance, Product Design plugin readiness, Codex Chrome Extension web verification readiness, PAT-safe status, first-party MCP/plugin readiness, and Codex CLI
|
|
634
|
+
{ name: 'codex-app', usage: 'sks codex-app [check|set-openrouter-key --api-key-stdin|use-openrouter --model <id>|openrouter-status|product-design|chrome-extension|pat status|remote-control]', description: 'Check Codex App install, OpenRouter provider activation, codex-lb key-entry guidance, Product Design plugin readiness, Codex Chrome Extension web verification readiness, PAT-safe status, first-party MCP/plugin readiness, and Codex CLI remote-control availability.' },
|
|
636
635
|
{ name: 'codex-native', usage: 'sks codex-native status|feature-broker|invocation-plan|init-deep [--json]', description: 'Inspect Codex Native feature broker readiness, invocation routing, pattern evidence, and managed memory setup.' },
|
|
637
636
|
{ name: 'hooks', usage: 'sks hooks explain|status|trust-report|replay|codex-validate|warning-check ... [--json]', description: 'Explain Codex hook events, validate vendored latest 10-event output schemas, replay fixtures, and enforce warning-zero SKS hook policies under the 0.134 compatibility matrix.' },
|
|
638
637
|
{ name: 'codex-lb', usage: 'sks codex-lb status|health|metrics|doctor|circuit|repair|setup ...', description: 'Configure, health-check, repair, and record circuit evidence for codex-lb provider auth without confusing ChatGPT OAuth and proxy keys.' },
|
|
@@ -688,7 +687,7 @@ export const COMMAND_CATALOG = [
|
|
|
688
687
|
{ name: 'wiki', usage: 'sks wiki coords|pack|refresh|publish|rebuild-index|validate|validate-shared|wrongness ...', description: 'Build, refresh, publish shared shards, rebuild ignored indexes, validate, and attach wrongness-memory context to RGBA/trig LLM Wiki packs with attention.use_first and attention.hydrate_first for compact recall plus source hydration.' },
|
|
689
688
|
{ name: 'memory', usage: 'sks memory build [--json] | sks memory gc [--dry-run]', description: 'Project TriWiki context-pack memory into managed AGENTS.md blocks or run bounded memory cleanup.' },
|
|
690
689
|
{ name: 'hproof', usage: 'sks hproof check [mission-id|latest]', description: 'Evaluate the H-Proof done gate for a mission.' },
|
|
691
|
-
{ name: 'naruto', usage: 'sks naruto run \"task\" [--agents N] [--max-threads N] [--trusted-project] [--json] | sks naruto status|subagents|proof [latest|M-...] [--json]', description: 'Run or inspect the Codex official subagent workflow with a Sol Max parent and fixed Luna Max mechanical, Sol High implementation, Sol Max judgment, and Terra Medium long-context/tool profiles, max_depth=1, and structured parent-thread completion evidence.' },
|
|
690
|
+
{ name: 'naruto', usage: 'sks naruto run \"task\" [--agents N] [--max-threads N] [--trusted-project] [--json] | sks naruto status|subagents|proof [latest|M-...] [--json] | sks naruto parent-summary --mission M-... --stdin [--json]', description: 'Run or inspect the Codex official subagent workflow with a Sol Max parent and fixed Luna Max mechanical, Sol High implementation, Sol Max judgment, and Terra Medium long-context/tool profiles, max_depth=1, and structured parent-thread completion evidence.' },
|
|
692
691
|
{ name: 'reasoning', usage: 'sks reasoning ["prompt"] [--json]', description: 'Show SKS temporary reasoning-effort routing: medium for simple tasks, high for logic, xhigh for research.' },
|
|
693
692
|
{ name: 'gx', usage: 'sks gx init|render|validate|drift|snapshot [name]', description: 'Create and verify deterministic SVG/HTML visual context cartridges.' },
|
|
694
693
|
{ name: 'profile', usage: 'sks profile show|set <model>', description: 'Inspect or set the current SKS model profile metadata.' },
|
|
@@ -743,10 +742,15 @@ export function explicitManagedSkillNames(prompt = '') {
|
|
|
743
742
|
const skillName = sksPrefixedSkillName(match.name);
|
|
744
743
|
if (!skillName || skillName.length > 100)
|
|
745
744
|
continue;
|
|
746
|
-
|
|
747
|
-
|
|
745
|
+
const matchedRoute = routeByDollarCommand(match.name);
|
|
746
|
+
if (matchedRoute) {
|
|
747
|
+
const canonicalRouteSkillName = sksPrefixedSkillName(dollarSkillName(matchedRoute.command));
|
|
748
|
+
const selectedSkillName = MANAGED_ROUTE_SKILL_NAME_SET.has(skillName)
|
|
749
|
+
? skillName
|
|
750
|
+
: canonicalRouteSkillName;
|
|
751
|
+
if (!MANAGED_ROUTE_SKILL_NAME_SET.has(selectedSkillName) || selected.includes(selectedSkillName))
|
|
748
752
|
continue;
|
|
749
|
-
selected.push(
|
|
753
|
+
selected.push(selectedSkillName);
|
|
750
754
|
continue;
|
|
751
755
|
}
|
|
752
756
|
if (!rawName.startsWith('sks-'))
|
|
@@ -17,6 +17,7 @@ const ARGUMENT_PROFILES = {
|
|
|
17
17
|
mission: boundedString(1, 160),
|
|
18
18
|
agents: { type: 'integer', minimum: 1 },
|
|
19
19
|
max_threads: { type: 'integer', minimum: 1 },
|
|
20
|
+
stdin: { type: 'boolean' },
|
|
20
21
|
readonly: { type: 'boolean' },
|
|
21
22
|
trusted_project: { type: 'boolean' },
|
|
22
23
|
json: { type: 'boolean' }
|
|
@@ -34,6 +35,7 @@ const ARGUMENT_PROFILES = {
|
|
|
34
35
|
...valueFlag(input, 'mission', '--mission'),
|
|
35
36
|
...numberFlag(input, 'agents', '--agents'),
|
|
36
37
|
...numberFlag(input, 'max_threads', '--max-threads'),
|
|
38
|
+
...booleanFlag(input, 'stdin', '--stdin'),
|
|
37
39
|
...booleanFlag(input, 'readonly', '--readonly'),
|
|
38
40
|
...booleanFlag(input, 'trusted_project', '--trusted-project'),
|
|
39
41
|
...jsonFlag(input)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const NARUTO_ACTIONS = ['run', 'status', 'subagents', 'proof', 'help'];
|
|
1
|
+
export const NARUTO_ACTIONS = ['run', 'status', 'subagents', 'proof', 'parent-summary', 'help'];
|