@specforge/mcp 2.1.6 → 2.2.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 (156) hide show
  1. package/dist/cli/commands/blocked.js +6 -6
  2. package/dist/cli/commands/blocked.js.map +1 -1
  3. package/dist/cli/commands/debug/test.d.ts.map +1 -1
  4. package/dist/cli/commands/debug/test.js +4 -3
  5. package/dist/cli/commands/debug/test.js.map +1 -1
  6. package/dist/cli/commands/doctor.d.ts.map +1 -1
  7. package/dist/cli/commands/doctor.js +39 -23
  8. package/dist/cli/commands/doctor.js.map +1 -1
  9. package/dist/cli/commands/feedback.d.ts +16 -0
  10. package/dist/cli/commands/feedback.d.ts.map +1 -0
  11. package/dist/cli/commands/feedback.js +220 -0
  12. package/dist/cli/commands/feedback.js.map +1 -0
  13. package/dist/cli/commands/feedback.types.d.ts +116 -0
  14. package/dist/cli/commands/feedback.types.d.ts.map +1 -0
  15. package/dist/cli/commands/feedback.types.js +97 -0
  16. package/dist/cli/commands/feedback.types.js.map +1 -0
  17. package/dist/cli/commands/index.d.ts +1 -0
  18. package/dist/cli/commands/index.d.ts.map +1 -1
  19. package/dist/cli/commands/index.js +1 -0
  20. package/dist/cli/commands/index.js.map +1 -1
  21. package/dist/cli/commands/init.d.ts.map +1 -1
  22. package/dist/cli/commands/init.js +7 -3
  23. package/dist/cli/commands/init.js.map +1 -1
  24. package/dist/cli/commands/next.js +3 -3
  25. package/dist/cli/commands/next.js.map +1 -1
  26. package/dist/cli/commands/review/epic-review.js +2 -2
  27. package/dist/cli/commands/review/epic-review.js.map +1 -1
  28. package/dist/cli/commands/review/types.d.ts +1 -1
  29. package/dist/cli/commands/review/types.d.ts.map +1 -1
  30. package/dist/cli/commands/scaffold/agent-types.d.ts +49 -0
  31. package/dist/cli/commands/scaffold/agent-types.d.ts.map +1 -0
  32. package/dist/cli/commands/scaffold/agent-types.js +37 -0
  33. package/dist/cli/commands/scaffold/agent-types.js.map +1 -0
  34. package/dist/cli/commands/scaffold/display.d.ts +31 -2
  35. package/dist/cli/commands/scaffold/display.d.ts.map +1 -1
  36. package/dist/cli/commands/scaffold/display.js +176 -14
  37. package/dist/cli/commands/scaffold/display.js.map +1 -1
  38. package/dist/cli/commands/scaffold/register.d.ts.map +1 -1
  39. package/dist/cli/commands/scaffold/register.js +8 -4
  40. package/dist/cli/commands/scaffold/register.js.map +1 -1
  41. package/dist/cli/commands/scaffold/scaffold.d.ts +1 -1
  42. package/dist/cli/commands/scaffold/scaffold.d.ts.map +1 -1
  43. package/dist/cli/commands/scaffold/scaffold.js +522 -30
  44. package/dist/cli/commands/scaffold/scaffold.js.map +1 -1
  45. package/dist/cli/commands/scaffold/targets.d.ts +12 -0
  46. package/dist/cli/commands/scaffold/targets.d.ts.map +1 -1
  47. package/dist/cli/commands/scaffold/targets.js +33 -0
  48. package/dist/cli/commands/scaffold/targets.js.map +1 -1
  49. package/dist/cli/commands/scaffold/types.d.ts +34 -1
  50. package/dist/cli/commands/scaffold/types.d.ts.map +1 -1
  51. package/dist/cli/commands/scaffold/types.js.map +1 -1
  52. package/dist/cli/commands/scaffold/utils.d.ts +22 -1
  53. package/dist/cli/commands/scaffold/utils.d.ts.map +1 -1
  54. package/dist/cli/commands/scaffold/utils.js +106 -0
  55. package/dist/cli/commands/scaffold/utils.js.map +1 -1
  56. package/dist/cli/commands/session/start.js +1 -1
  57. package/dist/cli/commands/session/start.js.map +1 -1
  58. package/dist/cli/commands/status.types.d.ts +1 -1
  59. package/dist/cli/commands/status.types.d.ts.map +1 -1
  60. package/dist/cli/commands/status.types.js +2 -2
  61. package/dist/cli/commands/status.types.js.map +1 -1
  62. package/dist/cli/commands/ticket/resolver.js +1 -1
  63. package/dist/cli/commands/ticket/resolver.js.map +1 -1
  64. package/dist/cli/commands/tickets.js +1 -1
  65. package/dist/cli/commands/tickets.js.map +1 -1
  66. package/dist/cli/commands/tickets.types.d.ts +1 -1
  67. package/dist/cli/commands/tickets.types.d.ts.map +1 -1
  68. package/dist/cli/config/writer.d.ts +32 -13
  69. package/dist/cli/config/writer.d.ts.map +1 -1
  70. package/dist/cli/config/writer.js +30 -11
  71. package/dist/cli/config/writer.js.map +1 -1
  72. package/dist/cli/index.d.ts.map +1 -1
  73. package/dist/cli/index.js +3 -1
  74. package/dist/cli/index.js.map +1 -1
  75. package/dist/cli/templates/agents/content/core/sfag-implementer.d.ts +8 -0
  76. package/dist/cli/templates/agents/content/core/sfag-implementer.d.ts.map +1 -0
  77. package/dist/cli/templates/agents/content/core/sfag-implementer.js +111 -0
  78. package/dist/cli/templates/agents/content/core/sfag-implementer.js.map +1 -0
  79. package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts +8 -0
  80. package/dist/cli/templates/agents/content/core/sfag-orchestrator.d.ts.map +1 -0
  81. package/dist/cli/templates/agents/content/core/sfag-orchestrator.js +105 -0
  82. package/dist/cli/templates/agents/content/core/sfag-orchestrator.js.map +1 -0
  83. package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts +8 -0
  84. package/dist/cli/templates/agents/content/core/sfag-spec-creator.d.ts.map +1 -0
  85. package/dist/cli/templates/agents/content/core/sfag-spec-creator.js +124 -0
  86. package/dist/cli/templates/agents/content/core/sfag-spec-creator.js.map +1 -0
  87. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts +8 -0
  88. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.d.ts.map +1 -0
  89. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js +130 -0
  90. package/dist/cli/templates/agents/content/core/sfag-ticket-implementer.js.map +1 -0
  91. package/dist/cli/templates/agents/content/research/sfag-package-researcher.d.ts +8 -0
  92. package/dist/cli/templates/agents/content/research/sfag-package-researcher.d.ts.map +1 -0
  93. package/dist/cli/templates/agents/content/research/sfag-package-researcher.js +151 -0
  94. package/dist/cli/templates/agents/content/research/sfag-package-researcher.js.map +1 -0
  95. package/dist/cli/templates/agents/content/task-type/sfag-api-implementer.d.ts +8 -0
  96. package/dist/cli/templates/agents/content/task-type/sfag-api-implementer.d.ts.map +1 -0
  97. package/dist/cli/templates/agents/content/task-type/sfag-api-implementer.js +130 -0
  98. package/dist/cli/templates/agents/content/task-type/sfag-api-implementer.js.map +1 -0
  99. package/dist/cli/templates/agents/content/task-type/sfag-docs-writer.d.ts +8 -0
  100. package/dist/cli/templates/agents/content/task-type/sfag-docs-writer.d.ts.map +1 -0
  101. package/dist/cli/templates/agents/content/task-type/sfag-docs-writer.js +181 -0
  102. package/dist/cli/templates/agents/content/task-type/sfag-docs-writer.js.map +1 -0
  103. package/dist/cli/templates/agents/content/task-type/sfag-frontend-builder.d.ts +8 -0
  104. package/dist/cli/templates/agents/content/task-type/sfag-frontend-builder.d.ts.map +1 -0
  105. package/dist/cli/templates/agents/content/task-type/sfag-frontend-builder.js +139 -0
  106. package/dist/cli/templates/agents/content/task-type/sfag-frontend-builder.js.map +1 -0
  107. package/dist/cli/templates/agents/content/task-type/sfag-infra-architect.d.ts +8 -0
  108. package/dist/cli/templates/agents/content/task-type/sfag-infra-architect.d.ts.map +1 -0
  109. package/dist/cli/templates/agents/content/task-type/sfag-infra-architect.js +147 -0
  110. package/dist/cli/templates/agents/content/task-type/sfag-infra-architect.js.map +1 -0
  111. package/dist/cli/templates/agents/content/task-type/sfag-schema-designer.d.ts +8 -0
  112. package/dist/cli/templates/agents/content/task-type/sfag-schema-designer.d.ts.map +1 -0
  113. package/dist/cli/templates/agents/content/task-type/sfag-schema-designer.js +130 -0
  114. package/dist/cli/templates/agents/content/task-type/sfag-schema-designer.js.map +1 -0
  115. package/dist/cli/templates/agents/content/task-type/sfag-test-writer.d.ts +8 -0
  116. package/dist/cli/templates/agents/content/task-type/sfag-test-writer.d.ts.map +1 -0
  117. package/dist/cli/templates/agents/content/task-type/sfag-test-writer.js +169 -0
  118. package/dist/cli/templates/agents/content/task-type/sfag-test-writer.js.map +1 -0
  119. package/dist/cli/templates/agents/index.d.ts +23 -0
  120. package/dist/cli/templates/agents/index.d.ts.map +1 -0
  121. package/dist/cli/templates/agents/index.js +63 -0
  122. package/dist/cli/templates/agents/index.js.map +1 -0
  123. package/dist/cli/templates/index.d.ts +2 -1
  124. package/dist/cli/templates/index.d.ts.map +1 -1
  125. package/dist/cli/templates/index.js +4 -1
  126. package/dist/cli/templates/index.js.map +1 -1
  127. package/dist/lib/index.d.ts +1 -0
  128. package/dist/lib/index.d.ts.map +1 -1
  129. package/dist/lib/index.js +1 -0
  130. package/dist/lib/index.js.map +1 -1
  131. package/dist/lib/workflow-definitions.d.ts +41 -0
  132. package/dist/lib/workflow-definitions.d.ts.map +1 -0
  133. package/dist/lib/workflow-definitions.js +511 -0
  134. package/dist/lib/workflow-definitions.js.map +1 -0
  135. package/dist/tools/core/bulk.d.ts.map +1 -1
  136. package/dist/tools/core/bulk.js +5 -30
  137. package/dist/tools/core/bulk.js.map +1 -1
  138. package/dist/tools/core/feedback.d.ts +110 -0
  139. package/dist/tools/core/feedback.d.ts.map +1 -0
  140. package/dist/tools/core/feedback.js +303 -0
  141. package/dist/tools/core/feedback.js.map +1 -0
  142. package/dist/tools/core/help.d.ts.map +1 -1
  143. package/dist/tools/core/help.js +17 -2
  144. package/dist/tools/core/help.js.map +1 -1
  145. package/dist/tools/core/index.d.ts +2 -0
  146. package/dist/tools/core/index.d.ts.map +1 -1
  147. package/dist/tools/core/index.js +2 -0
  148. package/dist/tools/core/index.js.map +1 -1
  149. package/dist/tools/core/workflow-guide.d.ts +13 -0
  150. package/dist/tools/core/workflow-guide.d.ts.map +1 -0
  151. package/dist/tools/core/workflow-guide.js +332 -0
  152. package/dist/tools/core/workflow-guide.js.map +1 -0
  153. package/dist/tools/index.d.ts.map +1 -1
  154. package/dist/tools/index.js +131 -96
  155. package/dist/tools/index.js.map +1 -1
  156. package/package.json +1 -1
