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.
Files changed (86) hide show
  1. package/dist/src/cli/commands/archive.d.ts +0 -1
  2. package/dist/src/cli/commands/archive.d.ts.map +1 -1
  3. package/dist/src/cli/commands/archive.js +1 -4
  4. package/dist/src/cli/commands/archive.js.map +1 -1
  5. package/dist/src/cli/commands/import-external.d.ts.map +1 -1
  6. package/dist/src/cli/commands/import-external.js +128 -16
  7. package/dist/src/cli/commands/import-external.js.map +1 -1
  8. package/dist/src/cli/commands/init.js +5 -5
  9. package/dist/src/cli/commands/init.js.map +1 -1
  10. package/dist/src/cli/helpers/init/external-import.d.ts +3 -1
  11. package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
  12. package/dist/src/cli/helpers/init/external-import.js +407 -19
  13. package/dist/src/cli/helpers/init/external-import.js.map +1 -1
  14. package/dist/src/cli/helpers/init/next-steps.d.ts.map +1 -1
  15. package/dist/src/cli/helpers/init/next-steps.js +77 -5
  16. package/dist/src/cli/helpers/init/next-steps.js.map +1 -1
  17. package/dist/src/cli/helpers/init/smart-reinit.d.ts +2 -0
  18. package/dist/src/cli/helpers/init/smart-reinit.d.ts.map +1 -1
  19. package/dist/src/cli/helpers/init/smart-reinit.js +371 -36
  20. package/dist/src/cli/helpers/init/smart-reinit.js.map +1 -1
  21. package/dist/src/cli/helpers/init/testing-config.d.ts +5 -2
  22. package/dist/src/cli/helpers/init/testing-config.d.ts.map +1 -1
  23. package/dist/src/cli/helpers/init/testing-config.js +322 -31
  24. package/dist/src/cli/helpers/init/testing-config.js.map +1 -1
  25. package/dist/src/core/feature-deleter/validator.d.ts +1 -0
  26. package/dist/src/core/feature-deleter/validator.d.ts.map +1 -1
  27. package/dist/src/core/feature-deleter/validator.js +8 -10
  28. package/dist/src/core/feature-deleter/validator.js.map +1 -1
  29. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
  30. package/dist/src/core/increment/increment-archiver.js +12 -5
  31. package/dist/src/core/increment/increment-archiver.js.map +1 -1
  32. package/dist/src/core/living-docs/feature-archiver.d.ts +25 -3
  33. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
  34. package/dist/src/core/living-docs/feature-archiver.js +131 -129
  35. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  36. package/dist/src/core/living-docs/feature-consistency-validator.d.ts +23 -22
  37. package/dist/src/core/living-docs/feature-consistency-validator.d.ts.map +1 -1
  38. package/dist/src/core/living-docs/feature-consistency-validator.js +68 -150
  39. package/dist/src/core/living-docs/feature-consistency-validator.js.map +1 -1
  40. package/dist/src/core/living-docs/feature-id-manager.d.ts +5 -1
  41. package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
  42. package/dist/src/core/living-docs/feature-id-manager.js +43 -23
  43. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
  44. package/dist/src/core/living-docs/hierarchy-mapper.d.ts +21 -12
  45. package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
  46. package/dist/src/core/living-docs/hierarchy-mapper.js +89 -70
  47. package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
  48. package/dist/src/core/living-docs/living-docs-sync.d.ts +10 -11
  49. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  50. package/dist/src/core/living-docs/living-docs-sync.js +24 -56
  51. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  52. package/dist/src/core/repo-structure/repo-bulk-discovery.d.ts +1 -1
  53. package/dist/src/core/repo-structure/repo-bulk-discovery.d.ts.map +1 -1
  54. package/dist/src/core/repo-structure/repo-bulk-discovery.js +168 -126
  55. package/dist/src/core/repo-structure/repo-bulk-discovery.js.map +1 -1
  56. package/dist/src/core/spec-detector.js +2 -2
  57. package/dist/src/core/spec-detector.js.map +1 -1
  58. package/dist/src/importers/duplicate-detector.d.ts +6 -0
  59. package/dist/src/importers/duplicate-detector.d.ts.map +1 -1
  60. package/dist/src/importers/duplicate-detector.js +8 -2
  61. package/dist/src/importers/duplicate-detector.js.map +1 -1
  62. package/dist/src/importers/external-importer.d.ts +6 -0
  63. package/dist/src/importers/external-importer.d.ts.map +1 -1
  64. package/dist/src/importers/import-coordinator.d.ts +38 -2
  65. package/dist/src/importers/import-coordinator.d.ts.map +1 -1
  66. package/dist/src/importers/import-coordinator.js +142 -5
  67. package/dist/src/importers/import-coordinator.js.map +1 -1
  68. package/dist/src/importers/item-converter.d.ts +39 -1
  69. package/dist/src/importers/item-converter.d.ts.map +1 -1
  70. package/dist/src/importers/item-converter.js +202 -24
  71. package/dist/src/importers/item-converter.js.map +1 -1
  72. package/dist/src/living-docs/fs-id-allocator.d.ts +9 -2
  73. package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
  74. package/dist/src/living-docs/fs-id-allocator.js +24 -10
  75. package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
  76. package/dist/src/sync/sync-metadata.d.ts.map +1 -1
  77. package/dist/src/sync/sync-metadata.js +31 -2
  78. package/dist/src/sync/sync-metadata.js.map +1 -1
  79. package/dist/src/utils/project-detection.d.ts +13 -10
  80. package/dist/src/utils/project-detection.d.ts.map +1 -1
  81. package/dist/src/utils/project-detection.js +26 -11
  82. package/dist/src/utils/project-detection.js.map +1 -1
  83. package/package.json +1 -1
  84. package/plugins/specweave/agents/AGENTS-INDEX.md +0 -9
  85. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +12 -0
  86. 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 and repairs consistency between:
