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.
- package/bin/fix-marketplace-errors.sh +55 -7
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.js +3 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +11 -2
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/living-docs.js +4 -4
- package/dist/src/cli/commands/living-docs.js.map +1 -1
- package/dist/src/cli/helpers/init/brownfield-analysis.js +15 -15
- package/dist/src/cli/helpers/init/brownfield-analysis.js.map +1 -1
- package/dist/src/cli/helpers/init/living-docs-preflight.js +7 -7
- package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -1
- package/dist/src/cli/helpers/init/plugin-installer.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/plugin-installer.js +61 -9
- package/dist/src/cli/helpers/init/plugin-installer.js.map +1 -1
- package/dist/src/core/background/types.d.ts +3 -0
- package/dist/src/core/background/types.d.ts.map +1 -1
- package/dist/src/core/living-docs/delivery/delivery-generator.d.ts +58 -0
- package/dist/src/core/living-docs/delivery/delivery-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/delivery/delivery-generator.js +501 -0
- package/dist/src/core/living-docs/delivery/delivery-generator.js.map +1 -0
- package/dist/src/core/living-docs/delivery/index.d.ts +8 -0
- package/dist/src/core/living-docs/delivery/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/delivery/index.js +7 -0
- package/dist/src/core/living-docs/delivery/index.js.map +1 -0
- package/dist/src/core/living-docs/diagrams/index.d.ts +8 -0
- package/dist/src/core/living-docs/diagrams/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/diagrams/index.js +7 -0
- package/dist/src/core/living-docs/diagrams/index.js.map +1 -0
- package/dist/src/core/living-docs/diagrams/mermaid-generator.d.ts +103 -0
- package/dist/src/core/living-docs/diagrams/mermaid-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/diagrams/mermaid-generator.js +515 -0
- package/dist/src/core/living-docs/diagrams/mermaid-generator.js.map +1 -0
- package/dist/src/core/living-docs/enterprise/enterprise-generator.d.ts +85 -0
- package/dist/src/core/living-docs/enterprise/enterprise-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/enterprise/enterprise-generator.js +556 -0
- package/dist/src/core/living-docs/enterprise/enterprise-generator.js.map +1 -0
- package/dist/src/core/living-docs/enterprise/history-analyzer.d.ts +91 -0
- package/dist/src/core/living-docs/enterprise/history-analyzer.d.ts.map +1 -0
- package/dist/src/core/living-docs/enterprise/history-analyzer.js +321 -0
- package/dist/src/core/living-docs/enterprise/history-analyzer.js.map +1 -0
- package/dist/src/core/living-docs/enterprise/index.d.ts +18 -0
- package/dist/src/core/living-docs/enterprise/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/enterprise/index.js +14 -0
- package/dist/src/core/living-docs/enterprise/index.js.map +1 -0
- package/dist/src/core/living-docs/enterprise/relationship-mapper.d.ts +58 -0
- package/dist/src/core/living-docs/enterprise/relationship-mapper.d.ts.map +1 -0
- package/dist/src/core/living-docs/enterprise/relationship-mapper.js +227 -0
- package/dist/src/core/living-docs/enterprise/relationship-mapper.js.map +1 -0
- package/dist/src/core/living-docs/enterprise/spec-loader.d.ts +161 -0
- package/dist/src/core/living-docs/enterprise/spec-loader.d.ts.map +1 -0
- package/dist/src/core/living-docs/enterprise/spec-loader.js +470 -0
- package/dist/src/core/living-docs/enterprise/spec-loader.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.d.ts +31 -1
- package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.d.ts.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.js +626 -14
- package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.js.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/index.d.ts +8 -0
- package/dist/src/core/living-docs/intelligent-analyzer/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/index.js +87 -4
- package/dist/src/core/living-docs/intelligent-analyzer/index.js.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts +3 -1
- package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts.map +1 -1
- package/dist/src/core/living-docs/operations/index.d.ts +8 -0
- package/dist/src/core/living-docs/operations/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/operations/index.js +7 -0
- package/dist/src/core/living-docs/operations/index.js.map +1 -0
- package/dist/src/core/living-docs/operations/ops-generator.d.ts +53 -0
- package/dist/src/core/living-docs/operations/ops-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/operations/ops-generator.js +462 -0
- package/dist/src/core/living-docs/operations/ops-generator.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/commands/living-docs.md +168 -39
- package/plugins/specweave-github/lib/github-feature-sync.js +1 -1
- 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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"}
|