@proletariat/cli 0.3.105 → 0.3.109

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 (227) hide show
  1. package/dist/commands/agent/cleanup.js +13 -1
  2. package/dist/commands/agent/cleanup.js.map +1 -1
  3. package/dist/commands/claude/index.js +2 -2
  4. package/dist/commands/claude/index.js.map +1 -1
  5. package/dist/commands/feedback/list.js +4 -9
  6. package/dist/commands/feedback/list.js.map +1 -1
  7. package/dist/commands/feedback/submit.js +4 -9
  8. package/dist/commands/feedback/submit.js.map +1 -1
  9. package/dist/commands/feedback/view.js +4 -9
  10. package/dist/commands/feedback/view.js.map +1 -1
  11. package/dist/commands/gc.d.ts +1 -0
  12. package/dist/commands/gc.js +34 -1
  13. package/dist/commands/gc.js.map +1 -1
  14. package/dist/commands/notify/connect.d.ts +34 -0
  15. package/dist/commands/notify/connect.js +166 -0
  16. package/dist/commands/notify/connect.js.map +1 -0
  17. package/dist/commands/notify/disconnect.d.ts +16 -0
  18. package/dist/commands/notify/disconnect.js +45 -0
  19. package/dist/commands/notify/disconnect.js.map +1 -0
  20. package/dist/commands/notify/list.d.ts +15 -0
  21. package/dist/commands/notify/list.js +101 -0
  22. package/dist/commands/notify/list.js.map +1 -0
  23. package/dist/commands/notify/rules/add.d.ts +26 -0
  24. package/dist/commands/notify/rules/add.js +95 -0
  25. package/dist/commands/notify/rules/add.js.map +1 -0
  26. package/dist/commands/notify/rules/list.d.ts +14 -0
  27. package/dist/commands/notify/rules/list.js +82 -0
  28. package/dist/commands/notify/rules/list.js.map +1 -0
  29. package/dist/commands/notify/rules/remove.d.ts +16 -0
  30. package/dist/commands/notify/rules/remove.js +44 -0
  31. package/dist/commands/notify/rules/remove.js.map +1 -0
  32. package/dist/commands/notify/test.d.ts +16 -0
  33. package/dist/commands/notify/test.js +63 -0
  34. package/dist/commands/notify/test.js.map +1 -0
  35. package/dist/commands/orchestrate/index.js +11 -6
  36. package/dist/commands/orchestrate/index.js.map +1 -1
  37. package/dist/commands/orchestrate/machine.d.ts +29 -0
  38. package/dist/commands/orchestrate/machine.js +230 -0
  39. package/dist/commands/orchestrate/machine.js.map +1 -0
  40. package/dist/commands/pr/checks.js +4 -8
  41. package/dist/commands/pr/checks.js.map +1 -1
  42. package/dist/commands/pr/close.js +4 -8
  43. package/dist/commands/pr/close.js.map +1 -1
  44. package/dist/commands/pr/create.js +4 -8
  45. package/dist/commands/pr/create.js.map +1 -1
  46. package/dist/commands/pr/index.js +1 -1
  47. package/dist/commands/pr/index.js.map +1 -1
  48. package/dist/commands/pr/link.js +4 -8
  49. package/dist/commands/pr/link.js.map +1 -1
  50. package/dist/commands/pr/list.js +5 -9
  51. package/dist/commands/pr/list.js.map +1 -1
  52. package/dist/commands/pr/merge.d.ts +5 -0
  53. package/dist/commands/pr/merge.js +35 -11
  54. package/dist/commands/pr/merge.js.map +1 -1
  55. package/dist/commands/pr/status.js +5 -4
  56. package/dist/commands/pr/status.js.map +1 -1
  57. package/dist/commands/qa/index.js +2 -2
  58. package/dist/commands/qa/index.js.map +1 -1
  59. package/dist/commands/repo/create.js +4 -8
  60. package/dist/commands/repo/create.js.map +1 -1
  61. package/dist/commands/session/list.js +81 -41
  62. package/dist/commands/session/list.js.map +1 -1
  63. package/dist/commands/session/poke.d.ts +1 -11
  64. package/dist/commands/session/poke.js +20 -78
  65. package/dist/commands/session/poke.js.map +1 -1
  66. package/dist/commands/session/prune.js +3 -0
  67. package/dist/commands/session/prune.js.map +1 -1
  68. package/dist/commands/ticket/move.d.ts +12 -0
  69. package/dist/commands/ticket/move.js +75 -2
  70. package/dist/commands/ticket/move.js.map +1 -1
  71. package/dist/commands/work/drop.js +2 -2
  72. package/dist/commands/work/drop.js.map +1 -1
  73. package/dist/commands/work/ready.js +3 -3
  74. package/dist/commands/work/ready.js.map +1 -1
  75. package/dist/commands/work/rebase.js +4 -8
  76. package/dist/commands/work/rebase.js.map +1 -1
  77. package/dist/commands/work/run.d.ts +58 -0
  78. package/dist/commands/work/run.js +411 -0
  79. package/dist/commands/work/run.js.map +1 -0
  80. package/dist/commands/work/ship.d.ts +6 -0
  81. package/dist/commands/work/ship.js +93 -51
  82. package/dist/commands/work/ship.js.map +1 -1
  83. package/dist/commands/work/start.d.ts +1 -0
  84. package/dist/commands/work/start.js +126 -13
  85. package/dist/commands/work/start.js.map +1 -1
  86. package/dist/lib/agents/commands.d.ts +6 -0
  87. package/dist/lib/agents/commands.js +55 -2
  88. package/dist/lib/agents/commands.js.map +1 -1
  89. package/dist/lib/database/credential-store.js +2 -3
  90. package/dist/lib/database/credential-store.js.map +1 -1
  91. package/dist/lib/database/db-safety.d.ts +25 -0
  92. package/dist/lib/database/db-safety.js +35 -0
  93. package/dist/lib/database/db-safety.js.map +1 -1
  94. package/dist/lib/database/driver.js +6 -12
  95. package/dist/lib/database/driver.js.map +1 -1
  96. package/dist/lib/database/drizzle-schema.d.ts +3 -3
  97. package/dist/lib/database/drizzle.js +3 -3
  98. package/dist/lib/database/drizzle.js.map +1 -1
  99. package/dist/lib/database/index.d.ts +1 -1
  100. package/dist/lib/database/index.js +1 -1
  101. package/dist/lib/database/index.js.map +1 -1
  102. package/dist/lib/database/migrations/0021_notification_system.d.ts +2 -0
  103. package/dist/lib/database/migrations/0021_notification_system.js +39 -0
  104. package/dist/lib/database/migrations/0021_notification_system.js.map +1 -0
  105. package/dist/lib/database/migrations/0022_hook_mode_tiers.d.ts +11 -0
  106. package/dist/lib/database/migrations/0022_hook_mode_tiers.js +53 -0
  107. package/dist/lib/database/migrations/0022_hook_mode_tiers.js.map +1 -0
  108. package/dist/lib/database/migrations/index.js +4 -0
  109. package/dist/lib/database/migrations/index.js.map +1 -1
  110. package/dist/lib/database/pmo-bootstrap.js +6 -2
  111. package/dist/lib/database/pmo-bootstrap.js.map +1 -1
  112. package/dist/lib/database/workspace.js +5 -13
  113. package/dist/lib/database/workspace.js.map +1 -1
  114. package/dist/lib/events/emitting-runner.js +10 -0
  115. package/dist/lib/events/emitting-runner.js.map +1 -1
  116. package/dist/lib/execution/cc-version.d.ts +62 -0
  117. package/dist/lib/execution/cc-version.js +103 -0
  118. package/dist/lib/execution/cc-version.js.map +1 -0
  119. package/dist/lib/execution/devcontainer.js +2 -1
  120. package/dist/lib/execution/devcontainer.js.map +1 -1
  121. package/dist/lib/execution/runners/devcontainer.js +4 -1
  122. package/dist/lib/execution/runners/devcontainer.js.map +1 -1
  123. package/dist/lib/execution/runners/docker-management.js +10 -46
  124. package/dist/lib/execution/runners/docker-management.js.map +1 -1
  125. package/dist/lib/execution/runners/orchestrator.js +13 -39
  126. package/dist/lib/execution/runners/orchestrator.js.map +1 -1
  127. package/dist/lib/execution/session-utils.d.ts +88 -1
  128. package/dist/lib/execution/session-utils.js +120 -46
  129. package/dist/lib/execution/session-utils.js.map +1 -1
  130. package/dist/lib/execution/storage.js +20 -2
  131. package/dist/lib/execution/storage.js.map +1 -1
  132. package/dist/lib/flags/resolver.d.ts +8 -1
  133. package/dist/lib/flags/resolver.js +35 -2
  134. package/dist/lib/flags/resolver.js.map +1 -1
  135. package/dist/lib/gc/cascade.d.ts +99 -0
  136. package/dist/lib/gc/cascade.js +357 -0
  137. package/dist/lib/gc/cascade.js.map +1 -0
  138. package/dist/lib/gc/config.d.ts +69 -0
  139. package/dist/lib/gc/config.js +134 -0
  140. package/dist/lib/gc/config.js.map +1 -0
  141. package/dist/lib/gc/index.d.ts +36 -0
  142. package/dist/lib/gc/index.js +209 -1
  143. package/dist/lib/gc/index.js.map +1 -1
  144. package/dist/lib/init/index.js +10 -1
  145. package/dist/lib/init/index.js.map +1 -1
  146. package/dist/lib/machine-db.d.ts +144 -0
  147. package/dist/lib/machine-db.js +338 -0
  148. package/dist/lib/machine-db.js.map +1 -0
  149. package/dist/lib/machine-orchestrator.d.ts +35 -0
  150. package/dist/lib/machine-orchestrator.js +139 -0
  151. package/dist/lib/machine-orchestrator.js.map +1 -0
  152. package/dist/lib/notifications/dispatcher.d.ts +29 -0
  153. package/dist/lib/notifications/dispatcher.js +281 -0
  154. package/dist/lib/notifications/dispatcher.js.map +1 -0
  155. package/dist/lib/notifications/index.d.ts +13 -0
  156. package/dist/lib/notifications/index.js +18 -0
  157. package/dist/lib/notifications/index.js.map +1 -0
  158. package/dist/lib/notifications/manager.d.ts +46 -0
  159. package/dist/lib/notifications/manager.js +200 -0
  160. package/dist/lib/notifications/manager.js.map +1 -0
  161. package/dist/lib/notifications/storage.d.ts +60 -0
  162. package/dist/lib/notifications/storage.js +182 -0
  163. package/dist/lib/notifications/storage.js.map +1 -0
  164. package/dist/lib/notifications/types.d.ts +126 -0
  165. package/dist/lib/notifications/types.js +16 -0
  166. package/dist/lib/notifications/types.js.map +1 -0
  167. package/dist/lib/orchestrate/actions.js +182 -3
  168. package/dist/lib/orchestrate/actions.js.map +1 -1
  169. package/dist/lib/orchestrate/config-loader.js +9 -35
  170. package/dist/lib/orchestrate/config-loader.js.map +1 -1
  171. package/dist/lib/orchestrate/engine.d.ts +53 -1
  172. package/dist/lib/orchestrate/engine.js +74 -3
  173. package/dist/lib/orchestrate/engine.js.map +1 -1
  174. package/dist/lib/orchestrate/escalation.d.ts +87 -0
  175. package/dist/lib/orchestrate/escalation.js +63 -0
  176. package/dist/lib/orchestrate/escalation.js.map +1 -0
  177. package/dist/lib/orchestrate/index.d.ts +2 -0
  178. package/dist/lib/orchestrate/index.js +1 -0
  179. package/dist/lib/orchestrate/index.js.map +1 -1
  180. package/dist/lib/orchestrate/llm-agent.d.ts +101 -0
  181. package/dist/lib/orchestrate/llm-agent.js +295 -0
  182. package/dist/lib/orchestrate/llm-agent.js.map +1 -0
  183. package/dist/lib/orchestrate/presets.d.ts +4 -3
  184. package/dist/lib/orchestrate/presets.js +13 -8
  185. package/dist/lib/orchestrate/presets.js.map +1 -1
  186. package/dist/lib/orchestrate/types.d.ts +7 -1
  187. package/dist/lib/orchestrate/types.js +1 -0
  188. package/dist/lib/orchestrate/types.js.map +1 -1
  189. package/dist/lib/pmo/base-command.js +1 -1
  190. package/dist/lib/pmo/base-command.js.map +1 -1
  191. package/dist/lib/pmo/find-pmo.d.ts +8 -0
  192. package/dist/lib/pmo/find-pmo.js +63 -2
  193. package/dist/lib/pmo/find-pmo.js.map +1 -1
  194. package/dist/lib/pmo/index.d.ts +1 -1
  195. package/dist/lib/pmo/index.js +1 -1
  196. package/dist/lib/pmo/index.js.map +1 -1
  197. package/dist/lib/pmo/pmo-context.js +1 -1
  198. package/dist/lib/pmo/pmo-context.js.map +1 -1
  199. package/dist/lib/pmo/storage/index.js +2 -1
  200. package/dist/lib/pmo/storage/index.js.map +1 -1
  201. package/dist/lib/pr/index.d.ts +32 -0
  202. package/dist/lib/pr/index.js +45 -0
  203. package/dist/lib/pr/index.js.map +1 -1
  204. package/dist/lib/registry/index.js +0 -1
  205. package/dist/lib/registry/index.js.map +1 -1
  206. package/dist/lib/signal-handler.d.ts +8 -0
  207. package/dist/lib/signal-handler.js +33 -0
  208. package/dist/lib/signal-handler.js.map +1 -1
  209. package/dist/lib/themes.js +8 -1
  210. package/dist/lib/themes.js.map +1 -1
  211. package/dist/lib/work-lifecycle/container-cleanup-hook.d.ts +17 -7
  212. package/dist/lib/work-lifecycle/container-cleanup-hook.js +64 -11
  213. package/dist/lib/work-lifecycle/container-cleanup-hook.js.map +1 -1
  214. package/dist/lib/work-lifecycle/hooks/executor.d.ts +22 -2
  215. package/dist/lib/work-lifecycle/hooks/executor.js +46 -8
  216. package/dist/lib/work-lifecycle/hooks/executor.js.map +1 -1
  217. package/dist/lib/work-lifecycle/hooks/manager.d.ts +62 -3
  218. package/dist/lib/work-lifecycle/hooks/manager.js +285 -4
  219. package/dist/lib/work-lifecycle/hooks/manager.js.map +1 -1
  220. package/dist/lib/work-lifecycle/hooks/types.d.ts +36 -5
  221. package/dist/lib/work-lifecycle/hooks/types.js +1 -1
  222. package/dist/lib/work-lifecycle/hooks/types.js.map +1 -1
  223. package/dist/lib/workspace-resolution.d.ts +73 -0
  224. package/dist/lib/workspace-resolution.js +188 -0
  225. package/dist/lib/workspace-resolution.js.map +1 -0
  226. package/oclif.manifest.json +2830 -2142
  227. package/package.json +1 -1
