Merge pull request #2051 from open-gsd/fix/2003-capability-state-runtime-flag
fix(#2003): add --runtime override to capability state + loop render-hooks
This commit is contained in:
5
.changeset/noble-foxes-purr.md
Normal file
5
.changeset/noble-foxes-purr.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
type: Fixed
|
||||
pr: 2051
|
||||
---
|
||||
**`capability state` and `loop render-hooks` now accept `--runtime` to override the auto-detected runtime** — previously both commands parsed only `--config-dir`, so the runtime config dir was derived from the persisted `.planning/config.json` runtime (precedence `GSD_RUNTIME` → `config.runtime` → `claude`). A repo that persisted `runtime:"codex"` resolved the config dir to `~/.codex`, where the Claude skill isn't installed, so every skill-bearing capability reported `surfaced:false` and `execute:post`/`verify:post` hooks silently no-op'd when the operator drove GSD from Claude Code. `--runtime <r>` (canonicalized, so aliases like `codex-app` work) now bypasses that fallback so the config dir resolves to the explicitly-named runtime's home. Behavior without the flag is unchanged. (#2003)
|
||||
@@ -179,14 +179,23 @@
|
||||
*
|
||||
* Loop Extension Point Queries (ADR-857 phase 3c):
|
||||
* loop render-hooks <point> Resolve + render active Capability hooks at a loop point
|
||||
* [--config-dir <path>] [--runtime <r>] [--active-cap <capId>]
|
||||
* Returns JSON envelope { point, activeHooks, rendered }
|
||||
* Valid points: discuss:pre/post, plan:pre/post,
|
||||
* execute:pre/wave:pre/wave:post/post, verify:pre/post, ship:pre/post
|
||||
* --runtime: override the auto-detected runtime (#2003) so the config
|
||||
* dir resolves to that runtime's home even when
|
||||
* .planning/config.json persists a different runtime.
|
||||
*
|
||||
* Capability State (ADR-857 phase 4b):
|
||||
* capability state [--config-dir <path>] Resolve per-capability install/surface/hook-activation state
|
||||
* capability state [--config-dir <path>] [--runtime <r>] Resolve per-capability install/surface/hook-activation state
|
||||
* Returns JSON envelope { runtimeConfigDir, capabilities[] }
|
||||
* --config-dir: runtime config dir (default: auto-detect current runtime)
|
||||
* --runtime: override the auto-detected runtime (#2003); bypasses the
|
||||
* GSD_RUNTIME → config.runtime → 'claude' precedence so a
|
||||
* repo with a persisted runtime can still resolve another
|
||||
* runtime's config dir (e.g. driving Claude Code from a
|
||||
* repo that persists runtime:"codex").
|
||||
*
|
||||
* GSD-2 Migration:
|
||||
* from-gsd2 [--path <dir>] [--force] [--dry-run]
|
||||
@@ -1598,9 +1607,28 @@ async function runCommand(command, args, cwd, raw, defaultValue, originalCommand
|
||||
}
|
||||
loopActiveCap = value;
|
||||
}
|
||||
// --runtime <r> (#2003): explicit runtime override so the config-dir
|
||||
// resolution bypasses the persisted-runtime fallback (GSD_RUNTIME →
|
||||
// config.runtime). Mirrors the --config-dir dual-form (--runtime X /
|
||||
// --runtime=X) and the capability-set --runtime precedent.
|
||||
let loopRuntime = undefined;
|
||||
const runtimeEqArg = args.find(arg => arg.startsWith('--runtime='));
|
||||
const runtimeIdx = args.indexOf('--runtime');
|
||||
if (runtimeEqArg) {
|
||||
const value = runtimeEqArg.slice('--runtime='.length).trim();
|
||||
if (!value) error('Missing value for --runtime', ERROR_REASON ? ERROR_REASON.USAGE : undefined);
|
||||
loopRuntime = value;
|
||||
} else if (runtimeIdx !== -1) {
|
||||
const value = args[runtimeIdx + 1];
|
||||
if (!value || value.startsWith('--')) {
|
||||
error('Missing value for --runtime', ERROR_REASON ? ERROR_REASON.USAGE : undefined);
|
||||
}
|
||||
loopRuntime = value;
|
||||
}
|
||||
loopResolver.cmdLoopRenderHooks(cwd, args[2], raw, {
|
||||
configDir: loopConfigDir ? path.resolve(loopConfigDir) : undefined,
|
||||
activeCap: loopActiveCap,
|
||||
runtime: loopRuntime,
|
||||
});
|
||||
} else {
|
||||
error(
|
||||
@@ -1752,7 +1780,24 @@ async function runCommand(command, args, cwd, raw, defaultValue, originalCommand
|
||||
configDir = configDirVal;
|
||||
}
|
||||
const resolvedConfigDir = configDir ? path.resolve(configDir) : null;
|
||||
capabilityState.cmdCapabilityState(cwd, resolvedConfigDir, raw, {});
|
||||
// --runtime <r> (#2003): explicit runtime override so the config-dir
|
||||
// resolution bypasses the persisted-runtime fallback. Dual-form like
|
||||
// --config-dir (--runtime X / --runtime=X).
|
||||
let stateRuntime = undefined;
|
||||
const stateRuntimeEqArg = args.find(arg => arg.startsWith('--runtime='));
|
||||
const stateRuntimeIdx = args.indexOf('--runtime');
|
||||
if (stateRuntimeEqArg) {
|
||||
const value = stateRuntimeEqArg.slice('--runtime='.length).trim();
|
||||
if (!value) error('Missing value for --runtime', ERROR_REASON ? ERROR_REASON.USAGE : undefined);
|
||||
stateRuntime = value;
|
||||
} else if (stateRuntimeIdx !== -1) {
|
||||
const value = args[stateRuntimeIdx + 1];
|
||||
if (!value || value.startsWith('--')) {
|
||||
error('Missing value for --runtime', ERROR_REASON ? ERROR_REASON.USAGE : undefined);
|
||||
}
|
||||
stateRuntime = value;
|
||||
}
|
||||
capabilityState.cmdCapabilityState(cwd, resolvedConfigDir, raw, { runtime: stateRuntime });
|
||||
} else if (capSubcommand === 'set') {
|
||||
// capability set <id> [--on|--off|--enable|--disable] [--gate <key>=<bool>]... [--config-dir <dir>] [--runtime <r>] [--scope <s>]
|
||||
const capId = args[2];
|
||||
|
||||
@@ -503,6 +503,7 @@ function resolveCapabilityRuntimeState(
|
||||
cwd: string,
|
||||
runtimeConfigDir: string | undefined | null,
|
||||
configOverride?: Record<string, unknown>,
|
||||
runtimeOverride?: string,
|
||||
): ResolveCapabilityRuntimeStateResult {
|
||||
const warnings: string[] = [];
|
||||
|
||||
@@ -522,15 +523,45 @@ function resolveCapabilityRuntimeState(
|
||||
const runtimeHomes = require('./runtime-homes.cjs') as {
|
||||
getGlobalConfigDir: (runtime: string) => string;
|
||||
};
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||
const runtimeSlash = require('./runtime-slash.cjs') as {
|
||||
resolveRuntime: (projectDir: string | null | undefined) => string;
|
||||
};
|
||||
// Detect the active runtime via GSD_RUNTIME → config.runtime → 'claude'.
|
||||
// resolveRuntime reads config.json directly (no side effects) and returns
|
||||
// a lowercased canonical runtime name.
|
||||
const detectedRuntime = runtimeSlash.resolveRuntime(cwd);
|
||||
resolvedConfigDir = runtimeHomes.getGlobalConfigDir(detectedRuntime);
|
||||
// #2003: an explicit --runtime override bypasses the persisted-runtime
|
||||
// fallback (GSD_RUNTIME → config.runtime → 'claude') so, e.g., a repo with
|
||||
// persisted runtime:"codex" resolves the Claude config dir when the operator
|
||||
// is driving from Claude Code. Canonicalize via runtime-name-policy (handles
|
||||
// aliases like codex-app → codex); if canonicalization yields nothing, fall
|
||||
// through to the persisted-runtime resolution below. Mirrors the update-
|
||||
// context / effort sync precedent (read/diagnostic paths accepting both
|
||||
// --config-dir and --runtime).
|
||||
if (typeof runtimeOverride === 'string' && runtimeOverride.trim() !== '') {
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||
const runtimeNamePolicy = require('./runtime-name-policy.cjs') as {
|
||||
canonicalizeRuntimeName: (value: unknown) => string | null;
|
||||
};
|
||||
const canonical = runtimeNamePolicy.canonicalizeRuntimeName(runtimeOverride);
|
||||
if (canonical) {
|
||||
resolvedConfigDir = runtimeHomes.getGlobalConfigDir(canonical);
|
||||
} else {
|
||||
// #2003: unknown runtime override — warn (don't silently ignore the
|
||||
// explicit input) and fall through to persisted-runtime resolution.
|
||||
// Avoids a silent-wrong-result on this diagnostic command for typos
|
||||
// (e.g. "cluade") or runtimes known to runtime-homes but not yet to
|
||||
// the alias manifest (e.g. "grok"). The warning surfaces via the
|
||||
// `warnings[]` channel consumed by cmdCapabilityState/cmdLoopRenderHooks.
|
||||
warnings.push(
|
||||
`--runtime "${runtimeOverride}" is not a known runtime; falling back to auto-detected/persisted runtime resolution`,
|
||||
);
|
||||
}
|
||||
}
|
||||
if (!resolvedConfigDir) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||
const runtimeSlash = require('./runtime-slash.cjs') as {
|
||||
resolveRuntime: (projectDir: string | null | undefined) => string;
|
||||
};
|
||||
// Detect the active runtime via GSD_RUNTIME → config.runtime → 'claude'.
|
||||
// resolveRuntime reads config.json directly (no side effects) and returns
|
||||
// a lowercased canonical runtime name.
|
||||
const detectedRuntime = runtimeSlash.resolveRuntime(cwd);
|
||||
resolvedConfigDir = runtimeHomes.getGlobalConfigDir(detectedRuntime);
|
||||
}
|
||||
} catch {
|
||||
// Defensive fallback: use ~/.claude if the canonical resolver throws.
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||
@@ -631,9 +662,12 @@ function cmdCapabilityState(
|
||||
cwd: string,
|
||||
runtimeConfigDir: string | undefined | null,
|
||||
raw: boolean,
|
||||
_options: Record<string, unknown> = {},
|
||||
options: Record<string, unknown> = {},
|
||||
): void {
|
||||
const result = resolveCapabilityRuntimeState(cwd, runtimeConfigDir);
|
||||
// #2003: thread an explicit --runtime override so the config-dir resolution
|
||||
// bypasses the persisted-runtime fallback (GSD_RUNTIME → config.runtime).
|
||||
const runtimeOverride = typeof options['runtime'] === 'string' ? options['runtime'] : undefined;
|
||||
const result = resolveCapabilityRuntimeState(cwd, runtimeConfigDir, undefined, runtimeOverride);
|
||||
for (const warning of result.warnings) {
|
||||
coreError(`capability state: ${warning}`);
|
||||
}
|
||||
|
||||
@@ -475,6 +475,12 @@ function cmdLoopRenderHooks(
|
||||
const runtimeConfigDir = typeof options['configDir'] === 'string'
|
||||
? options['configDir']
|
||||
: undefined;
|
||||
// #2003: thread an explicit --runtime override into the capability-state
|
||||
// resolver so the config-dir resolution bypasses the persisted-runtime
|
||||
// fallback (GSD_RUNTIME → config.runtime). Without this, a repo with persisted
|
||||
// runtime:"codex" resolves the config dir to ~/.codex and execute:post /
|
||||
// verify:post hooks silently no-op when the operator drives from Claude Code.
|
||||
const runtimeOverride = typeof options['runtime'] === 'string' ? options['runtime'] : undefined;
|
||||
// Load the config snapshot ONCE and share it with both the capability-state
|
||||
// resolver (via configOverride) and loop-hook resolution, so federated keys
|
||||
// present in loadConfig resolve identically for `active` and for hook when/
|
||||
@@ -488,7 +494,7 @@ function cmdLoopRenderHooks(
|
||||
} catch {
|
||||
config = {};
|
||||
}
|
||||
const state = resolveCapabilityRuntimeState(cwd, runtimeConfigDir, config) as {
|
||||
const state = resolveCapabilityRuntimeState(cwd, runtimeConfigDir, config, runtimeOverride) as {
|
||||
warnings?: string[];
|
||||
capabilities: Array<{ id: string; enabled?: boolean; active: boolean }>;
|
||||
};
|
||||
|
||||
@@ -15,10 +15,11 @@ const fs = require('node:fs');
|
||||
const os = require('node:os');
|
||||
const path = require('node:path');
|
||||
|
||||
const { cleanup } = require('./helpers.cjs');
|
||||
const { cleanup, runGsdTools } = require('./helpers.cjs');
|
||||
|
||||
const {
|
||||
resolveCapabilityState,
|
||||
resolveCapabilityRuntimeState,
|
||||
isCapabilityActive,
|
||||
_isSafePropKey,
|
||||
_loadInstalledSkillsManifest,
|
||||
@@ -2028,3 +2029,176 @@ describe('#1459 IC-04: capability-state threads gsdHome to the overlay loader',
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('regressions: --runtime override bypasses persisted runtime (#2003)', () => {
|
||||
// #2003: `capability state` and `loop render-hooks` parsed only --config-dir,
|
||||
// never --runtime. resolveCapabilityRuntimeState derived the config dir from
|
||||
// resolveRuntime(cwd) (GSD_RUNTIME → config.runtime → 'claude'), so a repo
|
||||
// with persisted runtime:"codex" resolved the config dir to ~/.codex — where
|
||||
// the Claude skill isn't installed → surfaced:false. Fix: thread an explicit
|
||||
// --runtime override through both commands into resolveCapabilityRuntimeState
|
||||
// so it bypasses the persisted-runtime fallback (mirrors the update-context /
|
||||
// effort sync precedent).
|
||||
|
||||
function writePersistedRuntime(tmpDir, runtime) {
|
||||
fs.mkdirSync(path.join(tmpDir, '.planning', 'phases'), { recursive: true });
|
||||
fs.writeFileSync(
|
||||
path.join(tmpDir, '.planning', 'config.json'),
|
||||
JSON.stringify({ runtime }),
|
||||
'utf8',
|
||||
);
|
||||
}
|
||||
|
||||
test('resolveCapabilityRuntimeState: runtimeOverride="claude" bypasses persisted config.runtime:"codex"', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-override-'));
|
||||
try {
|
||||
writePersistedRuntime(tmpDir, 'codex');
|
||||
const runtimeHomes = require('../gsd-core/bin/lib/runtime-homes.cjs');
|
||||
const expectedClaudeDir = runtimeHomes.getGlobalConfigDir('claude');
|
||||
const expectedCodexDir = runtimeHomes.getGlobalConfigDir('codex');
|
||||
// Persisted runtime is codex; explicit override is claude. The override
|
||||
// MUST win (resolveRuntime is never consulted when an override is given,
|
||||
// so GSD_RUNTIME env cannot interfere either).
|
||||
const result = resolveCapabilityRuntimeState(tmpDir, undefined, undefined, 'claude');
|
||||
assert.strictEqual(result.runtimeConfigDir, expectedClaudeDir,
|
||||
'--runtime claude must override persisted runtime:"codex"');
|
||||
assert.notStrictEqual(result.runtimeConfigDir, expectedCodexDir,
|
||||
'must NOT resolve to the codex config dir when --runtime claude is explicit');
|
||||
} finally {
|
||||
cleanup(tmpDir);
|
||||
}
|
||||
});
|
||||
|
||||
test('resolveCapabilityRuntimeState: no override still honours persisted config.runtime (unchanged, regression guard)', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-no-override-'));
|
||||
// Control GSD_RUNTIME so resolveRuntime deterministically reads config.runtime.
|
||||
const savedGsdRuntime = process.env.GSD_RUNTIME;
|
||||
delete process.env.GSD_RUNTIME;
|
||||
try {
|
||||
writePersistedRuntime(tmpDir, 'codex');
|
||||
const runtimeHomes = require('../gsd-core/bin/lib/runtime-homes.cjs');
|
||||
const expectedCodexDir = runtimeHomes.getGlobalConfigDir('codex');
|
||||
// No override → persisted codex wins (existing behavior preserved).
|
||||
const result = resolveCapabilityRuntimeState(tmpDir, undefined, undefined, undefined);
|
||||
assert.strictEqual(result.runtimeConfigDir, expectedCodexDir,
|
||||
'without --runtime, persisted config.runtime:"codex" still drives resolution (unchanged)');
|
||||
} finally {
|
||||
if (savedGsdRuntime === undefined) delete process.env.GSD_RUNTIME;
|
||||
else process.env.GSD_RUNTIME = savedGsdRuntime;
|
||||
cleanup(tmpDir);
|
||||
}
|
||||
});
|
||||
|
||||
test('resolveCapabilityRuntimeState: runtimeOverride canonicalizes aliases (codex-app -> codex)', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-alias-'));
|
||||
try {
|
||||
writePersistedRuntime(tmpDir, 'claude');
|
||||
const runtimeHomes = require('../gsd-core/bin/lib/runtime-homes.cjs');
|
||||
const expectedCodexDir = runtimeHomes.getGlobalConfigDir('codex');
|
||||
// Alias "codex-app" canonicalizes to "codex" via runtime-name-policy.
|
||||
const result = resolveCapabilityRuntimeState(tmpDir, undefined, undefined, 'codex-app');
|
||||
assert.strictEqual(result.runtimeConfigDir, expectedCodexDir,
|
||||
'--runtime codex-app (alias) must canonicalize to codex');
|
||||
} finally {
|
||||
cleanup(tmpDir);
|
||||
}
|
||||
});
|
||||
|
||||
test('CLI: `capability state --runtime claude` reports the Claude config dir despite persisted runtime:"codex"', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-cli-'));
|
||||
try {
|
||||
writePersistedRuntime(tmpDir, 'codex');
|
||||
const result = runGsdTools('capability state --runtime claude --raw', tmpDir);
|
||||
assert.ok(result.success, `capability state --runtime should succeed: ${result.error || ''}`);
|
||||
const parsed = JSON.parse(result.output);
|
||||
const runtimeHomes = require('../gsd-core/bin/lib/runtime-homes.cjs');
|
||||
assert.strictEqual(parsed.runtimeConfigDir, runtimeHomes.getGlobalConfigDir('claude'),
|
||||
'`capability state --runtime claude` must resolve to the Claude config dir, not the persisted codex dir');
|
||||
} finally {
|
||||
cleanup(tmpDir);
|
||||
}
|
||||
});
|
||||
|
||||
// L-2 (review): end-to-end CLI test for loop render-hooks --runtime — the exact
|
||||
// command the bug report calls out as silently no-op'ing. Guards the copy-pasted
|
||||
// arg parsing in gsd-tools.cjs from diverging from the capability-state branch.
|
||||
test('CLI: `loop render-hooks verify:post --runtime claude` resolves against the Claude config dir', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-loop-cli-'));
|
||||
try {
|
||||
writePersistedRuntime(tmpDir, 'codex');
|
||||
const result = runGsdTools('loop render-hooks verify:post --runtime claude --raw', tmpDir);
|
||||
assert.ok(result.success, `loop render-hooks --runtime should succeed: ${result.error || ''}`);
|
||||
const parsed = JSON.parse(result.output);
|
||||
// The envelope carries activeHooks/rendered; the key assertion is that it
|
||||
// ran without silently no-op'ing against the codex dir. A non-empty
|
||||
// point + a rendered string (even "_No active hooks..._") proves the
|
||||
// command executed against the resolved (claude) config dir rather than
|
||||
// erroring or emitting nothing.
|
||||
assert.strictEqual(parsed.point, 'verify:post', 'render-hooks must echo the requested point');
|
||||
assert.ok(typeof parsed.rendered === 'string', 'render-hooks must produce a rendered string');
|
||||
} finally {
|
||||
cleanup(tmpDir);
|
||||
}
|
||||
});
|
||||
|
||||
// M-1 + NIT-01 (review): unknown / crafted --runtime values are REJECTED by the
|
||||
// closed-vocabulary canonicalizer, warn, and fall through to the persisted
|
||||
// runtime (never embedded into a path). This is the security-load-bearing
|
||||
// contract — pin it so a future refactor can't silently break it.
|
||||
test('resolveCapabilityRuntimeState: unknown/crafted --runtime is rejected (closed vocabulary), warns, and falls through to persisted runtime', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-reject-'));
|
||||
const savedGsdRuntime = process.env.GSD_RUNTIME;
|
||||
delete process.env.GSD_RUNTIME;
|
||||
try {
|
||||
writePersistedRuntime(tmpDir, 'codex');
|
||||
const runtimeHomes = require('../gsd-core/bin/lib/runtime-homes.cjs');
|
||||
const expectedCodexDir = runtimeHomes.getGlobalConfigDir('codex');
|
||||
const crafted = ['../../etc/passwd', '__proto__', 'constructor', '--config-dir', 'garbage', 'foo bar', 'cluade'];
|
||||
for (const bad of crafted) {
|
||||
const result = resolveCapabilityRuntimeState(tmpDir, undefined, undefined, bad);
|
||||
assert.strictEqual(result.runtimeConfigDir, expectedCodexDir,
|
||||
`crafted --runtime "${bad}" must fall through to persisted codex dir, not be embedded in a path`);
|
||||
assert.ok(result.warnings.some((w) => w.includes('--runtime') && w.includes(bad)),
|
||||
`crafted --runtime "${bad}" must emit a warning naming the rejected value`);
|
||||
}
|
||||
} finally {
|
||||
if (savedGsdRuntime === undefined) delete process.env.GSD_RUNTIME;
|
||||
else process.env.GSD_RUNTIME = savedGsdRuntime;
|
||||
cleanup(tmpDir);
|
||||
}
|
||||
});
|
||||
|
||||
// N-1 (review): CLI arg-parsing boundary — --config-dir wins over --runtime
|
||||
// (most-explicit input takes precedence), and missing --runtime value errors.
|
||||
test('CLI: --config-dir takes precedence over --runtime when both are given', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-precedence-'));
|
||||
const explicitDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-explicit-cfg-'));
|
||||
try {
|
||||
writePersistedRuntime(tmpDir, 'codex');
|
||||
const result = runGsdTools(
|
||||
`capability state --config-dir ${explicitDir} --runtime claude --raw`,
|
||||
tmpDir,
|
||||
);
|
||||
assert.ok(result.success, `capability state with both flags should succeed: ${result.error || ''}`);
|
||||
const parsed = JSON.parse(result.output);
|
||||
assert.strictEqual(parsed.runtimeConfigDir, explicitDir,
|
||||
'--config-dir (explicit path) must win over --runtime when both are present');
|
||||
} finally {
|
||||
cleanup(explicitDir);
|
||||
cleanup(tmpDir);
|
||||
}
|
||||
});
|
||||
|
||||
test('CLI: `capability state --runtime` with no value errors with USAGE', () => {
|
||||
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cap-rt-missing-'));
|
||||
try {
|
||||
writePersistedRuntime(tmpDir, 'codex');
|
||||
const result = runGsdTools('capability state --runtime', tmpDir);
|
||||
assert.ok(!result.success, 'missing --runtime value must produce a non-zero exit');
|
||||
assert.ok(/Missing value for --runtime/.test(result.error || ''),
|
||||
`error must name the missing --runtime value: ${result.error || ''}`);
|
||||
} finally {
|
||||
cleanup(tmpDir);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "747defe620cb8ae6",
|
||||
"gsd-core/bin/gsd-tools.cjs": "f2dd7a6993dc12f1",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47",
|
||||
"gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47",
|
||||
"gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "476aa24e8c4f03cf",
|
||||
"gsd-core/bin/gsd-tools.cjs": "13640341aa311ae3",
|
||||
"gsd-core/bin/gsd-tools.cjs": "c6818560fbd9f8e1",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47",
|
||||
"gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47",
|
||||
"gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74",
|
||||
"gsd-core/bin/gsd-tools.cjs": "747defe620cb8ae6",
|
||||
"gsd-core/bin/gsd-tools.cjs": "f2dd7a6993dc12f1",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "2525f1ae8b086828",
|
||||
"gsd-core/bin/gsd-tools.cjs": "887e2cb9ebdb609d",
|
||||
"gsd-core/bin/gsd-tools.cjs": "2493822b0ae27980",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "3a3409215044af9f",
|
||||
"gsd-core/bin/gsd-tools.cjs": "cbdd5da1b973c6ae",
|
||||
"gsd-core/bin/gsd-tools.cjs": "3d032fe88d2dc09b",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47",
|
||||
"gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47",
|
||||
"gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47",
|
||||
"gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "6e98d76e955e35a2",
|
||||
"gsd-core/bin/gsd-tools.cjs": "1118403709188168",
|
||||
"gsd-core/bin/gsd-tools.cjs": "6e2a3fff91bacb3e",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "de4627dff103d527",
|
||||
"gsd-core/bin/gsd-tools.cjs": "fa4db2ce1f77ef99",
|
||||
"gsd-core/bin/gsd-tools.cjs": "2ed2d11d5be017e2",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "5636ca0b726871b2",
|
||||
"gsd-core/bin/gsd-tools.cjs": "92e0f7b7eb55af51",
|
||||
"gsd-core/bin/gsd-tools.cjs": "ba7396b5e12d9b70",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
"gsd-core/VERSION": "ef0deccd81a6723c",
|
||||
"gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74",
|
||||
"gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62",
|
||||
"gsd-core/bin/gsd-tools.cjs": "770e0b1c1f08ef47",
|
||||
"gsd-core/bin/gsd-tools.cjs": "f1a1a58072e7c35d",
|
||||
"gsd-core/bin/gsd_run": "62d9b647ede212e6",
|
||||
"gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16",
|
||||
"gsd-core/bin/shared/config-schema.manifest.json": "c55b99e5d82f69fb",
|
||||
|
||||
Reference in New Issue
Block a user