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 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
@@ -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
- // 5. Read tarball from disk
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
- console.log(' ' + v.version.padEnd(14) + (v.publishedAt || '').padEnd(26) + (v.integrity || ''));
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.33.0",
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": {