@coralai/sps-cli 0.48.1 → 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.
- package/dist/console-assets/assets/{index-BR3iEolY.js → index-Co0H5e5_.js} +85 -85
- package/dist/console-assets/assets/{index-lsG7ZrzD.css → index-DNKOkgDj.css} +1 -1
- package/dist/console-assets/index.html +2 -2
- package/dist/console-server/routes/system.d.ts.map +1 -1
- package/dist/console-server/routes/system.js +30 -0
- package/dist/console-server/routes/system.js.map +1 -1
- package/package.json +4 -1
- package/dist/commands/cardMarkComplete.test.d.ts +0 -2
- package/dist/commands/cardMarkComplete.test.d.ts.map +0 -1
- package/dist/commands/cardMarkComplete.test.js +0 -142
- package/dist/commands/cardMarkComplete.test.js.map +0 -1
- package/dist/commands/cardMarkStarted.test.d.ts +0 -2
- package/dist/commands/cardMarkStarted.test.d.ts.map +0 -1
- package/dist/commands/cardMarkStarted.test.js +0 -98
- package/dist/commands/cardMarkStarted.test.js.map +0 -1
- package/dist/commands/projectInit.test.d.ts +0 -2
- package/dist/commands/projectInit.test.d.ts.map +0 -1
- package/dist/commands/projectInit.test.js +0 -126
- package/dist/commands/projectInit.test.js.map +0 -1
- package/dist/commands/tick-heartbeat.test.d.ts +0 -2
- package/dist/commands/tick-heartbeat.test.d.ts.map +0 -1
- package/dist/commands/tick-heartbeat.test.js +0 -89
- package/dist/commands/tick-heartbeat.test.js.map +0 -1
- package/dist/core/checklist.test.d.ts +0 -2
- package/dist/core/checklist.test.d.ts.map +0 -1
- package/dist/core/checklist.test.js +0 -74
- package/dist/core/checklist.test.js.map +0 -1
- package/dist/core/config.test.d.ts +0 -2
- package/dist/core/config.test.d.ts.map +0 -1
- package/dist/core/config.test.js +0 -352
- package/dist/core/config.test.js.map +0 -1
- package/dist/core/lock.test.d.ts +0 -2
- package/dist/core/lock.test.d.ts.map +0 -1
- package/dist/core/lock.test.js +0 -118
- package/dist/core/lock.test.js.map +0 -1
- package/dist/core/markerFile.test.d.ts +0 -2
- package/dist/core/markerFile.test.d.ts.map +0 -1
- package/dist/core/markerFile.test.js +0 -111
- package/dist/core/markerFile.test.js.map +0 -1
- package/dist/core/queue.test.d.ts +0 -2
- package/dist/core/queue.test.d.ts.map +0 -1
- package/dist/core/queue.test.js +0 -114
- package/dist/core/queue.test.js.map +0 -1
- package/dist/core/sessionCleanup.test.d.ts +0 -2
- package/dist/core/sessionCleanup.test.d.ts.map +0 -1
- package/dist/core/sessionCleanup.test.js +0 -158
- package/dist/core/sessionCleanup.test.js.map +0 -1
- package/dist/core/shellEnv.test.d.ts +0 -2
- package/dist/core/shellEnv.test.d.ts.map +0 -1
- package/dist/core/shellEnv.test.js +0 -116
- package/dist/core/shellEnv.test.js.map +0 -1
- package/dist/core/skillStore.test.d.ts +0 -2
- package/dist/core/skillStore.test.d.ts.map +0 -1
- package/dist/core/skillStore.test.js +0 -203
- package/dist/core/skillStore.test.js.map +0 -1
- package/dist/core/state.test.d.ts +0 -2
- package/dist/core/state.test.d.ts.map +0 -1
- package/dist/core/state.test.js +0 -336
- package/dist/core/state.test.js.map +0 -1
- package/dist/engines/CloseoutEngine.d.ts +0 -72
- package/dist/engines/CloseoutEngine.d.ts.map +0 -1
- package/dist/engines/CloseoutEngine.js +0 -648
- package/dist/engines/CloseoutEngine.js.map +0 -1
- package/dist/engines/EventHandler.test.d.ts +0 -2
- package/dist/engines/EventHandler.test.d.ts.map +0 -1
- package/dist/engines/EventHandler.test.js +0 -169
- package/dist/engines/EventHandler.test.js.map +0 -1
- package/dist/engines/ExecutionEngine.d.ts +0 -125
- package/dist/engines/ExecutionEngine.d.ts.map +0 -1
- package/dist/engines/ExecutionEngine.js +0 -766
- package/dist/engines/ExecutionEngine.js.map +0 -1
- package/dist/engines/MonitorEngine.test.d.ts +0 -2
- package/dist/engines/MonitorEngine.test.d.ts.map +0 -1
- package/dist/engines/MonitorEngine.test.js +0 -355
- package/dist/engines/MonitorEngine.test.js.map +0 -1
- package/dist/engines/engine-pipeline-adapter.test.d.ts +0 -17
- package/dist/engines/engine-pipeline-adapter.test.d.ts.map +0 -1
- package/dist/engines/engine-pipeline-adapter.test.js +0 -707
- package/dist/engines/engine-pipeline-adapter.test.js.map +0 -1
- package/dist/interfaces/HookProvider.d.ts +0 -9
- package/dist/interfaces/HookProvider.d.ts.map +0 -1
- package/dist/interfaces/HookProvider.js +0 -2
- package/dist/interfaces/HookProvider.js.map +0 -1
- package/dist/manager/completion-judge.test.d.ts +0 -17
- package/dist/manager/completion-judge.test.d.ts.map +0 -1
- package/dist/manager/completion-judge.test.js +0 -233
- package/dist/manager/completion-judge.test.js.map +0 -1
- package/dist/manager/integration-queue.d.ts +0 -71
- package/dist/manager/integration-queue.d.ts.map +0 -1
- package/dist/manager/integration-queue.js +0 -137
- package/dist/manager/integration-queue.js.map +0 -1
- package/dist/manager/integration-queue.test.d.ts +0 -17
- package/dist/manager/integration-queue.test.d.ts.map +0 -1
- package/dist/manager/integration-queue.test.js +0 -210
- package/dist/manager/integration-queue.test.js.map +0 -1
- package/dist/manager/pm-client.d.ts +0 -10
- package/dist/manager/pm-client.d.ts.map +0 -1
- package/dist/manager/pm-client.js +0 -260
- package/dist/manager/pm-client.js.map +0 -1
- package/dist/manager/resource-limiter.d.ts +0 -56
- package/dist/manager/resource-limiter.d.ts.map +0 -1
- package/dist/manager/resource-limiter.js +0 -116
- package/dist/manager/resource-limiter.js.map +0 -1
- package/dist/manager/resource-limiter.test.d.ts +0 -17
- package/dist/manager/resource-limiter.test.d.ts.map +0 -1
- package/dist/manager/resource-limiter.test.js +0 -118
- package/dist/manager/resource-limiter.test.js.map +0 -1
- package/dist/manager/supervisor.test.d.ts +0 -17
- package/dist/manager/supervisor.test.d.ts.map +0 -1
- package/dist/manager/supervisor.test.js +0 -216
- package/dist/manager/supervisor.test.js.map +0 -1
- package/dist/manager/worker-manager-impl.test.d.ts +0 -17
- package/dist/manager/worker-manager-impl.test.d.ts.map +0 -1
- package/dist/manager/worker-manager-impl.test.js +0 -446
- package/dist/manager/worker-manager-impl.test.js.map +0 -1
- package/dist/providers/PlaneTaskBackend.d.ts +0 -83
- package/dist/providers/PlaneTaskBackend.d.ts.map +0 -1
- package/dist/providers/PlaneTaskBackend.js +0 -461
- package/dist/providers/PlaneTaskBackend.js.map +0 -1
- package/dist/providers/TrelloTaskBackend.d.ts +0 -64
- package/dist/providers/TrelloTaskBackend.d.ts.map +0 -1
- package/dist/providers/TrelloTaskBackend.js +0 -298
- package/dist/providers/TrelloTaskBackend.js.map +0 -1
- package/dist/providers/adapters/acp-fs-handlers.test.d.ts +0 -2
- package/dist/providers/adapters/acp-fs-handlers.test.d.ts.map +0 -1
- package/dist/providers/adapters/acp-fs-handlers.test.js +0 -80
- package/dist/providers/adapters/acp-fs-handlers.test.js.map +0 -1
- package/dist/providers/adapters/acp-permissions.test.d.ts +0 -2
- package/dist/providers/adapters/acp-permissions.test.d.ts.map +0 -1
- package/dist/providers/adapters/acp-permissions.test.js +0 -103
- package/dist/providers/adapters/acp-permissions.test.js.map +0 -1
- package/dist/providers/adapters/acp-session-accumulator.test.d.ts +0 -2
- package/dist/providers/adapters/acp-session-accumulator.test.d.ts.map +0 -1
- package/dist/providers/adapters/acp-session-accumulator.test.js +0 -88
- package/dist/providers/adapters/acp-session-accumulator.test.js.map +0 -1
- package/dist/providers/adapters/acp-terminal-manager.test.d.ts +0 -2
- package/dist/providers/adapters/acp-terminal-manager.test.d.ts.map +0 -1
- package/dist/providers/adapters/acp-terminal-manager.test.js +0 -86
- package/dist/providers/adapters/acp-terminal-manager.test.js.map +0 -1
- package/dist/providers/outputParser.test.d.ts +0 -2
- package/dist/providers/outputParser.test.d.ts.map +0 -1
- package/dist/providers/outputParser.test.js +0 -185
- package/dist/providers/outputParser.test.js.map +0 -1
- package/dist/test-setup.d.ts +0 -2
- package/dist/test-setup.d.ts.map +0 -1
- package/dist/test-setup.js +0 -27
- 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, '&')
|
|
421
|
-
.replace(/</g, '<')
|
|
422
|
-
.replace(/>/g, '>')
|
|
423
|
-
.replace(/"/g, '"');
|
|
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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"}
|