@rlarua/agentteams-cli 0.0.9 → 0.0.11

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 (118) hide show
  1. package/API-CLI-WORKFLOW.md +418 -0
  2. package/LICENSE +201 -0
  3. package/README.md +220 -128
  4. package/dist/api/comment.d.ts +11 -0
  5. package/dist/api/comment.d.ts.map +1 -0
  6. package/dist/api/comment.js +33 -0
  7. package/dist/api/comment.js.map +1 -0
  8. package/dist/api/plan.d.ts +13 -0
  9. package/dist/api/plan.d.ts.map +1 -0
  10. package/dist/api/plan.js +43 -0
  11. package/dist/api/plan.js.map +1 -0
  12. package/dist/api/postmortem.d.ts +6 -0
  13. package/dist/api/postmortem.d.ts.map +1 -0
  14. package/dist/api/postmortem.js +33 -0
  15. package/dist/api/postmortem.js.map +1 -0
  16. package/dist/api/report.d.ts +6 -0
  17. package/dist/api/report.d.ts.map +1 -0
  18. package/dist/api/report.js +33 -0
  19. package/dist/api/report.js.map +1 -0
  20. package/dist/api/status.d.ts +12 -0
  21. package/dist/api/status.d.ts.map +1 -0
  22. package/dist/api/status.js +33 -0
  23. package/dist/api/status.js.map +1 -0
  24. package/dist/commands/agentConfig.d.ts.map +1 -1
  25. package/dist/commands/agentConfig.js +10 -3
  26. package/dist/commands/agentConfig.js.map +1 -1
  27. package/dist/commands/agentConfigCommand.d.ts +2 -0
  28. package/dist/commands/agentConfigCommand.d.ts.map +1 -0
  29. package/dist/commands/agentConfigCommand.js +20 -0
  30. package/dist/commands/agentConfigCommand.js.map +1 -0
  31. package/dist/commands/comment.d.ts +2 -0
  32. package/dist/commands/comment.d.ts.map +1 -0
  33. package/dist/commands/comment.js +55 -0
  34. package/dist/commands/comment.js.map +1 -0
  35. package/dist/commands/config.d.ts +2 -0
  36. package/dist/commands/config.d.ts.map +1 -0
  37. package/dist/commands/config.js +30 -0
  38. package/dist/commands/config.js.map +1 -0
  39. package/dist/commands/convention.d.ts +25 -0
  40. package/dist/commands/convention.d.ts.map +1 -1
  41. package/dist/commands/convention.js +492 -43
  42. package/dist/commands/convention.js.map +1 -1
  43. package/dist/commands/conventionRouter.d.ts +3 -0
  44. package/dist/commands/conventionRouter.d.ts.map +1 -0
  45. package/dist/commands/conventionRouter.js +46 -0
  46. package/dist/commands/conventionRouter.js.map +1 -0
  47. package/dist/commands/dependency.d.ts.map +1 -1
  48. package/dist/commands/dependency.js +2 -1
  49. package/dist/commands/dependency.js.map +1 -1
  50. package/dist/commands/dependencyCommand.d.ts +2 -0
  51. package/dist/commands/dependencyCommand.d.ts.map +1 -0
  52. package/dist/commands/dependencyCommand.js +27 -0
  53. package/dist/commands/dependencyCommand.js.map +1 -0
  54. package/dist/commands/index.d.ts.map +1 -1
  55. package/dist/commands/index.js +13 -485
  56. package/dist/commands/index.js.map +1 -1
  57. package/dist/commands/init.d.ts.map +1 -1
  58. package/dist/commands/init.js +3 -2
  59. package/dist/commands/init.js.map +1 -1
  60. package/dist/commands/plan.d.ts +11 -0
  61. package/dist/commands/plan.d.ts.map +1 -0
  62. package/dist/commands/plan.js +370 -0
  63. package/dist/commands/plan.js.map +1 -0
  64. package/dist/commands/postmortem.d.ts +2 -0
  65. package/dist/commands/postmortem.d.ts.map +1 -0
  66. package/dist/commands/postmortem.js +114 -0
  67. package/dist/commands/postmortem.js.map +1 -0
  68. package/dist/commands/report.d.ts +2 -0
  69. package/dist/commands/report.d.ts.map +1 -0
  70. package/dist/commands/report.js +221 -0
  71. package/dist/commands/report.js.map +1 -0
  72. package/dist/commands/status.d.ts +2 -0
  73. package/dist/commands/status.d.ts.map +1 -0
  74. package/dist/commands/status.js +60 -0
  75. package/dist/commands/status.js.map +1 -0
  76. package/dist/index.js +214 -34
  77. package/dist/index.js.map +1 -1
  78. package/dist/types/index.d.ts +11 -6
  79. package/dist/types/index.d.ts.map +1 -1
  80. package/dist/utils/errors.d.ts.map +1 -1
  81. package/dist/utils/errors.js +60 -6
  82. package/dist/utils/errors.js.map +1 -1
  83. package/dist/utils/formatter.js +11 -1
  84. package/dist/utils/formatter.js.map +1 -1
  85. package/dist/utils/git.d.ts +19 -0
  86. package/dist/utils/git.d.ts.map +1 -0
  87. package/dist/utils/git.js +41 -0
  88. package/dist/utils/git.js.map +1 -0
  89. package/dist/utils/httpHeaders.d.ts +3 -0
  90. package/dist/utils/httpHeaders.d.ts.map +1 -0
  91. package/dist/utils/httpHeaders.js +11 -0
  92. package/dist/utils/httpHeaders.js.map +1 -0
  93. package/dist/utils/initOutput.d.ts +3 -0
  94. package/dist/utils/initOutput.d.ts.map +1 -0
  95. package/dist/utils/initOutput.js +34 -0
  96. package/dist/utils/initOutput.js.map +1 -0
  97. package/dist/utils/legacyCompat.d.ts +3 -0
  98. package/dist/utils/legacyCompat.d.ts.map +1 -0
  99. package/dist/utils/legacyCompat.js +20 -0
  100. package/dist/utils/legacyCompat.js.map +1 -0
  101. package/dist/utils/outputPolicy.d.ts +12 -0
  102. package/dist/utils/outputPolicy.d.ts.map +1 -0
  103. package/dist/utils/outputPolicy.js +132 -0
  104. package/dist/utils/outputPolicy.js.map +1 -0
  105. package/dist/utils/parsers.d.ts +7 -0
  106. package/dist/utils/parsers.d.ts.map +1 -0
  107. package/dist/utils/parsers.js +52 -0
  108. package/dist/utils/parsers.js.map +1 -0
  109. package/dist/utils/planFormat.d.ts +17 -0
  110. package/dist/utils/planFormat.d.ts.map +1 -0
  111. package/dist/utils/planFormat.js +80 -0
  112. package/dist/utils/planFormat.js.map +1 -0
  113. package/dist/utils/spinner.d.ts +6 -0
  114. package/dist/utils/spinner.d.ts.map +1 -0
  115. package/dist/utils/spinner.js +34 -0
  116. package/dist/utils/spinner.js.map +1 -0
  117. package/package.json +8 -3
  118. package/DEVELOPMENT.md +0 -234
