specweave 0.34.4 → 0.34.6

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 (76) hide show
  1. package/bin/fix-marketplace-errors.sh +55 -7
  2. package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -1
  3. package/dist/plugins/specweave-github/lib/github-feature-sync.js +3 -1
  4. package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -1
  5. package/dist/src/cli/commands/init.d.ts.map +1 -1
  6. package/dist/src/cli/commands/init.js +11 -2
  7. package/dist/src/cli/commands/init.js.map +1 -1
  8. package/dist/src/cli/commands/living-docs.js +4 -4
  9. package/dist/src/cli/commands/living-docs.js.map +1 -1
  10. package/dist/src/cli/helpers/init/brownfield-analysis.js +15 -15
  11. package/dist/src/cli/helpers/init/brownfield-analysis.js.map +1 -1
  12. package/dist/src/cli/helpers/init/living-docs-preflight.js +7 -7
  13. package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -1
  14. package/dist/src/cli/helpers/init/plugin-installer.d.ts.map +1 -1
  15. package/dist/src/cli/helpers/init/plugin-installer.js +61 -9
  16. package/dist/src/cli/helpers/init/plugin-installer.js.map +1 -1
  17. package/dist/src/core/background/types.d.ts +3 -0
  18. package/dist/src/core/background/types.d.ts.map +1 -1
  19. package/dist/src/core/living-docs/delivery/delivery-generator.d.ts +58 -0
  20. package/dist/src/core/living-docs/delivery/delivery-generator.d.ts.map +1 -0
  21. package/dist/src/core/living-docs/delivery/delivery-generator.js +501 -0
  22. package/dist/src/core/living-docs/delivery/delivery-generator.js.map +1 -0
  23. package/dist/src/core/living-docs/delivery/index.d.ts +8 -0
  24. package/dist/src/core/living-docs/delivery/index.d.ts.map +1 -0
  25. package/dist/src/core/living-docs/delivery/index.js +7 -0
  26. package/dist/src/core/living-docs/delivery/index.js.map +1 -0
  27. package/dist/src/core/living-docs/diagrams/index.d.ts +8 -0
  28. package/dist/src/core/living-docs/diagrams/index.d.ts.map +1 -0
  29. package/dist/src/core/living-docs/diagrams/index.js +7 -0
  30. package/dist/src/core/living-docs/diagrams/index.js.map +1 -0
  31. package/dist/src/core/living-docs/diagrams/mermaid-generator.d.ts +103 -0
  32. package/dist/src/core/living-docs/diagrams/mermaid-generator.d.ts.map +1 -0
  33. package/dist/src/core/living-docs/diagrams/mermaid-generator.js +515 -0
  34. package/dist/src/core/living-docs/diagrams/mermaid-generator.js.map +1 -0
  35. package/dist/src/core/living-docs/enterprise/enterprise-generator.d.ts +85 -0
  36. package/dist/src/core/living-docs/enterprise/enterprise-generator.d.ts.map +1 -0
  37. package/dist/src/core/living-docs/enterprise/enterprise-generator.js +556 -0
  38. package/dist/src/core/living-docs/enterprise/enterprise-generator.js.map +1 -0
  39. package/dist/src/core/living-docs/enterprise/history-analyzer.d.ts +91 -0
  40. package/dist/src/core/living-docs/enterprise/history-analyzer.d.ts.map +1 -0
  41. package/dist/src/core/living-docs/enterprise/history-analyzer.js +321 -0
  42. package/dist/src/core/living-docs/enterprise/history-analyzer.js.map +1 -0
  43. package/dist/src/core/living-docs/enterprise/index.d.ts +18 -0
  44. package/dist/src/core/living-docs/enterprise/index.d.ts.map +1 -0
  45. package/dist/src/core/living-docs/enterprise/index.js +14 -0
  46. package/dist/src/core/living-docs/enterprise/index.js.map +1 -0
  47. package/dist/src/core/living-docs/enterprise/relationship-mapper.d.ts +58 -0
  48. package/dist/src/core/living-docs/enterprise/relationship-mapper.d.ts.map +1 -0
  49. package/dist/src/core/living-docs/enterprise/relationship-mapper.js +227 -0
  50. package/dist/src/core/living-docs/enterprise/relationship-mapper.js.map +1 -0
  51. package/dist/src/core/living-docs/enterprise/spec-loader.d.ts +161 -0
  52. package/dist/src/core/living-docs/enterprise/spec-loader.d.ts.map +1 -0
  53. package/dist/src/core/living-docs/enterprise/spec-loader.js +470 -0
  54. package/dist/src/core/living-docs/enterprise/spec-loader.js.map +1 -0
  55. package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.d.ts +31 -1
  56. package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.d.ts.map +1 -1
  57. package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.js +626 -14
  58. package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.js.map +1 -1
  59. package/dist/src/core/living-docs/intelligent-analyzer/index.d.ts +8 -0
  60. package/dist/src/core/living-docs/intelligent-analyzer/index.d.ts.map +1 -1
  61. package/dist/src/core/living-docs/intelligent-analyzer/index.js +87 -4
  62. package/dist/src/core/living-docs/intelligent-analyzer/index.js.map +1 -1
  63. package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts +3 -1
  64. package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts.map +1 -1
  65. package/dist/src/core/living-docs/operations/index.d.ts +8 -0
  66. package/dist/src/core/living-docs/operations/index.d.ts.map +1 -0
  67. package/dist/src/core/living-docs/operations/index.js +7 -0
  68. package/dist/src/core/living-docs/operations/index.js.map +1 -0
  69. package/dist/src/core/living-docs/operations/ops-generator.d.ts +53 -0
  70. package/dist/src/core/living-docs/operations/ops-generator.d.ts.map +1 -0
  71. package/dist/src/core/living-docs/operations/ops-generator.js +462 -0
  72. package/dist/src/core/living-docs/operations/ops-generator.js.map +1 -0
  73. package/package.json +1 -1
  74. package/plugins/specweave/commands/living-docs.md +168 -39
  75. package/plugins/specweave-github/lib/github-feature-sync.js +1 -1
  76. package/plugins/specweave-github/lib/github-feature-sync.ts +3 -1
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Relationship Mapper
3
+ *
4
+ * Maps relationships between all entities:
5
+ * - Features → Code files
6
+ * - Teams → Features
7
+ * - Modules → Modules (dependencies)
8
+ * - Increments → Features
9
+ * - External refs → Internal entities
10
+ */
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import { glob } from 'glob';
14
+ import { consoleLogger } from '../../../utils/logger.js';
15
+ /**
16
+ * Maps relationships between all entities in the system
17
+ */
18
+ export class RelationshipMapper {
19
+ constructor(options) {
20
+ this.projectPath = options.projectPath;
21
+ this.logger = options.logger ?? consoleLogger;
22
+ this.repoAnalyses = options.repoAnalyses;
23
+ }
24
+ /**
25
+ * Build complete relationship map
26
+ */
27
+ async map(catalog, orgResult) {
28
+ const featureToCode = new Map();
29
+ const featureToTeam = new Map();
30
+ const teamToFeatures = new Map();
31
+ const moduleDependencies = new Map();
32
+ const incrementToFeature = new Map();
33
+ const externalToFeature = new Map();
34
+ // 1. Map features to code
35
+ this.logger.debug('Mapping features to code...');
36
+ for (const feature of catalog.features) {
37
+ const files = await this.findCodeForFeature(feature);
38
+ featureToCode.set(feature.featureId, files);
39
+ }
40
+ // 2. Map features to teams (from org result or heuristics)
41
+ this.logger.debug('Mapping features to teams...');
42
+ if (orgResult?.enhancedTeams) {
43
+ for (const team of orgResult.enhancedTeams) {
44
+ // Initialize team in map
45
+ if (!teamToFeatures.has(team.name)) {
46
+ teamToFeatures.set(team.name, []);
47
+ }
48
+ // Match features to teams by:
49
+ // 1. Project match
50
+ // 2. Module match (if team owns modules that feature touches)
51
+ for (const feature of catalog.features) {
52
+ const featureFiles = featureToCode.get(feature.featureId) ?? [];
53
+ // Check if any team modules are in feature files
54
+ const teamModules = team.repos;
55
+ const hasOverlap = teamModules.some(mod => featureFiles.some(file => file.includes(mod)));
56
+ // Check project match
57
+ const projectMatch = feature.project && team.project === feature.project;
58
+ if (hasOverlap || projectMatch) {
59
+ featureToTeam.set(feature.featureId, team.name);
60
+ teamToFeatures.get(team.name).push(feature.featureId);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ // 3. Map module dependencies
66
+ this.logger.debug('Mapping module dependencies...');
67
+ if (this.repoAnalyses) {
68
+ for (const [modName, analysis] of this.repoAnalyses) {
69
+ const deps = this.extractModuleDependencies(modName, analysis);
70
+ moduleDependencies.set(modName, deps);
71
+ }
72
+ }
73
+ // 4. Map increments to features
74
+ this.logger.debug('Mapping increments to features...');
75
+ for (const feature of catalog.features) {
76
+ for (const incId of feature.relatedIncrements) {
77
+ incrementToFeature.set(incId, feature.featureId);
78
+ }
79
+ }
80
+ // 5. Map external refs to features
81
+ this.logger.debug('Mapping external references...');
82
+ for (const feature of catalog.features) {
83
+ for (const ref of feature.externalRefs) {
84
+ const key = `${ref.provider}:${ref.id}`;
85
+ externalToFeature.set(key, feature.featureId);
86
+ }
87
+ }
88
+ // Calculate total relationships
89
+ let totalRelationships = 0;
90
+ totalRelationships += Array.from(featureToCode.values()).reduce((sum, arr) => sum + arr.length, 0);
91
+ totalRelationships += featureToTeam.size;
92
+ totalRelationships += Array.from(moduleDependencies.values()).reduce((sum, arr) => sum + arr.length, 0);
93
+ totalRelationships += incrementToFeature.size;
94
+ totalRelationships += externalToFeature.size;
95
+ return {
96
+ featureToCode,
97
+ featureToTeam,
98
+ teamToFeatures,
99
+ moduleDependencies,
100
+ incrementToFeature,
101
+ externalToFeature,
102
+ totalRelationships,
103
+ };
104
+ }
105
+ /**
106
+ * Find code files related to a feature
107
+ */
108
+ async findCodeForFeature(feature) {
109
+ const relatedFiles = [];
110
+ // Strategy 1: Search for feature ID in code
111
+ const featureIdPattern = feature.featureId.replace('-', '[-_]?');
112
+ const srcPath = path.join(this.projectPath, 'src');
113
+ if (fs.existsSync(srcPath)) {
114
+ try {
115
+ // Search for feature ID mentions in code
116
+ const files = await glob('**/*.{ts,js,tsx,jsx}', {
117
+ cwd: srcPath,
118
+ nodir: true,
119
+ ignore: ['**/node_modules/**', '**/dist/**'],
120
+ });
121
+ for (const file of files.slice(0, 1000)) { // Limit search
122
+ const content = fs.readFileSync(path.join(srcPath, file), 'utf-8');
123
+ if (content.includes(feature.featureId) ||
124
+ content.match(new RegExp(featureIdPattern, 'i'))) {
125
+ relatedFiles.push(`src/${file}`);
126
+ }
127
+ }
128
+ }
129
+ catch (err) {
130
+ this.logger.debug(`Code search failed: ${err.message}`);
131
+ }
132
+ }
133
+ // Strategy 2: Search for key concepts from user stories
134
+ for (const us of feature.userStories) {
135
+ // Extract key terms from title
136
+ const keyTerms = this.extractKeyTerms(us.title);
137
+ for (const term of keyTerms) {
138
+ // Search for term in file names
139
+ const matchingFiles = await this.findFilesByTerm(term);
140
+ relatedFiles.push(...matchingFiles);
141
+ }
142
+ }
143
+ // Deduplicate and limit
144
+ return [...new Set(relatedFiles)].slice(0, 50);
145
+ }
146
+ /**
147
+ * Extract key terms from a title for code matching
148
+ */
149
+ extractKeyTerms(title) {
150
+ // Remove common words and extract meaningful terms
151
+ const stopWords = new Set([
152
+ 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
153
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
154
+ 'should', 'may', 'might', 'must', 'shall', 'can', 'need', 'dare',
155
+ 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'as',
156
+ 'into', 'through', 'during', 'before', 'after', 'above', 'below',
157
+ 'between', 'under', 'again', 'further', 'then', 'once', 'here',
158
+ 'there', 'when', 'where', 'why', 'how', 'all', 'each', 'every',
159
+ 'both', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'not',
160
+ 'only', 'own', 'same', 'so', 'than', 'too', 'very', 'just', 'and',
161
+ 'but', 'if', 'or', 'because', 'until', 'while', 'although', 'user',
162
+ 'users', 'system', 'feature', 'implement', 'add', 'create', 'update',
163
+ ]);
164
+ return title
165
+ .toLowerCase()
166
+ .replace(/[^\w\s]/g, ' ')
167
+ .split(/\s+/)
168
+ .filter(word => word.length > 3 && !stopWords.has(word))
169
+ .slice(0, 5);
170
+ }
171
+ /**
172
+ * Find files matching a term
173
+ */
174
+ async findFilesByTerm(term) {
175
+ const srcPath = path.join(this.projectPath, 'src');
176
+ if (!fs.existsSync(srcPath))
177
+ return [];
178
+ try {
179
+ // Search for term in file names
180
+ const pattern = `**/*${term}*/*.{ts,js}`;
181
+ const files = await glob(pattern, {
182
+ cwd: srcPath,
183
+ nodir: true,
184
+ nocase: true,
185
+ ignore: ['**/node_modules/**', '**/dist/**'],
186
+ });
187
+ return files.slice(0, 10).map(f => `src/${f}`);
188
+ }
189
+ catch {
190
+ return [];
191
+ }
192
+ }
193
+ /**
194
+ * Extract module dependencies from repo analysis
195
+ */
196
+ extractModuleDependencies(modName, analysis) {
197
+ const deps = [];
198
+ // Extract from external dependencies
199
+ for (const dep of analysis.externalDependencies) {
200
+ // Check if it's an internal module reference
201
+ if (this.repoAnalyses?.has(dep)) {
202
+ deps.push(dep);
203
+ }
204
+ }
205
+ // Extract from observations (may mention other modules)
206
+ for (const obs of analysis.observations) {
207
+ const moduleMentions = obs.match(/(?:uses|depends on|imports from)\s+(\w+)/gi);
208
+ if (moduleMentions) {
209
+ for (const mention of moduleMentions) {
210
+ const modMatch = mention.match(/(\w+)$/);
211
+ if (modMatch && this.repoAnalyses?.has(modMatch[1])) {
212
+ deps.push(modMatch[1]);
213
+ }
214
+ }
215
+ }
216
+ }
217
+ // Try to infer from patterns
218
+ if (analysis.patternsUsed.some(p => p.pattern.includes('API') || p.pattern.includes('client'))) {
219
+ // API-related modules likely depend on core
220
+ if (this.repoAnalyses?.has('core') && modName !== 'core') {
221
+ deps.push('core');
222
+ }
223
+ }
224
+ return [...new Set(deps)];
225
+ }
226
+ }
227
+ //# sourceMappingURL=relationship-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationship-mapper.js","sourceRoot":"","sources":["../../../../../src/core/living-docs/enterprise/relationship-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Enhanced Spec Loader
3
+ *
4
+ * Loads ALL specifications from living docs with full details:
5
+ * - Feature hierarchies (FS-XXX -> US-XXX)
6
+ * - User story details with acceptance criteria
7
+ * - Status and completion information
8
+ * - External tool references (GitHub/JIRA/ADO)
9
+ * - Related increments
10
+ */
11
+ import { Logger } from '../../../utils/logger.js';
12
+ /**
13
+ * User story detail with full acceptance criteria
14
+ */
15
+ export interface UserStoryDetail {
16
+ id: string;
17
+ title: string;
18
+ description: string;
19
+ acceptanceCriteria: AcceptanceCriterion[];
20
+ priority: 'P0' | 'P1' | 'P2' | 'P3' | null;
21
+ status: 'draft' | 'ready' | 'in_progress' | 'completed';
22
+ project?: string;
23
+ board?: string;
24
+ externalRef?: ExternalReference;
25
+ filePath: string;
26
+ }
27
+ export interface AcceptanceCriterion {
28
+ id: string;
29
+ description: string;
30
+ completed: boolean;
31
+ }
32
+ export interface ExternalReference {
33
+ provider: 'github' | 'jira' | 'ado';
34
+ id: string;
35
+ url?: string;
36
+ status?: string;
37
+ }
38
+ /**
39
+ * Enhanced feature spec with full hierarchy
40
+ */
41
+ export interface EnhancedFeatureSpec {
42
+ featureId: string;
43
+ featureName: string;
44
+ description: string;
45
+ userStories: UserStoryDetail[];
46
+ status: 'active' | 'completed' | 'archived';
47
+ createdAt: string;
48
+ completedAt?: string;
49
+ externalRefs: ExternalReference[];
50
+ relatedIncrements: string[];
51
+ project?: string;
52
+ board?: string;
53
+ folderPath: string;
54
+ totalACs: number;
55
+ completedACs: number;
56
+ completionPercentage: number;
57
+ }
58
+ /**
59
+ * Full specs catalog with aggregated metrics
60
+ */
61
+ export interface SpecsCatalog {
62
+ features: EnhancedFeatureSpec[];
63
+ totalFeatures: number;
64
+ activeFeatures: number;
65
+ completedFeatures: number;
66
+ archivedFeatures: number;
67
+ totalUserStories: number;
68
+ totalACs: number;
69
+ completedACs: number;
70
+ overallCompletion: number;
71
+ byProject: Map<string, EnhancedFeatureSpec[]>;
72
+ byStatus: Map<string, EnhancedFeatureSpec[]>;
73
+ loadedAt: string;
74
+ }
75
+ export interface SpecLoaderOptions {
76
+ projectPath: string;
77
+ logger?: Logger;
78
+ includeArchived?: boolean;
79
+ }
80
+ /**
81
+ * Enhanced spec loader that extracts full details from all specs
82
+ */
83
+ export declare class EnhancedSpecLoader {
84
+ private projectPath;
85
+ private logger;
86
+ private includeArchived;
87
+ constructor(options: SpecLoaderOptions);
88
+ /**
89
+ * Load all specifications with full details
90
+ */
91
+ loadAllSpecs(): Promise<SpecsCatalog>;
92
+ /**
93
+ * Load a single feature with all its user stories
94
+ */
95
+ private loadFeature;
96
+ /**
97
+ * Load all user stories in a feature folder
98
+ */
99
+ private loadUserStories;
100
+ /**
101
+ * Load a single user story with acceptance criteria
102
+ */
103
+ private loadUserStory;
104
+ /**
105
+ * Extract acceptance criteria from user story content
106
+ */
107
+ private extractAcceptanceCriteria;
108
+ /**
109
+ * Extract priority from content or title
110
+ */
111
+ private extractPriority;
112
+ /**
113
+ * Determine user story status from content
114
+ */
115
+ private determineUserStoryStatus;
116
+ /**
117
+ * Extract external reference (GitHub/JIRA/ADO)
118
+ */
119
+ private extractExternalRef;
120
+ /**
121
+ * Find increments related to a feature
122
+ */
123
+ private findRelatedIncrements;
124
+ /**
125
+ * Extract frontmatter from markdown
126
+ */
127
+ private extractFrontmatter;
128
+ /**
129
+ * Extract title from markdown (first H1)
130
+ */
131
+ private extractTitle;
132
+ /**
133
+ * Extract description (first paragraph after title)
134
+ */
135
+ private extractDescription;
136
+ /**
137
+ * Extract user story description ("As a... I want... So that...")
138
+ */
139
+ private extractUserStoryDescription;
140
+ /**
141
+ * Extract a specific field like **Project**: value
142
+ */
143
+ private extractField;
144
+ /**
145
+ * Get file creation date
146
+ */
147
+ private getFileCreatedDate;
148
+ /**
149
+ * Get file modification date
150
+ */
151
+ private getFileModifiedDate;
152
+ /**
153
+ * Build the full catalog from loaded features
154
+ */
155
+ private buildCatalog;
156
+ /**
157
+ * Create empty catalog
158
+ */
159
+ private createEmptyCatalog;
160
+ }
161
+ //# sourceMappingURL=spec-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-loader.d.ts","sourceRoot":"","sources":["../../../../../src/core/living-docs/enterprise/spec-loader.ts"],"names":[],"mappings":"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"}