kiro-spec-engine 1.33.0 → 1.34.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/CHANGELOG.md +15 -0
- package/lib/commands/scene.js +139 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.34.0] - 2026-02-10
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Scene Package Deprecation**: Mark/unmark package versions as deprecated in local registry
|
|
14
|
+
- `kse scene deprecate --name <pkg> --message <msg>` deprecate all versions
|
|
15
|
+
- `--version <v>` target specific version
|
|
16
|
+
- `--undo` remove deprecation marker
|
|
17
|
+
- `--registry <dir>` custom registry directory
|
|
18
|
+
- `--json` structured JSON output
|
|
19
|
+
- Adds `deprecated` field to version entries in `registry-index.json`
|
|
20
|
+
- `scene install` now prints yellow warning when installing deprecated versions
|
|
21
|
+
- `scene info` now shows `[DEPRECATED]` marker with message for deprecated versions
|
|
22
|
+
- Follows normalize → validate → run → print pattern
|
|
23
|
+
- Implements Spec 84-00-scene-deprecate
|
|
24
|
+
|
|
10
25
|
## [1.33.0] - 2026-02-10
|
|
11
26
|
|
|
12
27
|
### Added
|
package/lib/commands/scene.js
CHANGED
|
@@ -572,6 +572,19 @@ function registerSceneCommands(program) {
|
|
|
572
572
|
.action(async (options) => {
|
|
573
573
|
await runSceneInfoCommand(options);
|
|
574
574
|
});
|
|
575
|
+
|
|
576
|
+
sceneCmd
|
|
577
|
+
.command('deprecate')
|
|
578
|
+
.description('Mark or unmark a scene package version as deprecated')
|
|
579
|
+
.requiredOption('-n, --name <name>', 'Package name')
|
|
580
|
+
.option('-v, --version <version>', 'Specific version to deprecate')
|
|
581
|
+
.option('-m, --message <msg>', 'Deprecation message')
|
|
582
|
+
.option('-r, --registry <path>', 'Registry root directory', '.kiro/registry')
|
|
583
|
+
.option('--json', 'Print result as JSON')
|
|
584
|
+
.option('--undo', 'Remove deprecation marker')
|
|
585
|
+
.action(async (options) => {
|
|
586
|
+
await runSceneDeprecateCommand(options);
|
|
587
|
+
});
|
|
575
588
|
}
|
|
576
589
|
|
|
577
590
|
function normalizeSourceOptions(options = {}) {
|
|
@@ -10174,7 +10187,10 @@ async function runSceneInstallCommand(rawOptions = {}, dependencies = {}) {
|
|
|
10174
10187
|
}
|
|
10175
10188
|
const versionEntry = pkg.versions[version];
|
|
10176
10189
|
|
|
10177
|
-
//
|
|
10190
|
+
// Deprecation warning
|
|
10191
|
+
if (versionEntry.deprecated) {
|
|
10192
|
+
console.log(chalk.yellow(`WARNING: ${options.name}@${version} is deprecated: ${versionEntry.deprecated}`));
|
|
10193
|
+
}
|
|
10178
10194
|
const tarballRelativePath = buildRegistryTarballPath(options.name, version);
|
|
10179
10195
|
const tarballAbsolutePath = path.join(registryRoot, tarballRelativePath);
|
|
10180
10196
|
const tarballBuffer = await readFile(tarballAbsolutePath);
|
|
@@ -10834,7 +10850,11 @@ function printSceneInfoSummary(options, payload, projectRoot = process.cwd()) {
|
|
|
10834
10850
|
console.log('');
|
|
10835
10851
|
console.log(' ' + 'VERSION'.padEnd(14) + 'PUBLISHED'.padEnd(26) + 'INTEGRITY');
|
|
10836
10852
|
for (const v of payload.versions) {
|
|
10837
|
-
|
|
10853
|
+
let line = ' ' + v.version.padEnd(14) + (v.publishedAt || '').padEnd(26) + (v.integrity || '');
|
|
10854
|
+
if (v.deprecated) {
|
|
10855
|
+
line += ' ' + chalk.yellow(`[DEPRECATED: ${v.deprecated}]`);
|
|
10856
|
+
}
|
|
10857
|
+
console.log(line);
|
|
10838
10858
|
}
|
|
10839
10859
|
}
|
|
10840
10860
|
|
|
@@ -10868,7 +10888,8 @@ async function runSceneInfoCommand(rawOptions = {}, dependencies = {}) {
|
|
|
10868
10888
|
const versions = sortedVersions.map(v => ({
|
|
10869
10889
|
version: v,
|
|
10870
10890
|
publishedAt: (pkg.versions[v] && pkg.versions[v].published_at) || '',
|
|
10871
|
-
integrity: (pkg.versions[v] && pkg.versions[v].integrity) || ''
|
|
10891
|
+
integrity: (pkg.versions[v] && pkg.versions[v].integrity) || '',
|
|
10892
|
+
deprecated: (pkg.versions[v] && pkg.versions[v].deprecated) || undefined
|
|
10872
10893
|
}));
|
|
10873
10894
|
|
|
10874
10895
|
const payload = {
|
|
@@ -10890,6 +10911,116 @@ async function runSceneInfoCommand(rawOptions = {}, dependencies = {}) {
|
|
|
10890
10911
|
}
|
|
10891
10912
|
}
|
|
10892
10913
|
|
|
10914
|
+
function normalizeSceneDeprecateOptions(options = {}) {
|
|
10915
|
+
return {
|
|
10916
|
+
name: options.name ? String(options.name).trim() : undefined,
|
|
10917
|
+
version: options.version ? String(options.version).trim() : undefined,
|
|
10918
|
+
message: options.message ? String(options.message).trim() : undefined,
|
|
10919
|
+
registry: options.registry ? String(options.registry).trim() : '.kiro/registry',
|
|
10920
|
+
json: options.json === true,
|
|
10921
|
+
undo: options.undo === true
|
|
10922
|
+
};
|
|
10923
|
+
}
|
|
10924
|
+
|
|
10925
|
+
function validateSceneDeprecateOptions(options) {
|
|
10926
|
+
if (!options.name) return '--name is required';
|
|
10927
|
+
if (!options.undo && !options.message) return '--message is required (unless --undo is used)';
|
|
10928
|
+
return null;
|
|
10929
|
+
}
|
|
10930
|
+
|
|
10931
|
+
function printSceneDeprecateSummary(options, payload) {
|
|
10932
|
+
if (options.json) {
|
|
10933
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
10934
|
+
return;
|
|
10935
|
+
}
|
|
10936
|
+
|
|
10937
|
+
const actionLabel = payload.action === 'undeprecate'
|
|
10938
|
+
? chalk.green('un-deprecated')
|
|
10939
|
+
: chalk.yellow('deprecated');
|
|
10940
|
+
|
|
10941
|
+
console.log(chalk.blue('Scene Package Deprecate'));
|
|
10942
|
+
console.log(` Package: ${payload.package}`);
|
|
10943
|
+
console.log(` Action: ${actionLabel}`);
|
|
10944
|
+
console.log(` Versions affected: ${payload.versions.length}`);
|
|
10945
|
+
if (payload.message) {
|
|
10946
|
+
console.log(` Message: ${payload.message}`);
|
|
10947
|
+
}
|
|
10948
|
+
if (payload.versions.length > 0) {
|
|
10949
|
+
for (const v of payload.versions) {
|
|
10950
|
+
console.log(` - ${v}`);
|
|
10951
|
+
}
|
|
10952
|
+
}
|
|
10953
|
+
}
|
|
10954
|
+
|
|
10955
|
+
async function runSceneDeprecateCommand(rawOptions = {}, dependencies = {}) {
|
|
10956
|
+
const projectRoot = dependencies.projectRoot || process.cwd();
|
|
10957
|
+
const fileSystem = dependencies.fileSystem || fs;
|
|
10958
|
+
|
|
10959
|
+
const options = normalizeSceneDeprecateOptions(rawOptions);
|
|
10960
|
+
const validationError = validateSceneDeprecateOptions(options);
|
|
10961
|
+
|
|
10962
|
+
if (validationError) {
|
|
10963
|
+
console.error(chalk.red(`Scene deprecate failed: ${validationError}`));
|
|
10964
|
+
process.exitCode = 1;
|
|
10965
|
+
return null;
|
|
10966
|
+
}
|
|
10967
|
+
|
|
10968
|
+
try {
|
|
10969
|
+
const registryRoot = path.isAbsolute(options.registry)
|
|
10970
|
+
? options.registry
|
|
10971
|
+
: path.join(projectRoot, options.registry);
|
|
10972
|
+
|
|
10973
|
+
const index = await loadRegistryIndex(registryRoot, fileSystem);
|
|
10974
|
+
|
|
10975
|
+
if (!index.packages || !index.packages[options.name]) {
|
|
10976
|
+
throw new Error(`package "${options.name}" not found in registry`);
|
|
10977
|
+
}
|
|
10978
|
+
|
|
10979
|
+
const pkg = index.packages[options.name];
|
|
10980
|
+
const versions = pkg.versions || {};
|
|
10981
|
+
const affectedVersions = [];
|
|
10982
|
+
|
|
10983
|
+
if (options.version) {
|
|
10984
|
+
if (!versions[options.version]) {
|
|
10985
|
+
throw new Error(`version "${options.version}" not found for package "${options.name}"`);
|
|
10986
|
+
}
|
|
10987
|
+
if (options.undo) {
|
|
10988
|
+
delete versions[options.version].deprecated;
|
|
10989
|
+
} else {
|
|
10990
|
+
versions[options.version].deprecated = options.message;
|
|
10991
|
+
}
|
|
10992
|
+
affectedVersions.push(options.version);
|
|
10993
|
+
} else {
|
|
10994
|
+
for (const v of Object.keys(versions)) {
|
|
10995
|
+
if (options.undo) {
|
|
10996
|
+
delete versions[v].deprecated;
|
|
10997
|
+
} else {
|
|
10998
|
+
versions[v].deprecated = options.message;
|
|
10999
|
+
}
|
|
11000
|
+
affectedVersions.push(v);
|
|
11001
|
+
}
|
|
11002
|
+
}
|
|
11003
|
+
|
|
11004
|
+
await saveRegistryIndex(registryRoot, index, fileSystem);
|
|
11005
|
+
|
|
11006
|
+
const payload = {
|
|
11007
|
+
success: true,
|
|
11008
|
+
action: options.undo ? 'undeprecate' : 'deprecate',
|
|
11009
|
+
package: options.name,
|
|
11010
|
+
versions: affectedVersions,
|
|
11011
|
+
message: options.undo ? null : options.message,
|
|
11012
|
+
registry: options.registry
|
|
11013
|
+
};
|
|
11014
|
+
|
|
11015
|
+
printSceneDeprecateSummary(options, payload);
|
|
11016
|
+
return payload;
|
|
11017
|
+
} catch (error) {
|
|
11018
|
+
console.error(chalk.red('Scene deprecate failed:'), error.message);
|
|
11019
|
+
process.exitCode = 1;
|
|
11020
|
+
return null;
|
|
11021
|
+
}
|
|
11022
|
+
}
|
|
11023
|
+
|
|
10893
11024
|
module.exports = {
|
|
10894
11025
|
RUN_MODES,
|
|
10895
11026
|
SCAFFOLD_TYPES,
|
|
@@ -11056,5 +11187,9 @@ module.exports = {
|
|
|
11056
11187
|
validateSceneInfoOptions,
|
|
11057
11188
|
runSceneInfoCommand,
|
|
11058
11189
|
printSceneInfoSummary,
|
|
11059
|
-
validateScenePackageDirectory
|
|
11190
|
+
validateScenePackageDirectory,
|
|
11191
|
+
normalizeSceneDeprecateOptions,
|
|
11192
|
+
validateSceneDeprecateOptions,
|
|
11193
|
+
runSceneDeprecateCommand,
|
|
11194
|
+
printSceneDeprecateSummary
|
|
11060
11195
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kiro-spec-engine",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.34.0",
|
|
4
4
|
"description": "kiro-spec-engine (kse) - A CLI tool and npm package for spec-driven development with AI coding assistants. NOT the Kiro IDE desktop application.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|