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.
Files changed (108) hide show
  1. package/CLAUDE.md +365 -9
  2. package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts +9 -4
  3. package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
  4. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +82 -12
  5. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
  6. package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts +2 -2
  7. package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
  8. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +69 -10
  9. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
  10. package/dist/src/cli/commands/detect-project.d.ts +9 -0
  11. package/dist/src/cli/commands/detect-project.d.ts.map +1 -0
  12. package/dist/src/cli/commands/detect-project.js +85 -0
  13. package/dist/src/cli/commands/detect-project.js.map +1 -0
  14. package/dist/src/cli/commands/detect-specs.d.ts +9 -0
  15. package/dist/src/cli/commands/detect-specs.d.ts.map +1 -0
  16. package/dist/src/cli/commands/detect-specs.js +73 -0
  17. package/dist/src/cli/commands/detect-specs.js.map +1 -0
  18. package/dist/src/cli/commands/init.d.ts.map +1 -1
  19. package/dist/src/cli/commands/init.js +8 -15
  20. package/dist/src/cli/commands/init.js.map +1 -1
  21. package/dist/src/core/living-docs/content-classifier.d.ts +83 -0
  22. package/dist/src/core/living-docs/content-classifier.d.ts.map +1 -0
  23. package/dist/src/core/living-docs/content-classifier.js +393 -0
  24. package/dist/src/core/living-docs/content-classifier.js.map +1 -0
  25. package/dist/src/core/living-docs/content-distributor.d.ts +126 -0
  26. package/dist/src/core/living-docs/content-distributor.d.ts.map +1 -0
  27. package/dist/src/core/living-docs/content-distributor.js +339 -0
  28. package/dist/src/core/living-docs/content-distributor.js.map +1 -0
  29. package/dist/src/core/living-docs/content-parser.d.ts +140 -0
  30. package/dist/src/core/living-docs/content-parser.d.ts.map +1 -0
  31. package/dist/src/core/living-docs/content-parser.js +316 -0
  32. package/dist/src/core/living-docs/content-parser.js.map +1 -0
  33. package/dist/src/core/living-docs/cross-linker.d.ts +126 -0
  34. package/dist/src/core/living-docs/cross-linker.d.ts.map +1 -0
  35. package/dist/src/core/living-docs/cross-linker.js +374 -0
  36. package/dist/src/core/living-docs/cross-linker.js.map +1 -0
  37. package/dist/src/core/living-docs/index.d.ts +89 -0
  38. package/dist/src/core/living-docs/index.d.ts.map +1 -0
  39. package/dist/src/core/living-docs/index.js +169 -0
  40. package/dist/src/core/living-docs/index.js.map +1 -0
  41. package/dist/src/core/living-docs/project-detector.d.ts +103 -0
  42. package/dist/src/core/living-docs/project-detector.d.ts.map +1 -0
  43. package/dist/src/core/living-docs/project-detector.js +314 -0
  44. package/dist/src/core/living-docs/project-detector.js.map +1 -0
  45. package/dist/src/core/repo-structure/prompt-consolidator.d.ts +1 -1
  46. package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
  47. package/dist/src/core/repo-structure/prompt-consolidator.js +51 -22
  48. package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -1
  49. package/dist/src/core/repo-structure/repo-structure-manager.d.ts +2 -0
  50. package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
  51. package/dist/src/core/repo-structure/repo-structure-manager.js +126 -62
  52. package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
  53. package/dist/src/core/spec-content-sync.d.ts +6 -0
  54. package/dist/src/core/spec-content-sync.d.ts.map +1 -1
  55. package/dist/src/core/spec-content-sync.js +25 -7
  56. package/dist/src/core/spec-content-sync.js.map +1 -1
  57. package/dist/src/core/spec-detector.d.ts +54 -0
  58. package/dist/src/core/spec-detector.d.ts.map +1 -0
  59. package/dist/src/core/spec-detector.js +197 -0
  60. package/dist/src/core/spec-detector.js.map +1 -0
  61. package/dist/src/core/spec-identifier-detector.d.ts +49 -0
  62. package/dist/src/core/spec-identifier-detector.d.ts.map +1 -0
  63. package/dist/src/core/spec-identifier-detector.js +198 -0
  64. package/dist/src/core/spec-identifier-detector.js.map +1 -0
  65. package/dist/src/core/types/spec-identifier.d.ts +67 -0
  66. package/dist/src/core/types/spec-identifier.d.ts.map +1 -0
  67. package/dist/src/core/types/spec-identifier.js +23 -0
  68. package/dist/src/core/types/spec-identifier.js.map +1 -0
  69. package/dist/src/utils/docs-preview/config-generator.d.ts.map +1 -1
  70. package/dist/src/utils/docs-preview/config-generator.js +11 -0
  71. package/dist/src/utils/docs-preview/config-generator.js.map +1 -1
  72. package/package.json +2 -1
  73. package/plugins/specweave/.claude-plugin/plugin.json +1 -1
  74. package/plugins/specweave/lib/hooks/sync-living-docs.js +61 -5
  75. package/plugins/specweave/lib/hooks/sync-living-docs.ts +102 -13
  76. package/plugins/specweave-ado/.claude-plugin/plugin.json +1 -1
  77. package/plugins/specweave-docs-preview/commands/preview.md +11 -11
  78. package/plugins/specweave-github/.claude-plugin/plugin.json +1 -1
  79. package/plugins/specweave-github/hooks/post-task-completion.sh +59 -30
  80. package/plugins/specweave-github/lib/github-spec-content-sync.js +55 -6
  81. package/plugins/specweave-github/lib/github-spec-content-sync.ts +84 -12
  82. package/plugins/specweave-jira/.claude-plugin/plugin.json +1 -1
  83. package/plugins/specweave-mobile/.claude-plugin/plugin.json +1 -4
  84. package/plugins/specweave-release/.claude-plugin/plugin.json +3 -15
  85. package/src/templates/AGENTS.md.template +297 -0
  86. package/dist/locales/de/.gitkeep +0 -0
  87. package/dist/locales/de/cli.json +0 -108
  88. package/dist/locales/en/cli.json +0 -287
  89. package/dist/locales/en/errors.json +0 -7
  90. package/dist/locales/en/templates.json +0 -6
  91. package/dist/locales/es/.gitkeep +0 -0
  92. package/dist/locales/es/cli.json +0 -41
  93. package/dist/locales/fr/.gitkeep +0 -0
  94. package/dist/locales/fr/cli.json +0 -108
  95. package/dist/locales/ja/.gitkeep +0 -0
  96. package/dist/locales/ja/cli.json +0 -108
  97. package/dist/locales/ko/.gitkeep +0 -0
  98. package/dist/locales/ko/cli.json +0 -108
  99. package/dist/locales/pt/.gitkeep +0 -0
  100. package/dist/locales/pt/cli.json +0 -108
  101. package/dist/locales/ru/.gitkeep +0 -0
  102. package/dist/locales/ru/cli.json +0 -269
  103. package/dist/locales/zh/.gitkeep +0 -0
  104. package/dist/locales/zh/cli.json +0 -108
  105. package/plugins/specweave/plugin.json +0 -22
  106. package/plugins/specweave-ado/plugin.json +0 -20
  107. package/plugins/specweave-github/plugin.json +0 -19
  108. 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":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAGL,cAAc,EAEf,MAAM,4BAA4B,CAAC;AAgBpC;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAiB,EACjB,UAA2B,EAAE;IAE7B,MAAM,EACJ,aAAa,GAAG,EAAE,EAClB,eAAe,GAAG,IAAI,EACtB,aAAa,GAAG,CAAC,EAClB,GAAG,OAAO,CAAC;IAEZ,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC7C,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAE5C,qDAAqD;IACrD,MAAM,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,gDAAgD;IAChD,IAAI,WAAW,CAAC,EAAE,IAAI,OAAO,WAAW,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,GAAG,OAAO,IAAI,QAAQ,EAAE;YAC9B,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,QAAQ;YAChB,OAAO;YACP,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,GAAG,WAAW,IAAI,QAAQ,EAAE;SACtC,CAAC;IACJ,CAAC;IAED,8CAA8C;IAC9C,IAAI,eAAe,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACxC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAClD,CAAC;QAEF,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;YACrD,OAAO;gBACL,IAAI,EAAE,GAAG,OAAO,IAAI,SAAS,EAAE;gBAC/B,OAAO,EAAE,SAAS;gBAClB,MAAM,EAAE,YAAY;gBACpB,OAAO;gBACP,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,GAAG,WAAW,IAAI,SAAS,EAAE;aACvC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,UAAU,GAAG,wBAAwB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACpE,OAAO;QACL,IAAI,EAAE,GAAG,OAAO,SAAS,UAAU,EAAE;QACrC,OAAO,EAAE,QAAQ,UAAU,EAAE;QAC7B,MAAM,EAAE,YAAY;QACpB,OAAO;QACP,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,GAAG,WAAW,IAAI,UAAU,EAAE;KACxC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,WAAgC;IACxD,iBAAiB;IACjB,IAAI,WAAW,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC9C,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC;QACzD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,SAAS,CAAC;QACjD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAE5C,OAAO;YACL,IAAI,EAAE,GAAG,OAAO,SAAS,QAAQ,EAAE;YACnC,OAAO,EAAE,QAAQ,QAAQ,EAAE;YAC3B,MAAM,EAAE,eAAe;YACvB,UAAU,EAAE,QAAQ;YACpB,WAAW,EAAE,GAAG;YAChB,OAAO;YACP,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,GAAG,WAAW,SAAS,QAAQ,EAAE;SAC3C,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,IAAI,WAAW,CAAC,aAAa,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QAC/C,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC;QAC1D,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,SAAS,CAAC;QACjD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAE5C,OAAO;YACL,IAAI,EAAE,GAAG,OAAO,QAAQ,UAAU,EAAE;YACpC,OAAO,EAAE,OAAO,UAAU,EAAE;YAC5B,MAAM,EAAE,cAAc;YACtB,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;YAC9B,WAAW,EAAE,GAAG;YAChB,OAAO;YACP,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,GAAG,WAAW,QAAQ,UAAU,EAAE;SAC5C,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,IAAI,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACnD,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC;QACnE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,SAAS,CAAC;QACjD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAE5C,OAAO;YACL,IAAI,EAAE,GAAG,OAAO,OAAO,WAAW,EAAE;YACpC,OAAO,EAAE,MAAM,WAAW,EAAE;YAC5B,MAAM,EAAE,iBAAiB;YACzB,UAAU,EAAE,IAAI,WAAW,EAAE;YAC7B,WAAW,EAAE,QAAQ;YACrB,OAAO;YACP,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,GAAG,WAAW,OAAO,WAAW,EAAE;SAC5C,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,IAAI,EAAE;QACP,8CAA8C;SAC7C,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;QACxB,wDAAwD;SACvD,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;QAC3B,0DAA0D;SACzD,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;QACpB,kCAAkC;SACjC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtB,yBAAyB;SACxB,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAC/B,aAAuB,EACvB,OAAe;IAEf,sDAAsD;IACtD,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,OAAO,cAAc,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,aAAa;SAC1B,GAAG,CAAC,IAAI,CAAC,EAAE;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAE1C,gCAAgC;IAChC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,SAAS,GAAG,CAAC,CAAC;IAEjC,uBAAuB;IACvB,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAAgB;IAKxD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;IAEpC,yDAAyD;IACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAEjD,OAAO;QACL,OAAO;QACP,MAAM;QACN,IAAI,EAAE,GAAG,OAAO,IAAI,MAAM,EAAE;KAC7B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAsB,EACtB,KAAa;IAEb,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAU;IAC9C,oBAAoB;IACpB,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qCAAqC;IACrC,MAAM,YAAY,GAAG,kBAAkB,CAAC;IACxC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,+CAA+C;IAC/C,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -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,CA8GzE;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"}
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":"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"}
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.6",
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",
@@ -19,5 +19,5 @@
19
19
  "architect",
20
20
  "living-docs"
21
21
  ],
22
- "hooks": "hooks/hooks.json"
22
+ "hooks": "./hooks/hooks.json"
23
23
  }