specweave 1.0.464 → 1.0.466
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/lib/vendor/core/ac-test-validator-cli.d.ts +16 -0
- package/dist/plugins/specweave/lib/vendor/core/ac-test-validator-cli.js +139 -0
- package/dist/plugins/specweave/lib/vendor/core/ac-test-validator-cli.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/core/ac-test-validator.d.ts +111 -0
- package/dist/plugins/specweave/lib/vendor/core/ac-test-validator.js +304 -0
- package/dist/plugins/specweave/lib/vendor/core/ac-test-validator.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/ac-status-manager.d.ts +115 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js +359 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/active-increment-manager.d.ts +121 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +273 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.d.ts +72 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js +237 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/duplicate-detector.d.ts +52 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +281 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +278 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +925 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/status-auto-transition.d.ts +113 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/status-auto-transition.js +317 -0
- package/dist/plugins/specweave/lib/vendor/core/increment/status-auto-transition.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +442 -0
- package/dist/plugins/specweave/lib/vendor/core/types/increment-metadata.js +246 -0
- package/dist/plugins/specweave/lib/vendor/core/types/increment-metadata.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/core/universal-auto-create.d.ts +64 -0
- package/dist/plugins/specweave/lib/vendor/core/universal-auto-create.js +228 -0
- package/dist/plugins/specweave/lib/vendor/core/universal-auto-create.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/generators/spec/task-parser.d.ts +95 -0
- package/dist/plugins/specweave/lib/vendor/generators/spec/task-parser.js +300 -0
- package/dist/plugins/specweave/lib/vendor/generators/spec/task-parser.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/sync/config.d.ts +73 -0
- package/dist/plugins/specweave/lib/vendor/sync/config.js +132 -0
- package/dist/plugins/specweave/lib/vendor/sync/config.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/sync/github-reconciler.d.ts +163 -0
- package/dist/plugins/specweave/lib/vendor/sync/github-reconciler.js +898 -0
- package/dist/plugins/specweave/lib/vendor/sync/github-reconciler.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/sync/provider-router.d.ts +86 -0
- package/dist/plugins/specweave/lib/vendor/sync/provider-router.js +147 -0
- package/dist/plugins/specweave/lib/vendor/sync/provider-router.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/sync/status-mapper.d.ts +120 -0
- package/dist/plugins/specweave/lib/vendor/sync/status-mapper.js +164 -0
- package/dist/plugins/specweave/lib/vendor/sync/status-mapper.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/utils/auth-helpers.d.ts +151 -0
- package/dist/plugins/specweave/lib/vendor/utils/auth-helpers.js +359 -0
- package/dist/plugins/specweave/lib/vendor/utils/auth-helpers.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/utils/chalk-fallback.d.ts +38 -0
- package/dist/plugins/specweave/lib/vendor/utils/chalk-fallback.js +118 -0
- package/dist/plugins/specweave/lib/vendor/utils/chalk-fallback.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/utils/clean-env.d.ts +47 -0
- package/dist/plugins/specweave/lib/vendor/utils/clean-env.js +63 -0
- package/dist/plugins/specweave/lib/vendor/utils/clean-env.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/utils/credential-masker.d.ts +118 -0
- package/dist/plugins/specweave/lib/vendor/utils/credential-masker.js +275 -0
- package/dist/plugins/specweave/lib/vendor/utils/credential-masker.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/utils/execFileNoThrow.d.ts +99 -0
- package/dist/plugins/specweave/lib/vendor/utils/execFileNoThrow.js +149 -0
- package/dist/plugins/specweave/lib/vendor/utils/execFileNoThrow.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/utils/feature-id-derivation.d.ts +63 -0
- package/dist/plugins/specweave/lib/vendor/utils/feature-id-derivation.js +85 -0
- package/dist/plugins/specweave/lib/vendor/utils/feature-id-derivation.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/utils/fs-native.d.ts +219 -0
- package/dist/plugins/specweave/lib/vendor/utils/fs-native.js +397 -0
- package/dist/plugins/specweave/lib/vendor/utils/fs-native.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/utils/logger.d.ts +56 -0
- package/dist/plugins/specweave/lib/vendor/utils/logger.js +123 -0
- package/dist/plugins/specweave/lib/vendor/utils/logger.js.map +1 -0
- package/dist/plugins/specweave/lib/vendor/utils/translation.d.ts +187 -0
- package/dist/plugins/specweave/lib/vendor/utils/translation.js +414 -0
- package/dist/plugins/specweave/lib/vendor/utils/translation.js.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-ac-checkbox-sync.js +1 -1
- package/dist/plugins/specweave-ado/lib/ado-ac-checkbox-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.js +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-ac-checkbox-sync.js +2 -2
- package/dist/plugins/specweave-github/lib/github-ac-checkbox-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.js +13 -4
- package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-ac-checkbox-sync.js +1 -1
- package/dist/plugins/specweave-jira/lib/jira-ac-checkbox-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.js +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.js.map +1 -1
- package/dist/src/sync/spec-to-living-docs-sync.js +1 -1
- package/dist/src/sync/spec-to-living-docs-sync.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/lib/vendor/utils/auth-helpers.d.ts +151 -0
- package/plugins/specweave/lib/vendor/utils/auth-helpers.js +359 -0
- package/plugins/specweave/lib/vendor/utils/auth-helpers.js.map +1 -0
- package/plugins/specweave/skills/team-lead/SKILL.md +150 -56
- package/plugins/specweave/skills/team-lead/agents/backend.md +13 -9
- package/plugins/specweave/skills/team-lead/agents/database.md +13 -9
- package/plugins/specweave/skills/team-lead/agents/frontend.md +12 -8
- package/plugins/specweave/skills/team-lead/agents/security.md +13 -9
- package/plugins/specweave/skills/team-lead/agents/testing.md +12 -8
- package/plugins/specweave-ado/lib/ado-ac-checkbox-sync.js +1 -1
- package/plugins/specweave-ado/lib/ado-ac-checkbox-sync.ts +1 -1
- package/plugins/specweave-ado/lib/ado-spec-sync.js +1 -1
- package/plugins/specweave-ado/lib/ado-spec-sync.ts +1 -1
- package/plugins/specweave-github/lib/github-ac-checkbox-sync.js +1 -1
- package/plugins/specweave-github/lib/github-ac-checkbox-sync.ts +2 -2
- package/plugins/specweave-github/lib/github-feature-sync.js +11 -3
- package/plugins/specweave-github/lib/github-feature-sync.ts +13 -4
- package/plugins/specweave-jira/lib/jira-ac-checkbox-sync.js +1 -1
- package/plugins/specweave-jira/lib/jira-ac-checkbox-sync.ts +1 -1
- package/plugins/specweave-jira/lib/jira-spec-sync.js +1 -1
- package/plugins/specweave-jira/lib/jira-spec-sync.ts +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Auto-Create for External Tools
|
|
3
|
+
*
|
|
4
|
+
* Creates per-user-story items in ALL enabled providers (JIRA, ADO).
|
|
5
|
+
* GitHub is handled separately by the existing github-auto-create-handler.sh.
|
|
6
|
+
*
|
|
7
|
+
* Called by universal-auto-create-dispatcher.sh when spec.md is written.
|
|
8
|
+
*
|
|
9
|
+
* @module universal-auto-create
|
|
10
|
+
*/
|
|
11
|
+
export interface UniversalAutoCreateConfig {
|
|
12
|
+
sync: {
|
|
13
|
+
jira?: {
|
|
14
|
+
enabled?: boolean;
|
|
15
|
+
};
|
|
16
|
+
ado?: {
|
|
17
|
+
enabled?: boolean;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
jira?: {
|
|
21
|
+
domain?: string;
|
|
22
|
+
projectKey?: string;
|
|
23
|
+
};
|
|
24
|
+
ado?: {
|
|
25
|
+
organization?: string;
|
|
26
|
+
project?: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface UserStoryInfo {
|
|
30
|
+
id: string;
|
|
31
|
+
title: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ProviderCreateResult {
|
|
34
|
+
created: Array<{
|
|
35
|
+
usId: string;
|
|
36
|
+
ref: string;
|
|
37
|
+
url: string;
|
|
38
|
+
}>;
|
|
39
|
+
skipped: Array<{
|
|
40
|
+
usId: string;
|
|
41
|
+
reason: string;
|
|
42
|
+
}>;
|
|
43
|
+
errors: Array<{
|
|
44
|
+
usId: string;
|
|
45
|
+
error: string;
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
export type UniversalAutoCreateResult = {
|
|
49
|
+
jira?: ProviderCreateResult;
|
|
50
|
+
ado?: ProviderCreateResult;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Parse user stories (ID + title) from spec.md content.
|
|
54
|
+
* Matches patterns like "### US-001: User story title"
|
|
55
|
+
*/
|
|
56
|
+
export declare function parseUserStories(content: string): UserStoryInfo[];
|
|
57
|
+
/**
|
|
58
|
+
* Create per-user-story items in JIRA and/or ADO for an increment.
|
|
59
|
+
*
|
|
60
|
+
* GitHub is NOT handled here (delegated to existing bash handler).
|
|
61
|
+
* This function is called by the universal-auto-create-dispatcher.sh.
|
|
62
|
+
*/
|
|
63
|
+
export declare function createExternalIssuesForIncrement(incrementId: string, specPath: string, metadataPath: string, config: UniversalAutoCreateConfig): Promise<UniversalAutoCreateResult>;
|
|
64
|
+
//# sourceMappingURL=universal-auto-create.d.ts.map
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Auto-Create for External Tools
|
|
3
|
+
*
|
|
4
|
+
* Creates per-user-story items in ALL enabled providers (JIRA, ADO).
|
|
5
|
+
* GitHub is handled separately by the existing github-auto-create-handler.sh.
|
|
6
|
+
*
|
|
7
|
+
* Called by universal-auto-create-dispatcher.sh when spec.md is written.
|
|
8
|
+
*
|
|
9
|
+
* @module universal-auto-create
|
|
10
|
+
*/
|
|
11
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
12
|
+
import { existsSync } from 'fs';
|
|
13
|
+
import { deriveFeatureId } from '../utils/feature-id-derivation.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Helpers
|
|
16
|
+
// ============================================================================
|
|
17
|
+
function emptyResult() {
|
|
18
|
+
return { created: [], skipped: [], errors: [] };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse user stories (ID + title) from spec.md content.
|
|
22
|
+
* Matches patterns like "### US-001: User story title"
|
|
23
|
+
*/
|
|
24
|
+
export function parseUserStories(content) {
|
|
25
|
+
const stories = [];
|
|
26
|
+
const pattern = /###\s+(US-(?:[A-Z]+-)*\d+):\s*(.+)/g;
|
|
27
|
+
let match;
|
|
28
|
+
while ((match = pattern.exec(content)) !== null) {
|
|
29
|
+
stories.push({ id: match[1], title: match[2].trim() });
|
|
30
|
+
}
|
|
31
|
+
return stories;
|
|
32
|
+
}
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Provider Functions
|
|
35
|
+
// ============================================================================
|
|
36
|
+
async function createJiraUserStories(incrementId, featureId, userStories, existingLinks, config) {
|
|
37
|
+
const result = emptyResult();
|
|
38
|
+
const { JiraClient } = await import('../integrations/jira/jira-client.js');
|
|
39
|
+
const domain = config.jira?.domain || '';
|
|
40
|
+
const projectKey = config.jira?.projectKey || '';
|
|
41
|
+
if (!domain || !projectKey) {
|
|
42
|
+
result.errors.push({ usId: 'config', error: 'JIRA domain or projectKey not configured' });
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
const client = new JiraClient();
|
|
46
|
+
for (const us of userStories) {
|
|
47
|
+
// Idempotency: skip if already linked
|
|
48
|
+
if (existingLinks[us.id]) {
|
|
49
|
+
result.skipped.push({ usId: us.id, reason: 'already-linked' });
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const summary = `[${featureId}][${us.id}] ${us.title}`;
|
|
54
|
+
const issue = await client.createIssue({
|
|
55
|
+
issueType: 'Story',
|
|
56
|
+
summary,
|
|
57
|
+
labels: ['specweave', 'auto-created'],
|
|
58
|
+
}, projectKey);
|
|
59
|
+
const issueUrl = `https://${domain}/browse/${issue.key}`;
|
|
60
|
+
result.created.push({ usId: us.id, ref: issue.key, url: issueUrl });
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
64
|
+
result.errors.push({ usId: us.id, error: msg });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
async function createAdoUserStories(incrementId, featureId, userStories, existingLinks, config) {
|
|
70
|
+
const result = emptyResult();
|
|
71
|
+
const { AdoClient } = await import('../integrations/ado/ado-client.js');
|
|
72
|
+
const { getAdoPat } = await import('../integrations/ado/ado-pat-provider.js');
|
|
73
|
+
const organization = config.ado?.organization || '';
|
|
74
|
+
const project = config.ado?.project || '';
|
|
75
|
+
if (!organization || !project) {
|
|
76
|
+
result.errors.push({ usId: 'config', error: 'ADO organization or project not configured' });
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
const pat = getAdoPat(organization);
|
|
80
|
+
if (!pat) {
|
|
81
|
+
result.errors.push({ usId: 'config', error: 'AZURE_DEVOPS_PAT not set' });
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
const client = new AdoClient({ pat, organization, project });
|
|
85
|
+
for (const us of userStories) {
|
|
86
|
+
// Idempotency: skip if already linked
|
|
87
|
+
if (existingLinks[us.id]) {
|
|
88
|
+
result.skipped.push({ usId: us.id, reason: 'already-linked' });
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
const title = `[${featureId}][${us.id}] ${us.title}`;
|
|
93
|
+
const workItem = await client.createWorkItem({
|
|
94
|
+
workItemType: 'User Story',
|
|
95
|
+
title,
|
|
96
|
+
tags: ['specweave', 'auto-created'],
|
|
97
|
+
});
|
|
98
|
+
result.created.push({
|
|
99
|
+
usId: us.id,
|
|
100
|
+
ref: String(workItem.id),
|
|
101
|
+
url: workItem.url,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
106
|
+
result.errors.push({ usId: us.id, error: msg });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
// ============================================================================
|
|
112
|
+
// Metadata Update
|
|
113
|
+
// ============================================================================
|
|
114
|
+
async function updateMetadata(metadataPath, results) {
|
|
115
|
+
if (!existsSync(metadataPath))
|
|
116
|
+
return;
|
|
117
|
+
const raw = await readFile(metadataPath, 'utf-8');
|
|
118
|
+
const metadata = JSON.parse(raw);
|
|
119
|
+
if (!metadata.externalLinks) {
|
|
120
|
+
metadata.externalLinks = {};
|
|
121
|
+
}
|
|
122
|
+
const now = new Date().toISOString();
|
|
123
|
+
// Update JIRA links
|
|
124
|
+
if (results.jira && results.jira.created.length > 0) {
|
|
125
|
+
if (!metadata.externalLinks.jira) {
|
|
126
|
+
metadata.externalLinks.jira = { userStories: {} };
|
|
127
|
+
}
|
|
128
|
+
if (!metadata.externalLinks.jira.userStories) {
|
|
129
|
+
metadata.externalLinks.jira.userStories = {};
|
|
130
|
+
}
|
|
131
|
+
for (const item of results.jira.created) {
|
|
132
|
+
metadata.externalLinks.jira.userStories[item.usId] = {
|
|
133
|
+
issueKey: item.ref,
|
|
134
|
+
issueUrl: item.url,
|
|
135
|
+
syncedAt: now,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Update ADO links
|
|
140
|
+
if (results.ado && results.ado.created.length > 0) {
|
|
141
|
+
if (!metadata.externalLinks.ado) {
|
|
142
|
+
metadata.externalLinks.ado = { userStories: {} };
|
|
143
|
+
}
|
|
144
|
+
if (!metadata.externalLinks.ado.userStories) {
|
|
145
|
+
metadata.externalLinks.ado.userStories = {};
|
|
146
|
+
}
|
|
147
|
+
for (const item of results.ado.created) {
|
|
148
|
+
metadata.externalLinks.ado.userStories[item.usId] = {
|
|
149
|
+
workItemId: parseInt(item.ref, 10),
|
|
150
|
+
workItemUrl: item.url,
|
|
151
|
+
syncedAt: now,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
await writeFile(metadataPath, JSON.stringify(metadata, null, 2) + '\n', 'utf-8');
|
|
156
|
+
}
|
|
157
|
+
// ============================================================================
|
|
158
|
+
// Main Entry Point
|
|
159
|
+
// ============================================================================
|
|
160
|
+
/**
|
|
161
|
+
* Create per-user-story items in JIRA and/or ADO for an increment.
|
|
162
|
+
*
|
|
163
|
+
* GitHub is NOT handled here (delegated to existing bash handler).
|
|
164
|
+
* This function is called by the universal-auto-create-dispatcher.sh.
|
|
165
|
+
*/
|
|
166
|
+
export async function createExternalIssuesForIncrement(incrementId, specPath, metadataPath, config) {
|
|
167
|
+
const result = {};
|
|
168
|
+
// Parse user stories from spec.md
|
|
169
|
+
const content = await readFile(specPath, 'utf-8');
|
|
170
|
+
const userStories = parseUserStories(content);
|
|
171
|
+
if (userStories.length === 0) {
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
// Derive feature ID
|
|
175
|
+
let featureId;
|
|
176
|
+
try {
|
|
177
|
+
featureId = deriveFeatureId(incrementId);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
const numMatch = incrementId.match(/^(\d+)/);
|
|
181
|
+
featureId = numMatch ? `FS-${parseInt(numMatch[1], 10)}` : `FS-${incrementId.substring(0, 3)}`;
|
|
182
|
+
}
|
|
183
|
+
// Load existing external links from metadata (for idempotency)
|
|
184
|
+
let existingJiraLinks = {};
|
|
185
|
+
let existingAdoLinks = {};
|
|
186
|
+
if (existsSync(metadataPath)) {
|
|
187
|
+
try {
|
|
188
|
+
const metaRaw = await readFile(metadataPath, 'utf-8');
|
|
189
|
+
const metadata = JSON.parse(metaRaw);
|
|
190
|
+
existingJiraLinks = metadata.externalLinks?.jira?.userStories || {};
|
|
191
|
+
existingAdoLinks = metadata.externalLinks?.ado?.userStories || {};
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Metadata parse error — proceed without existing links
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Create in each enabled provider (isolated errors)
|
|
198
|
+
if (config.sync?.jira?.enabled) {
|
|
199
|
+
try {
|
|
200
|
+
result.jira = await createJiraUserStories(incrementId, featureId, userStories, existingJiraLinks, config);
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
const providerResult = emptyResult();
|
|
204
|
+
providerResult.errors.push({
|
|
205
|
+
usId: 'unknown',
|
|
206
|
+
error: err instanceof Error ? err.message : String(err),
|
|
207
|
+
});
|
|
208
|
+
result.jira = providerResult;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (config.sync?.ado?.enabled) {
|
|
212
|
+
try {
|
|
213
|
+
result.ado = await createAdoUserStories(incrementId, featureId, userStories, existingAdoLinks, config);
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
const providerResult = emptyResult();
|
|
217
|
+
providerResult.errors.push({
|
|
218
|
+
usId: 'unknown',
|
|
219
|
+
error: err instanceof Error ? err.message : String(err),
|
|
220
|
+
});
|
|
221
|
+
result.ado = providerResult;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Update metadata with new links
|
|
225
|
+
await updateMetadata(metadataPath, result);
|
|
226
|
+
return result;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=universal-auto-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"universal-auto-create.js","sourceRoot":"","sources":["../../../src/core/universal-auto-create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Parser with US-Task Linkage Support
|
|
3
|
+
*
|
|
4
|
+
* Parses tasks.md files to extract task metadata including new US linkage fields:
|
|
5
|
+
* - userStory: US-ID this task implements (e.g., "US-001")
|
|
6
|
+
* - satisfiesACs: List of AC-IDs this task satisfies (e.g., ["AC-US1-01", "AC-US1-02"])
|
|
7
|
+
*
|
|
8
|
+
* Supports hierarchical task structure grouped by User Story.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Task metadata extracted from tasks.md
|
|
12
|
+
*/
|
|
13
|
+
export interface Task {
|
|
14
|
+
/** Task ID (e.g., "T-001") */
|
|
15
|
+
id: string;
|
|
16
|
+
/** Task title */
|
|
17
|
+
title: string;
|
|
18
|
+
/** User Story this task implements (optional for backward compatibility) */
|
|
19
|
+
userStory?: string;
|
|
20
|
+
/** Acceptance Criteria IDs this task satisfies (optional) */
|
|
21
|
+
satisfiesACs?: string[];
|
|
22
|
+
/** Task completion status */
|
|
23
|
+
status: TaskStatus;
|
|
24
|
+
/** Priority level (P0, P1, P2, P3) */
|
|
25
|
+
priority?: string;
|
|
26
|
+
/** Estimated effort (e.g., "4 hours", "2 days") */
|
|
27
|
+
estimatedEffort?: string;
|
|
28
|
+
/** Task dependencies (task IDs this depends on) */
|
|
29
|
+
dependencies?: string[];
|
|
30
|
+
/** Full task description */
|
|
31
|
+
description?: string;
|
|
32
|
+
/** Files affected by this task */
|
|
33
|
+
filesAffected?: string[];
|
|
34
|
+
/** Line number in tasks.md (for error reporting) */
|
|
35
|
+
lineNumber?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Task completion status
|
|
39
|
+
*/
|
|
40
|
+
export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'transferred' | 'canceled';
|
|
41
|
+
/**
|
|
42
|
+
* Tasks grouped by User Story
|
|
43
|
+
*/
|
|
44
|
+
export interface TasksByUserStory {
|
|
45
|
+
[usId: string]: Task[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validation error for task linkage
|
|
49
|
+
*/
|
|
50
|
+
export interface TaskLinkageError {
|
|
51
|
+
taskId: string;
|
|
52
|
+
field: 'userStory' | 'satisfiesACs';
|
|
53
|
+
value: string;
|
|
54
|
+
message: string;
|
|
55
|
+
suggestedFix?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parse tasks.md and extract all tasks with US linkage
|
|
59
|
+
*
|
|
60
|
+
* @param tasksPath - Path to tasks.md file
|
|
61
|
+
* @returns Map of User Story ID → Tasks
|
|
62
|
+
* @throws Error if tasks.md cannot be read or is malformed
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseTasksWithUSLinks(tasksPath: string): TasksByUserStory;
|
|
65
|
+
/**
|
|
66
|
+
* Validate task US and AC linkage
|
|
67
|
+
*
|
|
68
|
+
* @param task - Task to validate
|
|
69
|
+
* @param validUSIds - List of valid US-IDs from spec.md
|
|
70
|
+
* @param validACIds - List of valid AC-IDs from spec.md
|
|
71
|
+
* @returns Array of validation errors (empty if valid)
|
|
72
|
+
*/
|
|
73
|
+
export declare function validateTaskLinkage(task: Task, validUSIds: string[], validACIds: string[]): TaskLinkageError[];
|
|
74
|
+
/**
|
|
75
|
+
* Get all tasks (flattened, not grouped by US)
|
|
76
|
+
*
|
|
77
|
+
* @param tasksByUS - Tasks grouped by User Story
|
|
78
|
+
* @returns Array of all tasks
|
|
79
|
+
*/
|
|
80
|
+
export declare function getAllTasks(tasksByUS: TasksByUserStory): Task[];
|
|
81
|
+
/**
|
|
82
|
+
* Count tasks by status
|
|
83
|
+
*
|
|
84
|
+
* @param tasksByUS - Tasks grouped by User Story
|
|
85
|
+
* @returns Map of status → count
|
|
86
|
+
*/
|
|
87
|
+
export declare function countTasksByStatus(tasksByUS: TasksByUserStory): Record<TaskStatus, number>;
|
|
88
|
+
/**
|
|
89
|
+
* Calculate completion percentage
|
|
90
|
+
*
|
|
91
|
+
* @param tasksByUS - Tasks grouped by User Story
|
|
92
|
+
* @returns Completion percentage (0-100)
|
|
93
|
+
*/
|
|
94
|
+
export declare function calculateCompletionPercentage(tasksByUS: TasksByUserStory): number;
|
|
95
|
+
//# sourceMappingURL=task-parser.d.ts.map
|