@openpome/cli 0.16.0-alpha.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 (39) hide show
  1. package/LICENSE +158 -0
  2. package/README.md +11 -0
  3. package/dist/commands/auth.d.ts +3 -0
  4. package/dist/commands/auth.d.ts.map +1 -0
  5. package/dist/commands/auth.js +32 -0
  6. package/dist/commands/auth.js.map +1 -0
  7. package/dist/commands/core.d.ts +3 -0
  8. package/dist/commands/core.d.ts.map +1 -0
  9. package/dist/commands/core.js +27 -0
  10. package/dist/commands/core.js.map +1 -0
  11. package/dist/commands/drafts.d.ts +3 -0
  12. package/dist/commands/drafts.d.ts.map +1 -0
  13. package/dist/commands/drafts.js +81 -0
  14. package/dist/commands/drafts.js.map +1 -0
  15. package/dist/commands/sessions.d.ts +3 -0
  16. package/dist/commands/sessions.d.ts.map +1 -0
  17. package/dist/commands/sessions.js +77 -0
  18. package/dist/commands/sessions.js.map +1 -0
  19. package/dist/commands/types.d.ts +2 -0
  20. package/dist/commands/types.d.ts.map +1 -0
  21. package/dist/commands/types.js +2 -0
  22. package/dist/commands/types.js.map +1 -0
  23. package/dist/commands/work-items.d.ts +3 -0
  24. package/dist/commands/work-items.d.ts.map +1 -0
  25. package/dist/commands/work-items.js +56 -0
  26. package/dist/commands/work-items.js.map +1 -0
  27. package/dist/commands/workspaces.d.ts +3 -0
  28. package/dist/commands/workspaces.d.ts.map +1 -0
  29. package/dist/commands/workspaces.js +33 -0
  30. package/dist/commands/workspaces.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +43 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/presentation.d.ts +40 -0
  36. package/dist/presentation.d.ts.map +1 -0
  37. package/dist/presentation.js +655 -0
  38. package/dist/presentation.js.map +1 -0
  39. package/package.json +53 -0
