specweave 0.18.0 → 0.18.1

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 (69) hide show
  1. package/dist/locales/de/.gitkeep +0 -0
  2. package/dist/locales/de/cli.json +108 -0
  3. package/dist/locales/en/cli.json +287 -0
  4. package/dist/locales/en/errors.json +7 -0
  5. package/dist/locales/en/templates.json +6 -0
  6. package/dist/locales/es/.gitkeep +0 -0
  7. package/dist/locales/es/cli.json +41 -0
  8. package/dist/locales/fr/.gitkeep +0 -0
  9. package/dist/locales/fr/cli.json +108 -0
  10. package/dist/locales/ja/.gitkeep +0 -0
  11. package/dist/locales/ja/cli.json +108 -0
  12. package/dist/locales/ko/.gitkeep +0 -0
  13. package/dist/locales/ko/cli.json +108 -0
  14. package/dist/locales/pt/.gitkeep +0 -0
  15. package/dist/locales/pt/cli.json +108 -0
  16. package/dist/locales/ru/.gitkeep +0 -0
  17. package/dist/locales/ru/cli.json +269 -0
  18. package/dist/locales/zh/.gitkeep +0 -0
  19. package/dist/locales/zh/cli.json +108 -0
  20. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +25 -0
  21. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +1 -0
  22. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +191 -0
  23. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +1 -0
  24. package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +63 -0
  25. package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -0
  26. package/dist/plugins/specweave-github/lib/epic-content-builder.js +216 -0
  27. package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -0
  28. package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts +2 -2
  29. package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts.map +1 -1
  30. package/dist/plugins/specweave-github/lib/github-epic-sync.js +19 -4
  31. package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -1
  32. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +26 -0
  33. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -0
  34. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +195 -0
  35. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -0
  36. package/dist/spec-parser.js +629 -0
  37. package/dist/src/cli/commands/init.d.ts.map +1 -1
  38. package/dist/src/cli/commands/init.js +107 -3
  39. package/dist/src/cli/commands/init.js.map +1 -1
  40. package/dist/src/core/sync/enhanced-content-builder.d.ts +32 -54
  41. package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
  42. package/dist/src/core/sync/enhanced-content-builder.js +141 -138
  43. package/dist/src/core/sync/enhanced-content-builder.js.map +1 -1
  44. package/dist/src/core/sync/spec-content-sync.d.ts +88 -0
  45. package/dist/src/core/sync/spec-content-sync.d.ts.map +1 -0
  46. package/dist/src/core/sync/spec-content-sync.js +5 -0
  47. package/dist/src/core/sync/spec-content-sync.js.map +1 -0
  48. package/dist/src/core/sync/types.d.ts +52 -0
  49. package/dist/src/core/sync/types.d.ts.map +1 -0
  50. package/dist/src/core/sync/types.js +5 -0
  51. package/dist/src/core/sync/types.js.map +1 -0
  52. package/dist/src/core/types/config.d.ts +31 -0
  53. package/dist/src/core/types/config.d.ts.map +1 -1
  54. package/dist/src/core/types/config.js +9 -0
  55. package/dist/src/core/types/config.js.map +1 -1
  56. package/dist/src/core/types/increment-metadata.d.ts +4 -0
  57. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  58. package/dist/src/core/types/increment-metadata.js.map +1 -1
  59. package/dist/tsconfig.tsbuildinfo +1 -0
  60. package/package.json +1 -1
  61. package/plugins/specweave/agents/pm/AGENT.md +159 -12
  62. package/plugins/specweave/commands/specweave.md +70 -405
  63. package/plugins/specweave/hooks/post-increment-planning.sh +26 -2
  64. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
  65. package/plugins/specweave-github/hooks/post-task-completion.sh +32 -0
  66. package/plugins/specweave-github/lib/epic-content-builder.js +227 -0
  67. package/plugins/specweave-github/lib/epic-content-builder.ts +317 -0
  68. package/plugins/specweave-github/lib/github-epic-sync.js +23 -24
  69. package/plugins/specweave-github/lib/github-epic-sync.ts +29 -4
