@proletariat/cli 0.3.62 → 0.3.65

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 (52) hide show
  1. package/dist/commands/work/linear.js +29 -10
  2. package/dist/commands/work/linear.js.map +1 -1
  3. package/dist/commands/work/start.js +154 -110
  4. package/dist/commands/work/start.js.map +1 -1
  5. package/dist/lib/database/drizzle-schema.d.ts +148 -0
  6. package/dist/lib/database/drizzle-schema.js +20 -0
  7. package/dist/lib/database/drizzle-schema.js.map +1 -1
  8. package/dist/lib/database/index.d.ts +1 -1
  9. package/dist/lib/database/index.js +9 -107
  10. package/dist/lib/database/index.js.map +1 -1
  11. package/dist/lib/database/migrations/0001_baseline.d.ts +9 -0
  12. package/dist/lib/database/migrations/0001_baseline.js +18 -0
  13. package/dist/lib/database/migrations/0001_baseline.js.map +1 -0
  14. package/dist/lib/database/migrations/index.d.ts +12 -0
  15. package/dist/lib/database/migrations/index.js +15 -0
  16. package/dist/lib/database/migrations/index.js.map +1 -0
  17. package/dist/lib/database/migrator.d.ts +27 -0
  18. package/dist/lib/database/migrator.js +42 -0
  19. package/dist/lib/database/migrator.js.map +1 -0
  20. package/dist/lib/database/workspace-schema.d.ts +7 -0
  21. package/dist/lib/database/workspace-schema.js +109 -0
  22. package/dist/lib/database/workspace-schema.js.map +1 -0
  23. package/dist/lib/events/events.d.ts +5 -0
  24. package/dist/lib/events/index.d.ts +1 -1
  25. package/dist/lib/events/index.js.map +1 -1
  26. package/dist/lib/execution/runners.js +7 -2
  27. package/dist/lib/execution/runners.js.map +1 -1
  28. package/dist/lib/external-issues/outbound-sync.d.ts +21 -16
  29. package/dist/lib/external-issues/outbound-sync.js +64 -49
  30. package/dist/lib/external-issues/outbound-sync.js.map +1 -1
  31. package/dist/lib/linear/mapper.d.ts +1 -1
  32. package/dist/lib/linear/mapper.js +26 -32
  33. package/dist/lib/linear/mapper.js.map +1 -1
  34. package/dist/lib/linear/types.d.ts +1 -1
  35. package/dist/lib/pmo/schema.d.ts +2 -0
  36. package/dist/lib/pmo/schema.js +24 -7
  37. package/dist/lib/pmo/schema.js.map +1 -1
  38. package/dist/lib/pmo/storage/base.js +31 -0
  39. package/dist/lib/pmo/storage/base.js.map +1 -1
  40. package/dist/lib/pmo/sync-manager.js +5 -1
  41. package/dist/lib/pmo/sync-manager.js.map +1 -1
  42. package/dist/lib/work-lifecycle/adapter.d.ts +34 -0
  43. package/dist/lib/work-lifecycle/adapter.js +103 -0
  44. package/dist/lib/work-lifecycle/adapter.js.map +1 -0
  45. package/dist/lib/work-lifecycle/events.d.ts +52 -0
  46. package/dist/lib/work-lifecycle/events.js +12 -0
  47. package/dist/lib/work-lifecycle/events.js.map +1 -0
  48. package/dist/lib/work-lifecycle/index.d.ts +9 -0
  49. package/dist/lib/work-lifecycle/index.js +9 -0
  50. package/dist/lib/work-lifecycle/index.js.map +1 -0
  51. package/oclif.manifest.json +4157 -4157
  52. package/package.json +1 -1
@@ -4,6 +4,7 @@ import { shouldOutputJson, } from '../../lib/prompt-json.js';
4
4
  import { ExternalIssueAdapterError, } from '../../lib/external-issues/types.js';
5
5
  import { listLinearIssues, getLinearIssueByIdentifier, buildLinearIssueChoiceCommand, buildLinearTicketDescription, buildLinearMetadata, buildLinearSpawnContextMessage, } from '../../lib/external-issues/linear.js';
