@proletariat/cli 0.3.55 → 0.3.57

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 (246) hide show
  1. package/README.md +74 -5
  2. package/bin/validate-better-sqlite3.cjs +44 -5
  3. package/dist/commands/agent/cleanup.d.ts +1 -0
  4. package/dist/commands/agent/cleanup.js +11 -1
  5. package/dist/commands/agent/cleanup.js.map +1 -1
  6. package/dist/commands/agent/rebuild.js +1 -1
  7. package/dist/commands/agent/rebuild.js.map +1 -1
  8. package/dist/commands/asana/import.d.ts +14 -0
  9. package/dist/commands/asana/import.js +240 -0
  10. package/dist/commands/asana/import.js.map +1 -0
  11. package/dist/commands/claude-yolo.d.ts +20 -0
  12. package/dist/commands/claude-yolo.js +86 -0
  13. package/dist/commands/claude-yolo.js.map +1 -0
  14. package/dist/commands/codex/index.d.ts +23 -0
  15. package/dist/commands/codex/index.js +168 -0
  16. package/dist/commands/codex/index.js.map +1 -0
  17. package/dist/commands/codex-yolo.d.ts +20 -0
  18. package/dist/commands/codex-yolo.js +86 -0
  19. package/dist/commands/codex-yolo.js.map +1 -0
  20. package/dist/commands/config/index.js +2 -2
  21. package/dist/commands/config/index.js.map +1 -1
  22. package/dist/commands/dashboard.d.ts +38 -0
  23. package/dist/commands/dashboard.js +352 -0
  24. package/dist/commands/dashboard.js.map +1 -0
  25. package/dist/commands/docker/clean.js +1 -1
  26. package/dist/commands/docker/clean.js.map +1 -1
  27. package/dist/commands/docker/list.js +1 -1
  28. package/dist/commands/docker/list.js.map +1 -1
  29. package/dist/commands/docker/logs.js +1 -1
  30. package/dist/commands/docker/logs.js.map +1 -1
  31. package/dist/commands/docker/restart.js +1 -1
  32. package/dist/commands/docker/restart.js.map +1 -1
  33. package/dist/commands/docker/shell.js +1 -1
  34. package/dist/commands/docker/shell.js.map +1 -1
  35. package/dist/commands/docker/start.js +1 -1
  36. package/dist/commands/docker/start.js.map +1 -1
  37. package/dist/commands/docker/stop.js +1 -1
  38. package/dist/commands/docker/stop.js.map +1 -1
  39. package/dist/commands/docker/sync.js +1 -1
  40. package/dist/commands/docker/sync.js.map +1 -1
  41. package/dist/commands/execution/config.js +2 -2
  42. package/dist/commands/execution/config.js.map +1 -1
  43. package/dist/commands/execution/list.js +1 -1
  44. package/dist/commands/execution/list.js.map +1 -1
  45. package/dist/commands/execution/logs.js +10 -8
  46. package/dist/commands/execution/logs.js.map +1 -1
  47. package/dist/commands/execution/stop.js +1 -1
  48. package/dist/commands/execution/stop.js.map +1 -1
  49. package/dist/commands/execution/view.js +1 -1
  50. package/dist/commands/execution/view.js.map +1 -1
  51. package/dist/commands/init.d.ts +0 -16
  52. package/dist/commands/init.js +50 -160
  53. package/dist/commands/init.js.map +1 -1
  54. package/dist/commands/logs.d.ts +20 -0
  55. package/dist/commands/logs.js +84 -0
  56. package/dist/commands/logs.js.map +1 -0
  57. package/dist/commands/mcp-server.js +1 -1
  58. package/dist/commands/mcp-server.js.map +1 -1
  59. package/dist/commands/new.d.ts +27 -0
  60. package/dist/commands/new.js +184 -0
  61. package/dist/commands/new.js.map +1 -0
  62. package/dist/commands/orchestrator/attach.d.ts +1 -0
  63. package/dist/commands/orchestrator/attach.js +159 -26
  64. package/dist/commands/orchestrator/attach.js.map +1 -1
  65. package/dist/commands/orchestrator/start.d.ts +20 -0
  66. package/dist/commands/orchestrator/start.js +123 -14
  67. package/dist/commands/orchestrator/start.js.map +1 -1
  68. package/dist/commands/orchestrator/status.d.ts +4 -0
  69. package/dist/commands/orchestrator/status.js +70 -29
  70. package/dist/commands/orchestrator/status.js.map +1 -1
  71. package/dist/commands/orchestrator/stop.js +57 -23
  72. package/dist/commands/orchestrator/stop.js.map +1 -1
  73. package/dist/commands/peek.d.ts +20 -0
  74. package/dist/commands/peek.js +84 -0
  75. package/dist/commands/peek.js.map +1 -0
  76. package/dist/commands/poke.d.ts +20 -0
  77. package/dist/commands/poke.js +89 -0
  78. package/dist/commands/poke.js.map +1 -0
  79. package/dist/commands/pr/link.js +1 -1
  80. package/dist/commands/pr/link.js.map +1 -1
  81. package/dist/commands/pr/status.js +1 -1
  82. package/dist/commands/pr/status.js.map +1 -1
  83. package/dist/commands/ps.d.ts +18 -0
  84. package/dist/commands/ps.js +123 -0
  85. package/dist/commands/ps.js.map +1 -0
  86. package/dist/commands/qa/index.js +1 -1
  87. package/dist/commands/qa/index.js.map +1 -1
  88. package/dist/commands/repo/add.js +1 -1
  89. package/dist/commands/repo/add.js.map +1 -1
  90. package/dist/commands/repo/fix-remotes.d.ts +14 -0
  91. package/dist/commands/repo/fix-remotes.js +154 -0
  92. package/dist/commands/repo/fix-remotes.js.map +1 -0
  93. package/dist/commands/repo/list.js +1 -1
  94. package/dist/commands/repo/list.js.map +1 -1
  95. package/dist/commands/repo/remove.js +1 -1
  96. package/dist/commands/repo/remove.js.map +1 -1
  97. package/dist/commands/repo/view.js +1 -1
  98. package/dist/commands/repo/view.js.map +1 -1
  99. package/dist/commands/run/index.d.ts +25 -0
  100. package/dist/commands/run/index.js +212 -0
  101. package/dist/commands/run/index.js.map +1 -0
  102. package/dist/commands/session/index.js +4 -0
  103. package/dist/commands/session/index.js.map +1 -1
  104. package/dist/commands/session/prune.d.ts +18 -0
  105. package/dist/commands/session/prune.js +327 -0
  106. package/dist/commands/session/prune.js.map +1 -0
  107. package/dist/commands/shortcut/connect.d.ts +15 -0
  108. package/dist/commands/shortcut/connect.js +210 -0
  109. package/dist/commands/shortcut/connect.js.map +1 -0
  110. package/dist/commands/stop.d.ts +19 -0
  111. package/dist/commands/stop.js +83 -0
  112. package/dist/commands/stop.js.map +1 -0
  113. package/dist/commands/work/asana.d.ts +23 -0
  114. package/dist/commands/work/asana.js +213 -0
  115. package/dist/commands/work/asana.js.map +1 -0
  116. package/dist/commands/work/complete.js +1 -1
  117. package/dist/commands/work/complete.js.map +1 -1
  118. package/dist/commands/work/ready.js +1 -1
  119. package/dist/commands/work/ready.js.map +1 -1
  120. package/dist/commands/work/review.js +1 -1
  121. package/dist/commands/work/review.js.map +1 -1
  122. package/dist/commands/work/revise.js +1 -1
  123. package/dist/commands/work/revise.js.map +1 -1
  124. package/dist/commands/work/shortcut.d.ts +23 -0
  125. package/dist/commands/work/shortcut.js +212 -0
  126. package/dist/commands/work/shortcut.js.map +1 -0
  127. package/dist/commands/work/spawn.d.ts +3 -0
  128. package/dist/commands/work/spawn.js +175 -2
  129. package/dist/commands/work/spawn.js.map +1 -1
  130. package/dist/commands/work/start.js +54 -45
  131. package/dist/commands/work/start.js.map +1 -1
  132. package/dist/commands/work/watch.js +1 -1
  133. package/dist/commands/work/watch.js.map +1 -1
  134. package/dist/commands/workspace/add.js +1 -1
  135. package/dist/commands/workspace/add.js.map +1 -1
  136. package/dist/commands/workspace/list.js +1 -1
  137. package/dist/commands/workspace/list.js.map +1 -1
  138. package/dist/hooks/init.d.ts +1 -1
  139. package/dist/hooks/init.js +6 -6
  140. package/dist/hooks/init.js.map +1 -1
  141. package/dist/lib/agent-naming.d.ts +15 -0
  142. package/dist/lib/agent-naming.js +32 -0
  143. package/dist/lib/agent-naming.js.map +1 -0
  144. package/dist/lib/agents/commands.d.ts +2 -0
  145. package/dist/lib/agents/commands.js +56 -51
  146. package/dist/lib/agents/commands.js.map +1 -1
  147. package/dist/lib/agents/index.js +11 -7
  148. package/dist/lib/agents/index.js.map +1 -1
  149. package/dist/lib/asana/client.d.ts +8 -0
  150. package/dist/lib/asana/client.js +26 -7
  151. package/dist/lib/asana/client.js.map +1 -1
  152. package/dist/lib/asana/types.d.ts +20 -0
  153. package/dist/lib/branch/index.d.ts +36 -0
  154. package/dist/lib/branch/index.js +129 -0
  155. package/dist/lib/branch/index.js.map +1 -1
  156. package/dist/lib/database/index.js +1 -1
  157. package/dist/lib/database/index.js.map +1 -1
  158. package/dist/lib/database/native-validation.d.ts +2 -0
  159. package/dist/lib/database/native-validation.js +30 -1
  160. package/dist/lib/database/native-validation.js.map +1 -1
  161. package/dist/lib/events/emitting-runner.d.ts +30 -0
  162. package/dist/lib/events/emitting-runner.js +95 -0
  163. package/dist/lib/events/emitting-runner.js.map +1 -0
  164. package/dist/lib/events/event-bus.d.ts +54 -0
  165. package/dist/lib/events/event-bus.js +107 -0
  166. package/dist/lib/events/event-bus.js.map +1 -0
  167. package/dist/lib/events/events.d.ts +67 -0
  168. package/dist/lib/events/events.js +8 -0
  169. package/dist/lib/events/events.js.map +1 -0
  170. package/dist/lib/events/index.d.ts +7 -0
  171. package/dist/lib/events/index.js +6 -0
  172. package/dist/lib/events/index.js.map +1 -0
  173. package/dist/lib/execution/devcontainer.d.ts +27 -0
  174. package/dist/lib/execution/devcontainer.js +80 -0
  175. package/dist/lib/execution/devcontainer.js.map +1 -1
  176. package/dist/lib/execution/runners.d.ts +28 -0
  177. package/dist/lib/execution/runners.js +536 -35
  178. package/dist/lib/execution/runners.js.map +1 -1
  179. package/dist/lib/execution/spawner.js +38 -17
  180. package/dist/lib/execution/spawner.js.map +1 -1
  181. package/dist/lib/execution/types.d.ts +2 -0
  182. package/dist/lib/execution/types.js.map +1 -1
  183. package/dist/lib/external-issues/adapters.d.ts +34 -0
  184. package/dist/lib/external-issues/adapters.js +191 -0
  185. package/dist/lib/external-issues/adapters.js.map +1 -1
  186. package/dist/lib/external-issues/asana.d.ts +75 -0
  187. package/dist/lib/external-issues/asana.js +243 -0
  188. package/dist/lib/external-issues/asana.js.map +1 -0
  189. package/dist/lib/external-issues/index.d.ts +4 -2
  190. package/dist/lib/external-issues/index.js +6 -2
  191. package/dist/lib/external-issues/index.js.map +1 -1
  192. package/dist/lib/external-issues/linear.js.map +1 -1
  193. package/dist/lib/external-issues/mapping-store.js +1 -1
  194. package/dist/lib/external-issues/shortcut.d.ts +86 -0
  195. package/dist/lib/external-issues/shortcut.js +274 -0
  196. package/dist/lib/external-issues/shortcut.js.map +1 -0
  197. package/dist/lib/external-issues/types.d.ts +3 -3
  198. package/dist/lib/external-issues/types.js +1 -1
  199. package/dist/lib/external-issues/types.js.map +1 -1
  200. package/dist/lib/mcp/tools/cli-passthrough.js +1 -1
  201. package/dist/lib/mcp/tools/cli-passthrough.js.map +1 -1
  202. package/dist/lib/mcp/tools/work.js +1 -1
  203. package/dist/lib/mcp/tools/work.js.map +1 -1
  204. package/dist/lib/pmo/index.d.ts +2 -2
  205. package/dist/lib/pmo/index.js +3 -3
  206. package/dist/lib/pmo/index.js.map +1 -1
  207. package/dist/lib/pmo/sync-manager.js +1 -1
  208. package/dist/lib/pmo/sync-manager.js.map +1 -1
  209. package/dist/lib/pmo/watcher.js +1 -1
  210. package/dist/lib/pmo/watcher.js.map +1 -1
  211. package/dist/lib/repos/git.d.ts +44 -0
  212. package/dist/lib/repos/git.js +127 -0
  213. package/dist/lib/repos/git.js.map +1 -1
  214. package/dist/lib/repos/index.js +36 -3
  215. package/dist/lib/repos/index.js.map +1 -1
  216. package/dist/lib/runners/agent-runner.d.ts +92 -0
  217. package/dist/lib/runners/agent-runner.js +9 -0
  218. package/dist/lib/runners/agent-runner.js.map +1 -0
  219. package/dist/lib/runners/claude-code-runner.d.ts +53 -0
  220. package/dist/lib/runners/claude-code-runner.js +132 -0
  221. package/dist/lib/runners/claude-code-runner.js.map +1 -0
  222. package/dist/lib/runners/index.d.ts +34 -0
  223. package/dist/lib/runners/index.js +97 -0
  224. package/dist/lib/runners/index.js.map +1 -0
  225. package/dist/lib/session-store.d.ts +70 -0
  226. package/dist/lib/session-store.js +167 -0
  227. package/dist/lib/session-store.js.map +1 -0
  228. package/dist/lib/shortcut/config.d.ts +44 -0
  229. package/dist/lib/shortcut/config.js +98 -0
  230. package/dist/lib/shortcut/config.js.map +1 -0
  231. package/dist/lib/shortcut/index.d.ts +7 -0
  232. package/dist/lib/shortcut/index.js +7 -0
  233. package/dist/lib/shortcut/index.js.map +1 -0
  234. package/dist/lib/work-source/client.d.ts +10 -0
  235. package/dist/lib/work-source/client.js +74 -0
  236. package/dist/lib/work-source/client.js.map +1 -0
  237. package/dist/lib/work-source/config.d.ts +1 -1
  238. package/dist/lib/work-source/config.js +17 -1
  239. package/dist/lib/work-source/config.js.map +1 -1
  240. package/dist/lib/work-source/index.d.ts +1 -0
  241. package/dist/lib/work-source/index.js +1 -0
  242. package/dist/lib/work-source/index.js.map +1 -1
  243. package/dist/lib/workspace.js +2 -2
  244. package/dist/lib/workspace.js.map +1 -1
  245. package/oclif.manifest.json +8135 -6979
  246. package/package.json +1 -1