@@ -0,0 +1,108 @@
1
+ {
2
+ "init": {
3
+ "welcome": "🚀 SpecWeave Initialization",
4
+ "projectName": "Project name:",
5
+ "projectNamePrompt": "Project name (for templates):",
6
+ "projectNameDefault": "my-saas",
7
+ "detectingTool": "Detecting AI tool...",
8
+ "foundClaude": "✅ Found Claude Code",
9
+ "foundCursor": "✅ Found Cursor",
10
+ "foundCopilot": "✅ Found GitHub Copilot",
11
+ "noToolDetected": "No AI tool detected, using Generic adapter",
12
+ "complete": "✨ Initialization complete!",
13
+ "claudeNativeComplete": "✨ Claude Code native installation complete!",
14
+ "claudeNativeBenefits": "✅ Native skills, agents, hooks work out of the box",
15
+ "projectSuccess": "SpecWeave project created successfully!",
16
+ "readyToBuild": "🚀 Ready to build with SpecWeave!",
17
+ "errors": {
18
+ "invalidName": "Project name must contain only lowercase letters, numbers, and hyphens",
19
+ "alreadyExists": ".specweave directory already exists",
20
+ "cancelled": "❌ Initialization cancelled",
21
+ "invalidLanguage": "❌ Invalid language: {{language}}",
22
+ "supportedLanguages": "Supported languages: {{languages}}",
23
+ "nestedNotSupported": "❌ Nested .specweave/ folders are NOT supported!",
24
+ "parentFound": "Found parent .specweave/ at:",
25
+ "projectCreationFailed": "Failed to create project",
26
+ "commandsCopyFailed": "❌ Commands copy failed: {{error}}",
27
+ "agentsCopyFailed": "❌ Agents copy failed: {{error}}",
28
+ "skillsCopyFailed": "❌ Skills copy failed: {{error}}",
29
+ "hooksCopyFailed": "❌ Hooks copy failed: {{error}}"
30
+ },
31
+ "warnings": {
32
+ "invalidDirName": "⚠️ Current directory name '{{dirName}}' contains invalid characters.",
33
+ "directoryNotEmpty": "⚠️ Current directory contains {{count}} file{{plural}}.",
34
+ "skillsIndexWarning": "⚠️ Warning: Could not generate skills index: {{error}}",
35
+ "skillsIndexNote": "Skills will still work, but manual indexing may be needed."
36
+ },
37
+ "prompts": {
38
+ "confirmInitInCurrent": "Initialize SpecWeave in current directory?",
39
+ "overwriteSpecweave": ".specweave directory already exists. Overwrite?",
40
+ "overwriteDirectory": "Directory {{projectName}} already exists. Overwrite?",
41
+ "enablePlugins": "Enable suggested plugins now?"
42
+ },
43
+ "info": {
44
+ "nestedEnforcement": "SpecWeave enforces a single source of truth:",
45
+ "nestedBullet1": "• Use the parent folder for all increments",
46
+ "nestedBullet2": "• Increments can span multiple subdirectories",
47
+ "nestedBullet3": "• See CLAUDE.md section \"Root-Level .specweave/ Folder\"",
48
+ "nestedToFix": "To fix:",
49
+ "suggestedPlugins": "💡 Suggested Plugins:",
50
+ "copiedFiles": "✓ Copied {{count}} command files",
51
+ "copiedAgents": "✓ Copied {{count}} agent directories",
52
+ "copiedSkills": "✓ Copied {{count}} skill directories",
53
+ "copiedHooks": "✓ Copied {{count}} hook files"
54
+ },
55
+ "progress": {
56
+ "creatingProject": "Creating SpecWeave project...",
57
+ "detected": "Detected {{tool}}...",
58
+ "usingTool": "Using {{tool}}...",
59
+ "directoryCreated": "Directory structure created...",
60
+ "templatesCopied": "Base templates copied...",
61
+ "installingComponents": "Installing Claude Code components...",
62
+ "commandsInstalled": "Slash commands installed...",
63
+ "agentsInstalled": "Agents installed...",
64
+ "skillsInstalled": "Skills installed...",
65
+ "hooksInstalled": "Hooks installed...",
66
+ "generatingIndex": "Generating skills index...",
67
+ "indexGenerated": "Skills index generated...",
68
+ "installingAdapter": "Installing {{tool}} adapter...",
69
+ "projectSuccess": "SpecWeave project created successfully!",
70
+ "detectingPlugins": "Detecting plugins...",
71
+ "detectedPlugins": "Detected {{count}} suggested plugins",
72
+ "enablingPlugins": "Enabling plugins...",
73
+ "enabledPlugin": "Enabled {{plugin}}",
74
+ "pluginsEnabled": "Plugins enabled"
75
+ },
76
+ "nextSteps": {
77
+ "header": "🎯 Next steps:",
78
+ "cd": "cd {{projectName}}",
79
+ "footer": "🚀 Ready to build with SpecWeave!",
80
+ "docsLink": "Documentation: https://spec-weave.com",
81
+ "githubLink": "GitHub: https://github.com/anton-abyzov/specweave"
82
+ }
83
+ },
84
+ "increment": {
85
+ "creating": "📝 Creating increment: {name}",
86
+ "created": "✅ Increment {id} created successfully!",
87
+ "nextStepDo": "Next: Run /specweave.do to start implementation",
88
+ "errors": {
89
+ "incompleteFound": "Cannot create new increment! Previous increments incomplete"
90
+ }
91
+ },
92
+ "progress": {
93
+ "currentIncrement": "Current Increment: {id}",
94
+ "status": "Status: {status}",
95
+ "completion": "Completion: {percent}%"
96
+ },
97
+ "translate": {
98
+ "translating": "🌐 Translating content to {language}...",
99
+ "complete": "✅ Translation complete!"
100
+ },
101
+ "version": {
102
+ "current": "SpecWeave version: {version}"
103
+ },
104
+ "errors": {
105
+ "fileNotFound": "❌ File not found: {path}",
106
+ "invalidConfig": "❌ Invalid configuration: {error}"
107
+ }
108
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Enhanced Azure DevOps Spec Content Sync
3
+ *
4
+ * Uses EnhancedContentBuilder and SpecIncrementMapper for rich feature descriptions.
5
+ */
6
+ export interface EnhancedAdoSyncOptions {
7
+ specPath: string;
8
+ organization?: string;
9
+ project?: string;
10
+ dryRun?: boolean;
11
+ verbose?: boolean;
12
+ }
13
+ export interface EnhancedAdoSyncResult {
14
+ success: boolean;
15
+ action: 'created' | 'updated' | 'no-change' | 'error';
16
+ featureId?: number;
17
+ featureUrl?: string;
18
+ error?: string;
19
+ tasksLinked?: number;
20
+ }
21
+ /**
22
+ * Enhanced sync with rich content including task mappings
23
+ */
24
+ export declare function syncSpecToAdoWithEnhancedContent(options: EnhancedAdoSyncOptions): Promise<EnhancedAdoSyncResult>;
25
+ //# sourceMappingURL=enhanced-ado-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhanced-ado-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-ado/lib/enhanced-ado-sync.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,gCAAgC,CACpD,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CAgIhC"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Enhanced Azure DevOps Spec Content Sync
3
+ *
4
+ * Uses EnhancedContentBuilder and SpecIncrementMapper for rich feature descriptions.
5
+ */
6
+ import { AdoClientV2 } from './ado-client-v2.js';
7
+ import { EnhancedContentBuilder } from '../../../src/core/sync/enhanced-content-builder.js';
8
+ import { SpecIncrementMapper } from '../../../src/core/sync/spec-increment-mapper.js';
9
+ import { parseSpecContent } from '../../../src/core/spec-content-sync.js';
10
+ import path from 'path';
11
+ import fs from 'fs/promises';
12
+ /**
13
+ * Enhanced sync with rich content including task mappings
14
+ */
15
+ export async function syncSpecToAdoWithEnhancedContent(options) {
16
+ const { specPath, organization, project, dryRun = false, verbose = false } = options;
17
+ try {
18
+ // 1. Parse spec content
19
+ const baseSpec = await parseSpecContent(specPath);
20
+ if (!baseSpec) {
21
+ return {
22
+ success: false,
23
+ action: 'error',
24
+ error: 'Failed to parse spec content',
25
+ };
26
+ }
27
+ if (verbose) {
28
+ console.log(`📄 Parsed spec: ${baseSpec.identifier.compact}`);
29
+ }
30
+ // 2. Build enhanced spec with task mappings
31
+ const specId = baseSpec.identifier.full || baseSpec.identifier.compact;
32
+ const rootDir = await findSpecWeaveRoot(specPath);
33
+ const mapper = new SpecIncrementMapper(rootDir);
34
+ const mapping = await mapper.mapSpecToIncrements(specId);
35
+ if (verbose) {
36
+ console.log(`🔗 Found ${mapping.increments.length} related increments`);
37
+ }
38
+ // 3. Build enhanced spec content
39
+ const taskMapping = buildTaskMapping(mapping.increments, organization, project);
40
+ const architectureDocs = await findArchitectureDocs(rootDir, specId);
41
+ const enhancedSpec = {
42
+ ...baseSpec,
43
+ summary: baseSpec.description,
44
+ taskMapping,
45
+ architectureDocs
46
+ };
47
+ // 4. Build external description
48
+ const builder = new EnhancedContentBuilder();
49
+ const description = builder.buildExternalDescription(enhancedSpec);
50
+ if (verbose) {
51
+ console.log(`📝 Generated description: ${description.length} characters`);
52
+ }
53
+ if (dryRun) {
54
+ console.log('🔍 DRY RUN - Would create/update feature with:');
55
+ console.log(` Title: ${baseSpec.title}`);
56
+ console.log(` Description length: ${description.length}`);
57
+ return {
58
+ success: true,
59
+ action: 'no-change',
60
+ tasksLinked: taskMapping?.tasks.length || 0
61
+ };
62
+ }
63
+ // 5. Create or update ADO feature
64
+ if (!organization || !project) {
65
+ return {
66
+ success: false,
67
+ action: 'error',
68
+ error: 'Azure DevOps organization/project not specified',
69
+ };
70
+ }
71
+ // Create a sync profile for the ADO client
72
+ const profile = {
73
+ provider: 'ado',
74
+ displayName: `${organization}/${project}`,
75
+ config: {
76
+ organization,
77
+ project
78
+ },
79
+ timeRange: { default: '1M', max: '6M' }
80
+ };
81
+ const pat = process.env.AZURE_DEVOPS_PAT || '';
82
+ const client = new AdoClientV2(profile, pat);
83
+ // Check if feature already exists
84
+ const existingFeature = await findExistingFeature(client, baseSpec.identifier.compact);
85
+ let result;
86
+ if (existingFeature) {
87
+ // Update existing feature
88
+ await client.updateWorkItem(existingFeature.id, {
89
+ title: `[${baseSpec.identifier.compact}] ${baseSpec.title}`,
90
+ description
91
+ });
92
+ result = {
93
+ success: true,
94
+ action: 'updated',
95
+ featureId: existingFeature.id,
96
+ featureUrl: `https://dev.azure.com/${organization}/${project}/_workitems/edit/${existingFeature.id}`,
97
+ tasksLinked: taskMapping?.tasks.length || 0
98
+ };
99
+ }
100
+ else {
101
+ // Create new feature (using createEpic which creates Feature work item type)
102
+ const feature = await client.createEpic({
103
+ title: `[${baseSpec.identifier.compact}] ${baseSpec.title}`,
104
+ description,
105
+ tags: ['spec', 'external-tool-sync']
106
+ });
107
+ result = {
108
+ success: true,
109
+ action: 'created',
110
+ featureId: feature.id,
111
+ featureUrl: `https://dev.azure.com/${organization}/${project}/_workitems/edit/${feature.id}`,
112
+ tasksLinked: taskMapping?.tasks.length || 0
113
+ };
114
+ }
115
+ if (verbose) {
116
+ console.log(`✅ ${result.action === 'created' ? 'Created' : 'Updated'} feature #${result.featureId}`);
117
+ }
118
+ return result;
119
+ }
120
+ catch (error) {
121
+ return {
122
+ success: false,
123
+ action: 'error',
124
+ error: error.message
125
+ };
126
+ }
127
+ }
128
+ // Helper functions
129
+ async function findSpecWeaveRoot(specPath) {
130
+ let currentDir = path.dirname(specPath);
131
+ while (true) {
132
+ const specweaveDir = path.join(currentDir, '.specweave');
133
+ try {
134
+ await fs.access(specweaveDir);
135
+ return currentDir;
136
+ }
137
+ catch {
138
+ const parentDir = path.dirname(currentDir);
139
+ if (parentDir === currentDir) {
140
+ throw new Error('.specweave directory not found');
141
+ }
142
+ currentDir = parentDir;
143
+ }
144
+ }
145
+ }
146
+ function buildTaskMapping(increments, organization, project) {
147
+ if (increments.length === 0)
148
+ return undefined;
149
+ const firstIncrement = increments[0];
150
+ const tasks = firstIncrement.tasks.map((task) => ({
151
+ id: task.id,
152
+ title: task.title,
153
+ userStories: task.userStories
154
+ }));
155
+ return {
156
+ incrementId: firstIncrement.id,
157
+ tasks,
158
+ tasksUrl: `https://dev.azure.com/${organization}/${project}/_git/repo?path=/.specweave/increments/${firstIncrement.id}/tasks.md`
159
+ };
160
+ }
161
+ async function findArchitectureDocs(rootDir, specId) {
162
+ const docs = [];
163
+ const archDir = path.join(rootDir, '.specweave/docs/internal/architecture');
164
+ try {
165
+ const adrDir = path.join(archDir, 'adr');
166
+ try {
167
+ const adrs = await fs.readdir(adrDir);
168
+ const relatedAdrs = adrs.filter(file => file.includes(specId.replace('spec-', '')));
169
+ for (const adr of relatedAdrs) {
170
+ docs.push({
171
+ type: 'adr',
172
+ path: path.join(adrDir, adr),
173
+ title: adr.replace('.md', '').replace(/-/g, ' ')
174
+ });
175
+ }
176
+ }
177
+ catch { }
178
+ }
179
+ catch { }
180
+ return docs;
181
+ }
182
+ async function findExistingFeature(client, specId) {
183
+ try {
184
+ const features = await client.queryWorkItems(`[System.Title] Contains '[${specId}]' AND [System.WorkItemType] = 'Feature'`);
185
+ return features[0] || null;
186
+ }
187
+ catch {
188
+ return null;
189
+ }
190
+ }
191
+ //# sourceMappingURL=enhanced-ado-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhanced-ado-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-ado/lib/enhanced-ado-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Epic Content Builder - Hierarchical GitHub issue content for Feature Specs
3
+ *
4
+ * Architecture:
5
+ * - Reads FS-* folder (FEATURE.md + us-*.md files)
6
+ * - Reads increment tasks.md files to map tasks to user stories
7
+ * - Generates hierarchical issue body:
8
+ * 1. User Stories section (with status + increment)
9
+ * 2. Tasks section (grouped by User Story)
10
+ *
11
+ * Key Features:
12
+ * - NO single "Increment" field (epics span multiple increments)
13
+ * - User Stories are checkable with status and increment link
14
+ * - Tasks grouped under their User Story
15
+ * - Shows which increment each US/task belongs to
16
+ */
17
+ export declare class EpicContentBuilder {
18
+ private epicFolder;
19
+ private projectRoot;
20
+ constructor(epicFolder: string, projectRoot: string);
21
+ /**
22
+ * Build hierarchical GitHub issue body
23
+ *
24
+ * Format:
25
+ * - Epic overview
26
+ * - User Stories section (checkable, with status + increment)
27
+ * - Tasks section (grouped by User Story)
28
+ */
29
+ buildIssueBody(): Promise<string>;
30
+ /**
31
+ * Read Epic FEATURE.md frontmatter
32
+ */
33
+ private readEpicMetadata;
34
+ /**
35
+ * Read all user stories from us-*.md files
36
+ */
37
+ private readUserStories;
38
+ /**
39
+ * Extract tasks for a user story from its Implementation section
40
+ */
41
+ private extractTasksForUserStory;
42
+ /**
43
+ * Build overview section
44
+ */
45
+ private buildOverviewSection;
46
+ /**
47
+ * Build User Stories section
48
+ */
49
+ private buildUserStoriesSection;
50
+ /**
51
+ * Build Tasks section (grouped by User Story)
52
+ */
53
+ private buildTasksSection;
54
+ /**
55
+ * Normalize status values
56
+ */
57
+ private normalizeStatus;
58
+ /**
59
+ * Get status emoji
60
+ */
61
+ private getStatusEmoji;
62
+ }
63
+ //# sourceMappingURL=epic-content-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epic-content-builder.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/epic-content-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAuCH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;gBAEhB,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAKnD;;;;;;;OAOG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAgBvC;;OAEG;YACW,gBAAgB;IAY9B;;OAEG;YACW,eAAe;IA0C7B;;OAEG;YACW,wBAAwB;IAoEtC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAoB/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,cAAc;CAgBvB"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Epic Content Builder - Hierarchical GitHub issue content for Feature Specs
3
+ *
4
+ * Architecture:
5
+ * - Reads FS-* folder (FEATURE.md + us-*.md files)
6
+ * - Reads increment tasks.md files to map tasks to user stories
7
+ * - Generates hierarchical issue body:
8
+ * 1. User Stories section (with status + increment)
9
+ * 2. Tasks section (grouped by User Story)
10
+ *
11
+ * Key Features:
12
+ * - NO single "Increment" field (epics span multiple increments)
13
+ * - User Stories are checkable with status and increment link
14
+ * - Tasks grouped under their User Story
15
+ * - Shows which increment each US/task belongs to
16
+ */
17
+ import { readdir, readFile } from 'fs/promises';
18
+ import { existsSync } from 'fs';
19
+ import * as path from 'path';
20
+ import * as yaml from 'yaml';
21
+ export class EpicContentBuilder {
22
+ constructor(epicFolder, projectRoot) {
23
+ this.epicFolder = epicFolder;
24
+ this.projectRoot = projectRoot;
25
+ }
26
+ /**
27
+ * Build hierarchical GitHub issue body
28
+ *
29
+ * Format:
30
+ * - Epic overview
31
+ * - User Stories section (checkable, with status + increment)
32
+ * - Tasks section (grouped by User Story)
33
+ */
34
+ async buildIssueBody() {
35
+ // 1. Read Epic metadata
36
+ const epicData = await this.readEpicMetadata();
37
+ // 2. Read User Stories
38
+ const userStories = await this.readUserStories();
39
+ // 3. Build sections
40
+ const overview = this.buildOverviewSection(epicData);
41
+ const userStoriesSection = this.buildUserStoriesSection(userStories);
42
+ const tasksSection = this.buildTasksSection(userStories);
43
+ // 4. Combine
44
+ return `${overview}\n\n---\n\n${userStoriesSection}\n\n---\n\n${tasksSection}\n\n---\n\n🤖 Auto-created by SpecWeave Epic Sync`;
45
+ }
46
+ /**
47
+ * Read Epic FEATURE.md frontmatter
48
+ */
49
+ async readEpicMetadata() {
50
+ const featurePath = path.join(this.epicFolder, 'FEATURE.md');
51
+ const content = await readFile(featurePath, 'utf-8');
52
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
53
+ if (!match) {
54
+ throw new Error('FEATURE.md missing YAML frontmatter');
55
+ }
56
+ return yaml.parse(match[1]);
57
+ }
58
+ /**
59
+ * Read all user stories from us-*.md files
60
+ */
61
+ async readUserStories() {
62
+ const files = await readdir(this.epicFolder);
63
+ const usFiles = files.filter((f) => f.startsWith('us-') && f.endsWith('.md'));
64
+ const userStories = [];
65
+ for (const file of usFiles.sort()) {
66
+ const filePath = path.join(this.epicFolder, file);
67
+ const content = await readFile(filePath, 'utf-8');
68
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
69
+ if (!match) {
70
+ console.warn(` ⚠️ ${file} missing frontmatter, skipping`);
71
+ continue;
72
+ }
73
+ const frontmatter = yaml.parse(match[1]);
74
+ const bodyContent = content.slice(match[0].length).trim();
75
+ // Extract increment from Implementation section
76
+ const incrementMatch = bodyContent.match(/\*\*Increment\*\*:\s*\[([^\]]+)\]/);
77
+ const increment = incrementMatch ? incrementMatch[1] : null;
78
+ // Extract tasks from Implementation section
79
+ const tasks = await this.extractTasksForUserStory(frontmatter.id, increment, bodyContent);
80
+ userStories.push({
81
+ id: frontmatter.id,
82
+ title: frontmatter.title,
83
+ status: this.normalizeStatus(frontmatter.status),
84
+ increment,
85
+ tasks,
86
+ });
87
+ }
88
+ return userStories;
89
+ }
90
+ /**
91
+ * Extract tasks for a user story from its Implementation section
92
+ */
93
+ async extractTasksForUserStory(userStoryId, incrementId, content) {
94
+ if (!incrementId) {
95
+ return []; // No increment yet, no tasks
96
+ }
97
+ // Find increment folder
98
+ const incrementFolder = path.join(this.projectRoot, '.specweave', 'increments', incrementId);
99
+ if (!existsSync(incrementFolder)) {
100
+ console.warn(` ⚠️ Increment folder not found: ${incrementId}`);
101
+ return [];
102
+ }
103
+ const tasksPath = path.join(incrementFolder, 'tasks.md');
104
+ if (!existsSync(tasksPath)) {
105
+ console.warn(` ⚠️ tasks.md not found in ${incrementId}`);
106
+ return [];
107
+ }
108
+ // Read tasks.md
109
+ const tasksContent = await readFile(tasksPath, 'utf-8');
110
+ // Extract task links from user story's Implementation section
111
+ // Format: - [T-001: Title](link#t-001-title)
112
+ const taskLinkPattern = /- \[([T-\d]+):\s*([^\]]+)\]/g;
113
+ const taskLinks = [];
114
+ let match;
115
+ while ((match = taskLinkPattern.exec(content)) !== null) {
116
+ taskLinks.push({
117
+ id: match[1], // e.g., "T-001"
118
+ title: match[2].trim(),
119
+ });
120
+ }
121
+ // Parse tasks from tasks.md to get completion status
122
+ const tasks = [];
123
+ for (const taskLink of taskLinks) {
124
+ // Find task in tasks.md by heading pattern: ### T-001: Title
125
+ const taskPattern = new RegExp(`###\\s+${taskLink.id}:\\s*([^\\n]+)[\\s\\S]*?\\*\\*Status\\*\\*:\\s*\\[([x\\s])\\]`, 'i');
126
+ const taskMatch = tasksContent.match(taskPattern);
127
+ const isCompleted = taskMatch ? taskMatch[2] === 'x' : false;
128
+ tasks.push({
129
+ id: taskLink.id,
130
+ title: taskLink.title,
131
+ status: isCompleted,
132
+ userStoryId,
133
+ });
134
+ }
135
+ return tasks;
136
+ }
137
+ /**
138
+ * Build overview section
139
+ */
140
+ buildOverviewSection(epic) {
141
+ return `# [${epic.id}] ${epic.title}\n\n**Status**: ${epic.status}\n**Created**: ${epic.created}\n**Last Updated**: ${epic.last_updated}`;
142
+ }
143
+ /**
144
+ * Build User Stories section
145
+ */
146
+ buildUserStoriesSection(userStories) {
147
+ const total = userStories.length;
148
+ const completed = userStories.filter((us) => us.status === 'complete').length;
149
+ const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
150
+ let section = `## User Stories\n\nProgress: ${completed}/${total} user stories complete (${percentage}%)\n\n`;
151
+ for (const us of userStories) {
152
+ const checkbox = us.status === 'complete' ? '[x]' : '[ ]';
153
+ const statusEmoji = this.getStatusEmoji(us.status);
154
+ const incrementLink = us.increment
155
+ ? `[${us.increment}](../../increments/${us.increment}/)`
156
+ : 'TBD';
157
+ section += `- ${checkbox} **${us.id}: ${us.title}** (${statusEmoji} ${us.status} | Increment: ${incrementLink})\n`;
158
+ }
159
+ return section;
160
+ }
161
+ /**
162
+ * Build Tasks section (grouped by User Story)
163
+ */
164
+ buildTasksSection(userStories) {
165
+ const totalTasks = userStories.reduce((sum, us) => sum + us.tasks.length, 0);
166
+ const completedTasks = userStories.reduce((sum, us) => sum + us.tasks.filter((t) => t.status).length, 0);
167
+ const percentage = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;
168
+ let section = `## Tasks by User Story\n\nProgress: ${completedTasks}/${totalTasks} tasks complete (${percentage}%)\n\n`;
169
+ for (const us of userStories) {
170
+ if (us.tasks.length === 0) {
171
+ continue; // Skip user stories with no tasks yet
172
+ }
173
+ const incrementLink = us.increment
174
+ ? `[${us.increment}](../../increments/${us.increment}/tasks.md)`
175
+ : 'TBD';
176
+ section += `### ${us.id}: ${us.title} (Increment: ${incrementLink})\n\n`;
177
+ for (const task of us.tasks) {
178
+ const checkbox = task.status ? '[x]' : '[ ]';
179
+ section += `- ${checkbox} ${task.id}: ${task.title}\n`;
180
+ }
181
+ section += '\n';
182
+ }
183
+ return section;
184
+ }
185
+ /**
186
+ * Normalize status values
187
+ */
188
+ normalizeStatus(status) {
189
+ const normalized = status.toLowerCase();
190
+ if (normalized === 'complete' || normalized === 'completed')
191
+ return 'complete';
192
+ if (normalized === 'active' || normalized === 'in-progress')
193
+ return 'active';
194
+ if (normalized === 'planning')
195
+ return 'planning';
196
+ return 'not-started';
197
+ }
198
+ /**
199
+ * Get status emoji
200
+ */
201
+ getStatusEmoji(status) {
202
+ switch (status) {
203
+ case 'complete':
204
+ return '✅';
205
+ case 'active':
206
+ return '🚧';
207
+ case 'planning':
208
+ return '📋';
209
+ case 'not-started':
210
+ return '⏳';
211
+ default:
212
+ return '❓';
213
+ }
214
+ }
215
+ }
216
+ //# sourceMappingURL=epic-content-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epic-content-builder.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/epic-content-builder.ts"],"names":[],"mappings":"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"}
@@ -64,11 +64,11 @@ export declare class GitHubEpicSync {
64
64
  */
65
65
  private updateMilestone;
66
66
  /**
67
- * Create GitHub Issue for increment with FULL DUPLICATE PROTECTION
67
+ * Create GitHub Issue for Epic with hierarchical content (US → Tasks)
68
68
  */
69
69
  private createIssue;
70
70
  /**
71
- * Update GitHub Issue for increment
71
+ * Update GitHub Issue for Epic with hierarchical content (US → Tasks)
72
72
  */
73
73
  private updateIssue;
74
74
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"github-epic-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/github-epic-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAgEvD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM;IAKpD;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAC9C,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;IAwIF;;;;;;;;OAQG;YACW,YAAY;IA8D1B;;;;;;;;;OASG;YACW,iBAAiB;IAgE/B;;OAEG;YACW,cAAc;IAe5B;;OAEG;YACW,eAAe;IAc7B;;OAEG;YACW,kBAAkB;IAyChC;;OAEG;YACW,eAAe;IAqC7B;;OAEG;YACW,eAAe;IA4B7B;;OAEG;YACW,WAAW;IAuCzB;;OAEG;YACW,WAAW;IAiCzB;;OAEG;YACW,gBAAgB;IAuB9B;;OAEG;YACW,2BAA2B;CAuD1C"}
1
+ {"version":3,"file":"github-epic-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/github-epic-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAiEvD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM;IAKpD;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAC9C,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;IAwIF;;;;;;;;OAQG;YACW,YAAY;IA8D1B;;;;;;;;;OASG;YACW,iBAAiB;IAgE/B;;OAEG;YACW,cAAc;IAe5B;;OAEG;YACW,eAAe;IAc7B;;OAEG;YACW,kBAAkB;IAyChC;;OAEG;YACW,eAAe;IAqC7B;;OAEG;YACW,eAAe;IA4B7B;;OAEG;YACW,WAAW;IAmDzB;;OAEG;YACW,WAAW;IA6CzB;;OAEG;YACW,gBAAgB;IAuB9B;;OAEG;YACW,2BAA2B;CAuD1C"}