@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.
Files changed (212) hide show
  1. package/dist/commands/{spec → dashboard}/index.d.ts +4 -4
  2. package/dist/commands/dashboard/index.js +117 -0
  3. package/dist/commands/dashboard/index.js.map +1 -0
  4. package/dist/commands/execution/config.js +5 -4
  5. package/dist/commands/execution/config.js.map +1 -1
  6. package/dist/commands/execution/stop.js +4 -2
  7. package/dist/commands/execution/stop.js.map +1 -1
  8. package/dist/commands/execution/view.js +3 -0
  9. package/dist/commands/execution/view.js.map +1 -1
  10. package/dist/commands/init.d.ts +1 -0
  11. package/dist/commands/init.js +40 -3
  12. package/dist/commands/init.js.map +1 -1
  13. package/dist/commands/mcp-server.js +1 -2
  14. package/dist/commands/mcp-server.js.map +1 -1
  15. package/dist/commands/{spec/link/index.d.ts → session/exec.d.ts} +5 -3
  16. package/dist/commands/session/exec.js +205 -0
  17. package/dist/commands/session/exec.js.map +1 -0
  18. package/dist/commands/session/index.js +12 -0
  19. package/dist/commands/session/index.js.map +1 -1
  20. package/dist/commands/{spec/delete.d.ts → session/inspect.d.ts} +3 -3
  21. package/dist/commands/session/inspect.js +316 -0
  22. package/dist/commands/session/inspect.js.map +1 -0
  23. package/dist/commands/session/peek.d.ts +15 -0
  24. package/dist/commands/session/peek.js +141 -8
  25. package/dist/commands/session/peek.js.map +1 -1
  26. package/dist/commands/session/poke.d.ts +4 -1
  27. package/dist/commands/session/poke.js +175 -20
  28. package/dist/commands/session/poke.js.map +1 -1
  29. package/dist/commands/{spec/link/depends.d.ts → session/restart.d.ts} +6 -4
  30. package/dist/commands/session/restart.js +320 -0
  31. package/dist/commands/session/restart.js.map +1 -0
  32. package/dist/commands/ticket/list.d.ts +10 -0
  33. package/dist/commands/ticket/list.js +126 -1
  34. package/dist/commands/ticket/list.js.map +1 -1
  35. package/dist/commands/tools/add.d.ts +20 -0
  36. package/dist/commands/tools/add.js +129 -0
  37. package/dist/commands/tools/add.js.map +1 -0
  38. package/dist/commands/tools/check.d.ts +10 -0
  39. package/dist/commands/tools/check.js +75 -0
  40. package/dist/commands/tools/check.js.map +1 -0
  41. package/dist/commands/tools/detect.d.ts +11 -0
  42. package/dist/commands/tools/detect.js +107 -0
  43. package/dist/commands/tools/detect.js.map +1 -0
  44. package/dist/commands/tools/index.d.ts +11 -0
  45. package/dist/commands/tools/index.js +87 -0
  46. package/dist/commands/tools/index.js.map +1 -0
  47. package/dist/commands/tools/remove.d.ts +13 -0
  48. package/dist/commands/tools/remove.js +55 -0
  49. package/dist/commands/tools/remove.js.map +1 -0
  50. package/dist/commands/{spec/view.d.ts → trello/configure.d.ts} +6 -6
  51. package/dist/commands/trello/configure.js +259 -0
  52. package/dist/commands/trello/configure.js.map +1 -0
  53. package/dist/commands/{spec/plan.d.ts → trello/import.d.ts} +3 -5
  54. package/dist/commands/trello/import.js +241 -0
  55. package/dist/commands/trello/import.js.map +1 -0
  56. package/dist/commands/{spec/ticket.d.ts → trello/sync.d.ts} +5 -6
  57. package/dist/commands/trello/sync.js +190 -0
  58. package/dist/commands/trello/sync.js.map +1 -0
  59. package/dist/commands/work/start.d.ts +1 -0
  60. package/dist/commands/work/start.js +17 -39
  61. package/dist/commands/work/start.js.map +1 -1
  62. package/dist/lib/dashboard/data.d.ts +64 -0
  63. package/dist/lib/dashboard/data.js +259 -0
  64. package/dist/lib/dashboard/data.js.map +1 -0
  65. package/dist/lib/dashboard/html.d.ts +7 -0
  66. package/dist/lib/dashboard/html.js +682 -0
  67. package/dist/lib/dashboard/html.js.map +1 -0
  68. package/dist/lib/dashboard/server.d.ts +20 -0
  69. package/dist/lib/dashboard/server.js +114 -0
  70. package/dist/lib/dashboard/server.js.map +1 -0
  71. package/dist/lib/events/events.d.ts +26 -2
  72. package/dist/lib/events/events.js +3 -2
  73. package/dist/lib/events/events.js.map +1 -1
  74. package/dist/lib/execution/config.d.ts +8 -0
  75. package/dist/lib/execution/config.js +83 -4
  76. package/dist/lib/execution/config.js.map +1 -1
  77. package/dist/lib/execution/runners.d.ts +36 -3
  78. package/dist/lib/execution/runners.js +216 -35
  79. package/dist/lib/execution/runners.js.map +1 -1
  80. package/dist/lib/execution/spawner.d.ts +2 -0
  81. package/dist/lib/execution/spawner.js +22 -31
  82. package/dist/lib/execution/spawner.js.map +1 -1
  83. package/dist/lib/execution/types.d.ts +26 -5
  84. package/dist/lib/execution/types.js +24 -0
  85. package/dist/lib/execution/types.js.map +1 -1
  86. package/dist/lib/external-issues/adapters.d.ts +17 -0
  87. package/dist/lib/external-issues/adapters.js +88 -0
  88. package/dist/lib/external-issues/adapters.js.map +1 -1
  89. package/dist/lib/external-issues/index.d.ts +1 -0
  90. package/dist/lib/external-issues/index.js +2 -0
  91. package/dist/lib/external-issues/index.js.map +1 -1
  92. package/dist/lib/external-issues/mapping-store.js +1 -1
  93. package/dist/lib/external-issues/outbound-sync.d.ts +79 -0
  94. package/dist/lib/external-issues/outbound-sync.js +296 -0
  95. package/dist/lib/external-issues/outbound-sync.js.map +1 -0
  96. package/dist/lib/external-issues/trello.d.ts +80 -0
  97. package/dist/lib/external-issues/trello.js +266 -0
  98. package/dist/lib/external-issues/trello.js.map +1 -0
  99. package/dist/lib/external-issues/types.d.ts +3 -3
  100. package/dist/lib/external-issues/types.js +1 -1
  101. package/dist/lib/external-issues/types.js.map +1 -1
  102. package/dist/lib/linear/client.d.ts +4 -3
  103. package/dist/lib/linear/client.js +185 -122
  104. package/dist/lib/linear/client.js.map +1 -1
  105. package/dist/lib/mcp/tools/cli-passthrough.js +77 -0
  106. package/dist/lib/mcp/tools/cli-passthrough.js.map +1 -1
  107. package/dist/lib/mcp/tools/index.d.ts +0 -1
  108. package/dist/lib/mcp/tools/index.js +0 -1
  109. package/dist/lib/mcp/tools/index.js.map +1 -1
  110. package/dist/lib/onboarding/detect-tools.d.ts +15 -0
  111. package/dist/lib/onboarding/detect-tools.js +44 -0
  112. package/dist/lib/onboarding/detect-tools.js.map +1 -0
  113. package/dist/lib/onboarding/index.d.ts +2 -0
  114. package/dist/lib/onboarding/index.js +3 -0
  115. package/dist/lib/onboarding/index.js.map +1 -0
  116. package/dist/lib/onboarding/wizard.d.ts +25 -0
  117. package/dist/lib/onboarding/wizard.js +156 -0
  118. package/dist/lib/onboarding/wizard.js.map +1 -0
  119. package/dist/lib/pmo/schema.d.ts +2 -1
  120. package/dist/lib/pmo/schema.js +3 -1
  121. package/dist/lib/pmo/schema.js.map +1 -1
  122. package/dist/lib/pmo/storage/tickets.d.ts +8 -0
  123. package/dist/lib/pmo/storage/tickets.js +56 -2
  124. package/dist/lib/pmo/storage/tickets.js.map +1 -1
  125. package/dist/lib/pmo/sync-manager.js +3 -0
  126. package/dist/lib/pmo/sync-manager.js.map +1 -1
  127. package/dist/lib/runners/claude-code-runner.js +6 -0
  128. package/dist/lib/runners/claude-code-runner.js.map +1 -1
  129. package/dist/lib/tool-registry/detect.d.ts +20 -0
  130. package/dist/lib/tool-registry/detect.js +95 -0
  131. package/dist/lib/tool-registry/detect.js.map +1 -0
  132. package/dist/lib/tool-registry/index.d.ts +10 -0
  133. package/dist/lib/tool-registry/index.js +13 -0
  134. package/dist/lib/tool-registry/index.js.map +1 -0
  135. package/dist/lib/tool-registry/policy.d.ts +32 -0
  136. package/dist/lib/tool-registry/policy.js +97 -0
  137. package/dist/lib/tool-registry/policy.js.map +1 -0
  138. package/dist/lib/tool-registry/registry.d.ts +42 -0
  139. package/dist/lib/tool-registry/registry.js +120 -0
  140. package/dist/lib/tool-registry/registry.js.map +1 -0
  141. package/dist/lib/tool-registry/spawn.d.ts +50 -0
  142. package/dist/lib/tool-registry/spawn.js +103 -0
  143. package/dist/lib/tool-registry/spawn.js.map +1 -0
  144. package/dist/lib/tool-registry/types.d.ts +56 -0
  145. package/dist/lib/tool-registry/types.js +109 -0
  146. package/dist/lib/tool-registry/types.js.map +1 -0
  147. package/dist/lib/trello/client.d.ts +23 -0
  148. package/dist/lib/trello/client.js +114 -0
  149. package/dist/lib/trello/client.js.map +1 -0
  150. package/dist/lib/trello/config.d.ts +55 -0
  151. package/dist/lib/trello/config.js +127 -0
  152. package/dist/lib/trello/config.js.map +1 -0
  153. package/dist/lib/trello/index.d.ts +5 -0
  154. package/dist/lib/trello/index.js +5 -0
  155. package/dist/lib/trello/index.js.map +1 -0
  156. package/dist/lib/trello/mapper.d.ts +13 -0
  157. package/dist/lib/trello/mapper.js +71 -0
  158. package/dist/lib/trello/mapper.js.map +1 -0
  159. package/dist/lib/trello/sync.d.ts +13 -0
  160. package/dist/lib/trello/sync.js +38 -0
  161. package/dist/lib/trello/sync.js.map +1 -0
  162. package/dist/lib/trello/types.d.ts +53 -0
  163. package/dist/lib/trello/types.js +2 -0
  164. package/dist/lib/trello/types.js.map +1 -0
  165. package/dist/lib/work-source/client.js +17 -0
  166. package/dist/lib/work-source/client.js.map +1 -1
  167. package/dist/lib/work-source/config.d.ts +1 -1
  168. package/dist/lib/work-source/config.js +23 -1
  169. package/dist/lib/work-source/config.js.map +1 -1
  170. package/dist/lib/work-source/index.d.ts +1 -0
  171. package/dist/lib/work-source/index.js +1 -0
  172. package/dist/lib/work-source/index.js.map +1 -1
  173. package/dist/lib/work-source/provider-sources.d.ts +113 -0
  174. package/dist/lib/work-source/provider-sources.js +227 -0
  175. package/dist/lib/work-source/provider-sources.js.map +1 -0
  176. package/oclif.manifest.json +4368 -4364
  177. package/package.json +6 -2
  178. package/dist/commands/spec/create.d.ts +0 -20
  179. package/dist/commands/spec/create.js +0 -171
  180. package/dist/commands/spec/create.js.map +0 -1
  181. package/dist/commands/spec/delete.js +0 -112
  182. package/dist/commands/spec/delete.js.map +0 -1
  183. package/dist/commands/spec/edit.d.ts +0 -23
  184. package/dist/commands/spec/edit.js +0 -262
  185. package/dist/commands/spec/edit.js.map +0 -1
  186. package/dist/commands/spec/index.js +0 -88
  187. package/dist/commands/spec/index.js.map +0 -1
  188. package/dist/commands/spec/link/depends.js +0 -87
  189. package/dist/commands/spec/link/depends.js.map +0 -1
  190. package/dist/commands/spec/link/index.js +0 -93
  191. package/dist/commands/spec/link/index.js.map +0 -1
  192. package/dist/commands/spec/link/remove.d.ts +0 -18
  193. package/dist/commands/spec/link/remove.js +0 -91
  194. package/dist/commands/spec/link/remove.js.map +0 -1
  195. package/dist/commands/spec/list.d.ts +0 -14
  196. package/dist/commands/spec/list.js +0 -101
  197. package/dist/commands/spec/list.js.map +0 -1
  198. package/dist/commands/spec/plan.js +0 -102
  199. package/dist/commands/spec/plan.js.map +0 -1
  200. package/dist/commands/spec/ticket.js +0 -144
  201. package/dist/commands/spec/ticket.js.map +0 -1
  202. package/dist/commands/spec/view.js +0 -202
  203. package/dist/commands/spec/view.js.map +0 -1
  204. package/dist/lib/mcp/tools/spec.d.ts +0 -6
  205. package/dist/lib/mcp/tools/spec.js +0 -197
  206. package/dist/lib/mcp/tools/spec.js.map +0 -1
  207. package/dist/lib/pmo/spec-parser.d.ts +0 -25
  208. package/dist/lib/pmo/spec-parser.js +0 -206
  209. package/dist/lib/pmo/spec-parser.js.map +0 -1
  210. package/dist/lib/pmo/spec-types.d.ts +0 -43
  211. package/dist/lib/pmo/spec-types.js +0 -8
  212. 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 SpecTicket extends PMOCommand {
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
- spec: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
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 and spec info
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,