specweave 0.28.13 → 0.28.15
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/dist/src/cli/commands/archive.d.ts +0 -1
- package/dist/src/cli/commands/archive.d.ts.map +1 -1
- package/dist/src/cli/commands/archive.js +1 -4
- package/dist/src/cli/commands/archive.js.map +1 -1
- package/dist/src/cli/commands/import-external.d.ts.map +1 -1
- package/dist/src/cli/commands/import-external.js +128 -16
- package/dist/src/cli/commands/import-external.js.map +1 -1
- package/dist/src/cli/commands/init.js +5 -5
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/init/external-import.d.ts +3 -1
- package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/external-import.js +407 -19
- package/dist/src/cli/helpers/init/external-import.js.map +1 -1
- package/dist/src/cli/helpers/init/next-steps.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/next-steps.js +77 -5
- package/dist/src/cli/helpers/init/next-steps.js.map +1 -1
- package/dist/src/cli/helpers/init/smart-reinit.d.ts +2 -0
- package/dist/src/cli/helpers/init/smart-reinit.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/smart-reinit.js +371 -36
- package/dist/src/cli/helpers/init/smart-reinit.js.map +1 -1
- package/dist/src/cli/helpers/init/testing-config.d.ts +5 -2
- package/dist/src/cli/helpers/init/testing-config.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/testing-config.js +322 -31
- package/dist/src/cli/helpers/init/testing-config.js.map +1 -1
- package/dist/src/core/feature-deleter/validator.d.ts +1 -0
- package/dist/src/core/feature-deleter/validator.d.ts.map +1 -1
- package/dist/src/core/feature-deleter/validator.js +8 -10
- package/dist/src/core/feature-deleter/validator.js.map +1 -1
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +12 -5
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.d.ts +25 -3
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +131 -129
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-consistency-validator.d.ts +23 -22
- package/dist/src/core/living-docs/feature-consistency-validator.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-consistency-validator.js +68 -150
- package/dist/src/core/living-docs/feature-consistency-validator.js.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.d.ts +5 -1
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.js +43 -23
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts +21 -12
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +89 -70
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +10 -11
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +24 -56
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/repo-structure/repo-bulk-discovery.d.ts +1 -1
- package/dist/src/core/repo-structure/repo-bulk-discovery.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-bulk-discovery.js +168 -126
- package/dist/src/core/repo-structure/repo-bulk-discovery.js.map +1 -1
- package/dist/src/core/spec-detector.js +2 -2
- package/dist/src/core/spec-detector.js.map +1 -1
- package/dist/src/importers/duplicate-detector.d.ts +6 -0
- package/dist/src/importers/duplicate-detector.d.ts.map +1 -1
- package/dist/src/importers/duplicate-detector.js +8 -2
- package/dist/src/importers/duplicate-detector.js.map +1 -1
- package/dist/src/importers/external-importer.d.ts +6 -0
- package/dist/src/importers/external-importer.d.ts.map +1 -1
- package/dist/src/importers/import-coordinator.d.ts +38 -2
- package/dist/src/importers/import-coordinator.d.ts.map +1 -1
- package/dist/src/importers/import-coordinator.js +142 -5
- package/dist/src/importers/import-coordinator.js.map +1 -1
- package/dist/src/importers/item-converter.d.ts +39 -1
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +202 -24
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/living-docs/fs-id-allocator.d.ts +9 -2
- package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
- package/dist/src/living-docs/fs-id-allocator.js +24 -10
- package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
- package/dist/src/sync/sync-metadata.d.ts.map +1 -1
- package/dist/src/sync/sync-metadata.js +31 -2
- package/dist/src/sync/sync-metadata.js.map +1 -1
- package/dist/src/utils/project-detection.d.ts +13 -10
- package/dist/src/utils/project-detection.d.ts.map +1 -1
- package/dist/src/utils/project-detection.js +26 -11
- package/dist/src/utils/project-detection.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/agents/AGENTS-INDEX.md +0 -9
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +12 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +18 -0
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Feature Consistency Validator
|
|
3
|
+
* v5.0.0 - Unified Project Structure
|
|
3
4
|
*
|
|
4
|
-
* Validates
|
|
5
|
-
* - .specweave/docs/internal/specs/
|
|
6
|
-
* - .specweave/docs/internal/specs/{project}/FS-XXX/
|
|
5
|
+
* Validates feature folder consistency within project folders:
|
|
6
|
+
* - .specweave/docs/internal/specs/{project}/FS-XXX/FEATURE.md
|
|
7
7
|
*
|
|
8
8
|
* PROBLEM SOLVED:
|
|
9
|
-
*
|
|
10
|
-
* If sync fails midway or increment is deleted,
|
|
9
|
+
* Features in project folders should have proper FEATURE.md files.
|
|
10
|
+
* If sync fails midway or increment is deleted, features can be orphaned.
|
|
11
11
|
*
|
|
12
12
|
* SOLUTION:
|
|
13
|
-
* 1. Detect
|
|
14
|
-
* 2. Auto-repair by
|
|
13
|
+
* 1. Detect orphaned features (no FEATURE.md or linked increment deleted)
|
|
14
|
+
* 2. Auto-repair by archiving orphaned features
|
|
15
15
|
* 3. Report issues for manual intervention when auto-repair not possible
|
|
16
16
|
*
|
|
17
17
|
* @see ADR-0142 (if created) for architectural decision
|
|
@@ -21,15 +21,15 @@ export interface DiscrepancyReport {
|
|
|
21
21
|
/** Feature ID (e.g., "FS-062") */
|
|
22
22
|
featureId: string;
|
|
23
23
|
/** Type of discrepancy */
|
|
24
|
-
type: '
|
|
24
|
+
type: 'missing_feature_md' | 'orphaned_feature';
|
|
25
25
|
/** Description of the issue */
|
|
26
26
|
description: string;
|
|
27
27
|
/** Can this be auto-repaired? */
|
|
28
28
|
autoRepairable: boolean;
|
|
29
|
-
/** Path to
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
|
|
29
|
+
/** Path to feature folder in project */
|
|
30
|
+
featurePath?: string;
|
|
31
|
+
/** Project ID */
|
|
32
|
+
projectId?: string;
|
|
33
33
|
/** Linked increment ID (if found in FEATURE.md) */
|
|
34
34
|
linkedIncrementId?: string;
|
|
35
35
|
/** Whether linked increment exists */
|
|
@@ -68,22 +68,25 @@ export declare class FeatureConsistencyValidator {
|
|
|
68
68
|
private includeArchived;
|
|
69
69
|
constructor(projectRoot: string, options?: ValidatorOptions);
|
|
70
70
|
/**
|
|
71
|
-
* Validate
|
|
71
|
+
* Validate feature folder consistency within project folders
|
|
72
|
+
* v5.0.0: Features now live in {project}/FS-XXX/ (no _features folder)
|
|
72
73
|
*
|
|
73
74
|
* @param autoRepair - If true, attempt to auto-repair discrepancies
|
|
74
75
|
* @returns Validation result with discrepancies and repair results
|
|
75
76
|
*/
|
|
76
77
|
validate(autoRepair?: boolean): Promise<ValidationResult>;
|
|
77
78
|
/**
|
|
78
|
-
* Get all feature folder IDs from
|
|
79
|
+
* Get all feature folder IDs from a project directory
|
|
80
|
+
* v5.0.0: Features now live in {project}/FS-XXX/
|
|
79
81
|
*/
|
|
80
|
-
private
|
|
82
|
+
private getFeatureFoldersInProject;
|
|
81
83
|
/**
|
|
82
84
|
* Get all project folder names (excluding _features, _epics, _archive)
|
|
83
85
|
*/
|
|
84
86
|
private getProjectFolders;
|
|
85
87
|
/**
|
|
86
|
-
* Check if a feature has
|
|
88
|
+
* Check if a feature has proper FEATURE.md and linked increment
|
|
89
|
+
* v5.0.0: Features live in {project}/FS-XXX/
|
|
87
90
|
*/
|
|
88
91
|
private checkFeatureConsistency;
|
|
89
92
|
/**
|
|
@@ -101,17 +104,14 @@ export declare class FeatureConsistencyValidator {
|
|
|
101
104
|
private checkIncrementExists;
|
|
102
105
|
/**
|
|
103
106
|
* Attempt to repair a discrepancy
|
|
107
|
+
* v5.0.0: Only orphaned_feature repairs supported (archiving)
|
|
104
108
|
*/
|
|
105
109
|
private repairDiscrepancy;
|
|
106
110
|
/**
|
|
107
111
|
* Archive an orphaned feature (increment was deleted)
|
|
108
|
-
* Delegates to FeatureArchiver for consistent archiving behavior
|
|
112
|
+
* v5.0.0: Delegates to FeatureArchiver for consistent archiving behavior
|
|
109
113
|
*/
|
|
110
114
|
private archiveOrphanedFeature;
|
|
111
|
-
/**
|
|
112
|
-
* Create missing project folder for a feature
|
|
113
|
-
*/
|
|
114
|
-
private repairMissingProjectFolder;
|
|
115
115
|
/**
|
|
116
116
|
* Log validation summary
|
|
117
117
|
*/
|
|
@@ -122,7 +122,8 @@ export declare class FeatureConsistencyValidator {
|
|
|
122
122
|
*/
|
|
123
123
|
hasDiscrepancies(): Promise<boolean>;
|
|
124
124
|
/**
|
|
125
|
-
* Get list of orphaned features (features
|
|
125
|
+
* Get list of orphaned features (features with deleted increments)
|
|
126
|
+
* v5.0.0: Now checks features in project folders, not _features
|
|
126
127
|
*/
|
|
127
128
|
getOrphanedFeatures(): Promise<string[]>;
|
|
128
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-consistency-validator.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/feature-consistency-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"feature-consistency-validator.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/feature-consistency-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,IAAI,EAAE,oBAAoB,GAAG,kBAAkB,CAAC;IAChD,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,cAAc,EAAE,OAAO,CAAC;IACxB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sCAAsC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,kCAAkC;IAClC,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,oDAAoD;IACpD,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,2BAA2B;IACtC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAU;gBAErB,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAS/D;;;;;;OAMG;IACG,QAAQ,CAAC,UAAU,GAAE,OAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsDtE;;;OAGG;YACW,0BAA0B;IAmBxC;;OAEG;YACW,iBAAiB;IAoB/B;;;OAGG;YACW,uBAAuB;IA8CrC;;;OAGG;YACW,iBAAiB;IAiC/B;;OAEG;YACW,sBAAsB;IA6BpC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;;OAGG;YACW,iBAAiB;IAsC/B;;;OAGG;YACW,sBAAsB;IA0BpC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+C5B;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1C;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAM/C"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Feature Consistency Validator
|
|
3
|
+
* v5.0.0 - Unified Project Structure
|
|
3
4
|
*
|
|
4
|
-
* Validates
|
|
5
|
-
* - .specweave/docs/internal/specs/
|
|
6
|
-
* - .specweave/docs/internal/specs/{project}/FS-XXX/
|
|
5
|
+
* Validates feature folder consistency within project folders:
|
|
6
|
+
* - .specweave/docs/internal/specs/{project}/FS-XXX/FEATURE.md
|
|
7
7
|
*
|
|
8
8
|
* PROBLEM SOLVED:
|
|
9
|
-
*
|
|
10
|
-
* If sync fails midway or increment is deleted,
|
|
9
|
+
* Features in project folders should have proper FEATURE.md files.
|
|
10
|
+
* If sync fails midway or increment is deleted, features can be orphaned.
|
|
11
11
|
*
|
|
12
12
|
* SOLUTION:
|
|
13
|
-
* 1. Detect
|
|
14
|
-
* 2. Auto-repair by
|
|
13
|
+
* 1. Detect orphaned features (no FEATURE.md or linked increment deleted)
|
|
14
|
+
* 2. Auto-repair by archiving orphaned features
|
|
15
15
|
* 3. Report issues for manual intervention when auto-repair not possible
|
|
16
16
|
*
|
|
17
17
|
* @see ADR-0142 (if created) for architectural decision
|
|
@@ -30,7 +30,8 @@ export class FeatureConsistencyValidator {
|
|
|
30
30
|
this.includeArchived = options.includeArchived ?? false;
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
|
-
* Validate
|
|
33
|
+
* Validate feature folder consistency within project folders
|
|
34
|
+
* v5.0.0: Features now live in {project}/FS-XXX/ (no _features folder)
|
|
34
35
|
*
|
|
35
36
|
* @param autoRepair - If true, attempt to auto-repair discrepancies
|
|
36
37
|
* @returns Validation result with discrepancies and repair results
|
|
@@ -43,43 +44,45 @@ export class FeatureConsistencyValidator {
|
|
|
43
44
|
repairs: autoRepair ? [] : undefined
|
|
44
45
|
};
|
|
45
46
|
this.logger.log('🔍 Validating feature folder consistency...');
|
|
46
|
-
// Step 1: Get all
|
|
47
|
-
const
|
|
48
|
-
if (
|
|
49
|
-
this.logger.log(' ℹ️ No
|
|
47
|
+
// Step 1: Get all project folders
|
|
48
|
+
const projectFolders = await this.getProjectFolders();
|
|
49
|
+
if (projectFolders.length === 0) {
|
|
50
|
+
this.logger.log(' ℹ️ No project folders found, nothing to validate');
|
|
50
51
|
return result;
|
|
51
52
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
53
|
+
// Step 2: Scan all features in each project
|
|
54
|
+
for (const projectId of projectFolders) {
|
|
55
|
+
const projectPath = path.join(this.specsPath, projectId);
|
|
56
|
+
const featureFolders = await this.getFeatureFoldersInProject(projectPath);
|
|
57
|
+
for (const featureId of featureFolders) {
|
|
58
|
+
result.totalFeatures++;
|
|
59
|
+
const discrepancy = await this.checkFeatureConsistency(featureId, projectId);
|
|
60
|
+
if (discrepancy) {
|
|
61
|
+
result.discrepancies.push(discrepancy);
|
|
62
|
+
// Attempt auto-repair if enabled
|
|
63
|
+
if (autoRepair && discrepancy.autoRepairable) {
|
|
64
|
+
const repairResult = await this.repairDiscrepancy(discrepancy);
|
|
65
|
+
result.repairs.push(repairResult);
|
|
66
|
+
if (repairResult.success) {
|
|
67
|
+
result.consistentCount++; // Count as consistent after repair
|
|
68
|
+
}
|
|
67
69
|
}
|
|
68
70
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
else {
|
|
72
|
+
result.consistentCount++;
|
|
73
|
+
}
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
|
-
// Step
|
|
76
|
+
// Step 3: Log summary
|
|
75
77
|
this.logValidationSummary(result);
|
|
76
78
|
return result;
|
|
77
79
|
}
|
|
78
80
|
/**
|
|
79
|
-
* Get all feature folder IDs from
|
|
81
|
+
* Get all feature folder IDs from a project directory
|
|
82
|
+
* v5.0.0: Features now live in {project}/FS-XXX/
|
|
80
83
|
*/
|
|
81
|
-
async
|
|
82
|
-
const entries = await fs.readdir(
|
|
84
|
+
async getFeatureFoldersInProject(projectDir) {
|
|
85
|
+
const entries = await fs.readdir(projectDir, { withFileTypes: true });
|
|
83
86
|
const folders = [];
|
|
84
87
|
for (const entry of entries) {
|
|
85
88
|
if (!entry.isDirectory())
|
|
@@ -114,19 +117,21 @@ export class FeatureConsistencyValidator {
|
|
|
114
117
|
return projects;
|
|
115
118
|
}
|
|
116
119
|
/**
|
|
117
|
-
* Check if a feature has
|
|
120
|
+
* Check if a feature has proper FEATURE.md and linked increment
|
|
121
|
+
* v5.0.0: Features live in {project}/FS-XXX/
|
|
118
122
|
*/
|
|
119
|
-
async checkFeatureConsistency(featureId,
|
|
120
|
-
const
|
|
121
|
-
const featureFilePath = path.join(
|
|
123
|
+
async checkFeatureConsistency(featureId, projectId) {
|
|
124
|
+
const featurePath = path.join(this.specsPath, projectId, featureId);
|
|
125
|
+
const featureFilePath = path.join(featurePath, 'FEATURE.md');
|
|
122
126
|
// Check if FEATURE.md exists
|
|
123
127
|
if (!existsSync(featureFilePath)) {
|
|
124
128
|
return {
|
|
125
129
|
featureId,
|
|
126
|
-
type: '
|
|
127
|
-
description:
|
|
130
|
+
type: 'missing_feature_md',
|
|
131
|
+
description: `${projectId}/${featureId}/ exists but has no FEATURE.md`,
|
|
128
132
|
autoRepairable: false,
|
|
129
|
-
|
|
133
|
+
featurePath,
|
|
134
|
+
projectId
|
|
130
135
|
};
|
|
131
136
|
}
|
|
132
137
|
// Parse FEATURE.md to find linked increment
|
|
@@ -134,41 +139,19 @@ export class FeatureConsistencyValidator {
|
|
|
134
139
|
const incrementExists = linkedIncrement
|
|
135
140
|
? this.checkIncrementExists(linkedIncrement)
|
|
136
141
|
: false;
|
|
137
|
-
// Check if feature
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if (existsSync(projectFeaturePath)) {
|
|
142
|
-
foundInProjects.push(project);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
if (foundInProjects.length === 0) {
|
|
146
|
-
// Check if this is an orphaned feature (increment deleted, not external)
|
|
147
|
-
const isExternalFeature = await this.isExternalFeature(featureFilePath);
|
|
148
|
-
if (!incrementExists && !isExternalFeature && linkedIncrement) {
|
|
149
|
-
// ORPHANED: Increment was deleted, feature is not external - should be archived
|
|
150
|
-
// This prevents creating project folders for features whose increments no longer exist
|
|
151
|
-
return {
|
|
152
|
-
featureId,
|
|
153
|
-
type: 'orphaned_feature',
|
|
154
|
-
description: `Feature ${featureId} references deleted increment ${linkedIncrement} - should be archived`,
|
|
155
|
-
autoRepairable: true, // Can auto-repair via archiver
|
|
156
|
-
featuresPath,
|
|
157
|
-
linkedIncrementId: linkedIncrement,
|
|
158
|
-
incrementExists: false
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
// Normal case: increment exists OR external feature OR no linked increment
|
|
162
|
-
// Create missing project folder
|
|
142
|
+
// Check if this is an orphaned feature (increment deleted, not external)
|
|
143
|
+
const isExternalFeature = await this.isExternalFeature(featureFilePath);
|
|
144
|
+
if (!incrementExists && !isExternalFeature && linkedIncrement) {
|
|
145
|
+
// ORPHANED: Increment was deleted, feature is not external - should be archived
|
|
163
146
|
return {
|
|
164
147
|
featureId,
|
|
165
|
-
type: '
|
|
166
|
-
description: `Feature ${featureId}
|
|
167
|
-
autoRepairable: true, //
|
|
168
|
-
|
|
169
|
-
|
|
148
|
+
type: 'orphaned_feature',
|
|
149
|
+
description: `Feature ${featureId} references deleted increment ${linkedIncrement} - should be archived`,
|
|
150
|
+
autoRepairable: true, // Can auto-repair via archiver
|
|
151
|
+
featurePath,
|
|
152
|
+
projectId,
|
|
170
153
|
linkedIncrementId: linkedIncrement,
|
|
171
|
-
incrementExists
|
|
154
|
+
incrementExists: false
|
|
172
155
|
};
|
|
173
156
|
}
|
|
174
157
|
// Feature is consistent
|
|
@@ -249,6 +232,7 @@ export class FeatureConsistencyValidator {
|
|
|
249
232
|
}
|
|
250
233
|
/**
|
|
251
234
|
* Attempt to repair a discrepancy
|
|
235
|
+
* v5.0.0: Only orphaned_feature repairs supported (archiving)
|
|
252
236
|
*/
|
|
253
237
|
async repairDiscrepancy(discrepancy) {
|
|
254
238
|
const result = {
|
|
@@ -258,10 +242,6 @@ export class FeatureConsistencyValidator {
|
|
|
258
242
|
};
|
|
259
243
|
try {
|
|
260
244
|
switch (discrepancy.type) {
|
|
261
|
-
case 'missing_project_folder':
|
|
262
|
-
result.action = await this.repairMissingProjectFolder(discrepancy);
|
|
263
|
-
result.success = true;
|
|
264
|
-
break;
|
|
265
245
|
case 'orphaned_feature':
|
|
266
246
|
// Auto-archive orphaned features (increment was deleted)
|
|
267
247
|
if (discrepancy.autoRepairable) {
|
|
@@ -269,11 +249,15 @@ export class FeatureConsistencyValidator {
|
|
|
269
249
|
result.success = true;
|
|
270
250
|
}
|
|
271
251
|
else {
|
|
272
|
-
|
|
273
|
-
result.action = 'Skipped - requires manual intervention (no FEATURE.md)';
|
|
252
|
+
result.action = 'Skipped - requires manual intervention';
|
|
274
253
|
result.success = false;
|
|
275
254
|
}
|
|
276
255
|
break;
|
|
256
|
+
case 'missing_feature_md':
|
|
257
|
+
// Cannot auto-repair missing FEATURE.md
|
|
258
|
+
result.action = 'Cannot auto-repair - FEATURE.md must be created manually or via /specweave:sync-specs';
|
|
259
|
+
result.success = false;
|
|
260
|
+
break;
|
|
277
261
|
default:
|
|
278
262
|
result.action = 'Unknown discrepancy type';
|
|
279
263
|
result.success = false;
|
|
@@ -287,7 +271,7 @@ export class FeatureConsistencyValidator {
|
|
|
287
271
|
}
|
|
288
272
|
/**
|
|
289
273
|
* Archive an orphaned feature (increment was deleted)
|
|
290
|
-
* Delegates to FeatureArchiver for consistent archiving behavior
|
|
274
|
+
* v5.0.0: Delegates to FeatureArchiver for consistent archiving behavior
|
|
291
275
|
*/
|
|
292
276
|
async archiveOrphanedFeature(discrepancy) {
|
|
293
277
|
// Dynamic import to avoid circular dependency
|
|
@@ -302,7 +286,7 @@ export class FeatureConsistencyValidator {
|
|
|
302
286
|
customReason: `Increment ${discrepancy.linkedIncrementId || 'unknown'} was deleted`
|
|
303
287
|
});
|
|
304
288
|
if (archiveResult.archivedFeatures.includes(discrepancy.featureId)) {
|
|
305
|
-
this.logger.log(` ✅ Archived ${discrepancy.featureId} to _archive/`);
|
|
289
|
+
this.logger.log(` ✅ Archived ${discrepancy.featureId} to ${discrepancy.projectId}/_archive/`);
|
|
306
290
|
return `Archived orphaned feature ${discrepancy.featureId} (increment ${discrepancy.linkedIncrementId} deleted)`;
|
|
307
291
|
}
|
|
308
292
|
else if (archiveResult.errors.length > 0) {
|
|
@@ -313,73 +297,6 @@ export class FeatureConsistencyValidator {
|
|
|
313
297
|
return `Feature ${discrepancy.featureId} already archived or cleaned up`;
|
|
314
298
|
}
|
|
315
299
|
}
|
|
316
|
-
/**
|
|
317
|
-
* Create missing project folder for a feature
|
|
318
|
-
*/
|
|
319
|
-
async repairMissingProjectFolder(discrepancy) {
|
|
320
|
-
const projectPath = discrepancy.projectPath;
|
|
321
|
-
const featuresPath = discrepancy.featuresPath;
|
|
322
|
-
// Create project folder
|
|
323
|
-
await fs.mkdir(projectPath, { recursive: true });
|
|
324
|
-
// Extract info from FEATURE.md to create README.md
|
|
325
|
-
const featureFilePath = path.join(featuresPath, 'FEATURE.md');
|
|
326
|
-
const featureContent = await fs.readFile(featureFilePath, 'utf-8');
|
|
327
|
-
// Extract title from FEATURE.md
|
|
328
|
-
let title = discrepancy.featureId;
|
|
329
|
-
const titleMatch = featureContent.match(/^#\s+(.+)$/m);
|
|
330
|
-
if (titleMatch) {
|
|
331
|
-
title = titleMatch[1];
|
|
332
|
-
}
|
|
333
|
-
// Extract frontmatter
|
|
334
|
-
let status = 'in-progress';
|
|
335
|
-
const frontmatterMatch = featureContent.match(/^---\n([\s\S]*?)\n---/);
|
|
336
|
-
if (frontmatterMatch) {
|
|
337
|
-
try {
|
|
338
|
-
const frontmatter = yaml.parse(frontmatterMatch[1]);
|
|
339
|
-
status = frontmatter.status || status;
|
|
340
|
-
}
|
|
341
|
-
catch {
|
|
342
|
-
// Ignore YAML parse errors
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
// Create README.md in project folder
|
|
346
|
-
const readmeContent = `---
|
|
347
|
-
id: ${discrepancy.featureId}-${this.defaultProject}
|
|
348
|
-
title: "${title} - ${this.defaultProject.charAt(0).toUpperCase() + this.defaultProject.slice(1)} Implementation"
|
|
349
|
-
feature: ${discrepancy.featureId}
|
|
350
|
-
project: ${this.defaultProject}
|
|
351
|
-
type: feature-context
|
|
352
|
-
status: ${status}
|
|
353
|
-
auto_repaired: true
|
|
354
|
-
repaired_at: ${new Date().toISOString()}
|
|
355
|
-
---
|
|
356
|
-
|
|
357
|
-
# ${title}
|
|
358
|
-
|
|
359
|
-
**Feature**: [${discrepancy.featureId}](../../_features/${discrepancy.featureId}/FEATURE.md)
|
|
360
|
-
|
|
361
|
-
## Overview
|
|
362
|
-
|
|
363
|
-
This project context was auto-created by consistency validator.
|
|
364
|
-
|
|
365
|
-
## User Stories
|
|
366
|
-
|
|
367
|
-
See user story files in this directory.
|
|
368
|
-
|
|
369
|
-
## Note
|
|
370
|
-
|
|
371
|
-
This folder was auto-created because _features/${discrepancy.featureId}/ existed
|
|
372
|
-
but ${this.defaultProject}/${discrepancy.featureId}/ was missing.
|
|
373
|
-
|
|
374
|
-
${discrepancy.linkedIncrementId
|
|
375
|
-
? `**Linked Increment**: ${discrepancy.linkedIncrementId} (${discrepancy.incrementExists ? 'exists' : 'not found'})`
|
|
376
|
-
: '**Linked Increment**: Not found in FEATURE.md'}
|
|
377
|
-
`;
|
|
378
|
-
const readmePath = path.join(projectPath, 'README.md');
|
|
379
|
-
await fs.writeFile(readmePath, readmeContent, 'utf-8');
|
|
380
|
-
this.logger.log(` ✅ Created ${this.defaultProject}/${discrepancy.featureId}/README.md`);
|
|
381
|
-
return `Created ${projectPath}/README.md`;
|
|
382
|
-
}
|
|
383
300
|
/**
|
|
384
301
|
* Log validation summary
|
|
385
302
|
*/
|
|
@@ -433,12 +350,13 @@ ${discrepancy.linkedIncrementId
|
|
|
433
350
|
return result.discrepancies.length > 0;
|
|
434
351
|
}
|
|
435
352
|
/**
|
|
436
|
-
* Get list of orphaned features (features
|
|
353
|
+
* Get list of orphaned features (features with deleted increments)
|
|
354
|
+
* v5.0.0: Now checks features in project folders, not _features
|
|
437
355
|
*/
|
|
438
356
|
async getOrphanedFeatures() {
|
|
439
357
|
const result = await this.validate(false);
|
|
440
358
|
return result.discrepancies
|
|
441
|
-
.filter(d => d.type === '
|
|
359
|
+
.filter(d => d.type === 'orphaned_feature')
|
|
442
360
|
.map(d => d.featureId);
|
|
443
361
|
}
|
|
444
362
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-consistency-validator.js","sourceRoot":"","sources":["../../../../src/core/living-docs/feature-consistency-validator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"feature-consistency-validator.js","sourceRoot":"","sources":["../../../../src/core/living-docs/feature-consistency-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
* Feature ID Manager - Manages FS-XXX ID assignment based on creation date
|
|
3
3
|
* Ensures no duplicate IDs and maintains consistent ordering
|
|
4
4
|
*
|
|
5
|
+
* v5.0.0: Unified Project Structure - Features now live in {project}/FS-XXX/
|
|
6
|
+
* No more separate _features folder.
|
|
7
|
+
*
|
|
5
8
|
* NEW (v0.23.0 - T-043): Uses FSIDAllocator for advanced chronological allocation
|
|
6
9
|
*/
|
|
7
10
|
export interface FeatureInfo {
|
|
@@ -30,7 +33,8 @@ export declare class FeatureIDManager {
|
|
|
30
33
|
*/
|
|
31
34
|
private scanIncrements;
|
|
32
35
|
/**
|
|
33
|
-
* Scan existing
|
|
36
|
+
* Scan existing features from project folders
|
|
37
|
+
* v5.0.0: Features now live in {project}/FS-XXX/ (not _features/)
|
|
34
38
|
*/
|
|
35
39
|
private scanExistingFeatures;
|
|
36
40
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-id-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/feature-id-manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"feature-id-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/feature-id-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,IAAI,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAS;gBAElB,WAAW,EAAE,MAAM;IAS/B;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB3C;;OAEG;YACW,cAAc;IAoF5B;;;OAGG;YACW,oBAAoB;IAuDlC;;OAEG;IACH,OAAO,CAAC,aAAa;IA4BrB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;OAEG;IACI,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAwBhD;;OAEG;IACI,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAK9C;;OAEG;IACI,cAAc,IAAI,WAAW,EAAE;IAItC;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;IACU,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB1C;;OAEG;IACU,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC1C;;;;;;;OAOG;IACU,yBAAyB,CACpC,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EACxG,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;CAkBnB"}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
* Feature ID Manager - Manages FS-XXX ID assignment based on creation date
|
|
3
3
|
* Ensures no duplicate IDs and maintains consistent ordering
|
|
4
4
|
*
|
|
5
|
+
* v5.0.0: Unified Project Structure - Features now live in {project}/FS-XXX/
|
|
6
|
+
* No more separate _features folder.
|
|
7
|
+
*
|
|
5
8
|
* NEW (v0.23.0 - T-043): Uses FSIDAllocator for advanced chronological allocation
|
|
6
9
|
*/
|
|
7
10
|
import * as fs from '../../utils/fs-native.js';
|
|
@@ -110,35 +113,52 @@ export class FeatureIDManager {
|
|
|
110
113
|
return features;
|
|
111
114
|
}
|
|
112
115
|
/**
|
|
113
|
-
* Scan existing
|
|
116
|
+
* Scan existing features from project folders
|
|
117
|
+
* v5.0.0: Features now live in {project}/FS-XXX/ (not _features/)
|
|
114
118
|
*/
|
|
115
119
|
async scanExistingFeatures() {
|
|
116
120
|
const features = [];
|
|
117
|
-
|
|
118
|
-
if (!await fs.pathExists(featuresDir)) {
|
|
121
|
+
if (!await fs.pathExists(this.specsBaseDir)) {
|
|
119
122
|
return features;
|
|
120
123
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if (!
|
|
124
|
+
// Scan all project folders
|
|
125
|
+
const projectEntries = await fs.readdir(this.specsBaseDir, { withFileTypes: true });
|
|
126
|
+
for (const projectEntry of projectEntries) {
|
|
127
|
+
if (!projectEntry.isDirectory())
|
|
125
128
|
continue;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
129
|
+
const projectId = projectEntry.name;
|
|
130
|
+
// Skip special folders
|
|
131
|
+
if (projectId.startsWith('_'))
|
|
132
|
+
continue;
|
|
133
|
+
const projectPath = path.join(this.specsBaseDir, projectId);
|
|
134
|
+
// Scan for FS-* folders in this project
|
|
135
|
+
const entries = await fs.readdir(projectPath, { withFileTypes: true });
|
|
136
|
+
for (const entry of entries) {
|
|
137
|
+
if (!entry.isDirectory())
|
|
138
|
+
continue;
|
|
139
|
+
if (!entry.name.match(/^FS-\d+/))
|
|
140
|
+
continue;
|
|
141
|
+
const featureFolder = entry.name;
|
|
142
|
+
const featurePath = path.join(projectPath, featureFolder, 'FEATURE.md');
|
|
143
|
+
if (!await fs.pathExists(featurePath))
|
|
144
|
+
continue;
|
|
145
|
+
try {
|
|
146
|
+
const content = await fs.readFile(featurePath, 'utf-8');
|
|
147
|
+
const frontmatter = this.extractFrontmatter(content);
|
|
148
|
+
const created = frontmatter.created
|
|
149
|
+
? new Date(frontmatter.created)
|
|
150
|
+
: new Date();
|
|
151
|
+
features.push({
|
|
152
|
+
originalId: featureFolder,
|
|
153
|
+
assignedId: '', // Will be assigned later
|
|
154
|
+
title: frontmatter.title || featureFolder,
|
|
155
|
+
created,
|
|
156
|
+
projects: frontmatter.projects || [projectId]
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
console.warn(` ⚠️ Error processing feature ${projectId}/${featureFolder}: ${error}`);
|
|
161
|
+
}
|
|
142
162
|
}
|
|
143
163
|
}
|
|
144
164
|
return features;
|