specweave 0.24.11 → 0.24.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +158 -10
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +28 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +47 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +15 -7
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +13 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/types.d.ts +1 -1
- package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
- package/dist/src/core/config/types.d.ts +46 -12
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js +0 -5
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/repo-structure/repo-bulk-discovery.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-bulk-discovery.js +20 -5
- package/dist/src/core/repo-structure/repo-bulk-discovery.js.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +29 -14
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/sync/format-preservation-sync.d.ts.map +1 -1
- package/dist/src/sync/format-preservation-sync.js +23 -5
- package/dist/src/sync/format-preservation-sync.js.map +1 -1
- package/dist/src/sync/frontmatter-updater.d.ts +57 -0
- package/dist/src/sync/frontmatter-updater.d.ts.map +1 -0
- package/dist/src/sync/frontmatter-updater.js +147 -0
- package/dist/src/sync/frontmatter-updater.js.map +1 -0
- package/dist/src/sync/sync-coordinator.d.ts +22 -1
- package/dist/src/sync/sync-coordinator.d.ts.map +1 -1
- package/dist/src/sync/sync-coordinator.js +268 -21
- package/dist/src/sync/sync-coordinator.js.map +1 -1
- package/dist/src/types/living-docs-us-file.d.ts +18 -0
- package/dist/src/types/living-docs-us-file.d.ts.map +1 -1
- package/dist/src/types/living-docs-us-file.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +17 -11
- package/plugins/specweave/agents/architect/AGENT.md +115 -45
- package/plugins/specweave/agents/test-aware-planner/AGENT.md +76 -6
- package/plugins/specweave/hooks/lib/update-status-line.sh +19 -0
- package/plugins/specweave/hooks/post-edit-write-consolidated.sh +335 -0
- package/plugins/specweave/hooks/post-metadata-change.sh +40 -6
- package/plugins/specweave/hooks/post-task-completion.sh +93 -9
- package/plugins/specweave/hooks/pre-edit-spec.sh +0 -11
- package/plugins/specweave/hooks/pre-edit-write-consolidated.sh +188 -0
- package/plugins/specweave/hooks/pre-task-completion.sh +11 -0
- package/plugins/specweave/hooks/pre-write-spec.sh +0 -11
- package/plugins/specweave/lib/hooks/consolidated-sync.js +61 -3
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +294 -0
- package/plugins/specweave-github/lib/github-client-v2.js +46 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +65 -0
- package/plugins/specweave-release/commands/specweave-release-npm.md +130 -2
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +60 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frontmatter Updater (Layer 1 Idempotency Backfill)
|
|
3
|
+
*
|
|
4
|
+
* Updates user story frontmatter with GitHub issue information
|
|
5
|
+
* after issues are created. This provides the fastest idempotency
|
|
6
|
+
* check (<1ms) for future syncs.
|
|
7
|
+
*
|
|
8
|
+
* Part of 3-layer idempotency strategy:
|
|
9
|
+
* - Layer 1: User story frontmatter (fastest, <1ms)
|
|
10
|
+
* - Layer 2: Increment metadata.json (fast, <5ms)
|
|
11
|
+
* - Layer 3: GitHub API query (slow, 500-2000ms)
|
|
12
|
+
*/
|
|
13
|
+
import { readFile, writeFile, readdir } from 'fs/promises';
|
|
14
|
+
import { existsSync } from 'fs';
|
|
15
|
+
import path from 'path';
|
|
16
|
+
import yaml from 'yaml';
|
|
17
|
+
import { consoleLogger } from '../utils/logger.js';
|
|
18
|
+
export class FrontmatterUpdater {
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
this.logger = options.logger ?? consoleLogger;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Update user story frontmatter with GitHub issue information
|
|
24
|
+
*
|
|
25
|
+
* CRITICAL: This is Layer 1 backfill for 3-layer idempotency
|
|
26
|
+
* Must be called after GitHub issue creation to cache issue number
|
|
27
|
+
*/
|
|
28
|
+
async updateUserStoryFrontmatter(options) {
|
|
29
|
+
try {
|
|
30
|
+
const { projectRoot, featureId, userStoryId, githubIssue } = options;
|
|
31
|
+
// Construct user story file path
|
|
32
|
+
const userStoryPath = await this.getUserStoryPath(projectRoot, featureId, userStoryId);
|
|
33
|
+
if (!existsSync(userStoryPath)) {
|
|
34
|
+
this.logger.log(`⚠️ User story file not found: ${userStoryPath}`);
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
// Read current content
|
|
38
|
+
const content = await readFile(userStoryPath, 'utf-8');
|
|
39
|
+
// Parse frontmatter
|
|
40
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
41
|
+
if (!frontmatterMatch) {
|
|
42
|
+
this.logger.log(`⚠️ No frontmatter found in ${userStoryPath}`);
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const frontmatterText = frontmatterMatch[1];
|
|
46
|
+
const frontmatter = yaml.parse(frontmatterText);
|
|
47
|
+
// Check if already has GitHub info (avoid overwriting)
|
|
48
|
+
if (frontmatter.external_tools?.github?.number) {
|
|
49
|
+
this.logger.log(` ℹ️ ${userStoryId} frontmatter already has GitHub issue #${frontmatter.external_tools.github.number}`);
|
|
50
|
+
return true; // Already backfilled
|
|
51
|
+
}
|
|
52
|
+
// Add external_tools.github section
|
|
53
|
+
if (!frontmatter.external_tools) {
|
|
54
|
+
frontmatter.external_tools = {};
|
|
55
|
+
}
|
|
56
|
+
frontmatter.external_tools.github = {
|
|
57
|
+
number: githubIssue.number,
|
|
58
|
+
url: githubIssue.url,
|
|
59
|
+
created_at: githubIssue.createdAt,
|
|
60
|
+
};
|
|
61
|
+
// Serialize updated frontmatter
|
|
62
|
+
const newFrontmatter = yaml.stringify(frontmatter);
|
|
63
|
+
// Replace frontmatter in content
|
|
64
|
+
const newContent = content.replace(/^---\n[\s\S]*?\n---/, `---\n${newFrontmatter.trim()}\n---`);
|
|
65
|
+
// Write back to file
|
|
66
|
+
await writeFile(userStoryPath, newContent, 'utf-8');
|
|
67
|
+
this.logger.log(` ✅ Updated ${userStoryId} frontmatter with issue #${githubIssue.number}`);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
this.logger.error(`❌ Failed to update frontmatter for ${options.userStoryId}:`, error);
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Batch update multiple user story frontmatters
|
|
77
|
+
*/
|
|
78
|
+
async batchUpdateFrontmatters(projectRoot, featureId, updates) {
|
|
79
|
+
let success = 0;
|
|
80
|
+
let failed = 0;
|
|
81
|
+
for (const update of updates) {
|
|
82
|
+
const result = await this.updateUserStoryFrontmatter({
|
|
83
|
+
projectRoot,
|
|
84
|
+
featureId,
|
|
85
|
+
userStoryId: update.userStoryId,
|
|
86
|
+
githubIssue: update.githubIssue,
|
|
87
|
+
});
|
|
88
|
+
if (result) {
|
|
89
|
+
success++;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
failed++;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return { success, failed };
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get user story file path from project root, feature ID, and user story ID
|
|
99
|
+
*/
|
|
100
|
+
async getUserStoryPath(projectRoot, featureId, userStoryId) {
|
|
101
|
+
// Convert user story ID to file name (US-001 → us-001-*.md)
|
|
102
|
+
const usPrefix = userStoryId.toLowerCase();
|
|
103
|
+
// Search in .specweave/docs/internal/specs/specweave/{featureId}/
|
|
104
|
+
const featurePath = path.join(projectRoot, '.specweave/docs/internal/specs/specweave', featureId);
|
|
105
|
+
if (!existsSync(featurePath)) {
|
|
106
|
+
throw new Error(`Feature directory not found: ${featurePath}`);
|
|
107
|
+
}
|
|
108
|
+
// Find file matching us-* pattern (use async readdir)
|
|
109
|
+
const files = await readdir(featurePath);
|
|
110
|
+
const matchingFile = files.find((file) => file.startsWith(usPrefix) && file.endsWith('.md'));
|
|
111
|
+
if (!matchingFile) {
|
|
112
|
+
throw new Error(`User story file not found for ${userStoryId} in ${featurePath}`);
|
|
113
|
+
}
|
|
114
|
+
return path.join(featurePath, matchingFile);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Read GitHub issue info from user story frontmatter (Layer 1 check)
|
|
118
|
+
*/
|
|
119
|
+
async getGitHubIssueFromFrontmatter(projectRoot, featureId, userStoryId) {
|
|
120
|
+
try {
|
|
121
|
+
const userStoryPath = await this.getUserStoryPath(projectRoot, featureId, userStoryId);
|
|
122
|
+
if (!existsSync(userStoryPath)) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
const content = await readFile(userStoryPath, 'utf-8');
|
|
126
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
127
|
+
if (!frontmatterMatch) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
const frontmatter = yaml.parse(frontmatterMatch[1]);
|
|
131
|
+
const githubInfo = frontmatter.external_tools?.github;
|
|
132
|
+
if (!githubInfo || !githubInfo.number) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
number: githubInfo.number,
|
|
137
|
+
url: githubInfo.url,
|
|
138
|
+
createdAt: githubInfo.created_at || new Date().toISOString(),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
this.logger.error(`Failed to read GitHub info from ${userStoryId} frontmatter:`, error);
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=frontmatter-updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter-updater.js","sourceRoot":"","sources":["../../../src/sync/frontmatter-updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* High-level coordinator that integrates FormatPreservationSyncService
|
|
5
5
|
* with living docs sync workflow. Called by post-task-completion hook.
|
|
6
6
|
*/
|
|
7
|
+
import { GitHubIssue } from '../../plugins/specweave-github/lib/types.js';
|
|
7
8
|
import { Logger } from '../utils/logger.js';
|
|
8
9
|
export interface SyncCoordinatorOptions {
|
|
9
10
|
projectRoot: string;
|
|
@@ -13,14 +14,34 @@ export interface SyncCoordinatorOptions {
|
|
|
13
14
|
export interface SyncResult {
|
|
14
15
|
success: boolean;
|
|
15
16
|
userStoriesSynced: number;
|
|
16
|
-
syncMode: 'comment-only' | 'full-sync' | 'read-only' | 'manual-only';
|
|
17
|
+
syncMode: 'comment-only' | 'full-sync' | 'read-only' | 'manual-only' | 'living-docs-only' | 'external-disabled';
|
|
17
18
|
errors: string[];
|
|
18
19
|
}
|
|
19
20
|
export declare class SyncCoordinator {
|
|
20
21
|
private projectRoot;
|
|
21
22
|
private incrementId;
|
|
22
23
|
private logger;
|
|
24
|
+
private frontmatterUpdater;
|
|
23
25
|
constructor(options: SyncCoordinatorOptions);
|
|
26
|
+
/**
|
|
27
|
+
* Create GitHub issues for all User Stories in the feature (NEW in v0.25.0)
|
|
28
|
+
*
|
|
29
|
+
* This is the AUTOMATIC GitHub sync that runs when increment completes.
|
|
30
|
+
* Creates issues for User Stories that don't have GitHub issues yet.
|
|
31
|
+
*
|
|
32
|
+
* Uses 3-layer idempotency:
|
|
33
|
+
* - Layer 1: Check user story frontmatter (fastest, <1ms)
|
|
34
|
+
* - Layer 2: Check increment metadata.json (fast, <5ms)
|
|
35
|
+
* - Layer 3: Query GitHub API (slow but authoritative, 500-2000ms)
|
|
36
|
+
*
|
|
37
|
+
* @param config - Project configuration
|
|
38
|
+
* @returns Array of created issues
|
|
39
|
+
*/
|
|
40
|
+
createGitHubIssuesForUserStories(config: any): Promise<GitHubIssue[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Format user story content for GitHub issue body
|
|
43
|
+
*/
|
|
44
|
+
private formatUserStoryBody;
|
|
24
45
|
/**
|
|
25
46
|
* Sync increment completion to external tools using format preservation
|
|
26
47
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-coordinator.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EAAE,MAAM,EAAiB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"sync-coordinator.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAiB,MAAM,oBAAoB,CAAC;AAG3D,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,cAAc,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;IAChH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,kBAAkB,CAAqB;gBAEnC,OAAO,EAAE,sBAAsB;IAO3C;;;;;;;;;;;;;OAaG;IACG,gCAAgC,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAwN3E;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,UAAU,CAAC;IA6HpD;;OAEG;YACW,aAAa;IAyD3B;;OAEG;YACW,kBAAkB;IAmEhC;;OAEG;YACW,2BAA2B;IAsEzC;;OAEG;YACW,UAAU;IAWxB;;OAEG;YACW,gBAAgB;CAyB/B"}
|
|
@@ -4,18 +4,226 @@
|
|
|
4
4
|
* High-level coordinator that integrates FormatPreservationSyncService
|
|
5
5
|
* with living docs sync workflow. Called by post-task-completion hook.
|
|
6
6
|
*/
|
|
7
|
-
import fs from 'fs
|
|
7
|
+
import { promises as fs, existsSync } from 'fs';
|
|
8
8
|
import path from 'path';
|
|
9
9
|
import yaml from 'yaml';
|
|
10
10
|
import { getOrigin } from '../types/living-docs-us-file.js';
|
|
11
11
|
import { FormatPreservationSyncService } from './format-preservation-sync.js';
|
|
12
12
|
import { GitHubClientV2 } from '../../plugins/specweave-github/lib/github-client-v2.js';
|
|
13
13
|
import { consoleLogger } from '../utils/logger.js';
|
|
14
|
+
import { FrontmatterUpdater } from './frontmatter-updater.js';
|
|
14
15
|
export class SyncCoordinator {
|
|
15
16
|
constructor(options) {
|
|
16
17
|
this.projectRoot = options.projectRoot;
|
|
17
18
|
this.incrementId = options.incrementId;
|
|
18
19
|
this.logger = options.logger ?? consoleLogger;
|
|
20
|
+
this.frontmatterUpdater = new FrontmatterUpdater({ logger: this.logger });
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create GitHub issues for all User Stories in the feature (NEW in v0.25.0)
|
|
24
|
+
*
|
|
25
|
+
* This is the AUTOMATIC GitHub sync that runs when increment completes.
|
|
26
|
+
* Creates issues for User Stories that don't have GitHub issues yet.
|
|
27
|
+
*
|
|
28
|
+
* Uses 3-layer idempotency:
|
|
29
|
+
* - Layer 1: Check user story frontmatter (fastest, <1ms)
|
|
30
|
+
* - Layer 2: Check increment metadata.json (fast, <5ms)
|
|
31
|
+
* - Layer 3: Query GitHub API (slow but authoritative, 500-2000ms)
|
|
32
|
+
*
|
|
33
|
+
* @param config - Project configuration
|
|
34
|
+
* @returns Array of created issues
|
|
35
|
+
*/
|
|
36
|
+
async createGitHubIssuesForUserStories(config) {
|
|
37
|
+
const createdIssues = [];
|
|
38
|
+
try {
|
|
39
|
+
// Load user stories for this increment
|
|
40
|
+
const userStories = await this.loadUserStoriesForIncrement();
|
|
41
|
+
if (userStories.length === 0) {
|
|
42
|
+
this.logger.log('📚 No user stories found for this increment');
|
|
43
|
+
return createdIssues;
|
|
44
|
+
}
|
|
45
|
+
this.logger.log(`📚 Found ${userStories.length} user story/stories for GitHub sync`);
|
|
46
|
+
// Get GitHub config
|
|
47
|
+
const githubConfig = config.sync?.github || {};
|
|
48
|
+
const repoInfo = await this.detectGitHubRepo(githubConfig);
|
|
49
|
+
if (!repoInfo) {
|
|
50
|
+
throw new Error('GitHub repository not configured');
|
|
51
|
+
}
|
|
52
|
+
const client = GitHubClientV2.fromRepo(repoInfo.owner, repoInfo.repo);
|
|
53
|
+
// Get feature ID from increment spec
|
|
54
|
+
const specFile = path.join(this.projectRoot, '.specweave/increments', this.incrementId, 'spec.md');
|
|
55
|
+
let featureId = '';
|
|
56
|
+
if (existsSync(specFile)) {
|
|
57
|
+
const content = await fs.readFile(specFile, 'utf-8');
|
|
58
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
59
|
+
if (frontmatterMatch) {
|
|
60
|
+
const frontmatter = yaml.parse(frontmatterMatch[1]);
|
|
61
|
+
featureId = frontmatter.feature_id || frontmatter.epic || frontmatter.feature || '';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!featureId) {
|
|
65
|
+
this.logger.log('⚠️ No feature ID found in increment spec - skipping GitHub sync');
|
|
66
|
+
return createdIssues;
|
|
67
|
+
}
|
|
68
|
+
// Try to find or create milestone for the feature
|
|
69
|
+
let milestoneNumber = null;
|
|
70
|
+
try {
|
|
71
|
+
const milestone = await client.createOrGetMilestone(`${featureId}: Automatic GitHub Sync`, `Feature milestone for ${featureId}`, 30 // 30 days from now
|
|
72
|
+
);
|
|
73
|
+
milestoneNumber = milestone.number;
|
|
74
|
+
this.logger.log(`🎯 Using milestone: ${milestone.title} (#${milestone.number})`);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
this.logger.log('⚠️ Could not create/get milestone, continuing without it');
|
|
78
|
+
}
|
|
79
|
+
// Create issue for each user story (with idempotency)
|
|
80
|
+
for (const usFile of userStories) {
|
|
81
|
+
try {
|
|
82
|
+
// LAYER 1: Check user story frontmatter for existing GitHub issue
|
|
83
|
+
const cachedIssue = await this.frontmatterUpdater.getGitHubIssueFromFrontmatter(this.projectRoot, featureId, usFile.id);
|
|
84
|
+
if (cachedIssue) {
|
|
85
|
+
this.logger.log(` ⏭️ ${usFile.id} - Issue #${cachedIssue.number} already exists (cached in frontmatter)`);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
// LAYER 2: Check increment metadata.json
|
|
89
|
+
const metadataFile = path.join(this.projectRoot, '.specweave/increments', this.incrementId, 'metadata.json');
|
|
90
|
+
let existingIssue = null;
|
|
91
|
+
if (existsSync(metadataFile)) {
|
|
92
|
+
const metadata = JSON.parse(await fs.readFile(metadataFile, 'utf-8'));
|
|
93
|
+
const githubIssues = metadata.github?.issues || [];
|
|
94
|
+
const found = githubIssues.find((i) => i.userStory === usFile.id);
|
|
95
|
+
if (found) {
|
|
96
|
+
this.logger.log(` ⏭️ ${usFile.id} - Issue #${found.number} already exists (cached in metadata)`);
|
|
97
|
+
existingIssue = found.number;
|
|
98
|
+
// TODO: Backfill Layer 1 (update user story frontmatter)
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// LAYER 3: Query GitHub API to check for existing issue
|
|
103
|
+
const searchTitle = `[${featureId}][${usFile.id}]`;
|
|
104
|
+
const existingOnGitHub = await client.searchIssueByTitle(searchTitle);
|
|
105
|
+
if (existingOnGitHub) {
|
|
106
|
+
this.logger.log(` ⏭️ ${usFile.id} - Issue #${existingOnGitHub.number} already exists on GitHub`);
|
|
107
|
+
// Backfill Layer 1 (frontmatter) and Layer 2 (metadata)
|
|
108
|
+
await this.frontmatterUpdater.updateUserStoryFrontmatter({
|
|
109
|
+
projectRoot: this.projectRoot,
|
|
110
|
+
featureId,
|
|
111
|
+
userStoryId: usFile.id,
|
|
112
|
+
githubIssue: {
|
|
113
|
+
number: existingOnGitHub.number,
|
|
114
|
+
url: existingOnGitHub.html_url,
|
|
115
|
+
createdAt: new Date().toISOString(),
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
// Backfill Layer 2 (metadata.json)
|
|
119
|
+
if (existsSync(metadataFile)) {
|
|
120
|
+
const metadata = JSON.parse(await fs.readFile(metadataFile, 'utf-8'));
|
|
121
|
+
if (!metadata.github) {
|
|
122
|
+
metadata.github = {};
|
|
123
|
+
}
|
|
124
|
+
if (!metadata.github.issues) {
|
|
125
|
+
metadata.github.issues = [];
|
|
126
|
+
}
|
|
127
|
+
// Check if not already in metadata
|
|
128
|
+
const existsInMetadata = metadata.github.issues.find((i) => i.userStory === usFile.id);
|
|
129
|
+
if (!existsInMetadata) {
|
|
130
|
+
metadata.github.issues.push({
|
|
131
|
+
userStory: usFile.id,
|
|
132
|
+
number: existingOnGitHub.number,
|
|
133
|
+
url: existingOnGitHub.html_url,
|
|
134
|
+
createdAt: new Date().toISOString(),
|
|
135
|
+
});
|
|
136
|
+
metadata.github.lastSync = new Date().toISOString();
|
|
137
|
+
await fs.writeFile(metadataFile, JSON.stringify(metadata, null, 2), 'utf-8');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
// All 3 layers miss - create new issue
|
|
143
|
+
this.logger.log(` 📝 Creating GitHub issue for ${usFile.id}...`);
|
|
144
|
+
// Format issue body
|
|
145
|
+
const issueBody = this.formatUserStoryBody(usFile);
|
|
146
|
+
// Create issue
|
|
147
|
+
const issue = await client.createUserStoryIssue({
|
|
148
|
+
featureId,
|
|
149
|
+
userStoryId: usFile.id,
|
|
150
|
+
title: usFile.title,
|
|
151
|
+
body: issueBody,
|
|
152
|
+
labels: [],
|
|
153
|
+
milestone: milestoneNumber,
|
|
154
|
+
});
|
|
155
|
+
this.logger.log(` ✅ Created issue #${issue.number}: ${issue.html_url}`);
|
|
156
|
+
createdIssues.push(issue);
|
|
157
|
+
// Update increment metadata.json (Layer 2)
|
|
158
|
+
if (existsSync(metadataFile)) {
|
|
159
|
+
const metadata = JSON.parse(await fs.readFile(metadataFile, 'utf-8'));
|
|
160
|
+
if (!metadata.github) {
|
|
161
|
+
metadata.github = {};
|
|
162
|
+
}
|
|
163
|
+
if (!metadata.github.issues) {
|
|
164
|
+
metadata.github.issues = [];
|
|
165
|
+
}
|
|
166
|
+
metadata.github.issues.push({
|
|
167
|
+
userStory: usFile.id,
|
|
168
|
+
number: issue.number,
|
|
169
|
+
url: issue.html_url,
|
|
170
|
+
createdAt: new Date().toISOString(),
|
|
171
|
+
});
|
|
172
|
+
metadata.github.lastSync = new Date().toISOString();
|
|
173
|
+
await fs.writeFile(metadataFile, JSON.stringify(metadata, null, 2), 'utf-8');
|
|
174
|
+
}
|
|
175
|
+
// Update user story frontmatter (Layer 1 backfill)
|
|
176
|
+
await this.frontmatterUpdater.updateUserStoryFrontmatter({
|
|
177
|
+
projectRoot: this.projectRoot,
|
|
178
|
+
featureId,
|
|
179
|
+
userStoryId: usFile.id,
|
|
180
|
+
githubIssue: {
|
|
181
|
+
number: issue.number,
|
|
182
|
+
url: issue.html_url,
|
|
183
|
+
createdAt: new Date().toISOString(),
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
this.logger.error(` ❌ Failed to create issue for ${usFile.id}:`, error);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (createdIssues.length > 0) {
|
|
192
|
+
this.logger.log(`\n✅ Created ${createdIssues.length} GitHub issue(s) for ${featureId}`);
|
|
193
|
+
createdIssues.forEach(issue => {
|
|
194
|
+
this.logger.log(` - Issue #${issue.number}: ${issue.html_url}`);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
this.logger.log('\n✅ All GitHub issues already exist (0 new issues created)');
|
|
199
|
+
}
|
|
200
|
+
return createdIssues;
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
this.logger.error('❌ Failed to create GitHub issues:', error);
|
|
204
|
+
throw error;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Format user story content for GitHub issue body
|
|
209
|
+
*/
|
|
210
|
+
formatUserStoryBody(usFile) {
|
|
211
|
+
// Simple body for now - can be enhanced later
|
|
212
|
+
const parts = [];
|
|
213
|
+
parts.push(`## User Story: ${usFile.id}`);
|
|
214
|
+
parts.push('');
|
|
215
|
+
if (usFile.external_title) {
|
|
216
|
+
parts.push(`**Original Title**: ${usFile.external_title}`);
|
|
217
|
+
parts.push('');
|
|
218
|
+
}
|
|
219
|
+
parts.push('This issue was auto-created by SpecWeave.');
|
|
220
|
+
parts.push('');
|
|
221
|
+
parts.push('---');
|
|
222
|
+
parts.push('');
|
|
223
|
+
parts.push('🤖 **Auto-synced from SpecWeave**');
|
|
224
|
+
parts.push('');
|
|
225
|
+
parts.push('For detailed acceptance criteria, tasks, and technical specifications, see the living docs in the repository.');
|
|
226
|
+
return parts.join('\n');
|
|
19
227
|
}
|
|
20
228
|
/**
|
|
21
229
|
* Sync increment completion to external tools using format preservation
|
|
@@ -31,25 +239,63 @@ export class SyncCoordinator {
|
|
|
31
239
|
this.logger.log(`\n🔄 Syncing increment ${this.incrementId} with format preservation...`);
|
|
32
240
|
// 1. Load config
|
|
33
241
|
const config = await this.loadConfig();
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
242
|
+
// GATE 1: Check if living docs sync is enabled (canUpsertInternalItems)
|
|
243
|
+
const canUpsertInternal = config.sync?.settings?.canUpsertInternalItems ?? true;
|
|
244
|
+
if (!canUpsertInternal) {
|
|
245
|
+
this.logger.log('ℹ️ Living docs sync disabled (canUpsertInternalItems=false)');
|
|
246
|
+
this.logger.log(' Running in read-only mode - no changes will be made to living docs or external tools');
|
|
37
247
|
result.syncMode = 'read-only';
|
|
38
248
|
result.success = true;
|
|
39
249
|
return result;
|
|
40
250
|
}
|
|
41
|
-
// GATE
|
|
251
|
+
// GATE 2: Check if external sync is enabled (canUpdateExternalItems)
|
|
252
|
+
const canUpdateExternal = config.sync?.settings?.canUpdateExternalItems ?? false;
|
|
253
|
+
if (!canUpdateExternal) {
|
|
254
|
+
this.logger.log('✅ Living docs sync enabled (canUpsertInternalItems=true)');
|
|
255
|
+
this.logger.log('ℹ️ External tool sync disabled (canUpdateExternalItems=false)');
|
|
256
|
+
this.logger.log(' Living docs will be updated, but external tools (GitHub, JIRA, ADO) will not be synced');
|
|
257
|
+
result.syncMode = 'living-docs-only';
|
|
258
|
+
// Continue to sync living docs (without external tools)
|
|
259
|
+
// Note: GitHub issue creation will be skipped due to this gate
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
this.logger.log('✅ Living docs sync enabled (canUpsertInternalItems=true)');
|
|
263
|
+
this.logger.log('✅ External tool sync enabled (canUpdateExternalItems=true)');
|
|
264
|
+
}
|
|
265
|
+
// GATE 3: Check if automatic sync is enabled (only relevant if GATE 2 is true)
|
|
42
266
|
// DEFAULT: true (automatic sync enabled for better UX)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
267
|
+
if (canUpdateExternal) {
|
|
268
|
+
const autoSync = config.sync?.settings?.autoSyncOnCompletion ?? true;
|
|
269
|
+
if (!autoSync) {
|
|
270
|
+
this.logger.log('⚠️ Automatic external sync disabled (autoSyncOnCompletion=false)');
|
|
271
|
+
this.logger.log(' Living docs will be updated, but external tools require manual sync');
|
|
272
|
+
this.logger.log(' Run /specweave-github:sync or /specweave-jira:sync to sync manually');
|
|
273
|
+
result.syncMode = 'manual-only';
|
|
274
|
+
// Continue to sync living docs only (skip GitHub sync)
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
this.logger.log('✅ Automatic external sync enabled (autoSyncOnCompletion=true)');
|
|
278
|
+
// GATE 4: Check if GitHub sync is enabled (tool-specific gate)
|
|
279
|
+
const githubEnabled = config.sync?.github?.enabled ?? false;
|
|
280
|
+
if (githubEnabled) {
|
|
281
|
+
this.logger.log('✅ GitHub sync enabled (sync.github.enabled=true)');
|
|
282
|
+
this.logger.log('\n🔹 Creating GitHub issues for user stories...');
|
|
283
|
+
try {
|
|
284
|
+
await this.createGitHubIssuesForUserStories(config);
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
this.logger.error('⚠️ GitHub issue creation failed (non-blocking):', error);
|
|
288
|
+
result.errors.push(`GitHub sync error: ${error}`);
|
|
289
|
+
// Continue with rest of sync even if GitHub fails
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
this.logger.log('ℹ️ GitHub sync disabled (sync.github.enabled=false)');
|
|
294
|
+
this.logger.log(' Set sync.github.enabled=true to enable automatic GitHub issue creation');
|
|
295
|
+
result.syncMode = 'external-disabled';
|
|
296
|
+
}
|
|
297
|
+
}
|
|
51
298
|
}
|
|
52
|
-
this.logger.log('✅ Automatic sync enabled (autoSyncOnCompletion=true)');
|
|
53
299
|
// 3. Load living docs User Stories for this increment
|
|
54
300
|
const userStories = await this.loadUserStoriesForIncrement();
|
|
55
301
|
if (userStories.length === 0) {
|
|
@@ -153,7 +399,7 @@ export class SyncCoordinator {
|
|
|
153
399
|
const tasksFile = path.join(this.projectRoot, '.specweave/increments', this.incrementId, 'tasks.md');
|
|
154
400
|
const tasks = [];
|
|
155
401
|
const acs = [];
|
|
156
|
-
if (
|
|
402
|
+
if (existsSync(tasksFile)) {
|
|
157
403
|
const content = await fs.readFile(tasksFile, 'utf-8');
|
|
158
404
|
// Parse tasks (simplified - just count completed for now)
|
|
159
405
|
const taskMatches = content.match(/### T-\d+:/g) || [];
|
|
@@ -169,7 +415,7 @@ export class SyncCoordinator {
|
|
|
169
415
|
}
|
|
170
416
|
// Parse ACs from spec.md
|
|
171
417
|
const specFile = path.join(this.projectRoot, '.specweave/increments', this.incrementId, 'spec.md');
|
|
172
|
-
if (
|
|
418
|
+
if (existsSync(specFile)) {
|
|
173
419
|
const content = await fs.readFile(specFile, 'utf-8');
|
|
174
420
|
// Parse ACs
|
|
175
421
|
const acMatches = content.match(/- \[x\] \*\*AC-[^:]+\*\*:/g) || [];
|
|
@@ -199,7 +445,7 @@ export class SyncCoordinator {
|
|
|
199
445
|
*/
|
|
200
446
|
async loadUserStoriesForIncrement() {
|
|
201
447
|
const specFile = path.join(this.projectRoot, '.specweave/increments', this.incrementId, 'spec.md');
|
|
202
|
-
if (!
|
|
448
|
+
if (!existsSync(specFile)) {
|
|
203
449
|
return [];
|
|
204
450
|
}
|
|
205
451
|
const content = await fs.readFile(specFile, 'utf-8');
|
|
@@ -209,13 +455,13 @@ export class SyncCoordinator {
|
|
|
209
455
|
return [];
|
|
210
456
|
}
|
|
211
457
|
const frontmatter = yaml.parse(frontmatterMatch[1]);
|
|
212
|
-
const featureId = frontmatter.epic || frontmatter.feature;
|
|
458
|
+
const featureId = frontmatter.feature_id || frontmatter.epic || frontmatter.feature;
|
|
213
459
|
if (!featureId) {
|
|
214
460
|
return [];
|
|
215
461
|
}
|
|
216
462
|
// Find living docs for this feature
|
|
217
463
|
const featurePath = path.join(this.projectRoot, '.specweave/docs/internal/specs/specweave', featureId);
|
|
218
|
-
if (!
|
|
464
|
+
if (!existsSync(featurePath)) {
|
|
219
465
|
return [];
|
|
220
466
|
}
|
|
221
467
|
// Load all US files
|
|
@@ -238,7 +484,8 @@ export class SyncCoordinator {
|
|
|
238
484
|
external_id: fm.external_id,
|
|
239
485
|
external_url: fm.external_url,
|
|
240
486
|
imported_at: fm.imported_at,
|
|
241
|
-
origin: fm.origin
|
|
487
|
+
origin: fm.origin,
|
|
488
|
+
external_tools: fm.external_tools // FIX: Include external_tools (Layer 1 cache)
|
|
242
489
|
});
|
|
243
490
|
}
|
|
244
491
|
}
|
|
@@ -250,7 +497,7 @@ export class SyncCoordinator {
|
|
|
250
497
|
*/
|
|
251
498
|
async loadConfig() {
|
|
252
499
|
const configPath = path.join(this.projectRoot, '.specweave/config.json');
|
|
253
|
-
if (!
|
|
500
|
+
if (!existsSync(configPath)) {
|
|
254
501
|
return {};
|
|
255
502
|
}
|
|
256
503
|
const content = await fs.readFile(configPath, 'utf-8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-coordinator.js","sourceRoot":"","sources":["../../../src/sync/sync-coordinator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sync-coordinator.js","sourceRoot":"","sources":["../../../src/sync/sync-coordinator.ts"],"names":[],"mappings":"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"}
|