specweave 0.17.7 → 0.17.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +365 -9
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts +9 -4
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +82 -12
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts +2 -2
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +69 -10
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/src/cli/commands/detect-project.d.ts +9 -0
- package/dist/src/cli/commands/detect-project.d.ts.map +1 -0
- package/dist/src/cli/commands/detect-project.js +85 -0
- package/dist/src/cli/commands/detect-project.js.map +1 -0
- package/dist/src/cli/commands/detect-specs.d.ts +9 -0
- package/dist/src/cli/commands/detect-specs.d.ts.map +1 -0
- package/dist/src/cli/commands/detect-specs.js +73 -0
- package/dist/src/cli/commands/detect-specs.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +8 -15
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/core/living-docs/content-classifier.d.ts +83 -0
- package/dist/src/core/living-docs/content-classifier.d.ts.map +1 -0
- package/dist/src/core/living-docs/content-classifier.js +393 -0
- package/dist/src/core/living-docs/content-classifier.js.map +1 -0
- package/dist/src/core/living-docs/content-distributor.d.ts +126 -0
- package/dist/src/core/living-docs/content-distributor.d.ts.map +1 -0
- package/dist/src/core/living-docs/content-distributor.js +339 -0
- package/dist/src/core/living-docs/content-distributor.js.map +1 -0
- package/dist/src/core/living-docs/content-parser.d.ts +140 -0
- package/dist/src/core/living-docs/content-parser.d.ts.map +1 -0
- package/dist/src/core/living-docs/content-parser.js +316 -0
- package/dist/src/core/living-docs/content-parser.js.map +1 -0
- package/dist/src/core/living-docs/cross-linker.d.ts +126 -0
- package/dist/src/core/living-docs/cross-linker.d.ts.map +1 -0
- package/dist/src/core/living-docs/cross-linker.js +374 -0
- package/dist/src/core/living-docs/cross-linker.js.map +1 -0
- package/dist/src/core/living-docs/index.d.ts +89 -0
- package/dist/src/core/living-docs/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/index.js +169 -0
- package/dist/src/core/living-docs/index.js.map +1 -0
- package/dist/src/core/living-docs/project-detector.d.ts +103 -0
- package/dist/src/core/living-docs/project-detector.d.ts.map +1 -0
- package/dist/src/core/living-docs/project-detector.js +314 -0
- package/dist/src/core/living-docs/project-detector.js.map +1 -0
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts +1 -1
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/prompt-consolidator.js +51 -22
- package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts +2 -0
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +126 -62
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/spec-content-sync.d.ts +6 -0
- package/dist/src/core/spec-content-sync.d.ts.map +1 -1
- package/dist/src/core/spec-content-sync.js +25 -7
- package/dist/src/core/spec-content-sync.js.map +1 -1
- package/dist/src/core/spec-detector.d.ts +54 -0
- package/dist/src/core/spec-detector.d.ts.map +1 -0
- package/dist/src/core/spec-detector.js +197 -0
- package/dist/src/core/spec-detector.js.map +1 -0
- package/dist/src/core/spec-identifier-detector.d.ts +49 -0
- package/dist/src/core/spec-identifier-detector.d.ts.map +1 -0
- package/dist/src/core/spec-identifier-detector.js +198 -0
- package/dist/src/core/spec-identifier-detector.js.map +1 -0
- package/dist/src/core/types/spec-identifier.d.ts +67 -0
- package/dist/src/core/types/spec-identifier.d.ts.map +1 -0
- package/dist/src/core/types/spec-identifier.js +23 -0
- package/dist/src/core/types/spec-identifier.js.map +1 -0
- package/dist/src/utils/docs-preview/config-generator.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/config-generator.js +11 -0
- package/dist/src/utils/docs-preview/config-generator.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +61 -5
- package/plugins/specweave/lib/hooks/sync-living-docs.ts +102 -13
- package/plugins/specweave-ado/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-docs-preview/commands/preview.md +11 -11
- package/plugins/specweave-github/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-github/hooks/post-task-completion.sh +59 -30
- package/plugins/specweave-github/lib/github-spec-content-sync.js +55 -6
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +84 -12
- package/plugins/specweave-jira/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-mobile/.claude-plugin/plugin.json +1 -4
- package/plugins/specweave-release/.claude-plugin/plugin.json +3 -15
- package/src/templates/AGENTS.md.template +297 -0
- package/plugins/specweave/plugin.json +0 -22
- package/plugins/specweave-ado/plugin.json +0 -20
- package/plugins/specweave-github/plugin.json +0 -19
- package/plugins/specweave-jira/plugin.json +0 -20
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Linker for Intelligent Living Docs Sync
|
|
3
|
+
*
|
|
4
|
+
* Generates cross-references between related documents for traceability.
|
|
5
|
+
*
|
|
6
|
+
* @module living-docs/cross-linker
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { ContentCategory } from './content-classifier.js';
|
|
11
|
+
/**
|
|
12
|
+
* Link types
|
|
13
|
+
*/
|
|
14
|
+
export var LinkType;
|
|
15
|
+
(function (LinkType) {
|
|
16
|
+
LinkType["Implements"] = "implements";
|
|
17
|
+
LinkType["DependsOn"] = "depends-on";
|
|
18
|
+
LinkType["References"] = "references";
|
|
19
|
+
LinkType["RelatedTo"] = "related-to";
|
|
20
|
+
LinkType["DefinedIn"] = "defined-in";
|
|
21
|
+
LinkType["TestsFor"] = "tests-for";
|
|
22
|
+
})(LinkType || (LinkType = {}));
|
|
23
|
+
/**
|
|
24
|
+
* Cross-Linker class
|
|
25
|
+
*/
|
|
26
|
+
export class CrossLinker {
|
|
27
|
+
constructor(options = {}) {
|
|
28
|
+
this.options = {
|
|
29
|
+
basePath: options.basePath || path.join(process.cwd(), '.specweave', 'docs', 'internal'),
|
|
30
|
+
generateBacklinks: options.generateBacklinks ?? true,
|
|
31
|
+
updateExisting: options.updateExisting ?? true,
|
|
32
|
+
dryRun: options.dryRun ?? false,
|
|
33
|
+
};
|
|
34
|
+
this.links = [];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Generate cross-links for distributed files
|
|
38
|
+
*/
|
|
39
|
+
async generateLinks(result) {
|
|
40
|
+
this.links = [];
|
|
41
|
+
// Group files by category
|
|
42
|
+
const byCategory = this.groupByCategory(result);
|
|
43
|
+
// Generate links between categories
|
|
44
|
+
await this.generateArchitectureLinks(byCategory);
|
|
45
|
+
await this.generateOperationsLinks(byCategory);
|
|
46
|
+
await this.generateDeliveryLinks(byCategory);
|
|
47
|
+
await this.generateStrategyLinks(byCategory);
|
|
48
|
+
// Generate backlinks if enabled
|
|
49
|
+
if (this.options.generateBacklinks) {
|
|
50
|
+
await this.generateBacklinks();
|
|
51
|
+
}
|
|
52
|
+
// Update documents with links
|
|
53
|
+
if (this.options.updateExisting && !this.options.dryRun) {
|
|
54
|
+
await this.updateDocuments();
|
|
55
|
+
}
|
|
56
|
+
return this.links;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Group files by category
|
|
60
|
+
*/
|
|
61
|
+
groupByCategory(result) {
|
|
62
|
+
const groups = new Map();
|
|
63
|
+
const allFiles = [...result.created, ...result.updated];
|
|
64
|
+
for (const file of allFiles) {
|
|
65
|
+
if (!groups.has(file.category)) {
|
|
66
|
+
groups.set(file.category, []);
|
|
67
|
+
}
|
|
68
|
+
groups.get(file.category).push(file);
|
|
69
|
+
}
|
|
70
|
+
return groups;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Generate links from specs to architecture
|
|
74
|
+
*/
|
|
75
|
+
async generateArchitectureLinks(groups) {
|
|
76
|
+
const specs = groups.get(ContentCategory.UserStory) || [];
|
|
77
|
+
const architecture = groups.get(ContentCategory.Architecture) || [];
|
|
78
|
+
const adrs = groups.get(ContentCategory.ADR) || [];
|
|
79
|
+
// Link specs to architecture docs
|
|
80
|
+
for (const spec of specs) {
|
|
81
|
+
for (const arch of architecture) {
|
|
82
|
+
if (await this.documentsRelated(spec.path, arch.path)) {
|
|
83
|
+
this.links.push({
|
|
84
|
+
source: spec.path,
|
|
85
|
+
target: arch.path,
|
|
86
|
+
type: LinkType.Implements,
|
|
87
|
+
description: 'User story implements architecture design',
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Link specs to ADRs
|
|
92
|
+
for (const adr of adrs) {
|
|
93
|
+
if (await this.documentsRelated(spec.path, adr.path)) {
|
|
94
|
+
this.links.push({
|
|
95
|
+
source: spec.path,
|
|
96
|
+
target: adr.path,
|
|
97
|
+
type: LinkType.References,
|
|
98
|
+
description: 'User story references architecture decision',
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Generate links from operations to architecture
|
|
106
|
+
*/
|
|
107
|
+
async generateOperationsLinks(groups) {
|
|
108
|
+
const operations = groups.get(ContentCategory.Operations) || [];
|
|
109
|
+
const architecture = groups.get(ContentCategory.Architecture) || [];
|
|
110
|
+
for (const ops of operations) {
|
|
111
|
+
for (const arch of architecture) {
|
|
112
|
+
if (await this.documentsRelated(ops.path, arch.path)) {
|
|
113
|
+
this.links.push({
|
|
114
|
+
source: ops.path,
|
|
115
|
+
target: arch.path,
|
|
116
|
+
type: LinkType.DependsOn,
|
|
117
|
+
description: 'Operational procedure depends on architecture',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Generate links from delivery to specs
|
|
125
|
+
*/
|
|
126
|
+
async generateDeliveryLinks(groups) {
|
|
127
|
+
const delivery = groups.get(ContentCategory.Delivery) || [];
|
|
128
|
+
const specs = groups.get(ContentCategory.UserStory) || [];
|
|
129
|
+
for (const del of delivery) {
|
|
130
|
+
for (const spec of specs) {
|
|
131
|
+
if (await this.documentsRelated(del.path, spec.path)) {
|
|
132
|
+
this.links.push({
|
|
133
|
+
source: del.path,
|
|
134
|
+
target: spec.path,
|
|
135
|
+
type: LinkType.TestsFor,
|
|
136
|
+
description: 'Test strategy covers user story',
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Generate links from strategy to specs
|
|
144
|
+
*/
|
|
145
|
+
async generateStrategyLinks(groups) {
|
|
146
|
+
const strategy = groups.get(ContentCategory.Strategy) || [];
|
|
147
|
+
const specs = groups.get(ContentCategory.UserStory) || [];
|
|
148
|
+
for (const strat of strategy) {
|
|
149
|
+
for (const spec of specs) {
|
|
150
|
+
if (await this.documentsRelated(strat.path, spec.path)) {
|
|
151
|
+
this.links.push({
|
|
152
|
+
source: strat.path,
|
|
153
|
+
target: spec.path,
|
|
154
|
+
type: LinkType.DefinedIn,
|
|
155
|
+
description: 'Business requirement defined in strategy',
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Check if two documents are related (heuristic)
|
|
163
|
+
*/
|
|
164
|
+
async documentsRelated(path1, path2) {
|
|
165
|
+
try {
|
|
166
|
+
// Extract key terms from filenames
|
|
167
|
+
const name1 = path.basename(path1, '.md').toLowerCase();
|
|
168
|
+
const name2 = path.basename(path2, '.md').toLowerCase();
|
|
169
|
+
// Simple heuristic: if they share significant words
|
|
170
|
+
const words1 = name1.split(/[-_]/).filter((w) => w.length > 3);
|
|
171
|
+
const words2 = name2.split(/[-_]/).filter((w) => w.length > 3);
|
|
172
|
+
const sharedWords = words1.filter((w) => words2.includes(w));
|
|
173
|
+
// If 2+ shared words, consider related
|
|
174
|
+
if (sharedWords.length >= 2) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
// Check content for cross-references (more expensive)
|
|
178
|
+
if (fs.existsSync(path1) && fs.existsSync(path2)) {
|
|
179
|
+
const content1 = await fs.readFile(path1, 'utf-8');
|
|
180
|
+
const content2 = await fs.readFile(path2, 'utf-8');
|
|
181
|
+
// Check if path1 mentions path2's filename
|
|
182
|
+
const name2Clean = path.basename(path2, '.md');
|
|
183
|
+
if (content1.toLowerCase().includes(name2Clean.toLowerCase())) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
// Check if path2 mentions path1's filename
|
|
187
|
+
const name1Clean = path.basename(path1, '.md');
|
|
188
|
+
if (content2.toLowerCase().includes(name1Clean.toLowerCase())) {
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Generate backlinks (bidirectional)
|
|
200
|
+
*/
|
|
201
|
+
async generateBacklinks() {
|
|
202
|
+
const backlinks = [];
|
|
203
|
+
for (const link of this.links) {
|
|
204
|
+
// Create reverse link
|
|
205
|
+
backlinks.push({
|
|
206
|
+
source: link.target,
|
|
207
|
+
target: link.source,
|
|
208
|
+
type: this.getReverseType(link.type),
|
|
209
|
+
description: this.getReverseDescription(link),
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
this.links.push(...backlinks);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get reverse link type
|
|
216
|
+
*/
|
|
217
|
+
getReverseType(type) {
|
|
218
|
+
const reverseMap = {
|
|
219
|
+
[LinkType.Implements]: LinkType.DefinedIn,
|
|
220
|
+
[LinkType.DependsOn]: LinkType.DefinedIn,
|
|
221
|
+
[LinkType.References]: LinkType.References,
|
|
222
|
+
[LinkType.RelatedTo]: LinkType.RelatedTo,
|
|
223
|
+
[LinkType.DefinedIn]: LinkType.Implements,
|
|
224
|
+
[LinkType.TestsFor]: LinkType.DefinedIn,
|
|
225
|
+
};
|
|
226
|
+
return reverseMap[type] || LinkType.RelatedTo;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get reverse description
|
|
230
|
+
*/
|
|
231
|
+
getReverseDescription(link) {
|
|
232
|
+
const name = path.basename(link.source, '.md').replace(/-/g, ' ');
|
|
233
|
+
return `Referenced by ${name}`;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Update documents with generated links
|
|
237
|
+
*/
|
|
238
|
+
async updateDocuments() {
|
|
239
|
+
// Group links by source file
|
|
240
|
+
const linksBySource = new Map();
|
|
241
|
+
for (const link of this.links) {
|
|
242
|
+
if (!linksBySource.has(link.source)) {
|
|
243
|
+
linksBySource.set(link.source, []);
|
|
244
|
+
}
|
|
245
|
+
linksBySource.get(link.source).push(link);
|
|
246
|
+
}
|
|
247
|
+
// Update each source file
|
|
248
|
+
for (const [sourcePath, links] of linksBySource.entries()) {
|
|
249
|
+
await this.updateDocument(sourcePath, links);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Update a single document with links
|
|
254
|
+
*/
|
|
255
|
+
async updateDocument(filePath, links) {
|
|
256
|
+
if (!fs.existsSync(filePath)) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
try {
|
|
260
|
+
let content = await fs.readFile(filePath, 'utf-8');
|
|
261
|
+
// Check if links section already exists
|
|
262
|
+
const linksSection = '\n\n## Related Documents\n\n';
|
|
263
|
+
const hasLinksSection = content.includes('## Related Documents');
|
|
264
|
+
if (hasLinksSection) {
|
|
265
|
+
// Update existing section
|
|
266
|
+
const regex = /## Related Documents\n\n[\s\S]*?(?=\n## |\n---|\n\*\*Source\*\*|$)/;
|
|
267
|
+
content = content.replace(regex, linksSection + this.generateLinksMarkdown(links));
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
// Add new section before footer
|
|
271
|
+
const footerIndex = content.lastIndexOf('\n---\n');
|
|
272
|
+
if (footerIndex !== -1) {
|
|
273
|
+
const before = content.substring(0, footerIndex);
|
|
274
|
+
const after = content.substring(footerIndex);
|
|
275
|
+
content = before + linksSection + this.generateLinksMarkdown(links) + '\n' + after;
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
// No footer - append to end
|
|
279
|
+
content += linksSection + this.generateLinksMarkdown(links);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Write updated content
|
|
283
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
console.warn(`Failed to update links in ${filePath}:`, error);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Generate markdown for links section
|
|
291
|
+
*/
|
|
292
|
+
generateLinksMarkdown(links) {
|
|
293
|
+
let markdown = '';
|
|
294
|
+
// Group by type
|
|
295
|
+
const byType = new Map();
|
|
296
|
+
for (const link of links) {
|
|
297
|
+
if (!byType.has(link.type)) {
|
|
298
|
+
byType.set(link.type, []);
|
|
299
|
+
}
|
|
300
|
+
byType.get(link.type).push(link);
|
|
301
|
+
}
|
|
302
|
+
// Generate sections for each type
|
|
303
|
+
for (const [type, typeLinks] of byType.entries()) {
|
|
304
|
+
markdown += `### ${this.getLinkTypeTitle(type)}\n\n`;
|
|
305
|
+
for (const link of typeLinks) {
|
|
306
|
+
const relativePath = this.getRelativePath(link.source, link.target);
|
|
307
|
+
const title = path.basename(link.target, '.md').replace(/-/g, ' ');
|
|
308
|
+
markdown += `- [${title}](${relativePath})`;
|
|
309
|
+
if (link.description) {
|
|
310
|
+
markdown += ` - ${link.description}`;
|
|
311
|
+
}
|
|
312
|
+
markdown += '\n';
|
|
313
|
+
}
|
|
314
|
+
markdown += '\n';
|
|
315
|
+
}
|
|
316
|
+
return markdown;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get link type display title
|
|
320
|
+
*/
|
|
321
|
+
getLinkTypeTitle(type) {
|
|
322
|
+
const titles = {
|
|
323
|
+
[LinkType.Implements]: 'Implements',
|
|
324
|
+
[LinkType.DependsOn]: 'Depends On',
|
|
325
|
+
[LinkType.References]: 'References',
|
|
326
|
+
[LinkType.RelatedTo]: 'Related To',
|
|
327
|
+
[LinkType.DefinedIn]: 'Defined In',
|
|
328
|
+
[LinkType.TestsFor]: 'Tests For',
|
|
329
|
+
};
|
|
330
|
+
return titles[type] || type;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Get relative path from source to target
|
|
334
|
+
*/
|
|
335
|
+
getRelativePath(source, target) {
|
|
336
|
+
const sourceDir = path.dirname(source);
|
|
337
|
+
return path.relative(sourceDir, target);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Get all links
|
|
341
|
+
*/
|
|
342
|
+
getLinks() {
|
|
343
|
+
return this.links;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Get links for a specific file
|
|
347
|
+
*/
|
|
348
|
+
getLinksFor(filePath) {
|
|
349
|
+
return this.links.filter((link) => link.source === filePath);
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Get statistics
|
|
353
|
+
*/
|
|
354
|
+
getStatistics() {
|
|
355
|
+
const stats = {
|
|
356
|
+
total: this.links.length,
|
|
357
|
+
byType: {},
|
|
358
|
+
bidirectional: 0,
|
|
359
|
+
};
|
|
360
|
+
for (const link of this.links) {
|
|
361
|
+
stats.byType[link.type] = (stats.byType[link.type] || 0) + 1;
|
|
362
|
+
}
|
|
363
|
+
// Count bidirectional (simplified)
|
|
364
|
+
stats.bidirectional = this.links.filter((link) => this.links.some((l) => l.source === link.target && l.target === link.source)).length / 2;
|
|
365
|
+
return stats;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Factory function to create linker
|
|
370
|
+
*/
|
|
371
|
+
export function createCrossLinker(options) {
|
|
372
|
+
return new CrossLinker(options);
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=cross-linker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-linker.js","sourceRoot":"","sources":["../../../../src/core/living-docs/cross-linker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent Living Docs Sync - Main Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates all components for intelligent spec distribution.
|
|
5
|
+
*
|
|
6
|
+
* @module living-docs
|
|
7
|
+
*/
|
|
8
|
+
import { ContentParser, ParsedSpec, ParserOptions } from './content-parser.js';
|
|
9
|
+
import { ContentClassifier, ClassificationResult } from './content-classifier.js';
|
|
10
|
+
import { ProjectDetector, ProjectContext, DetectorOptions } from './project-detector.js';
|
|
11
|
+
import { ContentDistributor, DistributionResult, DistributorOptions } from './content-distributor.js';
|
|
12
|
+
import { CrossLinker, CrossLink, LinkerOptions } from './cross-linker.js';
|
|
13
|
+
/**
|
|
14
|
+
* Intelligent Sync options
|
|
15
|
+
*/
|
|
16
|
+
export interface IntelligentSyncOptions {
|
|
17
|
+
parser?: ParserOptions;
|
|
18
|
+
detector?: DetectorOptions;
|
|
19
|
+
distributor?: DistributorOptions;
|
|
20
|
+
linker?: LinkerOptions;
|
|
21
|
+
dryRun?: boolean;
|
|
22
|
+
verbose?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Complete sync result
|
|
26
|
+
*/
|
|
27
|
+
export interface IntelligentSyncResult {
|
|
28
|
+
incrementId: string;
|
|
29
|
+
project: ProjectContext;
|
|
30
|
+
spec: ParsedSpec;
|
|
31
|
+
classifications: ClassificationResult[];
|
|
32
|
+
distribution: DistributionResult;
|
|
33
|
+
links: CrossLink[];
|
|
34
|
+
duration: number;
|
|
35
|
+
success: boolean;
|
|
36
|
+
errors: string[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Intelligent Living Docs Sync Orchestrator
|
|
40
|
+
*/
|
|
41
|
+
export declare class IntelligentLivingDocsSync {
|
|
42
|
+
private parser;
|
|
43
|
+
private classifier;
|
|
44
|
+
private detector;
|
|
45
|
+
private distributor;
|
|
46
|
+
private linker;
|
|
47
|
+
private options;
|
|
48
|
+
constructor(options?: IntelligentSyncOptions);
|
|
49
|
+
/**
|
|
50
|
+
* Sync increment spec to living docs
|
|
51
|
+
*/
|
|
52
|
+
syncIncrement(incrementId: string): Promise<IntelligentSyncResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Load and parse increment spec
|
|
55
|
+
*/
|
|
56
|
+
private loadAndParseSpec;
|
|
57
|
+
/**
|
|
58
|
+
* Generate index files for categories
|
|
59
|
+
*/
|
|
60
|
+
private generateIndexFiles;
|
|
61
|
+
/**
|
|
62
|
+
* Logging helper
|
|
63
|
+
*/
|
|
64
|
+
private log;
|
|
65
|
+
/**
|
|
66
|
+
* Get component instances (for testing/advanced usage)
|
|
67
|
+
*/
|
|
68
|
+
getComponents(): {
|
|
69
|
+
parser: ContentParser;
|
|
70
|
+
classifier: ContentClassifier;
|
|
71
|
+
detector: ProjectDetector;
|
|
72
|
+
distributor: ContentDistributor;
|
|
73
|
+
linker: CrossLinker;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Factory function to create sync orchestrator
|
|
78
|
+
*/
|
|
79
|
+
export declare function createIntelligentSync(options?: IntelligentSyncOptions): IntelligentLivingDocsSync;
|
|
80
|
+
/**
|
|
81
|
+
* Convenience function to sync an increment
|
|
82
|
+
*/
|
|
83
|
+
export declare function syncIncrement(incrementId: string, options?: IntelligentSyncOptions): Promise<IntelligentSyncResult>;
|
|
84
|
+
export * from './content-parser.js';
|
|
85
|
+
export * from './content-classifier.js';
|
|
86
|
+
export * from './project-detector.js';
|
|
87
|
+
export * from './content-distributor.js';
|
|
88
|
+
export * from './cross-linker.js';
|
|
89
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,aAAa,EACb,UAAU,EAEV,aAAa,EACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAErB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,eAAe,EACf,cAAc,EAEd,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAElB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,WAAW,EACX,SAAS,EAET,aAAa,EACd,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,eAAe,EAAE,oBAAoB,EAAE,CAAC;IACxC,YAAY,EAAE,kBAAkB,CAAC;IACjC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAyB;gBAE5B,OAAO,GAAE,sBAA2B;IAWhD;;OAEG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAyFxE;;OAEG;YACW,gBAAgB;IAiB9B;;OAEG;YACW,kBAAkB;IAmBhC;;OAEG;IACH,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,aAAa;;;;;;;CASd;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,yBAAyB,CAE3B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CAGhC;AAGD,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent Living Docs Sync - Main Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates all components for intelligent spec distribution.
|
|
5
|
+
*
|
|
6
|
+
* @module living-docs
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { createContentParser, } from './content-parser.js';
|
|
11
|
+
import { createContentClassifier, } from './content-classifier.js';
|
|
12
|
+
import { createProjectDetector, } from './project-detector.js';
|
|
13
|
+
import { createContentDistributor, } from './content-distributor.js';
|
|
14
|
+
import { createCrossLinker, } from './cross-linker.js';
|
|
15
|
+
/**
|
|
16
|
+
* Intelligent Living Docs Sync Orchestrator
|
|
17
|
+
*/
|
|
18
|
+
export class IntelligentLivingDocsSync {
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
this.options = options;
|
|
21
|
+
// Initialize components
|
|
22
|
+
this.parser = createContentParser(options.parser);
|
|
23
|
+
this.classifier = createContentClassifier();
|
|
24
|
+
this.detector = createProjectDetector(options.detector);
|
|
25
|
+
this.distributor = createContentDistributor(options.distributor);
|
|
26
|
+
this.linker = createCrossLinker(options.linker);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Sync increment spec to living docs
|
|
30
|
+
*/
|
|
31
|
+
async syncIncrement(incrementId) {
|
|
32
|
+
const startTime = Date.now();
|
|
33
|
+
const errors = [];
|
|
34
|
+
try {
|
|
35
|
+
this.log(`🚀 Starting intelligent sync for increment: ${incrementId}`);
|
|
36
|
+
// 1. Load and parse spec
|
|
37
|
+
this.log('📖 Step 1: Parsing spec.md...');
|
|
38
|
+
const spec = await this.loadAndParseSpec(incrementId);
|
|
39
|
+
this.log(` ✅ Parsed ${spec.sections.length} top-level sections`);
|
|
40
|
+
// 2. Classify sections
|
|
41
|
+
this.log('🔍 Step 2: Classifying sections...');
|
|
42
|
+
const flatSections = this.parser.flattenSections(spec.sections);
|
|
43
|
+
const classifications = this.classifier.classifyAll(flatSections);
|
|
44
|
+
const stats = this.classifier.getStatistics(classifications);
|
|
45
|
+
this.log(` ✅ Classified ${classifications.length} sections`);
|
|
46
|
+
this.log(` Average confidence: ${(stats.averageConfidence * 100).toFixed(1)}%`);
|
|
47
|
+
this.log(` Low confidence (<60%): ${stats.lowConfidence}`);
|
|
48
|
+
// 3. Detect project
|
|
49
|
+
this.log('🎯 Step 3: Detecting project...');
|
|
50
|
+
const project = this.detector.detectProject(incrementId, spec);
|
|
51
|
+
this.log(` ✅ Project: ${project.name} (${(project.confidence * 100).toFixed(1)}% confidence)`);
|
|
52
|
+
if (project.reasoning.length > 0) {
|
|
53
|
+
this.log(` Reasoning: ${project.reasoning.join(', ')}`);
|
|
54
|
+
}
|
|
55
|
+
// 4. Ensure project structure exists
|
|
56
|
+
await this.detector.createProjectStructure(project.id);
|
|
57
|
+
// 5. Distribute content
|
|
58
|
+
this.log('📦 Step 4: Distributing content...');
|
|
59
|
+
const distribution = await this.distributor.distribute(incrementId, spec, classifications, project);
|
|
60
|
+
const distStats = this.distributor.getStatistics(distribution);
|
|
61
|
+
this.log(` ✅ Distribution complete:`);
|
|
62
|
+
this.log(` Created: ${distribution.summary.filesCreated} files`);
|
|
63
|
+
this.log(` Updated: ${distribution.summary.filesUpdated} files`);
|
|
64
|
+
this.log(` Skipped: ${distribution.summary.filesSkipped} files (unchanged)`);
|
|
65
|
+
this.log(` Errors: ${distribution.summary.errors}`);
|
|
66
|
+
this.log(` Total size: ${(distStats.totalSize / 1024).toFixed(1)} KB`);
|
|
67
|
+
if (distribution.errors.length > 0) {
|
|
68
|
+
errors.push(...distribution.errors.map((e) => e.error));
|
|
69
|
+
}
|
|
70
|
+
// 6. Generate cross-links
|
|
71
|
+
this.log('🔗 Step 5: Generating cross-links...');
|
|
72
|
+
const links = await this.linker.generateLinks(distribution);
|
|
73
|
+
const linkStats = this.linker.getStatistics();
|
|
74
|
+
this.log(` ✅ Generated ${links.length} cross-links`);
|
|
75
|
+
this.log(` Bidirectional: ${linkStats.bidirectional}`);
|
|
76
|
+
this.log(` By type: ${JSON.stringify(linkStats.byType)}`);
|
|
77
|
+
// 7. Generate index files
|
|
78
|
+
this.log('📑 Step 6: Generating index files...');
|
|
79
|
+
await this.generateIndexFiles(distribution, project.id);
|
|
80
|
+
this.log(` ✅ Index files generated`);
|
|
81
|
+
const duration = Date.now() - startTime;
|
|
82
|
+
this.log(`✅ Intelligent sync complete in ${duration}ms`);
|
|
83
|
+
return {
|
|
84
|
+
incrementId,
|
|
85
|
+
project,
|
|
86
|
+
spec,
|
|
87
|
+
classifications,
|
|
88
|
+
distribution,
|
|
89
|
+
links,
|
|
90
|
+
duration,
|
|
91
|
+
success: distribution.errors.length === 0,
|
|
92
|
+
errors,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
errors.push(String(error));
|
|
97
|
+
const duration = Date.now() - startTime;
|
|
98
|
+
this.log(`❌ Intelligent sync failed: ${error}`);
|
|
99
|
+
throw new Error(`Intelligent sync failed: ${error}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Load and parse increment spec
|
|
104
|
+
*/
|
|
105
|
+
async loadAndParseSpec(incrementId) {
|
|
106
|
+
const specPath = path.join(process.cwd(), '.specweave', 'increments', incrementId, 'spec.md');
|
|
107
|
+
if (!fs.existsSync(specPath)) {
|
|
108
|
+
throw new Error(`Spec not found: ${specPath}`);
|
|
109
|
+
}
|
|
110
|
+
const markdown = await fs.readFile(specPath, 'utf-8');
|
|
111
|
+
return this.parser.parse(markdown, specPath);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Generate index files for categories
|
|
115
|
+
*/
|
|
116
|
+
async generateIndexFiles(distribution, projectId) {
|
|
117
|
+
const allFiles = [...distribution.created, ...distribution.updated];
|
|
118
|
+
const byCategory = new Map();
|
|
119
|
+
for (const file of allFiles) {
|
|
120
|
+
if (!byCategory.has(file.category)) {
|
|
121
|
+
byCategory.set(file.category, []);
|
|
122
|
+
}
|
|
123
|
+
byCategory.get(file.category).push(file);
|
|
124
|
+
}
|
|
125
|
+
for (const [category, files] of byCategory.entries()) {
|
|
126
|
+
await this.distributor.generateIndex(category, projectId, files);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Logging helper
|
|
131
|
+
*/
|
|
132
|
+
log(message) {
|
|
133
|
+
if (this.options.verbose) {
|
|
134
|
+
console.log(message);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get component instances (for testing/advanced usage)
|
|
139
|
+
*/
|
|
140
|
+
getComponents() {
|
|
141
|
+
return {
|
|
142
|
+
parser: this.parser,
|
|
143
|
+
classifier: this.classifier,
|
|
144
|
+
detector: this.detector,
|
|
145
|
+
distributor: this.distributor,
|
|
146
|
+
linker: this.linker,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Factory function to create sync orchestrator
|
|
152
|
+
*/
|
|
153
|
+
export function createIntelligentSync(options) {
|
|
154
|
+
return new IntelligentLivingDocsSync(options);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Convenience function to sync an increment
|
|
158
|
+
*/
|
|
159
|
+
export async function syncIncrement(incrementId, options) {
|
|
160
|
+
const sync = createIntelligentSync(options);
|
|
161
|
+
return sync.syncIncrement(incrementId);
|
|
162
|
+
}
|
|
163
|
+
// Re-export all types and classes
|
|
164
|
+
export * from './content-parser.js';
|
|
165
|
+
export * from './content-classifier.js';
|
|
166
|
+
export * from './project-detector.js';
|
|
167
|
+
export * from './content-distributor.js';
|
|
168
|
+
export * from './cross-linker.js';
|
|
169
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/living-docs/index.ts"],"names":[],"mappings":"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"}
|