@proletariat/cli 0.3.58 → 0.3.60
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/{spec → dashboard}/index.d.ts +4 -4
- package/dist/commands/dashboard/index.js +117 -0
- package/dist/commands/dashboard/index.js.map +1 -0
- package/dist/commands/execution/config.js +5 -4
- package/dist/commands/execution/config.js.map +1 -1
- package/dist/commands/execution/stop.js +4 -2
- package/dist/commands/execution/stop.js.map +1 -1
- package/dist/commands/execution/view.js +3 -0
- package/dist/commands/execution/view.js.map +1 -1
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +40 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp-server.js +1 -2
- package/dist/commands/mcp-server.js.map +1 -1
- package/dist/commands/{spec/link/index.d.ts → session/exec.d.ts} +5 -3
- package/dist/commands/session/exec.js +205 -0
- package/dist/commands/session/exec.js.map +1 -0
- package/dist/commands/session/index.js +12 -0
- package/dist/commands/session/index.js.map +1 -1
- package/dist/commands/{spec/delete.d.ts → session/inspect.d.ts} +3 -3
- package/dist/commands/session/inspect.js +316 -0
- package/dist/commands/session/inspect.js.map +1 -0
- package/dist/commands/session/peek.d.ts +15 -0
- package/dist/commands/session/peek.js +141 -8
- package/dist/commands/session/peek.js.map +1 -1
- package/dist/commands/session/poke.d.ts +4 -1
- package/dist/commands/session/poke.js +175 -20
- package/dist/commands/session/poke.js.map +1 -1
- package/dist/commands/{spec/link/depends.d.ts → session/restart.d.ts} +6 -4
- package/dist/commands/session/restart.js +320 -0
- package/dist/commands/session/restart.js.map +1 -0
- package/dist/commands/ticket/list.d.ts +10 -0
- package/dist/commands/ticket/list.js +126 -1
- package/dist/commands/ticket/list.js.map +1 -1
- package/dist/commands/tools/add.d.ts +20 -0
- package/dist/commands/tools/add.js +129 -0
- package/dist/commands/tools/add.js.map +1 -0
- package/dist/commands/tools/check.d.ts +10 -0
- package/dist/commands/tools/check.js +75 -0
- package/dist/commands/tools/check.js.map +1 -0
- package/dist/commands/tools/detect.d.ts +11 -0
- package/dist/commands/tools/detect.js +107 -0
- package/dist/commands/tools/detect.js.map +1 -0
- package/dist/commands/tools/index.d.ts +11 -0
- package/dist/commands/tools/index.js +87 -0
- package/dist/commands/tools/index.js.map +1 -0
- package/dist/commands/tools/remove.d.ts +13 -0
- package/dist/commands/tools/remove.js +55 -0
- package/dist/commands/tools/remove.js.map +1 -0
- package/dist/commands/{spec/view.d.ts → trello/configure.d.ts} +6 -6
- package/dist/commands/trello/configure.js +259 -0
- package/dist/commands/trello/configure.js.map +1 -0
- package/dist/commands/{spec/plan.d.ts → trello/import.d.ts} +3 -5
- package/dist/commands/trello/import.js +241 -0
- package/dist/commands/trello/import.js.map +1 -0
- package/dist/commands/{spec/ticket.d.ts → trello/sync.d.ts} +5 -6
- package/dist/commands/trello/sync.js +190 -0
- package/dist/commands/trello/sync.js.map +1 -0
- package/dist/commands/work/start.d.ts +1 -0
- package/dist/commands/work/start.js +17 -39
- package/dist/commands/work/start.js.map +1 -1
- package/dist/lib/dashboard/data.d.ts +64 -0
- package/dist/lib/dashboard/data.js +259 -0
- package/dist/lib/dashboard/data.js.map +1 -0
- package/dist/lib/dashboard/html.d.ts +7 -0
- package/dist/lib/dashboard/html.js +682 -0
- package/dist/lib/dashboard/html.js.map +1 -0
- package/dist/lib/dashboard/server.d.ts +20 -0
- package/dist/lib/dashboard/server.js +114 -0
- package/dist/lib/dashboard/server.js.map +1 -0
- package/dist/lib/events/events.d.ts +26 -2
- package/dist/lib/events/events.js +3 -2
- package/dist/lib/events/events.js.map +1 -1
- package/dist/lib/execution/config.d.ts +8 -0
- package/dist/lib/execution/config.js +83 -4
- package/dist/lib/execution/config.js.map +1 -1
- package/dist/lib/execution/runners.d.ts +36 -3
- package/dist/lib/execution/runners.js +216 -35
- package/dist/lib/execution/runners.js.map +1 -1
- package/dist/lib/execution/spawner.d.ts +2 -0
- package/dist/lib/execution/spawner.js +22 -31
- package/dist/lib/execution/spawner.js.map +1 -1
- package/dist/lib/execution/types.d.ts +26 -5
- package/dist/lib/execution/types.js +24 -0
- package/dist/lib/execution/types.js.map +1 -1
- package/dist/lib/external-issues/adapters.d.ts +17 -0
- package/dist/lib/external-issues/adapters.js +88 -0
- package/dist/lib/external-issues/adapters.js.map +1 -1
- package/dist/lib/external-issues/index.d.ts +1 -0
- package/dist/lib/external-issues/index.js +2 -0
- package/dist/lib/external-issues/index.js.map +1 -1
- package/dist/lib/external-issues/mapping-store.js +1 -1
- package/dist/lib/external-issues/outbound-sync.d.ts +79 -0
- package/dist/lib/external-issues/outbound-sync.js +296 -0
- package/dist/lib/external-issues/outbound-sync.js.map +1 -0
- package/dist/lib/external-issues/trello.d.ts +80 -0
- package/dist/lib/external-issues/trello.js +266 -0
- package/dist/lib/external-issues/trello.js.map +1 -0
- package/dist/lib/external-issues/types.d.ts +3 -3
- package/dist/lib/external-issues/types.js +1 -1
- package/dist/lib/external-issues/types.js.map +1 -1
- package/dist/lib/linear/client.d.ts +4 -3
- package/dist/lib/linear/client.js +185 -122
- package/dist/lib/linear/client.js.map +1 -1
- package/dist/lib/mcp/tools/cli-passthrough.js +77 -0
- package/dist/lib/mcp/tools/cli-passthrough.js.map +1 -1
- package/dist/lib/mcp/tools/index.d.ts +0 -1
- package/dist/lib/mcp/tools/index.js +0 -1
- package/dist/lib/mcp/tools/index.js.map +1 -1
- package/dist/lib/onboarding/detect-tools.d.ts +15 -0
- package/dist/lib/onboarding/detect-tools.js +44 -0
- package/dist/lib/onboarding/detect-tools.js.map +1 -0
- package/dist/lib/onboarding/index.d.ts +2 -0
- package/dist/lib/onboarding/index.js +3 -0
- package/dist/lib/onboarding/index.js.map +1 -0
- package/dist/lib/onboarding/wizard.d.ts +25 -0
- package/dist/lib/onboarding/wizard.js +156 -0
- package/dist/lib/onboarding/wizard.js.map +1 -0
- package/dist/lib/pmo/schema.d.ts +2 -1
- package/dist/lib/pmo/schema.js +3 -1
- package/dist/lib/pmo/schema.js.map +1 -1
- package/dist/lib/pmo/storage/tickets.d.ts +8 -0
- package/dist/lib/pmo/storage/tickets.js +56 -2
- package/dist/lib/pmo/storage/tickets.js.map +1 -1
- package/dist/lib/pmo/sync-manager.js +3 -0
- package/dist/lib/pmo/sync-manager.js.map +1 -1
- package/dist/lib/runners/claude-code-runner.js +6 -0
- package/dist/lib/runners/claude-code-runner.js.map +1 -1
- package/dist/lib/tool-registry/detect.d.ts +20 -0
- package/dist/lib/tool-registry/detect.js +95 -0
- package/dist/lib/tool-registry/detect.js.map +1 -0
- package/dist/lib/tool-registry/index.d.ts +10 -0
- package/dist/lib/tool-registry/index.js +13 -0
- package/dist/lib/tool-registry/index.js.map +1 -0
- package/dist/lib/tool-registry/policy.d.ts +32 -0
- package/dist/lib/tool-registry/policy.js +97 -0
- package/dist/lib/tool-registry/policy.js.map +1 -0
- package/dist/lib/tool-registry/registry.d.ts +42 -0
- package/dist/lib/tool-registry/registry.js +120 -0
- package/dist/lib/tool-registry/registry.js.map +1 -0
- package/dist/lib/tool-registry/spawn.d.ts +50 -0
- package/dist/lib/tool-registry/spawn.js +103 -0
- package/dist/lib/tool-registry/spawn.js.map +1 -0
- package/dist/lib/tool-registry/types.d.ts +56 -0
- package/dist/lib/tool-registry/types.js +109 -0
- package/dist/lib/tool-registry/types.js.map +1 -0
- package/dist/lib/trello/client.d.ts +23 -0
- package/dist/lib/trello/client.js +114 -0
- package/dist/lib/trello/client.js.map +1 -0
- package/dist/lib/trello/config.d.ts +55 -0
- package/dist/lib/trello/config.js +127 -0
- package/dist/lib/trello/config.js.map +1 -0
- package/dist/lib/trello/index.d.ts +5 -0
- package/dist/lib/trello/index.js +5 -0
- package/dist/lib/trello/index.js.map +1 -0
- package/dist/lib/trello/mapper.d.ts +13 -0
- package/dist/lib/trello/mapper.js +71 -0
- package/dist/lib/trello/mapper.js.map +1 -0
- package/dist/lib/trello/sync.d.ts +13 -0
- package/dist/lib/trello/sync.js +38 -0
- package/dist/lib/trello/sync.js.map +1 -0
- package/dist/lib/trello/types.d.ts +53 -0
- package/dist/lib/trello/types.js +2 -0
- package/dist/lib/trello/types.js.map +1 -0
- package/dist/lib/work-source/client.js +17 -0
- package/dist/lib/work-source/client.js.map +1 -1
- package/dist/lib/work-source/config.d.ts +1 -1
- package/dist/lib/work-source/config.js +23 -1
- package/dist/lib/work-source/config.js.map +1 -1
- package/dist/lib/work-source/index.d.ts +1 -0
- package/dist/lib/work-source/index.js +1 -0
- package/dist/lib/work-source/index.js.map +1 -1
- package/dist/lib/work-source/provider-sources.d.ts +113 -0
- package/dist/lib/work-source/provider-sources.js +227 -0
- package/dist/lib/work-source/provider-sources.js.map +1 -0
- package/oclif.manifest.json +4368 -4364
- package/package.json +6 -2
- package/dist/commands/spec/create.d.ts +0 -20
- package/dist/commands/spec/create.js +0 -171
- package/dist/commands/spec/create.js.map +0 -1
- package/dist/commands/spec/delete.js +0 -112
- package/dist/commands/spec/delete.js.map +0 -1
- package/dist/commands/spec/edit.d.ts +0 -23
- package/dist/commands/spec/edit.js +0 -262
- package/dist/commands/spec/edit.js.map +0 -1
- package/dist/commands/spec/index.js +0 -88
- package/dist/commands/spec/index.js.map +0 -1
- package/dist/commands/spec/link/depends.js +0 -87
- package/dist/commands/spec/link/depends.js.map +0 -1
- package/dist/commands/spec/link/index.js +0 -93
- package/dist/commands/spec/link/index.js.map +0 -1
- package/dist/commands/spec/link/remove.d.ts +0 -18
- package/dist/commands/spec/link/remove.js +0 -91
- package/dist/commands/spec/link/remove.js.map +0 -1
- package/dist/commands/spec/list.d.ts +0 -14
- package/dist/commands/spec/list.js +0 -101
- package/dist/commands/spec/list.js.map +0 -1
- package/dist/commands/spec/plan.js +0 -102
- package/dist/commands/spec/plan.js.map +0 -1
- package/dist/commands/spec/ticket.js +0 -144
- package/dist/commands/spec/ticket.js.map +0 -1
- package/dist/commands/spec/view.js +0 -202
- package/dist/commands/spec/view.js.map +0 -1
- package/dist/lib/mcp/tools/spec.d.ts +0 -6
- package/dist/lib/mcp/tools/spec.js +0 -197
- package/dist/lib/mcp/tools/spec.js.map +0 -1
- package/dist/lib/pmo/spec-parser.d.ts +0 -25
- package/dist/lib/pmo/spec-parser.js +0 -206
- package/dist/lib/pmo/spec-parser.js.map +0 -1
- package/dist/lib/pmo/spec-types.d.ts +0 -43
- package/dist/lib/pmo/spec-types.js +0 -8
- package/dist/lib/pmo/spec-types.js.map +0 -1
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
-
export default class
|
|
2
|
+
export default class TrelloSyncCommand extends PMOCommand {
|
|
3
3
|
static description: string;
|
|
4
4
|
static examples: string[];
|
|
5
|
-
static args: {
|
|
6
|
-
ticketId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
-
specId: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
8
|
-
};
|
|
9
5
|
static flags: {
|
|
10
6
|
ticket: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
-
|
|
7
|
+
card: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
list: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
'create-missing': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
11
|
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
12
|
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
13
|
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
|
+
import { colors } from '../../lib/colors.js';
|
|
4
|
+
import { shouldOutputJson, outputSuccessAsJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
5
|
+
import { TrelloClient, TrelloMapper, TrelloSync, isTrelloConfigured, loadTrelloConfig, } from '../../lib/trello/index.js';
|
|
6
|
+
export default class TrelloSyncCommand extends PMOCommand {
|
|
7
|
+
static description = 'Sync PMO tickets to Trello cards';
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> <%= command.id %> --ticket TKT-001 --card abc123',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> --ticket TKT-001 --create-missing',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --dry-run',
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
...pmoBaseFlags,
|
|
15
|
+
ticket: Flags.string({
|
|
16
|
+
description: 'PMO ticket ID to sync (syncs all mapped tickets if omitted)',
|
|
17
|
+
}),
|
|
18
|
+
card: Flags.string({
|
|
19
|
+
description: 'Trello card ID to map to --ticket',
|
|
20
|
+
}),
|
|
21
|
+
list: Flags.string({
|
|
22
|
+
description: 'Trello list ID used with --create-missing',
|
|
23
|
+
}),
|
|
24
|
+
'create-missing': Flags.boolean({
|
|
25
|
+
description: 'Create Trello card when no mapping exists (requires list)',
|
|
26
|
+
default: false,
|
|
27
|
+
}),
|
|
28
|
+
'dry-run': Flags.boolean({
|
|
29
|
+
description: 'Preview sync operations without making changes',
|
|
30
|
+
default: false,
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
async execute() {
|
|
34
|
+
const { flags } = await this.parse(TrelloSyncCommand);
|
|
35
|
+
const jsonMode = shouldOutputJson(flags);
|
|
36
|
+
const db = this.storage.getDatabase();
|
|
37
|
+
if (!isTrelloConfigured(db)) {
|
|
38
|
+
if (jsonMode) {
|
|
39
|
+
outputErrorAsJson('TRELLO_NOT_CONFIGURED', 'Trello is not configured. Run "prlt trello configure" first.', createMetadata('trello sync', flags));
|
|
40
|
+
this.exit(1);
|
|
41
|
+
}
|
|
42
|
+
this.error('Trello is not configured. Run "prlt trello configure" first.');
|
|
43
|
+
}
|
|
44
|
+
const config = loadTrelloConfig(db);
|
|
45
|
+
const client = new TrelloClient(config.apiKey, config.apiToken);
|
|
46
|
+
const mapper = new TrelloMapper(db);
|
|
47
|
+
const sync = new TrelloSync(client, mapper);
|
|
48
|
+
if (flags.ticket) {
|
|
49
|
+
const ticket = await this.storage.getTicket(flags.ticket);
|
|
50
|
+
if (!ticket) {
|
|
51
|
+
if (jsonMode) {
|
|
52
|
+
outputErrorAsJson('TICKET_NOT_FOUND', `Ticket ${flags.ticket} not found.`, createMetadata('trello sync', flags));
|
|
53
|
+
this.exit(1);
|
|
54
|
+
}
|
|
55
|
+
this.error(`Ticket ${flags.ticket} not found.`);
|
|
56
|
+
}
|
|
57
|
+
if (flags.card) {
|
|
58
|
+
mapper.createOrUpdateMapping(flags.ticket, flags.card, config.boardId);
|
|
59
|
+
}
|
|
60
|
+
const mapping = mapper.getByTicketId(flags.ticket);
|
|
61
|
+
if (!mapping) {
|
|
62
|
+
if (!flags['create-missing']) {
|
|
63
|
+
if (jsonMode) {
|
|
64
|
+
outputSuccessAsJson({
|
|
65
|
+
synced: false,
|
|
66
|
+
message: `Ticket ${flags.ticket} has no Trello mapping. Use --card or --create-missing.`,
|
|
67
|
+
}, createMetadata('trello sync', flags));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
this.log(colors.warning(`Ticket ${flags.ticket} has no Trello mapping. Use --card or --create-missing.`));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const listId = flags.list;
|
|
74
|
+
if (!listId) {
|
|
75
|
+
if (jsonMode) {
|
|
76
|
+
outputErrorAsJson('TRELLO_LIST_REQUIRED', 'List ID is required for --create-missing. Use --list.', createMetadata('trello sync', flags));
|
|
77
|
+
this.exit(1);
|
|
78
|
+
}
|
|
79
|
+
this.error('List ID is required for --create-missing. Use --list.');
|
|
80
|
+
}
|
|
81
|
+
if (flags['dry-run']) {
|
|
82
|
+
if (jsonMode) {
|
|
83
|
+
outputSuccessAsJson({
|
|
84
|
+
dryRun: true,
|
|
85
|
+
action: 'create-and-sync',
|
|
86
|
+
ticketId: flags.ticket,
|
|
87
|
+
listId,
|
|
88
|
+
}, createMetadata('trello sync', flags));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
this.log(colors.textMuted(`Would create Trello card in list ${listId} for ${flags.ticket}`));
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const cardId = await sync.createCardForTicket(ticket, listId, config.boardId);
|
|
95
|
+
await sync.syncTicket(ticket, cardId);
|
|
96
|
+
if (jsonMode) {
|
|
97
|
+
outputSuccessAsJson({
|
|
98
|
+
action: 'create-and-sync',
|
|
99
|
+
ticketId: flags.ticket,
|
|
100
|
+
trelloCardId: cardId,
|
|
101
|
+
synced: true,
|
|
102
|
+
}, createMetadata('trello sync', flags));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.log(colors.success(`Created and synced Trello card ${cardId} for ${flags.ticket}`));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (flags['dry-run']) {
|
|
109
|
+
if (jsonMode) {
|
|
110
|
+
outputSuccessAsJson({
|
|
111
|
+
dryRun: true,
|
|
112
|
+
action: 'sync-ticket',
|
|
113
|
+
ticketId: flags.ticket,
|
|
114
|
+
trelloCardId: mapping.trelloCardId,
|
|
115
|
+
statusCategory: ticket.statusCategory,
|
|
116
|
+
}, createMetadata('trello sync', flags));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
this.log(colors.textMuted(`Would sync ${flags.ticket} to Trello card ${mapping.trelloCardId}`));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
await sync.syncTicket(ticket, mapping.trelloCardId);
|
|
123
|
+
if (jsonMode) {
|
|
124
|
+
outputSuccessAsJson({
|
|
125
|
+
action: 'sync-ticket',
|
|
126
|
+
ticketId: flags.ticket,
|
|
127
|
+
trelloCardId: mapping.trelloCardId,
|
|
128
|
+
synced: true,
|
|
129
|
+
}, createMetadata('trello sync', flags));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
this.log(colors.success(`Synced ${flags.ticket} to Trello card ${mapping.trelloCardId}`));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const mappings = mapper.listMappings();
|
|
136
|
+
if (mappings.length === 0) {
|
|
137
|
+
if (jsonMode) {
|
|
138
|
+
outputSuccessAsJson({ synced: 0, skipped: 0, errors: 0, message: 'No mapped tickets to sync.' }, createMetadata('trello sync', flags));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.log(colors.textMuted('No mapped tickets to sync.'));
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (flags['dry-run']) {
|
|
145
|
+
const preview = [];
|
|
146
|
+
for (const mapping of mappings) {
|
|
147
|
+
// eslint-disable-next-line no-await-in-loop
|
|
148
|
+
const ticket = await this.storage.getTicket(mapping.pmoTicketId);
|
|
149
|
+
preview.push({
|
|
150
|
+
ticketId: mapping.pmoTicketId,
|
|
151
|
+
trelloCardId: mapping.trelloCardId,
|
|
152
|
+
statusCategory: ticket?.statusCategory ?? null,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
if (jsonMode) {
|
|
156
|
+
outputSuccessAsJson({ dryRun: true, action: 'sync-all', tickets: preview }, createMetadata('trello sync', flags));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
for (const item of preview) {
|
|
160
|
+
this.log(colors.textMuted(` ${item.ticketId} -> ${item.trelloCardId} (${item.statusCategory ?? 'missing'})`));
|
|
161
|
+
}
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
let synced = 0;
|
|
165
|
+
let skipped = 0;
|
|
166
|
+
let errors = 0;
|
|
167
|
+
for (const mapping of mappings) {
|
|
168
|
+
try {
|
|
169
|
+
// eslint-disable-next-line no-await-in-loop
|
|
170
|
+
const ticket = await this.storage.getTicket(mapping.pmoTicketId);
|
|
171
|
+
if (!ticket) {
|
|
172
|
+
skipped++;
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
// eslint-disable-next-line no-await-in-loop
|
|
176
|
+
await sync.syncTicket(ticket, mapping.trelloCardId);
|
|
177
|
+
synced++;
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
errors++;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (jsonMode) {
|
|
184
|
+
outputSuccessAsJson({ action: 'sync-all', synced, skipped, errors }, createMetadata('trello sync', flags));
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
this.log(colors.success(`Trello sync complete: ${synced} synced, ${skipped} skipped, ${errors} errors`));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/commands/trello/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,7 @@ export default class WorkStart extends PMOCommand {
|
|
|
35
35
|
'session-action': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
36
36
|
yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
37
37
|
'use-api-key': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
38
|
+
'tool-policy': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
38
39
|
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
39
40
|
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
40
41
|
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
@@ -22,6 +22,7 @@ import { buildLinearMetadata, buildLinearSpawnContextMessage, buildLinearTicketD
|
|
|
22
22
|
import { buildJiraMetadata, buildJiraSpawnContextMessage, buildJiraTicketDescription, getJiraIssueByKey, } from '../../lib/external-issues/jira.js';
|
|
23
23
|
import { buildAsanaMetadata, buildAsanaSpawnContextMessage, buildAsanaTicketDescription, getAsanaTaskByGid, } from '../../lib/external-issues/asana.js';
|
|
24
24
|
import { buildShortcutMetadata, buildShortcutSpawnContextMessage, buildShortcutTicketDescription, getShortcutStoryByKey, } from '../../lib/external-issues/shortcut.js';
|
|
25
|
+
import { buildTrelloMetadata, buildTrelloSpawnContextMessage, buildTrelloTicketDescription, getTrelloCardById, } from '../../lib/external-issues/trello.js';
|
|
25
26
|
import { resolveMirrorToPmo } from '../../lib/external-issues/work-start.js';
|
|
26
27
|
import { ExternalIssueAdapterError } from '../../lib/external-issues/types.js';
|
|
27
28
|
import { loadActiveWorkSource, saveActiveWorkSource, getConnectedIntegrations, } from '../../lib/work-source/index.js';
|
|
@@ -87,13 +88,14 @@ function parseBooleanSetting(value) {
|
|
|
87
88
|
return null;
|
|
88
89
|
}
|
|
89
90
|
function isIssueSource(value) {
|
|
90
|
-
return value === 'linear' || value === 'jira' || value === 'asana' || value === 'shortcut';
|
|
91
|
+
return value === 'linear' || value === 'jira' || value === 'asana' || value === 'shortcut' || value === 'trello';
|
|
91
92
|
}
|
|
92
93
|
function buildExternalMetadata(envelope) {
|
|
93
94
|
switch (envelope.source.name) {
|
|
94
95
|
case 'jira': return buildJiraMetadata(envelope);
|
|
95
96
|
case 'asana': return buildAsanaMetadata(envelope);
|
|
96
97
|
case 'shortcut': return buildShortcutMetadata(envelope);
|
|
98
|
+
case 'trello': return buildTrelloMetadata(envelope);
|
|
97
99
|
default: return buildLinearMetadata(envelope);
|
|
98
100
|
}
|
|
99
101
|
}
|
|
@@ -102,6 +104,7 @@ function buildExternalTicketDescription(envelope) {
|
|
|
102
104
|
case 'jira': return buildJiraTicketDescription(envelope);
|
|
103
105
|
case 'asana': return buildAsanaTicketDescription(envelope);
|
|
104
106
|
case 'shortcut': return buildShortcutTicketDescription(envelope);
|
|
107
|
+
case 'trello': return buildTrelloTicketDescription(envelope);
|
|
105
108
|
default: return buildLinearTicketDescription(envelope);
|
|
106
109
|
}
|
|
107
110
|
}
|
|
@@ -110,6 +113,7 @@ function buildExternalSpawnContextMessage(envelope, additionalMessage) {
|
|
|
110
113
|
case 'jira': return buildJiraSpawnContextMessage(envelope, additionalMessage);
|
|
111
114
|
case 'asana': return buildAsanaSpawnContextMessage(envelope, additionalMessage);
|
|
112
115
|
case 'shortcut': return buildShortcutSpawnContextMessage(envelope, additionalMessage);
|
|
116
|
+
case 'trello': return buildTrelloSpawnContextMessage(envelope, additionalMessage);
|
|
113
117
|
default: return buildLinearSpawnContextMessage(envelope, additionalMessage);
|
|
114
118
|
}
|
|
115
119
|
}
|
|
@@ -145,6 +149,7 @@ export default class WorkStart extends PMOCommand {
|
|
|
145
149
|
'<%= config.bin %> <%= command.id %> --from jira:PROJ-123 # Unified: Jira shorthand',
|
|
146
150
|
'<%= config.bin %> <%= command.id %> --from asana:1234567890 # Unified: Asana shorthand',
|
|
147
151
|
'<%= config.bin %> <%= command.id %> --from shortcut:sc-123 # Unified: Shortcut shorthand',
|
|
152
|
+
'<%= config.bin %> <%= command.id %> --from trello:abc123 # Unified: Trello shorthand',
|
|
148
153
|
'<%= config.bin %> <%= command.id %> --from-issue # Uses workspace active source',
|
|
149
154
|
];
|
|
150
155
|
static args = {
|
|
@@ -185,7 +190,7 @@ export default class WorkStart extends PMOCommand {
|
|
|
185
190
|
}),
|
|
186
191
|
source: Flags.string({
|
|
187
192
|
description: 'External issue source',
|
|
188
|
-
options: ['linear', 'jira', 'asana', 'shortcut'],
|
|
193
|
+
options: ['linear', 'jira', 'asana', 'shortcut', 'trello'],
|
|
189
194
|
}),
|
|
190
195
|
key: Flags.string({
|
|
191
196
|
description: 'External issue key (for example: ENG-123, PROJ-456)',
|
|
@@ -276,6 +281,9 @@ export default class WorkStart extends PMOCommand {
|
|
|
276
281
|
default: false,
|
|
277
282
|
hidden: true,
|
|
278
283
|
}),
|
|
284
|
+
'tool-policy': Flags.string({
|
|
285
|
+
description: 'Tool policy profile name for per-agent access control (e.g., code-agent, ops-agent)',
|
|
286
|
+
}),
|
|
279
287
|
};
|
|
280
288
|
async findLinkedTicketByEnvelope(projectId, envelope) {
|
|
281
289
|
const tickets = await this.storage.listTickets(projectId);
|
|
@@ -316,6 +324,7 @@ export default class WorkStart extends PMOCommand {
|
|
|
316
324
|
case 'jira': return getJiraIssueByKey({}, key);
|
|
317
325
|
case 'asana': return getAsanaTaskByGid({}, key);
|
|
318
326
|
case 'shortcut': return getShortcutStoryByKey({}, key);
|
|
327
|
+
case 'trello': return getTrelloCardById({}, key);
|
|
319
328
|
default: return getLinearIssueByIdentifier({}, key);
|
|
320
329
|
}
|
|
321
330
|
}
|
|
@@ -348,6 +357,7 @@ export default class WorkStart extends PMOCommand {
|
|
|
348
357
|
{ name: 'Jira', value: 'jira', command: 'prlt work start --from jira:ISSUE-KEY --json' },
|
|
349
358
|
{ name: 'Asana', value: 'asana', command: 'prlt work start --from asana:TASK-GID --json' },
|
|
350
359
|
{ name: 'Shortcut', value: 'shortcut', command: 'prlt work start --from shortcut:STORY-ID --json' },
|
|
360
|
+
{ name: 'Trello', value: 'trello', command: 'prlt work start --from trello:CARD-ID --json' },
|
|
351
361
|
],
|
|
352
362
|
});
|
|
353
363
|
const sourceResult = await sourceResolver.resolve();
|
|
@@ -371,7 +381,7 @@ export default class WorkStart extends PMOCommand {
|
|
|
371
381
|
keyResolver.addPrompt({
|
|
372
382
|
flagName: 'key',
|
|
373
383
|
type: 'input',
|
|
374
|
-
message: `Enter ${source === 'linear' ? 'Linear' : source === 'jira' ? 'Jira' : source === 'asana' ? 'Asana task' : source === 'shortcut' ? 'Shortcut story' : source} key:`,
|
|
384
|
+
message: `Enter ${source === 'linear' ? 'Linear' : source === 'jira' ? 'Jira' : source === 'asana' ? 'Asana task' : source === 'shortcut' ? 'Shortcut story' : source === 'trello' ? 'Trello card' : source} key:`,
|
|
375
385
|
default: key,
|
|
376
386
|
when: () => !key?.trim(),
|
|
377
387
|
validate: (value) => value.trim().length > 0 ? true : 'Issue key is required',
|
|
@@ -986,20 +996,6 @@ export default class WorkStart extends PMOCommand {
|
|
|
986
996
|
const epic = await this.storage.getEpic(ticket.epicId);
|
|
987
997
|
epicTitle = epic?.title;
|
|
988
998
|
}
|
|
989
|
-
// Get spec info if linked
|
|
990
|
-
let specId;
|
|
991
|
-
let specTitle;
|
|
992
|
-
let specProblem;
|
|
993
|
-
let specSolution;
|
|
994
|
-
if (ticket.specId) {
|
|
995
|
-
const spec = await this.storage.getSpec(ticket.specId);
|
|
996
|
-
if (spec) {
|
|
997
|
-
specId = spec.id;
|
|
998
|
-
specTitle = spec.title;
|
|
999
|
-
specProblem = spec.problem;
|
|
1000
|
-
specSolution = spec.solution;
|
|
1001
|
-
}
|
|
1002
|
-
}
|
|
1003
999
|
// Determine action for this work session
|
|
1004
1000
|
let selectedAction = null;
|
|
1005
1001
|
let customPrompt;
|
|
@@ -1101,10 +1097,6 @@ export default class WorkStart extends PMOCommand {
|
|
|
1101
1097
|
ticketPriority: ticket.priority,
|
|
1102
1098
|
ticketCategory: ticket.category,
|
|
1103
1099
|
epicTitle,
|
|
1104
|
-
specId,
|
|
1105
|
-
specTitle,
|
|
1106
|
-
specProblem,
|
|
1107
|
-
specSolution,
|
|
1108
1100
|
agentName: assignedAgent,
|
|
1109
1101
|
agentDir, // Agent directory (contains .devcontainer)
|
|
1110
1102
|
worktreePath, // Worktree path (may be subdirectory of agentDir)
|
|
@@ -1113,6 +1105,8 @@ export default class WorkStart extends PMOCommand {
|
|
|
1113
1105
|
pmoPath: this.pmoPath, // PMO path for container mounting
|
|
1114
1106
|
repoWorktrees,
|
|
1115
1107
|
isEphemeral: isEphemeralAgent,
|
|
1108
|
+
// Tool policy (TKT-083)
|
|
1109
|
+
toolPolicy: flags['tool-policy'],
|
|
1116
1110
|
// Action context
|
|
1117
1111
|
actionId: selectedAction?.id,
|
|
1118
1112
|
actionName: selectedAction?.name || (customPrompt ? 'Custom' : undefined),
|
|
@@ -2341,25 +2335,12 @@ export default class WorkStart extends PMOCommand {
|
|
|
2341
2335
|
// Use ticket's existing branch or generate a new one
|
|
2342
2336
|
const branch = ticket.branch || generateBranchName(ticket.id, ticket.title, coderName, agentName, ticket.category);
|
|
2343
2337
|
const isExistingBranch = !!ticket.branch;
|
|
2344
|
-
// Get epic
|
|
2338
|
+
// Get epic info
|
|
2345
2339
|
let epicTitle;
|
|
2346
|
-
let specId;
|
|
2347
|
-
let specTitle;
|
|
2348
|
-
let specProblem;
|
|
2349
|
-
let specSolution;
|
|
2350
2340
|
if (ticket.epicId) {
|
|
2351
2341
|
const epic = await this.storage.getEpic(ticket.epicId);
|
|
2352
2342
|
epicTitle = epic?.title;
|
|
2353
2343
|
}
|
|
2354
|
-
if (ticket.specId) {
|
|
2355
|
-
const spec = await this.storage.getSpec(ticket.specId);
|
|
2356
|
-
if (spec) {
|
|
2357
|
-
specId = spec.id;
|
|
2358
|
-
specTitle = spec.title;
|
|
2359
|
-
specProblem = spec.problem;
|
|
2360
|
-
specSolution = spec.solution;
|
|
2361
|
-
}
|
|
2362
|
-
}
|
|
2363
2344
|
// Get default action for batch mode (use 'implement')
|
|
2364
2345
|
const defaultAction = await this.storage.getAction('implement');
|
|
2365
2346
|
// Build context
|
|
@@ -2371,10 +2352,6 @@ export default class WorkStart extends PMOCommand {
|
|
|
2371
2352
|
ticketPriority: ticket.priority,
|
|
2372
2353
|
ticketCategory: ticket.category,
|
|
2373
2354
|
epicTitle,
|
|
2374
|
-
specId,
|
|
2375
|
-
specTitle,
|
|
2376
|
-
specProblem,
|
|
2377
|
-
specSolution,
|
|
2378
2355
|
agentName,
|
|
2379
2356
|
agentDir,
|
|
2380
2357
|
worktreePath,
|
|
@@ -2384,6 +2361,7 @@ export default class WorkStart extends PMOCommand {
|
|
|
2384
2361
|
repoWorktrees,
|
|
2385
2362
|
isEphemeral: workspaceInfo.agents.find(a => a.name === agentName)?.type === 'ephemeral',
|
|
2386
2363
|
createPR: flags['create-pr'] || false,
|
|
2364
|
+
toolPolicy: flags['tool-policy'],
|
|
2387
2365
|
// Use 'implement' action for batch mode
|
|
2388
2366
|
actionId: defaultAction?.id,
|
|
2389
2367
|
actionName: defaultAction?.name,
|