@proletariat/cli 0.3.89 → 0.3.91

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 (276) hide show
  1. package/dist/commands/agent/auth.js +2 -2
  2. package/dist/commands/agent/auth.js.map +1 -1
  3. package/dist/commands/agent/shell.js +3 -3
  4. package/dist/commands/agent/shell.js.map +1 -1
  5. package/dist/commands/branch/create.js +2 -2
  6. package/dist/commands/branch/create.js.map +1 -1
  7. package/dist/commands/claude/index.js +3 -3
  8. package/dist/commands/claude/index.js.map +1 -1
  9. package/dist/commands/claude/open.js +2 -2
  10. package/dist/commands/claude/open.js.map +1 -1
  11. package/dist/commands/config/index.js +65 -2
  12. package/dist/commands/config/index.js.map +1 -1
  13. package/dist/commands/db/repair.js +4 -4
  14. package/dist/commands/db/repair.js.map +1 -1
  15. package/dist/commands/docker/clean.js +2 -2
  16. package/dist/commands/docker/clean.js.map +1 -1
  17. package/dist/commands/docker/index.js +2 -2
  18. package/dist/commands/docker/index.js.map +1 -1
  19. package/dist/commands/docker/list.js +2 -2
  20. package/dist/commands/docker/list.js.map +1 -1
  21. package/dist/commands/docker/logs.js +2 -2
  22. package/dist/commands/docker/logs.js.map +1 -1
  23. package/dist/commands/docker/restart.js +2 -2
  24. package/dist/commands/docker/restart.js.map +1 -1
  25. package/dist/commands/docker/shell.js +2 -2
  26. package/dist/commands/docker/shell.js.map +1 -1
  27. package/dist/commands/docker/start.js +2 -2
  28. package/dist/commands/docker/start.js.map +1 -1
  29. package/dist/commands/docker/stop.js +2 -2
  30. package/dist/commands/docker/stop.js.map +1 -1
  31. package/dist/commands/docker/sync.js +2 -2
  32. package/dist/commands/docker/sync.js.map +1 -1
  33. package/dist/commands/execution/config.js.map +1 -1
  34. package/dist/commands/execution/list.js +2 -2
  35. package/dist/commands/execution/list.js.map +1 -1
  36. package/dist/commands/execution/logs.js +2 -2
  37. package/dist/commands/execution/logs.js.map +1 -1
  38. package/dist/commands/execution/stop.js +2 -2
  39. package/dist/commands/execution/stop.js.map +1 -1
  40. package/dist/commands/execution/view.js +2 -2
  41. package/dist/commands/execution/view.js.map +1 -1
  42. package/dist/commands/linear/connect.js.map +1 -1
  43. package/dist/commands/mcp-server.js +2 -2
  44. package/dist/commands/mcp-server.js.map +1 -1
  45. package/dist/commands/orchestrator/attach.js +2 -2
  46. package/dist/commands/orchestrator/attach.js.map +1 -1
  47. package/dist/commands/orchestrator/start.js +3 -3
  48. package/dist/commands/orchestrator/start.js.map +1 -1
  49. package/dist/commands/orchestrator/stop.js +2 -2
  50. package/dist/commands/orchestrator/stop.js.map +1 -1
  51. package/dist/commands/qa/index.js +3 -3
  52. package/dist/commands/qa/index.js.map +1 -1
  53. package/dist/commands/session/attach.js +3 -3
  54. package/dist/commands/session/attach.js.map +1 -1
  55. package/dist/commands/session/cleanup.js +2 -2
  56. package/dist/commands/session/cleanup.js.map +1 -1
  57. package/dist/commands/session/exec.js +2 -2
  58. package/dist/commands/session/exec.js.map +1 -1
  59. package/dist/commands/session/health.js +2 -2
  60. package/dist/commands/session/health.js.map +1 -1
  61. package/dist/commands/session/inspect.js +2 -2
  62. package/dist/commands/session/inspect.js.map +1 -1
  63. package/dist/commands/session/list.js +2 -2
  64. package/dist/commands/session/list.js.map +1 -1
  65. package/dist/commands/session/peek.js +3 -3
  66. package/dist/commands/session/peek.js.map +1 -1
  67. package/dist/commands/session/poke.js +2 -2
  68. package/dist/commands/session/poke.js.map +1 -1
  69. package/dist/commands/session/prune.js +2 -2
  70. package/dist/commands/session/prune.js.map +1 -1
  71. package/dist/commands/session/report.js +2 -2
  72. package/dist/commands/session/report.js.map +1 -1
  73. package/dist/commands/session/restart.js +2 -2
  74. package/dist/commands/session/restart.js.map +1 -1
  75. package/dist/commands/shortcut/connect.js.map +1 -1
  76. package/dist/commands/trello/configure.js.map +1 -1
  77. package/dist/commands/work/complete.js +2 -2
  78. package/dist/commands/work/complete.js.map +1 -1
  79. package/dist/commands/work/hooks/add.js +2 -2
  80. package/dist/commands/work/hooks/add.js.map +1 -1
  81. package/dist/commands/work/hooks/list.js +2 -2
  82. package/dist/commands/work/hooks/list.js.map +1 -1
  83. package/dist/commands/work/hooks/remove.js +2 -2
  84. package/dist/commands/work/hooks/remove.js.map +1 -1
  85. package/dist/commands/work/hooks/toggle.js +2 -2
  86. package/dist/commands/work/hooks/toggle.js.map +1 -1
  87. package/dist/commands/work/index.js +4 -0
  88. package/dist/commands/work/index.js.map +1 -1
  89. package/dist/commands/work/ready.js +2 -2
  90. package/dist/commands/work/ready.js.map +1 -1
  91. package/dist/commands/work/ship.d.ts +43 -0
  92. package/dist/commands/work/ship.js +587 -0
  93. package/dist/commands/work/ship.js.map +1 -0
  94. package/dist/commands/work/spawn.js +2 -2
  95. package/dist/commands/work/spawn.js.map +1 -1
  96. package/dist/commands/work/start.d.ts +1 -0
  97. package/dist/commands/work/start.js +36 -3
  98. package/dist/commands/work/start.js.map +1 -1
  99. package/dist/commands/work/stop.js +2 -2
  100. package/dist/commands/work/stop.js.map +1 -1
  101. package/dist/commands/work/watch.js +2 -2
  102. package/dist/commands/work/watch.js.map +1 -1
  103. package/dist/hooks/init.js +11 -15
  104. package/dist/hooks/init.js.map +1 -1
  105. package/dist/lib/agents/commands.js +18 -8
  106. package/dist/lib/agents/commands.js.map +1 -1
  107. package/dist/lib/agents/index.js +6 -0
  108. package/dist/lib/agents/index.js.map +1 -1
  109. package/dist/lib/asana/config.d.ts +8 -8
  110. package/dist/lib/asana/config.js.map +1 -1
  111. package/dist/lib/asana/mapper.d.ts +2 -2
  112. package/dist/lib/asana/mapper.js.map +1 -1
  113. package/dist/lib/container.d.ts +40 -0
  114. package/dist/lib/container.js +74 -0
  115. package/dist/lib/container.js.map +1 -0
  116. package/dist/lib/database/agents.js +4 -2
  117. package/dist/lib/database/agents.js.map +1 -1
  118. package/dist/lib/database/db-safety.d.ts +4 -4
  119. package/dist/lib/database/db-safety.js +6 -6
  120. package/dist/lib/database/db-safety.js.map +1 -1
  121. package/dist/lib/database/driver.d.ts +20 -21
  122. package/dist/lib/database/driver.js +24 -22
  123. package/dist/lib/database/driver.js.map +1 -1
  124. package/dist/lib/database/drizzle.d.ts +9 -9
  125. package/dist/lib/database/drizzle.js +9 -17
  126. package/dist/lib/database/drizzle.js.map +1 -1
  127. package/dist/lib/database/migrations/0001_baseline.js.map +1 -1
  128. package/dist/lib/database/migrations/0002_work_hooks.js.map +1 -1
  129. package/dist/lib/database/migrations/0003_actions_redesign.js.map +1 -1
  130. package/dist/lib/database/migrations/0004_workflow_rules.js.map +1 -1
  131. package/dist/lib/database/migrations/0005_provider_status_mapping.js.map +1 -1
  132. package/dist/lib/database/migrations/0006_drop_theme_names_used.js.map +1 -1
  133. package/dist/lib/database/migrations/0007_add_worktree_columns.js.map +1 -1
  134. package/dist/lib/database/migrations/0008_add_agent_mount_mode.js.map +1 -1
  135. package/dist/lib/database/migrations/0009_create_media_items.js.map +1 -1
  136. package/dist/lib/database/migrations/0010_add_ticket_position.js.map +1 -1
  137. package/dist/lib/database/migrations/0011_add_review_gate.js.map +1 -1
  138. package/dist/lib/database/migrations/0012_add_action_network_allowlist.js.map +1 -1
  139. package/dist/lib/database/migrator.d.ts +3 -3
  140. package/dist/lib/database/migrator.js.map +1 -1
  141. package/dist/lib/database/pmo-bootstrap.d.ts +2 -2
  142. package/dist/lib/database/pmo-bootstrap.js +4 -26
  143. package/dist/lib/database/pmo-bootstrap.js.map +1 -1
  144. package/dist/lib/database/repositories.js +1 -1
  145. package/dist/lib/database/repositories.js.map +1 -1
  146. package/dist/lib/database/settings-store.d.ts +3 -3
  147. package/dist/lib/database/settings-store.js +2 -2
  148. package/dist/lib/database/settings-store.js.map +1 -1
  149. package/dist/lib/database/sqlite.d.ts +155 -0
  150. package/dist/lib/database/sqlite.js +358 -0
  151. package/dist/lib/database/sqlite.js.map +1 -0
  152. package/dist/lib/database/themes.js +3 -3
  153. package/dist/lib/database/themes.js.map +1 -1
  154. package/dist/lib/database/workspace.d.ts +6 -4
  155. package/dist/lib/database/workspace.js +38 -46
  156. package/dist/lib/database/workspace.js.map +1 -1
  157. package/dist/lib/execution/config.d.ts +33 -33
  158. package/dist/lib/execution/config.js.map +1 -1
  159. package/dist/lib/execution/context.d.ts +20 -0
  160. package/dist/lib/execution/context.js +88 -0
  161. package/dist/lib/execution/context.js.map +1 -1
  162. package/dist/lib/execution/devcontainer.d.ts +9 -1
  163. package/dist/lib/execution/devcontainer.js +62 -40
  164. package/dist/lib/execution/devcontainer.js.map +1 -1
  165. package/dist/lib/execution/runners/devcontainer.js +11 -0
  166. package/dist/lib/execution/runners/devcontainer.js.map +1 -1
  167. package/dist/lib/execution/runners/docker-management.js +6 -1
  168. package/dist/lib/execution/runners/docker-management.js.map +1 -1
  169. package/dist/lib/execution/runners/orchestrator.js +6 -3
  170. package/dist/lib/execution/runners/orchestrator.js.map +1 -1
  171. package/dist/lib/execution/runners/prompt-builder.js +31 -0
  172. package/dist/lib/execution/runners/prompt-builder.js.map +1 -1
  173. package/dist/lib/execution/runners/shared.d.ts +2 -2
  174. package/dist/lib/execution/runners/shared.js +2 -2
  175. package/dist/lib/execution/runners/shared.js.map +1 -1
  176. package/dist/lib/execution/spawner.d.ts +3 -3
  177. package/dist/lib/execution/spawner.js +11 -0
  178. package/dist/lib/execution/spawner.js.map +1 -1
  179. package/dist/lib/execution/storage.d.ts +3 -3
  180. package/dist/lib/execution/storage.js.map +1 -1
  181. package/dist/lib/execution/types.d.ts +23 -0
  182. package/dist/lib/execution/types.js.map +1 -1
  183. package/dist/lib/external-issues/mapping-store.d.ts +2 -2
  184. package/dist/lib/external-issues/mapping-store.js.map +1 -1
  185. package/dist/lib/external-issues/outbound-sync.d.ts +3 -3
  186. package/dist/lib/external-issues/outbound-sync.js.map +1 -1
  187. package/dist/lib/init/index.js +6 -8
  188. package/dist/lib/init/index.js.map +1 -1
  189. package/dist/lib/jira/config.d.ts +5 -5
  190. package/dist/lib/jira/config.js.map +1 -1
  191. package/dist/lib/linear/config.d.ts +8 -8
  192. package/dist/lib/linear/config.js.map +1 -1
  193. package/dist/lib/linear/mapper.d.ts +2 -2
  194. package/dist/lib/linear/mapper.js.map +1 -1
  195. package/dist/lib/mcp/types.d.ts +2 -2
  196. package/dist/lib/monday/config.d.ts +9 -9
  197. package/dist/lib/monday/config.js.map +1 -1
  198. package/dist/lib/monday/mapper.d.ts +2 -2
  199. package/dist/lib/monday/mapper.js.map +1 -1
  200. package/dist/lib/pmo/diet.d.ts +3 -3
  201. package/dist/lib/pmo/diet.js.map +1 -1
  202. package/dist/lib/pmo/find-pmo.js +5 -8
  203. package/dist/lib/pmo/find-pmo.js.map +1 -1
  204. package/dist/lib/pmo/index.js +9 -7
  205. package/dist/lib/pmo/index.js.map +1 -1
  206. package/dist/lib/pmo/storage/base.d.ts +15 -15
  207. package/dist/lib/pmo/storage/base.js.map +1 -1
  208. package/dist/lib/pmo/storage/dependencies.js.map +1 -1
  209. package/dist/lib/pmo/storage/helpers.js.map +1 -1
  210. package/dist/lib/pmo/storage/index.d.ts +8 -2
  211. package/dist/lib/pmo/storage/index.js +10 -2
  212. package/dist/lib/pmo/storage/index.js.map +1 -1
  213. package/dist/lib/pmo/storage/projects.js.map +1 -1
  214. package/dist/lib/pmo/storage/roadmaps.js +4 -4
  215. package/dist/lib/pmo/storage/roadmaps.js.map +1 -1
  216. package/dist/lib/pmo/storage/specs.js.map +1 -1
  217. package/dist/lib/pmo/storage/statuses.js +1 -1
  218. package/dist/lib/pmo/storage/statuses.js.map +1 -1
  219. package/dist/lib/pmo/storage/tickets.js +1 -1
  220. package/dist/lib/pmo/storage/tickets.js.map +1 -1
  221. package/dist/lib/pmo/storage/types.d.ts +2 -2
  222. package/dist/lib/pmo/storage/views.js.map +1 -1
  223. package/dist/lib/pmo/sync-manager.js +12 -0
  224. package/dist/lib/pmo/sync-manager.js.map +1 -1
  225. package/dist/lib/providers/index.d.ts +2 -0
  226. package/dist/lib/providers/index.js +2 -0
  227. package/dist/lib/providers/index.js.map +1 -1
  228. package/dist/lib/providers/linear-provider.d.ts +2 -2
  229. package/dist/lib/providers/linear-provider.js.map +1 -1
  230. package/dist/lib/providers/resolver.d.ts +3 -3
  231. package/dist/lib/providers/resolver.js.map +1 -1
  232. package/dist/lib/providers/state-intents.d.ts +44 -0
  233. package/dist/lib/providers/state-intents.js +101 -0
  234. package/dist/lib/providers/state-intents.js.map +1 -0
  235. package/dist/lib/providers/state-resolution.d.ts +137 -0
  236. package/dist/lib/providers/state-resolution.js +302 -0
  237. package/dist/lib/providers/state-resolution.js.map +1 -0
  238. package/dist/lib/providers/status-mapping.d.ts +2 -2
  239. package/dist/lib/providers/status-mapping.js.map +1 -1
  240. package/dist/lib/providers/trigger-config.d.ts +4 -4
  241. package/dist/lib/providers/trigger-config.js.map +1 -1
  242. package/dist/lib/providers/types.d.ts +2 -1
  243. package/dist/lib/registry/index.js +4 -11
  244. package/dist/lib/registry/index.js.map +1 -1
  245. package/dist/lib/repos/index.js +3 -0
  246. package/dist/lib/repos/index.js.map +1 -1
  247. package/dist/lib/shortcut/config.d.ts +8 -8
  248. package/dist/lib/shortcut/config.js.map +1 -1
  249. package/dist/lib/trello/config.d.ts +10 -10
  250. package/dist/lib/trello/config.js.map +1 -1
  251. package/dist/lib/trello/mapper.d.ts +2 -2
  252. package/dist/lib/trello/mapper.js.map +1 -1
  253. package/dist/lib/work-lifecycle/action-chaining.d.ts +3 -3
  254. package/dist/lib/work-lifecycle/action-chaining.js.map +1 -1
  255. package/dist/lib/work-lifecycle/hooks/manager.d.ts +3 -3
  256. package/dist/lib/work-lifecycle/hooks/manager.js.map +1 -1
  257. package/dist/lib/work-lifecycle/hooks/storage.d.ts +3 -3
  258. package/dist/lib/work-lifecycle/hooks/storage.js.map +1 -1
  259. package/dist/lib/work-lifecycle/post-execution.d.ts +2 -2
  260. package/dist/lib/work-lifecycle/post-execution.js +47 -28
  261. package/dist/lib/work-lifecycle/post-execution.js.map +1 -1
  262. package/dist/lib/work-lifecycle/rule-evaluator.d.ts +3 -3
  263. package/dist/lib/work-lifecycle/rule-evaluator.js.map +1 -1
  264. package/dist/lib/work-source/config.d.ts +6 -6
  265. package/dist/lib/work-source/config.js.map +1 -1
  266. package/dist/lib/work-source/provider-sources.d.ts +12 -12
  267. package/dist/lib/work-source/provider-sources.js.map +1 -1
  268. package/dist/lib/workspace-config.d.ts +19 -0
  269. package/dist/lib/workspace-config.js +32 -0
  270. package/dist/lib/workspace-config.js.map +1 -1
  271. package/oclif.manifest.json +776 -661
  272. package/package.json +3 -4
  273. package/bin/validate-better-sqlite3.cjs +0 -129
  274. package/dist/lib/database/native-validation.d.ts +0 -40
  275. package/dist/lib/database/native-validation.js +0 -123
  276. package/dist/lib/database/native-validation.js.map +0 -1
