specweave 0.30.14 → 0.30.17
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/CLAUDE.md +43 -0
- package/README.md +32 -0
- package/bin/specweave.js +28 -0
- package/dist/src/cli/commands/commits.d.ts +7 -0
- package/dist/src/cli/commands/commits.d.ts.map +1 -0
- package/dist/src/cli/commands/commits.js +42 -0
- package/dist/src/cli/commands/commits.js.map +1 -0
- package/dist/src/cli/commands/living-docs.d.ts +29 -0
- package/dist/src/cli/commands/living-docs.d.ts.map +1 -0
- package/dist/src/cli/commands/living-docs.js +350 -0
- package/dist/src/cli/commands/living-docs.js.map +1 -0
- package/dist/src/cli/helpers/ado-area-selector.js +1 -1
- package/dist/src/cli/helpers/ado-area-selector.js.map +1 -1
- package/dist/src/cli/workers/living-docs-worker.js +80 -44
- package/dist/src/cli/workers/living-docs-worker.js.map +1 -1
- package/dist/src/core/background/index.d.ts +2 -2
- package/dist/src/core/background/index.d.ts.map +1 -1
- package/dist/src/core/background/index.js +1 -1
- package/dist/src/core/background/index.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +60 -24
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +360 -103
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/llm/index.d.ts +1 -0
- package/dist/src/core/llm/index.d.ts.map +1 -1
- package/dist/src/core/llm/index.js +2 -0
- package/dist/src/core/llm/index.js.map +1 -1
- package/dist/src/core/llm/providers/anthropic-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/anthropic-provider.js +15 -26
- package/dist/src/core/llm/providers/anthropic-provider.js.map +1 -1
- package/dist/src/core/llm/providers/azure-openai-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/azure-openai-provider.js +13 -5
- package/dist/src/core/llm/providers/azure-openai-provider.js.map +1 -1
- package/dist/src/core/llm/providers/bedrock-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/bedrock-provider.js +12 -8
- package/dist/src/core/llm/providers/bedrock-provider.js.map +1 -1
- package/dist/src/core/llm/providers/claude-code-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/claude-code-provider.js +15 -25
- package/dist/src/core/llm/providers/claude-code-provider.js.map +1 -1
- package/dist/src/core/llm/providers/ollama-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/ollama-provider.js +12 -9
- package/dist/src/core/llm/providers/ollama-provider.js.map +1 -1
- package/dist/src/core/llm/providers/openai-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/openai-provider.js +13 -6
- package/dist/src/core/llm/providers/openai-provider.js.map +1 -1
- package/dist/src/core/llm/providers/vertex-ai-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/vertex-ai-provider.js +12 -8
- package/dist/src/core/llm/providers/vertex-ai-provider.js.map +1 -1
- package/dist/src/importers/ado-importer.js +2 -2
- package/dist/src/importers/ado-importer.js.map +1 -1
- package/dist/src/importers/item-converter.d.ts +6 -1
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +15 -2
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/integrations/ado/ado-pat-provider.d.ts +3 -3
- package/dist/src/integrations/ado/ado-pat-provider.js +3 -3
- package/dist/src/living-docs/epic-id-allocator.d.ts +1 -1
- package/dist/src/living-docs/epic-id-allocator.js +1 -1
- package/dist/src/living-docs/fs-id-allocator.d.ts +1 -1
- package/dist/src/living-docs/fs-id-allocator.js +1 -1
- package/dist/src/utils/auth-helpers.d.ts +23 -0
- package/dist/src/utils/auth-helpers.d.ts.map +1 -1
- package/dist/src/utils/auth-helpers.js +51 -0
- package/dist/src/utils/auth-helpers.js.map +1 -1
- package/dist/src/utils/feature-id-collision.d.ts +48 -5
- package/dist/src/utils/feature-id-collision.d.ts.map +1 -1
- package/dist/src/utils/feature-id-collision.js +251 -19
- package/dist/src/utils/feature-id-collision.js.map +1 -1
- package/dist/src/utils/llm-json-extractor.d.ts +105 -0
- package/dist/src/utils/llm-json-extractor.d.ts.map +1 -0
- package/dist/src/utils/llm-json-extractor.js +336 -0
- package/dist/src/utils/llm-json-extractor.js.map +1 -0
- package/dist/src/utils/structure-level-detector.d.ts +105 -0
- package/dist/src/utils/structure-level-detector.d.ts.map +1 -0
- package/dist/src/utils/structure-level-detector.js +388 -0
- package/dist/src/utils/structure-level-detector.js.map +1 -0
- package/dist/src/utils/validators/ado-validator.js +2 -2
- package/dist/src/utils/validators/ado-validator.js.map +1 -1
- package/package.json +1 -2
- package/plugins/specweave/commands/specweave-increment.md +57 -9
- package/plugins/specweave/commands/specweave-living-docs.md +321 -0
- package/plugins/specweave/commands/specweave-sync-specs.md +37 -6
- package/plugins/specweave/hooks/hooks.json +10 -0
- package/plugins/specweave/hooks/spec-project-validator.sh +111 -0
- package/plugins/specweave/hooks/v2/handlers/github-sync-handler.sh +10 -1
- package/plugins/specweave/hooks/v2/handlers/living-docs-handler.sh +10 -1
- package/plugins/specweave/skills/increment-planner/SKILL.md +109 -10
- package/plugins/specweave/skills/increment-planner/templates/spec-multi-project.md +2 -0
- package/plugins/specweave/skills/increment-planner/templates/spec-single-project.md +1 -0
- package/plugins/specweave/skills/multi-project-spec-mapper/SKILL.md +24 -1
- package/plugins/specweave/skills/spec-generator/SKILL.md +18 -0
- package/plugins/specweave/skills/specweave-framework/SKILL.md +25 -0
- package/plugins/specweave-ado/agents/ado-manager/AGENT.md +58 -0
- package/plugins/specweave-ado/commands/pull.md +30 -0
- package/plugins/specweave-ado/commands/push.md +30 -0
- package/plugins/specweave-ado/commands/sync.md +31 -0
- package/plugins/specweave-github/agents/github-manager/AGENT.md +22 -0
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +14 -0
- package/plugins/specweave-jira/agents/jira-manager/AGENT.md +30 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +21 -0
|
@@ -40,9 +40,24 @@ export declare function getGitHubAuthFromProject(projectRoot: string): GitHubAut
|
|
|
40
40
|
* If you have access to projectRoot, use getGitHubAuthFromProject() instead.
|
|
41
41
|
*/
|
|
42
42
|
export declare function getGitHubAuth(): GitHubAuth;
|
|
43
|
+
/**
|
|
44
|
+
* Get Azure DevOps authentication from project .env file
|
|
45
|
+
* Priority: .env file > process.env
|
|
46
|
+
*
|
|
47
|
+
* CRITICAL (2025-12-04): This function MUST be used when projectRoot is available
|
|
48
|
+
* to properly load tokens from .env file. The original getAzureDevOpsAuth() only
|
|
49
|
+
* reads process.env which is empty unless dotenv is explicitly loaded.
|
|
50
|
+
*
|
|
51
|
+
* @param projectRoot - Path to project root containing .env file
|
|
52
|
+
* @returns Azure DevOps authentication or null if not found
|
|
53
|
+
*/
|
|
54
|
+
export declare function getAzureDevOpsAuthFromProject(projectRoot: string): AzureDevOpsAuth | null;
|
|
43
55
|
/**
|
|
44
56
|
* Get Azure DevOps authentication
|
|
45
57
|
* Requires: AZURE_DEVOPS_PAT, AZURE_DEVOPS_ORG, AZURE_DEVOPS_PROJECT
|
|
58
|
+
*
|
|
59
|
+
* WARNING: This function only reads from process.env, NOT from .env files!
|
|
60
|
+
* If you have access to projectRoot, use getAzureDevOpsAuthFromProject() instead.
|
|
46
61
|
*/
|
|
47
62
|
export declare function getAzureDevOpsAuth(): AzureDevOpsAuth | null;
|
|
48
63
|
/**
|
|
@@ -68,6 +83,14 @@ export declare function hasGitHubCredentials(): boolean;
|
|
|
68
83
|
*/
|
|
69
84
|
export declare function hasGitHubCredentialsFromProject(projectRoot: string): boolean;
|
|
70
85
|
export declare function hasAzureDevOpsCredentials(): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Check if Azure DevOps credentials are available (project-aware)
|
|
88
|
+
* Uses getAzureDevOpsAuthFromProject() to also check .env file
|
|
89
|
+
*
|
|
90
|
+
* @param projectRoot - Path to project root containing .env file
|
|
91
|
+
* @returns True if credentials are available
|
|
92
|
+
*/
|
|
93
|
+
export declare function hasAzureDevOpsCredentialsFromProject(projectRoot: string): boolean;
|
|
71
94
|
export declare function hasJiraCredentials(): boolean;
|
|
72
95
|
/**
|
|
73
96
|
* Get credential status summary (for debugging)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/auth-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;CACzD;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAgCD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CAwBxE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAqC1C;AAED
|
|
1
|
+
{"version":3,"file":"auth-helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/auth-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;CACzD;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAgCD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CAwBxE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAqC1C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA2BzF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,GAAG,IAAI,CAU3D;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,QAAQ,GAAG,IAAI,CAU7C;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAYnD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAG9C;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG5E;AAED,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAGjF;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,uBAAuB,EAAE,OAAO,CAAC;CAClC,CAQA"}
|
|
@@ -113,9 +113,49 @@ export function getGitHubAuth() {
|
|
|
113
113
|
}
|
|
114
114
|
return { token: '', source: 'none' };
|
|
115
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Get Azure DevOps authentication from project .env file
|
|
118
|
+
* Priority: .env file > process.env
|
|
119
|
+
*
|
|
120
|
+
* CRITICAL (2025-12-04): This function MUST be used when projectRoot is available
|
|
121
|
+
* to properly load tokens from .env file. The original getAzureDevOpsAuth() only
|
|
122
|
+
* reads process.env which is empty unless dotenv is explicitly loaded.
|
|
123
|
+
*
|
|
124
|
+
* @param projectRoot - Path to project root containing .env file
|
|
125
|
+
* @returns Azure DevOps authentication or null if not found
|
|
126
|
+
*/
|
|
127
|
+
export function getAzureDevOpsAuthFromProject(projectRoot) {
|
|
128
|
+
// 1. First, try to read from project .env file
|
|
129
|
+
try {
|
|
130
|
+
const envPath = path.join(projectRoot, '.env');
|
|
131
|
+
if (fs.existsSync(envPath)) {
|
|
132
|
+
const content = fs.readFileSync(envPath, 'utf-8');
|
|
133
|
+
const envVars = parseEnvFileSimple(content);
|
|
134
|
+
const pat = envVars.AZURE_DEVOPS_PAT;
|
|
135
|
+
const org = envVars.AZURE_DEVOPS_ORG;
|
|
136
|
+
const project = envVars.AZURE_DEVOPS_PROJECT;
|
|
137
|
+
if (pat) {
|
|
138
|
+
// PAT found in .env - return it (org/project might come from config.json)
|
|
139
|
+
return {
|
|
140
|
+
pat,
|
|
141
|
+
org: org || process.env.AZURE_DEVOPS_ORG || '',
|
|
142
|
+
project: project || process.env.AZURE_DEVOPS_PROJECT || ''
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// Silently fail - .env file is optional
|
|
149
|
+
}
|
|
150
|
+
// 2. Fall back to process.env
|
|
151
|
+
return getAzureDevOpsAuth();
|
|
152
|
+
}
|
|
116
153
|
/**
|
|
117
154
|
* Get Azure DevOps authentication
|
|
118
155
|
* Requires: AZURE_DEVOPS_PAT, AZURE_DEVOPS_ORG, AZURE_DEVOPS_PROJECT
|
|
156
|
+
*
|
|
157
|
+
* WARNING: This function only reads from process.env, NOT from .env files!
|
|
158
|
+
* If you have access to projectRoot, use getAzureDevOpsAuthFromProject() instead.
|
|
119
159
|
*/
|
|
120
160
|
export function getAzureDevOpsAuth() {
|
|
121
161
|
const pat = process.env.AZURE_DEVOPS_PAT;
|
|
@@ -175,6 +215,17 @@ export function hasGitHubCredentialsFromProject(projectRoot) {
|
|
|
175
215
|
export function hasAzureDevOpsCredentials() {
|
|
176
216
|
return getAzureDevOpsAuth() !== null;
|
|
177
217
|
}
|
|
218
|
+
/**
|
|
219
|
+
* Check if Azure DevOps credentials are available (project-aware)
|
|
220
|
+
* Uses getAzureDevOpsAuthFromProject() to also check .env file
|
|
221
|
+
*
|
|
222
|
+
* @param projectRoot - Path to project root containing .env file
|
|
223
|
+
* @returns True if credentials are available
|
|
224
|
+
*/
|
|
225
|
+
export function hasAzureDevOpsCredentialsFromProject(projectRoot) {
|
|
226
|
+
const auth = getAzureDevOpsAuthFromProject(projectRoot);
|
|
227
|
+
return auth !== null && !!auth.pat;
|
|
228
|
+
}
|
|
178
229
|
export function hasJiraCredentials() {
|
|
179
230
|
return getJiraAuth() !== null;
|
|
180
231
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-helpers.js","sourceRoot":"","sources":["../../../src/utils/auth-helpers.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"auth-helpers.js","sourceRoot":"","sources":["../../../src/utils/auth-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,9 +34,13 @@ export interface CollisionCheckOptions {
|
|
|
34
34
|
* CRITICAL: This function prevents FS-001 vs FS-001E collision by checking
|
|
35
35
|
* if either variant exists before returning a number.
|
|
36
36
|
*
|
|
37
|
+
* CRITICAL FIX (2025-12-04): Now supports hierarchical project paths!
|
|
38
|
+
* - Handles paths like "acme/backend-services" (2-level ADO structure)
|
|
39
|
+
* - Scans _orphans folder for US-XXX files that may reference FS-IDs
|
|
40
|
+
*
|
|
37
41
|
* @param baseNumber - Starting number (typically from increment ID)
|
|
38
42
|
* @param specsPath - Path to specs directory (e.g., .specweave/docs/internal/specs)
|
|
39
|
-
* @param
|
|
43
|
+
* @param projectPath - Project path for multi-project mode (e.g., "my-project" or "acme/backend")
|
|
40
44
|
* @param options - Optional configuration
|
|
41
45
|
* @returns Next available number that doesn't conflict with existing features
|
|
42
46
|
*
|
|
@@ -45,26 +49,65 @@ export interface CollisionCheckOptions {
|
|
|
45
49
|
* // Increment 0001 would normally generate FS-001
|
|
46
50
|
* // But if FS-001E exists, this returns 2 (for FS-002)
|
|
47
51
|
* const num = await findNextAvailableInternalId(1, specsPath, 'my-project');
|
|
52
|
+
*
|
|
53
|
+
* // Works with hierarchical paths (ADO 2-level structure)
|
|
54
|
+
* const num = await findNextAvailableInternalId(1, specsPath, 'acme-corp/backend-services');
|
|
48
55
|
* ```
|
|
49
56
|
*/
|
|
50
|
-
export declare function findNextAvailableInternalId(baseNumber: number, specsPath: string,
|
|
57
|
+
export declare function findNextAvailableInternalId(baseNumber: number, specsPath: string, projectPath: string, options?: CollisionCheckOptions): Promise<number>;
|
|
51
58
|
/**
|
|
52
59
|
* Synchronous version of findNextAvailableInternalId
|
|
53
60
|
*
|
|
61
|
+
* CRITICAL FIX (2025-12-04): Updated to match async version with:
|
|
62
|
+
* - Support for hierarchical project paths (e.g., "acme/backend")
|
|
63
|
+
* - _orphans folder scanning
|
|
64
|
+
*
|
|
54
65
|
* Use this in synchronous contexts where async isn't available.
|
|
55
66
|
*/
|
|
56
|
-
export declare function findNextAvailableInternalIdSync(baseNumber: number, specsPath: string,
|
|
67
|
+
export declare function findNextAvailableInternalIdSync(baseNumber: number, specsPath: string, projectPath: string, options?: CollisionCheckOptions): number;
|
|
57
68
|
/**
|
|
58
69
|
* Check if a specific numeric index has a collision (either FS-XXX or FS-XXXE exists)
|
|
59
70
|
*
|
|
71
|
+
* CRITICAL FIX (2025-12-04): Now supports hierarchical paths, _orphans and _archive folders
|
|
72
|
+
*
|
|
60
73
|
* @param number - Numeric index to check
|
|
61
74
|
* @param specsPath - Path to specs directory
|
|
62
|
-
* @param
|
|
75
|
+
* @param projectPath - Project path (may be hierarchical like "acme/backend")
|
|
63
76
|
* @returns Object indicating which variants exist
|
|
64
77
|
*/
|
|
65
|
-
export declare function checkFeatureIdCollision(number: number, specsPath: string,
|
|
78
|
+
export declare function checkFeatureIdCollision(number: number, specsPath: string, projectPath: string): {
|
|
66
79
|
internalExists: boolean;
|
|
67
80
|
externalExists: boolean;
|
|
81
|
+
archiveExists: boolean;
|
|
82
|
+
orphanHasId: boolean;
|
|
68
83
|
hasCollision: boolean;
|
|
69
84
|
};
|
|
85
|
+
/**
|
|
86
|
+
* Find the next available user story ID number that doesn't collide
|
|
87
|
+
* with existing internal OR external user stories.
|
|
88
|
+
*
|
|
89
|
+
* CRITICAL (2025-12-04): Prevents US-001 vs US-001E collision
|
|
90
|
+
* - Scans all FS-XXX folders for us-*.md files
|
|
91
|
+
* - Scans _orphans folder for us-*.md files
|
|
92
|
+
* - Returns the max ID + 1 to avoid collision
|
|
93
|
+
*
|
|
94
|
+
* @param projectSpecsPath - Path to project's specs folder
|
|
95
|
+
* @param options - Optional configuration
|
|
96
|
+
* @returns Next available US-ID number
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* // If US-001E, US-002E exist in the project, returns 3
|
|
101
|
+
* const nextId = findNextAvailableUSId('/path/to/specs/my-project');
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export declare function findNextAvailableUSId(projectSpecsPath: string, options?: CollisionCheckOptions): number;
|
|
105
|
+
/**
|
|
106
|
+
* Check if a specific US-ID number is already used
|
|
107
|
+
*
|
|
108
|
+
* @param number - US-ID number to check (e.g., 1 for US-001)
|
|
109
|
+
* @param projectSpecsPath - Path to project's specs folder
|
|
110
|
+
* @returns true if either US-XXX or US-XXXE exists
|
|
111
|
+
*/
|
|
112
|
+
export declare function isUSIdUsed(number: number, projectSpecsPath: string): boolean;
|
|
70
113
|
//# sourceMappingURL=feature-id-collision.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-id-collision.d.ts","sourceRoot":"","sources":["../../../src/utils/feature-id-collision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED
|
|
1
|
+
{"version":3,"file":"feature-id-collision.d.ts","sourceRoot":"","sources":["../../../src/utils/feature-id-collision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,CA+EjB;AA2DD;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAuDR;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CA4B3H;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CACnC,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAqDR;AAsBD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CA8B5E"}
|
|
@@ -27,9 +27,13 @@ import { consoleLogger } from './logger.js';
|
|
|
27
27
|
* CRITICAL: This function prevents FS-001 vs FS-001E collision by checking
|
|
28
28
|
* if either variant exists before returning a number.
|
|
29
29
|
*
|
|
30
|
+
* CRITICAL FIX (2025-12-04): Now supports hierarchical project paths!
|
|
31
|
+
* - Handles paths like "acme/backend-services" (2-level ADO structure)
|
|
32
|
+
* - Scans _orphans folder for US-XXX files that may reference FS-IDs
|
|
33
|
+
*
|
|
30
34
|
* @param baseNumber - Starting number (typically from increment ID)
|
|
31
35
|
* @param specsPath - Path to specs directory (e.g., .specweave/docs/internal/specs)
|
|
32
|
-
* @param
|
|
36
|
+
* @param projectPath - Project path for multi-project mode (e.g., "my-project" or "acme/backend")
|
|
33
37
|
* @param options - Optional configuration
|
|
34
38
|
* @returns Next available number that doesn't conflict with existing features
|
|
35
39
|
*
|
|
@@ -38,13 +42,16 @@ import { consoleLogger } from './logger.js';
|
|
|
38
42
|
* // Increment 0001 would normally generate FS-001
|
|
39
43
|
* // But if FS-001E exists, this returns 2 (for FS-002)
|
|
40
44
|
* const num = await findNextAvailableInternalId(1, specsPath, 'my-project');
|
|
45
|
+
*
|
|
46
|
+
* // Works with hierarchical paths (ADO 2-level structure)
|
|
47
|
+
* const num = await findNextAvailableInternalId(1, specsPath, 'acme-corp/backend-services');
|
|
41
48
|
* ```
|
|
42
49
|
*/
|
|
43
|
-
export async function findNextAvailableInternalId(baseNumber, specsPath,
|
|
50
|
+
export async function findNextAvailableInternalId(baseNumber, specsPath, projectPath, options = {}) {
|
|
44
51
|
const logger = options.logger ?? consoleLogger;
|
|
45
52
|
const maxIterations = options.maxIterations ?? 1000;
|
|
46
|
-
// Build path to project's specs folder
|
|
47
|
-
const projectSpecsPath = path.join(specsPath,
|
|
53
|
+
// Build path to project's specs folder (supports hierarchical paths like "acme/backend")
|
|
54
|
+
const projectSpecsPath = path.join(specsPath, projectPath);
|
|
48
55
|
// If project folder doesn't exist, no collision possible
|
|
49
56
|
if (!fs.existsSync(projectSpecsPath)) {
|
|
50
57
|
return baseNumber;
|
|
@@ -58,18 +65,46 @@ export async function findNextAvailableInternalId(baseNumber, specsPath, project
|
|
|
58
65
|
const externalPath = path.join(projectSpecsPath, externalId);
|
|
59
66
|
const internalExists = fs.existsSync(internalPath);
|
|
60
67
|
const externalExists = fs.existsSync(externalPath);
|
|
61
|
-
|
|
68
|
+
// CRITICAL FIX (2025-12-04): Also check _archive folder
|
|
69
|
+
// Archived features still reserve their IDs to prevent reuse after restore
|
|
70
|
+
const archivePath = path.join(projectSpecsPath, '_archive');
|
|
71
|
+
const archiveInternalExists = fs.existsSync(path.join(archivePath, internalId));
|
|
72
|
+
const archiveExternalExists = fs.existsSync(path.join(archivePath, externalId));
|
|
73
|
+
// CRITICAL FIX (2025-12-04): Also check _orphans folder
|
|
74
|
+
// Orphan items may have FS-IDs referenced in their metadata
|
|
75
|
+
const orphanHasId = checkOrphansForFSId(projectSpecsPath, currentNumber);
|
|
76
|
+
if (!internalExists && !externalExists && !archiveInternalExists && !archiveExternalExists && !orphanHasId) {
|
|
62
77
|
// Found available slot
|
|
63
78
|
if (currentNumber !== baseNumber) {
|
|
64
|
-
|
|
79
|
+
// Determine which variant caused the collision for accurate messaging
|
|
80
|
+
const baseInternalId = `FS-${baseNumber.toString().padStart(3, '0')}`;
|
|
81
|
+
const baseExternalId = `${baseInternalId}E`;
|
|
82
|
+
const baseInternalExists = fs.existsSync(path.join(projectSpecsPath, baseInternalId));
|
|
83
|
+
const baseExternalExists = fs.existsSync(path.join(projectSpecsPath, baseExternalId));
|
|
84
|
+
const existingId = baseExternalExists ? baseExternalId : baseInternalId;
|
|
85
|
+
logger.warn(`⚠️ Feature ID collision avoided: ${projectPath}/${existingId} exists, ` +
|
|
65
86
|
`using FS-${currentNumber.toString().padStart(3, '0')} instead`);
|
|
66
87
|
}
|
|
67
88
|
return currentNumber;
|
|
68
89
|
}
|
|
69
90
|
// Log what we found for debugging
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
91
|
+
const hasCollision = internalExists || externalExists || archiveInternalExists || archiveExternalExists || orphanHasId;
|
|
92
|
+
if (iterations === 0 && hasCollision) {
|
|
93
|
+
if (externalExists) {
|
|
94
|
+
logger.log(` 📋 Collision detected: ${projectPath}/${externalId} exists`);
|
|
95
|
+
}
|
|
96
|
+
else if (internalExists) {
|
|
97
|
+
logger.log(` 📋 Collision detected: ${projectPath}/${internalId} exists`);
|
|
98
|
+
}
|
|
99
|
+
else if (archiveExternalExists) {
|
|
100
|
+
logger.log(` 📋 Collision detected: ${projectPath}/_archive/${externalId} exists`);
|
|
101
|
+
}
|
|
102
|
+
else if (archiveInternalExists) {
|
|
103
|
+
logger.log(` 📋 Collision detected: ${projectPath}/_archive/${internalId} exists`);
|
|
104
|
+
}
|
|
105
|
+
else if (orphanHasId) {
|
|
106
|
+
logger.log(` 📋 Collision detected: FS-${currentNumber.toString().padStart(3, '0')} referenced in _orphans`);
|
|
107
|
+
}
|
|
73
108
|
}
|
|
74
109
|
currentNumber++;
|
|
75
110
|
iterations++;
|
|
@@ -79,16 +114,72 @@ export async function findNextAvailableInternalId(baseNumber, specsPath, project
|
|
|
79
114
|
`Started at ${baseNumber}, checked up to ${currentNumber - 1}. ` +
|
|
80
115
|
`This indicates a serious problem with the specs folder.`);
|
|
81
116
|
}
|
|
117
|
+
// Helper function for async version to check base collision
|
|
118
|
+
function getExistingIdForBase(projectSpecsPath, baseNumber) {
|
|
119
|
+
const baseInternalId = `FS-${baseNumber.toString().padStart(3, '0')}`;
|
|
120
|
+
const baseExternalId = `${baseInternalId}E`;
|
|
121
|
+
const baseExternalExists = fs.existsSync(path.join(projectSpecsPath, baseExternalId));
|
|
122
|
+
return baseExternalExists ? baseExternalId : baseInternalId;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Check if _orphans folder contains files referencing a specific FS-ID
|
|
126
|
+
*
|
|
127
|
+
* @param projectSpecsPath - Path to project's specs folder
|
|
128
|
+
* @param fsNumber - FS-ID number to check (e.g., 1 for FS-001)
|
|
129
|
+
* @returns true if orphans folder has items referencing this FS-ID
|
|
130
|
+
*/
|
|
131
|
+
function checkOrphansForFSId(projectSpecsPath, fsNumber) {
|
|
132
|
+
const orphansPath = path.join(projectSpecsPath, '_orphans');
|
|
133
|
+
if (!fs.existsSync(orphansPath)) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
const entries = fs.readdirSync(orphansPath);
|
|
138
|
+
const fsPattern = new RegExp(`FS-0*${fsNumber}E?`, 'i');
|
|
139
|
+
for (const entry of entries) {
|
|
140
|
+
// Check if filename matches FS-ID pattern
|
|
141
|
+
if (fsPattern.test(entry)) {
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
// Also check file content for frontmatter references
|
|
145
|
+
const filePath = path.join(orphansPath, entry);
|
|
146
|
+
if (entry.endsWith('.md') && fs.statSync(filePath).isFile()) {
|
|
147
|
+
try {
|
|
148
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
149
|
+
// Check frontmatter for featureId reference (both with and without E suffix)
|
|
150
|
+
const paddedId = fsNumber.toString().padStart(3, '0');
|
|
151
|
+
if (content.includes(`featureId: FS-${paddedId}`) ||
|
|
152
|
+
content.includes(`featureId: FS-${paddedId}E`) ||
|
|
153
|
+
content.includes(`feature_id: FS-${paddedId}`) ||
|
|
154
|
+
content.includes(`feature_id: FS-${paddedId}E`)) {
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Skip unreadable files
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Error reading orphans folder - assume no collision
|
|
166
|
+
}
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
82
169
|
/**
|
|
83
170
|
* Synchronous version of findNextAvailableInternalId
|
|
84
171
|
*
|
|
172
|
+
* CRITICAL FIX (2025-12-04): Updated to match async version with:
|
|
173
|
+
* - Support for hierarchical project paths (e.g., "acme/backend")
|
|
174
|
+
* - _orphans folder scanning
|
|
175
|
+
*
|
|
85
176
|
* Use this in synchronous contexts where async isn't available.
|
|
86
177
|
*/
|
|
87
|
-
export function findNextAvailableInternalIdSync(baseNumber, specsPath,
|
|
178
|
+
export function findNextAvailableInternalIdSync(baseNumber, specsPath, projectPath, options = {}) {
|
|
88
179
|
const logger = options.logger ?? consoleLogger;
|
|
89
180
|
const maxIterations = options.maxIterations ?? 1000;
|
|
90
|
-
// Build path to project's specs folder
|
|
91
|
-
const projectSpecsPath = path.join(specsPath,
|
|
181
|
+
// Build path to project's specs folder (supports hierarchical paths like "acme/backend")
|
|
182
|
+
const projectSpecsPath = path.join(specsPath, projectPath);
|
|
92
183
|
// If project folder doesn't exist, no collision possible
|
|
93
184
|
if (!fs.existsSync(projectSpecsPath)) {
|
|
94
185
|
return baseNumber;
|
|
@@ -102,10 +193,19 @@ export function findNextAvailableInternalIdSync(baseNumber, specsPath, projectId
|
|
|
102
193
|
const externalPath = path.join(projectSpecsPath, externalId);
|
|
103
194
|
const internalExists = fs.existsSync(internalPath);
|
|
104
195
|
const externalExists = fs.existsSync(externalPath);
|
|
105
|
-
|
|
196
|
+
// CRITICAL FIX (2025-12-04): Also check _archive folder
|
|
197
|
+
// Archived features still reserve their IDs to prevent reuse after restore
|
|
198
|
+
const archivePath = path.join(projectSpecsPath, '_archive');
|
|
199
|
+
const archiveInternalExists = fs.existsSync(path.join(archivePath, internalId));
|
|
200
|
+
const archiveExternalExists = fs.existsSync(path.join(archivePath, externalId));
|
|
201
|
+
// CRITICAL FIX (2025-12-04): Also check _orphans folder
|
|
202
|
+
const orphanHasId = checkOrphansForFSId(projectSpecsPath, currentNumber);
|
|
203
|
+
if (!internalExists && !externalExists && !archiveInternalExists && !archiveExternalExists && !orphanHasId) {
|
|
106
204
|
// Found available slot
|
|
107
205
|
if (currentNumber !== baseNumber) {
|
|
108
|
-
|
|
206
|
+
// Use helper to determine which variant caused the collision
|
|
207
|
+
const existingId = getExistingIdForBase(projectSpecsPath, baseNumber);
|
|
208
|
+
logger.warn(`⚠️ Feature ID collision avoided: ${projectPath}/${existingId} exists, ` +
|
|
109
209
|
`using FS-${currentNumber.toString().padStart(3, '0')} instead`);
|
|
110
210
|
}
|
|
111
211
|
return currentNumber;
|
|
@@ -119,24 +219,156 @@ export function findNextAvailableInternalIdSync(baseNumber, specsPath, projectId
|
|
|
119
219
|
/**
|
|
120
220
|
* Check if a specific numeric index has a collision (either FS-XXX or FS-XXXE exists)
|
|
121
221
|
*
|
|
222
|
+
* CRITICAL FIX (2025-12-04): Now supports hierarchical paths, _orphans and _archive folders
|
|
223
|
+
*
|
|
122
224
|
* @param number - Numeric index to check
|
|
123
225
|
* @param specsPath - Path to specs directory
|
|
124
|
-
* @param
|
|
226
|
+
* @param projectPath - Project path (may be hierarchical like "acme/backend")
|
|
125
227
|
* @returns Object indicating which variants exist
|
|
126
228
|
*/
|
|
127
|
-
export function checkFeatureIdCollision(number, specsPath,
|
|
128
|
-
const projectSpecsPath = path.join(specsPath,
|
|
229
|
+
export function checkFeatureIdCollision(number, specsPath, projectPath) {
|
|
230
|
+
const projectSpecsPath = path.join(specsPath, projectPath);
|
|
129
231
|
if (!fs.existsSync(projectSpecsPath)) {
|
|
130
|
-
return { internalExists: false, externalExists: false, hasCollision: false };
|
|
232
|
+
return { internalExists: false, externalExists: false, archiveExists: false, orphanHasId: false, hasCollision: false };
|
|
131
233
|
}
|
|
132
234
|
const internalId = `FS-${number.toString().padStart(3, '0')}`;
|
|
133
235
|
const externalId = `FS-${number.toString().padStart(3, '0')}E`;
|
|
134
236
|
const internalExists = fs.existsSync(path.join(projectSpecsPath, internalId));
|
|
135
237
|
const externalExists = fs.existsSync(path.join(projectSpecsPath, externalId));
|
|
238
|
+
// CRITICAL FIX (2025-12-04): Also check _archive folder
|
|
239
|
+
const archivePath = path.join(projectSpecsPath, '_archive');
|
|
240
|
+
const archiveInternalExists = fs.existsSync(path.join(archivePath, internalId));
|
|
241
|
+
const archiveExternalExists = fs.existsSync(path.join(archivePath, externalId));
|
|
242
|
+
const archiveExists = archiveInternalExists || archiveExternalExists;
|
|
243
|
+
const orphanHasId = checkOrphansForFSId(projectSpecsPath, number);
|
|
136
244
|
return {
|
|
137
245
|
internalExists,
|
|
138
246
|
externalExists,
|
|
139
|
-
|
|
247
|
+
archiveExists,
|
|
248
|
+
orphanHasId,
|
|
249
|
+
hasCollision: internalExists || externalExists || archiveExists || orphanHasId
|
|
140
250
|
};
|
|
141
251
|
}
|
|
252
|
+
/**
|
|
253
|
+
* Find the next available user story ID number that doesn't collide
|
|
254
|
+
* with existing internal OR external user stories.
|
|
255
|
+
*
|
|
256
|
+
* CRITICAL (2025-12-04): Prevents US-001 vs US-001E collision
|
|
257
|
+
* - Scans all FS-XXX folders for us-*.md files
|
|
258
|
+
* - Scans _orphans folder for us-*.md files
|
|
259
|
+
* - Returns the max ID + 1 to avoid collision
|
|
260
|
+
*
|
|
261
|
+
* @param projectSpecsPath - Path to project's specs folder
|
|
262
|
+
* @param options - Optional configuration
|
|
263
|
+
* @returns Next available US-ID number
|
|
264
|
+
*
|
|
265
|
+
* @example
|
|
266
|
+
* ```typescript
|
|
267
|
+
* // If US-001E, US-002E exist in the project, returns 3
|
|
268
|
+
* const nextId = findNextAvailableUSId('/path/to/specs/my-project');
|
|
269
|
+
* ```
|
|
270
|
+
*/
|
|
271
|
+
export function findNextAvailableUSId(projectSpecsPath, options = {}) {
|
|
272
|
+
const logger = options.logger ?? consoleLogger;
|
|
273
|
+
if (!fs.existsSync(projectSpecsPath)) {
|
|
274
|
+
return 1;
|
|
275
|
+
}
|
|
276
|
+
const usedIds = new Set();
|
|
277
|
+
try {
|
|
278
|
+
const entries = fs.readdirSync(projectSpecsPath, { withFileTypes: true });
|
|
279
|
+
for (const entry of entries) {
|
|
280
|
+
if (!entry.isDirectory())
|
|
281
|
+
continue;
|
|
282
|
+
// Scan FS-XXX folders for us-*.md files
|
|
283
|
+
if (/^FS-\d{3,}E?$/.test(entry.name)) {
|
|
284
|
+
const featurePath = path.join(projectSpecsPath, entry.name);
|
|
285
|
+
scanFolderForUSIds(featurePath, usedIds);
|
|
286
|
+
}
|
|
287
|
+
// Scan _orphans folder
|
|
288
|
+
if (entry.name === '_orphans') {
|
|
289
|
+
const orphansPath = path.join(projectSpecsPath, entry.name);
|
|
290
|
+
scanFolderForUSIds(orphansPath, usedIds);
|
|
291
|
+
}
|
|
292
|
+
// Scan _archive folder (may have archived features with US-IDs)
|
|
293
|
+
if (entry.name === '_archive') {
|
|
294
|
+
const archivePath = path.join(projectSpecsPath, entry.name);
|
|
295
|
+
try {
|
|
296
|
+
const archiveEntries = fs.readdirSync(archivePath, { withFileTypes: true });
|
|
297
|
+
for (const archiveEntry of archiveEntries) {
|
|
298
|
+
if (archiveEntry.isDirectory() && /^FS-\d{3,}E?$/.test(archiveEntry.name)) {
|
|
299
|
+
scanFolderForUSIds(path.join(archivePath, archiveEntry.name), usedIds);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
// Error reading archive folder - continue
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
logger.warn(` ⚠️ Error scanning for US-IDs: ${error}`);
|
|
311
|
+
}
|
|
312
|
+
// Find next available ID (max + 1)
|
|
313
|
+
if (usedIds.size === 0) {
|
|
314
|
+
return 1;
|
|
315
|
+
}
|
|
316
|
+
const maxId = Math.max(...usedIds);
|
|
317
|
+
return maxId + 1;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Scan a folder for us-*.md files and extract US-ID numbers
|
|
321
|
+
*/
|
|
322
|
+
function scanFolderForUSIds(folderPath, usedIds) {
|
|
323
|
+
try {
|
|
324
|
+
const files = fs.readdirSync(folderPath);
|
|
325
|
+
// Match us-001.md, us-001e-title.md, us-042e.md, etc.
|
|
326
|
+
const usPattern = /^us-(\d{3,})e?/i;
|
|
327
|
+
for (const file of files) {
|
|
328
|
+
const match = file.match(usPattern);
|
|
329
|
+
if (match) {
|
|
330
|
+
usedIds.add(parseInt(match[1], 10));
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
// Error reading folder - continue
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Check if a specific US-ID number is already used
|
|
340
|
+
*
|
|
341
|
+
* @param number - US-ID number to check (e.g., 1 for US-001)
|
|
342
|
+
* @param projectSpecsPath - Path to project's specs folder
|
|
343
|
+
* @returns true if either US-XXX or US-XXXE exists
|
|
344
|
+
*/
|
|
345
|
+
export function isUSIdUsed(number, projectSpecsPath) {
|
|
346
|
+
if (!fs.existsSync(projectSpecsPath)) {
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
const usedIds = new Set();
|
|
350
|
+
try {
|
|
351
|
+
const entries = fs.readdirSync(projectSpecsPath, { withFileTypes: true });
|
|
352
|
+
for (const entry of entries) {
|
|
353
|
+
if (!entry.isDirectory())
|
|
354
|
+
continue;
|
|
355
|
+
// Scan FS-XXX folders
|
|
356
|
+
if (/^FS-\d{3,}E?$/.test(entry.name)) {
|
|
357
|
+
scanFolderForUSIds(path.join(projectSpecsPath, entry.name), usedIds);
|
|
358
|
+
if (usedIds.has(number))
|
|
359
|
+
return true;
|
|
360
|
+
}
|
|
361
|
+
// Scan _orphans folder
|
|
362
|
+
if (entry.name === '_orphans') {
|
|
363
|
+
scanFolderForUSIds(path.join(projectSpecsPath, entry.name), usedIds);
|
|
364
|
+
if (usedIds.has(number))
|
|
365
|
+
return true;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
// Error scanning - assume no collision
|
|
371
|
+
}
|
|
372
|
+
return usedIds.has(number);
|
|
373
|
+
}
|
|
142
374
|
//# sourceMappingURL=feature-id-collision.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-id-collision.js","sourceRoot":"","sources":["../../../src/utils/feature-id-collision.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"feature-id-collision.js","sourceRoot":"","sources":["../../../src/utils/feature-id-collision.ts"],"names":[],"mappings":"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"}
|