@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
|
@@ -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 @@
|
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/work-source/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/work-source/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|