@coralai/sps-cli 0.49.0 → 0.49.1

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 (155) hide show
  1. package/dist/console-assets/assets/{index-C7skV1yt.js → index-Co0H5e5_.js} +14 -14
  2. package/dist/console-assets/index.html +1 -1
  3. package/package.json +1 -1
  4. package/dist/commands/cardMarkComplete.test.d.ts +0 -2
  5. package/dist/commands/cardMarkComplete.test.d.ts.map +0 -1
  6. package/dist/commands/cardMarkComplete.test.js +0 -142
  7. package/dist/commands/cardMarkComplete.test.js.map +0 -1
  8. package/dist/commands/cardMarkStarted.test.d.ts +0 -2
  9. package/dist/commands/cardMarkStarted.test.d.ts.map +0 -1
  10. package/dist/commands/cardMarkStarted.test.js +0 -98
  11. package/dist/commands/cardMarkStarted.test.js.map +0 -1
  12. package/dist/commands/projectInit.test.d.ts +0 -2
  13. package/dist/commands/projectInit.test.d.ts.map +0 -1
  14. package/dist/commands/projectInit.test.js +0 -126
  15. package/dist/commands/projectInit.test.js.map +0 -1
  16. package/dist/commands/tick-heartbeat.test.d.ts +0 -2
  17. package/dist/commands/tick-heartbeat.test.d.ts.map +0 -1
  18. package/dist/commands/tick-heartbeat.test.js +0 -89
  19. package/dist/commands/tick-heartbeat.test.js.map +0 -1
  20. package/dist/console-server/routes/chat.test.d.ts +0 -2
  21. package/dist/console-server/routes/chat.test.d.ts.map +0 -1
  22. package/dist/console-server/routes/chat.test.js +0 -131
  23. package/dist/console-server/routes/chat.test.js.map +0 -1
  24. package/dist/console-server/routes/projects.test.d.ts +0 -2
  25. package/dist/console-server/routes/projects.test.d.ts.map +0 -1
  26. package/dist/console-server/routes/projects.test.js +0 -150
  27. package/dist/console-server/routes/projects.test.js.map +0 -1
  28. package/dist/console-server/routes/system.test.d.ts +0 -2
  29. package/dist/console-server/routes/system.test.d.ts.map +0 -1
  30. package/dist/console-server/routes/system.test.js +0 -107
  31. package/dist/console-server/routes/system.test.js.map +0 -1
  32. package/dist/core/checklist.test.d.ts +0 -2
  33. package/dist/core/checklist.test.d.ts.map +0 -1
  34. package/dist/core/checklist.test.js +0 -74
  35. package/dist/core/checklist.test.js.map +0 -1
  36. package/dist/core/config.test.d.ts +0 -2
  37. package/dist/core/config.test.d.ts.map +0 -1
  38. package/dist/core/config.test.js +0 -352
  39. package/dist/core/config.test.js.map +0 -1
  40. package/dist/core/lock.test.d.ts +0 -2
  41. package/dist/core/lock.test.d.ts.map +0 -1
  42. package/dist/core/lock.test.js +0 -118
  43. package/dist/core/lock.test.js.map +0 -1
  44. package/dist/core/markerFile.test.d.ts +0 -2
  45. package/dist/core/markerFile.test.d.ts.map +0 -1
  46. package/dist/core/markerFile.test.js +0 -111
  47. package/dist/core/markerFile.test.js.map +0 -1
  48. package/dist/core/queue.test.d.ts +0 -2
  49. package/dist/core/queue.test.d.ts.map +0 -1
  50. package/dist/core/queue.test.js +0 -114
  51. package/dist/core/queue.test.js.map +0 -1
  52. package/dist/core/sessionCleanup.test.d.ts +0 -2
  53. package/dist/core/sessionCleanup.test.d.ts.map +0 -1
  54. package/dist/core/sessionCleanup.test.js +0 -158
  55. package/dist/core/sessionCleanup.test.js.map +0 -1
  56. package/dist/core/shellEnv.test.d.ts +0 -2
  57. package/dist/core/shellEnv.test.d.ts.map +0 -1
  58. package/dist/core/shellEnv.test.js +0 -116
  59. package/dist/core/shellEnv.test.js.map +0 -1
  60. package/dist/core/skillStore.test.d.ts +0 -2
  61. package/dist/core/skillStore.test.d.ts.map +0 -1
  62. package/dist/core/skillStore.test.js +0 -203
  63. package/dist/core/skillStore.test.js.map +0 -1
  64. package/dist/core/state.test.d.ts +0 -2
  65. package/dist/core/state.test.d.ts.map +0 -1
  66. package/dist/core/state.test.js +0 -336
  67. package/dist/core/state.test.js.map +0 -1
  68. package/dist/engines/CloseoutEngine.d.ts +0 -72
  69. package/dist/engines/CloseoutEngine.d.ts.map +0 -1
  70. package/dist/engines/CloseoutEngine.js +0 -648
  71. package/dist/engines/CloseoutEngine.js.map +0 -1
  72. package/dist/engines/EventHandler.test.d.ts +0 -2
  73. package/dist/engines/EventHandler.test.d.ts.map +0 -1
  74. package/dist/engines/EventHandler.test.js +0 -169
  75. package/dist/engines/EventHandler.test.js.map +0 -1
  76. package/dist/engines/ExecutionEngine.d.ts +0 -125
  77. package/dist/engines/ExecutionEngine.d.ts.map +0 -1
  78. package/dist/engines/ExecutionEngine.js +0 -766
  79. package/dist/engines/ExecutionEngine.js.map +0 -1
  80. package/dist/engines/MonitorEngine.test.d.ts +0 -2
  81. package/dist/engines/MonitorEngine.test.d.ts.map +0 -1
  82. package/dist/engines/MonitorEngine.test.js +0 -355
  83. package/dist/engines/MonitorEngine.test.js.map +0 -1
  84. package/dist/engines/engine-pipeline-adapter.test.d.ts +0 -17
  85. package/dist/engines/engine-pipeline-adapter.test.d.ts.map +0 -1
  86. package/dist/engines/engine-pipeline-adapter.test.js +0 -707
  87. package/dist/engines/engine-pipeline-adapter.test.js.map +0 -1
  88. package/dist/interfaces/HookProvider.d.ts +0 -9
  89. package/dist/interfaces/HookProvider.d.ts.map +0 -1
  90. package/dist/interfaces/HookProvider.js +0 -2
  91. package/dist/interfaces/HookProvider.js.map +0 -1
  92. package/dist/manager/completion-judge.test.d.ts +0 -17
  93. package/dist/manager/completion-judge.test.d.ts.map +0 -1
  94. package/dist/manager/completion-judge.test.js +0 -233
  95. package/dist/manager/completion-judge.test.js.map +0 -1
  96. package/dist/manager/integration-queue.d.ts +0 -71
  97. package/dist/manager/integration-queue.d.ts.map +0 -1
  98. package/dist/manager/integration-queue.js +0 -137
  99. package/dist/manager/integration-queue.js.map +0 -1
  100. package/dist/manager/integration-queue.test.d.ts +0 -17
  101. package/dist/manager/integration-queue.test.d.ts.map +0 -1
  102. package/dist/manager/integration-queue.test.js +0 -210
  103. package/dist/manager/integration-queue.test.js.map +0 -1
  104. package/dist/manager/pm-client.d.ts +0 -10
  105. package/dist/manager/pm-client.d.ts.map +0 -1
  106. package/dist/manager/pm-client.js +0 -260
  107. package/dist/manager/pm-client.js.map +0 -1
  108. package/dist/manager/resource-limiter.d.ts +0 -56
  109. package/dist/manager/resource-limiter.d.ts.map +0 -1
  110. package/dist/manager/resource-limiter.js +0 -116
  111. package/dist/manager/resource-limiter.js.map +0 -1
  112. package/dist/manager/resource-limiter.test.d.ts +0 -17
  113. package/dist/manager/resource-limiter.test.d.ts.map +0 -1
  114. package/dist/manager/resource-limiter.test.js +0 -118
  115. package/dist/manager/resource-limiter.test.js.map +0 -1
  116. package/dist/manager/supervisor.test.d.ts +0 -17
  117. package/dist/manager/supervisor.test.d.ts.map +0 -1
  118. package/dist/manager/supervisor.test.js +0 -216
  119. package/dist/manager/supervisor.test.js.map +0 -1
  120. package/dist/manager/worker-manager-impl.test.d.ts +0 -17
  121. package/dist/manager/worker-manager-impl.test.d.ts.map +0 -1
  122. package/dist/manager/worker-manager-impl.test.js +0 -446
  123. package/dist/manager/worker-manager-impl.test.js.map +0 -1
  124. package/dist/providers/PlaneTaskBackend.d.ts +0 -83
  125. package/dist/providers/PlaneTaskBackend.d.ts.map +0 -1
  126. package/dist/providers/PlaneTaskBackend.js +0 -461
  127. package/dist/providers/PlaneTaskBackend.js.map +0 -1
  128. package/dist/providers/TrelloTaskBackend.d.ts +0 -64
  129. package/dist/providers/TrelloTaskBackend.d.ts.map +0 -1
  130. package/dist/providers/TrelloTaskBackend.js +0 -298
  131. package/dist/providers/TrelloTaskBackend.js.map +0 -1
  132. package/dist/providers/adapters/acp-fs-handlers.test.d.ts +0 -2
  133. package/dist/providers/adapters/acp-fs-handlers.test.d.ts.map +0 -1
  134. package/dist/providers/adapters/acp-fs-handlers.test.js +0 -80
  135. package/dist/providers/adapters/acp-fs-handlers.test.js.map +0 -1
  136. package/dist/providers/adapters/acp-permissions.test.d.ts +0 -2
  137. package/dist/providers/adapters/acp-permissions.test.d.ts.map +0 -1
  138. package/dist/providers/adapters/acp-permissions.test.js +0 -103
  139. package/dist/providers/adapters/acp-permissions.test.js.map +0 -1
  140. package/dist/providers/adapters/acp-session-accumulator.test.d.ts +0 -2
  141. package/dist/providers/adapters/acp-session-accumulator.test.d.ts.map +0 -1
  142. package/dist/providers/adapters/acp-session-accumulator.test.js +0 -88
  143. package/dist/providers/adapters/acp-session-accumulator.test.js.map +0 -1
  144. package/dist/providers/adapters/acp-terminal-manager.test.d.ts +0 -2
  145. package/dist/providers/adapters/acp-terminal-manager.test.d.ts.map +0 -1
  146. package/dist/providers/adapters/acp-terminal-manager.test.js +0 -86
  147. package/dist/providers/adapters/acp-terminal-manager.test.js.map +0 -1
  148. package/dist/providers/outputParser.test.d.ts +0 -2
  149. package/dist/providers/outputParser.test.d.ts.map +0 -1
  150. package/dist/providers/outputParser.test.js +0 -185
  151. package/dist/providers/outputParser.test.js.map +0 -1
  152. package/dist/test-setup.d.ts +0 -2
  153. package/dist/test-setup.d.ts.map +0 -1
  154. package/dist/test-setup.js +0 -27
  155. package/dist/test-setup.js.map +0 -1
