@coralai/sps-cli 0.50.5 → 0.50.7

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 (86) hide show
  1. package/dist/console-assets/assets/{index-BczFsg3E.js → index-CGiD8z0L.js} +47 -47
  2. package/dist/console-assets/index.html +1 -1
  3. package/dist/services/PipelineService.d.ts.map +1 -1
  4. package/dist/services/PipelineService.js +22 -0
  5. package/dist/services/PipelineService.js.map +1 -1
  6. package/package.json +1 -1
  7. package/dist/console/sse/eventBus.d.ts +0 -25
  8. package/dist/console/sse/eventBus.d.ts.map +0 -1
  9. package/dist/console/sse/eventBus.js +0 -32
  10. package/dist/console/sse/eventBus.js.map +0 -1
  11. package/dist/console-server/index.d.ts +0 -29
  12. package/dist/console-server/index.d.ts.map +0 -1
  13. package/dist/console-server/index.js +0 -180
  14. package/dist/console-server/index.js.map +0 -1
  15. package/dist/console-server/lib/cardReader.d.ts +0 -27
  16. package/dist/console-server/lib/cardReader.d.ts.map +0 -1
  17. package/dist/console-server/lib/cardReader.js +0 -201
  18. package/dist/console-server/lib/cardReader.js.map +0 -1
  19. package/dist/console-server/lib/lockFile.d.ts +0 -17
  20. package/dist/console-server/lib/lockFile.d.ts.map +0 -1
  21. package/dist/console-server/lib/lockFile.js +0 -61
  22. package/dist/console-server/lib/lockFile.js.map +0 -1
  23. package/dist/console-server/lib/portPicker.d.ts +0 -3
  24. package/dist/console-server/lib/portPicker.d.ts.map +0 -1
  25. package/dist/console-server/lib/portPicker.js +0 -25
  26. package/dist/console-server/lib/portPicker.js.map +0 -1
  27. package/dist/console-server/lib/spawnCli.d.ts +0 -31
  28. package/dist/console-server/lib/spawnCli.d.ts.map +0 -1
  29. package/dist/console-server/lib/spawnCli.js +0 -64
  30. package/dist/console-server/lib/spawnCli.js.map +0 -1
  31. package/dist/console-server/routes/cards.d.ts +0 -7
  32. package/dist/console-server/routes/cards.d.ts.map +0 -1
  33. package/dist/console-server/routes/cards.js +0 -185
  34. package/dist/console-server/routes/cards.js.map +0 -1
  35. package/dist/console-server/routes/chat.d.ts +0 -36
  36. package/dist/console-server/routes/chat.d.ts.map +0 -1
  37. package/dist/console-server/routes/chat.js +0 -458
  38. package/dist/console-server/routes/chat.js.map +0 -1
  39. package/dist/console-server/routes/logs.d.ts +0 -14
  40. package/dist/console-server/routes/logs.d.ts.map +0 -1
  41. package/dist/console-server/routes/logs.js +0 -283
  42. package/dist/console-server/routes/logs.js.map +0 -1
  43. package/dist/console-server/routes/pipeline.d.ts +0 -8
  44. package/dist/console-server/routes/pipeline.d.ts.map +0 -1
  45. package/dist/console-server/routes/pipeline.js +0 -96
  46. package/dist/console-server/routes/pipeline.js.map +0 -1
  47. package/dist/console-server/routes/projects.d.ts +0 -11
  48. package/dist/console-server/routes/projects.d.ts.map +0 -1
  49. package/dist/console-server/routes/projects.js +0 -583
  50. package/dist/console-server/routes/projects.js.map +0 -1
  51. package/dist/console-server/routes/skills.d.ts +0 -7
  52. package/dist/console-server/routes/skills.d.ts.map +0 -1
  53. package/dist/console-server/routes/skills.js +0 -267
  54. package/dist/console-server/routes/skills.js.map +0 -1
  55. package/dist/console-server/routes/system.d.ts +0 -7
  56. package/dist/console-server/routes/system.d.ts.map +0 -1
  57. package/dist/console-server/routes/system.js +0 -288
  58. package/dist/console-server/routes/system.js.map +0 -1
  59. package/dist/console-server/routes/workers.d.ts +0 -18
  60. package/dist/console-server/routes/workers.d.ts.map +0 -1
  61. package/dist/console-server/routes/workers.js +0 -351
  62. package/dist/console-server/routes/workers.js.map +0 -1
  63. package/dist/console-server/sse/eventBus.d.ts +0 -25
  64. package/dist/console-server/sse/eventBus.d.ts.map +0 -1
  65. package/dist/console-server/sse/eventBus.js +0 -32
  66. package/dist/console-server/sse/eventBus.js.map +0 -1
  67. package/dist/console-server/sse/projectStream.d.ts +0 -10
  68. package/dist/console-server/sse/projectStream.d.ts.map +0 -1
  69. package/dist/console-server/sse/projectStream.js +0 -86
  70. package/dist/console-server/sse/projectStream.js.map +0 -1
  71. package/dist/console-server/watchers/cardWatcher.d.ts +0 -17
  72. package/dist/console-server/watchers/cardWatcher.d.ts.map +0 -1
  73. package/dist/console-server/watchers/cardWatcher.js +0 -68
  74. package/dist/console-server/watchers/cardWatcher.js.map +0 -1
  75. package/dist/console-server/watchers/markerWatcher.d.ts +0 -7
  76. package/dist/console-server/watchers/markerWatcher.d.ts.map +0 -1
  77. package/dist/console-server/watchers/markerWatcher.js +0 -63
  78. package/dist/console-server/watchers/markerWatcher.js.map +0 -1
  79. package/dist/console-server/watchers/pipelinePoller.d.ts +0 -2
  80. package/dist/console-server/watchers/pipelinePoller.d.ts.map +0 -1
  81. package/dist/console-server/watchers/pipelinePoller.js +0 -52
  82. package/dist/console-server/watchers/pipelinePoller.js.map +0 -1
  83. package/dist/models/types.d.ts +0 -103
  84. package/dist/models/types.d.ts.map +0 -1
  85. package/dist/models/types.js +0 -17
  86. package/dist/models/types.js.map +0 -1
