@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.
- package/dist/commands/work/linear.js +29 -10
- package/dist/commands/work/linear.js.map +1 -1
- package/dist/commands/work/start.js +154 -110
- package/dist/commands/work/start.js.map +1 -1
- package/dist/lib/database/drizzle-schema.d.ts +148 -0
- package/dist/lib/database/drizzle-schema.js +20 -0
- package/dist/lib/database/drizzle-schema.js.map +1 -1
- package/dist/lib/database/index.d.ts +1 -1
- package/dist/lib/database/index.js +9 -107
- package/dist/lib/database/index.js.map +1 -1
- package/dist/lib/database/migrations/0001_baseline.d.ts +9 -0
- package/dist/lib/database/migrations/0001_baseline.js +18 -0
- package/dist/lib/database/migrations/0001_baseline.js.map +1 -0
- package/dist/lib/database/migrations/index.d.ts +12 -0
- package/dist/lib/database/migrations/index.js +15 -0
- package/dist/lib/database/migrations/index.js.map +1 -0
- package/dist/lib/database/migrator.d.ts +27 -0
- package/dist/lib/database/migrator.js +42 -0
- package/dist/lib/database/migrator.js.map +1 -0
- package/dist/lib/database/workspace-schema.d.ts +7 -0
- package/dist/lib/database/workspace-schema.js +109 -0
- package/dist/lib/database/workspace-schema.js.map +1 -0
- package/dist/lib/events/events.d.ts +5 -0
- package/dist/lib/events/index.d.ts +1 -1
- package/dist/lib/events/index.js.map +1 -1
- package/dist/lib/execution/runners.js +7 -2
- package/dist/lib/execution/runners.js.map +1 -1
- package/dist/lib/external-issues/outbound-sync.d.ts +21 -16
- package/dist/lib/external-issues/outbound-sync.js +64 -49
- package/dist/lib/external-issues/outbound-sync.js.map +1 -1
- package/dist/lib/linear/mapper.d.ts +1 -1
- package/dist/lib/linear/mapper.js +26 -32
- package/dist/lib/linear/mapper.js.map +1 -1
- package/dist/lib/linear/types.d.ts +1 -1
- package/dist/lib/pmo/schema.d.ts +2 -0
- package/dist/lib/pmo/schema.js +24 -7
- package/dist/lib/pmo/schema.js.map +1 -1
- package/dist/lib/pmo/storage/base.js +31 -0
- package/dist/lib/pmo/storage/base.js.map +1 -1
- package/dist/lib/pmo/sync-manager.js +5 -1
- package/dist/lib/pmo/sync-manager.js.map +1 -1
- package/dist/lib/work-lifecycle/adapter.d.ts +34 -0
- package/dist/lib/work-lifecycle/adapter.js +103 -0
- package/dist/lib/work-lifecycle/adapter.js.map +1 -0
- package/dist/lib/work-lifecycle/events.d.ts +52 -0
- package/dist/lib/work-lifecycle/events.js +12 -0
- package/dist/lib/work-lifecycle/events.js.map +1 -0
- package/dist/lib/work-lifecycle/index.d.ts +9 -0
- package/dist/lib/work-lifecycle/index.js +9 -0
- package/dist/lib/work-lifecycle/index.js.map +1 -0
- package/oclif.manifest.json +4157 -4157
- 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
|
-
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EACL,UAAU,EACV,YAAY,EACZ,iBAAiB,GAElB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,gBAAgB,GACjB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,yBAAyB,GAE1B,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EACL,gBAAgB,EAChB,0BAA0B,EAC1B,6BAA6B,EAC7B,4BAA4B,EAC5B,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;
|
|
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
|
-
|
|
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
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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 (
|
|
1370
|
-
//
|
|
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
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
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
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
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
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
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
|
-
|
|
2187
|
-
|
|
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: '
|
|
2209
|
-
message: 'What would you like to do?',
|
|
2210
|
-
choices:
|
|
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 (
|
|
2217
|
+
if (dockerAction === 'cancel') {
|
|
2214
2218
|
db.close();
|
|
2215
2219
|
this.log(styles.muted('Cancelled.'));
|
|
2216
2220
|
return;
|
|
2217
2221
|
}
|
|
2218
|
-
|
|
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
|
|
2234
|
+
else {
|
|
2235
|
+
const hasApiKey = !!process.env.ANTHROPIC_API_KEY;
|
|
2229
2236
|
this.log('');
|
|
2230
|
-
this.log(styles.
|
|
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
|
-
//
|
|
2233
|
-
const
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
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
|
-
|
|
2247
|
-
|
|
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 '
|
|
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
|
-
|
|
2253
|
-
|
|
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
|
}
|