@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
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Trello Configuration Storage
3
+ *
4
+ * Stores Trello credentials and preferences in the workspace_settings table.
5
+ * Mirrors the Shortcut/Asana config module pattern.
6
+ */
7
+ const SETTINGS_TABLE = 'workspace_settings';
8
+ const TRELLO_CONFIG_KEYS = {
9
+ apiKey: 'trello.api_key',
10
+ apiToken: 'trello.api_token',
11
+ boardId: 'trello.board_id',
12
+ boardName: 'trello.board_name',
13
+ };
14
+ function getSetting(db, key) {
15
+ const row = db
16
+ .prepare(`SELECT value FROM ${SETTINGS_TABLE} WHERE key = ?`)
17
+ .get(key);
18
+ return row?.value ?? null;
19
+ }
20
+ function setSetting(db, key, value) {
21
+ db.prepare(`
22
+ INSERT INTO ${SETTINGS_TABLE} (key, value)
23
+ VALUES (?, ?)
24
+ ON CONFLICT(key) DO UPDATE SET value = excluded.value
25
+ `).run(key, value);
26
+ }
27
+ function deleteSetting(db, key) {
28
+ db.prepare(`DELETE FROM ${SETTINGS_TABLE} WHERE key = ?`).run(key);
29
+ }
30
+ /**
31
+ * Check if Trello is configured.
32
+ * Returns true if either:
33
+ * - Database has trello.api_key and trello.api_token stored, OR
34
+ * - Environment variables PRLT_TRELLO_API_KEY/TRELLO_API_KEY and PRLT_TRELLO_API_TOKEN/TRELLO_API_TOKEN are set
35
+ */
36
+ export function isTrelloConfigured(db) {
37
+ const hasDbConfig = getSetting(db, TRELLO_CONFIG_KEYS.apiKey) !== null
38
+ && getSetting(db, TRELLO_CONFIG_KEYS.apiToken) !== null;
39
+ if (hasDbConfig)
40
+ return true;
41
+ const hasEnvKey = !!(process.env.PRLT_TRELLO_API_KEY || process.env.TRELLO_API_KEY);
42
+ const hasEnvToken = !!(process.env.PRLT_TRELLO_API_TOKEN || process.env.TRELLO_API_TOKEN);
43
+ return hasEnvKey && hasEnvToken;
44
+ }
45
+ /**
46
+ * Load Trello configuration from the database + environment.
47
+ * Returns null if not configured.
48
+ */
49
+ export function loadTrelloConfig(db) {
50
+ const apiKey = getSetting(db, TRELLO_CONFIG_KEYS.apiKey)
51
+ || process.env.PRLT_TRELLO_API_KEY
52
+ || process.env.TRELLO_API_KEY;
53
+ const apiToken = getSetting(db, TRELLO_CONFIG_KEYS.apiToken)
54
+ || process.env.PRLT_TRELLO_API_TOKEN
55
+ || process.env.TRELLO_API_TOKEN;
56
+ if (!apiKey || !apiToken)
57
+ return null;
58
+ return {
59
+ apiKey,
60
+ apiToken,
61
+ boardId: getSetting(db, TRELLO_CONFIG_KEYS.boardId)
62
+ || process.env.PRLT_TRELLO_BOARD_ID
63
+ || undefined,
64
+ boardName: getSetting(db, TRELLO_CONFIG_KEYS.boardName) || undefined,
65
+ };
66
+ }
67
+ /**
68
+ * Save Trello configuration to the database.
69
+ */
70
+ export function saveTrelloConfig(db, config) {
71
+ setSetting(db, TRELLO_CONFIG_KEYS.apiKey, config.apiKey);
72
+ setSetting(db, TRELLO_CONFIG_KEYS.apiToken, config.apiToken);
73
+ if (config.boardId) {
74
+ setSetting(db, TRELLO_CONFIG_KEYS.boardId, config.boardId);
75
+ }
76
+ if (config.boardName) {
77
+ setSetting(db, TRELLO_CONFIG_KEYS.boardName, config.boardName);
78
+ }
79
+ }
80
+ /**
81
+ * Save the Trello API key.
82
+ */
83
+ export function saveTrelloApiKey(db, apiKey) {
84
+ setSetting(db, TRELLO_CONFIG_KEYS.apiKey, apiKey);
85
+ }
86
+ /**
87
+ * Save the Trello API token.
88
+ */
89
+ export function saveTrelloApiToken(db, apiToken) {
90
+ setSetting(db, TRELLO_CONFIG_KEYS.apiToken, apiToken);
91
+ }
92
+ /**
93
+ * Save the Trello board.
94
+ */
95
+ export function saveTrelloBoard(db, boardId, boardName) {
96
+ setSetting(db, TRELLO_CONFIG_KEYS.boardId, boardId);
97
+ setSetting(db, TRELLO_CONFIG_KEYS.boardName, boardName);
98
+ }
99
+ /**
100
+ * Clear all Trello configuration from the database.
101
+ */
102
+ export function clearTrelloConfig(db) {
103
+ for (const key of Object.values(TRELLO_CONFIG_KEYS)) {
104
+ deleteSetting(db, key);
105
+ }
106
+ }
107
+ /**
108
+ * Get the stored Trello API key.
109
+ * Also checks PRLT_TRELLO_API_KEY and TRELLO_API_KEY environment variables.
110
+ */
111
+ export function getTrelloApiKey(db) {
112
+ const envKey = process.env.PRLT_TRELLO_API_KEY || process.env.TRELLO_API_KEY;
113
+ if (envKey)
114
+ return envKey;
115
+ return getSetting(db, TRELLO_CONFIG_KEYS.apiKey);
116
+ }
117
+ /**
118
+ * Get the stored Trello API token.
119
+ * Also checks PRLT_TRELLO_API_TOKEN and TRELLO_API_TOKEN environment variables.
120
+ */
121
+ export function getTrelloApiToken(db) {
122
+ const envToken = process.env.PRLT_TRELLO_API_TOKEN || process.env.TRELLO_API_TOKEN;
123
+ if (envToken)
124
+ return envToken;
125
+ return getSetting(db, TRELLO_CONFIG_KEYS.apiToken);
126
+ }
127
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/trello/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { TrelloClient } from './client.js';
2
+ export { isTrelloConfigured, loadTrelloConfig, saveTrelloConfig, saveTrelloApiKey, saveTrelloApiToken, saveTrelloBoard, clearTrelloConfig, getTrelloApiKey, getTrelloApiToken, } from './config.js';
3
+ export { TrelloMapper } from './mapper.js';
4
+ export { TrelloSync } from './sync.js';
5
+ export type { TrelloConfig, TrelloBoard, TrelloList, TrelloLabel, TrelloMember, TrelloCard, TrelloCardMap, TrelloCardUpsertInput, } from './types.js';
@@ -0,0 +1,5 @@
1
+ export { TrelloClient } from './client.js';
2
+ export { isTrelloConfigured, loadTrelloConfig, saveTrelloConfig, saveTrelloApiKey, saveTrelloApiToken, saveTrelloBoard, clearTrelloConfig, getTrelloApiKey, getTrelloApiToken, } from './config.js';
3
+ export { TrelloMapper } from './mapper.js';
4
+ export { TrelloSync } from './sync.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/trello/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAClB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,13 @@
1
+ import Database from 'better-sqlite3';
2
+ import type { TrelloCardMap } from './types.js';
3
+ export declare class TrelloMapper {
4
+ private db;
5
+ constructor(db: Database.Database);
6
+ private ensureTable;
7
+ createOrUpdateMapping(pmoTicketId: string, trelloCardId: string, trelloBoardId?: string): void;
8
+ getByTicketId(ticketId: string): TrelloCardMap | null;
9
+ getByCardId(trelloCardId: string): TrelloCardMap | null;
10
+ listMappings(): TrelloCardMap[];
11
+ updateSyncTimestamp(ticketId: string): void;
12
+ private rowToMap;
13
+ }
@@ -0,0 +1,71 @@
1
+ import { PMO_TABLES } from '../pmo/schema.js';
2
+ export class TrelloMapper {
3
+ db;
4
+ constructor(db) {
5
+ this.db = db;
6
+ this.ensureTable();
7
+ }
8
+ ensureTable() {
9
+ this.db.exec(`
10
+ CREATE TABLE IF NOT EXISTS ${PMO_TABLES.trello_card_map} (
11
+ pmo_ticket_id TEXT NOT NULL REFERENCES ${PMO_TABLES.tickets}(id) ON DELETE CASCADE,
12
+ trello_card_id TEXT NOT NULL,
13
+ trello_board_id TEXT,
14
+ last_synced_at TIMESTAMP,
15
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
16
+ PRIMARY KEY (pmo_ticket_id),
17
+ UNIQUE (trello_card_id)
18
+ )
19
+ `);
20
+ this.db.exec(`
21
+ CREATE INDEX IF NOT EXISTS idx_pmo_trello_card_map_card_id
22
+ ON ${PMO_TABLES.trello_card_map}(trello_card_id)
23
+ `);
24
+ }
25
+ createOrUpdateMapping(pmoTicketId, trelloCardId, trelloBoardId) {
26
+ this.db.prepare(`
27
+ INSERT INTO ${PMO_TABLES.trello_card_map}
28
+ (pmo_ticket_id, trello_card_id, trello_board_id, last_synced_at, created_at)
29
+ VALUES (?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
30
+ ON CONFLICT(pmo_ticket_id) DO UPDATE SET
31
+ trello_card_id = excluded.trello_card_id,
32
+ trello_board_id = excluded.trello_board_id,
33
+ last_synced_at = CURRENT_TIMESTAMP
34
+ `).run(pmoTicketId, trelloCardId, trelloBoardId ?? null);
35
+ }
36
+ getByTicketId(ticketId) {
37
+ const row = this.db.prepare(`
38
+ SELECT * FROM ${PMO_TABLES.trello_card_map} WHERE pmo_ticket_id = ?
39
+ `).get(ticketId);
40
+ return row ? this.rowToMap(row) : null;
41
+ }
42
+ getByCardId(trelloCardId) {
43
+ const row = this.db.prepare(`
44
+ SELECT * FROM ${PMO_TABLES.trello_card_map} WHERE trello_card_id = ?
45
+ `).get(trelloCardId);
46
+ return row ? this.rowToMap(row) : null;
47
+ }
48
+ listMappings() {
49
+ const rows = this.db.prepare(`
50
+ SELECT * FROM ${PMO_TABLES.trello_card_map} ORDER BY created_at DESC
51
+ `).all();
52
+ return rows.map((row) => this.rowToMap(row));
53
+ }
54
+ updateSyncTimestamp(ticketId) {
55
+ this.db.prepare(`
56
+ UPDATE ${PMO_TABLES.trello_card_map}
57
+ SET last_synced_at = CURRENT_TIMESTAMP
58
+ WHERE pmo_ticket_id = ?
59
+ `).run(ticketId);
60
+ }
61
+ rowToMap(row) {
62
+ return {
63
+ pmoTicketId: row.pmo_ticket_id,
64
+ trelloCardId: row.trello_card_id,
65
+ trelloBoardId: row.trello_board_id ?? undefined,
66
+ lastSyncedAt: row.last_synced_at ? new Date(row.last_synced_at) : undefined,
67
+ createdAt: new Date(row.created_at),
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../../src/lib/trello/mapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,MAAM,OAAO,YAAY;IACH;IAApB,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;QACvC,IAAI,CAAC,WAAW,EAAE,CAAA;IACpB,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;mCACkB,UAAU,CAAC,eAAe;iDACZ,UAAU,CAAC,OAAO;;;;;;;;KAQ9D,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;aAEJ,UAAU,CAAC,eAAe;KAClC,CAAC,CAAA;IACJ,CAAC;IAED,qBAAqB,CAAC,WAAmB,EAAE,YAAoB,EAAE,aAAsB;QACrF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;oBACA,UAAU,CAAC,eAAe;;;;;;;KAOzC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,IAAI,IAAI,CAAC,CAAA;IAC1D,CAAC;IAED,aAAa,CAAC,QAAgB;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;sBACV,UAAU,CAAC,eAAe;KAC3C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAwC,CAAA;QAEvD,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACxC,CAAC;IAED,WAAW,CAAC,YAAoB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;sBACV,UAAU,CAAC,eAAe;KAC3C,CAAC,CAAC,GAAG,CAAC,YAAY,CAAwC,CAAA;QAE3D,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACxC,CAAC;IAED,YAAY;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;sBACX,UAAU,CAAC,eAAe;KAC3C,CAAC,CAAC,GAAG,EAA+B,CAAA;QAErC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9C,CAAC;IAED,mBAAmB,CAAC,QAAgB;QAClC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;eACL,UAAU,CAAC,eAAe;;;KAGpC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClB,CAAC;IAEO,QAAQ,CAAC,GAA4B;QAC3C,OAAO;YACL,WAAW,EAAE,GAAG,CAAC,aAAuB;YACxC,YAAY,EAAE,GAAG,CAAC,cAAwB;YAC1C,aAAa,EAAG,GAAG,CAAC,eAAiC,IAAI,SAAS;YAClE,YAAY,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,cAAwB,CAAC,CAAC,CAAC,CAAC,SAAS;YACrF,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAoB,CAAC;SAC9C,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { Ticket } from '../pmo/types.js';
2
+ import { TrelloClient } from './client.js';
3
+ import { TrelloMapper } from './mapper.js';
4
+ export declare class TrelloSync {
5
+ private client;
6
+ private mapper;
7
+ constructor(client: TrelloClient, mapper: TrelloMapper);
8
+ private buildCardName;
9
+ private buildCardDesc;
10
+ private isCompletedStatus;
11
+ createCardForTicket(ticket: Ticket, listId: string, boardId?: string): Promise<string>;
12
+ syncTicket(ticket: Ticket, cardId: string): Promise<void>;
13
+ }
@@ -0,0 +1,38 @@
1
+ export class TrelloSync {
2
+ client;
3
+ mapper;
4
+ constructor(client, mapper) {
5
+ this.client = client;
6
+ this.mapper = mapper;
7
+ }
8
+ buildCardName(ticket) {
9
+ return `${ticket.id}: ${ticket.title}`;
10
+ }
11
+ buildCardDesc(ticket) {
12
+ const parts = [ticket.description?.trim() || '', '', '---', `Synced from PMO ticket ${ticket.id}`];
13
+ return parts.join('\n').trim();
14
+ }
15
+ isCompletedStatus(ticket) {
16
+ return ticket.statusCategory === 'completed' || ticket.statusCategory === 'canceled';
17
+ }
18
+ async createCardForTicket(ticket, listId, boardId) {
19
+ const card = await this.client.createCard({
20
+ name: this.buildCardName(ticket),
21
+ desc: this.buildCardDesc(ticket),
22
+ closed: this.isCompletedStatus(ticket),
23
+ idList: listId,
24
+ ...(boardId ? { idBoard: boardId } : {}),
25
+ });
26
+ this.mapper.createOrUpdateMapping(ticket.id, card.id, boardId);
27
+ return card.id;
28
+ }
29
+ async syncTicket(ticket, cardId) {
30
+ await this.client.updateCard(cardId, {
31
+ name: this.buildCardName(ticket),
32
+ desc: this.buildCardDesc(ticket),
33
+ closed: this.isCompletedStatus(ticket),
34
+ });
35
+ this.mapper.updateSyncTimestamp(ticket.id);
36
+ }
37
+ }
38
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/lib/trello/sync.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,UAAU;IAEX;IACA;IAFV,YACU,MAAoB,EACpB,MAAoB;QADpB,WAAM,GAAN,MAAM,CAAc;QACpB,WAAM,GAAN,MAAM,CAAc;IAC3B,CAAC;IAEI,aAAa,CAAC,MAAc;QAClC,OAAO,GAAG,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,EAAE,CAAA;IACxC,CAAC;IAEO,aAAa,CAAC,MAAc;QAClC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,0BAA0B,MAAM,CAAC,EAAE,EAAE,CAAC,CAAA;QAClG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;IAChC,CAAC;IAEO,iBAAiB,CAAC,MAAc;QACtC,OAAO,MAAM,CAAC,cAAc,KAAK,WAAW,IAAI,MAAM,CAAC,cAAc,KAAK,UAAU,CAAA;IACtF,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,MAAc,EAAE,MAAc,EAAE,OAAgB;QACxE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;YACxC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YAChC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YAChC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;YACtC,MAAM,EAAE,MAAM;YACd,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzC,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAC9D,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,MAAc;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE;YACnC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YAChC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YAChC,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;SACvC,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC5C,CAAC;CACF"}
@@ -0,0 +1,53 @@
1
+ export interface TrelloConfig {
2
+ apiKey: string;
3
+ apiToken: string;
4
+ boardId?: string;
5
+ boardName?: string;
6
+ }
7
+ export interface TrelloBoard {
8
+ id: string;
9
+ name: string;
10
+ url: string;
11
+ }
12
+ export interface TrelloList {
13
+ id: string;
14
+ name: string;
15
+ }
16
+ export interface TrelloLabel {
17
+ id: string;
18
+ name: string;
19
+ color?: string;
20
+ }
21
+ export interface TrelloMember {
22
+ id: string;
23
+ fullName: string;
24
+ username: string;
25
+ }
26
+ export interface TrelloCard {
27
+ id: string;
28
+ name: string;
29
+ desc: string;
30
+ url: string;
31
+ shortUrl: string;
32
+ idBoard: string;
33
+ idList: string;
34
+ idMembers: string[];
35
+ labels: TrelloLabel[];
36
+ closed: boolean;
37
+ due?: string | null;
38
+ dueComplete?: boolean;
39
+ }
40
+ export interface TrelloCardMap {
41
+ pmoTicketId: string;
42
+ trelloCardId: string;
43
+ trelloBoardId?: string;
44
+ lastSyncedAt?: Date;
45
+ createdAt: Date;
46
+ }
47
+ export interface TrelloCardUpsertInput {
48
+ name: string;
49
+ desc?: string;
50
+ closed?: boolean;
51
+ idList?: string;
52
+ idBoard?: string;
53
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/trello/types.ts"],"names":[],"mappings":""}
@@ -2,6 +2,7 @@ import { buildAsanaMetadata, buildAsanaSpawnContextMessage, buildAsanaTicketDesc
2
2
  import { buildJiraMetadata, buildJiraSpawnContextMessage, buildJiraTicketDescription, getJiraIssueByKey, } from '../external-issues/jira.js';
3
3
  import { buildLinearMetadata, buildLinearSpawnContextMessage, buildLinearTicketDescription, getLinearIssueByIdentifier, } from '../external-issues/linear.js';
4
4
  import { buildShortcutMetadata, buildShortcutSpawnContextMessage, buildShortcutTicketDescription, getShortcutStoryByKey, } from '../external-issues/shortcut.js';
5
+ import { buildTrelloMetadata, buildTrelloSpawnContextMessage, buildTrelloTicketDescription, getTrelloCardById, } from '../external-issues/trello.js';
5
6
  class LinearWorkSourceClient {
6
7
  provider = 'linear';
7
8
  async fetchByKey(key) {
@@ -62,11 +63,27 @@ class ShortcutWorkSourceClient {
62
63
  return buildShortcutSpawnContextMessage(envelope, additionalMessage);
63
64
  }
64
65
  }
66
+ class TrelloWorkSourceClient {
67
+ provider = 'trello';
68
+ async fetchByKey(key) {
69
+ return getTrelloCardById({}, key);
70
+ }
71
+ buildTicketDescription(envelope) {
72
+ return buildTrelloTicketDescription(envelope);
73
+ }
74
+ buildMetadata(envelope) {
75
+ return buildTrelloMetadata(envelope);
76
+ }
77
+ buildSpawnContextMessage(envelope, additionalMessage) {
78
+ return buildTrelloSpawnContextMessage(envelope, additionalMessage);
79
+ }
80
+ }
65
81
  const SOURCE_CLIENTS = {
66
82
  linear: new LinearWorkSourceClient(),
67
83
  jira: new JiraWorkSourceClient(),
68
84
  asana: new AsanaWorkSourceClient(),
69
85
  shortcut: new ShortcutWorkSourceClient(),
86
+ trello: new TrelloWorkSourceClient(),
70
87
  };
71
88
  export function getWorkSourceClient(provider) {
72
89
  return SOURCE_CLIENTS[provider] ?? null;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/work-source/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/work-source/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,6BAA6B,EAC7B,2BAA2B,EAC3B,iBAAiB,GAClB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EACL,iBAAiB,EACjB,4BAA4B,EAC5B,0BAA0B,EAC1B,iBAAiB,GAClB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,mBAAmB,EACnB,8BAA8B,EAC9B,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,qBAAqB,EACrB,gCAAgC,EAChC,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,mBAAmB,EACnB,8BAA8B,EAC9B,4BAA4B,EAC5B,iBAAiB,GAClB,MAAM,8BAA8B,CAAA;AAYrC,MAAM,sBAAsB;IACjB,QAAQ,GAAuB,QAAQ,CAAA;IAEhD,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,OAAO,0BAA0B,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IAC5C,CAAC;IAED,sBAAsB,CAAC,QAAiC;QACtD,OAAO,4BAA4B,CAAC,QAAQ,CAAC,CAAA;IAC/C,CAAC;IAED,aAAa,CAAC,QAAiC;QAC7C,OAAO,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,wBAAwB,CAAC,QAAiC,EAAE,iBAA0B;QACpF,OAAO,8BAA8B,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;IACpE,CAAC;CACF;AAED,MAAM,oBAAoB;IACf,QAAQ,GAAuB,MAAM,CAAA;IAE9C,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,OAAO,iBAAiB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IACnC,CAAC;IAED,sBAAsB,CAAC,QAAiC;QACtD,OAAO,0BAA0B,CAAC,QAAQ,CAAC,CAAA;IAC7C,CAAC;IAED,aAAa,CAAC,QAAiC;QAC7C,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACpC,CAAC;IAED,wBAAwB,CAAC,QAAiC,EAAE,iBAA0B;QACpF,OAAO,4BAA4B,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;IAClE,CAAC;CACF;AAED,MAAM,qBAAqB;IAChB,QAAQ,GAAuB,OAAO,CAAA;IAE/C,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,OAAO,iBAAiB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IACnC,CAAC;IAED,sBAAsB,CAAC,QAAiC;QACtD,OAAO,2BAA2B,CAAC,QAAQ,CAAC,CAAA;IAC9C,CAAC;IAED,aAAa,CAAC,QAAiC;QAC7C,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IACrC,CAAC;IAED,wBAAwB,CAAC,QAAiC,EAAE,iBAA0B;QACpF,OAAO,6BAA6B,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;IACnE,CAAC;CACF;AAED,MAAM,wBAAwB;IACnB,QAAQ,GAAuB,UAAU,CAAA;IAElD,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,OAAO,qBAAqB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IACvC,CAAC;IAED,sBAAsB,CAAC,QAAiC;QACtD,OAAO,8BAA8B,CAAC,QAAQ,CAAC,CAAA;IACjD,CAAC;IAED,aAAa,CAAC,QAAiC;QAC7C,OAAO,qBAAqB,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC;IAED,wBAAwB,CAAC,QAAiC,EAAE,iBAA0B;QACpF,OAAO,gCAAgC,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;IACtE,CAAC;CACF;AAED,MAAM,sBAAsB;IACjB,QAAQ,GAAuB,QAAQ,CAAA;IAEhD,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,OAAO,iBAAiB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IACnC,CAAC;IAED,sBAAsB,CAAC,QAAiC;QACtD,OAAO,4BAA4B,CAAC,QAAQ,CAAC,CAAA;IAC/C,CAAC;IAED,aAAa,CAAC,QAAiC;QAC7C,OAAO,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,wBAAwB,CAAC,QAAiC,EAAE,iBAA0B;QACpF,OAAO,8BAA8B,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;IACpE,CAAC;CACF;AAED,MAAM,cAAc,GAA0D;IAC5E,MAAM,EAAE,IAAI,sBAAsB,EAAE;IACpC,IAAI,EAAE,IAAI,oBAAoB,EAAE;IAChC,KAAK,EAAE,IAAI,qBAAqB,EAAE;IAClC,QAAQ,EAAE,IAAI,wBAAwB,EAAE;IACxC,MAAM,EAAE,IAAI,sBAAsB,EAAE;CACrC,CAAA;AAED,MAAM,UAAU,mBAAmB,CAAC,QAA4B;IAC9D,OAAO,cAAc,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAA;AACzC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import Database from 'better-sqlite3';
2
- export declare const WORK_SOURCE_PROVIDERS: readonly ["pmo", "linear", "jira", "shortcut", "asana", "monday"];
2
+ export declare const WORK_SOURCE_PROVIDERS: readonly ["pmo", "linear", "jira", "shortcut", "asana", "trello", "monday"];
3
3
  export type WorkSourceProvider = typeof WORK_SOURCE_PROVIDERS[number];
4
4
  export interface WorkSourceRef {
5
5
  provider: WorkSourceProvider;
@@ -2,10 +2,12 @@ import { loadAsanaConfig } from '../asana/config.js';
2
2
  import { loadLinearConfig } from '../linear/config.js';
3
3
  import { loadJiraConfig } from '../jira/config.js';
4
4
  import { loadShortcutConfig } from '../shortcut/config.js';
5
+ import { loadTrelloConfig } from '../trello/config.js';
5
6
  import { loadMondayConfig } from '../monday/config.js';
7
+ import { loadProviderSources } from './provider-sources.js';
6
8
  const SETTINGS_TABLE = 'workspace_settings';
7
9
  const ACTIVE_SOURCE_KEY = 'work.active_source';
8
- export const WORK_SOURCE_PROVIDERS = ['pmo', 'linear', 'jira', 'shortcut', 'asana', 'monday'];
10
+ export const WORK_SOURCE_PROVIDERS = ['pmo', 'linear', 'jira', 'shortcut', 'asana', 'trello', 'monday'];
9
11
  function getSetting(db, key) {
10
12
  const row = db
11
13
  .prepare(`SELECT value FROM ${SETTINGS_TABLE} WHERE key = ?`)
@@ -91,6 +93,24 @@ export function getRegisteredWorkSources(db) {
91
93
  context: shortcutConfig.workspaceSlug ?? undefined,
92
94
  });
93
95
  }
96
+ const trelloConfig = loadTrelloConfig(db);
97
+ if (trelloConfig) {
98
+ providers.set('trello', {
99
+ provider: 'trello',
100
+ context: trelloConfig.boardName ?? trelloConfig.boardId ?? undefined,
101
+ });
102
+ }
103
+ // Append multi-source provider entries. These use a composite key
104
+ // (provider + ':' + prefix) so they don't overwrite single-provider
105
+ // entries already in the map.
106
+ const multiSources = loadProviderSources(db);
107
+ for (const source of multiSources) {
108
+ const key = `${source.provider}:${source.prefix}`;
109
+ providers.set(key, {
110
+ provider: source.provider,
111
+ context: source.teamProjectId,
112
+ });
113
+ }
94
114
  return Array.from(providers.values());
95
115
  }
96
116
  /**
@@ -107,6 +127,8 @@ export function getConnectedIntegrations(db) {
107
127
  integrations.push('jira');
108
128
  if (loadShortcutConfig(db))
109
129
  integrations.push('shortcut');
130
+ if (loadTrelloConfig(db))
131
+ integrations.push('trello');
110
132
  if (loadMondayConfig(db))
111
133
  integrations.push('monday');
112
134
  return integrations;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/work-source/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/work-source/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D,MAAM,cAAc,GAAG,oBAAoB,CAAA;AAC3C,MAAM,iBAAiB,GAAG,oBAAoB,CAAA;AAE9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAA;AAQhH,SAAS,UAAU,CAAC,EAAqB,EAAE,GAAW;IACpD,MAAM,GAAG,GAAG,EAAE;SACX,OAAO,CAAC,qBAAqB,cAAc,gBAAgB,CAAC;SAC5D,GAAG,CAAC,GAAG,CAAkC,CAAA;IAC5C,OAAO,GAAG,EAAE,KAAK,IAAI,IAAI,CAAA;AAC3B,CAAC;AAED,SAAS,UAAU,CAAC,EAAqB,EAAE,GAAW,EAAE,KAAa;IACnE,EAAE,CAAC,OAAO,CAAC;kBACK,cAAc;;;GAG7B,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;AACpB,CAAC;AAED,SAAS,aAAa,CAAC,EAAqB,EAAE,GAAW;IACvD,EAAE,CAAC,OAAO,CAAC,eAAe,cAAc,gBAAgB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACpE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAQ,qBAA2C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IACxB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACjD,CAAC;IAED,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACvC,MAAM,YAAY,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;IAC/E,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,CAAA;IAE3C,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,qCAAqC,YAAY,eAAe,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACrH,CAAC;IAED,MAAM,UAAU,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACpF,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;IAE9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;AAC9B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAqB;IACvD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAqB,EAAE,MAAqB;IAC/E,UAAU,CAAC,EAAE,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAA;AAChE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAqB;IACzD,aAAa,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAqB;IACxD,MAAM,GAAG,GAAG,UAAU,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAA;IAC7C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IAErB,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,EAAqB;IAC5D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqC,CAAA;IAC9D,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;IAEzC,MAAM,YAAY,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAA;IACzC,IAAI,YAAY,EAAE,CAAC;QACjB,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE;YACtB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,YAAY,CAAC,cAAc,IAAI,SAAS;SAClD,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,cAAc,CAAC,EAAE,CAAC,CAAA;IACrC,IAAI,UAAU,EAAE,CAAC;QACf,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE;YACpB,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,UAAU,CAAC,UAAU,IAAI,SAAS;SAC5C,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,EAAE,CAAC,CAAA;IACvC,IAAI,WAAW,EAAE,CAAC;QAChB,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE;YACrB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,UAAU,IAAI,SAAS;SACxE,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAA;IAC7C,IAAI,cAAc,EAAE,CAAC;QACnB,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE;YACxB,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE,cAAc,CAAC,aAAa,IAAI,SAAS;SACnD,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAA;IACzC,IAAI,YAAY,EAAE,CAAC;QACjB,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE;YACtB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,YAAY,CAAC,SAAS,IAAI,YAAY,CAAC,OAAO,IAAI,SAAS;SACrE,CAAC,CAAA;IACJ,CAAC;IAED,kEAAkE;IAClE,oEAAoE;IACpE,8BAA8B;IAC9B,MAAM,YAAY,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAA;IAC5C,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAwB,CAAA;QACvE,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,aAAa;SAC9B,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAA;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,EAAqB;IAC5D,MAAM,YAAY,GAAa,EAAE,CAAA;IAEjC,IAAI,eAAe,CAAC,EAAE,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnD,IAAI,gBAAgB,CAAC,EAAE,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACrD,IAAI,cAAc,CAAC,EAAE,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACjD,IAAI,kBAAkB,CAAC,EAAE,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACzD,IAAI,gBAAgB,CAAC,EAAE,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACrD,IAAI,gBAAgB,CAAC,EAAE,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAErD,OAAO,YAAY,CAAA;AACrB,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export { WORK_SOURCE_PROVIDERS, type WorkSourceProvider, type WorkSourceRef, isWorkSourceProvider, parseWorkSourceRef, formatWorkSourceRef, saveActiveWorkSource, clearActiveWorkSource, loadActiveWorkSource, getRegisteredWorkSources, getConnectedIntegrations, } from './config.js';
2
2
  export { type WorkSourceClient, getWorkSourceClient, } from './client.js';
3
+ export { type ProviderSourceEntry, type ProviderSourceValidationError, validateProviderSourceEntry, loadProviderSources, saveProviderSources, addProviderSource, updateProviderSource, removeProviderSource, getProviderSourceById, resolveProviderByPrefix, resolveProviderByPrefixFromList, getRoutingTable, resolveApiKey, } from './provider-sources.js';
@@ -1,3 +1,4 @@
1
1
  export { WORK_SOURCE_PROVIDERS, isWorkSourceProvider, parseWorkSourceRef, formatWorkSourceRef, saveActiveWorkSource, clearActiveWorkSource, loadActiveWorkSource, getRegisteredWorkSources, getConnectedIntegrations, } from './config.js';
2
2
  export { getWorkSourceClient, } from './client.js';
3
+ export { validateProviderSourceEntry, loadProviderSources, saveProviderSources, addProviderSource, updateProviderSource, removeProviderSource, getProviderSourceById, resolveProviderByPrefix, resolveProviderByPrefixFromList, getRoutingTable, resolveApiKey, } from './provider-sources.js';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/work-source/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAGrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,aAAa,CAAA;AACpB,OAAO,EAEL,mBAAmB,GACpB,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/work-source/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAGrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,aAAa,CAAA;AACpB,OAAO,EAEL,mBAAmB,GACpB,MAAM,aAAa,CAAA;AACpB,OAAO,EAGL,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,+BAA+B,EAC/B,eAAe,EACf,aAAa,GACd,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Multi-Source Provider Configuration
3
+ *
4
+ * Allows a workspace to have multiple external ticket providers configured
5
+ * simultaneously (e.g. Linear for engineering, Asana for product, Shortcut
6
+ * for design). Each source entry includes a provider type, API key reference,
7
+ * team/project ID, and an identifier prefix used for routing ticket keys to
8
+ * the correct provider.
9
+ *
10
+ * Stored as a JSON array in workspace_settings under the key
11
+ * `work.provider_sources`.
12
+ */
13
+ import Database from 'better-sqlite3';
14
+ import type { WorkSourceProvider } from './config.js';
15
+ /**
16
+ * A single provider source entry in the multi-source configuration.
17
+ *
18
+ * Example: { id: 'eng-linear', provider: 'linear', apiKeyRef: 'linear.api_key',
19
+ * teamProjectId: 'ENG', prefix: 'ENG-', label: 'Engineering' }
20
+ */
21
+ export interface ProviderSourceEntry {
22
+ /** Unique identifier for this source config (user-chosen, slug-like) */
23
+ id: string;
24
+ /** Provider type (linear, jira, asana, shortcut, trello, monday) */
25
+ provider: WorkSourceProvider;
26
+ /**
27
+ * Reference to the API key. Can be:
28
+ * - A workspace_settings key (e.g. 'linear.api_key')
29
+ * - An environment variable name (e.g. 'PRLT_LINEAR_API_KEY')
30
+ */
31
+ apiKeyRef: string;
32
+ /**
33
+ * Team or project identifier in the external system.
34
+ * e.g. Linear team key 'ENG', Jira project key 'PROJ', Asana project GID.
35
+ */
36
+ teamProjectId: string;
37
+ /**
38
+ * Prefix used for routing ticket keys to this provider.
39
+ * e.g. 'ENG-' means ticket keys starting with 'ENG-' route to this source.
40
+ * Must end with a separator character (typically '-').
41
+ */
42
+ prefix: string;
43
+ /** Optional human-readable label for display purposes */
44
+ label?: string;
45
+ }
46
+ export interface ProviderSourceValidationError {
47
+ field: string;
48
+ message: string;
49
+ }
50
+ export declare function validateProviderSourceEntry(entry: Partial<ProviderSourceEntry>): ProviderSourceValidationError[];
51
+ /**
52
+ * Load all provider source entries from the database.
53
+ * Returns an empty array if none are configured.
54
+ */
55
+ export declare function loadProviderSources(db: Database.Database): ProviderSourceEntry[];
56
+ /**
57
+ * Save the full list of provider source entries to the database.
58
+ */
59
+ export declare function saveProviderSources(db: Database.Database, sources: ProviderSourceEntry[]): void;
60
+ /**
61
+ * Add a new provider source entry. Returns validation errors if invalid,
62
+ * or throws if an entry with the same id already exists.
63
+ */
64
+ export declare function addProviderSource(db: Database.Database, entry: ProviderSourceEntry): ProviderSourceValidationError[];
65
+ /**
66
+ * Update an existing provider source entry by id.
67
+ * Returns validation errors if the update is invalid, or if the entry is not found.
68
+ */
69
+ export declare function updateProviderSource(db: Database.Database, id: string, updates: Partial<Omit<ProviderSourceEntry, 'id'>>): ProviderSourceValidationError[];
70
+ /**
71
+ * Remove a provider source entry by id.
72
+ * Returns true if removed, false if not found.
73
+ */
74
+ export declare function removeProviderSource(db: Database.Database, id: string): boolean;
75
+ /**
76
+ * Get a single provider source entry by id.
77
+ */
78
+ export declare function getProviderSourceById(db: Database.Database, id: string): ProviderSourceEntry | null;
79
+ /**
80
+ * Resolve which provider source should handle a given ticket key based on
81
+ * its prefix. Matching is case-insensitive and selects the longest matching
82
+ * prefix (most specific match wins).
83
+ *
84
+ * Example: given sources with prefixes ['ENG-', 'PROD-', 'DES-'],
85
+ * resolveProviderByPrefix(db, 'ENG-123') → source with prefix 'ENG-'
86
+ * resolveProviderByPrefix(db, 'PROD-456') → source with prefix 'PROD-'
87
+ * resolveProviderByPrefix(db, 'UNKNOWN-789') → null
88
+ */
89
+ export declare function resolveProviderByPrefix(db: Database.Database, ticketKey: string): ProviderSourceEntry | null;
90
+ /**
91
+ * Pure function variant that operates on an in-memory list of sources.
92
+ * Useful for testing and batch operations.
93
+ */
94
+ export declare function resolveProviderByPrefixFromList(sources: ProviderSourceEntry[], ticketKey: string): ProviderSourceEntry | null;
95
+ /**
96
+ * Get all configured prefixes and their provider mappings.
97
+ * Useful for displaying the routing table to the user.
98
+ */
99
+ export declare function getRoutingTable(db: Database.Database): Array<{
100
+ prefix: string;
101
+ provider: WorkSourceProvider;
102
+ label: string;
103
+ id: string;
104
+ }>;
105
+ /**
106
+ * Resolve the actual API key value from a ProviderSourceEntry's apiKeyRef.
107
+ *
108
+ * Resolution order:
109
+ * 1. If apiKeyRef matches an environment variable name, use its value
110
+ * 2. If apiKeyRef matches a workspace_settings key, use its value
111
+ * 3. Return null if neither resolves
112
+ */
113
+ export declare function resolveApiKey(db: Database.Database, entry: ProviderSourceEntry): string | null;