specweave 0.27.0 ā 0.28.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/README.md +243 -97
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +6 -2
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +28 -8
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync-cli.d.ts +21 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync-cli.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync-cli.js +166 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync-cli.js.map +1 -0
- package/dist/src/core/repo-structure/repo-bulk-discovery.d.ts +5 -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 +5 -3
- package/dist/src/core/repo-structure/repo-bulk-discovery.js.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts +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 +15 -16
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/sync/label-detector.d.ts.map +1 -1
- package/dist/src/core/sync/label-detector.js +22 -9
- package/dist/src/core/sync/label-detector.js.map +1 -1
- package/dist/src/metrics/calculators/deployment-frequency.d.ts +12 -8
- package/dist/src/metrics/calculators/deployment-frequency.d.ts.map +1 -1
- package/dist/src/metrics/calculators/deployment-frequency.js +16 -12
- package/dist/src/metrics/calculators/deployment-frequency.js.map +1 -1
- package/dist/src/metrics/dora-calculator.d.ts +2 -1
- package/dist/src/metrics/dora-calculator.d.ts.map +1 -1
- package/dist/src/metrics/dora-calculator.js +9 -4
- package/dist/src/metrics/dora-calculator.js.map +1 -1
- package/dist/src/metrics/github-client.d.ts +12 -0
- package/dist/src/metrics/github-client.d.ts.map +1 -1
- package/dist/src/metrics/github-client.js +30 -0
- package/dist/src/metrics/github-client.js.map +1 -1
- package/dist/src/sync/sync-coordinator.d.ts +33 -0
- package/dist/src/sync/sync-coordinator.d.ts.map +1 -1
- package/dist/src/sync/sync-coordinator.js +203 -2
- package/dist/src/sync/sync-coordinator.js.map +1 -1
- package/dist/src/utils/env-file-generator.d.ts +8 -23
- package/dist/src/utils/env-file-generator.d.ts.map +1 -1
- package/dist/src/utils/env-file-generator.js +31 -71
- package/dist/src/utils/env-file-generator.js.map +1 -1
- package/package.json +7 -2
- package/plugins/specweave/agents/architect/AGENT.md +2 -2
- package/plugins/specweave/agents/docs-writer/AGENT.md +2 -2
- package/plugins/specweave/agents/pm/AGENT.md +2 -2
- package/plugins/specweave/agents/qa-lead/AGENT.md +2 -2
- package/plugins/specweave/agents/security/AGENT.md +2 -2
- package/plugins/specweave/agents/tdd-orchestrator/AGENT.md +2 -2
- package/plugins/specweave/agents/tech-lead/AGENT.md +2 -2
- package/plugins/specweave/agents/test-aware-planner/AGENT.md +2 -2
- package/plugins/specweave/hooks/post-edit-write-consolidated.sh +87 -0
- package/plugins/specweave/hooks/post-increment-completion.sh +84 -0
- package/plugins/specweave/hooks/post-increment-planning.sh +114 -7
- package/plugins/specweave/lib/hooks/sync-increment-closure.js +66 -0
- package/plugins/specweave/lib/hooks/sync-increment-closure.ts +111 -0
- package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
- package/plugins/specweave-github/lib/github-client-v2.js +32 -8
- package/plugins/specweave-github/lib/github-client-v2.ts +31 -9
- package/plugins/specweave-github/lib/github-feature-sync-cli.js +135 -0
- package/plugins/specweave-github/lib/github-feature-sync-cli.ts +194 -0
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +43 -0
- package/plugins/specweave-infrastructure/agents/devops/AGENT.md +2 -2
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
- package/src/templates/.env.example +9 -26
- package/plugins/specweave/hooks/docs-changed.sh.backup +0 -79
- package/plugins/specweave/hooks/human-input-required.sh.backup +0 -75
- package/plugins/specweave/hooks/post-first-increment.sh.backup +0 -61
- package/plugins/specweave/hooks/post-increment-change.sh.backup +0 -98
- package/plugins/specweave/hooks/post-increment-completion.sh.backup +0 -231
- package/plugins/specweave/hooks/post-increment-planning.sh.backup +0 -1048
- package/plugins/specweave/hooks/post-increment-status-change.sh.backup +0 -147
- package/plugins/specweave/hooks/post-spec-update.sh.backup +0 -158
- package/plugins/specweave/hooks/post-user-story-complete.sh.backup +0 -179
- package/plugins/specweave/hooks/pre-command-deduplication.sh.backup +0 -83
- package/plugins/specweave/hooks/pre-implementation.sh.backup +0 -67
- package/plugins/specweave/hooks/pre-task-completion.sh.backup +0 -194
- package/plugins/specweave/hooks/pre-tool-use.sh.backup +0 -133
- package/plugins/specweave/hooks/user-prompt-submit.sh.backup +0 -386
- package/plugins/specweave-ado/hooks/post-living-docs-update.sh.backup +0 -353
- package/plugins/specweave-ado/hooks/post-task-completion.sh.backup +0 -172
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +0 -1104
- package/plugins/specweave-github/hooks/post-task-completion.sh.backup +0 -258
- package/plugins/specweave-jira/hooks/post-task-completion.sh.backup +0 -172
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +0 -1017
- package/plugins/specweave-release/hooks/post-task-completion.sh.backup +0 -110
|
@@ -16,18 +16,31 @@ const DEFAULT_GITHUB_LABELS = {
|
|
|
16
16
|
chore: 'chore',
|
|
17
17
|
experiment: 'experiment'
|
|
18
18
|
};
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
19
|
+
/**
|
|
20
|
+
* User-friendly labels for display purposes ONLY.
|
|
21
|
+
*
|
|
22
|
+
* CRITICAL: These are NOT for use in GitHub issue titles!
|
|
23
|
+
* GitHub issue titles MUST follow [FS-XXX][US-YYY] format.
|
|
24
|
+
*
|
|
25
|
+
* Use these labels:
|
|
26
|
+
* - As GitHub issue labels (via addLabels)
|
|
27
|
+
* - For display in CLI output
|
|
28
|
+
* - For categorization in reports
|
|
29
|
+
*
|
|
30
|
+
* DO NOT use in issue titles - that causes format violations like issue #749.
|
|
31
|
+
*/
|
|
32
|
+
const DEFAULT_USER_DISPLAY_LABELS = {
|
|
33
|
+
bug: 'Bug',
|
|
34
|
+
feature: 'Feature',
|
|
35
|
+
docs: 'Docs',
|
|
36
|
+
hotfix: 'Hotfix',
|
|
37
|
+
refactor: 'Refactor',
|
|
38
|
+
chore: 'Chore',
|
|
39
|
+
experiment: 'Experiment'
|
|
27
40
|
};
|
|
28
41
|
export class LabelDetector {
|
|
29
42
|
constructor(labelConfig, useUserFormat = true) {
|
|
30
|
-
const defaults = useUserFormat ?
|
|
43
|
+
const defaults = useUserFormat ? DEFAULT_USER_DISPLAY_LABELS : DEFAULT_GITHUB_LABELS;
|
|
31
44
|
this.labelConfig = { ...defaults, ...labelConfig };
|
|
32
45
|
}
|
|
33
46
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label-detector.js","sourceRoot":"","sources":["../../../../src/core/sync/label-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqBH,MAAM,qBAAqB,GAAgB;IACzC,GAAG,EAAE,KAAK;IACV,OAAO,EAAE,aAAa;IACtB,IAAI,EAAE,eAAe;IACrB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,UAAU,EAAE,YAAY;CACzB,CAAC;AAEF,MAAM,
|
|
1
|
+
{"version":3,"file":"label-detector.js","sourceRoot":"","sources":["../../../../src/core/sync/label-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,19 +2,23 @@
|
|
|
2
2
|
* Deployment Frequency Calculator
|
|
3
3
|
*
|
|
4
4
|
* Calculates how often deployments occur (DORA metric #1)
|
|
5
|
-
* Data source:
|
|
5
|
+
* Data source: Commits to develop branch (each push = deployment)
|
|
6
|
+
*
|
|
7
|
+
* For AI-assisted development workflows, counting commits to the
|
|
8
|
+
* default branch is more accurate than counting formal releases.
|
|
6
9
|
*/
|
|
7
|
-
import {
|
|
10
|
+
import { Commit, DeploymentFrequencyMetric } from '../types.js';
|
|
8
11
|
/**
|
|
9
|
-
* Calculate Deployment Frequency from
|
|
12
|
+
* Calculate Deployment Frequency from commits to develop
|
|
10
13
|
*
|
|
11
14
|
* Methodology:
|
|
12
|
-
* 1. Count
|
|
13
|
-
* 2.
|
|
14
|
-
* 3.
|
|
15
|
+
* 1. Count commits to develop in last 30 days
|
|
16
|
+
* 2. Each commit = 1 deployment (trunk-based development)
|
|
17
|
+
* 3. Calculate deploys per month
|
|
18
|
+
* 4. Classify into DORA tier
|
|
15
19
|
*
|
|
16
|
-
* @param
|
|
20
|
+
* @param commits - Array of commits to default branch
|
|
17
21
|
* @returns Deployment frequency metric
|
|
18
22
|
*/
|
|
19
|
-
export declare function calculateDeploymentFrequency(
|
|
23
|
+
export declare function calculateDeploymentFrequency(commits: Commit[]): DeploymentFrequencyMetric;
|
|
20
24
|
//# sourceMappingURL=deployment-frequency.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment-frequency.d.ts","sourceRoot":"","sources":["../../../../src/metrics/calculators/deployment-frequency.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deployment-frequency.d.ts","sourceRoot":"","sources":["../../../../src/metrics/calculators/deployment-frequency.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAGhE;;;;;;;;;;;GAWG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EAAE,GAChB,yBAAyB,CA8C3B"}
|
|
@@ -2,32 +2,36 @@
|
|
|
2
2
|
* Deployment Frequency Calculator
|
|
3
3
|
*
|
|
4
4
|
* Calculates how often deployments occur (DORA metric #1)
|
|
5
|
-
* Data source:
|
|
5
|
+
* Data source: Commits to develop branch (each push = deployment)
|
|
6
|
+
*
|
|
7
|
+
* For AI-assisted development workflows, counting commits to the
|
|
8
|
+
* default branch is more accurate than counting formal releases.
|
|
6
9
|
*/
|
|
7
10
|
import { classifyDeploymentFrequency } from '../utils/tier-classifier.js';
|
|
8
11
|
/**
|
|
9
|
-
* Calculate Deployment Frequency from
|
|
12
|
+
* Calculate Deployment Frequency from commits to develop
|
|
10
13
|
*
|
|
11
14
|
* Methodology:
|
|
12
|
-
* 1. Count
|
|
13
|
-
* 2.
|
|
14
|
-
* 3.
|
|
15
|
+
* 1. Count commits to develop in last 30 days
|
|
16
|
+
* 2. Each commit = 1 deployment (trunk-based development)
|
|
17
|
+
* 3. Calculate deploys per month
|
|
18
|
+
* 4. Classify into DORA tier
|
|
15
19
|
*
|
|
16
|
-
* @param
|
|
20
|
+
* @param commits - Array of commits to default branch
|
|
17
21
|
* @returns Deployment frequency metric
|
|
18
22
|
*/
|
|
19
|
-
export function calculateDeploymentFrequency(
|
|
20
|
-
// Handle zero
|
|
21
|
-
if (
|
|
23
|
+
export function calculateDeploymentFrequency(commits) {
|
|
24
|
+
// Handle zero commits
|
|
25
|
+
if (commits.length === 0) {
|
|
22
26
|
return {
|
|
23
27
|
value: 0,
|
|
24
28
|
unit: 'deploys/month',
|
|
25
29
|
tier: 'N/A',
|
|
26
|
-
description: 'No
|
|
30
|
+
description: 'No deployments yet',
|
|
27
31
|
};
|
|
28
32
|
}
|
|
29
|
-
// Count
|
|
30
|
-
const deployCount =
|
|
33
|
+
// Count commits as deployments
|
|
34
|
+
const deployCount = commits.length;
|
|
31
35
|
// Calculate deploys per year (for tier classification)
|
|
32
36
|
// Assumes 30-day window, so multiply by 12 to get annual rate
|
|
33
37
|
const deploysPerYear = (deployCount / 30) * 365;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment-frequency.js","sourceRoot":"","sources":["../../../../src/metrics/calculators/deployment-frequency.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deployment-frequency.js","sourceRoot":"","sources":["../../../../src/metrics/calculators/deployment-frequency.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAE1E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAiB;IAEjB,sBAAsB;IACtB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,KAAK;YACX,WAAW,EAAE,oBAAoB;SAClC,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAEnC,uDAAuD;IACvD,8DAA8D;IAC9D,MAAM,cAAc,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;IAEhD,gBAAgB;IAChB,MAAM,IAAI,GAAG,2BAA2B,CAAC,cAAc,CAAC,CAAC;IAEzD,uBAAuB;IACvB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,WAAW,GAAG,4DAA4D,CAAC;YAC3E,MAAM;QACR,KAAK,MAAM;YACT,WAAW,GAAG,6CAA6C,CAAC;YAC5D,MAAM;QACR,KAAK,QAAQ;YACX,WAAW,GAAG,mDAAmD,CAAC;YAClE,MAAM;QACR,KAAK,KAAK;YACR,WAAW,GAAG,8CAA8C,CAAC;YAC7D,MAAM;QACR;YACE,WAAW,GAAG,mBAAmB,CAAC;IACtC,CAAC;IAED,OAAO;QACL,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,eAAe;QACrB,IAAI;QACJ,WAAW;KACZ,CAAC;AACJ,CAAC"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* Entry point for CLI and GitHub Actions workflow
|
|
7
7
|
*/
|
|
8
8
|
import { GitHubClient } from './github-client.js';
|
|
9
|
-
import { DORAMetrics, Release, Issue } from './types.js';
|
|
9
|
+
import { DORAMetrics, Release, Issue, Commit } from './types.js';
|
|
10
10
|
/**
|
|
11
11
|
* Calculate all DORA metrics
|
|
12
12
|
*
|
|
@@ -17,6 +17,7 @@ export declare function calculateDORAMetrics(client: GitHubClient): Promise<{
|
|
|
17
17
|
metrics: DORAMetrics;
|
|
18
18
|
releases: Release[];
|
|
19
19
|
issues: Issue[];
|
|
20
|
+
deploymentCommits: Commit[];
|
|
20
21
|
}>;
|
|
21
22
|
/**
|
|
22
23
|
* Write metrics to JSON file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dora-calculator.d.ts","sourceRoot":"","sources":["../../../src/metrics/dora-calculator.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,OAAO,EAAE,WAAW,EAAgB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"dora-calculator.d.ts","sourceRoot":"","sources":["../../../src/metrics/dora-calculator.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,OAAO,EAAE,WAAW,EAAgB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE/E;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;IACxE,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC,CAsDD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAY7E"}
|
|
@@ -24,17 +24,21 @@ export async function calculateDORAMetrics(client) {
|
|
|
24
24
|
const since = new Date();
|
|
25
25
|
since.setDate(since.getDate() - 30);
|
|
26
26
|
console.log('š Fetching data from GitHub API...');
|
|
27
|
+
// Get commits to develop branch (each commit = deployment for AI-assisted dev)
|
|
28
|
+
const deploymentCommits = await client.getCommitsToDefaultBranch(since, 'develop');
|
|
29
|
+
console.log(` ā Found ${deploymentCommits.length} commits to develop (deployments)`);
|
|
27
30
|
const releases = await client.getReleases(since);
|
|
28
|
-
console.log(` ā Found ${releases.length} releases`);
|
|
31
|
+
console.log(` ā Found ${releases.length} formal releases`);
|
|
29
32
|
const commits = releases.length > 0
|
|
30
33
|
? await client.getCommits(releases[0].target_commitish, new Date())
|
|
31
|
-
:
|
|
32
|
-
console.log(` ā Found ${commits.length} commits`);
|
|
34
|
+
: deploymentCommits; // Fallback to deployment commits for lead time
|
|
35
|
+
console.log(` ā Found ${commits.length} commits for lead time calc`);
|
|
33
36
|
const issues = await client.getIssues(['incident', 'production-bug'], since);
|
|
34
37
|
console.log(` ā Found ${issues.length} incidents`);
|
|
35
38
|
// Calculate metrics
|
|
36
39
|
console.log('\nš¢ Calculating DORA metrics...');
|
|
37
|
-
|
|
40
|
+
// Use commits to develop for deployment frequency (not just releases)
|
|
41
|
+
const deploymentFrequency = calculateDeploymentFrequency(deploymentCommits);
|
|
38
42
|
console.log(` ā Deployment Frequency: ${deploymentFrequency.value} ${deploymentFrequency.unit} (${deploymentFrequency.tier})`);
|
|
39
43
|
const leadTime = calculateLeadTime(releases, commits);
|
|
40
44
|
console.log(` ā Lead Time: ${leadTime.value} ${leadTime.unit} (${leadTime.tier})`);
|
|
@@ -55,6 +59,7 @@ export async function calculateDORAMetrics(client) {
|
|
|
55
59
|
metrics: metricsResult,
|
|
56
60
|
releases,
|
|
57
61
|
issues,
|
|
62
|
+
deploymentCommits,
|
|
58
63
|
};
|
|
59
64
|
}
|
|
60
65
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dora-calculator.js","sourceRoot":"","sources":["../../../src/metrics/dora-calculator.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAG5E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAoB;
|
|
1
|
+
{"version":3,"file":"dora-calculator.js","sourceRoot":"","sources":["../../../src/metrics/dora-calculator.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAG5E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAoB;IAM7D,wCAAwC;IACxC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAEnD,+EAA+E;IAC/E,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,cAAc,iBAAiB,CAAC,MAAM,mCAAmC,CAAC,CAAC;IAEvF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;QACjC,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC;QACnE,CAAC,CAAC,iBAAiB,CAAC,CAAE,+CAA+C;IACvE,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,MAAM,6BAA6B,CAAC,CAAC;IAEvE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;IAErD,oBAAoB;IACpB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAEhD,sEAAsE;IACtE,MAAM,mBAAmB,GAAG,4BAA4B,CAAC,iBAAiB,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,8BAA8B,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,IAAI,KAAK,mBAAmB,CAAC,IAAI,GAAG,CAAC,CAAC;IAEjI,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;IAErF,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,6BAA6B,iBAAiB,CAAC,KAAK,MAAM,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC;IAEjG,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAEpE,MAAM,aAAa,GAAgB;QACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAE;YACP,mBAAmB;YACnB,QAAQ;YACR,iBAAiB;YACjB,IAAI;SACL;KACF,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,aAAa;QACtB,QAAQ;QACR,MAAM;QACN,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAoB,EAAE,QAAgB;IACrE,0BAA0B;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,oCAAoC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,wBAAwB,CAAC;QAC7E,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAEpD,oBAAoB;QACpB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAElD,kBAAkB;QAClB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAC7F,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAEjD,qCAAqC;QACrC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACtF,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;QAC7F,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAEtC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,eAAe,cAAc,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,oDAAoD;AACpD,IAAI,EAAE,CAAC"}
|
|
@@ -28,6 +28,18 @@ export declare class GitHubClient {
|
|
|
28
28
|
* @returns Array of commits
|
|
29
29
|
*/
|
|
30
30
|
getCommits(sha: string, until: Date): Promise<Commit[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Get commits to the default branch (develop/main) since a date
|
|
33
|
+
*
|
|
34
|
+
* For AI-assisted development workflows, each push to develop
|
|
35
|
+
* represents a deployment. This is more accurate than counting
|
|
36
|
+
* only formal releases.
|
|
37
|
+
*
|
|
38
|
+
* @param since - Date to fetch commits from
|
|
39
|
+
* @param branch - Branch name (defaults to 'develop')
|
|
40
|
+
* @returns Array of commits
|
|
41
|
+
*/
|
|
42
|
+
getCommitsToDefaultBranch(since: Date, branch?: string): Promise<Commit[]>;
|
|
31
43
|
/**
|
|
32
44
|
* Get issues with specific labels
|
|
33
45
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../../src/metrics/github-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AASlE;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,IAAI,CAAS;gBAET,MAAM,EAAE,YAAY;IAQhC;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAsBlD;;;;;;OAMG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoB7D;;;;;;OAMG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAqBhE;;;;;;;;;OASG;YACW,eAAe;CAiB9B"}
|
|
1
|
+
{"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../../src/metrics/github-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AASlE;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,IAAI,CAAS;gBAET,MAAM,EAAE,YAAY;IAQhC;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAsBlD;;;;;;OAMG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoB7D;;;;;;;;;;OAUG;IACG,yBAAyB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,GAAE,MAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoB3F;;;;;;OAMG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAqBhE;;;;;;;;;OASG;YACW,eAAe;CAiB9B"}
|
|
@@ -75,6 +75,36 @@ export class GitHubClient {
|
|
|
75
75
|
throw error;
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Get commits to the default branch (develop/main) since a date
|
|
80
|
+
*
|
|
81
|
+
* For AI-assisted development workflows, each push to develop
|
|
82
|
+
* represents a deployment. This is more accurate than counting
|
|
83
|
+
* only formal releases.
|
|
84
|
+
*
|
|
85
|
+
* @param since - Date to fetch commits from
|
|
86
|
+
* @param branch - Branch name (defaults to 'develop')
|
|
87
|
+
* @returns Array of commits
|
|
88
|
+
*/
|
|
89
|
+
async getCommitsToDefaultBranch(since, branch = 'develop') {
|
|
90
|
+
try {
|
|
91
|
+
const response = await this.octokit.rest.repos.listCommits({
|
|
92
|
+
owner: this.owner,
|
|
93
|
+
repo: this.repo,
|
|
94
|
+
sha: branch,
|
|
95
|
+
per_page: 100,
|
|
96
|
+
since: since.toISOString(),
|
|
97
|
+
});
|
|
98
|
+
return response.data;
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
if (error.status === 403) {
|
|
102
|
+
await this.handleRateLimit(error);
|
|
103
|
+
return this.getCommitsToDefaultBranch(since, branch); // Retry
|
|
104
|
+
}
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
78
108
|
/**
|
|
79
109
|
* Get issues with specific labels
|
|
80
110
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../../src/metrics/github-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../../src/metrics/github-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,39 @@ export declare class SyncCoordinator {
|
|
|
38
38
|
* @returns Array of created issues
|
|
39
39
|
*/
|
|
40
40
|
createGitHubIssuesForUserStories(config: any): Promise<GitHubIssue[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Close GitHub issues for all User Stories when increment completes (NEW in v0.28.1)
|
|
43
|
+
*
|
|
44
|
+
* This is the CRITICAL missing feature that was causing GitHub issues to remain
|
|
45
|
+
* open after increments were closed.
|
|
46
|
+
*
|
|
47
|
+
* Called by: syncIncrementClosure() when increment status changes to "completed"
|
|
48
|
+
*
|
|
49
|
+
* Flow:
|
|
50
|
+
* 1. Get feature ID from increment spec
|
|
51
|
+
* 2. Load all user stories for that feature
|
|
52
|
+
* 3. For each user story with a GitHub issue, close it with completion comment
|
|
53
|
+
*
|
|
54
|
+
* @param config - Project configuration
|
|
55
|
+
* @returns Array of closed issue numbers
|
|
56
|
+
*/
|
|
57
|
+
closeGitHubIssuesForUserStories(config: any): Promise<number[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Sync increment closure to external tools (NEW in v0.28.1)
|
|
60
|
+
*
|
|
61
|
+
* This method is called when an increment is marked as "completed".
|
|
62
|
+
* It handles the complete closure flow including:
|
|
63
|
+
* - Creating any missing GitHub issues (idempotent)
|
|
64
|
+
* - Closing all User Story GitHub issues
|
|
65
|
+
* - Syncing final status to external tools
|
|
66
|
+
*
|
|
67
|
+
* CRITICAL: This was the missing piece causing issues to stay open!
|
|
68
|
+
*
|
|
69
|
+
* @returns SyncResult with closure details
|
|
70
|
+
*/
|
|
71
|
+
syncIncrementClosure(): Promise<SyncResult & {
|
|
72
|
+
closedIssues: number[];
|
|
73
|
+
}>;
|
|
41
74
|
/**
|
|
42
75
|
* Format user story content for GitHub issue body
|
|
43
76
|
*/
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;IAgO3E;;;;;;;;;;;;;;;OAeG;IACG,+BAA+B,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgHrE;;;;;;;;;;;;OAYG;IACG,oBAAoB,IAAI,OAAO,CAAC,UAAU,GAAG;QAAE,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAiF9E;;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"}
|
|
@@ -62,8 +62,17 @@ export class SyncCoordinator {
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
if (!featureId) {
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
// AUTO-GENERATE feature ID from increment number (ADR-0139)
|
|
66
|
+
const incrementMatch = this.incrementId.match(/^(\d+)/);
|
|
67
|
+
if (incrementMatch) {
|
|
68
|
+
featureId = `FS-${incrementMatch[1]}`;
|
|
69
|
+
this.logger.log(`š Auto-generated feature ID: ${featureId} (no epic/feature_id in spec.md)`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
this.logger.log('ā ļø No feature ID found and could not auto-generate - skipping GitHub sync');
|
|
73
|
+
this.logger.log(' š” Add epic: FS-XXX or feature_id: FS-XXX to spec.md frontmatter');
|
|
74
|
+
return createdIssues;
|
|
75
|
+
}
|
|
67
76
|
}
|
|
68
77
|
// Try to find or create milestone for the feature
|
|
69
78
|
let milestoneNumber = null;
|
|
@@ -204,6 +213,198 @@ export class SyncCoordinator {
|
|
|
204
213
|
throw error;
|
|
205
214
|
}
|
|
206
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Close GitHub issues for all User Stories when increment completes (NEW in v0.28.1)
|
|
218
|
+
*
|
|
219
|
+
* This is the CRITICAL missing feature that was causing GitHub issues to remain
|
|
220
|
+
* open after increments were closed.
|
|
221
|
+
*
|
|
222
|
+
* Called by: syncIncrementClosure() when increment status changes to "completed"
|
|
223
|
+
*
|
|
224
|
+
* Flow:
|
|
225
|
+
* 1. Get feature ID from increment spec
|
|
226
|
+
* 2. Load all user stories for that feature
|
|
227
|
+
* 3. For each user story with a GitHub issue, close it with completion comment
|
|
228
|
+
*
|
|
229
|
+
* @param config - Project configuration
|
|
230
|
+
* @returns Array of closed issue numbers
|
|
231
|
+
*/
|
|
232
|
+
async closeGitHubIssuesForUserStories(config) {
|
|
233
|
+
const closedIssues = [];
|
|
234
|
+
try {
|
|
235
|
+
// Load user stories for this increment
|
|
236
|
+
const userStories = await this.loadUserStoriesForIncrement();
|
|
237
|
+
if (userStories.length === 0) {
|
|
238
|
+
this.logger.log('š No user stories found for this increment');
|
|
239
|
+
return closedIssues;
|
|
240
|
+
}
|
|
241
|
+
this.logger.log(`š Found ${userStories.length} user story/stories for GitHub issue closure`);
|
|
242
|
+
// Get GitHub config
|
|
243
|
+
const githubConfig = config.sync?.github || {};
|
|
244
|
+
const repoInfo = await this.detectGitHubRepo(githubConfig);
|
|
245
|
+
if (!repoInfo) {
|
|
246
|
+
throw new Error('GitHub repository not configured');
|
|
247
|
+
}
|
|
248
|
+
const client = GitHubClientV2.fromRepo(repoInfo.owner, repoInfo.repo);
|
|
249
|
+
// Get feature ID from increment spec
|
|
250
|
+
const specFile = path.join(this.projectRoot, '.specweave/increments', this.incrementId, 'spec.md');
|
|
251
|
+
let featureId = '';
|
|
252
|
+
if (existsSync(specFile)) {
|
|
253
|
+
const content = await fs.readFile(specFile, 'utf-8');
|
|
254
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
255
|
+
if (frontmatterMatch) {
|
|
256
|
+
const frontmatter = yaml.parse(frontmatterMatch[1]);
|
|
257
|
+
featureId = frontmatter.feature_id || frontmatter.epic || frontmatter.feature || '';
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (!featureId) {
|
|
261
|
+
// AUTO-GENERATE feature ID from increment number (same logic as create)
|
|
262
|
+
const incrementMatch = this.incrementId.match(/^(\d+)/);
|
|
263
|
+
if (incrementMatch) {
|
|
264
|
+
featureId = `FS-${incrementMatch[1]}`;
|
|
265
|
+
this.logger.log(`š Auto-generated feature ID: ${featureId}`);
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
this.logger.log('ā ļø No feature ID found - skipping GitHub issue closure');
|
|
269
|
+
return closedIssues;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Close issue for each user story
|
|
273
|
+
for (const usFile of userStories) {
|
|
274
|
+
try {
|
|
275
|
+
// Search for the GitHub issue by title pattern
|
|
276
|
+
const searchTitle = `[${featureId}][${usFile.id}]`;
|
|
277
|
+
const existingIssue = await client.searchIssueByTitle(searchTitle);
|
|
278
|
+
if (!existingIssue) {
|
|
279
|
+
this.logger.log(` āļø ${usFile.id} - No GitHub issue found (skipping)`);
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
// Check if already closed (GitHub returns lowercase state)
|
|
283
|
+
if (existingIssue.state === 'closed') {
|
|
284
|
+
this.logger.log(` āļø ${usFile.id} - Issue #${existingIssue.number} already closed`);
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
// Close the issue with completion comment
|
|
288
|
+
this.logger.log(` š Closing GitHub issue #${existingIssue.number} for ${usFile.id}...`);
|
|
289
|
+
const completionComment = `## ā
User Story Complete
|
|
290
|
+
|
|
291
|
+
Increment \`${this.incrementId}\` has been marked as **completed**.
|
|
292
|
+
|
|
293
|
+
**User Story**: ${usFile.id} - ${usFile.title || 'N/A'}
|
|
294
|
+
|
|
295
|
+
### Completion Details
|
|
296
|
+
- ā
All acceptance criteria satisfied
|
|
297
|
+
- ā
All related tasks completed
|
|
298
|
+
- ā
Tests passing
|
|
299
|
+
- ā
Documentation updated
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
š¤ Auto-closed by SpecWeave on increment completion`;
|
|
303
|
+
await client.closeIssue(existingIssue.number, completionComment);
|
|
304
|
+
closedIssues.push(existingIssue.number);
|
|
305
|
+
this.logger.log(` ā
Closed issue #${existingIssue.number}`);
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
this.logger.error(` ā Failed to close issue for ${usFile.id}:`, error);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (closedIssues.length > 0) {
|
|
312
|
+
this.logger.log(`\nā
Closed ${closedIssues.length} GitHub issue(s) for ${featureId}`);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
this.logger.log('\nā
No GitHub issues needed closing (all already closed or not found)');
|
|
316
|
+
}
|
|
317
|
+
return closedIssues;
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
this.logger.error('ā Failed to close GitHub issues:', error);
|
|
321
|
+
throw error;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Sync increment closure to external tools (NEW in v0.28.1)
|
|
326
|
+
*
|
|
327
|
+
* This method is called when an increment is marked as "completed".
|
|
328
|
+
* It handles the complete closure flow including:
|
|
329
|
+
* - Creating any missing GitHub issues (idempotent)
|
|
330
|
+
* - Closing all User Story GitHub issues
|
|
331
|
+
* - Syncing final status to external tools
|
|
332
|
+
*
|
|
333
|
+
* CRITICAL: This was the missing piece causing issues to stay open!
|
|
334
|
+
*
|
|
335
|
+
* @returns SyncResult with closure details
|
|
336
|
+
*/
|
|
337
|
+
async syncIncrementClosure() {
|
|
338
|
+
const result = {
|
|
339
|
+
success: false,
|
|
340
|
+
userStoriesSynced: 0,
|
|
341
|
+
syncMode: 'read-only',
|
|
342
|
+
errors: [],
|
|
343
|
+
closedIssues: []
|
|
344
|
+
};
|
|
345
|
+
try {
|
|
346
|
+
this.logger.log(`\nš Syncing increment CLOSURE for ${this.incrementId}...`);
|
|
347
|
+
// 1. Load config
|
|
348
|
+
const config = await this.loadConfig();
|
|
349
|
+
// Check gates (same as syncIncrementCompletion)
|
|
350
|
+
const canUpdateExternal = config.sync?.settings?.canUpdateExternalItems ?? false;
|
|
351
|
+
const githubEnabled = config.sync?.github?.enabled ?? false;
|
|
352
|
+
const autoSync = config.sync?.settings?.autoSyncOnCompletion ?? true;
|
|
353
|
+
if (!canUpdateExternal) {
|
|
354
|
+
this.logger.log('ā¹ļø External tool sync disabled (canUpdateExternalItems=false)');
|
|
355
|
+
this.logger.log(' GitHub issues will NOT be closed automatically');
|
|
356
|
+
result.syncMode = 'living-docs-only';
|
|
357
|
+
result.success = true;
|
|
358
|
+
return result;
|
|
359
|
+
}
|
|
360
|
+
if (!autoSync) {
|
|
361
|
+
this.logger.log('ā ļø Automatic external sync disabled (autoSyncOnCompletion=false)');
|
|
362
|
+
this.logger.log(' GitHub issues will NOT be closed automatically');
|
|
363
|
+
this.logger.log(' Run /specweave-github:sync to close issues manually');
|
|
364
|
+
result.syncMode = 'manual-only';
|
|
365
|
+
result.success = true;
|
|
366
|
+
return result;
|
|
367
|
+
}
|
|
368
|
+
if (!githubEnabled) {
|
|
369
|
+
this.logger.log('ā¹ļø GitHub sync disabled (sync.github.enabled=false)');
|
|
370
|
+
result.syncMode = 'external-disabled';
|
|
371
|
+
result.success = true;
|
|
372
|
+
return result;
|
|
373
|
+
}
|
|
374
|
+
this.logger.log('ā
All gates passed - closing GitHub issues for user stories');
|
|
375
|
+
// 2. First, ensure all issues exist (idempotent creation)
|
|
376
|
+
this.logger.log('\nš¹ Step 1: Ensuring all GitHub issues exist...');
|
|
377
|
+
try {
|
|
378
|
+
await this.createGitHubIssuesForUserStories(config);
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
this.logger.error('ā ļø GitHub issue creation failed (non-blocking):', error);
|
|
382
|
+
result.errors.push(`GitHub issue creation error: ${error}`);
|
|
383
|
+
}
|
|
384
|
+
// 3. Close all User Story issues
|
|
385
|
+
this.logger.log('\nš¹ Step 2: Closing GitHub issues for completed user stories...');
|
|
386
|
+
try {
|
|
387
|
+
result.closedIssues = await this.closeGitHubIssuesForUserStories(config);
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
this.logger.error('ā ļø GitHub issue closure failed:', error);
|
|
391
|
+
result.errors.push(`GitHub issue closure error: ${error}`);
|
|
392
|
+
}
|
|
393
|
+
result.success = result.errors.length === 0;
|
|
394
|
+
result.syncMode = 'full-sync';
|
|
395
|
+
this.logger.log(`\nā
Increment closure sync complete`);
|
|
396
|
+
this.logger.log(` Issues closed: ${result.closedIssues.length}`);
|
|
397
|
+
if (result.errors.length > 0) {
|
|
398
|
+
this.logger.log(` ā ļø ${result.errors.length} error(s) occurred`);
|
|
399
|
+
}
|
|
400
|
+
return result;
|
|
401
|
+
}
|
|
402
|
+
catch (error) {
|
|
403
|
+
result.errors.push(`Sync closure error: ${error}`);
|
|
404
|
+
this.logger.error('ā Increment closure sync failed:', error);
|
|
405
|
+
return result;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
207
408
|
/**
|
|
208
409
|
* Format user story content for GitHub issue body
|
|
209
410
|
*/
|