specweave 0.17.6 → 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 +2 -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/dist/locales/de/.gitkeep +0 -0
- package/dist/locales/de/cli.json +0 -108
- package/dist/locales/en/cli.json +0 -287
- package/dist/locales/en/errors.json +0 -7
- package/dist/locales/en/templates.json +0 -6
- package/dist/locales/es/.gitkeep +0 -0
- package/dist/locales/es/cli.json +0 -41
- package/dist/locales/fr/.gitkeep +0 -0
- package/dist/locales/fr/cli.json +0 -108
- package/dist/locales/ja/.gitkeep +0 -0
- package/dist/locales/ja/cli.json +0 -108
- package/dist/locales/ko/.gitkeep +0 -0
- package/dist/locales/ko/cli.json +0 -108
- package/dist/locales/pt/.gitkeep +0 -0
- package/dist/locales/pt/cli.json +0 -108
- package/dist/locales/ru/.gitkeep +0 -0
- package/dist/locales/ru/cli.json +0 -269
- package/dist/locales/zh/.gitkeep +0 -0
- package/dist/locales/zh/cli.json +0 -108
- 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,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Spec Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects ALL specs referenced in an increment, supporting:
|
|
5
|
+
* - Single-spec increments (backend OR frontend)
|
|
6
|
+
* - Multi-spec increments (backend AND frontend AND mobile)
|
|
7
|
+
* - Parent coordination specs (_parent project)
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'fs-extra';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import matter from 'gray-matter';
|
|
12
|
+
import { detectSpecIdentifier } from './spec-identifier-detector.js';
|
|
13
|
+
/**
|
|
14
|
+
* Detect all specs referenced in an increment
|
|
15
|
+
*/
|
|
16
|
+
export async function detectSpecsInIncrement(incrementPath, config = {}) {
|
|
17
|
+
const specs = [];
|
|
18
|
+
// 1. Check for specs in living docs folder
|
|
19
|
+
const specsFolder = path.join(process.cwd(), '.specweave/docs/internal/specs');
|
|
20
|
+
if (!fs.existsSync(specsFolder)) {
|
|
21
|
+
return {
|
|
22
|
+
specs: [],
|
|
23
|
+
isMultiSpec: false,
|
|
24
|
+
projects: []
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// 2. Scan all project folders
|
|
28
|
+
const projectFolders = fs.readdirSync(specsFolder);
|
|
29
|
+
for (const projectFolder of projectFolders) {
|
|
30
|
+
const projectPath = path.join(specsFolder, projectFolder);
|
|
31
|
+
// Skip if not a directory
|
|
32
|
+
if (!fs.statSync(projectPath).isDirectory()) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
// 3. Scan all spec files in this project
|
|
36
|
+
const specFiles = fs.readdirSync(projectPath).filter(f => f.endsWith('.md'));
|
|
37
|
+
for (const specFile of specFiles) {
|
|
38
|
+
const specPath = path.join(projectPath, specFile);
|
|
39
|
+
const specContent = fs.readFileSync(specPath, 'utf-8');
|
|
40
|
+
const { data: frontmatter, content } = matter(specContent);
|
|
41
|
+
// 4. Check if this spec references the current increment
|
|
42
|
+
const references = extractIncrementReferences(content, frontmatter);
|
|
43
|
+
if (references.includes(path.basename(incrementPath))) {
|
|
44
|
+
// 5. Detect identifier for this spec
|
|
45
|
+
const title = frontmatter.title || extractTitle(content);
|
|
46
|
+
const specContentObj = {
|
|
47
|
+
content: specContent,
|
|
48
|
+
frontmatter,
|
|
49
|
+
title,
|
|
50
|
+
project: projectFolder,
|
|
51
|
+
path: specPath
|
|
52
|
+
};
|
|
53
|
+
const identifier = detectSpecIdentifier(specContentObj, {
|
|
54
|
+
existingSpecs: specs.map(s => s.identifier.full),
|
|
55
|
+
preferTitleSlug: config.specs?.preferTitleSlug ?? true,
|
|
56
|
+
minSlugLength: config.specs?.minSlugLength ?? 5
|
|
57
|
+
});
|
|
58
|
+
// 6. Check if sync is enabled for this project
|
|
59
|
+
const projectConfig = config.specs?.projects?.[projectFolder];
|
|
60
|
+
const syncEnabled = projectConfig?.syncEnabled !== false;
|
|
61
|
+
specs.push({
|
|
62
|
+
identifier,
|
|
63
|
+
project: projectFolder,
|
|
64
|
+
path: specPath,
|
|
65
|
+
syncEnabled
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// 7. Determine if multi-spec
|
|
71
|
+
const isMultiSpec = specs.length > 1;
|
|
72
|
+
const projects = [...new Set(specs.map(s => s.project))];
|
|
73
|
+
// 8. Find primary spec (first non-parent spec)
|
|
74
|
+
const primary = specs.find(s => s.project !== '_parent') || specs[0];
|
|
75
|
+
return {
|
|
76
|
+
specs,
|
|
77
|
+
primary,
|
|
78
|
+
isMultiSpec,
|
|
79
|
+
projects
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Extract increment references from spec content
|
|
84
|
+
*/
|
|
85
|
+
function extractIncrementReferences(content, frontmatter) {
|
|
86
|
+
const references = [];
|
|
87
|
+
// Check frontmatter
|
|
88
|
+
if (frontmatter.increments && Array.isArray(frontmatter.increments)) {
|
|
89
|
+
references.push(...frontmatter.increments);
|
|
90
|
+
}
|
|
91
|
+
// Check content for increment links
|
|
92
|
+
const incrementPattern = /\[([^\]]+)\]\(\.\.\/\.\.\/increments\/([^)]+)\)/g;
|
|
93
|
+
let match;
|
|
94
|
+
while ((match = incrementPattern.exec(content)) !== null) {
|
|
95
|
+
references.push(match[2].split('/')[0]); // Extract increment ID
|
|
96
|
+
}
|
|
97
|
+
// Check for "Implemented in" sections
|
|
98
|
+
const implementedPattern = /Implemented in:?\s*`?([0-9]{4}-[a-z0-9-]+)`?/gi;
|
|
99
|
+
while ((match = implementedPattern.exec(content)) !== null) {
|
|
100
|
+
references.push(match[1]);
|
|
101
|
+
}
|
|
102
|
+
return [...new Set(references)]; // Deduplicate
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Extract title from markdown content (fallback)
|
|
106
|
+
*/
|
|
107
|
+
function extractTitle(content) {
|
|
108
|
+
const match = content.match(/^#\s+(.+)$/m);
|
|
109
|
+
return match ? match[1].trim() : 'Untitled';
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Detect project from increment name or description with confidence scoring
|
|
113
|
+
*/
|
|
114
|
+
export function detectProjectFromIncrementWithConfidence(incrementName, description = '', config = {}) {
|
|
115
|
+
const text = `${incrementName} ${description}`.toLowerCase();
|
|
116
|
+
const projectScores = new Map();
|
|
117
|
+
// Check for explicit project keywords
|
|
118
|
+
const projectConfigs = config.specs?.projects || {};
|
|
119
|
+
for (const [projectId, projectConfig] of Object.entries(projectConfigs)) {
|
|
120
|
+
const keywords = projectConfig.keywords || [];
|
|
121
|
+
const matchedKeywords = [];
|
|
122
|
+
let score = 0;
|
|
123
|
+
for (const keyword of keywords) {
|
|
124
|
+
if (text.includes(keyword.toLowerCase())) {
|
|
125
|
+
matchedKeywords.push(keyword);
|
|
126
|
+
score += 0.3; // Each keyword match = +30%
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (matchedKeywords.length > 0) {
|
|
130
|
+
projectScores.set(projectId, { score, keywords: matchedKeywords });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Fallback to common patterns with lower confidence
|
|
134
|
+
const fallbackPatterns = [
|
|
135
|
+
{ project: 'backend', patterns: ['backend', 'api', 'server', 'database'], score: 0.2 },
|
|
136
|
+
{ project: 'frontend', patterns: ['frontend', 'ui', 'web', 'react', 'vue', 'angular'], score: 0.2 },
|
|
137
|
+
{ project: 'mobile', patterns: ['mobile', 'ios', 'android', 'react-native', 'flutter'], score: 0.2 },
|
|
138
|
+
{ project: 'infra', patterns: ['infra', 'devops', 'k8s', 'kubernetes', 'terraform', 'docker'], score: 0.2 },
|
|
139
|
+
];
|
|
140
|
+
for (const { project, patterns, score: patternScore } of fallbackPatterns) {
|
|
141
|
+
const matched = patterns.filter(p => text.includes(p));
|
|
142
|
+
if (matched.length > 0) {
|
|
143
|
+
const existing = projectScores.get(project) || { score: 0, keywords: [] };
|
|
144
|
+
projectScores.set(project, {
|
|
145
|
+
score: existing.score + (patternScore * matched.length),
|
|
146
|
+
keywords: [...existing.keywords, ...matched]
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Find highest scoring project
|
|
151
|
+
let bestProject = 'default';
|
|
152
|
+
let bestScore = 0;
|
|
153
|
+
let bestKeywords = [];
|
|
154
|
+
for (const [project, { score, keywords }] of projectScores.entries()) {
|
|
155
|
+
if (score > bestScore) {
|
|
156
|
+
bestScore = score;
|
|
157
|
+
bestProject = project;
|
|
158
|
+
bestKeywords = keywords;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
project: bestProject,
|
|
163
|
+
confidence: Math.min(bestScore, 1.0),
|
|
164
|
+
matchedKeywords: bestKeywords
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Detect project from increment name or description (simple version)
|
|
169
|
+
*/
|
|
170
|
+
export function detectProjectFromIncrement(incrementName, description = '', config = {}) {
|
|
171
|
+
const result = detectProjectFromIncrementWithConfidence(incrementName, description, config);
|
|
172
|
+
return result.project;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Check if spec should be synced to GitHub
|
|
176
|
+
*/
|
|
177
|
+
export function shouldSyncSpec(spec, config = {}) {
|
|
178
|
+
// 1. Check if sync is enabled globally
|
|
179
|
+
if (config.sync?.enabled === false) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
// 2. Check if project sync is enabled
|
|
183
|
+
if (!spec.syncEnabled) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
// 3. Parent specs are NEVER synced
|
|
187
|
+
if (spec.project === '_parent') {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
// 4. Check if project has GitHub config
|
|
191
|
+
const projectConfig = config.specs?.projects?.[spec.project];
|
|
192
|
+
if (!projectConfig?.github) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=spec-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-detector.js","sourceRoot":"","sources":["../../../src/core/spec-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec Identifier Detector
|
|
3
|
+
*
|
|
4
|
+
* Auto-detects the correct identifier strategy based on:
|
|
5
|
+
* Priority 1: External tool links (JIRA, ADO, GitHub)
|
|
6
|
+
* Priority 2: Custom ID in frontmatter
|
|
7
|
+
* Priority 3: Title-based slug
|
|
8
|
+
* Priority 4: Sequential numbering
|
|
9
|
+
*/
|
|
10
|
+
import { SpecIdentifier, SpecContent } from './types/spec-identifier.js';
|
|
11
|
+
export type { SpecContent } from './types/spec-identifier.js';
|
|
12
|
+
export interface DetectorOptions {
|
|
13
|
+
/** Existing spec IDs in this project (for conflict detection) */
|
|
14
|
+
existingSpecs?: string[];
|
|
15
|
+
/** Whether to prefer title-slug over sequential */
|
|
16
|
+
preferTitleSlug?: boolean;
|
|
17
|
+
/** Minimum slug length to consider valid */
|
|
18
|
+
minSlugLength?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Detect the appropriate identifier for a spec
|
|
22
|
+
*/
|
|
23
|
+
export declare function detectSpecIdentifier(spec: SpecContent, options?: DetectorOptions): SpecIdentifier;
|
|
24
|
+
/**
|
|
25
|
+
* Convert title to kebab-case slug
|
|
26
|
+
*/
|
|
27
|
+
export declare function slugify(text: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Extract spec identifier from file path
|
|
30
|
+
*
|
|
31
|
+
* Examples:
|
|
32
|
+
* - specs/backend/JIRA-AUTH-123.md → "backend/JIRA-AUTH-123"
|
|
33
|
+
* - specs/frontend/user-login-ui.md → "frontend/user-login-ui"
|
|
34
|
+
* - specs/backend/spec-001-user-auth.md → "backend/spec-001"
|
|
35
|
+
*/
|
|
36
|
+
export declare function extractIdentifierFromPath(filePath: string): {
|
|
37
|
+
project: string;
|
|
38
|
+
specId: string;
|
|
39
|
+
full: string;
|
|
40
|
+
} | null;
|
|
41
|
+
/**
|
|
42
|
+
* Format GitHub issue title from spec identifier
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatGitHubIssueTitle(specId: SpecIdentifier, title: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Validate spec identifier format
|
|
47
|
+
*/
|
|
48
|
+
export declare function isValidSpecIdentifier(id: string): boolean;
|
|
49
|
+
//# sourceMappingURL=spec-identifier-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-identifier-detector.d.ts","sourceRoot":"","sources":["../../../src/core/spec-identifier-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,cAAc,EACd,WAAW,EAGZ,MAAM,4BAA4B,CAAC;AAGpC,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB,mDAAmD;IACnD,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,eAAoB,GAC5B,cAAc,CA0DhB;AA+DD;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAc5C;AA0BD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAgBP;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,GACZ,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAkBzD"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec Identifier Detector
|
|
3
|
+
*
|
|
4
|
+
* Auto-detects the correct identifier strategy based on:
|
|
5
|
+
* Priority 1: External tool links (JIRA, ADO, GitHub)
|
|
6
|
+
* Priority 2: Custom ID in frontmatter
|
|
7
|
+
* Priority 3: Title-based slug
|
|
8
|
+
* Priority 4: Sequential numbering
|
|
9
|
+
*/
|
|
10
|
+
import { getProjectCode } from './types/spec-identifier.js';
|
|
11
|
+
/**
|
|
12
|
+
* Detect the appropriate identifier for a spec
|
|
13
|
+
*/
|
|
14
|
+
export function detectSpecIdentifier(spec, options = {}) {
|
|
15
|
+
const { existingSpecs = [], preferTitleSlug = true, minSlugLength = 5 } = options;
|
|
16
|
+
const { frontmatter, title, project } = spec;
|
|
17
|
+
const projectCode = getProjectCode(project);
|
|
18
|
+
// Priority 1: External tool link (JIRA, ADO, GitHub)
|
|
19
|
+
const externalId = detectExternalId(frontmatter);
|
|
20
|
+
if (externalId) {
|
|
21
|
+
return externalId;
|
|
22
|
+
}
|
|
23
|
+
// Priority 2: Explicit custom ID in frontmatter
|
|
24
|
+
if (frontmatter.id && typeof frontmatter.id === 'string') {
|
|
25
|
+
const customId = frontmatter.id;
|
|
26
|
+
return {
|
|
27
|
+
full: `${project}/${customId}`,
|
|
28
|
+
display: customId,
|
|
29
|
+
source: 'custom',
|
|
30
|
+
project,
|
|
31
|
+
stable: true,
|
|
32
|
+
compact: `${projectCode}-${customId}`
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Priority 3: Generate from title (slugified)
|
|
36
|
+
if (preferTitleSlug && title) {
|
|
37
|
+
const titleSlug = slugify(title);
|
|
38
|
+
const slugExists = existingSpecs.some(s => s.toLowerCase().includes(titleSlug.toLowerCase()));
|
|
39
|
+
if (!slugExists && titleSlug.length >= minSlugLength) {
|
|
40
|
+
return {
|
|
41
|
+
full: `${project}/${titleSlug}`,
|
|
42
|
+
display: titleSlug,
|
|
43
|
+
source: 'title-slug',
|
|
44
|
+
project,
|
|
45
|
+
stable: true,
|
|
46
|
+
compact: `${projectCode}-${titleSlug}`
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Priority 4: Sequential numbering (fallback)
|
|
51
|
+
const nextNumber = findNextSequentialNumber(existingSpecs, project);
|
|
52
|
+
return {
|
|
53
|
+
full: `${project}/spec-${nextNumber}`,
|
|
54
|
+
display: `spec-${nextNumber}`,
|
|
55
|
+
source: 'sequential',
|
|
56
|
+
project,
|
|
57
|
+
stable: true,
|
|
58
|
+
compact: `${projectCode}-${nextNumber}`
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Detect external tool ID from frontmatter
|
|
63
|
+
*/
|
|
64
|
+
function detectExternalId(frontmatter) {
|
|
65
|
+
// Check for JIRA
|
|
66
|
+
if (frontmatter.externalLinks?.jira?.issueKey) {
|
|
67
|
+
const { issueKey, url } = frontmatter.externalLinks.jira;
|
|
68
|
+
const project = frontmatter.project || 'default';
|
|
69
|
+
const projectCode = getProjectCode(project);
|
|
70
|
+
return {
|
|
71
|
+
full: `${project}/JIRA-${issueKey}`,
|
|
72
|
+
display: `JIRA-${issueKey}`,
|
|
73
|
+
source: 'external-jira',
|
|
74
|
+
externalId: issueKey,
|
|
75
|
+
externalUrl: url,
|
|
76
|
+
project,
|
|
77
|
+
stable: true,
|
|
78
|
+
compact: `${projectCode}-JIRA-${issueKey}`
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Check for Azure DevOps
|
|
82
|
+
if (frontmatter.externalLinks?.ado?.workItemId) {
|
|
83
|
+
const { workItemId, url } = frontmatter.externalLinks.ado;
|
|
84
|
+
const project = frontmatter.project || 'default';
|
|
85
|
+
const projectCode = getProjectCode(project);
|
|
86
|
+
return {
|
|
87
|
+
full: `${project}/ADO-${workItemId}`,
|
|
88
|
+
display: `ADO-${workItemId}`,
|
|
89
|
+
source: 'external-ado',
|
|
90
|
+
externalId: String(workItemId),
|
|
91
|
+
externalUrl: url,
|
|
92
|
+
project,
|
|
93
|
+
stable: true,
|
|
94
|
+
compact: `${projectCode}-ADO-${workItemId}`
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Check for GitHub
|
|
98
|
+
if (frontmatter.externalLinks?.github?.issueNumber) {
|
|
99
|
+
const { issueNumber, issueUrl } = frontmatter.externalLinks.github;
|
|
100
|
+
const project = frontmatter.project || 'default';
|
|
101
|
+
const projectCode = getProjectCode(project);
|
|
102
|
+
return {
|
|
103
|
+
full: `${project}/GH-${issueNumber}`,
|
|
104
|
+
display: `GH-${issueNumber}`,
|
|
105
|
+
source: 'external-github',
|
|
106
|
+
externalId: `#${issueNumber}`,
|
|
107
|
+
externalUrl: issueUrl,
|
|
108
|
+
project,
|
|
109
|
+
stable: true,
|
|
110
|
+
compact: `${projectCode}-GH-${issueNumber}`
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Convert title to kebab-case slug
|
|
117
|
+
*/
|
|
118
|
+
export function slugify(text) {
|
|
119
|
+
return text
|
|
120
|
+
.toLowerCase()
|
|
121
|
+
.trim()
|
|
122
|
+
// Replace spaces and underscores with hyphens
|
|
123
|
+
.replace(/[\s_]+/g, '-')
|
|
124
|
+
// Remove all non-alphanumeric characters except hyphens
|
|
125
|
+
.replace(/[^a-z0-9-]/g, '')
|
|
126
|
+
// Replace multiple consecutive hyphens with single hyphen
|
|
127
|
+
.replace(/-+/g, '-')
|
|
128
|
+
// Remove leading/trailing hyphens
|
|
129
|
+
.replace(/^-|-$/g, '')
|
|
130
|
+
// Limit to 50 characters
|
|
131
|
+
.substring(0, 50);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Find next available sequential number for this project
|
|
135
|
+
*/
|
|
136
|
+
function findNextSequentialNumber(existingSpecs, project) {
|
|
137
|
+
// Extract numbers from existing specs in this project
|
|
138
|
+
const pattern = new RegExp(`^${project}/spec-(\\d+)`, 'i');
|
|
139
|
+
const numbers = existingSpecs
|
|
140
|
+
.map(spec => {
|
|
141
|
+
const match = spec.match(pattern);
|
|
142
|
+
return match ? parseInt(match[1], 10) : null;
|
|
143
|
+
})
|
|
144
|
+
.filter((n) => n !== null);
|
|
145
|
+
// Find max number and increment
|
|
146
|
+
const maxNumber = numbers.length > 0 ? Math.max(...numbers) : 0;
|
|
147
|
+
const nextNumber = maxNumber + 1;
|
|
148
|
+
// Zero-pad to 3 digits
|
|
149
|
+
return String(nextNumber).padStart(3, '0');
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Extract spec identifier from file path
|
|
153
|
+
*
|
|
154
|
+
* Examples:
|
|
155
|
+
* - specs/backend/JIRA-AUTH-123.md → "backend/JIRA-AUTH-123"
|
|
156
|
+
* - specs/frontend/user-login-ui.md → "frontend/user-login-ui"
|
|
157
|
+
* - specs/backend/spec-001-user-auth.md → "backend/spec-001"
|
|
158
|
+
*/
|
|
159
|
+
export function extractIdentifierFromPath(filePath) {
|
|
160
|
+
const match = filePath.match(/specs\/([^/]+)\/([^/]+)\.md$/);
|
|
161
|
+
if (!match) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
const [, project, fileName] = match;
|
|
165
|
+
// Handle legacy format: spec-001-user-auth.md → spec-001
|
|
166
|
+
const specId = fileName.replace(/-[a-z-]+$/, '');
|
|
167
|
+
return {
|
|
168
|
+
project,
|
|
169
|
+
specId,
|
|
170
|
+
full: `${project}/${specId}`
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Format GitHub issue title from spec identifier
|
|
175
|
+
*/
|
|
176
|
+
export function formatGitHubIssueTitle(specId, title) {
|
|
177
|
+
return `[${specId.compact}] ${title}`;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Validate spec identifier format
|
|
181
|
+
*/
|
|
182
|
+
export function isValidSpecIdentifier(id) {
|
|
183
|
+
// Must be non-empty
|
|
184
|
+
if (!id || id.length === 0) {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
// Must contain only valid characters
|
|
188
|
+
const validPattern = /^[a-zA-Z0-9-_]+$/;
|
|
189
|
+
if (!validPattern.test(id)) {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
// Must not start or end with hyphen/underscore
|
|
193
|
+
if (/^[-_]|[-_]$/.test(id)) {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=spec-identifier-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-identifier-detector.js","sourceRoot":"","sources":["../../../src/core/spec-identifier-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec Identifier Types
|
|
3
|
+
*
|
|
4
|
+
* Flexible identifier system that supports:
|
|
5
|
+
* - External tool IDs (JIRA-AUTH-123, ADO-12345, GH-456)
|
|
6
|
+
* - Custom user-defined IDs
|
|
7
|
+
* - Title-based slugs (user-authentication-system)
|
|
8
|
+
* - Sequential numbers (spec-001)
|
|
9
|
+
*/
|
|
10
|
+
export type SpecIdentifierSource = 'external-jira' | 'external-ado' | 'external-github' | 'custom' | 'title-slug' | 'sequential' | 'hybrid-prefix';
|
|
11
|
+
export interface SpecIdentifier {
|
|
12
|
+
/** Full identifier including project: "backend/JIRA-AUTH-123" */
|
|
13
|
+
full: string;
|
|
14
|
+
/** Display-friendly identifier: "JIRA-AUTH-123" or "user-authentication" */
|
|
15
|
+
display: string;
|
|
16
|
+
/** Where this ID came from */
|
|
17
|
+
source: SpecIdentifierSource;
|
|
18
|
+
/** External tool ID if applicable: "AUTH-123" (JIRA), "12345" (ADO), "#456" (GitHub) */
|
|
19
|
+
externalId?: string;
|
|
20
|
+
/** Direct link to external issue/epic */
|
|
21
|
+
externalUrl?: string;
|
|
22
|
+
/** Project this spec belongs to: "backend", "frontend", "mobile" */
|
|
23
|
+
project: string;
|
|
24
|
+
/** Whether ID is stable (doesn't change with content) */
|
|
25
|
+
stable: boolean;
|
|
26
|
+
/** Compact display format: "BE-JIRA-AUTH-123", "FE-user-auth" */
|
|
27
|
+
compact: string;
|
|
28
|
+
}
|
|
29
|
+
export interface SpecContent {
|
|
30
|
+
/** Raw markdown content */
|
|
31
|
+
content: string;
|
|
32
|
+
/** Parsed frontmatter */
|
|
33
|
+
frontmatter: Record<string, any>;
|
|
34
|
+
/** Spec title (from frontmatter or first heading) */
|
|
35
|
+
title: string;
|
|
36
|
+
/** Project identifier */
|
|
37
|
+
project: string;
|
|
38
|
+
/** File path */
|
|
39
|
+
path: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ProjectConfig {
|
|
42
|
+
/** Unique project ID */
|
|
43
|
+
id: string;
|
|
44
|
+
/** Display name */
|
|
45
|
+
displayName: string;
|
|
46
|
+
/** Project description */
|
|
47
|
+
description?: string;
|
|
48
|
+
/** GitHub repository configuration */
|
|
49
|
+
github?: {
|
|
50
|
+
owner: string;
|
|
51
|
+
repo: string;
|
|
52
|
+
} | null;
|
|
53
|
+
/** Default labels for GitHub issues */
|
|
54
|
+
defaultLabels?: string[];
|
|
55
|
+
/** Team name */
|
|
56
|
+
team?: string;
|
|
57
|
+
/** Whether to sync this project to GitHub */
|
|
58
|
+
syncEnabled?: boolean;
|
|
59
|
+
}
|
|
60
|
+
export interface ProjectsConfig {
|
|
61
|
+
[projectId: string]: ProjectConfig;
|
|
62
|
+
}
|
|
63
|
+
/** Project code mapping for compact display */
|
|
64
|
+
export declare const PROJECT_CODES: Record<string, string>;
|
|
65
|
+
/** Get project code from project ID */
|
|
66
|
+
export declare function getProjectCode(projectId: string): string;
|
|
67
|
+
//# sourceMappingURL=spec-identifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-identifier.d.ts","sourceRoot":"","sources":["../../../../src/core/types/spec-identifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,oBAAoB,GAC5B,eAAe,GACf,cAAc,GACd,iBAAiB,GACjB,QAAQ,GACR,YAAY,GACZ,YAAY,GACZ,eAAe,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IAEb,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;IAEhB,8BAA8B;IAC9B,MAAM,EAAE,oBAAoB,CAAC;IAE7B,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAEhB,yDAAyD;IACzD,MAAM,EAAE,OAAO,CAAC;IAEhB,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAEhB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEjC,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IAEd,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAEhB,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IAEX,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IAEpB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,sCAAsC;IACtC,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI,CAAC;IAET,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAAC;CACpC;AAED,+CAA+C;AAC/C,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOhD,CAAC;AAEF,uCAAuC;AACvC,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec Identifier Types
|
|
3
|
+
*
|
|
4
|
+
* Flexible identifier system that supports:
|
|
5
|
+
* - External tool IDs (JIRA-AUTH-123, ADO-12345, GH-456)
|
|
6
|
+
* - Custom user-defined IDs
|
|
7
|
+
* - Title-based slugs (user-authentication-system)
|
|
8
|
+
* - Sequential numbers (spec-001)
|
|
9
|
+
*/
|
|
10
|
+
/** Project code mapping for compact display */
|
|
11
|
+
export const PROJECT_CODES = {
|
|
12
|
+
backend: 'BE',
|
|
13
|
+
frontend: 'FE',
|
|
14
|
+
mobile: 'MB',
|
|
15
|
+
infra: 'IN',
|
|
16
|
+
_parent: 'PA',
|
|
17
|
+
default: 'DF'
|
|
18
|
+
};
|
|
19
|
+
/** Get project code from project ID */
|
|
20
|
+
export function getProjectCode(projectId) {
|
|
21
|
+
return PROJECT_CODES[projectId] || projectId.toUpperCase().substring(0, 2);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=spec-identifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-identifier.js","sourceRoot":"","sources":["../../../../src/core/types/spec-identifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoFH,+CAA+C;AAC/C,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,uCAAuC;AACvC,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-generator.d.ts","sourceRoot":"","sources":["../../../../src/utils/docs-preview/config-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"config-generator.d.ts","sourceRoot":"","sources":["../../../../src/utils/docs-preview/config-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAyHzE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKtG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAuCzD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA8EvD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA8DxE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKrG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAsB/C;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1E"}
|
|
@@ -32,6 +32,7 @@ const config = {
|
|
|
32
32
|
|
|
33
33
|
onBrokenLinks: 'warn',
|
|
34
34
|
onBrokenMarkdownLinks: 'warn',
|
|
35
|
+
onBrokenAnchors: 'warn',
|
|
35
36
|
|
|
36
37
|
// Internationalization
|
|
37
38
|
i18n: {
|
|
@@ -49,6 +50,10 @@ const config = {
|
|
|
49
50
|
path: '${docsPath}',
|
|
50
51
|
sidebarPath: './sidebars.js',
|
|
51
52
|
editUrl: undefined, // Disable "Edit this page" for internal docs
|
|
53
|
+
remarkPlugins: [],
|
|
54
|
+
rehypePlugins: [],
|
|
55
|
+
beforeDefaultRemarkPlugins: [],
|
|
56
|
+
beforeDefaultRehypePlugins: [],
|
|
52
57
|
},
|
|
53
58
|
blog: false, // Disable blog
|
|
54
59
|
theme: {
|
|
@@ -110,6 +115,12 @@ const config = {
|
|
|
110
115
|
// Mermaid diagrams support
|
|
111
116
|
markdown: {
|
|
112
117
|
mermaid: true,
|
|
118
|
+
format: 'mdx',
|
|
119
|
+
mdx1Compat: {
|
|
120
|
+
comments: true,
|
|
121
|
+
admonitions: true,
|
|
122
|
+
headingIds: true,
|
|
123
|
+
},
|
|
113
124
|
},
|
|
114
125
|
themes: ['@docusaurus/theme-mermaid'],
|
|
115
126
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-generator.js","sourceRoot":"","sources":["../../../../src/utils/docs-preview/config-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAG/B;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAwB;IAC/D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,GAAG,SAAS,EAAE,GAAG,MAAM,CAAC;IAE7E,OAAO;;;gBAGO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;;;;YAM5B,KAAK;cACH,OAAO;;;;UAIX,GAAG;cACC,OAAO
|
|
1
|
+
{"version":3,"file":"config-generator.js","sourceRoot":"","sources":["../../../../src/utils/docs-preview/config-generator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.8",
|
|
4
4
|
"description": "Spec-driven development framework for Claude Code. AI-native workflow with living documentation, intelligent agents, and multilingual support (9 languages). Enterprise-grade traceability with permanent specs and temporary increments.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -78,6 +78,7 @@
|
|
|
78
78
|
"chalk": "^5.3.0",
|
|
79
79
|
"commander": "^14.0.2",
|
|
80
80
|
"fs-extra": "^11.2.0",
|
|
81
|
+
"glob": "^11.0.3",
|
|
81
82
|
"inquirer": "^12.10.0",
|
|
82
83
|
"js-yaml": "^4.1.0",
|
|
83
84
|
"open": "^10.2.0",
|