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 +15 -0
- package/lib/repo/config-manager.js +18 -14
- 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.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 = (
|
|
345
|
-
if (recursionStack.has(
|
|
344
|
+
const detectCycle = (normalizedPath, path = []) => {
|
|
345
|
+
if (recursionStack.has(normalizedPath)) {
|
|
346
346
|
// Found a cycle
|
|
347
|
-
const cycleStart = path.indexOf(
|
|
348
|
-
const cycle = path.slice(cycleStart).concat(
|
|
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(
|
|
355
|
+
if (visited.has(normalizedPath)) {
|
|
356
356
|
return false;
|
|
357
357
|
}
|
|
358
358
|
|
|
359
|
-
visited.add(
|
|
360
|
-
recursionStack.add(
|
|
361
|
-
path.push(
|
|
359
|
+
visited.add(normalizedPath);
|
|
360
|
+
recursionStack.add(normalizedPath);
|
|
361
|
+
path.push(normalizedPath);
|
|
362
362
|
|
|
363
|
-
const repo = pathMap.get(
|
|
363
|
+
const repo = pathMap.get(normalizedPath);
|
|
364
364
|
if (repo && repo.parent) {
|
|
365
|
-
|
|
365
|
+
const normalizedParent = this._normalizePath(repo.parent);
|
|
366
|
+
detectCycle(normalizedParent, path);
|
|
366
367
|
}
|
|
367
368
|
|
|
368
369
|
path.pop();
|
|
369
|
-
recursionStack.delete(
|
|
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
|
|
376
|
-
|
|
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.
|
|
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": {
|