@@ -1,461 +0,0 @@
1
- /**
2
- * @module PlaneTaskBackend
3
- * @description Plane 项目管理平台的任务后端实现,通过 REST API 同步卡片状态
4
- *
5
- * @author eddy
6
- * @organization wykj
7
- * @ownership wykj/eddy
8
- *
9
- * @created 2026-03-19
10
- * @updated 2026-04-03
11
- *
12
- * @role provider
13
- * @layer provider
14
- * @boundedContext task
15
- */
16
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
17
- import { resolve } from 'node:path';
18
- const ALL_STATES = ['Planning', 'Backlog', 'Todo', 'Inprogress', 'QA', 'Done'];
19
- export class PlaneTaskBackend {
20
- apiUrl;
21
- apiKey;
22
- workspaceSlug;
23
- projectId;
24
- projectName;
25
- pmMetaDir;
26
- /** Map CardState → Plane state UUID */
27
- stateMap;
28
- /** Reverse map: Plane state UUID → CardState */
29
- reverseStateMap;
30
- /** Cache: label name → label UUID (populated lazily) */
31
- labelCache = null;
32
- constructor(config) {
33
- const raw = config.raw;
34
- this.apiUrl = raw.PLANE_API_URL || raw.PLANE_URL || '';
35
- this.apiKey = raw.PLANE_API_KEY || '';
36
- this.workspaceSlug = raw.PLANE_WORKSPACE_SLUG || '';
37
- if (!this.apiUrl)
38
- throw new Error('Missing PLANE_API_URL or PLANE_URL (set in ~/.coral/env or project conf)');
39
- if (!this.apiKey)
40
- throw new Error('Missing PLANE_API_KEY (set in ~/.coral/env)');
41
- if (!this.workspaceSlug)
42
- throw new Error('Missing PLANE_WORKSPACE_SLUG (set in ~/.coral/env)');
43
- this.projectId = required(raw, 'PLANE_PROJECT_ID');
44
- this.projectName = config.PROJECT_NAME;
45
- this.pmMetaDir = resolve(process.env.HOME || '/home/coral', '.coral', 'projects', this.projectName, 'pm_meta');
46
- this.stateMap = {
47
- Planning: required(raw, 'PLANE_STATE_PLANNING'),
48
- Backlog: required(raw, 'PLANE_STATE_BACKLOG'),
49
- Todo: required(raw, 'PLANE_STATE_TODO'),
50
- Inprogress: required(raw, 'PLANE_STATE_INPROGRESS'),
51
- QA: required(raw, 'PLANE_STATE_QA'),
52
- Done: required(raw, 'PLANE_STATE_DONE'),
53
- };
54
- this.reverseStateMap = new Map();
55
- for (const state of ALL_STATES) {
56
- this.reverseStateMap.set(this.stateMap[state], state);
57
- }
58
- }
59
- // ---------------------------------------------------------------------------
60
- // Plane API helpers
61
- // ---------------------------------------------------------------------------
62
- /** Base URL for project-scoped endpoints. */
63
- get baseUrl() {
64
- return `${this.apiUrl}/api/v1/workspaces/${this.workspaceSlug}/projects/${this.projectId}`;
65
- }
66
- /** Standard headers for every Plane request. */
67
- get headers() {
68
- return {
69
- 'X-API-Key': this.apiKey,
70
- 'Content-Type': 'application/json',
71
- };
72
- }
73
- /**
74
- * Generic Plane API request wrapper.
75
- * Throws on non-2xx responses with a descriptive message.
76
- */
77
- async request(method, path, body) {
78
- const url = `${this.baseUrl}${path}`;
79
- const init = {
80
- method,
81
- headers: this.headers,
82
- };
83
- if (body !== undefined) {
84
- init.body = JSON.stringify(body);
85
- }
86
- const maxRetries = 3;
87
- for (let attempt = 0; attempt < maxRetries; attempt++) {
88
- try {
89
- const res = await fetch(url, init);
90
- if (res.ok) {
91
- const text = await res.text();
92
- if (!text)
93
- return undefined;
94
- return JSON.parse(text);
95
- }
96
- // Retry on 5xx or 429 (rate limit), fail immediately on 4xx
97
- if ((res.status >= 500 || res.status === 429) && attempt < maxRetries - 1) {
98
- const delay = 1000 * Math.pow(2, attempt); // 1s, 2s, 4s
99
- process.stderr.write(`[plane] ${method} ${path} returned ${res.status}, retrying in ${delay}ms (attempt ${attempt + 1}/${maxRetries})\n`);
100
- await new Promise(r => setTimeout(r, delay));
101
- continue;
102
- }
103
- const text = await res.text().catch(() => '');
104
- throw new Error(`Plane API ${method} ${path} failed (${res.status}): ${text}`);
105
- }
106
- catch (err) {
107
- // Retry on network errors (ECONNRESET, ETIMEDOUT, etc.)
108
- if (attempt < maxRetries - 1 && err instanceof TypeError) {
109
- const delay = 1000 * Math.pow(2, attempt);
110
- process.stderr.write(`[plane] ${method} ${path} network error, retrying in ${delay}ms (attempt ${attempt + 1}/${maxRetries})\n`);
111
- await new Promise(r => setTimeout(r, delay));
112
- continue;
113
- }
114
- throw err;
115
- }
116
- }
117
- throw new Error(`Plane API ${method} ${path} failed after ${maxRetries} retries`);
118
- }
119
- // ---------------------------------------------------------------------------
120
- // Issue → Card mapping
121
- // ---------------------------------------------------------------------------
122
- /**
123
- * Convert a Plane issue to a Card.
124
- * Labels may come as objects ({id, name}) or bare UUID strings.
125
- * When they are UUIDs, resolve to names via the label cache.
126
- */
127
- async resolveIssueToCard(issue) {
128
- const stateId = issue.state;
129
- const cardState = this.reverseStateMap.get(stateId) ?? 'Backlog';
130
- // Resolve label UUIDs to names
131
- const labelNames = [];
132
- for (const l of (issue.labels ?? [])) {
133
- if (typeof l === 'object' && l.name) {
134
- labelNames.push(l.name);
135
- }
136
- else if (typeof l === 'string') {
137
- // UUID — resolve via cache
138
- if (!this.labelCache)
139
- await this.refreshLabelCache();
140
- const name = this.reverseLabelName(l);
141
- labelNames.push(name || l);
142
- }
143
- }
144
- return {
145
- id: issue.id,
146
- seq: String(issue.sequence_id),
147
- name: issue.name,
148
- desc: issue.description || stripHtmlTags(issue.description_html ?? '').trim() || '',
149
- state: cardState,
150
- labels: labelNames,
151
- meta: {},
152
- };
153
- }
154
- /**
155
- * Reverse lookup: label UUID → name.
156
- */
157
- reverseLabelName(id) {
158
- if (!this.labelCache)
159
- return null;
160
- for (const [name, uuid] of this.labelCache.entries()) {
161
- if (uuid === id)
162
- return name;
163
- }
164
- return null;
165
- }
166
- // ---------------------------------------------------------------------------
167
- // TaskBackend implementation
168
- // ---------------------------------------------------------------------------
169
- async incrementRetryCount(seq) {
170
- const meta = await this.metaRead(seq);
171
- const count = (typeof meta.retry_count === 'number' ? meta.retry_count : 0) + 1;
172
- await this.metaWrite(seq, { ...meta, retry_count: count });
173
- return count;
174
- }
175
- async resetRetryCount(seq) {
176
- const meta = await this.metaRead(seq);
177
- await this.metaWrite(seq, { ...meta, retry_count: 0 });
178
- }
179
- async bootstrap() {
180
- // Verify API connectivity by fetching project info
181
- const url = `${this.baseUrl}/`;
182
- const res = await fetch(url, { method: 'GET', headers: this.headers });
183
- if (!res.ok) {
184
- throw new Error(`Plane bootstrap failed: cannot reach project (${res.status})`);
185
- }
186
- // Verify all state UUIDs are configured
187
- for (const state of ALL_STATES) {
188
- if (!this.stateMap[state]) {
189
- throw new Error(`Plane bootstrap: missing state mapping for ${state}`);
190
- }
191
- }
192
- // Ensure pm_meta directory exists
193
- if (!existsSync(this.pmMetaDir)) {
194
- mkdirSync(this.pmMetaDir, { recursive: true });
195
- }
196
- }
197
- async listByState(state) {
198
- const stateId = this.stateMap[state];
199
- if (!stateId)
200
- throw new Error(`No Plane state mapping for ${state}`);
201
- // Plane CE API v1 may ignore the ?state= query param,
202
- // so fetch all issues and filter client-side by state UUID.
203
- const data = await this.request('GET', '/issues/');
204
- const issues = Array.isArray(data) ? data : (data.results ?? []);
205
- const filtered = issues.filter((i) => i.state === stateId);
206
- return Promise.all(filtered.map((i) => this.resolveIssueToCard(i)));
207
- }
208
- async listAll() {
209
- const data = await this.request('GET', '/issues/');
210
- const issues = Array.isArray(data) ? data : (data.results ?? []);
211
- return Promise.all(issues.map((issue) => this.resolveIssueToCard(issue)));
212
- }
213
- async getBySeq(seq) {
214
- // Plane API doesn't have a direct "get by sequence_id" endpoint,
215
- // so we filter issues by sequence_id.
216
- const data = await this.request('GET', `/issues/?search=${seq}`);
217
- const issues = Array.isArray(data) ? data : (data.results ?? []);
218
- const match = issues.find((i) => String(i.sequence_id) === seq);
219
- return match ? await this.resolveIssueToCard(match) : null;
220
- }
221
- async move(seq, targetState) {
222
- const stateId = this.stateMap[targetState];
223
- if (!stateId)
224
- throw new Error(`No Plane state mapping for ${targetState}`);
225
- const issue = await this.resolveIssue(seq);
226
- await this.request('PATCH', `/issues/${issue.id}/`, { state: stateId });
227
- }
228
- async addLabel(seq, label) {
229
- const issue = await this.resolveIssue(seq);
230
- const labelId = await this.ensureLabel(label);
231
- const currentLabelIds = await this.getIssueLabelIds(issue.id);
232
- if (!currentLabelIds.includes(labelId)) {
233
- currentLabelIds.push(labelId);
234
- await this.request('PATCH', `/issues/${issue.id}/`, { labels: currentLabelIds });
235
- }
236
- }
237
- async removeLabel(seq, label) {
238
- const issue = await this.resolveIssue(seq);
239
- const labelId = await this.findLabelId(label);
240
- if (!labelId)
241
- return; // Label doesn't exist, nothing to remove
242
- const currentLabelIds = await this.getIssueLabelIds(issue.id);
243
- const filtered = currentLabelIds.filter((id) => id !== labelId);
244
- if (filtered.length !== currentLabelIds.length) {
245
- await this.request('PATCH', `/issues/${issue.id}/`, { labels: filtered });
246
- }
247
- }
248
- async claim(seq, workerSlot) {
249
- // Dual-write: local pm_meta + CLAIMED label (doc 12 §9.2)
250
- await this.metaWrite(seq, {
251
- status: 'CLAIMED',
252
- worker: workerSlot,
253
- claimedAt: new Date().toISOString(),
254
- });
255
- await this.addLabel(seq, 'CLAIMED');
256
- }
257
- async releaseClaim(seq) {
258
- // Dual-write: update pm_meta + remove CLAIMED label
259
- const existing = await this.metaRead(seq);
260
- await this.metaWrite(seq, {
261
- ...existing,
262
- status: 'RELEASED',
263
- releasedAt: new Date().toISOString(),
264
- });
265
- await this.removeLabel(seq, 'CLAIMED');
266
- }
267
- async comment(seq, text) {
268
- const issue = await this.resolveIssue(seq);
269
- await this.request('POST', `/issues/${issue.id}/comments/`, {
270
- comment_html: `<p>${escapeHtml(text)}</p>`,
271
- });
272
- }
273
- async create(name, desc, state) {
274
- const stateId = this.stateMap[state];
275
- if (!stateId)
276
- throw new Error(`No Plane state mapping for ${state}`);
277
- const issue = await this.request('POST', '/issues/', {
278
- name,
279
- description_html: `<p>${escapeHtml(desc)}</p>`,
280
- description: desc,
281
- state: stateId,
282
- });
283
- return await this.resolveIssueToCard(issue);
284
- }
285
- // ---------------------------------------------------------------------------
286
- // Checklist (via description_html task lists)
287
- // ---------------------------------------------------------------------------
288
- async checklistCreate(seq, items) {
289
- const issue = await this.resolveIssue(seq);
290
- // Build HTML task list and append to existing description
291
- const taskListHtml = items
292
- .map((item) => `<li data-checked="false">${escapeHtml(item)}</li>`)
293
- .join('');
294
- const html = `<ul class="checklist">${taskListHtml}</ul>`;
295
- const currentDesc = issue.description_html ?? '';
296
- const newDesc = currentDesc + '\n' + html;
297
- await this.request('PATCH', `/issues/${issue.id}/`, {
298
- description_html: newDesc,
299
- });
300
- }
301
- async checklistList(seq) {
302
- const issue = await this.resolveIssue(seq);
303
- const html = issue.description_html ?? '';
304
- return parseChecklistItems(html);
305
- }
306
- async checklistCheck(seq, itemId) {
307
- await this.updateChecklistItem(seq, itemId, true);
308
- }
309
- async checklistUncheck(seq, itemId) {
310
- await this.updateChecklistItem(seq, itemId, false);
311
- }
312
- async updateChecklistItem(seq, itemId, checked) {
313
- const issue = await this.resolveIssue(seq);
314
- const html = issue.description_html ?? '';
315
- const items = parseChecklistItems(html);
316
- const idx = parseInt(itemId, 10);
317
- if (Number.isNaN(idx) || idx < 0 || idx >= items.length) {
318
- throw new Error(`Checklist item ${itemId} not found on issue ${seq}`);
319
- }
320
- const updatedHtml = updateChecklistItemHtml(html, idx, checked);
321
- await this.request('PATCH', `/issues/${issue.id}/`, {
322
- description_html: updatedHtml,
323
- });
324
- }
325
- // ---------------------------------------------------------------------------
326
- // pm_meta (local JSON files)
327
- // ---------------------------------------------------------------------------
328
- async metaRead(seq) {
329
- const issue = await this.resolveIssue(seq);
330
- const filePath = resolve(this.pmMetaDir, `${issue.id}.json`);
331
- if (!existsSync(filePath))
332
- return {};
333
- try {
334
- return JSON.parse(readFileSync(filePath, 'utf-8'));
335
- }
336
- catch {
337
- return {};
338
- }
339
- }
340
- async metaWrite(seq, data) {
341
- const issue = await this.resolveIssue(seq);
342
- if (!existsSync(this.pmMetaDir)) {
343
- mkdirSync(this.pmMetaDir, { recursive: true });
344
- }
345
- const filePath = resolve(this.pmMetaDir, `${issue.id}.json`);
346
- writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
347
- }
348
- // ---------------------------------------------------------------------------
349
- // Internal helpers
350
- // ---------------------------------------------------------------------------
351
- /**
352
- * Resolve a sequence ID to a full Plane issue object.
353
- * Throws if the issue cannot be found.
354
- */
355
- async resolveIssue(seq) {
356
- const data = await this.request('GET', `/issues/?search=${seq}`);
357
- const issues = Array.isArray(data) ? data : (data.results ?? []);
358
- const match = issues.find((i) => String(i.sequence_id) === seq);
359
- if (!match) {
360
- throw new Error(`Plane issue with sequence_id ${seq} not found`);
361
- }
362
- return match;
363
- }
364
- /**
365
- * Get current label UUIDs on an issue.
366
- */
367
- async getIssueLabelIds(issueId) {
368
- const issue = await this.request('GET', `/issues/${issueId}/`);
369
- if (!issue.label_ids) {
370
- // labels may be objects or strings depending on API version
371
- return (issue.labels ?? []).map((l) => typeof l === 'string' ? l : l.id);
372
- }
373
- return [...issue.label_ids];
374
- }
375
- /**
376
- * Find or create a project label by name, returning its UUID.
377
- */
378
- async ensureLabel(name) {
379
- const existing = await this.findLabelId(name);
380
- if (existing)
381
- return existing;
382
- // Create the label
383
- const label = await this.request('POST', '/labels/', { name });
384
- // Invalidate cache so next lookup picks it up
385
- this.labelCache = null;
386
- return label.id;
387
- }
388
- /**
389
- * Find label UUID by name. Returns null if not found.
390
- */
391
- async findLabelId(name) {
392
- if (!this.labelCache) {
393
- await this.refreshLabelCache();
394
- }
395
- return this.labelCache.get(name) ?? null;
396
- }
397
- /**
398
- * Populate label name→id cache from Plane API.
399
- */
400
- async refreshLabelCache() {
401
- const data = await this.request('GET', '/labels/');
402
- const labels = Array.isArray(data) ? data : (data.results ?? []);
403
- this.labelCache = new Map();
404
- for (const label of labels) {
405
- this.labelCache.set(label.name, label.id);
406
- }
407
- }
408
- }
409
- // =============================================================================
410
- // Utility functions
411
- // =============================================================================
412
- function required(raw, key) {
413
- const val = raw[key];
414
- if (!val)
415
- throw new Error(`Missing required config field: ${key}`);
416
- return val;
417
- }
418
- function escapeHtml(text) {
419
- return text
420
- .replace(/&/g, '&amp;')
421
- .replace(/</g, '&lt;')
422
- .replace(/>/g, '&gt;')
423
- .replace(/"/g, '&quot;');
424
- }
425
- /**
426
- * Parse checklist items from Plane description_html.
427
- * Items are <li> elements with data-checked attribute.
428
- */
429
- function parseChecklistItems(html) {
430
- const items = [];
431
- // Match <li data-checked="true|false">text</li>
432
- const re = /<li\s[^>]*data-checked="(true|false)"[^>]*>([\s\S]*?)<\/li>/gi;
433
- let m;
434
- let idx = 0;
435
- while ((m = re.exec(html)) !== null) {
436
- items.push({
437
- id: String(idx),
438
- text: stripHtmlTags(m[2]).trim(),
439
- checked: m[1] === 'true',
440
- });
441
- idx++;
442
- }
443
- return items;
444
- }
445
- /**
446
- * Update a checklist item's checked state in description_html by index.
447
- */
448
- function updateChecklistItemHtml(html, index, checked) {
449
- const re = /<li\s([^>]*data-checked=")(?:true|false)("[^>]*>)/gi;
450
- let count = 0;
451
- return html.replace(re, (match, before, after) => {
452
- if (count++ === index) {
453
- return `<li ${before}${checked ? 'true' : 'false'}${after}`;
454
- }
455
- return match;
456
- });
457
- }
458
- function stripHtmlTags(html) {
459
- return html.replace(/<[^>]*>/g, '');
460
- }
461
- //# sourceMappingURL=PlaneTaskBackend.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PlaneTaskBackend.js","sourceRoot":"","sources":["../../src/providers/PlaneTaskBackend.ts"],"names":[],"mappings":"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"}
@@ -1,64 +0,0 @@
1
- /**
2
- * @module TrelloTaskBackend
3
- * @description Trello 看板的任务后端实现,通过 REST API 管理卡片与列表状态
4
- *
5
- * @author eddy
6
- * @organization wykj
7
- * @ownership wykj/eddy
8
- *
9
- * @created 2026-03-19
10
- * @updated 2026-04-03
11
- *
12
- * @role provider
13
- * @layer provider
14
- * @boundedContext task
15
- */
16
- import type { ProjectConfig } from '../core/config.js';
17
- import type { TaskBackend } from '../interfaces/TaskBackend.js';
18
- import type { Card, CardState } from '../models/types.js';
19
- export declare class TrelloTaskBackend implements TaskBackend {
20
- private readonly apiBase;
21
- private readonly apiKey;
22
- private readonly apiToken;
23
- private readonly boardId;
24
- /** CardState → Trello list ID */
25
- private readonly listMap;
26
- /** Trello list ID → CardState */
27
- private readonly reverseListMap;
28
- /** Cache: label name → label ID */
29
- private labelCache;
30
- constructor(config: ProjectConfig);
31
- private get authParams();
32
- private get;
33
- private post;
34
- private put;
35
- private del;
36
- private cardToCard;
37
- incrementRetryCount(_seq: string): Promise<number>;
38
- resetRetryCount(_seq: string): Promise<void>;
39
- bootstrap(): Promise<void>;
40
- listByState(state: CardState): Promise<Card[]>;
41
- listAll(): Promise<Card[]>;
42
- getBySeq(seq: string): Promise<Card | null>;
43
- move(seq: string, targetState: CardState): Promise<void>;
44
- addLabel(seq: string, label: string): Promise<void>;
45
- removeLabel(seq: string, label: string): Promise<void>;
46
- claim(seq: string, workerSlot: string): Promise<void>;
47
- releaseClaim(seq: string): Promise<void>;
48
- comment(seq: string, text: string): Promise<void>;
49
- create(name: string, desc: string, state: CardState): Promise<Card>;
50
- checklistCreate(seq: string, items: string[]): Promise<void>;
51
- checklistList(seq: string): Promise<{
52
- id: string;
53
- text: string;
54
- checked: boolean;
55
- }[]>;
56
- checklistCheck(seq: string, itemId: string): Promise<void>;
57
- checklistUncheck(seq: string, itemId: string): Promise<void>;
58
- metaRead(seq: string): Promise<Record<string, unknown>>;
59
- metaWrite(seq: string, data: Record<string, unknown>): Promise<void>;
60
- private requireCard;
61
- private ensureLabel;
62
- private findLabelId;
63
- }
64
- //# sourceMappingURL=TrelloTaskBackend.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TrelloTaskBackend.d.ts","sourceRoot":"","sources":["../../src/providers/TrelloTaskBackend.ts"],"names":[],"mappings":"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"}