sneakoscope 8.2.0 → 8.3.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 +46 -110
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/dist/cli/command-manifest-lite.js +0 -2
- package/dist/cli/command-registry.js +0 -2
- package/dist/commands/codex.js +3 -3
- package/dist/commands/doctor.js +5 -157
- package/dist/config/skills-manifest.json +1 -1
- package/dist/core/codex/codex-cli-syntax-builder.js +0 -8
- package/dist/core/codex-app/codex-models-cache.js +2 -1
- package/dist/core/codex-app/menubar/constants.js +0 -7
- package/dist/core/codex-compat/codex-capability-matrix.js +7 -7
- package/dist/core/codex-compat/codex-compat-report.js +8 -12
- package/dist/core/codex-compat/codex-runtime-contract.js +62 -0
- package/dist/core/codex-compat/codex-version-policy.js +7 -7
- package/dist/core/codex-control/codex-current-app-capability.js +3 -3
- package/dist/core/codex-control/codex-current-capability.js +67 -94
- package/dist/core/codex-control/codex-current-core-capability.js +3 -3
- package/dist/core/codex-control/codex-current-core-probe-runner.js +4 -4
- package/dist/core/codex-control/codex-current-core-real-probes.js +2 -2
- package/dist/core/codex-control/codex-current-feature-capability.js +4 -4
- package/dist/core/codex-control/codex-current-image-path-real-probe.js +1 -1
- package/dist/core/codex-control/codex-current-web-search-probe.js +1 -1
- package/dist/core/codex-control/codex-sdk-capability.js +2 -2
- package/dist/core/commands/remote-command.js +2 -2
- package/dist/core/context7-client.js +5 -2
- package/dist/core/doctor/codex-current-core-probe-doctor.js +2 -2
- package/dist/core/doctor/doctor-dirty-planner.js +1 -1
- package/dist/core/doctor/doctor-readiness-matrix.js +0 -7
- package/dist/core/feature-fixtures.js +0 -4
- package/dist/core/feature-registry.js +0 -1
- package/dist/core/image-ux-review.js +3 -3
- package/dist/core/install/installed-package-smoke.js +2 -3
- package/dist/core/mad-sks/sql-plane/mcp-executor.js +4 -3
- package/dist/core/mcp/modern-protocol.js +36 -0
- package/dist/core/mcp-config/health-check.js +45 -30
- package/dist/core/perf/release-latency-slo.js +1 -2
- package/dist/core/proof/runtime-truth-matrix.js +1 -1
- package/dist/core/release/canonical-test-proof.js +1 -2
- package/dist/core/release/gate-manifest.js +5 -2
- package/dist/core/release/physical-release-gates.js +0 -26
- package/dist/core/release/release-gate-affected-selector.js +2 -1
- package/dist/core/release/release-gate-contract.js +3 -1
- package/dist/core/release/release-pack-receipt.js +0 -1
- package/dist/core/release/stage-publish.js +1 -1
- package/dist/core/version-manager.js +4 -0
- package/dist/core/version.js +1 -1
- package/dist/native/sks-menubar/Sources/AppDelegate.swift +1 -12
- package/dist/native/sks-menubar/Sources/ControlCenterWindowController.swift +2 -6
- package/dist/native/sks-menubar/Sources/RemoteCodingViewController.swift +28 -471
- package/dist/native/sks-menubar/Sources/SecureProcessEnvelope.swift +1 -43
- package/dist/scripts/codex-current-app-server-v2-check.js +9 -8
- package/dist/scripts/codex-current-binary-identity-check.js +2 -2
- package/dist/scripts/codex-current-capability-check.js +9 -7
- package/dist/scripts/codex-current-dependency-check.js +21 -0
- package/dist/scripts/docs-truthfulness-check.js +4 -19
- package/dist/scripts/fast-codex-service-tier-proof-check.js +0 -1
- package/dist/scripts/install-surface-ssot-check.js +2 -2
- package/dist/scripts/latest-version-guidance-check.js +1 -1
- package/dist/scripts/packlist-performance-check.js +0 -1
- package/dist/scripts/release-metadata-check.js +4 -1
- package/dist/scripts/release-version-truth-check.js +149 -0
- package/dist/vendor/openai-codex/latest/hooks/permission-request.command.input.schema.json +6 -0
- package/dist/vendor/openai-codex/latest/hooks/permission-request.command.output.schema.json +2 -16
- package/dist/vendor/openai-codex/latest/hooks/post-compact.command.input.schema.json +6 -0
- package/dist/vendor/openai-codex/latest/hooks/post-tool-use.command.input.schema.json +6 -0
- package/dist/vendor/openai-codex/latest/hooks/post-tool-use.command.output.schema.json +2 -16
- package/dist/vendor/openai-codex/latest/hooks/pre-compact.command.input.schema.json +6 -0
- package/dist/vendor/openai-codex/latest/hooks/pre-tool-use.command.input.schema.json +6 -0
- package/dist/vendor/openai-codex/latest/hooks/pre-tool-use.command.output.schema.json +2 -16
- package/dist/vendor/openai-codex/latest/hooks/session-start.command.output.schema.json +2 -16
- package/dist/vendor/openai-codex/latest/hooks/snapshot-metadata.json +7 -5
- package/dist/vendor/openai-codex/latest/hooks/subagent-start.command.output.schema.json +4 -18
- package/dist/vendor/openai-codex/latest/hooks/user-prompt-submit.command.input.schema.json +6 -0
- package/dist/vendor/openai-codex/latest/hooks/user-prompt-submit.command.output.schema.json +2 -16
- package/package.json +4 -7
- package/release-gates.v2.json +49 -19
- package/config/codex-releases/rust-v0.146.0.json +0 -45
- package/dist/core/agents/agent-runner-codex-exec.js +0 -177
- package/dist/core/codex-compat/codex-release-manifest.js +0 -72
- package/dist/core/commands/telegram-command.js +0 -447
- package/dist/core/telegram/access.js +0 -58
- package/dist/core/telegram/client.js +0 -157
- package/dist/core/telegram/confirmation.js +0 -37
- package/dist/core/telegram/doctor.js +0 -154
- package/dist/core/telegram/index.js +0 -9
- package/dist/core/telegram/keychain.js +0 -317
- package/dist/core/telegram/liveness.js +0 -124
- package/dist/core/telegram/poller.js +0 -90
- package/dist/core/telegram/redaction.js +0 -15
- package/dist/core/telegram/state-lock.js +0 -416
- package/dist/core/telegram/types.js +0 -1
- package/dist/native/sks-menubar/Sources/TelegramPrivateFileStore.swift +0 -498
- package/dist/native/sks-menubar/Sources/TelegramPrivateFileSupport.swift +0 -236
- package/dist/native/sks-menubar/Sources/TelegramProcessGateway.swift +0 -454
- package/dist/native/sks-menubar/Sources/TelegramRuntimeSupport.swift +0 -56
- package/dist/native/sks-menubar/Sources/TelegramStateLock.swift +0 -448
- package/dist/native/sks-menubar/Sources/TelegramSupport.swift +0 -243
- package/dist/native/sks-menubar/Sources/TelegramTransport.swift +0 -499
- package/dist/scripts/codex-current-manifest-check.js +0 -29
- package/schemas/codex/app-server-0.146/codex_app_server_protocol.v2.schemas.json +0 -19858
|
@@ -4,14 +4,16 @@ import { CODEX_CURRENT_FEATURE_KEYS, detectCodexCurrentCapability, writeCodexCur
|
|
|
4
4
|
const requireReal = process.argv.includes('--require-real') || process.env.SKS_REQUIRE_CODEX_CURRENT === '1';
|
|
5
5
|
if (!requireReal)
|
|
6
6
|
process.env.SKS_CODEX_CURRENT_FAKE = '1';
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
const artifact = requireReal
|
|
8
|
+
? await writeCodexCurrentCapabilityArtifacts(process.cwd(), { requireReal: true })
|
|
9
|
+
: null;
|
|
10
|
+
const cap = artifact?.report || await detectCodexCurrentCapability({ requireReal });
|
|
11
|
+
assertGate(cap.ok === true, 'Current package-derived Codex capability probe must pass', cap);
|
|
12
|
+
assertGate(Object.keys(cap.feature_states).length === CODEX_CURRENT_FEATURE_KEYS.length, 'Current Codex feature count mismatch', cap);
|
|
13
|
+
assertGate(Object.values(cap.feature_states).every((state) => String(state.certainty) !== 'assumed_by_version'), 'Current Codex capability must not use assumed_by_version evidence', cap);
|
|
11
14
|
if (requireReal) {
|
|
12
|
-
assertGate(cap.probe_mode === 'real-schema', 'Current Codex
|
|
13
|
-
assertGate(cap.release_authorizing === true, 'Current Codex
|
|
14
|
-
await writeCodexCurrentCapabilityArtifacts(process.cwd(), { requireReal: true });
|
|
15
|
+
assertGate(cap.probe_mode === 'real-schema', 'Current Codex require-real must use generated schema evidence', cap);
|
|
16
|
+
assertGate(cap.release_authorizing === true, 'Current Codex require-real must be release-authorizing', cap);
|
|
15
17
|
}
|
|
16
18
|
emitGate('codex:current:capability', {
|
|
17
19
|
features: CODEX_CURRENT_FEATURE_KEYS.length,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { assertGate, emitGate, readJson } from './gate-lib.js';
|
|
3
|
+
import { CURRENT_CODEX_RUNTIME_CONTRACT, codexSdkDependencyVersion } from '../core/codex-compat/codex-runtime-contract.js';
|
|
4
|
+
const pkg = readJson('package.json');
|
|
5
|
+
const lock = readJson('package-lock.json');
|
|
6
|
+
const expected = codexSdkDependencyVersion();
|
|
7
|
+
const lockSdk = lock.packages?.['node_modules/@openai/codex-sdk']?.version;
|
|
8
|
+
const lockCli = lock.packages?.['node_modules/@openai/codex']?.version;
|
|
9
|
+
const lockRootVersion = lock.packages?.['']?.version || lock.version;
|
|
10
|
+
const packageFiles = Array.isArray(pkg.files) ? pkg.files.map(String) : [];
|
|
11
|
+
assertGate(pkg.dependencies?.['@openai/codex-sdk'] === expected, 'package.json must pin @openai/codex-sdk to one exact semver', { expected });
|
|
12
|
+
assertGate(lockSdk === expected, 'package-lock must resolve @openai/codex-sdk to the package.json pin', { expected, lockSdk });
|
|
13
|
+
assertGate(lockCli === expected, 'package-lock must resolve @openai/codex to the SDK dependency version', { expected, lockCli });
|
|
14
|
+
assertGate(pkg.version === lockRootVersion, 'package version must match package-lock root version', { version: pkg.version, lockRootVersion });
|
|
15
|
+
assertGate(!packageFiles.some((entry) => entry.startsWith('config/codex-releases/')), 'package must not ship a second version-specific Codex release manifest', { packageFiles });
|
|
16
|
+
assertGate(!packageFiles.some((entry) => entry.startsWith('schemas/codex/app-server-')), 'package must generate the current App Server schema from the resolved runtime instead of shipping a versioned snapshot', { packageFiles });
|
|
17
|
+
emitGate('codex:current:dependency-graph', {
|
|
18
|
+
dependency_source: CURRENT_CODEX_RUNTIME_CONTRACT.dependencySource,
|
|
19
|
+
sdk_version: expected,
|
|
20
|
+
target_tag: CURRENT_CODEX_RUNTIME_CONTRACT.targetTag
|
|
21
|
+
});
|
|
@@ -19,13 +19,13 @@ const files = [
|
|
|
19
19
|
'docs/release-readiness.md'
|
|
20
20
|
];
|
|
21
21
|
const required = {
|
|
22
|
-
'README.md': ['CHANGELOG.md', 'docs/release-readiness.md', 'gpt-image-2', '
|
|
22
|
+
'README.md': ['CHANGELOG.md', 'docs/release-readiness.md', 'gpt-image-2', 'https://paseo.sh/', 'paseo run --provider codex'],
|
|
23
23
|
'CHANGELOG.md': ['1.14.0', 'DFix Extreme Speed Kernel', 'hook trust doctor', 'warning-zero'],
|
|
24
24
|
'docs/computer-use-evidence.md': ['sks.computer-use-live-evidence.v1', 'probe_only', 'live_capture_blocked', 'local-only', 'Codex Chrome Extension'],
|
|
25
25
|
'docs/codex-lb.md': ['durable_env_file', 'durable_keychain', 'shell_profile', 'process_only_ephemeral', 'base URL only'],
|
|
26
|
-
'docs/codex-cli-compat.md': ['
|
|
27
|
-
'docs/codex-app.md': ['
|
|
28
|
-
'docs/official-docs-compat.md': ['official-docs-compat-report.js', '
|
|
26
|
+
'docs/codex-cli-compat.md': ['package.json', 'runtime-generated', 'SubagentStart', 'sks_zero_warning_disallowed', 'strict subset'],
|
|
27
|
+
'docs/codex-app.md': ['package.json', 'App Server v2', 'Codex Chrome Extension', 'gpt-image-2'],
|
|
28
|
+
'docs/official-docs-compat.md': ['official-docs-compat-report.js', 'runtime-generated', 'gpt-image-2', 'input_fidelity', 'additionalProperties:false'],
|
|
29
29
|
'docs/hooks-pat.md': ['SubagentStop', 'strict subset', 'zero-warning'],
|
|
30
30
|
'docs/goal-to-loop-migration.md': ['only persisted goal owner', 'creates no SKS mission', '--legacy-goal-runtime', 'fail with an instruction'],
|
|
31
31
|
'docs/known-gaps.md': ['No P0', 'P1'],
|
|
@@ -91,21 +91,6 @@ for (const file of files) {
|
|
|
91
91
|
forbidden: forbiddenMatches
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
|
-
const readmeText = fs.readFileSync(path.join(root, 'README.md'), 'utf8');
|
|
95
|
-
const telegramOnboardingSteps = [
|
|
96
|
-
'sks telegram setup --token-stdin',
|
|
97
|
-
'sks menubar restart',
|
|
98
|
-
'sks telegram pair --json',
|
|
99
|
-
'/sks status {}'
|
|
100
|
-
];
|
|
101
|
-
const telegramOnboardingIndexes = telegramOnboardingSteps.map((step) => readmeText.indexOf(step));
|
|
102
|
-
const telegramOnboardingOrdered = telegramOnboardingIndexes.every((index, position) => index >= 0 && (position === 0 || index > telegramOnboardingIndexes[position - 1]));
|
|
103
|
-
results.push({
|
|
104
|
-
file: 'README.md#telegram-onboarding-order',
|
|
105
|
-
ok: telegramOnboardingOrdered,
|
|
106
|
-
missing: telegramOnboardingOrdered ? [] : telegramOnboardingSteps,
|
|
107
|
-
forbidden: []
|
|
108
|
-
});
|
|
109
94
|
for (const file of currentDollarSurfaceFiles) {
|
|
110
95
|
const full = path.join(root, file);
|
|
111
96
|
const text = fs.existsSync(full) ? fs.readFileSync(full, 'utf8') : '';
|
|
@@ -28,7 +28,6 @@ fs.writeFileSync(path.join(reportDir, 'worker-process-report.json'), `${JSON.str
|
|
|
28
28
|
const proof = await fastMode.writeFastModePropagationProof(temp, { policy: fastMode.resolveFastModePolicy({ fastMode: true }) });
|
|
29
29
|
const ok = args.includes('-c')
|
|
30
30
|
&& args.includes('service_tier=fast')
|
|
31
|
-
&& !args.includes('--full-auto')
|
|
32
31
|
&& !args.includes('--dangerously-bypass-approvals-and-sandbox')
|
|
33
32
|
&& proof.ok === true;
|
|
34
33
|
console.log(JSON.stringify({ schema: 'sks.fast-codex-service-tier-proof-check.v1', ok, args, proof }, null, 2));
|
|
@@ -24,7 +24,7 @@ if (pluginVersion && packageVersion && pluginVersion !== packageVersion) {
|
|
|
24
24
|
blockers.push(`marketplace_plugin_version_mismatch:${pluginVersion}!=${packageVersion}`);
|
|
25
25
|
}
|
|
26
26
|
else if (!pluginVersion) {
|
|
27
|
-
|
|
27
|
+
blockers.push('marketplace_plugin_version_absent');
|
|
28
28
|
}
|
|
29
29
|
else {
|
|
30
30
|
notes.push(`marketplace_plugin_version_matches:${pluginVersion}`);
|
|
@@ -78,7 +78,7 @@ else {
|
|
|
78
78
|
const report = {
|
|
79
79
|
schema: 'sks.install-surface-ssot-check.v1',
|
|
80
80
|
ok: blockers.length === 0,
|
|
81
|
-
install_ssot: '
|
|
81
|
+
install_ssot: 'package.json#version',
|
|
82
82
|
package_version: packageVersion || null,
|
|
83
83
|
plugin_version: pluginVersion || null,
|
|
84
84
|
path_sks_version: pathVersion || null,
|
|
@@ -5,7 +5,7 @@ import { assertGate, emitGate, importDist, root } from './gate-lib.js';
|
|
|
5
5
|
const { scanLatestVersionGuidance, latestVersionGuidanceReport } = await importDist('core/policy/latest-version-guidance.js');
|
|
6
6
|
const DOC_EXEMPT_RE = /(?:^|\/)(?:CHANGELOG|RECALLPULSE_[^/]*|known-gaps|release-proof-truth)\.md$|compat|codex-0|migration|legacy-upgrade|sks-4-migration|-tasks\.md$/i;
|
|
7
7
|
const SOURCE_EXEMPT = new Set([
|
|
8
|
-
'src/core/codex-compat/codex-
|
|
8
|
+
'src/core/codex-compat/codex-runtime-contract.ts',
|
|
9
9
|
'src/core/release/npm-stage-tarball-verifier-support.ts'
|
|
10
10
|
]);
|
|
11
11
|
const SOURCE_EXEMPT_DIR_RE = /^src\/(?:scripts|vendor|generated)\//;
|
|
@@ -62,7 +62,6 @@ const packProof = writeNpmPackProof(root, info, packMs);
|
|
|
62
62
|
const runtimeManifest = JSON.parse(fs.readFileSync(path.join(root, 'runtime-required-scripts.json'), 'utf8'));
|
|
63
63
|
const runtimeScriptClosure = analyzeRuntimeScriptPackClosure(root);
|
|
64
64
|
const customerPayloadForbidden = [
|
|
65
|
-
'dist/core/telegram/controller.js',
|
|
66
65
|
'dist/core/agents/agent-cleanup-executor.js',
|
|
67
66
|
'dist/core/release/npm-stage-tarball-verifier.js',
|
|
68
67
|
'dist/core/release/npm-stage-tarball-verifier-support.js'
|
|
@@ -43,6 +43,7 @@ const requiredPackageScripts = [
|
|
|
43
43
|
'typecheck',
|
|
44
44
|
'release:check',
|
|
45
45
|
'release:metadata',
|
|
46
|
+
'release:version-truth',
|
|
46
47
|
'release:check:affected',
|
|
47
48
|
'release:check:fast',
|
|
48
49
|
'release:check:confidence',
|
|
@@ -61,7 +62,7 @@ const requiredPackageScripts = [
|
|
|
61
62
|
];
|
|
62
63
|
const requiredReleaseGates = [
|
|
63
64
|
'architecture:guard',
|
|
64
|
-
'codex:current:
|
|
65
|
+
'codex:current:dependency-graph',
|
|
65
66
|
'codex:current:binary-identity',
|
|
66
67
|
'codex:current:policy',
|
|
67
68
|
'codex:current:app-server-v2',
|
|
@@ -70,6 +71,7 @@ const requiredReleaseGates = [
|
|
|
70
71
|
'commands:current-surface-only',
|
|
71
72
|
'config:managed-merge',
|
|
72
73
|
'docs:truthfulness',
|
|
74
|
+
'install-surface:ssot',
|
|
73
75
|
'latest-version:guidance',
|
|
74
76
|
'migration:current-surface-e2e',
|
|
75
77
|
'migration:upgrade-safety',
|
|
@@ -83,6 +85,7 @@ const requiredReleaseGates = [
|
|
|
83
85
|
'release:latency-slo',
|
|
84
86
|
'release:proof-truth',
|
|
85
87
|
'release:provenance',
|
|
88
|
+
'release:version-truth',
|
|
86
89
|
'policy:gate-audit',
|
|
87
90
|
'safety:mutation-callsite-coverage',
|
|
88
91
|
'schema:check',
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { spawnSync } from 'node:child_process';
|
|
5
|
+
import { assertGate, emitGate, root } from './gate-lib.js';
|
|
6
|
+
const pkg = readJson('package.json');
|
|
7
|
+
const expected = String(pkg.version || '');
|
|
8
|
+
const mismatches = [];
|
|
9
|
+
const warnings = [];
|
|
10
|
+
let checked = 0;
|
|
11
|
+
checkJson('package.json', 'version', pkg.version);
|
|
12
|
+
const lock = readJson('package-lock.json');
|
|
13
|
+
checkJson('package-lock.json', 'version', lock.version);
|
|
14
|
+
checkJson('package-lock.json', 'packages[""].version', lock.packages?.['']?.version);
|
|
15
|
+
const plugin = readJson('plugins/sks/.codex-plugin/plugin.json');
|
|
16
|
+
checkJson('plugins/sks/.codex-plugin/plugin.json', 'version', plugin.version);
|
|
17
|
+
checkRegex('src/core/version.ts', /PACKAGE_VERSION\s*=\s*['"]([^'"]+)['"]/, 'PACKAGE_VERSION');
|
|
18
|
+
checkReExportOrRegex('src/core/fsx.ts', /PACKAGE_VERSION\s*}\s*from\s*['"]\.\/version(?:\.js)?['"]/, /PACKAGE_VERSION\s*=\s*['"]([^'"]+)['"]/, 'PACKAGE_VERSION');
|
|
19
|
+
checkReExportOrRegex('src/bin/sks.ts', /PACKAGE_VERSION\s*}\s*from\s*['"]\.\.\/core\/version(?:\.js)?['"]/, /FAST_PACKAGE_VERSION\s*=\s*['"]([^'"]+)['"]/, 'FAST_PACKAGE_VERSION');
|
|
20
|
+
checkRegex('crates/sks-core/Cargo.toml', /^version\s*=\s*"([^"]+)"/m, 'package.version');
|
|
21
|
+
checkCargoLock('crates/sks-core/Cargo.lock', 'sks-core');
|
|
22
|
+
const dist = readJson('dist/build-manifest.json', null);
|
|
23
|
+
checkJson('dist/build-manifest.json', 'package_version', dist?.package_version);
|
|
24
|
+
checkJson('dist/build-manifest.json', 'version', dist?.version);
|
|
25
|
+
checkChangelog();
|
|
26
|
+
checkReadme();
|
|
27
|
+
checkReleaseMetadataScript();
|
|
28
|
+
checkCargoMetadata();
|
|
29
|
+
const ok = mismatches.length === 0;
|
|
30
|
+
const report = {
|
|
31
|
+
schema: 'sks.release-version-truth.v1',
|
|
32
|
+
ok,
|
|
33
|
+
expected,
|
|
34
|
+
checked,
|
|
35
|
+
mismatches,
|
|
36
|
+
warnings,
|
|
37
|
+
generated_at: new Date().toISOString()
|
|
38
|
+
};
|
|
39
|
+
const out = path.join(root, '.sneakoscope', 'reports', 'release-version-truth.json');
|
|
40
|
+
fs.mkdirSync(path.dirname(out), { recursive: true });
|
|
41
|
+
fs.writeFileSync(out, `${JSON.stringify(report, null, 2)}\n`);
|
|
42
|
+
assertGate(ok, 'release version truth mismatch', { expected, mismatches });
|
|
43
|
+
emitGate('release:version-truth', { version: expected, checked, warnings: warnings.length });
|
|
44
|
+
function checkJson(file, field, actual) {
|
|
45
|
+
checked += 1;
|
|
46
|
+
if (actual !== expected)
|
|
47
|
+
mismatch(file, field, actual);
|
|
48
|
+
}
|
|
49
|
+
function checkRegex(file, re, field) {
|
|
50
|
+
checked += 1;
|
|
51
|
+
const text = readText(file);
|
|
52
|
+
const match = text.match(re);
|
|
53
|
+
if (!match)
|
|
54
|
+
mismatch(file, field, null);
|
|
55
|
+
else if (match[1] !== expected)
|
|
56
|
+
mismatch(file, field, match[1]);
|
|
57
|
+
}
|
|
58
|
+
function checkReExportOrRegex(file, reExportRe, literalRe, field) {
|
|
59
|
+
const text = readText(file);
|
|
60
|
+
if (reExportRe.test(text)) {
|
|
61
|
+
checked += 1;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
checkRegex(file, literalRe, field);
|
|
65
|
+
}
|
|
66
|
+
function checkCargoLock(file, name) {
|
|
67
|
+
checked += 1;
|
|
68
|
+
const text = readText(file);
|
|
69
|
+
const block = text.split(/\n\[\[package\]\]\n/).find((part) => new RegExp(`name\\s*=\\s*"${escapeRe(name)}"`).test(part));
|
|
70
|
+
const match = block?.match(/version\s*=\s*"([^"]+)"/);
|
|
71
|
+
if (!match)
|
|
72
|
+
mismatch(file, `${name}.version`, null);
|
|
73
|
+
else if (match[1] !== expected)
|
|
74
|
+
mismatch(file, `${name}.version`, match[1]);
|
|
75
|
+
}
|
|
76
|
+
function checkChangelog() {
|
|
77
|
+
checked += 1;
|
|
78
|
+
const text = readText('CHANGELOG.md');
|
|
79
|
+
const latest = latestVersionedChangelogSection(text);
|
|
80
|
+
if (latest !== expected)
|
|
81
|
+
mismatch('CHANGELOG.md', 'latest release section', latest);
|
|
82
|
+
}
|
|
83
|
+
function checkReadme() {
|
|
84
|
+
checked += 1;
|
|
85
|
+
const text = readText('README.md');
|
|
86
|
+
const displayed = text.match(/\*\*SKS ([0-9]+\.[0-9]+\.[0-9]+)\*\*/)?.[1] || null;
|
|
87
|
+
if (!displayed)
|
|
88
|
+
mismatch('README.md', 'displayed current version', null);
|
|
89
|
+
else if (displayed !== expected)
|
|
90
|
+
mismatch('README.md', 'displayed current version', displayed);
|
|
91
|
+
}
|
|
92
|
+
function checkReleaseMetadataScript() {
|
|
93
|
+
checked += 1;
|
|
94
|
+
const script = String(pkg.scripts?.['release:metadata'] || '');
|
|
95
|
+
if (!script.includes('dist/scripts/release-metadata-check.js')) {
|
|
96
|
+
mismatch('package.json', 'scripts.release:metadata', script || null, 'node ./dist/scripts/release-metadata-check.js');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function checkCargoMetadata() {
|
|
100
|
+
checked += 1;
|
|
101
|
+
const res = spawnSync('cargo', ['metadata', '--no-deps', '--manifest-path', path.join(root, 'crates/sks-core/Cargo.toml'), '--format-version', '1'], {
|
|
102
|
+
cwd: root,
|
|
103
|
+
encoding: 'utf8',
|
|
104
|
+
timeout: 30000
|
|
105
|
+
});
|
|
106
|
+
if (res.status !== 0) {
|
|
107
|
+
warnings.push({ file: 'crates/sks-core/Cargo.toml', message: 'cargo metadata unavailable', stderr_tail: tail(res.stderr) });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const metadata = JSON.parse(res.stdout);
|
|
112
|
+
const crate = metadata.packages?.find((row) => row.name === 'sks-core');
|
|
113
|
+
if (crate?.version !== expected)
|
|
114
|
+
mismatch('cargo metadata', 'sks-core.version', crate?.version || null);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
warnings.push({ file: 'cargo metadata', message: `unparseable:${err instanceof Error ? err.message : String(err)}` });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function mismatch(file, field, actual, wanted = expected) {
|
|
121
|
+
mismatches.push({ file, field, expected: wanted, actual: actual ?? null });
|
|
122
|
+
}
|
|
123
|
+
function readJson(rel, fallback) {
|
|
124
|
+
try {
|
|
125
|
+
return JSON.parse(readText(rel));
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
if (arguments.length > 1)
|
|
129
|
+
return fallback;
|
|
130
|
+
throw err;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function readText(rel) {
|
|
134
|
+
return fs.readFileSync(path.join(root, rel), 'utf8');
|
|
135
|
+
}
|
|
136
|
+
function escapeRe(value) {
|
|
137
|
+
return String(value).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
138
|
+
}
|
|
139
|
+
function latestVersionedChangelogSection(text) {
|
|
140
|
+
for (const match of text.matchAll(/^## \[([^\]]+)\]/gm)) {
|
|
141
|
+
if (/^[0-9]+\.[0-9]+\.[0-9]+$/.test(match[1]))
|
|
142
|
+
return match[1];
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
function tail(value, limit = 1000) {
|
|
147
|
+
const text = String(value || '');
|
|
148
|
+
return text.length > limit ? text.slice(-limit) : text;
|
|
149
|
+
}
|
|
@@ -2,21 +2,6 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"additionalProperties": false,
|
|
4
4
|
"definitions": {
|
|
5
|
-
"HookEventNameWire": {
|
|
6
|
-
"enum": [
|
|
7
|
-
"PreToolUse",
|
|
8
|
-
"PermissionRequest",
|
|
9
|
-
"PostToolUse",
|
|
10
|
-
"PreCompact",
|
|
11
|
-
"PostCompact",
|
|
12
|
-
"SessionStart",
|
|
13
|
-
"UserPromptSubmit",
|
|
14
|
-
"SubagentStart",
|
|
15
|
-
"SubagentStop",
|
|
16
|
-
"Stop"
|
|
17
|
-
],
|
|
18
|
-
"type": "string"
|
|
19
|
-
},
|
|
20
5
|
"PermissionRequestBehaviorWire": {
|
|
21
6
|
"enum": [
|
|
22
7
|
"allow",
|
|
@@ -65,7 +50,8 @@
|
|
|
65
50
|
"default": null
|
|
66
51
|
},
|
|
67
52
|
"hookEventName": {
|
|
68
|
-
"
|
|
53
|
+
"const": "PermissionRequest",
|
|
54
|
+
"type": "string"
|
|
69
55
|
}
|
|
70
56
|
},
|
|
71
57
|
"required": [
|
|
@@ -8,21 +8,6 @@
|
|
|
8
8
|
],
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
|
-
"HookEventNameWire": {
|
|
12
|
-
"enum": [
|
|
13
|
-
"PreToolUse",
|
|
14
|
-
"PermissionRequest",
|
|
15
|
-
"PostToolUse",
|
|
16
|
-
"PreCompact",
|
|
17
|
-
"PostCompact",
|
|
18
|
-
"SessionStart",
|
|
19
|
-
"UserPromptSubmit",
|
|
20
|
-
"SubagentStart",
|
|
21
|
-
"SubagentStop",
|
|
22
|
-
"Stop"
|
|
23
|
-
],
|
|
24
|
-
"type": "string"
|
|
25
|
-
},
|
|
26
11
|
"PostToolUseHookSpecificOutputWire": {
|
|
27
12
|
"additionalProperties": false,
|
|
28
13
|
"properties": {
|
|
@@ -31,7 +16,8 @@
|
|
|
31
16
|
"type": "string"
|
|
32
17
|
},
|
|
33
18
|
"hookEventName": {
|
|
34
|
-
"
|
|
19
|
+
"const": "PostToolUse",
|
|
20
|
+
"type": "string"
|
|
35
21
|
},
|
|
36
22
|
"updatedMCPToolOutput": {
|
|
37
23
|
"default": null
|
|
@@ -2,21 +2,6 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"additionalProperties": false,
|
|
4
4
|
"definitions": {
|
|
5
|
-
"HookEventNameWire": {
|
|
6
|
-
"enum": [
|
|
7
|
-
"PreToolUse",
|
|
8
|
-
"PermissionRequest",
|
|
9
|
-
"PostToolUse",
|
|
10
|
-
"PreCompact",
|
|
11
|
-
"PostCompact",
|
|
12
|
-
"SessionStart",
|
|
13
|
-
"UserPromptSubmit",
|
|
14
|
-
"SubagentStart",
|
|
15
|
-
"SubagentStop",
|
|
16
|
-
"Stop"
|
|
17
|
-
],
|
|
18
|
-
"type": "string"
|
|
19
|
-
},
|
|
20
5
|
"PreToolUseDecisionWire": {
|
|
21
6
|
"enum": [
|
|
22
7
|
"approve",
|
|
@@ -32,7 +17,8 @@
|
|
|
32
17
|
"type": "string"
|
|
33
18
|
},
|
|
34
19
|
"hookEventName": {
|
|
35
|
-
"
|
|
20
|
+
"const": "PreToolUse",
|
|
21
|
+
"type": "string"
|
|
36
22
|
},
|
|
37
23
|
"permissionDecision": {
|
|
38
24
|
"allOf": [
|
|
@@ -2,21 +2,6 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"additionalProperties": false,
|
|
4
4
|
"definitions": {
|
|
5
|
-
"HookEventNameWire": {
|
|
6
|
-
"enum": [
|
|
7
|
-
"PreToolUse",
|
|
8
|
-
"PermissionRequest",
|
|
9
|
-
"PostToolUse",
|
|
10
|
-
"PreCompact",
|
|
11
|
-
"PostCompact",
|
|
12
|
-
"SessionStart",
|
|
13
|
-
"UserPromptSubmit",
|
|
14
|
-
"SubagentStart",
|
|
15
|
-
"SubagentStop",
|
|
16
|
-
"Stop"
|
|
17
|
-
],
|
|
18
|
-
"type": "string"
|
|
19
|
-
},
|
|
20
5
|
"SessionStartHookSpecificOutputWire": {
|
|
21
6
|
"additionalProperties": false,
|
|
22
7
|
"properties": {
|
|
@@ -25,7 +10,8 @@
|
|
|
25
10
|
"type": "string"
|
|
26
11
|
},
|
|
27
12
|
"hookEventName": {
|
|
28
|
-
"
|
|
13
|
+
"const": "SessionStart",
|
|
14
|
+
"type": "string"
|
|
29
15
|
}
|
|
30
16
|
},
|
|
31
17
|
"required": [
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
"upstream": "openai/codex",
|
|
4
4
|
"upstream_url": "https://github.com/openai/codex",
|
|
5
5
|
"tag": "latest",
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
6
|
+
"source_tag": "rust-v0.147.0",
|
|
7
|
+
"commit": "be6e8eac029b183056b7e4402879f15d2c85f61b",
|
|
8
|
+
"codex_version": "0.147.0",
|
|
9
|
+
"captured_at": "2026-08-07T05:18:28Z",
|
|
9
10
|
"schema_files_count": 20,
|
|
10
11
|
"events": [
|
|
11
12
|
"PreToolUse",
|
|
@@ -21,7 +22,8 @@
|
|
|
21
22
|
],
|
|
22
23
|
"source_path": "codex-rs/hooks/schema/generated",
|
|
23
24
|
"notes": [
|
|
24
|
-
"Captured from upstream OpenAI Codex
|
|
25
|
-
"
|
|
25
|
+
"Captured from the current package-tracked upstream OpenAI Codex release using generated hook schema fixtures.",
|
|
26
|
+
"The latest directory is version-neutral; source_tag and commit preserve capture provenance.",
|
|
27
|
+
"SubagentStart and SubagentStop are release-blocking events for SKS hook compatibility."
|
|
26
28
|
]
|
|
27
29
|
}
|
|
@@ -2,22 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"additionalProperties": false,
|
|
4
4
|
"definitions": {
|
|
5
|
-
"
|
|
6
|
-
"enum": [
|
|
7
|
-
"PreToolUse",
|
|
8
|
-
"PermissionRequest",
|
|
9
|
-
"PostToolUse",
|
|
10
|
-
"PreCompact",
|
|
11
|
-
"PostCompact",
|
|
12
|
-
"SessionStart",
|
|
13
|
-
"UserPromptSubmit",
|
|
14
|
-
"SubagentStart",
|
|
15
|
-
"SubagentStop",
|
|
16
|
-
"Stop"
|
|
17
|
-
],
|
|
18
|
-
"type": "string"
|
|
19
|
-
},
|
|
20
|
-
"SessionStartHookSpecificOutputWire": {
|
|
5
|
+
"SubagentStartHookSpecificOutputWire": {
|
|
21
6
|
"additionalProperties": false,
|
|
22
7
|
"properties": {
|
|
23
8
|
"additionalContext": {
|
|
@@ -25,7 +10,8 @@
|
|
|
25
10
|
"type": "string"
|
|
26
11
|
},
|
|
27
12
|
"hookEventName": {
|
|
28
|
-
"
|
|
13
|
+
"const": "SubagentStart",
|
|
14
|
+
"type": "string"
|
|
29
15
|
}
|
|
30
16
|
},
|
|
31
17
|
"required": [
|
|
@@ -42,7 +28,7 @@
|
|
|
42
28
|
"hookSpecificOutput": {
|
|
43
29
|
"allOf": [
|
|
44
30
|
{
|
|
45
|
-
"$ref": "#/definitions/
|
|
31
|
+
"$ref": "#/definitions/SubagentStartHookSpecificOutputWire"
|
|
46
32
|
}
|
|
47
33
|
],
|
|
48
34
|
"default": null
|
|
@@ -8,21 +8,6 @@
|
|
|
8
8
|
],
|
|
9
9
|
"type": "string"
|
|
10
10
|
},
|
|
11
|
-
"HookEventNameWire": {
|
|
12
|
-
"enum": [
|
|
13
|
-
"PreToolUse",
|
|
14
|
-
"PermissionRequest",
|
|
15
|
-
"PostToolUse",
|
|
16
|
-
"PreCompact",
|
|
17
|
-
"PostCompact",
|
|
18
|
-
"SessionStart",
|
|
19
|
-
"UserPromptSubmit",
|
|
20
|
-
"SubagentStart",
|
|
21
|
-
"SubagentStop",
|
|
22
|
-
"Stop"
|
|
23
|
-
],
|
|
24
|
-
"type": "string"
|
|
25
|
-
},
|
|
26
11
|
"UserPromptSubmitHookSpecificOutputWire": {
|
|
27
12
|
"additionalProperties": false,
|
|
28
13
|
"properties": {
|
|
@@ -31,7 +16,8 @@
|
|
|
31
16
|
"type": "string"
|
|
32
17
|
},
|
|
33
18
|
"hookEventName": {
|
|
34
|
-
"
|
|
19
|
+
"const": "UserPromptSubmit",
|
|
20
|
+
"type": "string"
|
|
35
21
|
}
|
|
36
22
|
},
|
|
37
23
|
"required": [
|