@@ -0,0 +1,587 @@
1
+ import { Args, Flags } from '@oclif/core';
2
+ import * as path from 'node:path';
3
+ import * as fs from 'node:fs';
4
+ import { SqliteDatabase } from '../../lib/database/sqlite.js';
5
+ import { PMOCommand, pmoBaseFlags, autoExportToBoard } from '../../lib/pmo/index.js';
6
+ import { getWorkColumnSetting, findColumnByName } from '../../lib/pmo/utils.js';
7
+ import { styles } from '../../lib/styles.js';
8
+ import { getWorkspaceInfo } from '../../lib/agents/commands.js';
9
+ import { ExecutionStorage } from '../../lib/execution/storage.js';
10
+ import { isGHInstalled, isGHAuthenticated, getPRByNumber, getPRForBranch, getPRChecks, mergePR, getGitHubRepo, } from '../../lib/pr/index.js';
11
+ import { shouldOutputJson, outputErrorAsJson, outputSuccessAsJson, createMetadata, } from '../../lib/prompt-json.js';
12
+ import { getEventBus } from '../../lib/events/event-bus.js';
13
+ import { validateBranchName } from '../../lib/branch/index.js';
14
+ import { PMO_TABLES } from '../../lib/pmo/schema.js';
15
+ import { execSync } from 'node:child_process';
16
+ /**
17
+ * Sleep for the given number of milliseconds.
18
+ */
19
+ function sleep(ms) {
20
+ return new Promise(resolve => setTimeout(resolve, ms));
21
+ }
22
+ export default class WorkShip extends PMOCommand {
23
+ static description = 'Ship work: rebase, merge PR, and move ticket to Done';
24
+ static examples = [
25
+ '<%= config.bin %> <%= command.id %> TKT-001',
26
+ '<%= config.bin %> <%= command.id %> PRLT-1092',
27
+ '<%= config.bin %> <%= command.id %> --pr 929',
28
+ '<%= config.bin %> <%= command.id %> TKT-001 --dry-run',
29
+ '<%= config.bin %> <%= command.id %> TKT-001 --wait',
30
+ '<%= config.bin %> <%= command.id %> TKT-001 --no-rebase',
31
+ ];
32
+ static args = {
33
+ ticketId: Args.string({
34
+ description: 'Ticket ID - prompts with dropdown if not provided',
35
+ required: false,
36
+ }),
37
+ };
38
+ static flags = {
39
+ ...pmoBaseFlags,
40
+ pr: Flags.integer({
41
+ description: 'PR number to merge (alternative to ticket ID lookup)',
42
+ required: false,
43
+ }),
44
+ method: Flags.string({
45
+ description: 'Merge method',
46
+ options: ['merge', 'squash', 'rebase'],
47
+ default: 'squash',
48
+ }),
49
+ wait: Flags.boolean({
50
+ description: 'Wait for CI to go green before merging',
51
+ default: false,
52
+ }),
53
+ 'no-rebase': Flags.boolean({
54
+ description: 'Fail on conflicts instead of auto-rebasing',
55
+ default: false,
56
+ }),
57
+ 'dry-run': Flags.boolean({
58
+ description: 'Show what would happen without doing it',
59
+ default: false,
60
+ }),
61
+ 'delete-branch': Flags.boolean({
62
+ description: 'Delete remote branch after merging',
63
+ default: true,
64
+ allowNo: true,
65
+ }),
66
+ admin: Flags.boolean({
67
+ description: 'Use admin privileges to bypass branch protections',
68
+ default: false,
69
+ }),
70
+ };
71
+ async execute() {
72
+ const { args, flags } = await this.parse(WorkShip);
73
+ const projectId = flags.project;
74
+ const jsonMode = shouldOutputJson(flags);
75
+ const handleError = (code, message) => {
76
+ if (jsonMode) {
77
+ outputErrorAsJson(code, message, createMetadata('work ship', flags));
78
+ return;
79
+ }
80
+ this.error(message);
81
+ };
82
+ // Check gh CLI
83
+ if (!isGHInstalled()) {
84
+ return handleError('GH_NOT_INSTALLED', 'GitHub CLI (gh) is not installed. Install it from https://cli.github.com/');
85
+ }
86
+ if (!isGHAuthenticated()) {
87
+ return handleError('GH_NOT_AUTHENTICATED', 'GitHub CLI is not authenticated. Run "gh auth login" first.');
88
+ }
89
+ // Get workspace info
90
+ let workspaceInfo;
91
+ try {
92
+ workspaceInfo = getWorkspaceInfo();
93
+ }
94
+ catch {
95
+ return handleError('NOT_IN_WORKSPACE', 'Not in a workspace. Run "prlt new" first.');
96
+ }
97
+ const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
98
+ const db = new SqliteDatabase(dbPath);
99
+ const executionStorage = new ExecutionStorage(db);
100
+ try {
101
+ // --- Step 1: Resolve ticket and PR ---
102
+ let ticketId = args.ticketId;
103
+ let prNumber = flags.pr;
104
+ let ticket = null;
105
+ let prInfo = null;
106
+ if (prNumber) {
107
+ // PR number provided directly — find the PR, then resolve the ticket
108
+ prInfo = getPRByNumber(prNumber);
109
+ if (!prInfo) {
110
+ db.close();
111
+ return handleError('PR_NOT_FOUND', `PR #${prNumber} not found.`);
112
+ }
113
+ // Try to resolve the linked ticket
114
+ ticket = await this.resolveLinkedTicket(prNumber, prInfo.headBranch, projectId);
115
+ if (ticket) {
116
+ ticketId = ticket.id;
117
+ }
118
+ }
119
+ else {
120
+ // Resolve ticket first
121
+ if (!ticketId) {
122
+ // Prompt for ticket selection from shippable tickets (in review or in progress)
123
+ const allTickets = await this.storage.listTickets(projectId);
124
+ const shippableTickets = allTickets.filter(t => t.statusCategory === 'started' ||
125
+ (t.statusName && (t.statusName.toLowerCase().includes('progress') ||
126
+ t.statusName.toLowerCase().includes('review'))));
127
+ if (shippableTickets.length === 0) {
128
+ db.close();
129
+ if (jsonMode) {
130
+ outputErrorAsJson('NO_SHIPPABLE_WORK', 'No in-progress or in-review work found.', createMetadata('work ship', flags));
131
+ return;
132
+ }
133
+ this.log(styles.info('No in-progress or in-review work found.'));
134
+ return;
135
+ }
136
+ const selected = await this.selectFromList({
137
+ message: 'Select work to ship:',
138
+ items: shippableTickets,
139
+ getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
140
+ getValue: (t) => t.id,
141
+ getCommand: (t) => `prlt work ship ${t.id} --json`,
142
+ jsonMode: jsonMode ? { flags, commandName: 'work ship' } : null,
143
+ });
144
+ if (!selected) {
145
+ db.close();
146
+ return;
147
+ }
148
+ ticketId = selected;
149
+ }
150
+ // Get ticket
151
+ ticket = await this.storage.getTicket(ticketId);
152
+ if (!ticket) {
153
+ db.close();
154
+ return handleError('TICKET_NOT_FOUND', `Ticket "${ticketId}" not found.`);
155
+ }
156
+ ticketId = ticket.id;
157
+ // Find PR from ticket metadata or branch
158
+ prNumber = ticket.metadata?.pr_number ? parseInt(ticket.metadata.pr_number, 10) : undefined;
159
+ if (prNumber) {
160
+ prInfo = getPRByNumber(prNumber);
161
+ }
162
+ if (!prInfo) {
163
+ // Try to find PR from execution branch
164
+ const runningExecution = executionStorage.getRunningExecution(ticketId);
165
+ const branch = runningExecution?.branch || ticket.branch;
166
+ if (branch) {
167
+ prInfo = getPRForBranch(branch);
168
+ if (prInfo) {
169
+ prNumber = prInfo.number;
170
+ }
171
+ }
172
+ }
173
+ if (!prInfo || !prNumber) {
174
+ db.close();
175
+ return handleError('NO_PR_FOUND', `No pull request found for ticket "${ticketId}". Create one with "prlt work ready ${ticketId} --pr".`);
176
+ }
177
+ }
178
+ // Validate PR state
179
+ if (prInfo.state === 'MERGED') {
180
+ db.close();
181
+ if (jsonMode) {
182
+ outputSuccessAsJson({ alreadyMerged: true, prNumber, title: prInfo.title, ticketId: ticketId ?? null }, createMetadata('work ship', flags));
183
+ return;
184
+ }
185
+ this.log(styles.info(`PR #${prNumber} is already merged.`));
186
+ return;
187
+ }
188
+ if (prInfo.state === 'CLOSED') {
189
+ db.close();
190
+ return handleError('PR_CLOSED', `PR #${prNumber} is closed. Reopen it first.`);
191
+ }
192
+ // Resolve the working directory for git operations
193
+ const cwd = this.resolveWorktreePath(workspaceInfo, executionStorage, ticketId);
194
+ // --- Dry run summary ---
195
+ if (flags['dry-run']) {
196
+ this.log('');
197
+ this.log(styles.info('Dry run — no changes will be made:'));
198
+ this.log('');
199
+ this.log(styles.muted(` PR: #${prNumber} — ${prInfo.title}`));
200
+ this.log(styles.muted(` Branch: ${prInfo.headBranch} → ${prInfo.baseBranch}`));
201
+ this.log(styles.muted(` Method: ${flags.method}`));
202
+ if (ticketId) {
203
+ this.log(styles.muted(` Ticket: ${ticketId}${ticket ? ` — ${ticket.title}` : ''}`));
204
+ }
205
+ // Check CI
206
+ const checks = getPRChecks(prNumber, cwd);
207
+ if (checks.length > 0) {
208
+ const allPassed = checks.every(c => c.conclusion === 'SUCCESS' || c.conclusion === 'SKIPPED');
209
+ const pending = checks.filter(c => !c.conclusion || c.status === 'IN_PROGRESS' || c.status === 'QUEUED');
210
+ const failed = checks.filter(c => c.conclusion === 'FAILURE');
211
+ if (allPassed) {
212
+ this.log(styles.muted(` CI: All checks passed (${checks.length})`));
213
+ }
214
+ else if (pending.length > 0) {
215
+ this.log(styles.muted(` CI: ${pending.length} pending, ${failed.length} failed`));
216
+ }
217
+ else {
218
+ this.log(styles.muted(` CI: ${failed.length} failed`));
219
+ }
220
+ }
221
+ else {
222
+ this.log(styles.muted(` CI: No checks configured`));
223
+ }
224
+ // Check conflicts
225
+ const hasConflicts = this.checkMergeConflicts(prNumber, cwd);
226
+ this.log(styles.muted(` Conflicts: ${hasConflicts ? 'Yes — would rebase' : 'None'}`));
227
+ this.log('');
228
+ this.log(styles.muted(' Actions that would be taken:'));
229
+ if (hasConflicts && !flags['no-rebase']) {
230
+ this.log(styles.muted(' 1. Rebase onto base branch and force-push'));
231
+ this.log(styles.muted(' 2. Wait for CI to rerun'));
232
+ }
233
+ this.log(styles.muted(` ${hasConflicts && !flags['no-rebase'] ? '3' : '1'}. Squash merge PR #${prNumber}`));
234
+ if (ticketId) {
235
+ this.log(styles.muted(` ${hasConflicts && !flags['no-rebase'] ? '4' : '2'}. Move ticket ${ticketId} to Done`));
236
+ }
237
+ if (flags['delete-branch']) {
238
+ this.log(styles.muted(` ${hasConflicts && !flags['no-rebase'] ? '5' : '3'}. Delete remote branch ${prInfo.headBranch}`));
239
+ }
240
+ db.close();
241
+ return;
242
+ }
243
+ // --- Step 2: Check CI status ---
244
+ this.log('');
245
+ this.log(styles.info(`Shipping PR #${prNumber}: ${prInfo.title}`));
246
+ const ciResult = await this.waitForCI(prNumber, flags.wait, cwd);
247
+ if (!ciResult.passed) {
248
+ db.close();
249
+ return handleError('CI_FAILED', ciResult.message);
250
+ }
251
+ // --- Step 3: Check for merge conflicts and rebase if needed ---
252
+ const hasConflicts = this.checkMergeConflicts(prNumber, cwd);
253
+ if (hasConflicts) {
254
+ if (flags['no-rebase']) {
255
+ db.close();
256
+ return handleError('MERGE_CONFLICTS', `PR #${prNumber} has merge conflicts. Resolve them manually or run without --no-rebase to auto-rebase.`);
257
+ }
258
+ this.log(styles.muted(' Merge conflicts detected, rebasing...'));
259
+ const rebaseResult = this.rebaseOntoBase(prInfo.headBranch, prInfo.baseBranch, cwd);
260
+ if (!rebaseResult.success) {
261
+ db.close();
262
+ return handleError('REBASE_FAILED', `Rebase failed: ${rebaseResult.error}. Resolve conflicts manually.`);
263
+ }
264
+ this.log(styles.muted(' Rebased and force-pushed. Waiting for CI...'));
265
+ // Wait for CI to rerun after rebase
266
+ const postRebaseCI = await this.waitForCI(prNumber, true, cwd);
267
+ if (!postRebaseCI.passed) {
268
+ db.close();
269
+ return handleError('CI_FAILED_AFTER_REBASE', postRebaseCI.message);
270
+ }
271
+ }
272
+ // --- Step 4: Merge the PR ---
273
+ const method = flags.method;
274
+ this.log(styles.muted(` Merging PR #${prNumber} (${method})...`));
275
+ const mergeResult = mergePR(prNumber, {
276
+ method,
277
+ deleteBranch: flags['delete-branch'],
278
+ admin: flags.admin,
279
+ cwd,
280
+ });
281
+ if (!mergeResult.success) {
282
+ db.close();
283
+ return handleError('MERGE_FAILED', `Failed to merge PR #${prNumber}: ${mergeResult.error}`);
284
+ }
285
+ this.log(styles.success(` PR #${prNumber} merged`));
286
+ // --- Step 5: Move ticket to Done ---
287
+ let ticketMovedToDone = false;
288
+ let ticketTransitionProvider;
289
+ let previousColumn;
290
+ let doneColumn;
291
+ if (ticket && ticketId) {
292
+ // Update PR metadata
293
+ await this.storage.updateTicket(ticketId, {
294
+ metadata: {
295
+ ...ticket.metadata,
296
+ pr_state: 'MERGED',
297
+ merged_at: new Date().toISOString(),
298
+ },
299
+ });
300
+ try {
301
+ const targetColumnName = getWorkColumnSetting(db, 'done');
302
+ const board = ticket.projectId ? await this.storage.getProjectBoard(ticket.projectId) : null;
303
+ const columnNames = board ? board.columns.map(col => col.name) : [];
304
+ doneColumn = findColumnByName(columnNames, targetColumnName);
305
+ if (doneColumn && ticket.projectId) {
306
+ previousColumn = ticket.statusName;
307
+ await this.storage.moveTicket(ticket.projectId, ticketId, doneColumn);
308
+ ticketMovedToDone = true;
309
+ // Sync to external provider
310
+ try {
311
+ const provider = await this.resolveTicketProvider(ticketId, ticket.projectId);
312
+ if (provider.name !== 'pmo') {
313
+ const moveResult = await provider.moveTicket(ticketId, doneColumn);
314
+ if (moveResult.success) {
315
+ ticketTransitionProvider = moveResult.provider;
316
+ this.log(styles.muted(` Synced to ${moveResult.provider}: ${doneColumn}`));
317
+ }
318
+ }
319
+ }
320
+ catch {
321
+ // Non-fatal
322
+ }
323
+ }
324
+ }
325
+ catch (err) {
326
+ this.warn(`Failed to move ticket ${ticketId} to Done: ${err instanceof Error ? err.message : err}`);
327
+ }
328
+ // Auto-export board
329
+ await autoExportToBoard(this.pmoPath, this.storage);
330
+ // Mark execution as completed
331
+ const runningExecution = executionStorage.getRunningExecution(ticketId);
332
+ if (runningExecution) {
333
+ executionStorage.updateStatus(runningExecution.id, 'completed');
334
+ this.log(styles.muted(` Execution ${runningExecution.id} marked as completed`));
335
+ }
336
+ }
337
+ // --- Step 6: Emit event ---
338
+ if (ticketId) {
339
+ try {
340
+ const repo = getGitHubRepo(cwd);
341
+ const prUrl = repo ? `https://github.com/${repo}/pull/${prNumber}` : null;
342
+ getEventBus().emit('work:pr_merged', {
343
+ workItemId: ticketId,
344
+ source: 'github',
345
+ prNumber,
346
+ prTitle: prInfo.title,
347
+ prUrl,
348
+ mergeMethod: method,
349
+ timestamp: new Date(),
350
+ });
351
+ }
352
+ catch {
353
+ // Non-critical
354
+ }
355
+ }
356
+ db.close();
357
+ // --- Output ---
358
+ if (jsonMode) {
359
+ outputSuccessAsJson({
360
+ shipped: true,
361
+ prNumber,
362
+ prTitle: prInfo.title,
363
+ method,
364
+ branchDeleted: flags['delete-branch'],
365
+ ticketId: ticketId ?? null,
366
+ ticketMovedToDone,
367
+ ticketTransitionProvider: ticketTransitionProvider ?? null,
368
+ }, createMetadata('work ship', flags));
369
+ return;
370
+ }
371
+ this.log('');
372
+ this.log(styles.success(`Shipped: ${ticketId ?? `PR #${prNumber}`}`));
373
+ this.log(styles.muted(` PR: #${prNumber} — ${prInfo.title}`));
374
+ this.log(styles.muted(` Method: ${method}`));
375
+ if (flags['delete-branch']) {
376
+ this.log(styles.muted(` Branch: ${prInfo.headBranch} deleted`));
377
+ }
378
+ if (ticketMovedToDone && ticketId) {
379
+ this.log(styles.muted(` Ticket: ${ticketId} → ${doneColumn}`));
380
+ if (previousColumn) {
381
+ this.log(styles.muted(` From: ${previousColumn}`));
382
+ }
383
+ }
384
+ }
385
+ catch (error) {
386
+ db.close();
387
+ throw error;
388
+ }
389
+ }
390
+ /**
391
+ * Resolve the linked ticket for a PR.
392
+ */
393
+ async resolveLinkedTicket(prNumber, headBranch, projectId) {
394
+ // 1. Find by PR metadata on tickets
395
+ const allTickets = await this.storage.listTickets(projectId);
396
+ const byMetadata = allTickets.find(t => t.metadata?.pr_number === String(prNumber) ||
397
+ t.metadata?.pr_url?.endsWith(`/pull/${prNumber}`) ||
398
+ t.metadata?.pr_url?.endsWith(`/${prNumber}`));
399
+ if (byMetadata)
400
+ return byMetadata;
401
+ // 2. Look up from agent_work table by branch name
402
+ try {
403
+ const db = this.storage.getDatabase();
404
+ const row = db.prepare(`SELECT ticket_id FROM ${PMO_TABLES.agent_work} WHERE branch = ? LIMIT 1`).get(headBranch);
405
+ if (row?.ticket_id) {
406
+ const ticket = await this.storage.getTicket(row.ticket_id);
407
+ if (ticket)
408
+ return ticket;
409
+ }
410
+ }
411
+ catch {
412
+ // agent_work lookup failed
413
+ }
414
+ // 3. Parse ticket ID from branch name
415
+ const branchResult = validateBranchName(headBranch);
416
+ if (branchResult.valid && branchResult.parts?.ticketId) {
417
+ const branchTicketId = branchResult.parts.ticketId;
418
+ const directTicket = await this.storage.getTicket(branchTicketId);
419
+ if (directTicket)
420
+ return directTicket;
421
+ const byExternalKey = allTickets.find(t => t.metadata?.external_key === branchTicketId);
422
+ if (byExternalKey)
423
+ return byExternalKey;
424
+ }
425
+ return null;
426
+ }
427
+ /**
428
+ * Wait for CI checks to pass. Returns immediately if all passed.
429
+ * If --wait is set, polls until all complete. Otherwise warns on pending.
430
+ */
431
+ async waitForCI(prNumber, shouldWait, cwd) {
432
+ const maxAttempts = 120; // 30 minutes max (15s intervals)
433
+ let attempts = 0;
434
+ while (attempts < maxAttempts) {
435
+ const checks = getPRChecks(prNumber, cwd);
436
+ // No checks configured — pass through
437
+ if (checks.length === 0) {
438
+ this.log(styles.muted(' No CI checks configured'));
439
+ return { passed: true, message: '' };
440
+ }
441
+ const failed = checks.filter(c => c.conclusion === 'FAILURE');
442
+ const pending = checks.filter(c => !c.conclusion || c.status === 'IN_PROGRESS' || c.status === 'QUEUED');
443
+ const passed = checks.filter(c => c.conclusion === 'SUCCESS' || c.conclusion === 'SKIPPED');
444
+ // All done
445
+ if (pending.length === 0) {
446
+ if (failed.length > 0) {
447
+ const failedNames = failed.map(c => c.name).join(', ');
448
+ return {
449
+ passed: false,
450
+ message: `CI checks failed: ${failedNames}. Fix the failures before shipping.`,
451
+ };
452
+ }
453
+ this.log(styles.muted(` CI: ${passed.length} checks passed`));
454
+ return { passed: true, message: '' };
455
+ }
456
+ // Checks still running
457
+ if (!shouldWait) {
458
+ const pendingNames = pending.map(c => c.name).join(', ');
459
+ return {
460
+ passed: false,
461
+ message: `CI checks still running: ${pendingNames}. Use --wait to wait for them, or re-run after they complete.`,
462
+ };
463
+ }
464
+ // Wait and retry
465
+ if (attempts === 0) {
466
+ this.log(styles.muted(` Waiting for CI (${pending.length} pending)...`));
467
+ }
468
+ attempts++;
469
+ await sleep(15_000);
470
+ }
471
+ return {
472
+ passed: false,
473
+ message: 'Timed out waiting for CI checks (30 minutes). Check manually.',
474
+ };
475
+ }
476
+ /**
477
+ * Check if the PR has merge conflicts with the base branch.
478
+ */
479
+ checkMergeConflicts(prNumber, cwd) {
480
+ try {
481
+ const result = execSync(`gh pr view ${prNumber} --json mergeable -q .mergeable`, {
482
+ cwd,
483
+ encoding: 'utf-8',
484
+ stdio: ['pipe', 'pipe', 'pipe'],
485
+ }).trim();
486
+ return result === 'CONFLICTING';
487
+ }
488
+ catch {
489
+ // If we can't determine, assume no conflicts
490
+ return false;
491
+ }
492
+ }
493
+ /**
494
+ * Rebase the PR branch onto the base branch and force-push.
495
+ */
496
+ rebaseOntoBase(headBranch, baseBranch, cwd) {
497
+ try {
498
+ // Fetch latest from origin
499
+ execSync('git fetch origin', {
500
+ cwd,
501
+ stdio: ['pipe', 'pipe', 'pipe'],
502
+ });
503
+ // Check out the head branch
504
+ execSync(`git checkout ${headBranch}`, {
505
+ cwd,
506
+ stdio: ['pipe', 'pipe', 'pipe'],
507
+ });
508
+ // Rebase onto base
509
+ execSync(`git rebase origin/${baseBranch}`, {
510
+ cwd,
511
+ stdio: ['pipe', 'pipe', 'pipe'],
512
+ });
513
+ // Force-push
514
+ execSync(`git push --force-with-lease origin ${headBranch}`, {
515
+ cwd,
516
+ stdio: ['pipe', 'pipe', 'pipe'],
517
+ });
518
+ return { success: true };
519
+ }
520
+ catch (error) {
521
+ // Abort rebase on failure
522
+ try {
523
+ execSync('git rebase --abort', {
524
+ cwd,
525
+ stdio: ['pipe', 'pipe', 'pipe'],
526
+ });
527
+ }
528
+ catch {
529
+ // Ignore abort failures
530
+ }
531
+ return {
532
+ success: false,
533
+ error: error instanceof Error ? error.message : 'Unknown rebase error',
534
+ };
535
+ }
536
+ }
537
+ /**
538
+ * Resolve the working directory for git operations.
539
+ * Tries: devcontainer repo dirs, execution worktree, agent dirs.
540
+ */
541
+ resolveWorktreePath(workspaceInfo, executionStorage, ticketId) {
542
+ // In devcontainer, find repo directories
543
+ if (process.env.DEVCONTAINER === 'true') {
544
+ try {
545
+ const entries = fs.readdirSync('/workspace', { withFileTypes: true });
546
+ const repoDirs = entries.filter(e => e.isDirectory() && !e.name.startsWith('.') && e.name !== 'node_modules');
547
+ if (repoDirs.length > 0) {
548
+ return path.join('/workspace', repoDirs[0].name);
549
+ }
550
+ }
551
+ catch {
552
+ // Fall through
553
+ }
554
+ }
555
+ // Try execution record
556
+ if (ticketId) {
557
+ const execution = executionStorage.getRunningExecution(ticketId);
558
+ if (execution?.agentName) {
559
+ const agentRecord = workspaceInfo.agents.find(a => a.name === execution.agentName);
560
+ let agentDir;
561
+ if (agentRecord?.worktree_path) {
562
+ agentDir = path.join(workspaceInfo.path, agentRecord.worktree_path);
563
+ }
564
+ else if (agentRecord?.type === 'ephemeral') {
565
+ agentDir = path.join(workspaceInfo.path, 'agents', workspaceInfo.ephemeralAgentsDir, execution.agentName);
566
+ }
567
+ else if (agentRecord) {
568
+ agentDir = path.join(workspaceInfo.path, 'agents', workspaceInfo.persistentAgentsDir, execution.agentName);
569
+ }
570
+ if (agentDir && fs.existsSync(agentDir)) {
571
+ try {
572
+ const entries = fs.readdirSync(agentDir, { withFileTypes: true });
573
+ const repoDirs = entries.filter(e => e.isDirectory() && !e.name.startsWith('.') && e.name !== 'node_modules');
574
+ if (repoDirs.length > 0) {
575
+ return path.join(agentDir, repoDirs[0].name);
576
+ }
577
+ }
578
+ catch {
579
+ // Fall through
580
+ }
581
+ }
582
+ }
583
+ }
584
+ return undefined;
585
+ }
586
+ }
587
+ //# sourceMappingURL=ship.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship.js","sourceRoot":"","sources":["../../../src/commands/work/ship.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Flags } from '@oclif/core';
2
2
  import * as path from 'node:path';
3
- import Database from 'better-sqlite3';
3
+ import { SqliteDatabase } from '../../lib/database/sqlite.js';
4
4
  import { PMOCommand, pmoBaseFlags, autoExportToBoard } from '../../lib/pmo/index.js';
5
5
  import { styles } from '../../lib/styles.js';
6
6
  import { getWorkspaceInfo, getTicketTmuxSession, killTmuxSession } from '../../lib/agents/commands.js';
@@ -823,7 +823,7 @@ export default class WorkSpawn extends PMOCommand {
823
823
  }
824
824
  // Open database
825
825
  const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
826
- const db = new Database(dbPath);
826
+ const db = new SqliteDatabase(dbPath);
827
827
  try {
828
828
  // Get board to list available columns
829
829
  const board = await this.storage.getBoard(projectId);