@@ -0,0 +1,655 @@
1
+ export function printHelp() {
2
+ console.log([
3
+ "OpenPome CLI",
4
+ "",
5
+ "Usage:",
6
+ " pome init",
7
+ " pome doctor",
8
+ " pome config path",
9
+ " pome config show",
10
+ " pome config reset",
11
+ " pome auth jira status",
12
+ " pome auth jira login",
13
+ " pome auth jira login --listen",
14
+ " pome auth jira callback <CODE>",
15
+ " pome work-item list",
16
+ " pome work-item show <KEY>",
17
+ " pome work-item scopes",
18
+ " pome work-item scope use <SCOPE_ID>",
19
+ " pome jira boards",
20
+ " pome jira board use <BOARD_ID>",
21
+ " pome workspace scan",
22
+ " pome workspace list",
23
+ " pome workspace resolve <KEY>",
24
+ " pome workspace link <KEY> <PATH>",
25
+ " pome start <KEY>",
26
+ " pome status",
27
+ " pome stop",
28
+ " pome resume [SESSION_ID]",
29
+ " pome reset",
30
+ " pome timeline",
31
+ " pome approvals",
32
+ " pome plan",
33
+ " pome approve plan",
34
+ " pome ai context",
35
+ " pome ai prompt",
36
+ " pome diff",
37
+ " pome test discover",
38
+ " pome approve command [COMMAND]",
39
+ " pome test run [COMMAND]",
40
+ " pome test history",
41
+ " pome github auth status",
42
+ " pome pr draft",
43
+ " pome pr create",
44
+ " pome work-item update-draft",
45
+ " pome work-item post-update",
46
+ " pome reject [REASON]",
47
+ " pome jira list",
48
+ " pome jira show <KEY>",
49
+ "",
50
+ "Jira live mode environment:",
51
+ " OPENPOME_JIRA_BASE_URL=https://your-domain.atlassian.net",
52
+ " OPENPOME_JIRA_EMAIL=you@example.com",
53
+ " OPENPOME_JIRA_API_TOKEN=...",
54
+ "",
55
+ "Jira OAuth development environment:",
56
+ " OPENPOME_JIRA_OAUTH_CLIENT_ID=...",
57
+ " OPENPOME_JIRA_OAUTH_CLIENT_SECRET=...",
58
+ " OPENPOME_JIRA_OAUTH_REDIRECT_URI=http://127.0.0.1:48731/auth/jira/callback",
59
+ " Note: OAuth/browser mode is experimental until a real Atlassian app smoke test is completed.",
60
+ "",
61
+ "Workspace scan environment:",
62
+ " OPENPOME_WORKSPACE_SCAN_PATHS=/path/one:/path/two"
63
+ ].join("\n"));
64
+ }
65
+ export function printCommandFailure(message, nextStep) {
66
+ console.error(`Error: ${message}`);
67
+ if (nextStep) {
68
+ console.error(`Next: ${nextStep}`);
69
+ }
70
+ process.exitCode = 1;
71
+ }
72
+ export function printInitResult(result) {
73
+ console.log(result.created ? "Created OpenPome local configuration." : "OpenPome local configuration already exists.");
74
+ console.log(`Home: ${result.homeDirectory}`);
75
+ console.log(`Config: ${result.configFile}`);
76
+ }
77
+ export function printConfigPaths(result) {
78
+ console.log("OpenPome paths");
79
+ console.log(`Home: ${result.homeDirectory}`);
80
+ console.log(`Config: ${result.configFile}`);
81
+ console.log(`Workspace index: ${result.workspaceIndexFile}`);
82
+ console.log(`Workspace links: ${result.workspaceLinksFile}`);
83
+ console.log(`Active session: ${result.activeTaskSessionFile}`);
84
+ console.log(`Session history: ${result.taskSessionHistoryFile}`);
85
+ }
86
+ export function printConfigShow(result) {
87
+ console.log(result.exists ? "OpenPome config" : "OpenPome config defaults");
88
+ console.log(`Config: ${result.configFile}`);
89
+ console.log("");
90
+ console.log(JSON.stringify(result.config, null, 2));
91
+ }
92
+ export function printConfigReset(result) {
93
+ console.log("OpenPome config reset.");
94
+ console.log(`Config: ${result.configFile}`);
95
+ console.log(`Reset: ${result.resetAt}`);
96
+ }
97
+ export function printDoctorResult(result) {
98
+ console.log(`OpenPome doctor: ${result.status}`);
99
+ console.log("");
100
+ for (const check of result.checks) {
101
+ const marker = check.status === "ok" ? "ok" : "!";
102
+ console.log(`${marker.padEnd(2)} ${check.name}: ${check.detail}`);
103
+ }
104
+ }
105
+ export function printJiraOAuthLogin(login) {
106
+ console.log("Jira OAuth login");
107
+ console.log("Status: experimental until a real Atlassian OAuth app smoke test is completed.");
108
+ console.log("");
109
+ console.log(`Redirect URI: ${login.redirectUri}`);
110
+ console.log(`Scopes: ${login.scopes.join(", ")}`);
111
+ console.log(`State: ${login.state}`);
112
+ console.log("");
113
+ console.log("Open this URL in your browser:");
114
+ console.log(login.authorizationUrl);
115
+ console.log("");
116
+ console.log(login.nextStep);
117
+ }
118
+ export function printJiraOAuthCompletion(completion) {
119
+ console.log(completion.detail);
120
+ if (completion.siteUrl) {
121
+ console.log(`Site: ${completion.siteUrl}`);
122
+ }
123
+ }
124
+ export function printAssignedWork(result) {
125
+ console.log(`Assigned work from ${result.sourceDisplayName} (${result.sourceMode})`);
126
+ if (result.activeScope) {
127
+ console.log(`Scope: ${result.activeScope.displayName} (${result.activeScope.kind})`);
128
+ }
129
+ console.log("");
130
+ const hasAssignedWork = Object.values(result.groups).some((items) => items.length > 0);
131
+ if (!hasAssignedWork) {
132
+ console.log("No assigned work found in the selected scope.");
133
+ console.log("Next: confirm the issue is assigned to you, select the correct board/scope, or run `pome jira show <KEY>` for a known issue.");
134
+ return;
135
+ }
136
+ const sections = [
137
+ ["story", "Stories"],
138
+ ["subtask", "Sub-tasks"],
139
+ ["bug", "Bugs"],
140
+ ["task", "Tasks"],
141
+ ["epic", "Epics"]
142
+ ];
143
+ for (const [type, label] of sections) {
144
+ const items = result.groups[type];
145
+ if (items.length === 0) {
146
+ continue;
147
+ }
148
+ console.log(label);
149
+ for (const item of items) {
150
+ const priority = item.priority ? ` · ${item.priority}` : "";
151
+ console.log(` ${item.key.padEnd(10)} ${item.title}`);
152
+ console.log(` ${"".padEnd(10)} ${item.status}${priority}`);
153
+ }
154
+ console.log("");
155
+ }
156
+ }
157
+ export function printJiraBoards(result) {
158
+ console.log(`Jira boards (${result.sourceMode})`);
159
+ if (result.activeScope) {
160
+ console.log(`Active: ${result.activeScope.displayName} (${result.activeScope.scopeId})`);
161
+ }
162
+ console.log("");
163
+ if (result.boards.length === 0) {
164
+ console.log("No Jira boards found for the authenticated user.");
165
+ return;
166
+ }
167
+ for (const board of result.boards) {
168
+ const type = board.metadata?.["jiraBoardType"] ? ` · ${board.metadata["jiraBoardType"]}` : "";
169
+ const project = board.metadata?.["jiraProjectKey"] ? ` · ${board.metadata["jiraProjectKey"]}` : "";
170
+ const activeMarker = result.activeScope?.scopeId === board.scopeId ? "*" : " ";
171
+ console.log(`${activeMarker} ${board.scopeId.padEnd(8)} ${board.displayName}${type}${project}`);
172
+ }
173
+ console.log("");
174
+ console.log("Use `pome jira board use <BOARD_ID>` to select the scope for assigned work.");
175
+ }
176
+ export function printJiraBoardSelection(result) {
177
+ console.log(`Selected Jira board: ${result.activeScope.displayName} (${result.activeScope.scopeId})`);
178
+ console.log(`Config: ${result.configFile}`);
179
+ }
180
+ export function printWorkItemScopes(result) {
181
+ console.log(`Work item scopes from ${result.sourceDisplayName} (${result.sourceMode})`);
182
+ if (result.activeScope) {
183
+ console.log(`Active: ${result.activeScope.displayName} (${result.activeScope.scopeId})`);
184
+ }
185
+ console.log("");
186
+ if (result.scopes.length === 0) {
187
+ console.log("No work item scopes found for the authenticated user.");
188
+ return;
189
+ }
190
+ for (const scope of result.scopes) {
191
+ const activeMarker = result.activeScope?.scopeId === scope.scopeId ? "*" : " ";
192
+ const provider = scope.providerId ? ` · ${scope.providerId}` : "";
193
+ console.log(`${activeMarker} ${scope.scopeId.padEnd(8)} ${scope.displayName} · ${scope.kind}${provider}`);
194
+ }
195
+ console.log("");
196
+ console.log("Use `pome work-item scope use <SCOPE_ID>` to select the scope for assigned work.");
197
+ }
198
+ export function printWorkItemScopeSelection(result) {
199
+ console.log(`Selected work item scope: ${result.activeScope.displayName} (${result.activeScope.scopeId})`);
200
+ console.log(`Source: ${result.sourceDisplayName}`);
201
+ console.log(`Config: ${result.configFile}`);
202
+ }
203
+ export function printWorkItem(item) {
204
+ console.log(`${item.key} ${item.title}`);
205
+ console.log("");
206
+ console.log(`Type: ${item.type}`);
207
+ console.log(`Status: ${item.status}`);
208
+ if (item.priority) {
209
+ console.log(`Priority: ${item.priority}`);
210
+ }
211
+ if (item.assignee) {
212
+ console.log(`Assignee: ${item.assignee}`);
213
+ }
214
+ if (item.parentKey) {
215
+ console.log(`Parent: ${item.parentKey}`);
216
+ }
217
+ if (item.labels?.length) {
218
+ console.log(`Labels: ${item.labels.join(", ")}`);
219
+ }
220
+ if (item.components?.length) {
221
+ console.log(`Components: ${item.components.join(", ")}`);
222
+ }
223
+ if (item.description) {
224
+ console.log("");
225
+ console.log("Description");
226
+ console.log(item.description);
227
+ }
228
+ if (item.subtasks?.length) {
229
+ console.log("");
230
+ console.log("Subtasks");
231
+ for (const subtask of item.subtasks) {
232
+ console.log(` ${subtask.key} ${subtask.title} (${subtask.status})`);
233
+ }
234
+ }
235
+ if (item.links?.length) {
236
+ console.log("");
237
+ console.log("Links");
238
+ for (const link of item.links) {
239
+ const title = link.title ? ` - ${link.title}` : "";
240
+ console.log(` ${link.kind}: ${link.url}${title}`);
241
+ }
242
+ }
243
+ }
244
+ export function printWorkspaceScan(result) {
245
+ console.log(`Workspace scan complete: ${result.workspaces.length} repos`);
246
+ console.log(`Index: ${result.indexFile}`);
247
+ console.log("");
248
+ console.log("Scan paths");
249
+ for (const scanPath of result.scanPaths) {
250
+ console.log(` ${scanPath}`);
251
+ }
252
+ if (result.workspaces.length === 0) {
253
+ console.log("");
254
+ console.log("No Git workspaces found.");
255
+ return;
256
+ }
257
+ console.log("");
258
+ printWorkspaceRows(result.workspaces);
259
+ }
260
+ export function printWorkspaceList(result) {
261
+ if (!result.scannedAt) {
262
+ console.log("No workspace index found. Run `pome workspace scan` first.");
263
+ console.log(`Index: ${result.indexFile}`);
264
+ return;
265
+ }
266
+ console.log(`Indexed workspaces: ${result.workspaces.length}`);
267
+ console.log(`Scanned: ${result.scannedAt}`);
268
+ console.log(`Index: ${result.indexFile}`);
269
+ if (result.workspaces.length === 0) {
270
+ return;
271
+ }
272
+ console.log("");
273
+ printWorkspaceRows(result.workspaces);
274
+ }
275
+ export function printWorkspaceResolution(result) {
276
+ console.log(`Workspace candidates for ${result.workItem.key}`);
277
+ console.log(`${result.workItem.title}`);
278
+ console.log("");
279
+ if (result.candidates.length === 0) {
280
+ console.log("No matching workspace candidates found.");
281
+ console.log("Run `pome workspace scan` from a parent directory or set OPENPOME_WORKSPACE_SCAN_PATHS.");
282
+ return;
283
+ }
284
+ for (const candidate of result.candidates.slice(0, 5)) {
285
+ const confidence = Math.round(candidate.confidence * 100);
286
+ console.log(`${candidate.workspace.name} (${confidence}%)`);
287
+ if (candidate.workspace.path) {
288
+ console.log(` Path: ${candidate.workspace.path}`);
289
+ }
290
+ if (candidate.workspace.currentBranch) {
291
+ console.log(` Branch: ${candidate.workspace.currentBranch}`);
292
+ }
293
+ for (const reason of candidate.reasons) {
294
+ console.log(` - ${reason}`);
295
+ }
296
+ }
297
+ }
298
+ export function printWorkspaceLink(result) {
299
+ console.log(`Linked ${result.workItemKey} to ${result.workspace.name}`);
300
+ if (result.workspace.path) {
301
+ console.log(`Path: ${result.workspace.path}`);
302
+ }
303
+ console.log(`Match: ${Math.round(result.link.confidence * 100)}% developer-confirmed`);
304
+ console.log(`Links: ${result.linksFile}`);
305
+ }
306
+ export function printTaskSessionStart(result) {
307
+ console.log(`Started task session ${result.session.id}`);
308
+ console.log(`${result.workItem.key} ${result.workItem.title}`);
309
+ console.log(`Status: ${result.session.status}`);
310
+ console.log(`File: ${result.sessionFile}`);
311
+ if (result.workspaceCandidate) {
312
+ console.log("");
313
+ printWorkspaceCandidate(result.workspaceCandidate);
314
+ }
315
+ else {
316
+ console.log("");
317
+ console.log("Workspace: unresolved");
318
+ console.log("Run `pome workspace resolve <KEY>` or `pome workspace link <KEY> <PATH>`.");
319
+ }
320
+ console.log("");
321
+ console.log("Next: pome plan");
322
+ }
323
+ export function printTaskSessionStatus(result) {
324
+ if (!result.active || !result.session || !result.workItem) {
325
+ console.log("No active task session.");
326
+ console.log(`File: ${result.sessionFile}`);
327
+ return;
328
+ }
329
+ console.log(`Active task session ${result.session.id}`);
330
+ console.log(`${result.workItem.key} ${result.workItem.title}`);
331
+ console.log(`Status: ${result.session.status}`);
332
+ console.log(`Automation: ${result.session.automationLevel}`);
333
+ console.log(`File: ${result.sessionFile}`);
334
+ if (result.workspaceCandidate) {
335
+ console.log("");
336
+ printWorkspaceCandidate(result.workspaceCandidate);
337
+ }
338
+ if (result.plan) {
339
+ console.log("");
340
+ console.log("Plan: ready");
341
+ }
342
+ if (result.planApproval) {
343
+ console.log(`Approval: ${result.planApproval.status}`);
344
+ }
345
+ if (result.events?.length) {
346
+ console.log(`Events: ${result.events.length}`);
347
+ }
348
+ if (result.approvalHistory?.length) {
349
+ console.log(`Approval history: ${result.approvalHistory.length}`);
350
+ }
351
+ }
352
+ export function printTaskSessionPlan(result) {
353
+ console.log(`Plan for ${result.workItem.key}`);
354
+ console.log(result.plan.summary);
355
+ console.log("");
356
+ printStringList("Assumptions", result.plan.assumptions);
357
+ if (result.plan.steps.length > 0) {
358
+ console.log("Steps");
359
+ for (const step of result.plan.steps) {
360
+ console.log(` ${step.id}. ${step.title}`);
361
+ if (step.detail) {
362
+ console.log(` ${step.detail}`);
363
+ }
364
+ }
365
+ console.log("");
366
+ }
367
+ printStringList("Likely files", result.plan.filesLikelyChanged);
368
+ printStringList("Commands", result.plan.commandsToRun);
369
+ printStringList("Risks", result.plan.risks);
370
+ printStringList("Missing info", result.plan.missingInfo);
371
+ console.log(`Status: ${result.session.status}`);
372
+ console.log("Next: approve the plan before implementation.");
373
+ }
374
+ export function printTaskSessionApproval(result) {
375
+ console.log(`${result.approval.title}: ${result.approval.status}`);
376
+ console.log(`${result.workItem.key} ${result.workItem.title}`);
377
+ console.log(`Status: ${result.session.status}`);
378
+ console.log(`File: ${result.sessionFile}`);
379
+ console.log("");
380
+ console.log(result.nextStep);
381
+ }
382
+ export function printTaskSessionLifecycle(result) {
383
+ console.log(result.message);
384
+ console.log(`Active: ${result.active ? "yes" : "no"}`);
385
+ console.log(`Session: ${result.session?.id ?? "none"}`);
386
+ if (result.session) {
387
+ console.log(`Status: ${result.session.status}`);
388
+ console.log(`Work: ${result.session.workItemKey}`);
389
+ }
390
+ console.log(`File: ${result.sessionFile}`);
391
+ console.log(`History: ${result.historyFile}`);
392
+ }
393
+ export function printTaskSessionTimeline(result) {
394
+ if (!result.active || !result.session) {
395
+ console.log("No active task session.");
396
+ console.log(`File: ${result.sessionFile}`);
397
+ return;
398
+ }
399
+ console.log(`Timeline for ${result.session.workItemKey}`);
400
+ console.log(`Session: ${result.session.id}`);
401
+ console.log(`File: ${result.sessionFile}`);
402
+ console.log("");
403
+ if (result.events.length === 0) {
404
+ console.log("No timeline events recorded yet.");
405
+ return;
406
+ }
407
+ for (const event of result.events) {
408
+ console.log(`${event.createdAt} ${event.title}`);
409
+ console.log(` Type: ${event.type}`);
410
+ for (const detail of event.details) {
411
+ console.log(` - ${detail}`);
412
+ }
413
+ }
414
+ }
415
+ export function printTaskSessionApprovalHistory(result) {
416
+ if (!result.active || !result.session) {
417
+ console.log("No active task session.");
418
+ console.log(`File: ${result.sessionFile}`);
419
+ return;
420
+ }
421
+ console.log(`Approval history for ${result.session.workItemKey}`);
422
+ console.log(`Session: ${result.session.id}`);
423
+ console.log("");
424
+ if (result.approvals.length === 0) {
425
+ console.log("No approvals recorded yet.");
426
+ return;
427
+ }
428
+ for (const approval of result.approvals) {
429
+ console.log(`${approval.title}: ${approval.status}`);
430
+ console.log(` Type: ${approval.type}`);
431
+ console.log(` Reason: ${approval.reason}`);
432
+ for (const detail of approval.details) {
433
+ console.log(` - ${detail}`);
434
+ }
435
+ }
436
+ }
437
+ export function printTestCommandDiscovery(result) {
438
+ if (!result.active || !result.session) {
439
+ console.log("No active task session.");
440
+ console.log(`File: ${result.sessionFile}`);
441
+ console.log(result.nextStep);
442
+ return;
443
+ }
444
+ console.log(`Test command candidates for ${result.session.workItemKey}`);
445
+ console.log(`Session: ${result.session.id}`);
446
+ if (result.workspace?.path) {
447
+ console.log(`Workspace: ${result.workspace.path}`);
448
+ }
449
+ console.log(`Discovered: ${result.discoveredAt}`);
450
+ console.log("");
451
+ if (result.candidates.length === 0) {
452
+ console.log("No test command candidates found.");
453
+ console.log(result.nextStep);
454
+ return;
455
+ }
456
+ for (const candidate of result.candidates) {
457
+ console.log(`${candidate.id}`);
458
+ console.log(` Command: ${candidate.command}`);
459
+ console.log(` Source: ${candidate.source}`);
460
+ console.log(` Reason: ${candidate.reason}`);
461
+ if (candidate.cwd) {
462
+ console.log(` Cwd: ${candidate.cwd}`);
463
+ }
464
+ }
465
+ console.log("");
466
+ console.log(result.nextStep);
467
+ }
468
+ export function printCommandApprovalEvidence(evidence) {
469
+ console.log("Command approval recorded.");
470
+ console.log(`Evidence: ${evidence.id}`);
471
+ console.log(`Command: ${evidence.command}`);
472
+ if (evidence.cwd) {
473
+ console.log(`Cwd: ${evidence.cwd}`);
474
+ }
475
+ console.log(`Approved: ${evidence.approvedAt}`);
476
+ console.log(`Approval: ${evidence.approval.id}`);
477
+ console.log("");
478
+ console.log("This records approval evidence only; OpenPome did not run the command.");
479
+ }
480
+ export function printTestCommandHistory(result) {
481
+ if (!result.active || !result.session) {
482
+ console.log("No active task session.");
483
+ console.log(`File: ${result.sessionFile}`);
484
+ return;
485
+ }
486
+ console.log(`Approved command evidence for ${result.session.workItemKey}`);
487
+ console.log(`Session: ${result.session.id}`);
488
+ console.log("");
489
+ if (result.evidence.length === 0) {
490
+ console.log("No approved command evidence recorded yet.");
491
+ return;
492
+ }
493
+ for (const evidence of result.evidence) {
494
+ console.log(`${evidence.approvedAt} ${evidence.command}`);
495
+ console.log(` Evidence: ${evidence.id}`);
496
+ console.log(` Approval: ${evidence.approval.id}`);
497
+ if (evidence.cwd) {
498
+ console.log(` Cwd: ${evidence.cwd}`);
499
+ }
500
+ }
501
+ if (result.runs.length > 0) {
502
+ console.log("");
503
+ console.log("Test runs");
504
+ for (const run of result.runs) {
505
+ console.log(`${run.finishedAt} ${run.command}: ${run.status} (exit ${run.exitCode})`);
506
+ console.log(` Evidence: ${run.id}`);
507
+ console.log(` Approval: ${run.approvalId}`);
508
+ }
509
+ }
510
+ }
511
+ export function printTestRunEvidence(evidence) {
512
+ console.log(`Test command ${evidence.status}: ${evidence.command}`);
513
+ console.log(`Evidence: ${evidence.id}`);
514
+ console.log(`Approval: ${evidence.approvalId}`);
515
+ console.log(`Exit: ${evidence.exitCode}`);
516
+ if (evidence.cwd) {
517
+ console.log(`Cwd: ${evidence.cwd}`);
518
+ }
519
+ console.log(`Started: ${evidence.startedAt}`);
520
+ console.log(`Finished: ${evidence.finishedAt}`);
521
+ printStringList("Stdout summary", evidence.stdoutSummary);
522
+ printStringList("Stderr summary", evidence.stderrSummary);
523
+ }
524
+ export function printManualCopyAIContext(result) {
525
+ if (!result.active || !result.session || !result.context) {
526
+ console.log("No active task session.");
527
+ console.log(`File: ${result.sessionFile}`);
528
+ return;
529
+ }
530
+ console.log(`Manual-copy AI context for ${result.session.workItemKey}`);
531
+ console.log(`Created: ${result.context.createdAt}`);
532
+ console.log("Includes source code: no");
533
+ console.log("Includes full diff: no");
534
+ console.log("");
535
+ console.log(result.context.text);
536
+ }
537
+ export function printManualCopyAIPrompt(result) {
538
+ if (!result.active || !result.session || !result.prompt) {
539
+ console.log("No active task session.");
540
+ console.log(`File: ${result.sessionFile}`);
541
+ return;
542
+ }
543
+ console.log(`Manual-copy AI prompt for ${result.session.workItemKey}`);
544
+ console.log("");
545
+ console.log(result.prompt);
546
+ }
547
+ export function printDiffSummary(result) {
548
+ if (!result.active || !result.session || !result.summary) {
549
+ console.log("No active task session.");
550
+ console.log(`File: ${result.sessionFile}`);
551
+ return;
552
+ }
553
+ console.log(`Diff summary for ${result.session.workItemKey}`);
554
+ if (result.summary.workspacePath) {
555
+ console.log(`Workspace: ${result.summary.workspacePath}`);
556
+ }
557
+ if (result.summary.branch) {
558
+ console.log(`Branch: ${result.summary.branch}`);
559
+ }
560
+ console.log(`Created: ${result.summary.createdAt}`);
561
+ console.log("Full diff: no");
562
+ console.log("");
563
+ if (result.summary.files.length === 0) {
564
+ console.log("No tracked diff files found.");
565
+ }
566
+ else {
567
+ for (const file of result.summary.files) {
568
+ const added = file.added === undefined ? "?" : String(file.added);
569
+ const deleted = file.deleted === undefined ? "?" : String(file.deleted);
570
+ console.log(`${file.status.padEnd(3)} ${file.path} (+${added} -${deleted})`);
571
+ }
572
+ }
573
+ printStringList("Git status", result.summary.statusLines);
574
+ }
575
+ export function printGitHubAuthStatus(result) {
576
+ console.log("GitHub auth status");
577
+ console.log(`CLI available: ${result.cliAvailable ? "yes" : "no"}`);
578
+ console.log(`Authenticated: ${result.authenticated ? "yes" : "no"}`);
579
+ console.log(`Detail: ${result.detail}`);
580
+ }
581
+ export function printExternalActionGuard(result) {
582
+ const label = result.action === "create_pr" ? "PR creation" : "Work item update posting";
583
+ console.log(`${label}: disabled`);
584
+ if (result.session) {
585
+ console.log(`Session: ${result.session.id}`);
586
+ console.log(`Work: ${result.session.workItemKey}`);
587
+ }
588
+ console.log(`File: ${result.sessionFile}`);
589
+ console.log("");
590
+ console.log(result.detail);
591
+ console.log(`Next: ${result.nextStep}`);
592
+ }
593
+ export function printPullRequestDraft(result) {
594
+ if (!result.active || !result.session || !result.draft) {
595
+ console.log("No active task session.");
596
+ console.log(`File: ${result.sessionFile}`);
597
+ return;
598
+ }
599
+ console.log(`PR draft for ${result.session.workItemKey}`);
600
+ console.log(`Title: ${result.draft.title}`);
601
+ console.log(`Base: ${result.draft.baseBranch}`);
602
+ console.log(`Head: ${result.draft.headBranch}`);
603
+ if (result.draft.remoteUrl) {
604
+ console.log(`Remote: ${result.draft.remoteUrl}`);
605
+ }
606
+ console.log(`Created: ${result.draft.createdAt}`);
607
+ console.log("");
608
+ console.log(result.draft.body);
609
+ }
610
+ export function printWorkItemUpdateDraft(result) {
611
+ if (!result.active || !result.session || !result.draft) {
612
+ console.log("No active task session.");
613
+ console.log(`File: ${result.sessionFile}`);
614
+ return;
615
+ }
616
+ console.log(`Work item update draft for ${result.workItem?.key ?? result.session.workItemKey}`);
617
+ console.log(`Created: ${result.draft.createdAt}`);
618
+ console.log("");
619
+ console.log(result.draft.body);
620
+ }
621
+ function printWorkspaceRows(workspaces) {
622
+ for (const workspace of workspaces) {
623
+ const branch = workspace.currentBranch ? ` · ${workspace.currentBranch}` : "";
624
+ console.log(` ${workspace.name}${branch}`);
625
+ if (workspace.path) {
626
+ console.log(` ${"".padEnd(2)}${workspace.path}`);
627
+ }
628
+ if (workspace.remoteUrls[0]) {
629
+ console.log(` ${"".padEnd(2)}${workspace.remoteUrls[0]}`);
630
+ }
631
+ }
632
+ }
633
+ function printWorkspaceCandidate(candidate) {
634
+ console.log(`Workspace: ${candidate.workspace.name} (${Math.round(candidate.confidence * 100)}%)`);
635
+ if (candidate.workspace.path) {
636
+ console.log(`Path: ${candidate.workspace.path}`);
637
+ }
638
+ if (candidate.workspace.currentBranch) {
639
+ console.log(`Branch: ${candidate.workspace.currentBranch}`);
640
+ }
641
+ for (const reason of candidate.reasons) {
642
+ console.log(`- ${reason}`);
643
+ }
644
+ }
645
+ function printStringList(label, values) {
646
+ if (values.length === 0) {
647
+ return;
648
+ }
649
+ console.log(label);
650
+ for (const value of values) {
651
+ console.log(` - ${value}`);
652
+ }
653
+ console.log("");
654
+ }
655
+ //# sourceMappingURL=presentation.js.map