@@ -0,0 +1,370 @@
1
+ import { createInterface } from 'node:readline/promises';
2
+ import { existsSync, mkdirSync, writeFileSync, rmSync, readdirSync, readFileSync } from 'node:fs';
3
+ import { join, resolve } from 'node:path';
4
+ import { checkConventionFreshness, conventionDownload } from './convention.js';
5
+ import { findProjectConfig } from '../utils/config.js';
6
+ import { withSpinner, printFileInfo } from '../utils/spinner.js';
7
+ import { formatPlanWithDependenciesText, mergePlanWithDependencies, normalizeDependencies } from '../utils/planFormat.js';
8
+ import { interpretEscapes, toPositiveInteger, toSafeFileName } from '../utils/parsers.js';
9
+ import { assignPlan, createPlan, deletePlan, getPlan, getPlanDependencies, listPlans, updatePlan, } from '../api/plan.js';
10
+ import { reportStatus } from '../api/status.js';
11
+ function findProjectRoot() {
12
+ const configPath = findProjectConfig(process.cwd());
13
+ if (!configPath)
14
+ return null;
15
+ return resolve(configPath, '..', '..');
16
+ }
17
+ function formatFreshnessChangeLabel(change) {
18
+ const target = (change.title && change.title.trim().length > 0)
19
+ ? change.title.trim()
20
+ : (change.fileName && change.fileName.trim().length > 0)
21
+ ? change.fileName.trim()
22
+ : change.id;
23
+ if (change.type === 'new')
24
+ return `new: ${target}`;
25
+ if (change.type === 'deleted')
26
+ return `deleted: ${target}`;
27
+ return `updated: ${target}`;
28
+ }
29
+ export function buildFreshnessNoticeLines(freshness) {
30
+ const lines = ['⚠ Updated conventions found:'];
31
+ if (freshness.platformGuidesChanged) {
32
+ lines.push(' - platform guides (shared)');
33
+ }
34
+ for (const change of freshness.conventionChanges) {
35
+ lines.push(` - ${formatFreshnessChangeLabel(change)}`);
36
+ }
37
+ return lines;
38
+ }
39
+ async function promptConventionDownload() {
40
+ const rl = createInterface({
41
+ input: process.stdin,
42
+ output: process.stdout,
43
+ });
44
+ try {
45
+ const answer = await rl.question('Download now? (y/N) ');
46
+ const normalized = answer.trim().toLowerCase();
47
+ return normalized === 'y' || normalized === 'yes';
48
+ }
49
+ finally {
50
+ rl.close();
51
+ }
52
+ }
53
+ function minimalPlanRefactorChecklistTemplate() {
54
+ return [
55
+ '## Refactor Checklist',
56
+ '- [ ] Define current pain points and target behavior',
57
+ '- [ ] Identify impacted modules and side effects',
58
+ '- [ ] Keep API/schema contracts backward-compatible',
59
+ '- [ ] Add or update related tests',
60
+ '- [ ] Run verification (`npm test`, `npm run build`) and record outcomes',
61
+ '',
62
+ ].join('\n');
63
+ }
64
+ function resolvePlanTemplate(template) {
65
+ if (template === undefined || template === null)
66
+ return undefined;
67
+ const value = String(template).trim();
68
+ if (value.length === 0)
69
+ return undefined;
70
+ if (value === 'refactor-minimal')
71
+ return minimalPlanRefactorChecklistTemplate();
72
+ throw new Error(`Unsupported plan template: ${value}. Only 'refactor-minimal' is supported.`);
73
+ }
74
+ export async function executePlanCommand(apiUrl, projectId, headers, action, options) {
75
+ switch (action) {
76
+ case 'list': {
77
+ const params = {};
78
+ if (options.title)
79
+ params.title = options.title;
80
+ if (options.search)
81
+ params.search = options.search;
82
+ if (options.status)
83
+ params.status = options.status;
84
+ if (options.assignedTo)
85
+ params.assignedTo = options.assignedTo;
86
+ const page = toPositiveInteger(options.page);
87
+ const pageSize = toPositiveInteger(options.pageSize);
88
+ if (page !== undefined)
89
+ params.page = page;
90
+ if (pageSize !== undefined)
91
+ params.pageSize = pageSize;
92
+ return listPlans(apiUrl, projectId, headers, params);
93
+ }
94
+ case 'get': {
95
+ if (!options.id)
96
+ throw new Error('--id is required for plan get');
97
+ const response = await getPlan(apiUrl, projectId, headers, options.id);
98
+ if (options.includeDeps) {
99
+ const depsResponse = await getPlanDependencies(apiUrl, projectId, headers, options.id);
100
+ const dependencies = normalizeDependencies(depsResponse);
101
+ const mergedPlan = mergePlanWithDependencies(response, dependencies);
102
+ if (options.format === 'text') {
103
+ return formatPlanWithDependenciesText(mergedPlan.data, dependencies);
104
+ }
105
+ return mergedPlan;
106
+ }
107
+ return response;
108
+ }
109
+ case 'show': {
110
+ if (!options.id)
111
+ throw new Error('--id is required for plan show');
112
+ const response = await getPlan(apiUrl, projectId, headers, options.id);
113
+ if (options.includeDeps) {
114
+ const depsResponse = await getPlanDependencies(apiUrl, projectId, headers, options.id);
115
+ const dependencies = normalizeDependencies(depsResponse);
116
+ const mergedPlan = mergePlanWithDependencies(response, dependencies);
117
+ if (options.format === 'text') {
118
+ return formatPlanWithDependenciesText(mergedPlan.data, dependencies);
119
+ }
120
+ return mergedPlan;
121
+ }
122
+ return response;
123
+ }
124
+ case 'start': {
125
+ if (!options.id)
126
+ throw new Error('--id is required for plan start');
127
+ const planResponse = await getPlan(apiUrl, projectId, headers, options.id);
128
+ const plan = planResponse?.data;
129
+ const planTitle = plan?.title ?? options.id;
130
+ const planStatus = plan?.status;
131
+ const assignAgent = options.agent
132
+ ?? options.defaultCreatedBy;
133
+ const updatedPlan = await withSpinner('Starting plan...', async () => {
134
+ if (planStatus === 'DRAFT') {
135
+ await updatePlan(apiUrl, projectId, headers, options.id, { status: 'PENDING' });
136
+ }
137
+ if (planStatus === 'DRAFT' || planStatus === 'PENDING') {
138
+ if (!assignAgent) {
139
+ throw new Error('No agent available for assignment. Set AGENTTEAMS_AGENT_NAME or pass --agent.');
140
+ }
141
+ await assignPlan(apiUrl, projectId, headers, options.id, assignAgent);
142
+ }
143
+ return updatePlan(apiUrl, projectId, headers, options.id, { status: 'IN_PROGRESS' });
144
+ }, 'Plan started');
145
+ const statusReport = await reportStatus(apiUrl, projectId, headers, {
146
+ agent: options.agent,
147
+ status: 'IN_PROGRESS',
148
+ task: options.task ?? `Started plan: ${planTitle}`,
149
+ issues: [],
150
+ remaining: [],
151
+ });
152
+ return {
153
+ data: {
154
+ plan: updatedPlan,
155
+ statusReport,
156
+ },
157
+ };
158
+ }
159
+ case 'finish': {
160
+ if (!options.id)
161
+ throw new Error('--id is required for plan finish');
162
+ const planResponse = await getPlan(apiUrl, projectId, headers, options.id);
163
+ const planTitle = planResponse?.data?.title ?? options.id;
164
+ const updatedPlan = await withSpinner('Finishing plan...', () => updatePlan(apiUrl, projectId, headers, options.id, { status: 'DONE' }), 'Plan finished');
165
+ const statusReport = await reportStatus(apiUrl, projectId, headers, {
166
+ agent: options.agent,
167
+ status: 'DONE',
168
+ task: options.task ?? `Finished plan: ${planTitle}`,
169
+ issues: [],
170
+ remaining: [],
171
+ });
172
+ return {
173
+ data: {
174
+ plan: updatedPlan,
175
+ statusReport,
176
+ },
177
+ };
178
+ }
179
+ case 'create': {
180
+ if (!options.title)
181
+ throw new Error('--title is required for plan create');
182
+ let content = options.content;
183
+ const hasExplicitContent = typeof options.content === 'string' && options.content.trim().length > 0;
184
+ const hasExplicitFile = typeof options.file === 'string' && options.file.trim().length > 0;
185
+ const templateContent = resolvePlanTemplate(options.template);
186
+ if (!content && !options.file && templateContent) {
187
+ content = templateContent;
188
+ }
189
+ if ((hasExplicitContent || hasExplicitFile) && templateContent) {
190
+ console.warn('[warn] plan create: --template is ignored because --content/--file was provided.');
191
+ }
192
+ if (options.file) {
193
+ const filePath = resolve(options.file);
194
+ if (!existsSync(filePath)) {
195
+ throw new Error(`File not found: ${options.file}`);
196
+ }
197
+ content = readFileSync(filePath, 'utf-8');
198
+ printFileInfo(options.file, content);
199
+ }
200
+ if (typeof content === 'string' && options.interpretEscapes) {
201
+ content = interpretEscapes(content);
202
+ }
203
+ if (!content || content.trim().length === 0) {
204
+ throw new Error('--content, --file, or --template is required for plan create');
205
+ }
206
+ if (options.status && options.status !== 'DRAFT') {
207
+ console.warn(`[warn] plan create: --status ${options.status} is ignored. Plans are always created as DRAFT.`);
208
+ }
209
+ return withSpinner('Creating plan...', () => createPlan(apiUrl, projectId, headers, {
210
+ title: options.title,
211
+ content,
212
+ priority: options.priority ?? 'MEDIUM',
213
+ status: 'DRAFT',
214
+ }), 'Plan created');
215
+ }
216
+ case 'update': {
217
+ if (!options.id)
218
+ throw new Error('--id is required for plan update');
219
+ const body = {};
220
+ if (options.title)
221
+ body.title = options.title;
222
+ if (options.file) {
223
+ const filePath = resolve(options.file);
224
+ if (!existsSync(filePath)) {
225
+ throw new Error(`File not found: ${options.file}`);
226
+ }
227
+ body.content = readFileSync(filePath, 'utf-8');
228
+ printFileInfo(options.file, body.content);
229
+ }
230
+ else if (options.content) {
231
+ body.content = options.content;
232
+ if (typeof body.content === 'string' && options.interpretEscapes) {
233
+ body.content = interpretEscapes(body.content);
234
+ }
235
+ }
236
+ if (options.status)
237
+ body.status = options.status;
238
+ if (options.priority)
239
+ body.priority = options.priority;
240
+ return withSpinner('Updating plan...', () => updatePlan(apiUrl, projectId, headers, options.id, body), 'Plan updated');
241
+ }
242
+ case 'delete': {
243
+ if (!options.id)
244
+ throw new Error('--id is required for plan delete');
245
+ await deletePlan(apiUrl, projectId, headers, options.id);
246
+ return { message: `Plan ${options.id} deleted successfully` };
247
+ }
248
+ case 'assign': {
249
+ if (!options.id)
250
+ throw new Error('--id is required for plan assign');
251
+ if (!options.agent)
252
+ throw new Error('--agent is required for plan assign');
253
+ return assignPlan(apiUrl, projectId, headers, options.id, options.agent);
254
+ }
255
+ case 'download': {
256
+ if (!options.id)
257
+ throw new Error('--id is required for plan download');
258
+ const projectRoot = findProjectRoot();
259
+ if (!projectRoot) {
260
+ throw new Error("Project root not found. Run 'agentteams init' first.");
261
+ }
262
+ let conventionUpdates;
263
+ try {
264
+ const freshness = await checkConventionFreshness(apiUrl, projectId, headers, projectRoot);
265
+ const hasChanges = freshness.platformGuidesChanged || freshness.conventionChanges.length > 0;
266
+ if (hasChanges) {
267
+ const changeLabels = [];
268
+ if (freshness.platformGuidesChanged) {
269
+ changeLabels.push('platform guides (shared)');
270
+ }
271
+ for (const change of freshness.conventionChanges) {
272
+ changeLabels.push(formatFreshnessChangeLabel(change));
273
+ }
274
+ conventionUpdates = {
275
+ hasChanges: true,
276
+ changes: changeLabels,
277
+ suggestion: "Run 'agentteams convention download' to sync latest conventions.",
278
+ };
279
+ const isTty = process.stdin.isTTY === true && process.stdout.isTTY === true;
280
+ if (isTty) {
281
+ const noticeLines = buildFreshnessNoticeLines(freshness);
282
+ for (const line of noticeLines) {
283
+ process.stderr.write(`${line}\n`);
284
+ }
285
+ const confirmed = await promptConventionDownload();
286
+ if (confirmed) {
287
+ await conventionDownload();
288
+ console.log('✔ Convention download completed');
289
+ }
290
+ }
291
+ }
292
+ }
293
+ catch (error) {
294
+ const message = error instanceof Error ? error.message : String(error);
295
+ console.warn(`[warn] Convention freshness check failed: ${message}`);
296
+ }
297
+ const result = await withSpinner('Downloading plan...', async () => {
298
+ const response = await getPlan(apiUrl, projectId, headers, options.id);
299
+ const plan = response.data;
300
+ const activePlanDir = join(projectRoot, '.agentteams', 'active-plan');
301
+ if (!existsSync(activePlanDir)) {
302
+ mkdirSync(activePlanDir, { recursive: true });
303
+ }
304
+ const safeName = toSafeFileName(plan.title) || 'plan';
305
+ const fileName = `${safeName}.md`;
306
+ const filePath = join(activePlanDir, fileName);
307
+ const frontmatter = [
308
+ '---',
309
+ `planId: ${plan.id}`,
310
+ `title: ${plan.title}`,
311
+ `status: ${plan.status}`,
312
+ `priority: ${plan.priority}`,
313
+ `downloadedAt: ${new Date().toISOString()}`,
314
+ '---',
315
+ ].join('\n');
316
+ const markdown = plan.contentMarkdown ?? '';
317
+ writeFileSync(filePath, `${frontmatter}\n\n${markdown}`, 'utf-8');
318
+ const downloadResult = {
319
+ message: `Plan downloaded to ${fileName}`,
320
+ filePath: `.agentteams/active-plan/${fileName}`,
321
+ };
322
+ if (conventionUpdates) {
323
+ downloadResult.conventionUpdates = conventionUpdates;
324
+ }
325
+ return downloadResult;
326
+ }, 'Plan downloaded');
327
+ return result;
328
+ }
329
+ case 'cleanup': {
330
+ const projectRoot = findProjectRoot();
331
+ if (!projectRoot) {
332
+ throw new Error("Project root not found. Run 'agentteams init' first.");
333
+ }
334
+ const activePlanDir = join(projectRoot, '.agentteams', 'active-plan');
335
+ if (!existsSync(activePlanDir)) {
336
+ return { message: 'No active-plan directory found.', deletedFiles: [] };
337
+ }
338
+ const deletedFiles = await withSpinner('Cleaning up plan files...', async () => {
339
+ const allFiles = readdirSync(activePlanDir).filter((f) => f.endsWith('.md'));
340
+ const deleted = [];
341
+ if (options.id) {
342
+ for (const file of allFiles) {
343
+ const content = readFileSync(join(activePlanDir, file), 'utf-8');
344
+ const match = content.match(/^planId:\s*(.+)$/m);
345
+ if (match && match[1].trim() === options.id) {
346
+ rmSync(join(activePlanDir, file));
347
+ deleted.push(file);
348
+ }
349
+ }
350
+ }
351
+ else {
352
+ for (const file of allFiles) {
353
+ rmSync(join(activePlanDir, file));
354
+ deleted.push(file);
355
+ }
356
+ }
357
+ return deleted;
358
+ }, 'Cleaned up plan files');
359
+ return {
360
+ message: deletedFiles.length > 0
361
+ ? `Deleted ${deletedFiles.length} file(s).`
362
+ : 'No matching files found.',
363
+ deletedFiles,
364
+ };
365
+ }
366
+ default:
367
+ throw new Error(`Unknown action: ${action}`);
368
+ }
369
+ }
370
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function executePostMortemCommand(apiUrl: string, headers: any, action: string, options: any): Promise<any>;
2
+ //# sourceMappingURL=postmortem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postmortem.d.ts","sourceRoot":"","sources":["../../src/commands/postmortem.ts"],"names":[],"mappings":"AAaA,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,GAAG,GACX,OAAO,CAAC,GAAG,CAAC,CAuGd"}
@@ -0,0 +1,114 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { createPostMortem, deletePostMortem, getPostMortem, listPostMortems, updatePostMortem, } from '../api/postmortem.js';
4
+ import { isCreatedByRequiredValidationError, resolveLegacyCreatedBy } from '../utils/legacyCompat.js';
5
+ import { splitCsv, toPositiveInteger } from '../utils/parsers.js';
6
+ import { printFileInfo, withSpinner } from '../utils/spinner.js';
7
+ export async function executePostMortemCommand(apiUrl, headers, action, options) {
8
+ if (!options.projectId || typeof options.projectId !== 'string') {
9
+ throw new Error('--project-id is required (or configure AGENTTEAMS_PROJECT_ID / .agentteams/config.json)');
10
+ }
11
+ switch (action) {
12
+ case 'list': {
13
+ const params = {};
14
+ if (options.planId)
15
+ params.planId = options.planId;
16
+ if (options.status)
17
+ params.status = options.status;
18
+ if (options.search)
19
+ params.search = options.search;
20
+ const page = toPositiveInteger(options.page);
21
+ const limitVal = toPositiveInteger(options.limit);
22
+ const pageSizeVal = toPositiveInteger(options.pageSize);
23
+ if (limitVal !== undefined && pageSizeVal !== undefined) {
24
+ console.warn('[warn] --limit and --page-size both specified; --limit takes precedence.');
25
+ }
26
+ const pageSize = limitVal ?? pageSizeVal;
27
+ if (page !== undefined)
28
+ params.page = page;
29
+ if (pageSize !== undefined)
30
+ params.pageSize = pageSize;
31
+ return listPostMortems(apiUrl, options.projectId, headers, params);
32
+ }
33
+ case 'get': {
34
+ if (!options.id)
35
+ throw new Error('--id is required for postmortem get');
36
+ return getPostMortem(apiUrl, options.projectId, headers, options.id);
37
+ }
38
+ case 'create': {
39
+ if (!options.title)
40
+ throw new Error('--title is required for postmortem create');
41
+ if (options.file) {
42
+ const filePath = resolve(options.file);
43
+ if (!existsSync(filePath)) {
44
+ throw new Error(`File not found: ${options.file}`);
45
+ }
46
+ options.content = readFileSync(filePath, 'utf-8');
47
+ printFileInfo(options.file, options.content);
48
+ }
49
+ if (!options.content)
50
+ throw new Error('--content or --file is required for postmortem create');
51
+ if (options.actionItems === undefined)
52
+ throw new Error('--action-items is required for postmortem create');
53
+ const body = {
54
+ planId: options.planId,
55
+ title: options.title,
56
+ content: options.content,
57
+ actionItems: splitCsv(options.actionItems),
58
+ status: options.status,
59
+ };
60
+ return withSpinner('Creating post-mortem...', async () => {
61
+ try {
62
+ return await createPostMortem(apiUrl, options.projectId, headers, body);
63
+ }
64
+ catch (error) {
65
+ if (!isCreatedByRequiredValidationError(error)) {
66
+ throw error;
67
+ }
68
+ const legacyCreatedBy = resolveLegacyCreatedBy(options);
69
+ if (!legacyCreatedBy) {
70
+ throw error;
71
+ }
72
+ return createPostMortem(apiUrl, options.projectId, headers, {
73
+ ...body,
74
+ createdBy: legacyCreatedBy,
75
+ });
76
+ }
77
+ }, 'Post-mortem created');
78
+ }
79
+ case 'update': {
80
+ if (!options.id)
81
+ throw new Error('--id is required for postmortem update');
82
+ const body = {};
83
+ if (Object.prototype.hasOwnProperty.call(options, 'planId')) {
84
+ body.planId = options.planId;
85
+ }
86
+ if (options.title)
87
+ body.title = options.title;
88
+ if (options.content)
89
+ body.content = options.content;
90
+ if (options.file) {
91
+ const filePath = resolve(options.file);
92
+ if (!existsSync(filePath)) {
93
+ throw new Error(`File not found: ${options.file}`);
94
+ }
95
+ body.content = readFileSync(filePath, 'utf-8');
96
+ printFileInfo(options.file, body.content);
97
+ }
98
+ if (options.actionItems !== undefined)
99
+ body.actionItems = splitCsv(options.actionItems);
100
+ if (options.status)
101
+ body.status = options.status;
102
+ return updatePostMortem(apiUrl, options.projectId, headers, options.id, body);
103
+ }
104
+ case 'delete': {
105
+ if (!options.id)
106
+ throw new Error('--id is required for postmortem delete');
107
+ await deletePostMortem(apiUrl, options.projectId, headers, options.id);
108
+ return { message: `PostMortem ${options.id} deleted successfully` };
109
+ }
110
+ default:
111
+ throw new Error(`Unknown action: ${action}`);
112
+ }
113
+ }
114
+ //# sourceMappingURL=postmortem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postmortem.js","sourceRoot":"","sources":["../../src/commands/postmortem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kCAAkC,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACtG,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAc,EACd,OAAY,EACZ,MAAc,EACd,OAAY;IAEZ,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAC;IAC7G,CAAC;IAED,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAoC,EAAE,CAAC;YACnD,IAAI,OAAO,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YACnD,IAAI,OAAO,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YACnD,IAAI,OAAO,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAEnD,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAClD,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACxD,IAAI,QAAQ,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBACxD,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;YAC3F,CAAC;YACD,MAAM,QAAQ,GAAG,QAAQ,IAAI,WAAW,CAAC;YACzC,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;YAC3C,IAAI,QAAQ,KAAK,SAAS;gBAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAEvD,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,IAAI,CAAC,OAAO,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACxE,OAAO,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YACjF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrD,CAAC;gBACD,OAAO,CAAC,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC/F,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAE3G,MAAM,IAAI,GAA4B;gBACpC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC1C,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;YAEF,OAAO,WAAW,CAChB,yBAAyB,EACzB,KAAK,IAAI,EAAE;gBACT,IAAI,CAAC;oBACH,OAAO,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC1E,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,kCAAkC,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/C,MAAM,KAAK,CAAC;oBACd,CAAC;oBAED,MAAM,eAAe,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;oBACxD,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,MAAM,KAAK,CAAC;oBACd,CAAC;oBAED,OAAO,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE;wBAC1D,GAAG,IAAI;wBACP,SAAS,EAAE,eAAe;qBAC3B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,EACD,qBAAqB,CACtB,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC3E,MAAM,IAAI,GAAwB,EAAE,CAAC;YAErC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC5D,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC/B,CAAC;YACD,IAAI,OAAO,CAAC,KAAK;gBAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC9C,IAAI,OAAO,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YACpD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACvC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrD,CAAC;gBACD,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC/C,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;gBAAE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACxF,IAAI,OAAO,CAAC,MAAM;gBAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAEjD,OAAO,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAChF,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC3E,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACvE,OAAO,EAAE,OAAO,EAAE,cAAc,OAAO,CAAC,EAAE,uBAAuB,EAAE,CAAC;QACtE,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function executeReportCommand(apiUrl: string, headers: any, action: string, options: any): Promise<any>;
2
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAiDA,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,GAAG,GACX,OAAO,CAAC,GAAG,CAAC,CA+Jd"}