@@ -1,583 +0,0 @@
1
- /**
2
- * @module console-server/routes/projects
3
- * @description /api/projects[/:name] —— 读 ~/.coral/projects 下每个 conf,返回项目列表 / 详情
4
- *
5
- * @role route
6
- * @layer console-server
7
- * @boundedContext console
8
- */
9
- import { Hono } from 'hono';
10
- import { createHash } from 'node:crypto';
11
- import { chmodSync, copyFileSync, existsSync, readdirSync, readFileSync, rmSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
12
- import { resolve } from 'node:path';
13
- import YAML from 'yaml';
14
- import { executeProjectInit } from '../../commands/projectInit.js';
15
- const HOME = process.env.HOME || '/home/coral';
16
- const PROJECTS_DIR = resolve(HOME, '.coral', 'projects');
17
- function parseConf(confPath) {
18
- const out = {};
19
- if (!existsSync(confPath))
20
- return out;
21
- const text = readFileSync(confPath, 'utf-8');
22
- for (const line of text.split('\n')) {
23
- const trimmed = line.trim();
24
- if (!trimmed || trimmed.startsWith('#'))
25
- continue;
26
- const match = trimmed.match(/^(?:export\s+)?([A-Z_][A-Z0-9_]*)=["']?(.*?)["']?\s*$/);
27
- if (match)
28
- out[match[1]] = match[2];
29
- }
30
- return out;
31
- }
32
- /**
33
- * v0.49.15:卡片存在 cards/<state>/N-title.md 子目录,state 由物理目录名决定
34
- * (MarkdownTaskBackend 不把 state 写进 frontmatter)。之前扫顶层 *.md 永远返 0。
35
- */
36
- function countCards(cardsDir) {
37
- if (!existsSync(cardsDir))
38
- return { total: 0, inprogress: 0, done: 0 };
39
- let total = 0;
40
- let inprogress = 0;
41
- let done = 0;
42
- for (const entry of readdirSync(cardsDir, { withFileTypes: true })) {
43
- if (!entry.isDirectory())
44
- continue;
45
- const sub = resolve(cardsDir, entry.name);
46
- const dirLower = entry.name.toLowerCase();
47
- let files = [];
48
- try {
49
- files = readdirSync(sub).filter((f) => /^\d+.*\.md$/.test(f));
50
- }
51
- catch {
52
- continue;
53
- }
54
- total += files.length;
55
- if (dirLower === 'inprogress')
56
- inprogress += files.length;
57
- else if (dirLower === 'done')
58
- done += files.length;
59
- }
60
- return { total, inprogress, done };
61
- }
62
- function countActiveWorkers(runtimeDir) {
63
- if (!existsSync(runtimeDir))
64
- return { total: 0, active: 0 };
65
- // v0.49.16:marker 真实格式 worker-worker-N-current.json(双前缀),兼容单前缀老格式
66
- const markers = readdirSync(runtimeDir).filter((f) => /^worker-(?:worker-)?\d+-current\.json$/.test(f));
67
- let active = 0;
68
- const now = Date.now();
69
- for (const f of markers) {
70
- try {
71
- const stat = statSync(resolve(runtimeDir, f));
72
- // marker 近期更新(< 5min)视为活跃
73
- if (now - stat.mtimeMs < 5 * 60 * 1000)
74
- active++;
75
- }
76
- catch {
77
- /* ignore */
78
- }
79
- }
80
- return { total: markers.length, active };
81
- }
82
- function readProject(name) {
83
- const dir = resolve(PROJECTS_DIR, name);
84
- if (!existsSync(dir) || !statSync(dir).isDirectory())
85
- return null;
86
- const conf = parseConf(resolve(dir, 'conf'));
87
- const cards = countCards(resolve(dir, 'cards'));
88
- const workers = countActiveWorkers(resolve(dir, 'runtime'));
89
- // 从 pipeline.pid 或 supervisor.pid 判活
90
- const pipelinePidFile = resolve(dir, 'runtime', 'supervisor.pid');
91
- let pipelineStatus = 'idle';
92
- if (existsSync(pipelinePidFile)) {
93
- try {
94
- const pid = Number.parseInt(readFileSync(pipelinePidFile, 'utf-8').trim(), 10);
95
- if (pid > 0) {
96
- try {
97
- process.kill(pid, 0);
98
- pipelineStatus = 'running';
99
- }
100
- catch {
101
- pipelineStatus = 'idle';
102
- }
103
- }
104
- }
105
- catch {
106
- /* ignore */
107
- }
108
- }
109
- // 最近活动 = runtime 目录 mtime
110
- let lastActivityAt = null;
111
- try {
112
- const runtimeStat = statSync(resolve(dir, 'runtime'));
113
- lastActivityAt = new Date(runtimeStat.mtimeMs).toISOString();
114
- }
115
- catch {
116
- /* ignore */
117
- }
118
- return {
119
- name,
120
- // conf 里的标准字段是 PROJECT_DIR(projectInit.ts 生成);REPO_DIR 保留给老配置
121
- repoDir: conf.PROJECT_DIR || conf.REPO_DIR || null,
122
- pmBackend: conf.PM_TOOL || 'markdown',
123
- agentProvider: conf.AGENT_PROVIDER || 'claude',
124
- cards,
125
- workers,
126
- pipelineStatus,
127
- lastActivityAt,
128
- };
129
- }
130
- export function createProjectsRoute() {
131
- const app = new Hono();
132
- app.get('/', (c) => {
133
- if (!existsSync(PROJECTS_DIR)) {
134
- return c.json({ data: [] });
135
- }
136
- const dirs = readdirSync(PROJECTS_DIR, { withFileTypes: true })
137
- .filter((e) => e.isDirectory())
138
- .map((e) => e.name)
139
- .sort();
140
- const projects = dirs.map(readProject).filter((p) => p !== null);
141
- return c.json({ data: projects });
142
- });
143
- app.get('/:name', (c) => {
144
- const name = c.req.param('name');
145
- const project = readProject(name);
146
- if (!project) {
147
- return c.json({
148
- type: 'not-found',
149
- title: 'Project not found',
150
- status: 404,
151
- detail: `~/.coral/projects/${name} does not exist`,
152
- }, 404);
153
- }
154
- return c.json(project);
155
- });
156
- /**
157
- * POST /api/projects — Create a new project.
158
- *
159
- * Body (all strings):
160
- * name (required) project name
161
- * projectDir (required) repo path
162
- * mergeBranch (required) default "main"
163
- * maxWorkers (required) default "1"
164
- * gitlabProject (optional) e.g. "user/repo"
165
- * gitlabProjectId (optional) GitLab numeric ID
166
- * matrixRoomId (optional)
167
- *
168
- * Calls executeProjectInit in non-interactive mode; throws on conflict.
169
- */
170
- app.post('/', async (c) => {
171
- const body = (await c.req.json().catch(() => null));
172
- if (!body?.name || !/^[a-zA-Z0-9_-]+$/.test(body.name)) {
173
- return c.json({ type: 'validation', title: 'invalid name', status: 422, detail: 'name must match [a-zA-Z0-9_-]+' }, 422);
174
- }
175
- if (!body.projectDir) {
176
- return c.json({ type: 'validation', title: 'projectDir required', status: 422 }, 422);
177
- }
178
- if (existsSync(resolve(PROJECTS_DIR, body.name))) {
179
- return c.json({ type: 'conflict', title: 'project exists', status: 409, detail: body.name }, 409);
180
- }
181
- const opts = {
182
- projectDir: body.projectDir,
183
- mergeBranch: body.mergeBranch || 'main',
184
- maxWorkers: body.maxWorkers || '1',
185
- gitlabProject: body.gitlabProject,
186
- gitlabProjectId: body.gitlabProjectId,
187
- matrixRoomId: body.matrixRoomId,
188
- };
189
- try {
190
- await executeProjectInit(body.name, {}, opts);
191
- }
192
- catch (err) {
193
- return c.json({
194
- type: 'internal',
195
- title: 'init failed',
196
- status: 500,
197
- detail: err instanceof Error ? err.message : String(err),
198
- }, 500);
199
- }
200
- const created = readProject(body.name);
201
- return c.json(created, 201);
202
- });
203
- /**
204
- * GET /api/projects/:name/conf — Return raw conf file content + etag.
205
- * Etag is a SHA-256 hash of content; client must echo it in PATCH If-Match.
206
- */
207
- app.get('/:name/conf', (c) => {
208
- const name = c.req.param('name');
209
- const confPath = resolve(PROJECTS_DIR, name, 'conf');
210
- if (!existsSync(confPath)) {
211
- return c.json({ type: 'not-found', title: 'conf not found', status: 404 }, 404);
212
- }
213
- const content = readFileSync(confPath, 'utf-8');
214
- const etag = createHash('sha256').update(content).digest('hex').slice(0, 16);
215
- c.header('ETag', etag);
216
- return c.json({ content, etag });
217
- });
218
- /**
219
- * PATCH /api/projects/:name/conf — Overwrite conf file with body.content.
220
- * Optimistic lock: body.etag (or If-Match header) must match current hash;
221
- * mismatch returns 409 so UI can prompt "someone else edited — reload?".
222
- * File permission stays 0600 (env may contain secrets).
223
- */
224
- app.patch('/:name/conf', async (c) => {
225
- const name = c.req.param('name');
226
- const confPath = resolve(PROJECTS_DIR, name, 'conf');
227
- if (!existsSync(confPath)) {
228
- return c.json({ type: 'not-found', title: 'conf not found', status: 404 }, 404);
229
- }
230
- const body = (await c.req.json().catch(() => null));
231
- if (!body || typeof body.content !== 'string') {
232
- return c.json({ type: 'validation', title: 'content required', status: 422 }, 422);
233
- }
234
- const ifMatch = body.etag ?? c.req.header('If-Match');
235
- if (!ifMatch) {
236
- return c.json({ type: 'validation', title: 'etag or If-Match required', status: 422 }, 422);
237
- }
238
- const current = readFileSync(confPath, 'utf-8');
239
- const currentEtag = createHash('sha256').update(current).digest('hex').slice(0, 16);
240
- if (ifMatch !== currentEtag) {
241
- return c.json({
242
- type: 'conflict',
243
- title: 'etag mismatch',
244
- status: 409,
245
- detail: 'conf changed since you loaded it; reload and try again',
246
- currentEtag,
247
- }, 409);
248
- }
249
- writeFileSync(confPath, body.content);
250
- try {
251
- chmodSync(confPath, 0o600);
252
- }
253
- catch { /* best effort */ }
254
- const newEtag = createHash('sha256').update(body.content).digest('hex').slice(0, 16);
255
- c.header('ETag', newEtag);
256
- return c.json({ etag: newEtag });
257
- });
258
- /**
259
- * DELETE /api/projects/:name — Remove ~/.coral/projects/<name>/ tree.
260
- * Also removes repo's <repoDir>/.claude/ by default (includeClaudeDir: true).
261
- * Set includeClaudeDir: false to skip.
262
- * Repo itself is never touched.
263
- * Refuses to delete if a pipeline is currently running.
264
- */
265
- app.delete('/:name', async (c) => {
266
- const name = c.req.param('name');
267
- const dir = resolve(PROJECTS_DIR, name);
268
- if (!existsSync(dir)) {
269
- return c.json({ type: 'not-found', title: 'Project not found', status: 404 }, 404);
270
- }
271
- const body = (await c.req.json().catch(() => null));
272
- const includeClaude = body?.includeClaudeDir !== false; // default true
273
- // Safety: refuse if pipeline is running
274
- const pidFile = resolve(dir, 'runtime', 'supervisor.pid');
275
- if (existsSync(pidFile)) {
276
- try {
277
- const pid = Number.parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);
278
- if (pid > 0) {
279
- try {
280
- process.kill(pid, 0);
281
- return c.json({
282
- type: 'conflict',
283
- title: 'pipeline running',
284
- status: 409,
285
- detail: 'Stop the pipeline before deleting the project',
286
- }, 409);
287
- }
288
- catch {
289
- /* dead pid, safe to proceed */
290
- }
291
- }
292
- }
293
- catch { /* unreadable pid, skip */ }
294
- }
295
- // Collect repo path BEFORE deleting project dir (conf lives there)
296
- let repoDir = null;
297
- if (includeClaude) {
298
- try {
299
- const conf = readFileSync(resolve(dir, 'conf'), 'utf-8');
300
- const match = conf.match(/export\s+PROJECT_DIR=["']?([^"'\n]+)/);
301
- repoDir = match?.[1]?.trim() || null;
302
- }
303
- catch { /* best effort */ }
304
- }
305
- // Remove project tree (~/.coral/projects/<name>/)
306
- try {
307
- rmSync(dir, { recursive: true, force: true });
308
- }
309
- catch (err) {
310
- return c.json({
311
- type: 'internal',
312
- title: 'delete failed',
313
- status: 500,
314
- detail: err instanceof Error ? err.message : String(err),
315
- }, 500);
316
- }
317
- // Optionally remove repo's .claude/ directory (not the repo itself)
318
- const claudeRemoved = [];
319
- if (includeClaude && repoDir) {
320
- const claudePath = resolve(repoDir, '.claude');
321
- if (existsSync(claudePath)) {
322
- try {
323
- rmSync(claudePath, { recursive: true, force: true });
324
- claudeRemoved.push({ path: claudePath, ok: true });
325
- }
326
- catch (err) {
327
- claudeRemoved.push({
328
- path: claudePath,
329
- ok: false,
330
- error: err instanceof Error ? err.message : String(err),
331
- });
332
- }
333
- }
334
- }
335
- return c.json({ name, claudeRemoved });
336
- });
337
- /**
338
- * GET /api/projects/:name/pipelines — List available pipeline yaml files.
339
- * Returns { active: "project.yaml content sha", available: [{ name, isActive }] }.
340
- * Active = the current project.yaml (identified by content match).
341
- */
342
- app.get('/:name/pipelines', (c) => {
343
- const name = c.req.param('name');
344
- const pipelinesDir = resolve(PROJECTS_DIR, name, 'pipelines');
345
- if (!existsSync(pipelinesDir)) {
346
- return c.json({ active: null, available: [] });
347
- }
348
- // v0.49.3: 按字母序排,保证列表显示稳定(fs readdir 顺序不保证)
349
- const files = readdirSync(pipelinesDir)
350
- .filter((f) => f.endsWith('.yaml'))
351
- .sort();
352
- const activePath = resolve(pipelinesDir, 'project.yaml');
353
- const activeHash = existsSync(activePath)
354
- ? createHash('sha256').update(readFileSync(activePath, 'utf-8')).digest('hex')
355
- : null;
356
- const available = files
357
- .filter((f) => f !== 'project.yaml')
358
- .map((f) => {
359
- const full = resolve(pipelinesDir, f);
360
- const hash = createHash('sha256').update(readFileSync(full, 'utf-8')).digest('hex');
361
- return { name: f, isActive: activeHash !== null && hash === activeHash };
362
- });
363
- return c.json({ active: activeHash ? 'project.yaml' : null, available });
364
- });
365
- /**
366
- * PUT /api/projects/:name/pipeline — Switch active pipeline.
367
- * Body: { pipeline: "<filename>.yaml" }
368
- * Copies <pipelinesDir>/<filename>.yaml → <pipelinesDir>/project.yaml.
369
- * Refuses if pipeline is running.
370
- */
371
- app.put('/:name/pipeline', async (c) => {
372
- const name = c.req.param('name');
373
- const pipelinesDir = resolve(PROJECTS_DIR, name, 'pipelines');
374
- if (!existsSync(pipelinesDir)) {
375
- return c.json({ type: 'not-found', title: 'Project has no pipelines dir', status: 404 }, 404);
376
- }
377
- const body = (await c.req.json().catch(() => null));
378
- if (!body?.pipeline || !/^[a-zA-Z0-9_.-]+\.yaml$/.test(body.pipeline)) {
379
- return c.json({ type: 'validation', title: 'invalid pipeline filename', status: 422 }, 422);
380
- }
381
- if (body.pipeline === 'project.yaml') {
382
- return c.json({ type: 'validation', title: 'cannot switch to project.yaml itself', status: 422 }, 422);
383
- }
384
- const src = resolve(pipelinesDir, body.pipeline);
385
- if (!existsSync(src)) {
386
- return c.json({ type: 'not-found', title: 'pipeline file not found', status: 404 }, 404);
387
- }
388
- // Safety: refuse if pipeline is running
389
- const pidFile = resolve(PROJECTS_DIR, name, 'runtime', 'supervisor.pid');
390
- if (existsSync(pidFile)) {
391
- try {
392
- const pid = Number.parseInt(readFileSync(pidFile, 'utf-8').trim(), 10);
393
- if (pid > 0) {
394
- try {
395
- process.kill(pid, 0);
396
- return c.json({
397
- type: 'conflict',
398
- title: 'pipeline running',
399
- status: 409,
400
- detail: 'Stop the pipeline before switching',
401
- }, 409);
402
- }
403
- catch { /* dead pid, safe */ }
404
- }
405
- }
406
- catch { /* unreadable, skip */ }
407
- }
408
- try {
409
- copyFileSync(src, resolve(pipelinesDir, 'project.yaml'));
410
- }
411
- catch (err) {
412
- return c.json({
413
- type: 'internal',
414
- title: 'copy failed',
415
- status: 500,
416
- detail: err instanceof Error ? err.message : String(err),
417
- }, 500);
418
- }
419
- return c.json({ activePipeline: body.pipeline });
420
- });
421
- // ── v0.49.2 Pipeline 文件 CRUD(Console Pipelines tab 编辑用)──────────
422
- /**
423
- * GET /api/projects/:name/pipelines/:file
424
- * 返回 { content, etag, parsed, parseError }。
425
- * parsed 是 YAML 解析后的结构化对象(供前端结构化表单使用);
426
- * parse 失败时 parsed=null + parseError 描述,前端退回纯 YAML 编辑。
427
- */
428
- app.get('/:name/pipelines/:file', (c) => {
429
- const name = c.req.param('name');
430
- const file = c.req.param('file');
431
- if (!/^[a-zA-Z0-9_.-]+\.yaml$/.test(file)) {
432
- return c.json({ type: 'validation', title: 'invalid filename', status: 422 }, 422);
433
- }
434
- const filePath = resolve(PROJECTS_DIR, name, 'pipelines', file);
435
- if (!existsSync(filePath)) {
436
- return c.json({ type: 'not-found', title: 'pipeline not found', status: 404 }, 404);
437
- }
438
- const content = readFileSync(filePath, 'utf-8');
439
- const etag = createHash('sha256').update(content).digest('hex').slice(0, 16);
440
- let parsed = null;
441
- let parseError = null;
442
- try {
443
- parsed = YAML.parse(content);
444
- }
445
- catch (err) {
446
- parseError = err instanceof Error ? err.message : String(err);
447
- }
448
- return c.json({ content, etag, parsed, parseError, isActive: file === 'project.yaml' });
449
- });
450
- /**
451
- * PATCH /api/projects/:name/pipelines/:file
452
- * 写 YAML,etag 乐观锁。保存前用 yaml.parse 做语法校验(422 如果非法)。
453
- * structural schema 校验不做(让 `sps tick` 层的 loadPipelineConfig 去报更精确的错)。
454
- */
455
- app.patch('/:name/pipelines/:file', async (c) => {
456
- const name = c.req.param('name');
457
- const file = c.req.param('file');
458
- if (!/^[a-zA-Z0-9_.-]+\.yaml$/.test(file)) {
459
- return c.json({ type: 'validation', title: 'invalid filename', status: 422 }, 422);
460
- }
461
- const filePath = resolve(PROJECTS_DIR, name, 'pipelines', file);
462
- if (!existsSync(filePath)) {
463
- return c.json({ type: 'not-found', title: 'pipeline not found', status: 404 }, 404);
464
- }
465
- const body = (await c.req.json().catch(() => null));
466
- if (!body || typeof body.content !== 'string') {
467
- return c.json({ type: 'validation', title: 'content required', status: 422 }, 422);
468
- }
469
- const ifMatch = body.etag ?? c.req.header('If-Match');
470
- if (!ifMatch) {
471
- return c.json({ type: 'validation', title: 'etag required', status: 422 }, 422);
472
- }
473
- const current = readFileSync(filePath, 'utf-8');
474
- const currentEtag = createHash('sha256').update(current).digest('hex').slice(0, 16);
475
- if (ifMatch !== currentEtag) {
476
- return c.json({ type: 'conflict', title: 'etag mismatch', status: 409, currentEtag }, 409);
477
- }
478
- // 语法校验
479
- try {
480
- YAML.parse(body.content);
481
- }
482
- catch (err) {
483
- return c.json({
484
- type: 'validation',
485
- title: 'yaml parse error',
486
- status: 422,
487
- detail: err instanceof Error ? err.message : String(err),
488
- }, 422);
489
- }
490
- writeFileSync(filePath, body.content);
491
- const newEtag = createHash('sha256').update(body.content).digest('hex').slice(0, 16);
492
- return c.json({ etag: newEtag });
493
- });
494
- /**
495
- * POST /api/projects/:name/pipelines
496
- * 新建 pipeline 文件。body: { name: "<file>.yaml", template?: "blank" | "sample" | "active" }
497
- * template: blank=最小化 stage / sample=copy sample.yaml.example / active=copy project.yaml
498
- */
499
- app.post('/:name/pipelines', async (c) => {
500
- const name = c.req.param('name');
501
- const body = (await c.req.json().catch(() => null));
502
- if (!body?.name || !/^[a-zA-Z0-9_.-]+\.yaml$/.test(body.name)) {
503
- return c.json({ type: 'validation', title: 'invalid filename', status: 422 }, 422);
504
- }
505
- const pipelinesDir = resolve(PROJECTS_DIR, name, 'pipelines');
506
- if (!existsSync(pipelinesDir)) {
507
- return c.json({ type: 'not-found', title: 'project has no pipelines dir', status: 404 }, 404);
508
- }
509
- const destPath = resolve(pipelinesDir, body.name);
510
- if (existsSync(destPath)) {
511
- return c.json({ type: 'conflict', title: 'pipeline already exists', status: 409 }, 409);
512
- }
513
- const template = body.template ?? 'blank';
514
- let content;
515
- if (template === 'sample') {
516
- const src = resolve(pipelinesDir, 'sample.yaml.example');
517
- if (!existsSync(src)) {
518
- return c.json({ type: 'not-found', title: 'sample not found', status: 404 }, 404);
519
- }
520
- content = readFileSync(src, 'utf-8');
521
- }
522
- else if (template === 'active') {
523
- const src = resolve(pipelinesDir, 'project.yaml');
524
- if (!existsSync(src)) {
525
- return c.json({ type: 'not-found', title: 'active pipeline not found', status: 404 }, 404);
526
- }
527
- content = readFileSync(src, 'utf-8');
528
- }
529
- else {
530
- // blank: minimal 1-stage project-mode pipeline
531
- content = `mode: project\n\nstages:\n - name: develop\n on_complete: "move_card Done"\n on_fail:\n action: "label NEEDS-FIX"\n halt: true\n`;
532
- }
533
- writeFileSync(destPath, content);
534
- const etag = createHash('sha256').update(content).digest('hex').slice(0, 16);
535
- return c.json({ name: body.name, content, etag }, 201);
536
- });
537
- /**
538
- * DELETE /api/projects/:name/pipelines/:file
539
- * 删 pipeline 文件。拒绝 project.yaml(是活动 pipeline,切换 active 再删)。
540
- * sample.yaml.example 也拒绝(教学模板,重装前别删)。
541
- */
542
- app.delete('/:name/pipelines/:file', (c) => {
543
- const name = c.req.param('name');
544
- const file = c.req.param('file');
545
- if (!/^[a-zA-Z0-9_.-]+\.yaml(\.example)?$/.test(file)) {
546
- return c.json({ type: 'validation', title: 'invalid filename', status: 422 }, 422);
547
- }
548
- if (file === 'project.yaml') {
549
- return c.json({
550
- type: 'conflict',
551
- title: 'cannot delete active pipeline',
552
- status: 409,
553
- detail: '先切到别的 pipeline 再来删',
554
- }, 409);
555
- }
556
- if (file === 'sample.yaml.example') {
557
- return c.json({
558
- type: 'conflict',
559
- title: 'cannot delete sample',
560
- status: 409,
561
- detail: '这是教学模板,不要删',
562
- }, 409);
563
- }
564
- const filePath = resolve(PROJECTS_DIR, name, 'pipelines', file);
565
- if (!existsSync(filePath)) {
566
- return c.json({ type: 'not-found', title: 'pipeline not found', status: 404 }, 404);
567
- }
568
- try {
569
- unlinkSync(filePath);
570
- }
571
- catch (err) {
572
- return c.json({
573
- type: 'internal',
574
- title: 'delete failed',
575
- status: 500,
576
- detail: err instanceof Error ? err.message : String(err),
577
- }, 500);
578
- }
579
- return c.body(null, 204);
580
- });
581
- return app;
582
- }
583
- //# sourceMappingURL=projects.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/console-server/routes/projects.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * @module console-server/routes/skills
3
- * @description Skill REST API - 复用 core/skillStore
4
- */
5
- import { Hono } from 'hono';
6
- export declare function createSkillsRoute(): Hono;
7
- //# sourceMappingURL=skills.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/console-server/routes/skills.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAuG5B,wBAAgB,iBAAiB,IAAI,IAAI,CAgLxC"}