@coralai/sps-cli 0.50.0 → 0.50.2
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/index.d.ts.map +1 -1
- package/dist/console/index.js +6 -3
- package/dist/console/index.js.map +1 -1
- package/dist/console/routes/chat.d.ts +10 -9
- package/dist/console/routes/chat.d.ts.map +1 -1
- package/dist/console/routes/chat.js +73 -153
- package/dist/console/routes/chat.js.map +1 -1
- package/dist/console/routes/system.d.ts +5 -2
- package/dist/console/routes/system.d.ts.map +1 -1
- package/dist/console/routes/system.js +33 -237
- package/dist/console/routes/system.js.map +1 -1
- package/dist/core/checklist.d.ts +1 -1
- package/dist/core/state.d.ts +1 -1
- package/dist/engines/MonitorEngine.d.ts +1 -1
- package/dist/engines/SchedulerEngine.d.ts +1 -1
- package/dist/engines/StageEngine.d.ts +1 -1
- package/dist/interfaces/RepoBackend.d.ts +1 -1
- package/dist/interfaces/TaskBackend.d.ts +1 -1
- package/dist/providers/GitLabRepoBackend.d.ts +1 -1
- package/dist/providers/MarkdownTaskBackend.d.ts +1 -1
- package/dist/providers/MarkdownTaskBackend.d.ts.map +1 -1
- package/dist/providers/MarkdownTaskBackend.js +1 -0
- package/dist/providers/MarkdownTaskBackend.js.map +1 -1
- package/dist/services/CardService.js +4 -2
- package/dist/services/CardService.js.map +1 -1
- package/dist/services/SystemService.d.ts +67 -0
- package/dist/services/SystemService.d.ts.map +1 -0
- package/dist/services/SystemService.js +278 -0
- package/dist/services/SystemService.js.map +1 -0
- package/dist/services/container.d.ts +10 -13
- package/dist/services/container.d.ts.map +1 -1
- package/dist/services/container.js +30 -3
- package/dist/services/container.js.map +1 -1
- package/dist/shared/types.d.ts +98 -5
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +9 -0
- package/dist/shared/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { Clock } from '../infra/clock.js';
|
|
2
|
+
import type { FileSystem } from '../infra/filesystem.js';
|
|
3
|
+
import type { ProcessSpawner } from '../infra/spawn.js';
|
|
4
|
+
import { type DomainError } from '../shared/errors.js';
|
|
5
|
+
import { type Result } from '../shared/result.js';
|
|
6
|
+
export interface SystemInfo {
|
|
7
|
+
readonly version: string;
|
|
8
|
+
readonly nodeVersion: string;
|
|
9
|
+
readonly startedAt: string;
|
|
10
|
+
readonly uptimeMs: number;
|
|
11
|
+
readonly platform: string;
|
|
12
|
+
readonly pid: number;
|
|
13
|
+
}
|
|
14
|
+
export interface EnvEntry {
|
|
15
|
+
readonly key: string;
|
|
16
|
+
readonly value: string;
|
|
17
|
+
readonly masked: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface EnvListing {
|
|
20
|
+
readonly path: string;
|
|
21
|
+
readonly exists: boolean;
|
|
22
|
+
readonly entries: EnvEntry[];
|
|
23
|
+
}
|
|
24
|
+
export interface EnvRaw {
|
|
25
|
+
readonly path: string;
|
|
26
|
+
readonly exists: boolean;
|
|
27
|
+
readonly content: string;
|
|
28
|
+
readonly etag: string;
|
|
29
|
+
}
|
|
30
|
+
export interface LatestVersion {
|
|
31
|
+
readonly current: string;
|
|
32
|
+
readonly latest: string;
|
|
33
|
+
readonly upToDate: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface UpgradeResult {
|
|
36
|
+
readonly ok: boolean;
|
|
37
|
+
readonly output: string;
|
|
38
|
+
}
|
|
39
|
+
export interface DoctorReport {
|
|
40
|
+
readonly project: string;
|
|
41
|
+
readonly issues: string[];
|
|
42
|
+
readonly ok: boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface SystemServiceDeps {
|
|
45
|
+
readonly fs: FileSystem;
|
|
46
|
+
readonly clock: Clock;
|
|
47
|
+
readonly spawner: ProcessSpawner;
|
|
48
|
+
readonly version: string;
|
|
49
|
+
readonly startedAt: Date;
|
|
50
|
+
}
|
|
51
|
+
export declare class SystemService {
|
|
52
|
+
private readonly deps;
|
|
53
|
+
constructor(deps: SystemServiceDeps);
|
|
54
|
+
info(): SystemInfo;
|
|
55
|
+
readEnv(): Promise<Result<EnvListing, DomainError>>;
|
|
56
|
+
readEnvRaw(): Promise<Result<EnvRaw, DomainError>>;
|
|
57
|
+
writeEnv(content: string, etag: string | undefined): Promise<Result<{
|
|
58
|
+
etag: string;
|
|
59
|
+
}, DomainError>>;
|
|
60
|
+
latestVersion(): Promise<Result<LatestVersion, DomainError>>;
|
|
61
|
+
/** 执行 npm i -g —— pipeline 在跑时拒绝以保证原子性。 */
|
|
62
|
+
upgrade(): Promise<Result<UpgradeResult, DomainError>>;
|
|
63
|
+
doctorAll(): Promise<Result<DoctorReport[], DomainError>>;
|
|
64
|
+
/** 列出当前在跑 pipeline 的项目名 —— upgrade 前置检查用 */
|
|
65
|
+
private listRunningPipelines;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=SystemService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemService.d.ts","sourceRoot":"","sources":["../../src/services/SystemService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module services/SystemService
|
|
3
|
+
* @description 系统级信息 + ~/.coral/env CRUD + npm upgrade + doctor
|
|
4
|
+
*
|
|
5
|
+
* @layer services
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import { chmodSync } from 'node:fs';
|
|
10
|
+
import { domainError } from '../shared/errors.js';
|
|
11
|
+
import { err, ok } from '../shared/result.js';
|
|
12
|
+
import { globalEnvFile, projectConfFile, projectsDir, runtimeDir, supervisorPidFile, WorkerMarkerFilenameRe, } from '../shared/runtimePaths.js';
|
|
13
|
+
import { resolve } from 'node:path';
|
|
14
|
+
const SECRET_KEY_PATTERNS = [
|
|
15
|
+
/_TOKEN$/,
|
|
16
|
+
/_KEY$/,
|
|
17
|
+
/_SECRET$/,
|
|
18
|
+
/_PASSWORD$/,
|
|
19
|
+
/_PASS$/,
|
|
20
|
+
/^(ANTHROPIC|OPENAI|CLAUDE|PLANE|TRELLO|MATRIX)_/,
|
|
21
|
+
];
|
|
22
|
+
export class SystemService {
|
|
23
|
+
deps;
|
|
24
|
+
constructor(deps) {
|
|
25
|
+
this.deps = deps;
|
|
26
|
+
}
|
|
27
|
+
info() {
|
|
28
|
+
return {
|
|
29
|
+
version: this.deps.version,
|
|
30
|
+
nodeVersion: process.version,
|
|
31
|
+
startedAt: this.deps.startedAt.toISOString(),
|
|
32
|
+
uptimeMs: this.deps.clock.now() - this.deps.startedAt.getTime(),
|
|
33
|
+
platform: process.platform,
|
|
34
|
+
pid: process.pid,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async readEnv() {
|
|
38
|
+
const path = globalEnvFile();
|
|
39
|
+
if (!this.deps.fs.exists(path)) {
|
|
40
|
+
return ok({ path, exists: false, entries: [] });
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const raw = this.deps.fs.readFile(path);
|
|
44
|
+
const entries = [];
|
|
45
|
+
for (const line of raw.split('\n')) {
|
|
46
|
+
const t = line.trim();
|
|
47
|
+
if (!t || t.startsWith('#'))
|
|
48
|
+
continue;
|
|
49
|
+
const m = t.match(/^(?:export\s+)?([A-Z_][A-Z0-9_]*)=["']?(.*?)["']?\s*$/);
|
|
50
|
+
if (!m)
|
|
51
|
+
continue;
|
|
52
|
+
const key = m[1] ?? '';
|
|
53
|
+
const value = m[2] ?? '';
|
|
54
|
+
const masked = isSecret(key);
|
|
55
|
+
entries.push({ key, value: masked ? maskSecret(value) : value, masked });
|
|
56
|
+
}
|
|
57
|
+
return ok({ path, exists: true, entries });
|
|
58
|
+
}
|
|
59
|
+
catch (cause) {
|
|
60
|
+
return err(domainError('internal', 'ENV_READ_FAIL', 'env 文件读取失败', { cause }));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async readEnvRaw() {
|
|
64
|
+
const path = globalEnvFile();
|
|
65
|
+
if (!this.deps.fs.exists(path)) {
|
|
66
|
+
return ok({ path, exists: false, content: '', etag: '' });
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const content = this.deps.fs.readFile(path);
|
|
70
|
+
return ok({ path, exists: true, content, etag: hashEtag(content) });
|
|
71
|
+
}
|
|
72
|
+
catch (cause) {
|
|
73
|
+
return err(domainError('internal', 'ENV_READ_FAIL', 'env 文件读取失败', { cause }));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async writeEnv(content, etag) {
|
|
77
|
+
const path = globalEnvFile();
|
|
78
|
+
const exists = this.deps.fs.exists(path);
|
|
79
|
+
if (exists) {
|
|
80
|
+
if (!etag) {
|
|
81
|
+
return err(domainError('validation', 'ETAG_REQUIRED', 'etag 必填(已有文件)'));
|
|
82
|
+
}
|
|
83
|
+
const currentContent = this.deps.fs.readFile(path);
|
|
84
|
+
const currentEtag = hashEtag(currentContent);
|
|
85
|
+
if (etag !== currentEtag) {
|
|
86
|
+
return err(domainError('conflict', 'ENV_ETAG_MISMATCH', 'env 已被其它编辑修改,请重新加载', { details: { currentEtag } }));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
this.deps.fs.writeFileAtomic(path, content);
|
|
91
|
+
// 保持 0600 权限 —— env 常含 secret
|
|
92
|
+
try {
|
|
93
|
+
chmodSync(path, 0o600);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
/* best effort */
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (cause) {
|
|
100
|
+
return err(domainError('internal', 'ENV_WRITE_FAIL', 'env 写入失败', { cause }));
|
|
101
|
+
}
|
|
102
|
+
return ok({ etag: hashEtag(content) });
|
|
103
|
+
}
|
|
104
|
+
async latestVersion() {
|
|
105
|
+
// `spawner` is wired as ProcessSpawner for sps CLI; `npm view` is a different
|
|
106
|
+
// binary so we spawn it directly (still isolated to the service layer).
|
|
107
|
+
return new Promise((resolvePromise) => {
|
|
108
|
+
const child = spawn('npm', ['view', '@coralai/sps-cli', 'version'], {
|
|
109
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
110
|
+
});
|
|
111
|
+
let stdout = '';
|
|
112
|
+
let stderr = '';
|
|
113
|
+
const timer = setTimeout(() => {
|
|
114
|
+
try {
|
|
115
|
+
child.kill('SIGKILL');
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
/* noop */
|
|
119
|
+
}
|
|
120
|
+
resolvePromise(err(domainError('external', 'NPM_VIEW_TIMEOUT', 'npm view 超时 (10s)', {
|
|
121
|
+
details: { timeoutMs: 10_000 },
|
|
122
|
+
})));
|
|
123
|
+
}, 10_000);
|
|
124
|
+
child.stdout?.on('data', (d) => (stdout += d.toString()));
|
|
125
|
+
child.stderr?.on('data', (d) => (stderr += d.toString()));
|
|
126
|
+
child.on('close', (code) => {
|
|
127
|
+
clearTimeout(timer);
|
|
128
|
+
if (code === 0) {
|
|
129
|
+
const latest = stdout.trim();
|
|
130
|
+
resolvePromise(ok({
|
|
131
|
+
current: this.deps.version,
|
|
132
|
+
latest,
|
|
133
|
+
upToDate: this.deps.version === latest,
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
resolvePromise(err(domainError('external', 'NPM_VIEW_FAIL', 'npm view 失败', {
|
|
138
|
+
details: { stderr: stderr.trim(), exitCode: code },
|
|
139
|
+
})));
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
child.on('error', (e) => {
|
|
143
|
+
clearTimeout(timer);
|
|
144
|
+
resolvePromise(err(domainError('external', 'NPM_VIEW_ERROR', 'npm view 出错', {
|
|
145
|
+
cause: e,
|
|
146
|
+
details: { message: e.message },
|
|
147
|
+
})));
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/** 执行 npm i -g —— pipeline 在跑时拒绝以保证原子性。 */
|
|
152
|
+
async upgrade() {
|
|
153
|
+
const running = this.listRunningPipelines();
|
|
154
|
+
if (running.length > 0) {
|
|
155
|
+
return err(domainError('conflict', 'PIPELINES_RUNNING', '有 pipeline 在跑,升级前请先停止', {
|
|
156
|
+
details: { projects: running },
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
return new Promise((resolvePromise) => {
|
|
160
|
+
const child = spawn('npm', ['i', '-g', '@coralai/sps-cli@latest'], {
|
|
161
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
162
|
+
});
|
|
163
|
+
let output = '';
|
|
164
|
+
const timer = setTimeout(() => {
|
|
165
|
+
try {
|
|
166
|
+
child.kill('SIGKILL');
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
/* noop */
|
|
170
|
+
}
|
|
171
|
+
resolvePromise(ok({ ok: false, output: output + '\n[timeout 120s]' }));
|
|
172
|
+
}, 120_000);
|
|
173
|
+
child.stdout?.on('data', (d) => (output += d.toString()));
|
|
174
|
+
child.stderr?.on('data', (d) => (output += d.toString()));
|
|
175
|
+
child.on('close', (code) => {
|
|
176
|
+
clearTimeout(timer);
|
|
177
|
+
resolvePromise(ok({ ok: code === 0, output }));
|
|
178
|
+
});
|
|
179
|
+
child.on('error', (e) => {
|
|
180
|
+
clearTimeout(timer);
|
|
181
|
+
resolvePromise(ok({ ok: false, output: output + `\n[spawn error: ${e.message}]` }));
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
async doctorAll() {
|
|
186
|
+
const root = projectsDir();
|
|
187
|
+
if (!this.deps.fs.exists(root)) {
|
|
188
|
+
return ok([]);
|
|
189
|
+
}
|
|
190
|
+
let names;
|
|
191
|
+
try {
|
|
192
|
+
names = this.deps.fs.readDir(root).filter((e) => e.isDirectory).map((e) => e.name);
|
|
193
|
+
}
|
|
194
|
+
catch (cause) {
|
|
195
|
+
return err(domainError('internal', 'PROJECTS_READ_FAIL', 'projects 目录读取失败', { cause }));
|
|
196
|
+
}
|
|
197
|
+
const now = this.deps.clock.now();
|
|
198
|
+
const report = [];
|
|
199
|
+
for (const name of names) {
|
|
200
|
+
const issues = [];
|
|
201
|
+
if (!this.deps.fs.exists(projectConfFile(name)))
|
|
202
|
+
issues.push('missing conf');
|
|
203
|
+
const cardsDir = resolve(root, name, 'cards');
|
|
204
|
+
if (!this.deps.fs.exists(cardsDir))
|
|
205
|
+
issues.push('missing cards/');
|
|
206
|
+
const runtime = runtimeDir(name);
|
|
207
|
+
if (this.deps.fs.exists(runtime)) {
|
|
208
|
+
try {
|
|
209
|
+
const markers = this.deps.fs
|
|
210
|
+
.readDir(runtime)
|
|
211
|
+
.filter((e) => e.isFile && WorkerMarkerFilenameRe.test(e.name));
|
|
212
|
+
for (const mf of markers) {
|
|
213
|
+
const stat = this.deps.fs.stat(resolve(runtime, mf.name));
|
|
214
|
+
if (stat) {
|
|
215
|
+
const ageMin = Math.floor((now - stat.mtimeMs) / 60000);
|
|
216
|
+
if (ageMin > 60)
|
|
217
|
+
issues.push(`stale marker ${mf.name} (${ageMin}m)`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
/* ignore */
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
report.push({ project: name, issues, ok: issues.length === 0 });
|
|
226
|
+
}
|
|
227
|
+
return ok(report);
|
|
228
|
+
}
|
|
229
|
+
/** 列出当前在跑 pipeline 的项目名 —— upgrade 前置检查用 */
|
|
230
|
+
listRunningPipelines() {
|
|
231
|
+
const root = projectsDir();
|
|
232
|
+
if (!this.deps.fs.exists(root))
|
|
233
|
+
return [];
|
|
234
|
+
const out = [];
|
|
235
|
+
try {
|
|
236
|
+
const names = this.deps.fs.readDir(root).filter((e) => e.isDirectory).map((e) => e.name);
|
|
237
|
+
for (const name of names) {
|
|
238
|
+
const pidFile = supervisorPidFile(name);
|
|
239
|
+
if (!this.deps.fs.exists(pidFile))
|
|
240
|
+
continue;
|
|
241
|
+
try {
|
|
242
|
+
const pid = Number.parseInt(this.deps.fs.readFile(pidFile).trim(), 10);
|
|
243
|
+
if (pid > 0) {
|
|
244
|
+
try {
|
|
245
|
+
process.kill(pid, 0);
|
|
246
|
+
out.push(name);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
/* dead pid */
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
/* unreadable */
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
/* ignore */
|
|
260
|
+
}
|
|
261
|
+
return out;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// ─── Helpers ──────────────────────────────────────────────────────
|
|
265
|
+
function maskSecret(value) {
|
|
266
|
+
if (!value)
|
|
267
|
+
return '';
|
|
268
|
+
if (value.length <= 6)
|
|
269
|
+
return '****';
|
|
270
|
+
return value.slice(0, 4) + '****';
|
|
271
|
+
}
|
|
272
|
+
function isSecret(key) {
|
|
273
|
+
return SECRET_KEY_PATTERNS.some((p) => p.test(key));
|
|
274
|
+
}
|
|
275
|
+
function hashEtag(content) {
|
|
276
|
+
return createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=SystemService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemService.js","sourceRoot":"","sources":["../../src/services/SystemService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module services/container
|
|
3
|
-
* @description Service DI 容器 —— 一次构造,Delivery 层取用
|
|
4
|
-
*
|
|
5
|
-
* @layer services
|
|
6
|
-
*
|
|
7
|
-
* 使用:
|
|
8
|
-
* CLI: const c = createContainer();
|
|
9
|
-
* Console: const c = createContainer({ events }); // 注入 SseEventBus
|
|
10
|
-
* Tests: const c = createContainer({ fs, clock, events, spawner });
|
|
11
|
-
*/
|
|
12
1
|
import { type Clock } from '../infra/clock.js';
|
|
13
2
|
import { type FileSystem } from '../infra/filesystem.js';
|
|
14
3
|
import { type ProcessSpawner } from '../infra/spawn.js';
|
|
@@ -17,9 +6,10 @@ import { CardService } from './CardService.js';
|
|
|
17
6
|
import { type ChatExecutor, ChatService } from './ChatService.js';
|
|
18
7
|
import { LogService } from './LogService.js';
|
|
19
8
|
import { type PipelineExecutor, PipelineService } from './PipelineService.js';
|
|
20
|
-
import { type ProjectInitExecutor, ProjectService } from './ProjectService.js';
|
|
21
9
|
import type { TaskBackendFactory } from './ports.js';
|
|
10
|
+
import { type ProjectInitExecutor, ProjectService } from './ProjectService.js';
|
|
22
11
|
import { SkillService } from './SkillService.js';
|
|
12
|
+
import { SystemService } from './SystemService.js';
|
|
23
13
|
import { type WorkerExecutor, WorkerService } from './WorkerService.js';
|
|
24
14
|
export interface ServiceContainer {
|
|
25
15
|
readonly projects: ProjectService;
|
|
@@ -29,6 +19,11 @@ export interface ServiceContainer {
|
|
|
29
19
|
readonly skills: SkillService;
|
|
30
20
|
readonly logs: LogService;
|
|
31
21
|
readonly chat: ChatService;
|
|
22
|
+
readonly system: SystemService;
|
|
23
|
+
}
|
|
24
|
+
export interface SystemMeta {
|
|
25
|
+
version: string;
|
|
26
|
+
startedAt: Date;
|
|
32
27
|
}
|
|
33
28
|
export interface ContainerOptions {
|
|
34
29
|
/** 基础 infra —— 不传用 Node 默认 */
|
|
@@ -36,12 +31,14 @@ export interface ContainerOptions {
|
|
|
36
31
|
clock?: Clock;
|
|
37
32
|
events?: DomainEventBus;
|
|
38
33
|
spawner?: ProcessSpawner;
|
|
39
|
-
/** Phase 3 注入的 CLI
|
|
34
|
+
/** Phase 3 注入的 CLI 适配器 */
|
|
40
35
|
taskBackendFactory?: TaskBackendFactory;
|
|
41
36
|
projectInitExecutor?: ProjectInitExecutor;
|
|
42
37
|
workerExecutor?: WorkerExecutor;
|
|
43
38
|
pipelineExecutor?: PipelineExecutor;
|
|
44
39
|
chatExecutor?: ChatExecutor;
|
|
40
|
+
/** SystemService 元数据 —— 未注入时从 package.json 读 version + now() */
|
|
41
|
+
systemMeta?: SystemMeta;
|
|
45
42
|
}
|
|
46
43
|
export declare function createContainer(opts?: ContainerOptions): ServiceContainer;
|
|
47
44
|
//# sourceMappingURL=container.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/services/container.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/services/container.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,KAAK,EAAe,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,KAAK,cAAc,EAAgB,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAQlE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,KAAK,mBAAmB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,KAAK,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,0BAA0B;IAC1B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gEAAgE;IAChE,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,gBAAqB,GAAG,gBAAgB,CAgE7E"}
|
|
@@ -6,9 +6,12 @@
|
|
|
6
6
|
*
|
|
7
7
|
* 使用:
|
|
8
8
|
* CLI: const c = createContainer();
|
|
9
|
-
* Console: const c = createContainer({ events });
|
|
9
|
+
* Console: const c = createContainer({ events, systemMeta });
|
|
10
10
|
* Tests: const c = createContainer({ fs, clock, events, spawner });
|
|
11
11
|
*/
|
|
12
|
+
import { readFileSync } from 'node:fs';
|
|
13
|
+
import { dirname, resolve } from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
12
15
|
import { SystemClock } from '../infra/clock.js';
|
|
13
16
|
import { NodeFileSystem } from '../infra/filesystem.js';
|
|
14
17
|
import { NodeProcessSpawner } from '../infra/spawn.js';
|
|
@@ -21,6 +24,7 @@ import { LogService } from './LogService.js';
|
|
|
21
24
|
import { PipelineService } from './PipelineService.js';
|
|
22
25
|
import { ProjectService } from './ProjectService.js';
|
|
23
26
|
import { SkillService } from './SkillService.js';
|
|
27
|
+
import { SystemService } from './SystemService.js';
|
|
24
28
|
import { WorkerService } from './WorkerService.js';
|
|
25
29
|
export function createContainer(opts = {}) {
|
|
26
30
|
const fs = opts.fs ?? new NodeFileSystem();
|
|
@@ -28,11 +32,14 @@ export function createContainer(opts = {}) {
|
|
|
28
32
|
const events = opts.events ?? new NoopEventBus();
|
|
29
33
|
const spawner = opts.spawner ?? new NodeProcessSpawner();
|
|
30
34
|
const taskBackendFactory = opts.taskBackendFactory ?? new DefaultTaskBackendFactory();
|
|
31
|
-
// 默认 executor 注入 —— 测试可以覆盖
|
|
32
35
|
const workerExecutor = opts.workerExecutor ?? new DefaultWorkerExecutor();
|
|
33
36
|
const pipelineExecutor = opts.pipelineExecutor ?? new DefaultPipelineExecutor(spawner);
|
|
34
37
|
const chatExecutor = opts.chatExecutor ?? new DefaultChatExecutor();
|
|
35
38
|
const projectInitExecutor = opts.projectInitExecutor ?? new DefaultProjectInitExecutor();
|
|
39
|
+
const systemMeta = opts.systemMeta ?? {
|
|
40
|
+
version: resolveSelfVersion(),
|
|
41
|
+
startedAt: new Date(clock.now()),
|
|
42
|
+
};
|
|
36
43
|
const cards = new CardService({
|
|
37
44
|
backendFactory: taskBackendFactory,
|
|
38
45
|
events,
|
|
@@ -51,7 +58,6 @@ export function createContainer(opts = {}) {
|
|
|
51
58
|
clock,
|
|
52
59
|
events,
|
|
53
60
|
executor: workerExecutor,
|
|
54
|
-
// 给 Worker 反查 card title 用 —— 避免只返 #seq fallback
|
|
55
61
|
cardTitleLookup: async (project, seq) => {
|
|
56
62
|
const r = await cards.get(project, seq);
|
|
57
63
|
return r.ok ? r.value.title : null;
|
|
@@ -72,6 +78,27 @@ export function createContainer(opts = {}) {
|
|
|
72
78
|
events,
|
|
73
79
|
executor: chatExecutor,
|
|
74
80
|
}),
|
|
81
|
+
system: new SystemService({
|
|
82
|
+
fs,
|
|
83
|
+
clock,
|
|
84
|
+
spawner,
|
|
85
|
+
version: systemMeta.version,
|
|
86
|
+
startedAt: systemMeta.startedAt,
|
|
87
|
+
}),
|
|
75
88
|
};
|
|
76
89
|
}
|
|
90
|
+
// ─── helpers ───────────────────────────────────────────────────────
|
|
91
|
+
function resolveSelfVersion() {
|
|
92
|
+
try {
|
|
93
|
+
const here = fileURLToPath(import.meta.url);
|
|
94
|
+
// dist/services/container.js → dist/../package.json
|
|
95
|
+
// src/services/container.ts → src/../package.json
|
|
96
|
+
const pkgPath = resolve(dirname(here), '..', '..', 'package.json');
|
|
97
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
98
|
+
return typeof pkg.version === 'string' ? pkg.version : 'unknown';
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return 'unknown';
|
|
102
|
+
}
|
|
103
|
+
}
|
|
77
104
|
//# sourceMappingURL=container.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/services/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAc,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAmB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAuB,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAuB,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAqB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/services/container.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/types.d.ts
CHANGED
|
@@ -1,12 +1,105 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module shared/types
|
|
3
|
-
* @description 跨层共享的领域类型 —— Service / Domain / Infra 都能 import
|
|
3
|
+
* @description 跨层共享的领域类型 —— Service / Domain / Infra / Delivery 都能 import
|
|
4
4
|
*
|
|
5
5
|
* @layer shared
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* 这样旧代码不受影响,新代码统一从 shared/types import。
|
|
7
|
+
* v0.50.1:从 src/models/types.ts 物理迁入。老路径已删除,所有 caller 改 import
|
|
8
|
+
* 本文件。新类型继续加在这里。
|
|
10
9
|
*/
|
|
11
|
-
|
|
10
|
+
/** Unified card representation across PM backends */
|
|
11
|
+
export interface ChecklistItem {
|
|
12
|
+
text: string;
|
|
13
|
+
done: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ChecklistStats {
|
|
16
|
+
total: number;
|
|
17
|
+
done: number;
|
|
18
|
+
percent: number;
|
|
19
|
+
items: ChecklistItem[];
|
|
20
|
+
}
|
|
21
|
+
export interface Card {
|
|
22
|
+
id: string;
|
|
23
|
+
seq: string;
|
|
24
|
+
/** Card title — user-visible task name. v0.42.0 renamed from `name`. */
|
|
25
|
+
title: string;
|
|
26
|
+
/** Parsed `## 描述` section content (or whole description on non-markdown backends). */
|
|
27
|
+
desc: string;
|
|
28
|
+
/**
|
|
29
|
+
* Raw markdown body (all sections) for markdown backends.
|
|
30
|
+
* Populated by `MarkdownTaskBackend.readCard` (v0.50.2+) so UI can render per-section
|
|
31
|
+
* blocks (`## 描述` / `## 检查清单` / `## 日志`) without re-reading the file.
|
|
32
|
+
* Non-markdown backends leave undefined.
|
|
33
|
+
*/
|
|
34
|
+
body?: string;
|
|
35
|
+
state: CardState;
|
|
36
|
+
labels: string[];
|
|
37
|
+
/** Business metadata: skills required for this task (v0.42.0+). */
|
|
38
|
+
skills?: string[];
|
|
39
|
+
/** Runtime-parsed checklist progress from the "## 检查清单" markdown section. */
|
|
40
|
+
checklist?: ChecklistStats;
|
|
41
|
+
meta: Record<string, unknown>;
|
|
42
|
+
/** Retry count for current task — incremented on failure, reset on success or manual reset */
|
|
43
|
+
retryCount?: number;
|
|
44
|
+
}
|
|
45
|
+
/** Card state — defaults are Planning/Backlog/Todo/Inprogress/QA/Done but configurable via pipeline YAML */
|
|
46
|
+
export type CardState = string;
|
|
47
|
+
export type AuxiliaryState = 'BLOCKED' | 'NEEDS-FIX' | 'WAITING-CONFIRMATION' | 'CONFLICT' | 'STALE-RUNTIME';
|
|
48
|
+
/** Worker detection result */
|
|
49
|
+
export type WorkerStatus = 'ALIVE' | 'COMPLETED' | 'NEEDS_INPUT' | 'AUTO_CONFIRM' | 'BLOCKED' | 'DEAD' | 'DEAD_EXCEEDED'
|
|
50
|
+
/** Process exited (code 0) but no artifacts found (no commits/MR). Worker gave up or hit token limit. */
|
|
51
|
+
| 'EXITED_INCOMPLETE';
|
|
52
|
+
/** MR status from repo backend */
|
|
53
|
+
export interface MrStatus {
|
|
54
|
+
exists: boolean;
|
|
55
|
+
state: 'opened' | 'merged' | 'closed' | 'not_found';
|
|
56
|
+
ciStatus: 'success' | 'failed' | 'running' | 'pending' | 'created' | 'unknown';
|
|
57
|
+
mergeStatus: 'can_be_merged' | 'cannot_be_merged' | 'checking' | 'unknown';
|
|
58
|
+
url: string | null;
|
|
59
|
+
iid: number | null;
|
|
60
|
+
}
|
|
61
|
+
/** Result from a tick step or command */
|
|
62
|
+
export interface CommandResult {
|
|
63
|
+
project: string;
|
|
64
|
+
component: string;
|
|
65
|
+
status: 'ok' | 'fail' | 'degraded' | 'skipped';
|
|
66
|
+
exitCode: number;
|
|
67
|
+
actions: ActionRecord[];
|
|
68
|
+
recommendedActions: RecommendedAction[];
|
|
69
|
+
details: Record<string, unknown>;
|
|
70
|
+
}
|
|
71
|
+
export interface ActionRecord {
|
|
72
|
+
action: string;
|
|
73
|
+
entity: string;
|
|
74
|
+
result: 'ok' | 'fail' | 'skip';
|
|
75
|
+
message?: string;
|
|
76
|
+
}
|
|
77
|
+
/** Tick aggregated result */
|
|
78
|
+
export interface TickResult extends CommandResult {
|
|
79
|
+
steps: StepResult[];
|
|
80
|
+
}
|
|
81
|
+
export interface StepResult {
|
|
82
|
+
step: string;
|
|
83
|
+
status: 'ok' | 'fail' | 'degraded' | 'skipped';
|
|
84
|
+
exitCode: number;
|
|
85
|
+
error?: string;
|
|
86
|
+
note?: string;
|
|
87
|
+
actions?: ActionRecord[];
|
|
88
|
+
checks?: CheckResult[];
|
|
89
|
+
}
|
|
90
|
+
/** recommendedActions protocol (03 §8.4) */
|
|
91
|
+
export interface RecommendedAction {
|
|
92
|
+
action: string;
|
|
93
|
+
reason: string;
|
|
94
|
+
severity: 'info' | 'warning' | 'critical';
|
|
95
|
+
autoExecutable: boolean;
|
|
96
|
+
requiresConfirmation: boolean;
|
|
97
|
+
safeToRetry: boolean;
|
|
98
|
+
}
|
|
99
|
+
/** Doctor check result */
|
|
100
|
+
export interface CheckResult {
|
|
101
|
+
name: string;
|
|
102
|
+
status: 'pass' | 'fail' | 'warn' | 'skip';
|
|
103
|
+
message: string;
|
|
104
|
+
}
|
|
12
105
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/types.js
CHANGED
|
@@ -1,2 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module shared/types
|
|
3
|
+
* @description 跨层共享的领域类型 —— Service / Domain / Infra / Delivery 都能 import
|
|
4
|
+
*
|
|
5
|
+
* @layer shared
|
|
6
|
+
*
|
|
7
|
+
* v0.50.1:从 src/models/types.ts 物理迁入。老路径已删除,所有 caller 改 import
|
|
8
|
+
* 本文件。新类型继续加在这里。
|
|
9
|
+
*/
|
|
1
10
|
export {};
|
|
2
11
|
//# sourceMappingURL=types.js.map
|