@@ -0,0 +1,327 @@
1
+ import { Flags } from '@oclif/core';
2
+ import * as path from 'node:path';
3
+ import Database from 'better-sqlite3';
4
+ import { styles } from '../../lib/styles.js';
5
+ import { getWorkspaceInfo, cleanupAgent, getCleanableAgents, killTmuxSession, } from '../../lib/agents/commands.js';
6
+ import { ExecutionStorage } from '../../lib/execution/index.js';
7
+ import { parseSessionName, getHostTmuxSessionNames, getContainerTmuxSessionMap, flattenContainerSessions, findContainerSessionsByPrefix, findSessionForExecution, } from '../../lib/execution/session-utils.js';
8
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
9
+ import { shouldOutputJson, outputSuccessAsJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
10
+ export default class SessionPrune extends PMOCommand {
11
+ static description = 'Clean up stale sessions, orphan tmux sessions, and idle ephemeral agents';
12
+ static examples = [
13
+ '<%= config.bin %> session prune',
14
+ '<%= config.bin %> session prune --dry-run',
15
+ '<%= config.bin %> session prune --force',
16
+ '<%= config.bin %> session prune --age 24',
17
+ ];
18
+ static flags = {
19
+ ...pmoBaseFlags,
20
+ 'dry-run': Flags.boolean({
21
+ char: 'd',
22
+ description: 'Show what would be pruned without actually doing it',
23
+ default: false,
24
+ }),
25
+ force: Flags.boolean({
26
+ char: 'f',
27
+ description: 'Force cleanup even if agents have uncommitted/unpushed work',
28
+ default: false,
29
+ }),
30
+ yes: Flags.boolean({
31
+ char: 'y',
32
+ description: 'Skip confirmation prompt',
33
+ default: false,
34
+ }),
35
+ age: Flags.integer({
36
+ description: 'Only prune sessions/agents idle for more than N hours (default: 0 = all idle)',
37
+ default: 0,
38
+ }),
39
+ };
40
+ getPMOOptions() {
41
+ return { promptIfMultiple: false };
42
+ }
43
+ async execute() {
44
+ const { flags } = await this.parse(SessionPrune);
45
+ const jsonMode = shouldOutputJson(flags);
46
+ const dryRun = flags['dry-run'];
47
+ const forceCleanup = flags.force;
48
+ const skipConfirm = flags.yes;
49
+ const ageHours = flags.age;
50
+ // Get workspace info
51
+ let workspaceInfo;
52
+ try {
53
+ workspaceInfo = getWorkspaceInfo();
54
+ }
55
+ catch {
56
+ if (jsonMode) {
57
+ outputErrorAsJson('NOT_IN_WORKSPACE', 'Not in a workspace. Run from a proletariat HQ directory.', createMetadata('session prune', flags));
58
+ return;
59
+ }
60
+ this.log(styles.error('Not in a workspace. Run from a proletariat HQ directory.'));
61
+ return;
62
+ }
63
+ // Open database
64
+ const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
65
+ const db = new Database(dbPath);
66
+ const executionStorage = new ExecutionStorage(db);
67
+ try {
68
+ const result = {
69
+ staleExecutionsCleaned: 0,
70
+ orphanSessionsKilled: [],
71
+ ephemeralAgentsCleaned: [],
72
+ errors: [],
73
+ };
74
+ // =====================================================================
75
+ // Step 1: Clean up stale execution records
76
+ // =====================================================================
77
+ const staleCount = executionStorage.cleanupStaleExecutions();
78
+ result.staleExecutionsCleaned = staleCount;
79
+ // =====================================================================
80
+ // Step 2: Find and kill orphan tmux sessions
81
+ // =====================================================================
82
+ const hostTmuxSessions = getHostTmuxSessionNames();
83
+ const containerTmuxSessions = getContainerTmuxSessionMap();
84
+ const allContainerSessions = flattenContainerSessions(containerTmuxSessions);
85
+ // Get DB-tracked active executions to know which sessions are accounted for
86
+ const runningExecutions = executionStorage.listExecutions({ status: 'running' });
87
+ const startingExecutions = executionStorage.listExecutions({ status: 'starting' });
88
+ const activeExecutions = [...runningExecutions, ...startingExecutions];
89
+ const matchedHostSessions = new Set();
90
+ const matchedContainerSessions = new Set();
91
+ for (const exec of activeExecutions) {
92
+ const isContainer = exec.environment === 'devcontainer';
93
+ let actualSessionId = exec.sessionId;
94
+ if (!exec.sessionId) {
95
+ if (isContainer && exec.containerId) {
96
+ const containerSessions = findContainerSessionsByPrefix(containerTmuxSessions, exec.containerId);
97
+ const match = findSessionForExecution(exec.ticketId, exec.agentName, containerSessions);
98
+ if (match)
99
+ actualSessionId = match;
100
+ }
101
+ else {
102
+ const match = findSessionForExecution(exec.ticketId, exec.agentName, hostTmuxSessions);
103
+ if (match)
104
+ actualSessionId = match;
105
+ }
106
+ }
107
+ if (actualSessionId) {
108
+ if (isContainer && exec.containerId) {
109
+ matchedContainerSessions.add(`${exec.containerId}:${actualSessionId}`);
110
+ }
111
+ else {
112
+ matchedHostSessions.add(actualSessionId);
113
+ }
114
+ }
115
+ }
116
+ // Find orphan host sessions (match prlt pattern but not tracked in DB)
117
+ const orphanHostSessions = [];
118
+ for (const sessionName of hostTmuxSessions) {
119
+ if (matchedHostSessions.has(sessionName))
120
+ continue;
121
+ const parsed = parseSessionName(sessionName);
122
+ if (parsed) {
123
+ orphanHostSessions.push(sessionName);
124
+ }
125
+ }
126
+ // Find orphan container sessions
127
+ const orphanContainerSessions = [];
128
+ for (const { sessionName, containerId } of allContainerSessions) {
129
+ if (matchedContainerSessions.has(`${containerId}:${sessionName}`))
130
+ continue;
131
+ const parsed = parseSessionName(sessionName);
132
+ if (parsed) {
133
+ orphanContainerSessions.push({ sessionName, containerId });
134
+ }
135
+ }
136
+ // Kill orphan sessions
137
+ for (const sessionName of orphanHostSessions) {
138
+ if (dryRun) {
139
+ result.orphanSessionsKilled.push(sessionName);
140
+ }
141
+ else {
142
+ if (killTmuxSession(sessionName)) {
143
+ result.orphanSessionsKilled.push(sessionName);
144
+ }
145
+ else {
146
+ result.errors.push(`Failed to kill orphan session: ${sessionName}`);
147
+ }
148
+ }
149
+ }
150
+ for (const { sessionName, containerId } of orphanContainerSessions) {
151
+ if (dryRun) {
152
+ result.orphanSessionsKilled.push(`${containerId}:${sessionName}`);
153
+ }
154
+ else {
155
+ try {
156
+ const { execSync } = await import('node:child_process');
157
+ execSync(`docker exec ${containerId} tmux kill-session -t "${sessionName}"`, { stdio: 'pipe', timeout: 10000 });
158
+ result.orphanSessionsKilled.push(`${containerId}:${sessionName}`);
159
+ }
160
+ catch {
161
+ result.errors.push(`Failed to kill container orphan session: ${containerId}:${sessionName}`);
162
+ }
163
+ }
164
+ }
165
+ // =====================================================================
166
+ // Step 3: Clean up idle ephemeral agents
167
+ // =====================================================================
168
+ // Refresh workspace info after stale cleanup
169
+ const freshWorkspaceInfo = getWorkspaceInfo();
170
+ let cleanableAgents = getCleanableAgents(freshWorkspaceInfo, true);
171
+ // Apply age filter if specified
172
+ if (ageHours > 0) {
173
+ const cutoffMs = ageHours * 60 * 60 * 1000;
174
+ cleanableAgents = cleanableAgents.filter(agent => {
175
+ const agentCreated = agent.created_at ? new Date(agent.created_at).getTime() : 0;
176
+ return agentCreated > 0 && (Date.now() - agentCreated) > cutoffMs;
177
+ });
178
+ }
179
+ // Determine total work to be done
180
+ const totalOrphans = orphanHostSessions.length + orphanContainerSessions.length;
181
+ const totalWork = staleCount + totalOrphans + cleanableAgents.length;
182
+ if (totalWork === 0) {
183
+ if (jsonMode) {
184
+ outputSuccessAsJson({
185
+ message: 'Nothing to prune. All sessions and agents are clean.',
186
+ ...result,
187
+ }, createMetadata('session prune', flags));
188
+ return;
189
+ }
190
+ this.log('');
191
+ this.log(styles.success('Nothing to prune. All sessions and agents are clean.'));
192
+ this.log('');
193
+ return;
194
+ }
195
+ // Show summary of what will be pruned
196
+ if (!jsonMode) {
197
+ this.log('');
198
+ this.log(styles.header(`${dryRun ? '[DRY RUN] ' : ''}Session Prune`));
199
+ this.log('═'.repeat(60));
200
+ if (staleCount > 0) {
201
+ this.log(styles.info(` ${staleCount} stale execution record(s) ${dryRun ? 'would be ' : ''}cleaned`));
202
+ }
203
+ if (totalOrphans > 0) {
204
+ this.log(styles.info(` ${totalOrphans} orphan tmux session(s) ${dryRun ? 'would be ' : ''}killed:`));
205
+ for (const s of orphanHostSessions) {
206
+ this.log(styles.muted(` - ${s} (host)`));
207
+ }
208
+ for (const { sessionName, containerId } of orphanContainerSessions) {
209
+ this.log(styles.muted(` - ${sessionName} (container: ${containerId.substring(0, 12)})`));
210
+ }
211
+ }
212
+ if (cleanableAgents.length > 0) {
213
+ this.log(styles.info(` ${cleanableAgents.length} idle ephemeral agent(s) ${dryRun ? 'would be ' : ''}cleaned up:`));
214
+ for (const agent of cleanableAgents) {
215
+ this.log(styles.muted(` - ${agent.name}`));
216
+ }
217
+ }
218
+ this.log('');
219
+ }
220
+ // Confirm unless --yes or --dry-run
221
+ if (!skipConfirm && !dryRun && cleanableAgents.length > 0) {
222
+ if (jsonMode) {
223
+ outputSuccessAsJson({
224
+ message: 'Confirmation required',
225
+ preview: {
226
+ staleExecutions: staleCount,
227
+ orphanSessions: totalOrphans,
228
+ ephemeralAgents: cleanableAgents.map(a => a.name),
229
+ },
230
+ }, createMetadata('session prune', flags));
231
+ return;
232
+ }
233
+ const { confirm } = await this.prompt([
234
+ {
235
+ type: 'list',
236
+ name: 'confirm',
237
+ message: `Prune ${cleanableAgents.length} ephemeral agent(s) and ${totalOrphans} orphan session(s)?`,
238
+ choices: [
239
+ { name: 'No, cancel', value: false },
240
+ { name: 'Yes, prune', value: true },
241
+ ],
242
+ default: 0,
243
+ },
244
+ ], null);
245
+ if (!confirm) {
246
+ this.log(styles.muted('Operation cancelled.'));
247
+ return;
248
+ }
249
+ }
250
+ // Clean up ephemeral agents
251
+ if (!dryRun) {
252
+ for (const agent of cleanableAgents) {
253
+ if (!jsonMode) {
254
+ this.log(styles.info(` Cleaning up agent: ${agent.name}`));
255
+ }
256
+ // eslint-disable-next-line no-await-in-loop -- Sequential cleanup
257
+ const cleanupResult = await cleanupAgent(freshWorkspaceInfo, agent.name, {
258
+ log: jsonMode ? undefined : (msg) => this.log(styles.muted(` ${msg}`)),
259
+ dryRun: false,
260
+ force: forceCleanup,
261
+ pushFirst: !forceCleanup, // Try to push work before cleanup unless forcing
262
+ });
263
+ result.ephemeralAgentsCleaned.push(cleanupResult);
264
+ if (!cleanupResult.success && cleanupResult.blockedByGit && !jsonMode) {
265
+ this.log(styles.warning(` Skipped ${agent.name}: has unsaved work (use --force to override)`));
266
+ }
267
+ }
268
+ }
269
+ else {
270
+ // Dry run: just report what would happen
271
+ for (const agent of cleanableAgents) {
272
+ result.ephemeralAgentsCleaned.push({
273
+ agent: agent.name,
274
+ success: true,
275
+ tmuxSessionsKilled: [],
276
+ containersRemoved: [],
277
+ directoriesRemoved: [],
278
+ errors: [],
279
+ });
280
+ }
281
+ }
282
+ // Output results
283
+ if (jsonMode) {
284
+ outputSuccessAsJson({
285
+ message: `${dryRun ? 'Would prune' : 'Pruned'} ${totalWork} item(s)`,
286
+ dryRun,
287
+ ...result,
288
+ summary: {
289
+ staleExecutionsCleaned: result.staleExecutionsCleaned,
290
+ orphanSessionsKilled: result.orphanSessionsKilled.length,
291
+ ephemeralAgentsCleaned: result.ephemeralAgentsCleaned.filter(r => r.success).length,
292
+ ephemeralAgentsFailed: result.ephemeralAgentsCleaned.filter(r => !r.success).length,
293
+ },
294
+ }, createMetadata('session prune', flags));
295
+ return;
296
+ }
297
+ // Summary
298
+ this.log('');
299
+ this.log(styles.header(`${dryRun ? '[DRY RUN] ' : ''}Prune Summary`));
300
+ this.log('─'.repeat(40));
301
+ if (result.staleExecutionsCleaned > 0) {
302
+ this.log(styles.success(` ${result.staleExecutionsCleaned} stale execution(s) ${dryRun ? 'would be ' : ''}cleaned`));
303
+ }
304
+ if (result.orphanSessionsKilled.length > 0) {
305
+ this.log(styles.success(` ${result.orphanSessionsKilled.length} orphan session(s) ${dryRun ? 'would be ' : ''}killed`));
306
+ }
307
+ const successfulCleanups = result.ephemeralAgentsCleaned.filter(r => r.success);
308
+ const failedCleanups = result.ephemeralAgentsCleaned.filter(r => !r.success);
309
+ if (successfulCleanups.length > 0) {
310
+ this.log(styles.success(` ${successfulCleanups.length} ephemeral agent(s) ${dryRun ? 'would be ' : ''}cleaned up`));
311
+ }
312
+ if (failedCleanups.length > 0) {
313
+ this.log(styles.warning(` ${failedCleanups.length} agent(s) skipped (unsaved work)`));
314
+ }
315
+ if (result.errors.length > 0) {
316
+ for (const err of result.errors) {
317
+ this.log(styles.error(` ${err}`));
318
+ }
319
+ }
320
+ this.log('');
321
+ }
322
+ finally {
323
+ db.close();
324
+ }
325
+ }
326
+ }
327
+ //# sourceMappingURL=prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../src/commands/session/prune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { PMOCommand } from '../../lib/pmo/index.js';
2
+ export default class ShortcutConnect extends PMOCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ check: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
+ disconnect: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ execute(): Promise<void>;
14
+ private handleCheck;
15
+ }
@@ -0,0 +1,210 @@
1
+ import { Flags } from '@oclif/core';
2
+ import inquirer from 'inquirer';
3
+ import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
4
+ import { colors } from '../../lib/colors.js';
5
+ import { shouldOutputJson, outputSuccessAsJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
6
+ import { isShortcutConfigured, loadShortcutConfig, saveShortcutApiToken, clearShortcutConfig, getShortcutApiToken, } from '../../lib/shortcut/index.js';
7
+ const SHORTCUT_API_URL = 'https://api.app.shortcut.com/api/v3';
8
+ async function verifyShortcutToken(apiToken, fetchImpl = fetch) {
9
+ const response = await fetchImpl(`${SHORTCUT_API_URL}/member`, {
10
+ method: 'GET',
11
+ headers: {
12
+ 'Content-Type': 'application/json',
13
+ 'Shortcut-Token': apiToken,
14
+ },
15
+ });
16
+ if (response.status === 401 || response.status === 403) {
17
+ throw new Error('Invalid or expired Shortcut API token.');
18
+ }
19
+ if (!response.ok) {
20
+ throw new Error(`Shortcut API request failed with status ${response.status}.`);
21
+ }
22
+ const data = await response.json();
23
+ return {
24
+ userName: data.profile?.name || 'Unknown',
25
+ email: data.profile?.email_address || '',
26
+ mentionName: data.profile?.mention_name || '',
27
+ };
28
+ }
29
+ export default class ShortcutConnect extends PMOCommand {
30
+ static description = 'Connect to Shortcut workspace and configure authentication';
31
+ static examples = [
32
+ '<%= config.bin %> <%= command.id %>',
33
+ '<%= config.bin %> <%= command.id %> --check',
34
+ '<%= config.bin %> <%= command.id %> --force',
35
+ '<%= config.bin %> <%= command.id %> --disconnect',
36
+ 'SHORTCUT_API_TOKEN=... <%= config.bin %> <%= command.id %>',
37
+ '<%= config.bin %> <%= command.id %> --json',
38
+ ];
39
+ static flags = {
40
+ ...pmoBaseFlags,
41
+ check: Flags.boolean({
42
+ description: 'Only check if Shortcut credentials are valid (do not prompt)',
43
+ default: false,
44
+ }),
45
+ force: Flags.boolean({
46
+ description: 'Force re-authentication even if credentials exist',
47
+ default: false,
48
+ }),
49
+ disconnect: Flags.boolean({
50
+ description: 'Remove stored Shortcut credentials and configuration',
51
+ default: false,
52
+ }),
53
+ };
54
+ async execute() {
55
+ const { flags } = await this.parse(ShortcutConnect);
56
+ const jsonMode = shouldOutputJson(flags);
57
+ const db = this.storage.getDatabase();
58
+ // Handle --disconnect
59
+ if (flags.disconnect) {
60
+ clearShortcutConfig(db);
61
+ if (jsonMode) {
62
+ outputSuccessAsJson({
63
+ disconnected: true,
64
+ message: 'Shortcut credentials and configuration removed.',
65
+ }, createMetadata('shortcut connect', flags));
66
+ return;
67
+ }
68
+ this.log(colors.success('Shortcut credentials and configuration removed.'));
69
+ return;
70
+ }
71
+ // Handle --check (health check)
72
+ if (flags.check) {
73
+ return this.handleCheck(flags, jsonMode, db);
74
+ }
75
+ // Check for existing config
76
+ const existingConfig = loadShortcutConfig(db);
77
+ if (existingConfig && !flags.force) {
78
+ try {
79
+ const info = await verifyShortcutToken(existingConfig.apiToken);
80
+ if (jsonMode) {
81
+ outputSuccessAsJson({
82
+ authenticated: true,
83
+ user: info.userName,
84
+ email: info.email,
85
+ mentionName: info.mentionName,
86
+ workspaceSlug: existingConfig.workspaceSlug ?? null,
87
+ message: 'Already connected. Use --force to re-authenticate.',
88
+ }, createMetadata('shortcut connect', flags));
89
+ return;
90
+ }
91
+ this.log(colors.success('Already connected to Shortcut'));
92
+ this.log(colors.textMuted(` User: ${info.userName} (${info.email})`));
93
+ if (existingConfig.workspaceSlug) {
94
+ this.log(colors.textMuted(` Workspace: ${existingConfig.workspaceSlug}`));
95
+ }
96
+ this.log('');
97
+ this.log(colors.textMuted('Use --force to re-authenticate.'));
98
+ return;
99
+ }
100
+ catch {
101
+ // Stored token is bad, proceed with re-auth
102
+ }
103
+ }
104
+ // Try environment variable first
105
+ let apiToken = getShortcutApiToken(db);
106
+ if (!apiToken) {
107
+ if (jsonMode) {
108
+ outputErrorAsJson('API_TOKEN_REQUIRED', 'Shortcut API token required. Set SHORTCUT_API_TOKEN or PRLT_SHORTCUT_API_TOKEN environment variable, or run interactively.', createMetadata('shortcut connect', flags));
109
+ this.exit(1);
110
+ }
111
+ this.log('');
112
+ this.log(colors.primary('Shortcut Authentication'));
113
+ this.log('');
114
+ this.log('Create an API token at:');
115
+ this.log(colors.textSecondary(' https://app.shortcut.com/settings/account/api-tokens'));
116
+ this.log('');
117
+ const { inputToken } = await inquirer.prompt([{
118
+ type: 'password',
119
+ name: 'inputToken',
120
+ message: 'Enter your Shortcut API token:',
121
+ mask: '*',
122
+ validate: (input) => {
123
+ if (!input.trim())
124
+ return 'API token is required';
125
+ return true;
126
+ },
127
+ }]);
128
+ apiToken = inputToken;
129
+ }
130
+ // Verify the API token
131
+ if (!jsonMode) {
132
+ this.log('');
133
+ this.log(colors.textMuted('Verifying API token...'));
134
+ }
135
+ try {
136
+ const info = await verifyShortcutToken(apiToken);
137
+ // Save API token
138
+ saveShortcutApiToken(db, apiToken);
139
+ if (!jsonMode) {
140
+ this.log(colors.success('Connected to Shortcut'));
141
+ this.log(colors.textMuted(` Signed in as ${info.userName} (${info.email})`));
142
+ }
143
+ if (jsonMode) {
144
+ outputSuccessAsJson({
145
+ authenticated: true,
146
+ user: info.userName,
147
+ email: info.email,
148
+ mentionName: info.mentionName,
149
+ }, createMetadata('shortcut connect', flags));
150
+ return;
151
+ }
152
+ this.log('');
153
+ this.log(colors.success('Shortcut integration configured!'));
154
+ this.log(colors.textMuted(' Run "prlt work shortcut" to pull stories and spawn agents'));
155
+ this.log(colors.textMuted(' Run "prlt work spawn --from shortcut" to use as default source'));
156
+ }
157
+ catch (error) {
158
+ const message = `Authentication failed: ${error instanceof Error ? error.message : String(error)}`;
159
+ if (jsonMode) {
160
+ outputErrorAsJson('SHORTCUT_CONNECT_FAILED', message, createMetadata('shortcut connect', flags));
161
+ this.exit(1);
162
+ }
163
+ this.error(message);
164
+ }
165
+ }
166
+ async handleCheck(flags, jsonMode, db) {
167
+ if (!isShortcutConfigured(db)) {
168
+ if (jsonMode) {
169
+ outputErrorAsJson('SHORTCUT_NOT_CONFIGURED', 'Shortcut is not configured. Run "prlt shortcut connect" to authenticate.', createMetadata('shortcut connect', flags));
170
+ this.exit(1);
171
+ }
172
+ this.log(colors.warning('Shortcut is not configured.'));
173
+ this.log(colors.textMuted('Run "prlt shortcut connect" to authenticate.'));
174
+ this.exit(1);
175
+ return;
176
+ }
177
+ const config = loadShortcutConfig(db);
178
+ try {
179
+ const info = await verifyShortcutToken(config.apiToken);
180
+ if (jsonMode) {
181
+ outputSuccessAsJson({
182
+ authenticated: true,
183
+ connected: true,
184
+ user: info.userName,
185
+ email: info.email,
186
+ mentionName: info.mentionName,
187
+ workspaceSlug: config.workspaceSlug ?? null,
188
+ }, createMetadata('shortcut connect', flags));
189
+ return;
190
+ }
191
+ this.log(colors.success('Shortcut connection is active'));
192
+ this.log(colors.textMuted(` User: ${info.userName} (${info.email})`));
193
+ if (config.workspaceSlug) {
194
+ this.log(colors.textMuted(` Workspace: ${config.workspaceSlug}`));
195
+ }
196
+ }
197
+ catch (error) {
198
+ const message = error instanceof Error ? error.message : String(error);
199
+ if (jsonMode) {
200
+ outputErrorAsJson('SHORTCUT_AUTH_INVALID', `Stored Shortcut API token is invalid or expired: ${message}`, createMetadata('shortcut connect', flags));
201
+ this.exit(1);
202
+ }
203
+ this.log(colors.error('Stored Shortcut API token is invalid or expired.'));
204
+ this.log(colors.textMuted(` Error: ${message}`));
205
+ this.log(colors.textMuted('Run "prlt shortcut connect --force" to re-authenticate.'));
206
+ this.exit(1);
207
+ }
208
+ }
209
+ }
210
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/commands/shortcut/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * prlt stop <agent> — stop an agent
3
+ *
4
+ * Sends SIGTERM and kills the tmux session.
5
+ * Works without HQ / PMO.
6
+ */
7
+ import { PromptCommand } from '../lib/prompt-command.js';
8
+ export default class Stop extends PromptCommand {
9
+ static description: string;
10
+ static examples: string[];
11
+ static args: {
12
+ agent: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
13
+ };
14
+ static flags: {
15
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
+ };
18
+ run(): Promise<void>;
19
+ }