5
- * - .specweave/docs/internal/specs/_features/FS-XXX/
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
- * Living docs sync creates _features/ and {project}/ folders sequentially.
10
- * If sync fails midway or increment is deleted, folders can get out of sync.
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 discrepancies (orphaned _features without project folders)
14
- * 2. Auto-repair by creating missing project folders
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: 'missing_project_folder' | 'missing_features_folder' | 'orphaned_feature';
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 _features folder (if exists) */
30
- featuresPath?: string;
31
- /** Path to project folder (if exists) */
32
- projectPath?: string;
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 consistency between _features and project folders
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 _features directory
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 getFeatureFolders;
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 consistent folders across _features and projects
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 in _features without corresponding project folder)
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,wBAAwB,GAAG,yBAAyB,GAAG,kBAAkB,CAAC;IAChF,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,cAAc,EAAE,OAAO,CAAC;IACxB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,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;;;;;OAKG;IACG,QAAQ,CAAC,UAAU,GAAE,OAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqDtE;;OAEG;YACW,iBAAiB;IAmB/B;;OAEG;YACW,iBAAiB;IAoB/B;;OAEG;YACW,uBAAuB;IAqErC;;;OAGG;YACW,iBAAiB;IAiC/B;;OAEG;YACW,sBAAsB;IA6BpC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;YACW,iBAAiB;IAsC/B;;;OAGG;YACW,sBAAsB;IA0BpC;;OAEG;YACW,0BAA0B;IAwExC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+C5B;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1C;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAM/C"}
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 and repairs consistency between:
5
- * - .specweave/docs/internal/specs/_features/FS-XXX/
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
- * Living docs sync creates _features/ and {project}/ folders sequentially.
10
- * If sync fails midway or increment is deleted, folders can get out of sync.
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 discrepancies (orphaned _features without project folders)
14
- * 2. Auto-repair by creating missing project folders
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 consistency between _features and project folders
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 features from _features folder
47
- const featuresDir = path.join(this.specsPath, '_features');
48
- if (!existsSync(featuresDir)) {
49
- this.logger.log(' ℹ️ No _features folder found, nothing to validate');
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
- const featureFolders = await this.getFeatureFolders(featuresDir);
53
- result.totalFeatures = featureFolders.length;
54
- // Step 2: Get all project folders
55
- const projectFolders = await this.getProjectFolders();
56
- // Step 3: Check each feature for consistency
57
- for (const featureId of featureFolders) {
58
- const discrepancy = await this.checkFeatureConsistency(featureId, projectFolders);
59
- if (discrepancy) {
60
- result.discrepancies.push(discrepancy);
61
- // Attempt auto-repair if enabled
62
- if (autoRepair && discrepancy.autoRepairable) {
63
- const repairResult = await this.repairDiscrepancy(discrepancy);
64
- result.repairs.push(repairResult);
65
- if (repairResult.success) {
66
- result.consistentCount++; // Count as consistent after repair
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
- else {
71
- result.consistentCount++;
71
+ else {
72
+ result.consistentCount++;
73
+ }
72
74
  }
73
75
  }
74
- // Step 4: Log summary
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 _features directory
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 getFeatureFolders(featuresDir) {
82
- const entries = await fs.readdir(featuresDir, { withFileTypes: true });
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 consistent folders across _features and projects
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, projectFolders) {
120
- const featuresPath = path.join(this.specsPath, '_features', featureId);
121
- const featureFilePath = path.join(featuresPath, 'FEATURE.md');
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: 'orphaned_feature',
127
- description: `_features/${featureId}/ exists but has no FEATURE.md`,
130
+ type: 'missing_feature_md',
131
+ description: `${projectId}/${featureId}/ exists but has no FEATURE.md`,
128
132
  autoRepairable: false,
129
- featuresPath
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 exists in any project folder
138
- let foundInProjects = [];
139
- for (const project of projectFolders) {
140
- const projectFeaturePath = path.join(this.specsPath, project, featureId);
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: 'missing_project_folder',
166
- description: `Feature ${featureId} exists in _features/ but not in any project folder`,
167
- autoRepairable: true, // We can create the missing folder
168
- featuresPath,
169
- projectPath: path.join(this.specsPath, this.defaultProject, featureId),
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
- // No FEATURE.md or other issue - needs manual intervention
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 in _features without corresponding project folder)
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 === 'missing_project_folder')
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 _features folder
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;;;;;GAKG;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;;OAEG;YACW,oBAAoB;IAsClC;;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"}
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 _features folder
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
- const featuresDir = path.join(this.specsBaseDir, '_features');
118
- if (!await fs.pathExists(featuresDir)) {
121
+ if (!await fs.pathExists(this.specsBaseDir)) {
119
122
  return features;
120
123
  }
121
- const folders = await fs.readdir(featuresDir);
122
- for (const folder of folders) {
123
- const featurePath = path.join(featuresDir, folder, 'FEATURE.md');
124
- if (!await fs.pathExists(featurePath))
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
- try {
127
- const content = await fs.readFile(featurePath, 'utf-8');
128
- const frontmatter = this.extractFrontmatter(content);
129
- const created = frontmatter.created
130
- ? new Date(frontmatter.created)
131
- : new Date();
132
- features.push({
133
- originalId: folder,
134
- assignedId: '', // Will be assigned later
135
- title: frontmatter.title || folder,
136
- created,
137
- projects: frontmatter.projects || ['default']
138
- });
139
- }
140
- catch (error) {
141
- console.warn(` ⚠️ Error processing feature ${folder}: ${error}`);
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;