@@ -1,21 +1,28 @@
1
1
  /**
2
2
  * Scaffold Command Implementation
3
3
  *
4
- * Main scaffold command that generates SpecForge commands for AI CLI tools.
4
+ * Main scaffold command that generates SpecForge commands and agents for AI CLI tools.
5
5
  */
6
6
  import path from 'path';
7
- import { TARGETS, isValidTarget, getSupportedTargets, getTargetPath } from './targets.js';
7
+ import { COMMAND_CATEGORIES } from './types.js';
8
+ import { AGENT_CATEGORIES } from './agent-types.js';
9
+ import { TARGETS, isValidTarget, getSupportedTargets, getTargetPath, getAgentPath, getAgentSupportedTargets, } from './targets.js';
8
10
  import { getCommandTemplates } from '../../templates/commands.js';
9
- import { detectInstalledTools, generateCommandContent, ensureDirectory, fileExists, writeFile, getCommandFilename, } from './utils.js';
10
- import { displayCommandList, displayScaffoldHeader, displayFileOperation, displayScaffoldSummary, displayTargetError, } from './display.js';
11
+ import { getAgentTemplates } from '../../templates/agents/index.js';
12
+ import { detectInstalledTools, generateCommandContent, generateAgentContent, ensureDirectory, writeFile, getCommandFilename, getAgentFilename, compareFiles, generateDiff, } from './utils.js';
13
+ import { displayCommandList, displayAgentList, displayScaffoldHeader, displayAgentScaffoldHeader, displayFileOperation, displayScaffoldSummary, displayAgentScaffoldSummary, displayTargetError, displayAgentTargetError, displayDiff, displayCommandPreview, displayAgentPreview, } from './display.js';
11
14
  import { colors } from '../../ui/colors.js';