@@ -0,0 +1,411 @@
1
+ /**
2
+ * work run — Ticketless work mode.
3
+ *
4
+ * Spawns an agent without a ticket or HQ workspace.
5
+ * Any directory, any repo, just a prompt.
6
+ *
7
+ * Two modes:
8
+ * Ephemeral (default): spawn, work, exit — like `docker run`
9
+ * Persistent (--keep-alive): long-lived named agent that accumulates
10
+ * context and responds to session pokes — like `docker run --name`
11
+ * with a restart policy. Survives terminal/HQ restarts.
12
+ *
13
+ * Workspace resolution (auto-detected):
14
+ * Git repo (default) → create worktree for isolation
15
+ * Git repo + --no-worktree → work in-place
16
+ * Non-git directory → work in-place (auto-detected)
17
+ * No --dir/--repo → create temp workspace (headless mode)
18
+ *
19
+ * Usage:
20
+ * prlt work run --prompt "refactor auth module"
21
+ * prlt work run --dir ~/Projects/other-repo --prompt "fix the auth bug"
22
+ * prlt work run --repo https://github.com/org/repo --prompt "add tests"
23
+ * prlt work run --name reviewer --keep-alive --prompt "you are the backend reviewer"
24
+ * prlt work run --prompt "analyze this CSV data" --dir ~/data/exports
25
+ * prlt work run --prompt "research best practices for X" # headless, no directory
26
+ */
27
+ import { Flags } from '@oclif/core';
28
+ import * as fs from 'node:fs';
29
+ import * as path from 'node:path';
30
+ import { execSync } from 'node:child_process';
31
+ import { PromptCommand } from '../../lib/prompt-command.js';
32
+ import { styles } from '../../lib/styles.js';
33
+ import { generateAgentName } from '../../lib/agent-naming.js';
34
+ import { MachineDB } from '../../lib/machine-db.js';
35
+ import { SessionStore } from '../../lib/session-store.js';
36
+ import { resolveWorkspace } from '../../lib/workspace-resolution.js';
37
+ import { DEFAULT_EXECUTION_CONFIG, } from '../../lib/execution/types.js';
38
+ import { runExecution } from '../../lib/execution/runners.js';
39
+ import { shouldOutputJson, outputErrorAsJson, createMetadata } from '../../lib/prompt-json.js';
40
+ export default class WorkRun extends PromptCommand {
41
+ static description = 'Run an agent without a ticket — ticketless work mode';
42
+ static examples = [
43
+ '<%= config.bin %> <%= command.id %> --prompt "refactor auth module"',
44
+ '<%= config.bin %> <%= command.id %> --dir ~/Projects/other-repo --prompt "fix the auth bug"',
45
+ '<%= config.bin %> <%= command.id %> --repo https://github.com/org/repo --prompt "add tests"',
46
+ '<%= config.bin %> <%= command.id %> --prompt "add unit tests" --create-pr',
47
+ '<%= config.bin %> <%= command.id %> --prompt "fix flaky test" --environment host',
48
+ '<%= config.bin %> <%= command.id %> --name reviewer --keep-alive --prompt "you are the backend reviewer"',
49
+ '<%= config.bin %> <%= command.id %> --prompt "analyze this CSV data" --dir ~/data/exports',
50
+ '<%= config.bin %> <%= command.id %> --prompt "research best practices for auth"',
51
+ '<%= config.bin %> <%= command.id %> --dir ~/Projects/myapp --no-worktree --prompt "fix tests"',
52
+ ];
53
+ static flags = {
54
+ prompt: Flags.string({
55
+ char: 'p',
56
+ description: 'Work prompt — what the agent should do',
57
+ required: true,
58
+ }),
59
+ dir: Flags.string({
60
+ char: 'd',
61
+ description: 'Working directory (auto-detects git vs non-git)',
62
+ }),
63
+ repo: Flags.string({
64
+ char: 'r',
65
+ description: 'Git repo URL to clone and work in',
66
+ }),
67
+ 'no-worktree': Flags.boolean({
68
+ description: 'Work in-place instead of creating a git worktree (for git repos)',
69
+ default: false,
70
+ }),
71
+ 'create-pr': Flags.boolean({
72
+ description: 'Create a PR when work is ready (no ticket linking)',
73
+ default: false,
74
+ }),
75
+ 'keep-alive': Flags.boolean({
76
+ char: 'k',
77
+ description: 'Persistent agent — survives restarts, accumulates context, responds to pokes',
78
+ default: false,
79
+ }),
80
+ environment: Flags.string({
81
+ char: 'e',
82
+ description: 'Execution environment',
83
+ options: ['host', 'sandbox', 'docker', 'devcontainer'],
84
+ default: 'host',
85
+ }),
86
+ executor: Flags.string({
87
+ description: 'AI executor to use',
88
+ options: ['claude-code', 'codex'],
89
+ default: 'claude-code',
90
+ }),
91
+ mode: Flags.string({
92
+ description: 'Display mode for agent output',
93
+ options: ['terminal', 'background', 'foreground'],
94
+ }),
95
+ name: Flags.string({
96
+ description: 'Agent name (required for --keep-alive, auto-generated otherwise)',
97
+ }),
98
+ json: Flags.boolean({
99
+ description: 'Output as JSON for AI agents/scripts',
100
+ default: false,
101
+ }),
102
+ machine: Flags.boolean({
103
+ char: 'm',
104
+ description: 'Output as JSON for AI agents/scripts',
105
+ default: false,
106
+ }),
107
+ };
108
+ async run() {
109
+ const { flags } = await this.parse(WorkRun);
110
+ const jsonMode = shouldOutputJson(flags);
111
+ const keepAlive = flags['keep-alive'];
112
+ // =========================================================================
113
+ // Validate persistent agent flags
114
+ // =========================================================================
115
+ if (keepAlive && !flags.name) {
116
+ const msg = '--keep-alive requires --name (persistent agents need a stable identity)';
117
+ if (jsonMode) {
118
+ outputErrorAsJson('INVALID_FLAGS', msg, createMetadata('work run', flags));
119
+ return;
120
+ }
121
+ this.error(msg);
122
+ }
123
+ // =========================================================================
124
+ // Resolve agent name (needed before workspace resolution for naming)
125
+ // =========================================================================
126
+ const agentName = flags.name || generateAgentName();
127
+ // =========================================================================
128
+ // Resolve workspace (auto-detects git vs non-git)
129
+ // =========================================================================
130
+ if (flags.dir && flags.repo) {
131
+ const msg = 'Cannot specify both --dir and --repo';
132
+ if (jsonMode) {
133
+ outputErrorAsJson('INVALID_FLAGS', msg, createMetadata('work run', flags));
134
+ return;
135
+ }
136
+ this.error(msg);
137
+ }
138
+ let workspace;
139
+ if (flags.repo) {
140
+ // --repo: clone into temp dir (special case, not auto-detected)
141
+ const cloneDir = this.cloneRepo(flags.repo);
142
+ workspace = {
143
+ workDir: cloneDir,
144
+ sourceDir: cloneDir,
145
+ isGitRepo: true,
146
+ branch: this.getCurrentBranch(cloneDir),
147
+ mode: 'in-place',
148
+ isTemp: true,
149
+ };
150
+ }
151
+ else if (flags.dir) {
152
+ const resolvedDir = path.resolve(flags.dir);
153
+ if (!fs.existsSync(resolvedDir)) {
154
+ const msg = `Directory does not exist: ${resolvedDir}`;
155
+ if (jsonMode) {
156
+ outputErrorAsJson('DIR_NOT_FOUND', msg, createMetadata('work run', flags));
157
+ return;
158
+ }
159
+ this.error(msg);
160
+ }
161
+ workspace = resolveWorkspace({
162
+ dir: resolvedDir,
163
+ agentName,
164
+ noWorktree: flags['no-worktree'],
165
+ });
166
+ }
167
+ else {
168
+ // No --dir, no --repo: use cwd if it's a git repo, otherwise headless
169
+ const cwd = process.cwd();
170
+ const cwdIsGit = this.isGitRepo(cwd);
171
+ if (cwdIsGit) {
172
+ workspace = resolveWorkspace({
173
+ dir: cwd,
174
+ agentName,
175
+ noWorktree: flags['no-worktree'],
176
+ });
177
+ }
178
+ else {
179
+ // Non-git cwd or truly headless
180
+ workspace = resolveWorkspace({
181
+ dir: cwd,
182
+ agentName,
183
+ });
184
+ }
185
+ }
186
+ const workDir = workspace.workDir;
187
+ const environment = flags.environment;
188
+ const executor = flags.executor;
189
+ // Persistent agents default to background mode (long-lived, reattach later)
190
+ const displayMode = (flags.mode || (keepAlive ? 'background' : 'foreground'));
191
+ const machineDb = new MachineDB();
192
+ try {
193
+ // =====================================================================
194
+ // Check for existing persistent agent (restart/reattach)
195
+ // =====================================================================
196
+ if (keepAlive) {
197
+ const existing = machineDb.getPersistentAgent(agentName);
198
+ if (existing && (existing.status === 'running' || existing.status === 'starting')) {
199
+ // Agent is already running — tell user to attach
200
+ if (jsonMode) {
201
+ this.log(JSON.stringify({
202
+ success: true,
203
+ executionId: existing.id,
204
+ agentName,
205
+ sessionId: existing.sessionId,
206
+ containerId: existing.containerId,
207
+ repoPath: existing.repoPath,
208
+ persistent: true,
209
+ alreadyRunning: true,
210
+ }));
211
+ }
212
+ else {
213
+ this.log('');
214
+ this.log(styles.success(`Persistent agent "${agentName}" is already running (${existing.id})`));
215
+ if (existing.sessionId) {
216
+ this.log(styles.muted(`Attach: prlt session attach ${existing.sessionId}`));
217
+ this.log(styles.muted(`Poke: prlt session poke ${existing.sessionId} "your message"`));
218
+ }
219
+ this.log('');
220
+ }
221
+ return;
222
+ }
223
+ // Existing persistent agent is stopped/failed — restart it
224
+ if (existing && !jsonMode) {
225
+ this.log(styles.muted(`Restarting persistent agent "${agentName}" (previous: ${existing.id}, status: ${existing.status})`));
226
+ }
227
+ }
228
+ if (!jsonMode) {
229
+ this.log('');
230
+ this.log(styles.header(keepAlive ? 'Persistent Agent' : 'Ticketless Work'));
231
+ this.log(styles.muted(`Agent: ${agentName}${keepAlive ? ' (persistent)' : ''}`));
232
+ this.log(styles.muted(`Directory: ${workDir}`));
233
+ if (workspace.mode === 'worktree') {
234
+ this.log(styles.muted(`Source: ${workspace.sourceDir} (worktree for isolation)`));
235
+ }
236
+ else if (workspace.mode === 'headless') {
237
+ this.log(styles.muted(`Mode: headless (temp workspace for research/thinking)`));
238
+ }
239
+ else if (!workspace.isGitRepo) {
240
+ this.log(styles.muted(`Mode: in-place (non-git directory)`));
241
+ }
242
+ this.log(styles.muted(`Prompt: ${flags.prompt.substring(0, 80)}${flags.prompt.length > 80 ? '...' : ''}`));
243
+ this.log('');
244
+ }
245
+ // =====================================================================
246
+ // Create execution record in machine DB
247
+ // =====================================================================
248
+ const execution = machineDb.createExecution({
249
+ prompt: flags.prompt,
250
+ repoPath: workDir,
251
+ agentName,
252
+ executor,
253
+ environment,
254
+ createPr: flags['create-pr'],
255
+ persistent: keepAlive,
256
+ cleanupPolicy: keepAlive ? 'persistent' : 'on-exit',
257
+ });
258
+ if (!jsonMode) {
259
+ this.log(styles.muted(`Execution: ${execution.id}`));
260
+ }
261
+ // =====================================================================
262
+ // Build execution context (no ticket, just prompt)
263
+ // =====================================================================
264
+ const context = {
265
+ ticketId: execution.id,
266
+ ticketTitle: flags.prompt.substring(0, 60),
267
+ ticketDescription: flags.prompt,
268
+ agentName,
269
+ agentDir: workDir,
270
+ worktreePath: workDir,
271
+ branch: workspace.branch || 'main',
272
+ createPR: flags['create-pr'],
273
+ actionId: 'run',
274
+ actionName: 'Run',
275
+ actionPrompt: flags.prompt,
276
+ modifiesCode: workspace.isGitRepo && !keepAlive, // Non-git or persistent = no code mods expected
277
+ executionEnvironment: environment,
278
+ isEphemeral: !keepAlive,
279
+ };
280
+ // =====================================================================
281
+ // Launch execution
282
+ // =====================================================================
283
+ if (!jsonMode) {
284
+ this.log(styles.muted('Starting agent...'));
285
+ }
286
+ const result = await runExecution(environment, context, executor, DEFAULT_EXECUTION_CONFIG, {
287
+ displayMode,
288
+ sessionManager: environment === 'devcontainer' ? 'tmux' : undefined,
289
+ });
290
+ if (result.success) {
291
+ machineDb.updateStatus(execution.id, 'running');
292
+ machineDb.updateProcessInfo(execution.id, {
293
+ containerId: result.containerId,
294
+ sessionId: result.sessionId,
295
+ });
296
+ // Track in global session store
297
+ try {
298
+ const sessionStore = new SessionStore();
299
+ sessionStore.create({
300
+ agentName,
301
+ runner: executor,
302
+ task: flags.prompt.substring(0, 200),
303
+ workdir: workDir,
304
+ sessionName: result.sessionId || `${execution.id}-${agentName}`,
305
+ environment: environment === 'docker' || environment === 'devcontainer' ? 'docker' : 'host',
306
+ permissionMode: 'danger',
307
+ });
308
+ sessionStore.close();
309
+ }
310
+ catch {
311
+ // Non-fatal
312
+ }
313
+ if (jsonMode) {
314
+ this.log(JSON.stringify({
315
+ success: true,
316
+ executionId: execution.id,
317
+ agentName,
318
+ sessionId: result.sessionId,
319
+ containerId: result.containerId,
320
+ repoPath: workDir,
321
+ prompt: flags.prompt,
322
+ persistent: keepAlive,
323
+ workspaceMode: workspace.mode,
324
+ isGitRepo: workspace.isGitRepo,
325
+ }));
326
+ }
327
+ else {
328
+ this.log('');
329
+ this.log(styles.success(`Agent ${agentName} started (${execution.id})`));
330
+ if (keepAlive) {
331
+ this.log(styles.muted('Mode: persistent (survives restarts, reattach anytime)'));
332
+ }
333
+ if (result.sessionId) {
334
+ this.log(styles.muted(`Session: ${result.sessionId}`));
335
+ this.log(styles.muted(`Attach: prlt session attach ${result.sessionId}`));
336
+ if (keepAlive) {
337
+ this.log(styles.muted(`Poke: prlt session poke ${result.sessionId} "your message"`));
338
+ }
339
+ }
340
+ this.log('');
341
+ }
342
+ }
343
+ else {
344
+ machineDb.updateStatus(execution.id, 'failed', undefined, result.error);
345
+ if (jsonMode) {
346
+ this.log(JSON.stringify({
347
+ success: false,
348
+ executionId: execution.id,
349
+ error: result.error,
350
+ }));
351
+ }
352
+ else {
353
+ this.log(styles.error(`Failed to start agent: ${result.error}`));
354
+ }
355
+ }
356
+ }
357
+ finally {
358
+ machineDb.close();
359
+ }
360
+ }
361
+ /**
362
+ * Check if a directory is a git repository.
363
+ */
364
+ isGitRepo(dir) {
365
+ try {
366
+ execSync('git rev-parse --git-dir', {
367
+ cwd: dir,
368
+ stdio: ['pipe', 'pipe', 'pipe'],
369
+ });
370
+ return true;
371
+ }
372
+ catch {
373
+ return false;
374
+ }
375
+ }
376
+ /**
377
+ * Clone a git repo into a temp directory and return the path.
378
+ */
379
+ cloneRepo(repoUrl) {
380
+ // Extract repo name from URL for directory naming
381
+ const repoName = repoUrl.split('/').pop()?.replace(/\.git$/, '') || 'repo';
382
+ const tmpDir = path.join(process.env.TMPDIR || '/tmp', `prlt-run-${repoName}-${Date.now()}`);
383
+ try {
384
+ this.log(styles.muted(`Cloning ${repoUrl}...`));
385
+ execSync(`git clone --depth 1 "${repoUrl}" "${tmpDir}"`, {
386
+ stdio: 'pipe',
387
+ timeout: 120_000,
388
+ });
389
+ return tmpDir;
390
+ }
391
+ catch (error) {
392
+ throw new Error(`Failed to clone repository: ${repoUrl}\n${error.message}`);
393
+ }
394
+ }
395
+ /**
396
+ * Get the current git branch for a directory, or null if not a git repo.
397
+ */
398
+ getCurrentBranch(dir) {
399
+ try {
400
+ return execSync('git rev-parse --abbrev-ref HEAD', {
401
+ cwd: dir,
402
+ encoding: 'utf-8',
403
+ stdio: ['pipe', 'pipe', 'pipe'],
404
+ }).trim();
405
+ }
406
+ catch {
407
+ return null;
408
+ }
409
+ }
410
+ }
411
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/work/run.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,12 @@ export default class WorkShip extends PMOCommand {
44
44
  * Tries: devcontainer repo dirs, execution worktree, agent dirs.
45
45
  */
46
46
  private resolveWorktreePath;
47
+ /**
48
+ * Resolve a repo-level cwd for gh CLI commands.
49
+ * gh needs to run inside a git repo to determine the GitHub repository.
50
+ * Tries: devcontainer/execution worktree, then workspace repositories.
51
+ */
52
+ private resolveRepoCwd;
47
53
  /**
48
54
  * Ship all currently-green PRs, or watch all open PRs when --when-green is set.
49
55
  */