kiro-spec-engine 1.20.1 → 1.20.2

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.20.2] - 2026-02-01
11
+
12
+ ### Fixed
13
+ - **Nested Repository Validation**: Fixed circular reference detection for large nested repository sets
14
+ - Circular reference detection now uses normalized paths consistently
15
+ - Fixed bug where original paths were used instead of normalized paths in cycle detection
16
+ - Now correctly handles 100+ nested repositories
17
+ - All parent-child relationships validated correctly
18
+
19
+ ### Technical Details
20
+ - Updated `detectCycle()` function to use normalized paths throughout
21
+ - Fixed `pathMap` lookup to use normalized parent paths
22
+ - Ensures consistency between parent validation and cycle detection
23
+ - No performance regression for large repository counts
24
+
10
25
  ## [1.20.1] - 2026-02-01
11
26
 
12
27
  ### Fixed
@@ -341,39 +341,43 @@ class ConfigManager {
341
341
  const visited = new Set();
342
342
  const recursionStack = new Set();
343
343
 
344
- const detectCycle = (repoPath, path = []) => {
345
- if (recursionStack.has(repoPath)) {
344
+ const detectCycle = (normalizedPath, path = []) => {
345
+ if (recursionStack.has(normalizedPath)) {
346
346
  // Found a cycle
347
- const cycleStart = path.indexOf(repoPath);
348
- const cycle = path.slice(cycleStart).concat(repoPath);
347
+ const cycleStart = path.indexOf(normalizedPath);
348
+ const cycle = path.slice(cycleStart).concat(normalizedPath);
349
349
  errors.push(
350
350
  `Circular parent reference detected: ${cycle.join(' → ')}`
351
351
  );
352
352
  return true;
353
353
  }
354
354
 
355
- if (visited.has(repoPath)) {
355
+ if (visited.has(normalizedPath)) {
356
356
  return false;
357
357
  }
358
358
 
359
- visited.add(repoPath);
360
- recursionStack.add(repoPath);
361
- path.push(repoPath);
359
+ visited.add(normalizedPath);
360
+ recursionStack.add(normalizedPath);
361
+ path.push(normalizedPath);
362
362
 
363
- const repo = pathMap.get(repoPath);
363
+ const repo = pathMap.get(normalizedPath);
364
364
  if (repo && repo.parent) {
365
- detectCycle(repo.parent, path);
365
+ const normalizedParent = this._normalizePath(repo.parent);
366
+ detectCycle(normalizedParent, path);
366
367
  }
367
368
 
368
369
  path.pop();
369
- recursionStack.delete(repoPath);
370
+ recursionStack.delete(normalizedPath);
370
371
  return false;
371
372
  };
372
373
 
373
- // Check for cycles starting from each repository
374
+ // Check for cycles starting from each repository (use normalized paths)
374
375
  repos.forEach(repo => {
375
- if (repo.path && !visited.has(repo.path)) {
376
- detectCycle(repo.path, []);
376
+ if (repo.path) {
377
+ const normalizedPath = this._normalizePath(repo.path);
378
+ if (!visited.has(normalizedPath)) {
379
+ detectCycle(normalizedPath, []);
380
+ }
377
381
  }
378
382
  });
379
383
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kiro-spec-engine",
3
- "version": "1.20.1",
3
+ "version": "1.20.2",
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": {