12
15
  /**
13
16
  * Interactive target selection
14
17
  */
15
- async function selectTarget() {
18
+ async function selectTarget(agentMode = false) {
16
19
  const installed = detectInstalledTools();
17
20
  const inquirer = await import('inquirer');
18
- const choices = Object.entries(TARGETS).map(([key, config]) => ({
21
+ // Filter to agent-supporting targets if in agent mode
22
+ const availableTargets = agentMode
23
+ ? Object.entries(TARGETS).filter(([_, config]) => config.supportsAgents)
24
+ : Object.entries(TARGETS);
25
+ const choices = availableTargets.map(([key, config]) => ({
19
26
  name: `${config.name}${installed.includes(key) ? colors.success(' (detected)') : ''}`,
20
27
  value: key,
21
28
  }));
@@ -23,12 +30,317 @@ async function selectTarget() {
23
30
  {
24
31
  type: 'list',
25
32
  name: 'target',
26
- message: 'Select target AI CLI tool:',
33
+ message: agentMode ? 'Select target AI CLI tool (agent support):' : 'Select target AI CLI tool:',
27
34
  choices,
28
35
  },
29
36
  ]);
30
37
  return target;
31
38
  }
39
+ /**
40
+ * Interactive preview mode - allows browsing and previewing commands
41
+ */
42
+ async function interactivePreview(target) {
43
+ const inquirer = await import('inquirer');
44
+ const templates = getCommandTemplates();
45
+ const config = TARGETS[target];
46
+ // Build choices grouped by category
47
+ const choices = [];
48
+ for (const [category, commandNames] of Object.entries(COMMAND_CATEGORIES)) {
49
+ choices.push(new inquirer.default.Separator(`── ${category} ──`));
50
+ for (const name of commandNames) {
51
+ const template = templates.find(t => t.name === name);
52
+ if (template) {
53
+ choices.push({
54
+ name: `${name.padEnd(25)} ${colors.dim(template.description)}`,
55
+ value: name,
56
+ });
57
+ }
58
+ }
59
+ }
60
+ let continuePreview = true;
61
+ while (continuePreview) {
62
+ const { command } = await inquirer.default.prompt([{
63
+ type: 'list',
64
+ name: 'command',
65
+ message: 'Select command to preview (Ctrl+C to exit):',
66
+ choices: [
67
+ ...choices,
68
+ new inquirer.default.Separator(),
69
+ { name: 'Exit', value: null },
70
+ ],
71
+ pageSize: 20,
72
+ }]);
73
+ if (!command) {
74
+ continuePreview = false;
75
+ }
76
+ else {
77
+ const template = templates.find(t => t.name === command);
78
+ if (template) {
79
+ console.clear();
80
+ const content = generateCommandContent(template, config.needsFrontmatter, target);
81
+ displayCommandPreview(template.name, content);
82
+ // Wait for user to press Enter to continue
83
+ await inquirer.default.prompt([{
84
+ type: 'input',
85
+ name: 'continue',
86
+ message: 'Press Enter to continue...',
87
+ }]);
88
+ console.clear();
89
+ }
90
+ }
91
+ }
92
+ }
93
+ /**
94
+ * Interactive agent preview mode
95
+ */
96
+ async function interactiveAgentPreview(target) {
97
+ const inquirer = await import('inquirer');
98
+ const templates = getAgentTemplates();
99
+ const config = TARGETS[target];
100
+ // Build choices grouped by category
101
+ const choices = [];
102
+ for (const [category, agentNames] of Object.entries(AGENT_CATEGORIES)) {
103
+ choices.push(new inquirer.default.Separator(`── ${category} ──`));
104
+ for (const name of agentNames) {
105
+ const template = templates.find(t => t.name === name);
106
+ if (template) {
107
+ choices.push({
108
+ name: `${name.padEnd(25)} ${colors.dim(`[${template.model}]`)} ${colors.dim(template.description)}`,
109
+ value: name,
110
+ });
111
+ }
112
+ }
113
+ }
114
+ let continuePreview = true;
115
+ while (continuePreview) {
116
+ const { agent } = await inquirer.default.prompt([{
117
+ type: 'list',
118
+ name: 'agent',
119
+ message: 'Select agent to preview (Ctrl+C to exit):',
120
+ choices: [
121
+ ...choices,
122
+ new inquirer.default.Separator(),
123
+ { name: 'Exit', value: null },
124
+ ],
125
+ pageSize: 20,
126
+ }]);
127
+ if (!agent) {
128
+ continuePreview = false;
129
+ }
130
+ else {
131
+ const template = templates.find(t => t.name === agent);
132
+ if (template) {
133
+ console.clear();
134
+ const content = generateAgentContent(template, config.needsFrontmatter);
135
+ displayAgentPreview(template.name, content, template.model);
136
+ await inquirer.default.prompt([{
137
+ type: 'input',
138
+ name: 'continue',
139
+ message: 'Press Enter to continue...',
140
+ }]);
141
+ console.clear();
142
+ }
143
+ }
144
+ }
145
+ }
146
+ /**
147
+ * Interactive diff mode - allows reviewing and selecting which outdated commands to update
148
+ */
149
+ async function interactiveDiff(target) {
150
+ const inquirer = await import('inquirer');
151
+ const templates = getCommandTemplates();
152
+ const config = TARGETS[target];
153
+ const targetPath = getTargetPath(target, false);
154
+ // Find outdated commands
155
+ const outdated = [];
156
+ for (const template of templates) {
157
+ const filename = getCommandFilename(template.name, config.fileExtension);
158
+ const filepath = path.join(targetPath, filename);
159
+ const content = generateCommandContent(template, config.needsFrontmatter, target);
160
+ const comparison = compareFiles(filepath, content);
161
+ if (comparison.status === 'outdated') {
162
+ outdated.push({ name: template.name, template, kept: false });
163
+ }
164
+ }
165
+ if (outdated.length === 0) {
166
+ console.log(colors.success('\nAll commands are up to date!'));
167
+ return;
168
+ }
169
+ const buildChoices = () => outdated.map(({ name, template, kept }) => ({
170
+ name: `${kept ? colors.dim('○') : '⚠'} ${name.padEnd(23)} ${kept ? colors.dim('(keeping current)') : colors.dim(template.description)}`,
171
+ value: name,
172
+ }));
173
+ let continueDiff = true;
174
+ while (continueDiff) {
175
+ const keptCount = outdated.filter(o => o.kept).length;
176
+ const updateCount = outdated.length - keptCount;
177
+ const choices = buildChoices();
178
+ const { command } = await inquirer.default.prompt([{
179
+ type: 'list',
180
+ name: 'command',
181
+ message: `Select command to view diff (${updateCount} to update, ${keptCount} keeping):`,
182
+ choices: [
183
+ ...choices,
184
+ new inquirer.default.Separator(),
185
+ { name: 'Apply changes & Exit', value: 'apply' },
186
+ { name: 'Exit without changes', value: null },
187
+ ],
188
+ pageSize: 15,
189
+ }]);
190
+ if (!command) {
191
+ continueDiff = false;
192
+ }
193
+ else if (command === 'apply') {
194
+ // Update only non-kept commands
195
+ const toUpdate = outdated.filter(o => !o.kept);
196
+ if (toUpdate.length === 0) {
197
+ console.log(colors.dim('\nNo commands to update (all marked as keep)'));
198
+ }
199
+ else {
200
+ console.log();
201
+ for (const item of toUpdate) {
202
+ const filename = getCommandFilename(item.name, config.fileExtension);
203
+ const filepath = path.join(targetPath, filename);
204
+ const content = generateCommandContent(item.template, config.needsFrontmatter, target);
205
+ writeFile(filepath, content);
206
+ console.log(colors.success(` ✓ Updated ${filename}`));
207
+ }
208
+ console.log(colors.success(`\nUpdated ${toUpdate.length} commands`));
209
+ }
210
+ if (keptCount > 0) {
211
+ console.log(colors.dim(`Kept ${keptCount} commands unchanged`));
212
+ }
213
+ continueDiff = false;
214
+ }
215
+ else {
216
+ console.clear();
217
+ const item = outdated.find(o => o.name === command);
218
+ if (item) {
219
+ const filename = getCommandFilename(item.name, config.fileExtension);
220
+ const filepath = path.join(targetPath, filename);
221
+ const content = generateCommandContent(item.template, config.needsFrontmatter, target);
222
+ const comparison = compareFiles(filepath, content);
223
+ console.log(colors.bold(`\nDiff: ${item.name}`));
224
+ console.log('─'.repeat(50));
225
+ if (comparison.existingContent) {
226
+ displayDiff(generateDiff(comparison.existingContent, content, filename));
227
+ }
228
+ // Ask what to do with this command
229
+ const { action } = await inquirer.default.prompt([{
230
+ type: 'list',
231
+ name: 'action',
232
+ message: 'What do you want to do?',
233
+ choices: [
234
+ { name: item.kept ? 'Mark for update' : 'Keep current version (skip update)', value: 'toggle' },
235
+ { name: 'Back to list', value: 'back' },
236
+ ],
237
+ }]);
238
+ if (action === 'toggle') {
239
+ item.kept = !item.kept;
240
+ }
241
+ console.clear();
242
+ }
243
+ }
244
+ }
245
+ }
246
+ /**
247
+ * Interactive agent diff mode
248
+ */
249
+ async function interactiveAgentDiff(target) {
250
+ const inquirer = await import('inquirer');
251
+ const templates = getAgentTemplates();
252
+ const config = TARGETS[target];
253
+ const targetPath = getAgentPath(target, false);
254
+ // Find outdated agents
255
+ const outdated = [];
256
+ for (const template of templates) {
257
+ const filename = getAgentFilename(template.name);
258
+ const filepath = path.join(targetPath, filename);
259
+ const content = generateAgentContent(template, config.needsFrontmatter);
260
+ const comparison = compareFiles(filepath, content);
261
+ if (comparison.status === 'outdated') {
262
+ outdated.push({ name: template.name, template, kept: false });
263
+ }
264
+ }
265
+ if (outdated.length === 0) {
266
+ console.log(colors.success('\nAll agents are up to date!'));
267
+ return;
268
+ }
269
+ const buildChoices = () => outdated.map(({ name, template, kept }) => ({
270
+ name: `${kept ? colors.dim('○') : '⚠'} ${name.padEnd(23)} ${kept ? colors.dim('(keeping current)') : colors.dim(template.description)}`,
271
+ value: name,
272
+ }));
273
+ let continueDiff = true;
274
+ while (continueDiff) {
275
+ const keptCount = outdated.filter(o => o.kept).length;
276
+ const updateCount = outdated.length - keptCount;
277
+ const choices = buildChoices();
278
+ const { agent } = await inquirer.default.prompt([{
279
+ type: 'list',
280
+ name: 'agent',
281
+ message: `Select agent to view diff (${updateCount} to update, ${keptCount} keeping):`,
282
+ choices: [
283
+ ...choices,
284
+ new inquirer.default.Separator(),
285
+ { name: 'Apply changes & Exit', value: 'apply' },
286
+ { name: 'Exit without changes', value: null },
287
+ ],
288
+ pageSize: 15,
289
+ }]);
290
+ if (!agent) {
291
+ continueDiff = false;
292
+ }
293
+ else if (agent === 'apply') {
294
+ const toUpdate = outdated.filter(o => !o.kept);
295
+ if (toUpdate.length === 0) {
296
+ console.log(colors.dim('\nNo agents to update (all marked as keep)'));
297
+ }
298
+ else {
299
+ console.log();
300
+ for (const item of toUpdate) {
301
+ const filename = getAgentFilename(item.name);
302
+ const filepath = path.join(targetPath, filename);
303
+ const content = generateAgentContent(item.template, config.needsFrontmatter);
304
+ writeFile(filepath, content);
305
+ console.log(colors.success(` ✓ Updated ${filename}`));
306
+ }
307
+ console.log(colors.success(`\nUpdated ${toUpdate.length} agents`));
308
+ }
309
+ if (keptCount > 0) {
310
+ console.log(colors.dim(`Kept ${keptCount} agents unchanged`));
311
+ }
312
+ continueDiff = false;
313
+ }
314
+ else {
315
+ console.clear();
316
+ const item = outdated.find(o => o.name === agent);
317
+ if (item) {
318
+ const filename = getAgentFilename(item.name);
319
+ const filepath = path.join(targetPath, filename);
320
+ const content = generateAgentContent(item.template, config.needsFrontmatter);
321
+ const comparison = compareFiles(filepath, content);
322
+ console.log(colors.bold(`\nDiff: ${item.name}`));
323
+ console.log('─'.repeat(50));
324
+ if (comparison.existingContent) {
325
+ displayDiff(generateDiff(comparison.existingContent, content, filename));
326
+ }
327
+ const { action } = await inquirer.default.prompt([{
328
+ type: 'list',
329
+ name: 'action',
330
+ message: 'What do you want to do?',
331
+ choices: [
332
+ { name: item.kept ? 'Mark for update' : 'Keep current version (skip update)', value: 'toggle' },
333
+ { name: 'Back to list', value: 'back' },
334
+ ],
335
+ }]);
336
+ if (action === 'toggle') {
337
+ item.kept = !item.kept;
338
+ }
339
+ console.clear();
340
+ }
341
+ }
342
+ }
343
+ }
32
344
  /**
33
345
  * Scaffold commands for a target
34
346
  */
@@ -48,46 +360,215 @@ async function scaffoldCommands(target, options) {
48
360
  created: 0,
49
361
  updated: 0,
50
362
  skipped: 0,
363
+ outdated: 0,
51
364
  targetPath,
52
365
  };
53
366
  // Process each template
54
367
  for (const template of templates) {
55
368
  const filename = getCommandFilename(template.name, config.fileExtension);
56
369
  const filepath = path.join(targetPath, filename);
57
- const exists = fileExists(filepath);
58
- // Skip existing files unless updating
59
- if (exists && !options.update) {
60
- displayFileOperation(filename, true, false, false);
61
- result.skipped++;
62
- continue;
63
- }
64
370
  // Generate content
65
371
  const content = generateCommandContent(template, config.needsFrontmatter, target);
372
+ // Compare with existing file
373
+ const comparison = compareFiles(filepath, content);
66
374
  // Display operation
67
- displayFileOperation(filename, exists, options.dryRun === true, options.update === true);
68
- // Write file if not dry run
69
- if (!options.dryRun) {
70
- writeFile(filepath, content);
71
- }
72
- // Update counts
73
- if (exists) {
74
- result.updated++;
375
+ displayFileOperation(filename, comparison.status, options.dryRun === true, options.update === true);
376
+ // Show diff if requested and file is outdated
377
+ if (options.diff && comparison.status === 'outdated' && comparison.existingContent) {
378
+ const diff = generateDiff(comparison.existingContent, content, filename);
379
+ displayDiff(diff);
75
380
  }
76
- else {
77
- result.created++;
381
+ // Handle based on status
382
+ switch (comparison.status) {
383
+ case 'new':
384
+ if (!options.dryRun) {
385
+ writeFile(filepath, content);
386
+ }
387
+ result.created++;
388
+ break;
389
+ case 'identical':
390
+ result.skipped++;
391
+ break;
392
+ case 'outdated':
393
+ if (options.update) {
394
+ if (!options.dryRun) {
395
+ writeFile(filepath, content);
396
+ }
397
+ result.updated++;
398
+ }
399
+ else {
400
+ result.outdated++;
401
+ }
402
+ break;
78
403
  }
79
404
  }
80
405
  // Display summary
81
406
  displayScaffoldSummary(result, target, options.dryRun === true);
82
407
  }
408
+ /**
409
+ * Scaffold agents for a target
410
+ */
411
+ async function scaffoldAgents(target, options) {
412
+ const config = TARGETS[target];
413
+ const isProject = options.project === true;
414
+ const targetPath = getAgentPath(target, isProject);
415
+ let templates = getAgentTemplates();
416
+ // Filter by category if specified
417
+ if (options.category) {
418
+ const categoryLower = options.category.toLowerCase();
419
+ templates = templates.filter(t => t.category.toLowerCase() === categoryLower);
420
+ if (templates.length === 0) {
421
+ console.error(colors.error(`\nNo agents found in category "${options.category}"`));
422
+ console.error(colors.dim(`Available categories: Orchestration, Implementation, SpecForge, TaskType, Research`));
423
+ process.exit(1);
424
+ return;
425
+ }
426
+ }
427
+ // Display header
428
+ displayAgentScaffoldHeader(target, targetPath, options.dryRun === true);
429
+ // Create directory if needed
430
+ if (!options.dryRun) {
431
+ ensureDirectory(targetPath);
432
+ }
433
+ // Track results
434
+ const result = {
435
+ created: 0,
436
+ updated: 0,
437
+ skipped: 0,
438
+ outdated: 0,
439
+ targetPath,
440
+ };
441
+ // Process each template
442
+ for (const template of templates) {
443
+ const filename = getAgentFilename(template.name);
444
+ const filepath = path.join(targetPath, filename);
445
+ // Generate content
446
+ const content = generateAgentContent(template, config.needsFrontmatter);
447
+ // Compare with existing file
448
+ const comparison = compareFiles(filepath, content);
449
+ // Display operation
450
+ displayFileOperation(filename, comparison.status, options.dryRun === true, options.update === true);
451
+ // Show diff if requested and file is outdated
452
+ if (options.diff && comparison.status === 'outdated' && comparison.existingContent) {
453
+ const diff = generateDiff(comparison.existingContent, content, filename);
454
+ displayDiff(diff);
455
+ }
456
+ // Handle based on status
457
+ switch (comparison.status) {
458
+ case 'new':
459
+ if (!options.dryRun) {
460
+ writeFile(filepath, content);
461
+ }
462
+ result.created++;
463
+ break;
464
+ case 'identical':
465
+ result.skipped++;
466
+ break;
467
+ case 'outdated':
468
+ if (options.update) {
469
+ if (!options.dryRun) {
470
+ writeFile(filepath, content);
471
+ }
472
+ result.updated++;
473
+ }
474
+ else {
475
+ result.outdated++;
476
+ }
477
+ break;
478
+ }
479
+ }
480
+ // Display summary
481
+ displayAgentScaffoldSummary(result, target, options.dryRun === true);
482
+ }
83
483
  /**
84
484
  * Scaffold command implementation
85
485
  */
86
486
  export async function scaffoldCommand(options) {
487
+ const isAgentMode = options.agents === true;
87
488
  // List mode
88
489
  if (options.list) {
89
- const templates = getCommandTemplates();
90
- displayCommandList(templates);
490
+ if (isAgentMode) {
491
+ const templates = getAgentTemplates();
492
+ displayAgentList(templates, options.category);
493
+ }
494
+ else {
495
+ const templates = getCommandTemplates();
496
+ displayCommandList(templates);
497
+ }
498
+ return;
499
+ }
500
+ // Specific preview mode (when preview is a string)
501
+ if (typeof options.preview === 'string') {
502
+ if (isAgentMode) {
503
+ const templates = getAgentTemplates();
504
+ const template = templates.find(t => t.name === options.preview);
505
+ if (!template) {
506
+ console.error(colors.error(`\nError: Unknown agent "${options.preview}"`));
507
+ console.error(`Run 'specforge-mcp scaffold --agents --list' to see available agents`);
508
+ process.exit(1);
509
+ return;
510
+ }
511
+ const content = generateAgentContent(template, true);
512
+ displayAgentPreview(template.name, content, template.model);
513
+ }
514
+ else {
515
+ const templates = getCommandTemplates();
516
+ const template = templates.find(t => t.name === options.preview);
517
+ if (!template) {
518
+ console.error(colors.error(`\nError: Unknown command "${options.preview}"`));
519
+ console.error(`Run 'specforge-mcp scaffold --list' to see available commands`);
520
+ process.exit(1);
521
+ return;
522
+ }
523
+ const content = generateCommandContent(template, true, 'claude');
524
+ displayCommandPreview(template.name, content);
525
+ }
526
+ return;
527
+ }
528
+ // Interactive preview mode (when preview is true/boolean)
529
+ if (options.preview === true) {
530
+ let target;
531
+ if (options.target && isValidTarget(options.target)) {
532
+ target = options.target;
533
+ }
534
+ else {
535
+ target = await selectTarget(isAgentMode);
536
+ }
537
+ // Validate target supports agents if in agent mode
538
+ if (isAgentMode && !TARGETS[target].supportsAgents) {
539
+ displayAgentTargetError(target, getAgentSupportedTargets());
540
+ process.exit(1);
541
+ return;
542
+ }
543
+ if (isAgentMode) {
544
+ await interactiveAgentPreview(target);
545
+ }
546
+ else {
547
+ await interactivePreview(target);
548
+ }
549
+ return;
550
+ }
551
+ // Interactive diff mode
552
+ if (options.diff && !options.update) {
553
+ let target;
554
+ if (options.target && isValidTarget(options.target)) {
555
+ target = options.target;
556
+ }
557
+ else {
558
+ target = await selectTarget(isAgentMode);
559
+ }
560
+ // Validate target supports agents if in agent mode
561
+ if (isAgentMode && !TARGETS[target].supportsAgents) {
562
+ displayAgentTargetError(target, getAgentSupportedTargets());
563
+ process.exit(1);
564
+ return;
565
+ }
566
+ if (isAgentMode) {
567
+ await interactiveAgentDiff(target);
568
+ }
569
+ else {
570
+ await interactiveDiff(target);
571
+ }
91
572
  return;
92
573
  }
93
574
  // Determine target
@@ -97,15 +578,26 @@ export async function scaffoldCommand(options) {
97
578
  if (!isValidTarget(options.target)) {
98
579
  displayTargetError(options.target, getSupportedTargets());
99
580
  process.exit(1);
100
- return; // For testing when exit is mocked
581
+ return;
101
582
  }
102
583
  target = options.target;
103
584
  }
104
585
  else {
105
586
  // Interactive selection
106
- target = await selectTarget();
587
+ target = await selectTarget(isAgentMode);
588
+ }
589
+ // Validate target supports agents if in agent mode
590
+ if (isAgentMode && !TARGETS[target].supportsAgents) {
591
+ displayAgentTargetError(target, getAgentSupportedTargets());
592
+ process.exit(1);
593
+ return;
594
+ }
595
+ // Scaffold commands or agents
596
+ if (isAgentMode) {
597
+ await scaffoldAgents(target, options);
598
+ }
599
+ else {
600
+ await scaffoldCommands(target, options);
107
601
  }
108
- // Scaffold commands
109
- await scaffoldCommands(target, options);
110
602
  }
111
603
  //# sourceMappingURL=scaffold.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../../src/cli/commands/scaffold/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../../src/cli/commands/scaffold/scaffold.ts"],"names":[],"mappings":"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"}