@proletariat/cli 0.3.58 → 0.3.59
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/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/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/mapping-store.js +1 -1
- 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/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 +11 -1
- package/dist/lib/work-source/config.js.map +1 -1
- package/oclif.manifest.json +3460 -3476
- 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,114 @@
|
|
|
1
|
+
export class TrelloClient {
|
|
2
|
+
apiKey;
|
|
3
|
+
apiToken;
|
|
4
|
+
baseUrl = 'https://api.trello.com/1';
|
|
5
|
+
constructor(apiKey, apiToken) {
|
|
6
|
+
this.apiKey = apiKey;
|
|
7
|
+
this.apiToken = apiToken;
|
|
8
|
+
}
|
|
9
|
+
async request(path, init = {}) {
|
|
10
|
+
const url = new URL(`${this.baseUrl}${path}`);
|
|
11
|
+
url.searchParams.set('key', this.apiKey);
|
|
12
|
+
url.searchParams.set('token', this.apiToken);
|
|
13
|
+
if (init.query) {
|
|
14
|
+
for (const [key, value] of Object.entries(init.query)) {
|
|
15
|
+
if (value !== undefined) {
|
|
16
|
+
url.searchParams.set(key, String(value));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const response = await fetch(url, {
|
|
21
|
+
method: init.method ?? 'GET',
|
|
22
|
+
headers: {
|
|
23
|
+
'Content-Type': 'application/json',
|
|
24
|
+
},
|
|
25
|
+
body: init.body ? JSON.stringify(init.body) : undefined,
|
|
26
|
+
});
|
|
27
|
+
if (response.status === 401) {
|
|
28
|
+
throw new Error('Trello authentication failed. Verify your API key and token.');
|
|
29
|
+
}
|
|
30
|
+
if (response.status === 429) {
|
|
31
|
+
throw new Error('Trello API rate limit exceeded. Wait a moment and try again.');
|
|
32
|
+
}
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
const text = await response.text().catch(() => '');
|
|
35
|
+
throw new Error(`Trello API request failed (${response.status}): ${text}`);
|
|
36
|
+
}
|
|
37
|
+
return response.json();
|
|
38
|
+
}
|
|
39
|
+
async verify() {
|
|
40
|
+
return this.request('/members/me', {
|
|
41
|
+
query: { fields: 'id,fullName,username' },
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async getCard(cardId) {
|
|
45
|
+
try {
|
|
46
|
+
return await this.request(`/cards/${cardId}`, {
|
|
47
|
+
query: { fields: 'id,name,desc,url,shortUrl,idBoard,idList,idMembers,closed,due,dueComplete', members: true, member_fields: 'fullName,username', labels: 'all' },
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async searchCards(query, options) {
|
|
55
|
+
const limit = Math.max(1, Math.min(options?.limit ?? 20, 100));
|
|
56
|
+
const result = await this.request('/search', {
|
|
57
|
+
query: {
|
|
58
|
+
query,
|
|
59
|
+
modelTypes: 'cards',
|
|
60
|
+
cards_limit: limit,
|
|
61
|
+
card_fields: 'id,name,desc,url,shortUrl,idBoard,idList,idMembers,closed,due,dueComplete',
|
|
62
|
+
card_members: true,
|
|
63
|
+
card_member_fields: 'fullName,username',
|
|
64
|
+
card_labels: 'all',
|
|
65
|
+
...(options?.boardId ? { idBoards: options.boardId } : {}),
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
return result.cards ?? [];
|
|
69
|
+
}
|
|
70
|
+
async getBoard(boardId) {
|
|
71
|
+
try {
|
|
72
|
+
return await this.request(`/boards/${boardId}`, {
|
|
73
|
+
query: { fields: 'id,name,url' },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async getBoardLists(boardId) {
|
|
81
|
+
return this.request(`/boards/${boardId}/lists`, {
|
|
82
|
+
query: { fields: 'id,name' },
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async getBoardCards(boardId, options) {
|
|
86
|
+
const filter = options?.filter ?? 'open';
|
|
87
|
+
return this.request(`/boards/${boardId}/cards/${filter}`, {
|
|
88
|
+
query: {
|
|
89
|
+
fields: 'id,name,desc,url,shortUrl,idBoard,idList,idMembers,closed,due,dueComplete',
|
|
90
|
+
members: true,
|
|
91
|
+
member_fields: 'fullName,username',
|
|
92
|
+
labels: 'all',
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async getBoards() {
|
|
97
|
+
return this.request('/members/me/boards', {
|
|
98
|
+
query: { fields: 'id,name,url', filter: 'open' },
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
async createCard(input) {
|
|
102
|
+
return this.request('/cards', {
|
|
103
|
+
method: 'POST',
|
|
104
|
+
body: input,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
async updateCard(cardId, input) {
|
|
108
|
+
return this.request(`/cards/${cardId}`, {
|
|
109
|
+
method: 'PUT',
|
|
110
|
+
body: input,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/lib/trello/client.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,YAAY;IAIb;IACA;IAJO,OAAO,GAAG,0BAA0B,CAAA;IAErD,YACU,MAAc,EACd,QAAgB;QADhB,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAQ;IACvB,CAAC;IAEI,KAAK,CAAC,OAAO,CACnB,IAAY,EACZ,OAII,EAAE;QAEN,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAA;QAC7C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACxC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE5C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;YAC5B,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SACxD,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;QACjF,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;QACjF,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;YAClD,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAA;QAC5E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,OAAO,CAAe,aAAa,EAAE;YAC/C,KAAK,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE;SAC1C,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAa,UAAU,MAAM,EAAE,EAAE;gBACxD,KAAK,EAAE,EAAE,MAAM,EAAE,2EAA2E,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE;aACjK,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,OAA8C;QAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAuB,SAAS,EAAE;YACjE,KAAK,EAAE;gBACL,KAAK;gBACL,UAAU,EAAE,OAAO;gBACnB,WAAW,EAAE,KAAK;gBAClB,WAAW,EAAE,2EAA2E;gBACxF,YAAY,EAAE,IAAI;gBAClB,kBAAkB,EAAE,mBAAmB;gBACvC,WAAW,EAAE,KAAK;gBAClB,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D;SACF,CAAC,CAAA;QACF,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAc,WAAW,OAAO,EAAE,EAAE;gBAC3D,KAAK,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;aACjC,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,OAAO,IAAI,CAAC,OAAO,CAAe,WAAW,OAAO,QAAQ,EAAE;YAC5D,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;SAC7B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,OAA6C;QAChF,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,MAAM,CAAA;QACxC,OAAO,IAAI,CAAC,OAAO,CAAe,WAAW,OAAO,UAAU,MAAM,EAAE,EAAE;YACtE,KAAK,EAAE;gBACL,MAAM,EAAE,2EAA2E;gBACnF,OAAO,EAAE,IAAI;gBACb,aAAa,EAAE,mBAAmB;gBAClC,MAAM,EAAE,KAAK;aACd;SACF,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,OAAO,CAAgB,oBAAoB,EAAE;YACvD,KAAK,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE;SACjD,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAA4B;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAa,QAAQ,EAAE;YACxC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,KAAK;SACZ,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,KAA4B;QAC3D,OAAO,IAAI,CAAC,OAAO,CAAa,UAAU,MAAM,EAAE,EAAE;YAClD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,KAAK;SACZ,CAAC,CAAA;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
import Database from 'better-sqlite3';
|
|
8
|
+
export interface TrelloConfig {
|
|
9
|
+
apiKey: string;
|
|
10
|
+
apiToken: string;
|
|
11
|
+
boardId?: string;
|
|
12
|
+
boardName?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if Trello is configured.
|
|
16
|
+
* Returns true if either:
|
|
17
|
+
* - Database has trello.api_key and trello.api_token stored, OR
|
|
18
|
+
* - Environment variables PRLT_TRELLO_API_KEY/TRELLO_API_KEY and PRLT_TRELLO_API_TOKEN/TRELLO_API_TOKEN are set
|
|
19
|
+
*/
|
|
20
|
+
export declare function isTrelloConfigured(db: Database.Database): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Load Trello configuration from the database + environment.
|
|
23
|
+
* Returns null if not configured.
|
|
24
|
+
*/
|
|
25
|
+
export declare function loadTrelloConfig(db: Database.Database): TrelloConfig | null;
|
|
26
|
+
/**
|
|
27
|
+
* Save Trello configuration to the database.
|
|
28
|
+
*/
|
|
29
|
+
export declare function saveTrelloConfig(db: Database.Database, config: TrelloConfig): void;
|
|
30
|
+
/**
|
|
31
|
+
* Save the Trello API key.
|
|
32
|
+
*/
|
|
33
|
+
export declare function saveTrelloApiKey(db: Database.Database, apiKey: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Save the Trello API token.
|
|
36
|
+
*/
|
|
37
|
+
export declare function saveTrelloApiToken(db: Database.Database, apiToken: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Save the Trello board.
|
|
40
|
+
*/
|
|
41
|
+
export declare function saveTrelloBoard(db: Database.Database, boardId: string, boardName: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Clear all Trello configuration from the database.
|
|
44
|
+
*/
|
|
45
|
+
export declare function clearTrelloConfig(db: Database.Database): void;
|
|
46
|
+
/**
|
|
47
|
+
* Get the stored Trello API key.
|
|
48
|
+
* Also checks PRLT_TRELLO_API_KEY and TRELLO_API_KEY environment variables.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getTrelloApiKey(db: Database.Database): string | null;
|
|
51
|
+
/**
|
|
52
|
+
* Get the stored Trello API token.
|
|
53
|
+
* Also checks PRLT_TRELLO_API_TOKEN and TRELLO_API_TOKEN environment variables.
|
|
54
|
+
*/
|
|
55
|
+
export declare function getTrelloApiToken(db: Database.Database): string | null;
|
|
@@ -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,11 @@ 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';
|
|
6
7
|
const SETTINGS_TABLE = 'workspace_settings';
|
|
7
8
|
const ACTIVE_SOURCE_KEY = 'work.active_source';
|
|
8
|
-
export const WORK_SOURCE_PROVIDERS = ['pmo', 'linear', 'jira', 'shortcut', 'asana', 'monday'];
|
|
9
|
+
export const WORK_SOURCE_PROVIDERS = ['pmo', 'linear', 'jira', 'shortcut', 'asana', 'trello', 'monday'];
|
|
9
10
|
function getSetting(db, key) {
|
|
10
11
|
const row = db
|
|
11
12
|
.prepare(`SELECT value FROM ${SETTINGS_TABLE} WHERE key = ?`)
|
|
@@ -91,6 +92,13 @@ export function getRegisteredWorkSources(db) {
|
|
|
91
92
|
context: shortcutConfig.workspaceSlug ?? undefined,
|
|
92
93
|
});
|
|
93
94
|
}
|
|
95
|
+
const trelloConfig = loadTrelloConfig(db);
|
|
96
|
+
if (trelloConfig) {
|
|
97
|
+
providers.set('trello', {
|
|
98
|
+
provider: 'trello',
|
|
99
|
+
context: trelloConfig.boardName ?? trelloConfig.boardId ?? undefined,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
94
102
|
return Array.from(providers.values());
|
|
95
103
|
}
|
|
96
104
|
/**
|
|
@@ -107,6 +115,8 @@ export function getConnectedIntegrations(db) {
|
|
|
107
115
|
integrations.push('jira');
|
|
108
116
|
if (loadShortcutConfig(db))
|
|
109
117
|
integrations.push('shortcut');
|
|
118
|
+
if (loadTrelloConfig(db))
|
|
119
|
+
integrations.push('trello');
|
|
110
120
|
if (loadMondayConfig(db))
|
|
111
121
|
integrations.push('monday');
|
|
112
122
|
return integrations;
|