specweave 0.17.19 → 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.
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +6 -65
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +6 -8
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +117 -78
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -1
- package/dist/src/core/types/config.d.ts +0 -20
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js +0 -7
- package/dist/src/core/types/config.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/hooks/hooks.json +0 -4
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
- package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +1 -1
- package/plugins/specweave-ado/lib/ado-spec-content-sync.js +5 -49
- package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +6 -72
- package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +1 -1
- package/plugins/specweave-github/commands/specweave-github-sync-epic.md +1 -1
- package/plugins/specweave-github/commands/specweave-github-sync-spec.md +1 -1
- package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +1 -1
- package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +1 -1
- package/plugins/specweave-jira/lib/{enhanced-jira-sync.ts → enhanced-jira-sync.ts.disabled} +52 -26
- package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
- package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
- package/dist/src/core/deduplication/command-deduplicator.d.ts +0 -166
- package/dist/src/core/deduplication/command-deduplicator.d.ts.map +0 -1
- package/dist/src/core/deduplication/command-deduplicator.js +0 -254
- package/dist/src/core/deduplication/command-deduplicator.js.map +0 -1
- package/plugins/specweave/hooks/pre-command-deduplication.sh +0 -86
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +0 -134
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ado-spec-content-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-ado/lib/ado-spec-content-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAOL,iBAAiB,EAClB,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"ado-spec-content-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-ado/lib/ado-spec-content-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAOL,iBAAiB,EAClB,MAAM,wCAAwC,CAAC;AAKhD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CA0C5B;AA4ND;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAShF"}
|
|
@@ -9,9 +9,8 @@
|
|
|
9
9
|
* - State (New/Active/Resolved/Closed): ADO → SpecWeave (we read)
|
|
10
10
|
*/
|
|
11
11
|
import { parseSpecContent, detectContentChanges, hasExternalLink, updateSpecWithExternalLink, } from '../../../src/core/spec-content-sync.js';
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import * as fs from 'fs/promises';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import fs from 'fs/promises';
|
|
15
14
|
/**
|
|
16
15
|
* Sync spec content to ADO feature
|
|
17
16
|
* Creates feature if it doesn't exist, updates if it does
|
|
@@ -58,11 +57,9 @@ export async function syncSpecContentToAdo(options) {
|
|
|
58
57
|
async function createAdoFeature(client, spec, options) {
|
|
59
58
|
const { specPath, dryRun, verbose } = options;
|
|
60
59
|
try {
|
|
61
|
-
// Get task mappings (if available)
|
|
62
|
-
const tasks = await getTaskMappings(specPath, spec.id);
|
|
63
60
|
// Build feature title and description
|
|
64
61
|
const title = `[${spec.id.toUpperCase()}] ${spec.title}`;
|
|
65
|
-
const description = buildAdoDescription(spec
|
|
62
|
+
const description = buildAdoDescription(spec);
|
|
66
63
|
if (verbose) {
|
|
67
64
|
console.log(`\n📝 Creating ADO feature:`);
|
|
68
65
|
console.log(` Title: ${title}`);
|
|
@@ -141,11 +138,9 @@ async function updateAdoFeature(client, spec, workItemId, options) {
|
|
|
141
138
|
console.log(` - ${change}`);
|
|
142
139
|
}
|
|
143
140
|
}
|
|
144
|
-
// Get task mappings (if available)
|
|
145
|
-
const tasks = await getTaskMappings(specPath, spec.id);
|
|
146
141
|
// Build updated content
|
|
147
142
|
const newTitle = `[${spec.id.toUpperCase()}] ${spec.title}`;
|
|
148
|
-
const newDescription = buildAdoDescription(spec
|
|
143
|
+
const newDescription = buildAdoDescription(spec);
|
|
149
144
|
if (dryRun) {
|
|
150
145
|
console.log('\n🔍 Dry run - would update feature:');
|
|
151
146
|
console.log(` Title: ${newTitle}`);
|
|
@@ -183,10 +178,10 @@ async function updateAdoFeature(client, spec, workItemId, options) {
|
|
|
183
178
|
}
|
|
184
179
|
}
|
|
185
180
|
/**
|
|
186
|
-
* Build ADO description from spec content
|
|
181
|
+
* Build ADO description from spec content
|
|
187
182
|
* ADO supports HTML in description
|
|
188
183
|
*/
|
|
189
|
-
function buildAdoDescription(spec
|
|
184
|
+
function buildAdoDescription(spec) {
|
|
190
185
|
let html = '';
|
|
191
186
|
// Add spec description
|
|
192
187
|
if (spec.description) {
|
|
@@ -207,66 +202,12 @@ function buildAdoDescription(spec, tasks) {
|
|
|
207
202
|
}
|
|
208
203
|
}
|
|
209
204
|
}
|
|
210
|
-
// Add task mappings (if provided)
|
|
211
|
-
if (tasks && tasks.length > 0) {
|
|
212
|
-
html += '<h2>Implementation Tasks</h2>';
|
|
213
|
-
html += '<ul>';
|
|
214
|
-
for (const task of tasks) {
|
|
215
|
-
html += `<li><strong>${task.id}</strong>: ${escapeHtml(task.title)}`;
|
|
216
|
-
if (task.userStories && task.userStories.length > 0) {
|
|
217
|
-
html += ` (${task.userStories.join(', ')})`;
|
|
218
|
-
}
|
|
219
|
-
html += '</li>';
|
|
220
|
-
}
|
|
221
|
-
html += '</ul>';
|
|
222
|
-
}
|
|
223
205
|
// Add metadata
|
|
224
206
|
if (spec.metadata.priority) {
|
|
225
207
|
html += `<p><strong>Priority:</strong> ${spec.metadata.priority}</p>`;
|
|
226
208
|
}
|
|
227
209
|
return html;
|
|
228
210
|
}
|
|
229
|
-
/**
|
|
230
|
-
* Get task mappings for a spec (if available)
|
|
231
|
-
*/
|
|
232
|
-
async function getTaskMappings(specPath, specId) {
|
|
233
|
-
try {
|
|
234
|
-
// Find SpecWeave root
|
|
235
|
-
const rootDir = await findSpecWeaveRoot(specPath);
|
|
236
|
-
// Use SpecIncrementMapper to get task mappings
|
|
237
|
-
const mapper = new SpecIncrementMapper(rootDir);
|
|
238
|
-
const mapping = await mapper.mapSpecToIncrements(specId);
|
|
239
|
-
if (mapping.increments.length > 0) {
|
|
240
|
-
// Return tasks from the first (most recent) increment
|
|
241
|
-
return mapping.increments[0].tasks;
|
|
242
|
-
}
|
|
243
|
-
return undefined;
|
|
244
|
-
}
|
|
245
|
-
catch (error) {
|
|
246
|
-
// If mapping fails, just return undefined (not critical)
|
|
247
|
-
return undefined;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Find SpecWeave root directory from spec path
|
|
252
|
-
*/
|
|
253
|
-
async function findSpecWeaveRoot(specPath) {
|
|
254
|
-
let currentDir = path.dirname(specPath);
|
|
255
|
-
while (true) {
|
|
256
|
-
const specweaveDir = path.join(currentDir, '.specweave');
|
|
257
|
-
try {
|
|
258
|
-
await fs.access(specweaveDir);
|
|
259
|
-
return currentDir;
|
|
260
|
-
}
|
|
261
|
-
catch {
|
|
262
|
-
const parentDir = path.dirname(currentDir);
|
|
263
|
-
if (parentDir === currentDir) {
|
|
264
|
-
throw new Error('.specweave directory not found');
|
|
265
|
-
}
|
|
266
|
-
currentDir = parentDir;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
211
|
/**
|
|
271
212
|
* Escape HTML special characters
|
|
272
213
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ado-spec-content-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-ado/lib/ado-spec-content-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EAEpB,eAAe,EACf,0BAA0B,GAG3B,MAAM,wCAAwC,CAAC;AAEhD,OAAO,
|
|
1
|
+
{"version":3,"file":"ado-spec-content-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-ado/lib/ado-spec-content-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Enhanced JIRA Spec Content Sync
|
|
3
3
|
*
|
|
4
|
-
* Uses EnhancedContentBuilder
|
|
5
|
-
*
|
|
6
|
-
* NOTE: This version focuses on enhanced content building.
|
|
7
|
-
* Actual JIRA API integration requires jira-spec-sync.ts
|
|
4
|
+
* Uses EnhancedContentBuilder for rich epic descriptions.
|
|
5
|
+
* NEW (v0.21.0): Supports task checkboxes (Jira format) and automatic labeling.
|
|
8
6
|
*/
|
|
9
7
|
export interface EnhancedJiraSyncOptions {
|
|
10
8
|
specPath: string;
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
projectKey: string;
|
|
10
|
+
domain: string;
|
|
13
11
|
dryRun?: boolean;
|
|
14
12
|
verbose?: boolean;
|
|
15
13
|
}
|
|
@@ -22,7 +20,7 @@ export interface EnhancedJiraSyncResult {
|
|
|
22
20
|
tasksLinked?: number;
|
|
23
21
|
}
|
|
24
22
|
/**
|
|
25
|
-
*
|
|
23
|
+
* Sync spec to Jira with enhanced content including task checkboxes
|
|
26
24
|
*/
|
|
27
|
-
export declare function
|
|
25
|
+
export declare function syncSpecWithEnhancedContent(options: EnhancedJiraSyncOptions): Promise<EnhancedJiraSyncResult>;
|
|
28
26
|
//# sourceMappingURL=enhanced-jira-sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enhanced-jira-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/enhanced-jira-sync.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"enhanced-jira-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/enhanced-jira-sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CA8KjC"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Enhanced JIRA Spec Content Sync
|
|
3
3
|
*
|
|
4
|
-
* Uses EnhancedContentBuilder
|
|
5
|
-
*
|
|
6
|
-
* NOTE: This version focuses on enhanced content building.
|
|
7
|
-
* Actual JIRA API integration requires jira-spec-sync.ts
|
|
4
|
+
* Uses EnhancedContentBuilder for rich epic descriptions.
|
|
5
|
+
* NEW (v0.21.0): Supports task checkboxes (Jira format) and automatic labeling.
|
|
8
6
|
*/
|
|
7
|
+
import { JiraClient } from '../../../src/integrations/jira/jira-client.js';
|
|
9
8
|
import { EnhancedContentBuilder } from '../../../src/core/sync/enhanced-content-builder.js';
|
|
10
9
|
import { SpecIncrementMapper } from '../../../src/core/sync/spec-increment-mapper.js';
|
|
11
10
|
import { parseSpecContent } from '../../../src/core/spec-content-sync.js';
|
|
12
|
-
import
|
|
13
|
-
import
|
|
11
|
+
import { LabelDetector } from '../../../src/core/sync/label-detector.js';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import fs from 'fs/promises';
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* Sync spec to Jira with enhanced content including task checkboxes
|
|
16
16
|
*/
|
|
17
|
-
export async function
|
|
18
|
-
const { specPath,
|
|
17
|
+
export async function syncSpecWithEnhancedContent(options) {
|
|
18
|
+
const { specPath, projectKey, domain, dryRun = false, verbose = false } = options;
|
|
19
19
|
try {
|
|
20
20
|
// 1. Parse spec content
|
|
21
21
|
const baseSpec = await parseSpecContent(specPath);
|
|
@@ -29,63 +29,130 @@ export async function syncSpecToJiraWithEnhancedContent(options) {
|
|
|
29
29
|
if (verbose) {
|
|
30
30
|
console.log(`📄 Parsed spec: ${baseSpec.identifier.compact}`);
|
|
31
31
|
}
|
|
32
|
-
// 2. Build
|
|
32
|
+
// 2. Build task mapping
|
|
33
33
|
const specId = baseSpec.identifier.full || baseSpec.identifier.compact;
|
|
34
34
|
const rootDir = await findSpecWeaveRoot(specPath);
|
|
35
35
|
const mapper = new SpecIncrementMapper(rootDir);
|
|
36
36
|
const mapping = await mapper.mapSpecToIncrements(specId);
|
|
37
37
|
if (verbose) {
|
|
38
38
|
console.log(`🔗 Found ${mapping.increments.length} related increments`);
|
|
39
|
+
console.log(`📋 Mapped ${Object.keys(mapping.userStoryMappings).length} user stories to tasks`);
|
|
39
40
|
}
|
|
40
|
-
// 3. Build
|
|
41
|
-
const taskMapping =
|
|
42
|
-
|
|
41
|
+
// 3. Build task mapping
|
|
42
|
+
const taskMapping = {
|
|
43
|
+
incrementId: mapping.increments[0]?.id || '',
|
|
44
|
+
tasks: mapping.increments[0]?.tasks.map(t => ({
|
|
45
|
+
id: t.id,
|
|
46
|
+
title: t.title,
|
|
47
|
+
userStories: t.userStories,
|
|
48
|
+
jiraIssue: t.jiraIssue,
|
|
49
|
+
completed: t.status === 'completed',
|
|
50
|
+
status: t.status
|
|
51
|
+
})) || [],
|
|
52
|
+
tasksUrl: `https://github.com/owner/repo/blob/develop/.specweave/increments/${mapping.increments[0]?.id}/tasks.md`
|
|
53
|
+
};
|
|
54
|
+
// 4. Build enhanced spec
|
|
43
55
|
const enhancedSpec = {
|
|
44
56
|
...baseSpec,
|
|
45
57
|
summary: baseSpec.description,
|
|
46
58
|
taskMapping,
|
|
47
|
-
architectureDocs
|
|
59
|
+
architectureDocs: [],
|
|
60
|
+
sourceLinks: {
|
|
61
|
+
spec: specPath,
|
|
62
|
+
plan: path.join(path.dirname(specPath), 'plan.md'),
|
|
63
|
+
tasks: path.join(path.dirname(specPath), 'tasks.md')
|
|
64
|
+
}
|
|
48
65
|
};
|
|
49
|
-
//
|
|
66
|
+
// 5. Build Jira description with task checkboxes
|
|
50
67
|
const builder = new EnhancedContentBuilder();
|
|
51
|
-
const
|
|
68
|
+
const sections = [];
|
|
69
|
+
// Summary
|
|
70
|
+
sections.push(builder.buildSummarySection(enhancedSpec));
|
|
71
|
+
// User stories
|
|
72
|
+
if (enhancedSpec.userStories && enhancedSpec.userStories.length > 0) {
|
|
73
|
+
sections.push(builder.buildUserStoriesSection(enhancedSpec.userStories));
|
|
74
|
+
}
|
|
75
|
+
// Tasks with Jira checkboxes
|
|
76
|
+
if (enhancedSpec.taskMapping) {
|
|
77
|
+
sections.push(builder.buildTasksSection(enhancedSpec.taskMapping, {
|
|
78
|
+
showCheckboxes: true,
|
|
79
|
+
showProgressBar: true,
|
|
80
|
+
showCompletionStatus: false, // Jira doesn't need emoji
|
|
81
|
+
provider: 'jira'
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
// Source links
|
|
85
|
+
if (enhancedSpec.sourceLinks) {
|
|
86
|
+
sections.push(builder.buildSourceLinksSection(enhancedSpec.sourceLinks));
|
|
87
|
+
}
|
|
88
|
+
const description = sections.filter(s => s.length > 0).join('\n\n---\n\n');
|
|
52
89
|
if (verbose) {
|
|
53
|
-
console.log(`📝 Generated description: ${description.length} characters`);
|
|
90
|
+
console.log(`📝 Generated Jira description: ${description.length} characters`);
|
|
91
|
+
}
|
|
92
|
+
// 6. Detect labels
|
|
93
|
+
const labelDetector = new LabelDetector();
|
|
94
|
+
const detection = labelDetector.detectType(await fs.readFile(specPath, 'utf-8'), mapping.increments[0]?.id);
|
|
95
|
+
const jiraLabels = labelDetector.getJiraLabels(detection.type);
|
|
96
|
+
if (verbose) {
|
|
97
|
+
console.log(`🏷️ Detected type: ${detection.type} (${detection.confidence}% confidence)`);
|
|
98
|
+
console.log(` Labels: ${jiraLabels.join(', ')}`);
|
|
54
99
|
}
|
|
55
100
|
if (dryRun) {
|
|
56
|
-
console.log('🔍 DRY RUN - Would create/update epic with:');
|
|
57
|
-
console.log(`
|
|
101
|
+
console.log('🔍 DRY RUN - Would create/update Jira epic with:');
|
|
102
|
+
console.log(` Title: ${baseSpec.title}`);
|
|
58
103
|
console.log(` Description length: ${description.length}`);
|
|
104
|
+
console.log(` Labels: ${jiraLabels.join(', ')}`);
|
|
105
|
+
console.log(` Tasks linked: ${taskMapping.tasks.length}`);
|
|
59
106
|
return {
|
|
60
107
|
success: true,
|
|
61
108
|
action: 'no-change',
|
|
62
|
-
tasksLinked: taskMapping
|
|
109
|
+
tasksLinked: taskMapping.tasks.length
|
|
63
110
|
};
|
|
64
111
|
}
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
112
|
+
// 7. Create or update Jira epic
|
|
113
|
+
const client = new JiraClient(domain, projectKey);
|
|
114
|
+
// Check if epic exists (search by summary containing spec ID)
|
|
115
|
+
const existingEpic = await findExistingEpic(client, baseSpec.identifier.compact);
|
|
116
|
+
let result;
|
|
117
|
+
if (existingEpic) {
|
|
118
|
+
// Update existing epic
|
|
119
|
+
await client.updateIssue(existingEpic.key, {
|
|
120
|
+
fields: {
|
|
121
|
+
description,
|
|
122
|
+
labels: jiraLabels
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
result = {
|
|
126
|
+
success: true,
|
|
127
|
+
action: 'updated',
|
|
128
|
+
epicKey: existingEpic.key,
|
|
129
|
+
epicUrl: `https://${domain}.atlassian.net/browse/${existingEpic.key}`,
|
|
130
|
+
tasksLinked: taskMapping.tasks.length
|
|
71
131
|
};
|
|
72
132
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
result
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
133
|
+
else {
|
|
134
|
+
// Create new epic
|
|
135
|
+
const epic = await client.createIssue({
|
|
136
|
+
fields: {
|
|
137
|
+
project: { key: projectKey },
|
|
138
|
+
summary: `[${baseSpec.identifier.compact}] ${baseSpec.title}`,
|
|
139
|
+
description,
|
|
140
|
+
issuetype: { name: 'Epic' },
|
|
141
|
+
labels: jiraLabels
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
result = {
|
|
145
|
+
success: true,
|
|
146
|
+
action: 'created',
|
|
147
|
+
epicKey: epic.key,
|
|
148
|
+
epicUrl: `https://${domain}.atlassian.net/browse/${epic.key}`,
|
|
149
|
+
tasksLinked: taskMapping.tasks.length
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
if (verbose) {
|
|
153
|
+
console.log(`✅ ${result.action === 'created' ? 'Created' : 'Updated'} epic ${result.epicKey}`);
|
|
154
|
+
console.log(` URL: ${result.epicUrl}`);
|
|
155
|
+
console.log(` Tasks linked: ${result.tasksLinked}`);
|
|
89
156
|
}
|
|
90
157
|
return result;
|
|
91
158
|
}
|
|
@@ -97,7 +164,7 @@ export async function syncSpecToJiraWithEnhancedContent(options) {
|
|
|
97
164
|
};
|
|
98
165
|
}
|
|
99
166
|
}
|
|
100
|
-
// Helper functions
|
|
167
|
+
// Helper functions
|
|
101
168
|
async function findSpecWeaveRoot(specPath) {
|
|
102
169
|
let currentDir = path.dirname(specPath);
|
|
103
170
|
while (true) {
|
|
@@ -115,42 +182,14 @@ async function findSpecWeaveRoot(specPath) {
|
|
|
115
182
|
}
|
|
116
183
|
}
|
|
117
184
|
}
|
|
118
|
-
function
|
|
119
|
-
if (increments.length === 0)
|
|
120
|
-
return undefined;
|
|
121
|
-
const firstIncrement = increments[0];
|
|
122
|
-
const tasks = firstIncrement.tasks.map((task) => ({
|
|
123
|
-
id: task.id,
|
|
124
|
-
title: task.title,
|
|
125
|
-
userStories: task.userStories
|
|
126
|
-
}));
|
|
127
|
-
return {
|
|
128
|
-
incrementId: firstIncrement.id,
|
|
129
|
-
tasks,
|
|
130
|
-
tasksUrl: `tasks.md` // JIRA doesn't support external links in same way
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
async function findArchitectureDocs(rootDir, specId) {
|
|
134
|
-
const docs = [];
|
|
135
|
-
const archDir = path.join(rootDir, '.specweave/docs/internal/architecture');
|
|
185
|
+
async function findExistingEpic(client, specId) {
|
|
136
186
|
try {
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
type: 'adr',
|
|
144
|
-
path: path.join(adrDir, adr),
|
|
145
|
-
title: adr.replace('.md', '').replace(/-/g, ' ')
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
catch { }
|
|
187
|
+
const jql = `project = ${client.projectKey} AND issuetype = Epic AND summary ~ "${specId}"`;
|
|
188
|
+
const results = await client.searchIssues(jql);
|
|
189
|
+
return results.issues && results.issues.length > 0 ? results.issues[0] : null;
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return null;
|
|
150
193
|
}
|
|
151
|
-
catch { }
|
|
152
|
-
return docs;
|
|
153
194
|
}
|
|
154
|
-
// NOTE: findExistingEpic not needed in this simplified version
|
|
155
|
-
// Real JIRA API integration is in jira-spec-sync.ts
|
|
156
195
|
//# sourceMappingURL=enhanced-jira-sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enhanced-jira-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/enhanced-jira-sync.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"enhanced-jira-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/enhanced-jira-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -91,24 +91,6 @@ export interface TestingConfig {
|
|
|
91
91
|
/** Specific coverage targets per test type */
|
|
92
92
|
coverageTargets: CoverageTargets;
|
|
93
93
|
}
|
|
94
|
-
/**
|
|
95
|
-
* Global command deduplication configuration
|
|
96
|
-
*
|
|
97
|
-
* Prevents ANY command/tool from being invoked twice within a configurable time window.
|
|
98
|
-
* Protects against accidental duplicate invocations (router confusion, double-clicks, etc.)
|
|
99
|
-
*/
|
|
100
|
-
export interface DeduplicationConfig {
|
|
101
|
-
/** Enable global deduplication (default: true) */
|
|
102
|
-
enabled?: boolean;
|
|
103
|
-
/** Time window in milliseconds to check for duplicates (default: 1000ms) */
|
|
104
|
-
windowMs?: number;
|
|
105
|
-
/** Maximum cache entries before cleanup (default: 1000) */
|
|
106
|
-
maxCacheSize?: number;
|
|
107
|
-
/** Enable debug logging (default: false) */
|
|
108
|
-
debug?: boolean;
|
|
109
|
-
/** Cleanup interval in milliseconds (default: 60000ms = 1 minute) */
|
|
110
|
-
cleanupIntervalMs?: number;
|
|
111
|
-
}
|
|
112
94
|
/**
|
|
113
95
|
* Complete SpecWeave Configuration
|
|
114
96
|
*
|
|
@@ -129,8 +111,6 @@ export interface SpecweaveConfig {
|
|
|
129
111
|
translation?: TranslationConfig;
|
|
130
112
|
/** WIP limits configuration */
|
|
131
113
|
limits?: LimitsConfig;
|
|
132
|
-
/** Global command deduplication configuration (v0.17.18+) */
|
|
133
|
-
deduplication?: DeduplicationConfig;
|
|
134
114
|
/** Allow additional properties */
|
|
135
115
|
[key: string]: any;
|
|
136
116
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/core/types/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,4EAA4E;IAC5E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,wCAAwC;IACxC,aAAa,CAAC,EAAE;QACd,mEAAmE;QACnE,YAAY,CAAC,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC;QAE1C,yDAAyD;QACzD,eAAe,CAAC,EAAE;YAChB,yDAAyD;YACzD,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC;KACH,CAAC;IAEF,mCAAmC;IACnC,SAAS,CAAC,EAAE;QACV,0CAA0C;QAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,0CAA0C;QAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAE1C,kCAAkC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IAEb,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IAEpB,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,eAAe,EAAE,QAAQ,CAAC;IAE1B,+CAA+C;IAC/C,qBAAqB,EAAE,MAAM,CAAC;IAE9B,8CAA8C;IAC9C,eAAe,EAAE,eAAe,CAAC;CAClC;AAED
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/core/types/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,4EAA4E;IAC5E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,wCAAwC;IACxC,aAAa,CAAC,EAAE;QACd,mEAAmE;QACnE,YAAY,CAAC,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC;QAE1C,yDAAyD;QACzD,eAAe,CAAC,EAAE;YAChB,yDAAyD;YACzD,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC;KACH,CAAC;IAEF,mCAAmC;IACnC,SAAS,CAAC,EAAE;QACV,0CAA0C;QAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,0CAA0C;QAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAE1C,kCAAkC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IAEb,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IAEpB,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,eAAe,EAAE,QAAQ,CAAC;IAE1B,+CAA+C;IAC/C,qBAAqB,EAAE,MAAM,CAAC;IAE9B,8CAA8C;IAC9C,eAAe,EAAE,eAAe,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB,uBAAuB;IACvB,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,aAAa,CAAC;IAEzB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAE7B,oDAAoD;IACpD,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAEhC,+BAA+B;IAC/B,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,kCAAkC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,eAAe,CAyEnD,CAAC"}
|
|
@@ -42,13 +42,6 @@ export const DEFAULT_CONFIG = {
|
|
|
42
42
|
active: 30, // Warn if active >30 days
|
|
43
43
|
},
|
|
44
44
|
},
|
|
45
|
-
deduplication: {
|
|
46
|
-
enabled: true, // v0.17.18+: Prevent duplicate command invocations
|
|
47
|
-
windowMs: 1000, // 1 second window
|
|
48
|
-
maxCacheSize: 1000, // Keep last 1000 invocations
|
|
49
|
-
debug: false, // Disable debug logging
|
|
50
|
-
cleanupIntervalMs: 60000, // Cleanup every minute
|
|
51
|
-
},
|
|
52
45
|
hooks: {
|
|
53
46
|
post_task_completion: {
|
|
54
47
|
sync_living_docs: true, // CRITICAL: Auto-sync living docs after every task
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/core/types/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/core/types/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AA2IxD;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAA6B;IACtD,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE;QACX,SAAS,EAAE,CAAC,IAAI,CAAC;QACjB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,MAAM;QACd,sBAAsB,EAAE,IAAI;KAC7B;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,QAAQ;KAClB;IACD,OAAO,EAAE;QACP,eAAe,EAAE,KAAK;QACtB,qBAAqB,EAAE,EAAE;QACzB,eAAe,EAAE;YACf,IAAI,EAAE,EAAE;YACR,WAAW,EAAE,EAAE;YACf,GAAG,EAAE,EAAE;SACR;KACF;IACD,MAAM,EAAE;QACN,mBAAmB,EAAE,CAAC,EAAS,8CAA8C;QAC7E,OAAO,EAAE,CAAC,EAAqB,+BAA+B;QAC9D,uBAAuB,EAAE,IAAI,EAAE,gCAAgC;QAC/D,aAAa,EAAE;YACb,YAAY,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,iCAAiC;YAC1F,eAAe,EAAE;gBACf,UAAU,EAAE,EAAE,EAAa,iCAAiC;aAC7D;SACF;QACD,SAAS,EAAE;YACT,MAAM,EAAE,CAAC,EAAoB,yBAAyB;YACtD,MAAM,EAAE,EAAE,EAAmB,0BAA0B;SACxD;KACF;IACD,KAAK,EAAE;QACL,oBAAoB,EAAE;YACpB,gBAAgB,EAAE,IAAI,EAAO,mDAAmD;YAChF,aAAa,EAAE,IAAI,EAAU,yCAAyC;YACtE,qBAAqB,EAAE,IAAI,EAAE,wCAAwC;SACtE;KACF;IACD,IAAI,EAAE;QACJ,UAAU,EAAE;YACV,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,kBAAkB,EAAE,iBAAiB;YACrC,QAAQ,EAAE;gBACR,MAAM,EAAE;oBACN,QAAQ,EAAE,MAAM;oBAChB,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE;oBAClD,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE;oBAC7C,SAAS,EAAE,QAAQ;oBACnB,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;iBACpD;gBACD,IAAI,EAAE;oBACJ,QAAQ,EAAE,OAAO;oBACjB,MAAM,EAAE,aAAa;oBACrB,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,MAAM;oBACjB,SAAS,EAAE,WAAW;iBACvB;gBACD,GAAG,EAAE;oBACH,QAAQ,EAAE,KAAK;oBACf,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,QAAQ;oBACnB,SAAS,EAAE,SAAS;iBACrB;aACF;SACF;KACF;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.1",
|
|
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",
|
|
@@ -109,7 +109,7 @@ if [[ ! "$PROVIDER" =~ ^(github|jira|ado)$ ]]; then
|
|
|
109
109
|
fi
|
|
110
110
|
|
|
111
111
|
# Check if sync CLI command exists
|
|
112
|
-
SYNC_CLI="$PROJECT_ROOT/dist/
|
|
112
|
+
SYNC_CLI="$PROJECT_ROOT/dist/cli/commands/sync-spec-content.js"
|
|
113
113
|
if [ ! -f "$SYNC_CLI" ]; then
|
|
114
114
|
echo "ℹ️ Sync CLI not built, skipping spec content sync" >&2
|
|
115
115
|
echo " Run: npm run build" >&2
|
|
@@ -141,7 +141,7 @@ else
|
|
|
141
141
|
echo ""
|
|
142
142
|
echo "⚠️ Spec content sync failed (exit code: $SYNC_EXIT_CODE)" >&2
|
|
143
143
|
echo " This is non-blocking. You can sync manually later:" >&2
|
|
144
|
-
echo " node dist/
|
|
144
|
+
echo " node dist/cli/commands/sync-spec-content.js --spec \"$SPEC_PATH\" --provider $PROVIDER" >&2
|
|
145
145
|
echo ""
|
|
146
146
|
# Non-blocking: continue execution even if sync fails
|
|
147
147
|
fi
|