smart-spec-kit-mcp 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +262 -0
  2. package/dist/engine/sessionManager.d.ts +137 -0
  3. package/dist/engine/sessionManager.d.ts.map +1 -0
  4. package/dist/engine/sessionManager.js +128 -0
  5. package/dist/engine/sessionManager.js.map +1 -0
  6. package/dist/engine/workflowEngine.d.ts +57 -0
  7. package/dist/engine/workflowEngine.d.ts.map +1 -0
  8. package/dist/engine/workflowEngine.js +400 -0
  9. package/dist/engine/workflowEngine.js.map +1 -0
  10. package/dist/index.d.ts +14 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +122 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/prompts/agents.d.ts +61 -0
  15. package/dist/prompts/agents.d.ts.map +1 -0
  16. package/dist/prompts/agents.js +236 -0
  17. package/dist/prompts/agents.js.map +1 -0
  18. package/dist/schemas/workflowSchema.d.ts +70 -0
  19. package/dist/schemas/workflowSchema.d.ts.map +1 -0
  20. package/dist/schemas/workflowSchema.js +42 -0
  21. package/dist/schemas/workflowSchema.js.map +1 -0
  22. package/dist/tools/agentTools.d.ts +11 -0
  23. package/dist/tools/agentTools.d.ts.map +1 -0
  24. package/dist/tools/agentTools.js +119 -0
  25. package/dist/tools/agentTools.js.map +1 -0
  26. package/dist/tools/orchestrationTools.d.ts +12 -0
  27. package/dist/tools/orchestrationTools.d.ts.map +1 -0
  28. package/dist/tools/orchestrationTools.js +375 -0
  29. package/dist/tools/orchestrationTools.js.map +1 -0
  30. package/dist/tools/workflowTools.d.ts +11 -0
  31. package/dist/tools/workflowTools.d.ts.map +1 -0
  32. package/dist/tools/workflowTools.js +236 -0
  33. package/dist/tools/workflowTools.js.map +1 -0
  34. package/dist/utils/markdownGenerator.d.ts +70 -0
  35. package/dist/utils/markdownGenerator.d.ts.map +1 -0
  36. package/dist/utils/markdownGenerator.js +206 -0
  37. package/dist/utils/markdownGenerator.js.map +1 -0
  38. package/dist/utils/vsCodeConfigGenerator.d.ts +32 -0
  39. package/dist/utils/vsCodeConfigGenerator.d.ts.map +1 -0
  40. package/dist/utils/vsCodeConfigGenerator.js +88 -0
  41. package/dist/utils/vsCodeConfigGenerator.js.map +1 -0
  42. package/dist/utils/workflowLoader.d.ts +99 -0
  43. package/dist/utils/workflowLoader.d.ts.map +1 -0
  44. package/dist/utils/workflowLoader.js +281 -0
  45. package/dist/utils/workflowLoader.js.map +1 -0
  46. package/package.json +61 -0
  47. package/templates/bugfix-report.md +184 -0
  48. package/templates/functional-spec.md +191 -0
  49. package/workflows/bugfix.yaml +99 -0
  50. package/workflows/feature-full.yaml +344 -0
  51. package/workflows/feature-standard.yaml +92 -0
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Markdown Generator
3
+ *
4
+ * Utilities for generating and filling Markdown templates with data
5
+ */
6
+ /**
7
+ * Work item data from Azure DevOps
8
+ */
9
+ export interface WorkItemData {
10
+ id: number | string;
11
+ title: string;
12
+ description?: string;
13
+ acceptanceCriteria?: string;
14
+ type?: string;
15
+ state?: string;
16
+ assignedTo?: string;
17
+ tags?: string[];
18
+ parentId?: number;
19
+ childIds?: number[];
20
+ links?: Array<{
21
+ rel: string;
22
+ url: string;
23
+ }>;
24
+ customFields?: Record<string, unknown>;
25
+ [key: string]: unknown;
26
+ }
27
+ /**
28
+ * Template fill options
29
+ */
30
+ export interface FillOptions {
31
+ /** Keep [TO FILL] placeholders for sections without data */
32
+ keepPlaceholders?: boolean;
33
+ /** Add a marker when data is auto-filled vs placeholder */
34
+ markAutoFilled?: boolean;
35
+ /** Custom date format */
36
+ dateFormat?: string;
37
+ }
38
+ /**
39
+ * Fill a template with work item data
40
+ *
41
+ * @param template - The Markdown template string
42
+ * @param workItem - Data from Azure DevOps work item
43
+ * @param options - Fill options
44
+ * @returns Filled template string
45
+ */
46
+ export declare function fillTemplate(template: string, workItem: WorkItemData, options?: Partial<FillOptions>): string;
47
+ /**
48
+ * Extract all placeholders from a template
49
+ */
50
+ export declare function extractPlaceholders(template: string): Array<{
51
+ type: string;
52
+ value: string;
53
+ description?: string;
54
+ }>;
55
+ /**
56
+ * Generate frontmatter YAML from work item data
57
+ */
58
+ export declare function generateFrontmatter(workItem: WorkItemData): string;
59
+ /**
60
+ * Create a specification document from template and work item
61
+ */
62
+ export declare function createSpecification(template: string, workItem: WorkItemData, options?: Partial<FillOptions>): string;
63
+ /**
64
+ * Summary of unfilled placeholders
65
+ */
66
+ export declare function getUnfilledSummary(content: string): {
67
+ count: number;
68
+ items: string[];
69
+ };
70
+ //# sourceMappingURL=markdownGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdownGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/markdownGenerator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8ED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,OAAO,CAAC,WAAW,CAAM,GACjC,MAAM,CAiCR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBlH;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CA+BlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,OAAO,CAAC,WAAW,CAAM,GACjC,MAAM,CAgBR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAUtF"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Markdown Generator
3
+ *
4
+ * Utilities for generating and filling Markdown templates with data
5
+ */
6
+ /**
7
+ * Placeholder pattern for template variables
8
+ * Matches: [TO FILL], [TO FILL: description], {variable_name}
9
+ */
10
+ const PLACEHOLDER_PATTERNS = {
11
+ toFill: /\[TO FILL(?::\s*([^\]]+))?\]/g,
12
+ variable: /\{(\w+)\}/g,
13
+ };
14
+ const DEFAULT_OPTIONS = {
15
+ keepPlaceholders: true,
16
+ markAutoFilled: false,
17
+ dateFormat: "YYYY-MM-DD",
18
+ };
19
+ /**
20
+ * Format a date according to the specified format
21
+ */
22
+ function formatDate(date, format) {
23
+ const year = date.getFullYear();
24
+ const month = String(date.getMonth() + 1).padStart(2, "0");
25
+ const day = String(date.getDate()).padStart(2, "0");
26
+ return format
27
+ .replace("YYYY", String(year))
28
+ .replace("MM", month)
29
+ .replace("DD", day);
30
+ }
31
+ /**
32
+ * Extract a safe string value from potentially complex data
33
+ */
34
+ function safeString(value) {
35
+ if (value === null || value === undefined) {
36
+ return "";
37
+ }
38
+ if (typeof value === "string") {
39
+ return value;
40
+ }
41
+ if (typeof value === "number" || typeof value === "boolean") {
42
+ return String(value);
43
+ }
44
+ if (Array.isArray(value)) {
45
+ return value.map(safeString).join(", ");
46
+ }
47
+ // For any other object type
48
+ return JSON.stringify(value);
49
+ }
50
+ /**
51
+ * Build a data map from work item for template filling
52
+ */
53
+ function buildDataMap(workItem, options) {
54
+ const now = new Date();
55
+ const dateStr = formatDate(now, options.dateFormat ?? "YYYY-MM-DD");
56
+ return {
57
+ // Work item fields
58
+ workitem_id: safeString(workItem.id),
59
+ id: safeString(workItem.id),
60
+ title: safeString(workItem.title),
61
+ "Feature Title": safeString(workItem.title),
62
+ description: safeString(workItem.description),
63
+ acceptance_criteria: safeString(workItem.acceptanceCriteria),
64
+ type: safeString(workItem.type),
65
+ state: safeString(workItem.state),
66
+ assigned_to: safeString(workItem.assignedTo),
67
+ tags: safeString(workItem.tags),
68
+ // Metadata
69
+ Date: dateStr,
70
+ date: dateStr,
71
+ created: dateStr,
72
+ last_updated: dateStr,
73
+ // Azure DevOps link
74
+ azure_devops_link: workItem.id
75
+ ? `[ADO #${workItem.id}](https://dev.azure.com/_workitems/edit/${workItem.id})`
76
+ : "[TO FILL: Link to ADO Work Item]",
77
+ // Context
78
+ context_id: safeString(workItem.id),
79
+ };
80
+ }
81
+ /**
82
+ * Fill a template with work item data
83
+ *
84
+ * @param template - The Markdown template string
85
+ * @param workItem - Data from Azure DevOps work item
86
+ * @param options - Fill options
87
+ * @returns Filled template string
88
+ */
89
+ export function fillTemplate(template, workItem, options = {}) {
90
+ const opts = { ...DEFAULT_OPTIONS, ...options };
91
+ const dataMap = buildDataMap(workItem, opts);
92
+ let result = template;
93
+ // Replace {variable} placeholders
94
+ result = result.replaceAll(PLACEHOLDER_PATTERNS.variable, (match, varName) => {
95
+ const value = dataMap[varName];
96
+ if (value !== undefined && value !== "") {
97
+ return opts.markAutoFilled ? `${value} <!--auto-filled-->` : value;
98
+ }
99
+ return opts.keepPlaceholders ? match : "";
100
+ });
101
+ // Replace [TO FILL: description] placeholders with matching data
102
+ result = result.replaceAll(PLACEHOLDER_PATTERNS.toFill, (match, description) => {
103
+ if (!description) {
104
+ return opts.keepPlaceholders ? match : "";
105
+ }
106
+ // Try to match description to data map keys
107
+ const normalizedDesc = description.toLowerCase().replaceAll(/\s+/g, "_");
108
+ const value = dataMap[normalizedDesc] ?? dataMap[description];
109
+ if (value !== undefined && value !== "") {
110
+ return opts.markAutoFilled ? `${value} <!--auto-filled-->` : value;
111
+ }
112
+ return opts.keepPlaceholders ? match : "";
113
+ });
114
+ return result;
115
+ }
116
+ /**
117
+ * Extract all placeholders from a template
118
+ */
119
+ export function extractPlaceholders(template) {
120
+ const placeholders = [];
121
+ // Find [TO FILL] placeholders
122
+ let match;
123
+ const toFillRegex = new RegExp(PLACEHOLDER_PATTERNS.toFill.source, "g");
124
+ while ((match = toFillRegex.exec(template)) !== null) {
125
+ placeholders.push({
126
+ type: "toFill",
127
+ value: match[0],
128
+ description: match[1],
129
+ });
130
+ }
131
+ // Find {variable} placeholders
132
+ const varRegex = new RegExp(PLACEHOLDER_PATTERNS.variable.source, "g");
133
+ while ((match = varRegex.exec(template)) !== null) {
134
+ placeholders.push({
135
+ type: "variable",
136
+ value: match[0],
137
+ description: match[1],
138
+ });
139
+ }
140
+ return placeholders;
141
+ }
142
+ /**
143
+ * Generate frontmatter YAML from work item data
144
+ */
145
+ export function generateFrontmatter(workItem) {
146
+ const now = new Date();
147
+ const dateStr = formatDate(now, "YYYY-MM-DD");
148
+ const frontmatter = {
149
+ title: workItem.title,
150
+ workitem_id: workItem.id,
151
+ type: workItem.type ?? "Specification",
152
+ version: "1.0",
153
+ status: "Draft",
154
+ author: workItem.assignedTo ?? "[TO FILL]",
155
+ created: dateStr,
156
+ last_updated: dateStr,
157
+ azure_devops_link: `https://dev.azure.com/_workitems/edit/${workItem.id}`,
158
+ tags: workItem.tags ?? [],
159
+ };
160
+ const lines = ["---"];
161
+ for (const [key, value] of Object.entries(frontmatter)) {
162
+ if (Array.isArray(value)) {
163
+ lines.push(`${key}:`);
164
+ for (const item of value) {
165
+ lines.push(` - ${item}`);
166
+ }
167
+ }
168
+ else {
169
+ lines.push(`${key}: "${value}"`);
170
+ }
171
+ }
172
+ lines.push("---");
173
+ return lines.join("\n");
174
+ }
175
+ /**
176
+ * Create a specification document from template and work item
177
+ */
178
+ export function createSpecification(template, workItem, options = {}) {
179
+ // Update frontmatter if present
180
+ const hasFrontmatter = template.startsWith("---");
181
+ if (hasFrontmatter) {
182
+ // Replace existing frontmatter
183
+ const endIndex = template.indexOf("---", 3);
184
+ if (endIndex !== -1) {
185
+ const newFrontmatter = generateFrontmatter(workItem);
186
+ const body = template.slice(endIndex + 3);
187
+ return newFrontmatter + fillTemplate(body, workItem, options);
188
+ }
189
+ }
190
+ // No frontmatter, just fill the template
191
+ return fillTemplate(template, workItem, options);
192
+ }
193
+ /**
194
+ * Summary of unfilled placeholders
195
+ */
196
+ export function getUnfilledSummary(content) {
197
+ const placeholders = extractPlaceholders(content);
198
+ const toFillItems = placeholders
199
+ .filter((p) => p.type === "toFill")
200
+ .map((p) => p.description ?? "Unspecified");
201
+ return {
202
+ count: toFillItems.length,
203
+ items: [...new Set(toFillItems)], // Deduplicate
204
+ };
205
+ }
206
+ //# sourceMappingURL=markdownGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdownGenerator.js","sourceRoot":"","sources":["../../src/utils/markdownGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * VS Code Configuration Generator
3
+ *
4
+ * Generates the MCP server configuration for VS Code settings.json
5
+ */
6
+ interface McpServerConfig {
7
+ command: string;
8
+ args: string[];
9
+ env?: Record<string, string>;
10
+ }
11
+ interface VsCodeMcpConfig {
12
+ "mcp": {
13
+ servers: Record<string, McpServerConfig>;
14
+ };
15
+ }
16
+ /**
17
+ * Generate the VS Code MCP configuration for Spec-Kit server
18
+ * @param projectPath - Absolute path to the spec-kit-mcp project
19
+ * @returns Configuration object for VS Code settings.json
20
+ */
21
+ export declare function generateSpecKitConfig(projectPath: string): VsCodeMcpConfig;
22
+ /**
23
+ * Generate configuration snippet as a formatted JSON string
24
+ * Ready to be merged into VS Code settings.json
25
+ */
26
+ export declare function generateConfigSnippet(projectPath: string): string;
27
+ /**
28
+ * Print configuration instructions to console
29
+ */
30
+ export declare function printSetupInstructions(projectPath: string): void;
31
+ export {};
32
+ //# sourceMappingURL=vsCodeConfigGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vsCodeConfigGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/vsCodeConfigGenerator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,UAAU,eAAe;IACvB,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;KAC1C,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAa1E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CA+ChE"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * VS Code Configuration Generator
3
+ *
4
+ * Generates the MCP server configuration for VS Code settings.json
5
+ */
6
+ import * as path from "node:path";
7
+ /**
8
+ * Generate the VS Code MCP configuration for Spec-Kit server
9
+ * @param projectPath - Absolute path to the spec-kit-mcp project
10
+ * @returns Configuration object for VS Code settings.json
11
+ */
12
+ export function generateSpecKitConfig(projectPath) {
13
+ const normalizedPath = path.resolve(projectPath);
14
+ return {
15
+ "mcp": {
16
+ servers: {
17
+ "spec-kit": {
18
+ command: "node",
19
+ args: [path.join(normalizedPath, "dist", "index.js")],
20
+ },
21
+ },
22
+ },
23
+ };
24
+ }
25
+ /**
26
+ * Generate configuration snippet as a formatted JSON string
27
+ * Ready to be merged into VS Code settings.json
28
+ */
29
+ export function generateConfigSnippet(projectPath) {
30
+ const config = generateSpecKitConfig(projectPath);
31
+ return JSON.stringify(config, null, 2);
32
+ }
33
+ /**
34
+ * Print configuration instructions to console
35
+ */
36
+ export function printSetupInstructions(projectPath) {
37
+ const normalizedPath = path.resolve(projectPath);
38
+ console.log(`
39
+ ╔══════════════════════════════════════════════════════════════════╗
40
+ ║ SPEC-KIT MCP SERVER - VS CODE CONFIGURATION ║
41
+ ╚══════════════════════════════════════════════════════════════════╝
42
+
43
+ Add the following to your VS Code settings.json (User or Workspace):
44
+
45
+ ─────────────────────────────────────────────────────────────────────
46
+ {
47
+ "mcp": {
48
+ "servers": {
49
+ "spec-kit": {
50
+ "command": "node",
51
+ "args": ["${normalizedPath.replaceAll("\\", "\\\\")}\\\\dist\\\\index.js"]
52
+ }
53
+ }
54
+ }
55
+ }
56
+ ─────────────────────────────────────────────────────────────────────
57
+
58
+ 📋 Quick Setup Steps:
59
+ 1. Build the project: npm run build
60
+ 2. Open VS Code Settings (Ctrl+Shift+P → "Preferences: Open User Settings (JSON)")
61
+ 3. Add the "spec-kit" server config to your existing "mcp.servers" object
62
+ 4. Reload VS Code window (Ctrl+Shift+P → "Developer: Reload Window")
63
+ 5. Test in Copilot Chat: Ask to use the "ping" tool
64
+
65
+ 💡 If you already have Azure DevOps MCP configured, your final config should look like:
66
+
67
+ {
68
+ "mcp": {
69
+ "servers": {
70
+ "azure-devops": {
71
+ // ... your existing Azure DevOps config ...
72
+ },
73
+ "spec-kit": {
74
+ "command": "node",
75
+ "args": ["${normalizedPath.replaceAll("\\", "\\\\")}\\\\dist\\\\index.js"]
76
+ }
77
+ }
78
+ }
79
+ }
80
+
81
+ `);
82
+ }
83
+ // CLI execution
84
+ if (process.argv[1]?.includes("vsCodeConfigGenerator")) {
85
+ const projectPath = process.argv[2] || process.cwd();
86
+ printSetupInstructions(projectPath);
87
+ }
88
+ //# sourceMappingURL=vsCodeConfigGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vsCodeConfigGenerator.js","sourceRoot":"","sources":["../../src/utils/vsCodeConfigGenerator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAclC;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAEjD,OAAO;QACL,KAAK,EAAE;YACL,OAAO,EAAE;gBACP,UAAU,EAAE;oBACV,OAAO,EAAE,MAAM;oBACf,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;iBACtD;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,MAAM,MAAM,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;oBAaM,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;oBAwBvC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;;;;;;CAM1D,CAAC,CAAC;AACH,CAAC;AAED,gBAAgB;AAChB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACrD,sBAAsB,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Workflow Loader v2
3
+ *
4
+ * Loads workflows and templates with local override support.
5
+ *
6
+ * Resolution order:
7
+ * 1. Local project: .spec-kit/workflows/ and .spec-kit/templates/
8
+ * 2. Package defaults: /workflows and /templates
9
+ *
10
+ * This allows any project to customize workflows while using defaults.
11
+ */
12
+ import { type Workflow } from "../schemas/workflowSchema.js";
13
+ export type { Workflow } from "../schemas/workflowSchema.js";
14
+ /**
15
+ * List all available workflows (local + package defaults)
16
+ */
17
+ export declare function listWorkflows(): Promise<string[]>;
18
+ /**
19
+ * List workflows with source information
20
+ */
21
+ export declare function listWorkflowsDetailed(): Promise<{
22
+ name: string;
23
+ source: "local" | "package";
24
+ path: string;
25
+ }[]>;
26
+ /**
27
+ * Load and validate a workflow by name
28
+ */
29
+ export declare function loadWorkflow(workflowName: string): Promise<Workflow>;
30
+ /**
31
+ * Load a template file by name
32
+ */
33
+ export declare function loadTemplate(templateName: string): Promise<string>;
34
+ /**
35
+ * List all available templates (local + package defaults)
36
+ */
37
+ export declare function listTemplates(): Promise<string[]>;
38
+ /**
39
+ * Load a workflow with its associated template
40
+ */
41
+ export declare function loadWorkflowWithTemplate(workflowName: string): Promise<{
42
+ workflow: Workflow;
43
+ template: string;
44
+ }>;
45
+ /**
46
+ * Get workflow step by ID
47
+ */
48
+ export declare function getWorkflowStep(workflow: Workflow, stepId: string): {
49
+ id: string;
50
+ name: string;
51
+ action: "fetch_ado" | "generate_content" | "review" | "create_file" | "call_agent";
52
+ description: string;
53
+ agent?: string | undefined;
54
+ inputs?: Record<string, string> | undefined;
55
+ outputs?: string[] | undefined;
56
+ next?: string | undefined;
57
+ } | undefined;
58
+ /**
59
+ * Get the first step of a workflow
60
+ */
61
+ export declare function getFirstStep(workflow: Workflow): {
62
+ id: string;
63
+ name: string;
64
+ action: "fetch_ado" | "generate_content" | "review" | "create_file" | "call_agent";
65
+ description: string;
66
+ agent?: string | undefined;
67
+ inputs?: Record<string, string> | undefined;
68
+ outputs?: string[] | undefined;
69
+ next?: string | undefined;
70
+ } | undefined;
71
+ /**
72
+ * Get the next step in a workflow
73
+ */
74
+ export declare function getNextStep(workflow: Workflow, currentStepId: string): {
75
+ id: string;
76
+ name: string;
77
+ action: "fetch_ado" | "generate_content" | "review" | "create_file" | "call_agent";
78
+ description: string;
79
+ agent?: string | undefined;
80
+ inputs?: Record<string, string> | undefined;
81
+ outputs?: string[] | undefined;
82
+ next?: string | undefined;
83
+ } | null | undefined;
84
+ /**
85
+ * Initialize local spec-kit directory with example files
86
+ */
87
+ export declare function initLocalConfig(): Promise<void>;
88
+ /**
89
+ * Get configuration info for debugging
90
+ */
91
+ export declare function getConfigInfo(): {
92
+ packageRoot: string;
93
+ projectRoot: string;
94
+ searchPaths: {
95
+ workflows: string[];
96
+ templates: string[];
97
+ };
98
+ };
99
+ //# sourceMappingURL=workflowLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflowLoader.d.ts","sourceRoot":"","sources":["../../src/utils/workflowLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAG7E,YAAY,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAmH7D;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAGvD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CACpD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAC9D,CAEA;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CA8B1E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAaxE;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAGvD;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAKnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;;;;;;;;;cAEjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ;;;;;;;;;cAE9C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM;;;;;;;;;qBAepE;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAiErD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC3D,CASA"}