6
6
  import { getLinearApiKey, loadLinearConfig } from '../../lib/linear/index.js';
7
+ import { LinearMapper } from '../../lib/linear/mapper.js';
7
8
  function buildWorkStartArgs(options) {
8
9
  const args = [options.ticketId, '--project', options.projectId, '--ephemeral'];
9
10
  if (options.executor)
@@ -100,8 +101,9 @@ export default class WorkLinear extends PMOCommand {
100
101
  const existing = await this.findLinkedTicket(projectId, envelope);
101
102
  const description = buildLinearTicketDescription(envelope);
102
103
  const metadata = buildLinearMetadata(envelope);
104
+ let ticket;
103
105
  if (existing) {
104
- const updated = await this.storage.updateTicket(existing.id, {
106
+ ticket = await this.storage.updateTicket(existing.id, {
105
107
  title: envelope.title,
106
108
  description,
107
109
  priority: envelope.priority ?? undefined,
@@ -112,16 +114,33 @@ export default class WorkLinear extends PMOCommand {
112
114
  ...metadata,
113
115
  },
114
116
  });
115
- return updated;
116
117
  }
117
- return this.storage.createTicket(projectId, {
118
- title: envelope.title,
119
- description,
120
- priority: envelope.priority ?? undefined,
121
- category: envelope.category ?? undefined,
122
- labels: envelope.labels,
123
- metadata,
124
- });
118
+ else {
119
+ ticket = await this.storage.createTicket(projectId, {
120
+ title: envelope.title,
121
+ description,
122
+ priority: envelope.priority ?? undefined,
123
+ category: envelope.category ?? undefined,
124
+ labels: envelope.labels,
125
+ metadata,
126
+ });
127
+ }
128
+ // Create Linear mapping so OutboundSyncHandler can push status/PR changes back
129
+ const db = this.storage.getDatabase();
130
+ const mapper = new LinearMapper(db);
131
+ const existingMapping = mapper.getByTicketId(ticket.id);
132
+ if (!existingMapping) {
133
+ mapper.createMapping({
134
+ pmoTicketId: ticket.id,
135
+ linearIssueId: envelope.source.externalId,
136
+ linearIdentifier: envelope.source.externalKey,
137
+ linearTeamKey: envelope.projectKey,
138
+ linearUrl: envelope.source.url,
139
+ syncDirection: 'outbound',
140
+ createdAt: new Date(),
141
+ });
142
+ }
143
+ return ticket;
125
144
  }
126
145
  async execute() {
127
146
  const { flags } = await this.parse(WorkLinear);
@@ -1 +1 @@
1
- {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../../src/commands/work/linear.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../../src/commands/work/linear.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,7 @@ import { buildShortcutMetadata, buildShortcutSpawnContextMessage, buildShortcutT
25
25
  import { buildTrelloMetadata, buildTrelloSpawnContextMessage, buildTrelloTicketDescription, getTrelloCardById, } from '../../lib/external-issues/trello.js';
26
26
  import { resolveMirrorToPmo } from '../../lib/external-issues/work-start.js';
27
27
  import { getLinearApiKey, loadLinearConfig } from '../../lib/linear/config.js';
28
+ import { LinearMapper } from '../../lib/linear/mapper.js';
28
29
  import { ExternalIssueAdapterError } from '../../lib/external-issues/types.js';
29
30
  import { loadActiveWorkSource, saveActiveWorkSource, getConnectedIntegrations, } from '../../lib/work-source/index.js';
30
31
  import { pruneWorktrees, checkoutBranchSafe } from '../../lib/branch/index.js';
@@ -294,12 +295,13 @@ export default class WorkStart extends PMOCommand {
294
295
  && (external.key === envelope.source.externalKey || external.id === envelope.source.externalId);
295
296
  });
296
297
  }
297
- async createOrUpdateLinkedTicket(projectId, envelope) {
298
+ async createOrUpdateLinkedTicket(projectId, envelope, db) {
298
299
  const existing = await this.findLinkedTicketByEnvelope(projectId, envelope);
299
300
  const description = buildExternalTicketDescription(envelope);
300
301
  const metadata = buildExternalMetadata(envelope);
302
+ let ticket;
301
303
  if (existing) {
302
- return this.storage.updateTicket(existing.id, {
304
+ ticket = await this.storage.updateTicket(existing.id, {
303
305
  title: envelope.title,
304
306
  description,
305
307
  priority: envelope.priority ?? undefined,
@@ -311,14 +313,33 @@ export default class WorkStart extends PMOCommand {
311
313
  },
312
314
  });
313
315
  }
314
- return this.storage.createTicket(projectId, {
315
- title: envelope.title,
316
- description,
317
- priority: envelope.priority ?? undefined,
318
- category: envelope.category ?? undefined,
319
- labels: envelope.labels,
320
- metadata,
321
- });
316
+ else {
317
+ ticket = await this.storage.createTicket(projectId, {
318
+ title: envelope.title,
319
+ description,
320
+ priority: envelope.priority ?? undefined,
321
+ category: envelope.category ?? undefined,
322
+ labels: envelope.labels,
323
+ metadata,
324
+ });
325
+ }
326
+ // Create Linear mapping so OutboundSyncHandler can push status/PR changes back
327
+ if (envelope.source.name === 'linear') {
328
+ const mapper = new LinearMapper(db);
329
+ const existingMapping = mapper.getByTicketId(ticket.id);
330
+ if (!existingMapping) {
331
+ mapper.createMapping({
332
+ pmoTicketId: ticket.id,
333
+ linearIssueId: envelope.source.externalId,
334
+ linearIdentifier: envelope.source.externalKey,
335
+ linearTeamKey: envelope.projectKey,
336
+ linearUrl: envelope.source.url,
337
+ syncDirection: 'outbound',
338
+ createdAt: new Date(),
339
+ });
340
+ }
341
+ }
342
+ return ticket;
322
343
  }
323
344
  async fetchExternalIssue(source, key, db) {
324
345
  switch (source) {
@@ -534,7 +555,7 @@ export default class WorkStart extends PMOCommand {
534
555
  const existingLinkedTicket = await this.findLinkedTicketByEnvelope(projectId, envelope);
535
556
  let linkedTicket;
536
557
  if (mirrorToPmo) {
537
- linkedTicket = await this.createOrUpdateLinkedTicket(projectId, envelope);
558
+ linkedTicket = await this.createOrUpdateLinkedTicket(projectId, envelope, db);
538
559
  await autoExportToBoard(this.pmoPath, this.storage);
539
560
  }
540
561
  else {
@@ -1366,8 +1387,8 @@ export default class WorkStart extends PMOCommand {
1366
1387
  this.log('');
1367
1388
  this.log(styles.warning('Docker daemon is not running. Start Docker Desktop or use --run-on-host.'));
1368
1389
  this.log('');
1369
- if (jsonMode && flags.yes) {
1370
- // In JSON mode with --yes, auto-switch to host
1390
+ if (flags.yes || !process.stdout.isTTY) {
1391
+ // Non-interactive mode: auto-switch to host
1371
1392
  environment = 'host';
1372
1393
  this.log(styles.muted('Switched to host environment (Docker not running).'));
1373
1394
  }
@@ -1420,11 +1441,19 @@ export default class WorkStart extends PMOCommand {
1420
1441
  // Saved preference: OAuth — validate credentials exist
1421
1442
  const hasCredentials = dockerCredentialsExist();
1422
1443
  if (!hasCredentials) {
1423
- this.log('');
1424
- this.log(styles.warning('⚠️ Saved auth method is "oauth" but no OAuth credentials found.'));
1425
- this.log(styles.muted(' Run "' + this.config.bin + ' agent auth" to authenticate.'));
1426
- db.close();
1427
- return;
1444
+ if (flags.yes || !process.stdout.isTTY) {
1445
+ // Non-interactive mode: auto-fallback to host
1446
+ this.log(styles.warning('⚠️ Saved auth method is "oauth" but no OAuth credentials found.'));
1447
+ environment = 'host';
1448
+ this.log(styles.muted('Switched to host environment (OAuth credentials missing).'));
1449
+ }
1450
+ else {
1451
+ this.log('');
1452
+ this.log(styles.warning('⚠️ Saved auth method is "oauth" but no OAuth credentials found.'));
1453
+ this.log(styles.muted(' Run "' + this.config.bin + ' agent auth" to authenticate.'));
1454
+ db.close();
1455
+ return;
1456
+ }
1428
1457
  }
1429
1458
  // OAuth credentials valid — continue (useApiKey stays false)
1430
1459
  }
@@ -1437,9 +1466,10 @@ export default class WorkStart extends PMOCommand {
1437
1466
  }
1438
1467
  else {
1439
1468
  // No saved preference and no OAuth credentials — prompt user
1440
- // In JSON mode with --yes, continue anyway (agent can run /login)
1441
- if (jsonMode && flags.yes) {
1442
- // Continue without prompting - agent will need to handle auth
1469
+ if (flags.yes || !process.stdout.isTTY) {
1470
+ // Non-interactive mode: auto-fallback to host
1471
+ environment = 'host';
1472
+ this.log(styles.warning('⚠️ No OAuth credentials found. Switched to host environment.'));
1443
1473
  }
1444
1474
  else {
1445
1475
  this.log('');
@@ -2167,115 +2197,129 @@ export default class WorkStart extends PMOCommand {
2167
2197
  this.log('');
2168
2198
  this.log(styles.warning('Docker daemon is not running. Start Docker Desktop or use --run-on-host.'));
2169
2199
  this.log('');
2170
- const { dockerAction } = await this.prompt([
2171
- {
2172
- type: 'list',
2173
- name: 'dockerAction',
2174
- message: 'Docker is not running. What would you like to do?',
2175
- choices: [
2176
- { name: '💻 Run all agents on host instead (--run-on-host)', value: 'host', command: 'prlt work start --all --run-on-host --json' },
2177
- { name: '✗ Cancel', value: 'cancel', command: '' },
2178
- ],
2179
- },
2180
- ], batchJsonModeConfig);
2181
- if (dockerAction === 'cancel') {
2182
- db.close();
2183
- this.log(styles.muted('Cancelled.'));
2184
- return;
2200
+ if (!process.stdout.isTTY) {
2201
+ // Non-interactive mode: auto-switch to host
2202
+ flags['run-on-host'] = true;
2203
+ this.log(styles.muted('All agents will run on host (Docker not running).'));
2185
2204
  }
2186
- flags['run-on-host'] = true;
2187
- this.log(styles.muted('All agents will run on host.'));
2188
- }
2189
- if (!flags['run-on-host']) {
2190
- const hasCredentials = dockerCredentialsExist();
2191
- if (!hasCredentials) {
2192
- const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
2193
- this.log('');
2194
- this.log(styles.warning('⚠️ No Claude Code OAuth credentials found for Docker containers'));
2195
- this.log(styles.muted(' Agents need credentials to authenticate with Claude.'));
2196
- this.log('');
2197
- // Build choices based on available options
2198
- const batchAuthChoices = [
2199
- { name: `🔐 Run ${this.config.bin} agent auth now (recommended — uses Max subscription)`, value: 'auth', command: `${this.config.bin} agent auth` },
2200
- ];
2201
- if (hasApiKey) {
2202
- batchAuthChoices.push({ name: '🔑 Use ANTHROPIC_API_KEY (⚠️ uses API credits, not Max subscription)', value: 'apikey', command: '' });
2203
- }
2204
- batchAuthChoices.push({ name: '💻 Run all agents on host instead (--run-on-host)', value: 'host', command: 'prlt work start --all --run-on-host --json' }, { name: '✗ Cancel', value: 'cancel', command: '' });
2205
- const { authAction } = await this.prompt([
2205
+ else {
2206
+ const { dockerAction } = await this.prompt([
2206
2207
  {
2207
2208
  type: 'list',
2208
- name: 'authAction',
2209
- message: 'What would you like to do?',
2210
- choices: batchAuthChoices,
2209
+ name: 'dockerAction',
2210
+ message: 'Docker is not running. What would you like to do?',
2211
+ choices: [
2212
+ { name: '💻 Run all agents on host instead (--run-on-host)', value: 'host', command: 'prlt work start --all --run-on-host --json' },
2213
+ { name: '✗ Cancel', value: 'cancel', command: '' },
2214
+ ],
2211
2215
  },
2212
2216
  ], batchJsonModeConfig);
2213
- if (authAction === 'cancel') {
2217
+ if (dockerAction === 'cancel') {
2214
2218
  db.close();
2215
2219
  this.log(styles.muted('Cancelled.'));
2216
2220
  return;
2217
2221
  }
2218
- if (authAction === 'host') {
2222
+ flags['run-on-host'] = true;
2223
+ this.log(styles.muted('All agents will run on host.'));
2224
+ }
2225
+ }
2226
+ if (!flags['run-on-host']) {
2227
+ const hasCredentials = dockerCredentialsExist();
2228
+ if (!hasCredentials) {
2229
+ if (!process.stdout.isTTY) {
2230
+ // Non-interactive mode: auto-fallback to host
2231
+ this.log(styles.warning('⚠️ No OAuth credentials found. Switched to host environment.'));
2219
2232
  flags['run-on-host'] = true;
2220
- this.log(styles.muted('All agents will run on host.'));
2221
- }
2222
- else if (authAction === 'apikey') {
2223
- batchUseApiKey = true;
2224
- this.log(styles.warning('Using ANTHROPIC_API_KEY — this will consume API credits.'));
2225
- this.log(styles.muted(`Run "${this.config.bin} agent auth" to set up OAuth and use your Max subscription instead.`));
2226
- this.log('');
2227
2233
  }
2228
- else if (authAction === 'auth') {
2234
+ else {
2235
+ const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
2229
2236
  this.log('');
2230
- this.log(styles.primary(`Opening ${this.config.bin} agent auth in new tab...`));
2237
+ this.log(styles.warning('⚠️ No Claude Code OAuth credentials found for Docker containers'));
2238
+ this.log(styles.muted(' Agents need credentials to authenticate with Claude.'));
2231
2239
  this.log('');
2232
- // Open auth in a new terminal tab
2233
- const authCmd = `${process.argv[1]} agent auth`;
2234
- try {
2235
- execSync(`osascript -e '
2236
- tell application "iTerm"
2237
- tell current window
2238
- create tab with default profile
2239
- tell current session
2240
- write text "${authCmd}"
2241
- end tell
2242
- end tell
2243
- end tell
2244
- '`);
2240
+ // Build choices based on available options
2241
+ const batchAuthChoices = [
2242
+ { name: `🔐 Run ${this.config.bin} agent auth now (recommended — uses Max subscription)`, value: 'auth', command: `${this.config.bin} agent auth` },
2243
+ ];
2244
+ if (hasApiKey) {
2245
+ batchAuthChoices.push({ name: '🔑 Use ANTHROPIC_API_KEY (⚠️ uses API credits, not Max subscription)', value: 'apikey', command: '' });
2245
2246
  }
2246
- catch {
2247
- // Fallback: try Terminal.app
2247
+ batchAuthChoices.push({ name: '💻 Run all agents on host instead (--run-on-host)', value: 'host', command: 'prlt work start --all --run-on-host --json' }, { name: '✗ Cancel', value: 'cancel', command: '' });
2248
+ const { authAction } = await this.prompt([
2249
+ {
2250
+ type: 'list',
2251
+ name: 'authAction',
2252
+ message: 'What would you like to do?',
2253
+ choices: batchAuthChoices,
2254
+ },
2255
+ ], batchJsonModeConfig);
2256
+ if (authAction === 'cancel') {
2257
+ db.close();
2258
+ this.log(styles.muted('Cancelled.'));
2259
+ return;
2260
+ }
2261
+ if (authAction === 'host') {
2262
+ flags['run-on-host'] = true;
2263
+ this.log(styles.muted('All agents will run on host.'));
2264
+ }
2265
+ else if (authAction === 'apikey') {
2266
+ batchUseApiKey = true;
2267
+ this.log(styles.warning('Using ANTHROPIC_API_KEY — this will consume API credits.'));
2268
+ this.log(styles.muted(`Run "${this.config.bin} agent auth" to set up OAuth and use your Max subscription instead.`));
2269
+ this.log('');
2270
+ }
2271
+ else if (authAction === 'auth') {
2272
+ this.log('');
2273
+ this.log(styles.primary(`Opening ${this.config.bin} agent auth in new tab...`));
2274
+ this.log('');
2275
+ // Open auth in a new terminal tab
2276
+ const authCmd = `${process.argv[1]} agent auth`;
2248
2277
  try {
2249
- execSync(`osascript -e 'tell application "Terminal" to do script "${authCmd}"'`);
2278
+ execSync(`osascript -e '
2279
+ tell application "iTerm"
2280
+ tell current window
2281
+ create tab with default profile
2282
+ tell current session
2283
+ write text "${authCmd}"
2284
+ end tell
2285
+ end tell
2286
+ end tell
2287
+ '`);
2250
2288
  }
2251
2289
  catch {
2252
- this.log(styles.warning('Could not open new terminal tab.'));
2253
- this.log(styles.muted(`Please run manually: ${authCmd}`));
2290
+ // Fallback: try Terminal.app
2291
+ try {
2292
+ execSync(`osascript -e 'tell application "Terminal" to do script "${authCmd}"'`);
2293
+ }
2294
+ catch {
2295
+ this.log(styles.warning('Could not open new terminal tab.'));
2296
+ this.log(styles.muted(`Please run manually: ${authCmd}`));
2297
+ }
2298
+ }
2299
+ this.log(styles.muted('Complete the /login flow in the new tab, then press Enter here...'));
2300
+ this.log('');
2301
+ // Wait for user to complete auth
2302
+ await this.prompt([{
2303
+ type: 'input',
2304
+ name: 'done',
2305
+ message: 'Press Enter when authentication is complete:',
2306
+ }], batchJsonModeConfig);
2307
+ // Check if credentials now exist
2308
+ if (!dockerCredentialsExist()) {
2309
+ this.log('');
2310
+ this.log(styles.warning('Authentication did not complete. No credentials found.'));
2311
+ db.close();
2312
+ return;
2313
+ }
2314
+ const info = getDockerCredentialInfo();
2315
+ this.log('');
2316
+ this.log(styles.success('✓ Credentials configured'));
2317
+ if (info) {
2318
+ this.log(styles.muted(` Subscription: ${info.subscriptionType || 'unknown'}`));
2319
+ this.log(styles.muted(` Expires: ${info.expiresAt.toLocaleDateString()}`));
2254
2320
  }
2255
- }
2256
- this.log(styles.muted('Complete the /login flow in the new tab, then press Enter here...'));
2257
- this.log('');
2258
- // Wait for user to complete auth
2259
- await this.prompt([{
2260
- type: 'input',
2261
- name: 'done',
2262
- message: 'Press Enter when authentication is complete:',
2263
- }], batchJsonModeConfig);
2264
- // Check if credentials now exist
2265
- if (!dockerCredentialsExist()) {
2266
2321
  this.log('');
2267
- this.log(styles.warning('Authentication did not complete. No credentials found.'));
2268
- db.close();
2269
- return;
2270
- }
2271
- const info = getDockerCredentialInfo();
2272
- this.log('');
2273
- this.log(styles.success('✓ Credentials configured'));
2274
- if (info) {
2275
- this.log(styles.muted(` Subscription: ${info.subscriptionType || 'unknown'}`));
2276
- this.log(styles.muted(` Expires: ${info.expiresAt.toLocaleDateString()}`));
2277
2322
  }
2278
- this.log('');
2279
2323
  }
2280
2324
  }
2281
2325
  }