@coralai/sps-cli 0.66.8 → 0.67.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/CHANGELOG.md +49 -0
- package/assembly/art.yml +6 -0
- package/assembly/base.yml +72 -0
- package/assembly/cli.yml +4 -0
- package/assembly/console.yml +4 -0
- package/assembly/daemon.yml +4 -0
- package/dist/commands/agentCommand.d.ts +22 -1
- package/dist/commands/agentCommand.d.ts.map +1 -1
- package/dist/commands/agentCommand.js +14 -15
- package/dist/commands/agentCommand.js.map +1 -1
- package/dist/commands/cardAdd.d.ts +14 -1
- package/dist/commands/cardAdd.d.ts.map +1 -1
- package/dist/commands/cardAdd.js +5 -13
- package/dist/commands/cardAdd.js.map +1 -1
- package/dist/commands/cardInsert.d.ts +19 -1
- package/dist/commands/cardInsert.d.ts.map +1 -1
- package/dist/commands/cardInsert.js +5 -18
- package/dist/commands/cardInsert.js.map +1 -1
- package/dist/commands/consoleCommand.d.ts +20 -1
- package/dist/commands/consoleCommand.d.ts.map +1 -1
- package/dist/commands/consoleCommand.js +5 -2
- package/dist/commands/consoleCommand.js.map +1 -1
- package/dist/commands/imCommand.d.ts +9 -1
- package/dist/commands/imCommand.d.ts.map +1 -1
- package/dist/commands/imCommand.js +2 -9
- package/dist/commands/imCommand.js.map +1 -1
- package/dist/commands/memoryCommand.d.ts +11 -1
- package/dist/commands/memoryCommand.d.ts.map +1 -1
- package/dist/commands/memoryCommand.js +12 -18
- package/dist/commands/memoryCommand.js.map +1 -1
- package/dist/commands/monitorTick.d.ts +24 -1
- package/dist/commands/monitorTick.d.ts.map +1 -1
- package/dist/commands/monitorTick.js +8 -4
- package/dist/commands/monitorTick.js.map +1 -1
- package/dist/commands/openaiAgent.d.ts +2 -1
- package/dist/commands/openaiAgent.d.ts.map +1 -1
- package/dist/commands/openaiAgent.js +7 -3
- package/dist/commands/openaiAgent.js.map +1 -1
- package/dist/commands/pipelineTick.d.ts +4 -1
- package/dist/commands/pipelineTick.d.ts.map +1 -1
- package/dist/commands/pipelineTick.js +11 -7
- package/dist/commands/pipelineTick.js.map +1 -1
- package/dist/commands/pluginCommand.d.ts +2 -0
- package/dist/commands/pluginCommand.d.ts.map +1 -0
- package/dist/commands/pluginCommand.js +160 -0
- package/dist/commands/pluginCommand.js.map +1 -0
- package/dist/commands/qaTick.d.ts +4 -1
- package/dist/commands/qaTick.d.ts.map +1 -1
- package/dist/commands/qaTick.js +11 -7
- package/dist/commands/qaTick.js.map +1 -1
- package/dist/commands/schedulerTick.d.ts +24 -1
- package/dist/commands/schedulerTick.d.ts.map +1 -1
- package/dist/commands/schedulerTick.js +5 -23
- package/dist/commands/schedulerTick.js.map +1 -1
- package/dist/commands/tick.d.ts +25 -2
- package/dist/commands/tick.d.ts.map +1 -1
- package/dist/commands/tick.js +39 -16
- package/dist/commands/tick.js.map +1 -1
- package/dist/commands/workerLaunch.d.ts +4 -1
- package/dist/commands/workerLaunch.d.ts.map +1 -1
- package/dist/commands/workerLaunch.js +11 -7
- package/dist/commands/workerLaunch.js.map +1 -1
- package/dist/console/index.d.ts +21 -0
- package/dist/console/index.d.ts.map +1 -1
- package/dist/console/index.js +8 -4
- package/dist/console/index.js.map +1 -1
- package/dist/console/routes/capabilities.d.ts +3 -0
- package/dist/console/routes/capabilities.d.ts.map +1 -1
- package/dist/console/routes/capabilities.js +2 -21
- package/dist/console/routes/capabilities.js.map +1 -1
- package/dist/console/routes/cards.d.ts +19 -0
- package/dist/console/routes/cards.d.ts.map +1 -1
- package/dist/console/routes/cards.js +1 -1
- package/dist/console/routes/cards.js.map +1 -1
- package/dist/console/routes/mcpTools.d.ts +2 -1
- package/dist/console/routes/mcpTools.d.ts.map +1 -1
- package/dist/console/routes/mcpTools.js +3 -8
- package/dist/console/routes/mcpTools.js.map +1 -1
- package/dist/console/routes/plugins.d.ts +20 -0
- package/dist/console/routes/plugins.d.ts.map +1 -0
- package/dist/console/routes/plugins.js +191 -0
- package/dist/console/routes/plugins.js.map +1 -0
- package/dist/console/routes/tts.d.ts +2 -1
- package/dist/console/routes/tts.d.ts.map +1 -1
- package/dist/console/routes/tts.js +2 -3
- package/dist/console/routes/tts.js.map +1 -1
- package/dist/console-assets/assets/{ShowcasePage-C8tqVK7m.js → ShowcasePage-BT8yKbuT.js} +1 -1
- package/dist/console-assets/assets/{index-DCKXZKta.css → index-B1FscG4r.css} +1 -1
- package/dist/console-assets/assets/{index-DAvJ1-Qg.js → index-Dht87wHH.js} +226 -211
- package/dist/console-assets/index.html +2 -2
- package/dist/core/agents/resolveBackend.d.ts +0 -5
- package/dist/core/agents/resolveBackend.d.ts.map +1 -1
- package/dist/core/agents/resolveBackend.js +6 -52
- package/dist/core/agents/resolveBackend.js.map +1 -1
- package/dist/core/art/artRunService.d.ts +13 -1
- package/dist/core/art/artRunService.d.ts.map +1 -1
- package/dist/core/art/artRunService.js +1 -0
- package/dist/core/art/artRunService.js.map +1 -1
- package/dist/core/mcpToolCatalog.d.ts +14 -1
- package/dist/core/mcpToolCatalog.d.ts.map +1 -1
- package/dist/core/mcpToolCatalog.js +7 -11
- package/dist/core/mcpToolCatalog.js.map +1 -1
- package/dist/core/tools/ToolCardExecutor.d.ts +12 -2
- package/dist/core/tools/ToolCardExecutor.d.ts.map +1 -1
- package/dist/core/tools/ToolCardExecutor.js.map +1 -1
- package/dist/daemon/daemonClient.d.ts +8 -2
- package/dist/daemon/daemonClient.d.ts.map +1 -1
- package/dist/daemon/daemonClient.js +9 -0
- package/dist/daemon/daemonClient.js.map +1 -1
- package/dist/daemon/sessionDaemon.d.ts +7 -2
- package/dist/daemon/sessionDaemon.d.ts.map +1 -1
- package/dist/daemon/sessionDaemon.js +49 -10
- package/dist/daemon/sessionDaemon.js.map +1 -1
- package/dist/engines/StageEngine.d.ts +6 -1
- package/dist/engines/StageEngine.d.ts.map +1 -1
- package/dist/engines/StageEngine.js +10 -7
- package/dist/engines/StageEngine.js.map +1 -1
- package/dist/im/IMGatewayManager.d.ts +12 -0
- package/dist/im/IMGatewayManager.d.ts.map +1 -1
- package/dist/im/IMGatewayManager.js +10 -18
- package/dist/im/IMGatewayManager.js.map +1 -1
- package/dist/main.js +67 -21
- package/dist/main.js.map +1 -1
- package/dist/manager/makeBackendFactory.d.ts +12 -0
- package/dist/manager/makeBackendFactory.d.ts.map +1 -1
- package/dist/manager/makeBackendFactory.js +3 -2
- package/dist/manager/makeBackendFactory.js.map +1 -1
- package/dist/manager/worker-manager-impl.d.ts +19 -0
- package/dist/manager/worker-manager-impl.d.ts.map +1 -1
- package/dist/manager/worker-manager-impl.js +15 -15
- package/dist/manager/worker-manager-impl.js.map +1 -1
- package/dist/openai-agent/memory/v2Bridge.d.ts +28 -2
- package/dist/openai-agent/memory/v2Bridge.d.ts.map +1 -1
- package/dist/openai-agent/memory/v2Bridge.js +4 -20
- package/dist/openai-agent/memory/v2Bridge.js.map +1 -1
- package/dist/openai-agent/runWorker.d.ts +8 -6
- package/dist/openai-agent/runWorker.d.ts.map +1 -1
- package/dist/openai-agent/runWorker.js +5 -4
- package/dist/openai-agent/runWorker.js.map +1 -1
- package/dist/openai-agent/sandbox/execution.d.ts +10 -2
- package/dist/openai-agent/sandbox/execution.d.ts.map +1 -1
- package/dist/openai-agent/sandbox/execution.js +9 -6
- package/dist/openai-agent/sandbox/execution.js.map +1 -1
- package/dist/plugin/assembly.d.ts +37 -0
- package/dist/plugin/assembly.d.ts.map +1 -0
- package/dist/plugin/assembly.js +95 -0
- package/dist/plugin/assembly.js.map +1 -0
- package/dist/plugin/context.d.ts +101 -0
- package/dist/plugin/context.d.ts.map +1 -0
- package/dist/plugin/context.js +187 -0
- package/dist/plugin/context.js.map +1 -0
- package/dist/plugin/hot.d.ts +34 -0
- package/dist/plugin/hot.d.ts.map +1 -0
- package/dist/plugin/hot.js +62 -0
- package/dist/plugin/hot.js.map +1 -0
- package/dist/plugin/layers.d.ts +40 -0
- package/dist/plugin/layers.d.ts.map +1 -0
- package/dist/plugin/layers.js +101 -0
- package/dist/plugin/layers.js.map +1 -0
- package/dist/plugin/manager.d.ts +96 -0
- package/dist/plugin/manager.d.ts.map +1 -0
- package/dist/plugin/manager.js +235 -0
- package/dist/plugin/manager.js.map +1 -0
- package/dist/plugin/run.d.ts +53 -0
- package/dist/plugin/run.d.ts.map +1 -0
- package/dist/plugin/run.js +72 -0
- package/dist/plugin/run.js.map +1 -0
- package/dist/providers/art/artGen.d.ts +18 -3
- package/dist/providers/art/artGen.d.ts.map +1 -1
- package/dist/providers/art/artGen.js +15 -15
- package/dist/providers/art/artGen.js.map +1 -1
- package/dist/providers/art/artRunChild.d.ts +2 -1
- package/dist/providers/art/artRunChild.d.ts.map +1 -1
- package/dist/providers/art/artRunChild.js +15 -8
- package/dist/providers/art/artRunChild.js.map +1 -1
- package/dist/providers/llm/chatTools.d.ts +10 -1
- package/dist/providers/llm/chatTools.d.ts.map +1 -1
- package/dist/providers/llm/chatTools.js +4 -4
- package/dist/providers/llm/chatTools.js.map +1 -1
- package/dist/providers/mcp/spsMcpServer.d.ts +3 -0
- package/dist/providers/mcp/spsMcpServer.d.ts.map +1 -1
- package/dist/providers/mcp/spsMcpServer.js +25 -31
- package/dist/providers/mcp/spsMcpServer.js.map +1 -1
- package/dist/providers/mcp/spsMcpStdio.js +12 -1
- package/dist/providers/mcp/spsMcpStdio.js.map +1 -1
- package/dist/providers/media/generateAsset.d.ts +11 -0
- package/dist/providers/media/generateAsset.d.ts.map +1 -1
- package/dist/providers/media/generateAsset.js +2 -3
- package/dist/providers/media/generateAsset.js.map +1 -1
- package/dist/providers/registry.d.ts +0 -4
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +1 -14
- package/dist/providers/registry.js.map +1 -1
- package/dist/seams/agents/index.d.ts +52 -0
- package/dist/seams/agents/index.d.ts.map +1 -0
- package/dist/seams/agents/index.js +57 -0
- package/dist/seams/agents/index.js.map +1 -0
- package/dist/seams/agents-builtin/index.d.ts +22 -0
- package/dist/seams/agents-builtin/index.d.ts.map +1 -0
- package/dist/seams/agents-builtin/index.js +72 -0
- package/dist/seams/agents-builtin/index.js.map +1 -0
- package/dist/seams/capabilities/index.d.ts +42 -0
- package/dist/seams/capabilities/index.d.ts.map +1 -0
- package/dist/seams/capabilities/index.js +50 -0
- package/dist/seams/capabilities/index.js.map +1 -0
- package/dist/seams/capabilities-art/index.d.ts +17 -0
- package/dist/seams/capabilities-art/index.d.ts.map +1 -0
- package/dist/seams/capabilities-art/index.js +12 -0
- package/dist/seams/capabilities-art/index.js.map +1 -0
- package/dist/seams/im/index.d.ts +31 -0
- package/dist/seams/im/index.d.ts.map +1 -0
- package/dist/seams/im/index.js +39 -0
- package/dist/seams/im/index.js.map +1 -0
- package/dist/seams/im-builtin/index.d.ts +16 -0
- package/dist/seams/im-builtin/index.d.ts.map +1 -0
- package/dist/seams/im-builtin/index.js +28 -0
- package/dist/seams/im-builtin/index.js.map +1 -0
- package/dist/seams/media/index.d.ts +33 -0
- package/dist/seams/media/index.d.ts.map +1 -0
- package/dist/seams/media/index.js +41 -0
- package/dist/seams/media/index.js.map +1 -0
- package/dist/seams/media-builtin/index.d.ts +16 -0
- package/dist/seams/media-builtin/index.d.ts.map +1 -0
- package/dist/seams/media-builtin/index.js +13 -0
- package/dist/seams/media-builtin/index.js.map +1 -0
- package/dist/seams/memory/index.d.ts +58 -0
- package/dist/seams/memory/index.d.ts.map +1 -0
- package/dist/seams/memory/index.js +28 -0
- package/dist/seams/memory/index.js.map +1 -0
- package/dist/seams/memory-local/index.d.ts +34 -0
- package/dist/seams/memory-local/index.d.ts.map +1 -0
- package/dist/seams/memory-local/index.js +58 -0
- package/dist/seams/memory-local/index.js.map +1 -0
- package/dist/seams/notifier/index.d.ts +37 -0
- package/dist/seams/notifier/index.d.ts.map +1 -0
- package/dist/seams/notifier/index.js +30 -0
- package/dist/seams/notifier/index.js.map +1 -0
- package/dist/seams/notifier-matrix/index.d.ts +20 -0
- package/dist/seams/notifier-matrix/index.d.ts.map +1 -0
- package/dist/seams/notifier-matrix/index.js +11 -0
- package/dist/seams/notifier-matrix/index.js.map +1 -0
- package/dist/seams/notifier-none/index.d.ts +21 -0
- package/dist/seams/notifier-none/index.d.ts.map +1 -0
- package/dist/seams/notifier-none/index.js +17 -0
- package/dist/seams/notifier-none/index.js.map +1 -0
- package/dist/seams/repo/index.d.ts +41 -0
- package/dist/seams/repo/index.d.ts.map +1 -0
- package/dist/seams/repo/index.js +46 -0
- package/dist/seams/repo/index.js.map +1 -0
- package/dist/seams/repo-builtin/index.d.ts +17 -0
- package/dist/seams/repo-builtin/index.d.ts.map +1 -0
- package/dist/seams/repo-builtin/index.js +17 -0
- package/dist/seams/repo-builtin/index.js.map +1 -0
- package/dist/seams/tools/index.d.ts +86 -0
- package/dist/seams/tools/index.d.ts.map +1 -0
- package/dist/seams/tools/index.js +70 -0
- package/dist/seams/tools/index.js.map +1 -0
- package/dist/services/MemoryService.d.ts +12 -0
- package/dist/services/MemoryService.d.ts.map +1 -1
- package/dist/services/MemoryService.js +14 -18
- package/dist/services/MemoryService.js.map +1 -1
- package/dist/services/container.d.ts +20 -1
- package/dist/services/container.d.ts.map +1 -1
- package/dist/services/container.js +10 -3
- package/dist/services/container.js.map +1 -1
- package/dist/services/executors.d.ts +4 -0
- package/dist/services/executors.d.ts.map +1 -1
- package/dist/services/executors.js +27 -5
- package/dist/services/executors.js.map +1 -1
- package/dist/services/promptPreview.d.ts +14 -1
- package/dist/services/promptPreview.d.ts.map +1 -1
- package/dist/services/promptPreview.js +4 -3
- package/dist/services/promptPreview.js.map +1 -1
- package/package.json +16 -3
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/pluginCommand
|
|
3
|
+
* @description `sps plugin add|remove|list` —— **管理装配档里装了哪些插件**。
|
|
4
|
+
*
|
|
5
|
+
* @layer command
|
|
6
|
+
*
|
|
7
|
+
* 🔴 **它只做一件事:改装配档。** 不装包、不解析依赖(那是 npm 和 Cordis 的活)。
|
|
8
|
+
* 一个命令做两件事,失败时"到底哪一半没成"要靠猜。
|
|
9
|
+
*
|
|
10
|
+
* 🔴 **加之前先验包能不能解析。** 往装配档里写一行解析不了的包名,
|
|
11
|
+
* 下次启动整个进程起不来 —— 而人只会看到"某个功能不见了",
|
|
12
|
+
* 归因跑到十万八千里。⇒ 解析不了就**当场拒**,装配档一个字不改。
|
|
13
|
+
*
|
|
14
|
+
* ⚠️ 已知缺口(不假装没有):插件包必须已经能被 sps 解析到
|
|
15
|
+
* (装在 sps 包自己的 node_modules 里)。`npm i -g @coralai/sps-cli@新版` 会替换那个目录,
|
|
16
|
+
* **插件会丢**。谁负责重装它,今天没有答案 —— 这正是"副本谁负责更新"那一族,
|
|
17
|
+
* 写在这里,别让它变成半年后的事故。
|
|
18
|
+
*/
|
|
19
|
+
import { mkdirSync } from 'node:fs';
|
|
20
|
+
import { createRequire } from 'node:module';
|
|
21
|
+
import { pathToFileURL } from 'node:url';
|
|
22
|
+
import { stringify as stringifyYaml } from 'yaml';
|
|
23
|
+
import { Logger } from '../core/logger.js';
|
|
24
|
+
import { writeSecretFile } from '../infra/secretFile.js';
|
|
25
|
+
import { assemblyPath, effectiveAssembly } from '../plugin/assembly.js';
|
|
26
|
+
import { readAssemblyFile, userAssemblyDir, userAssemblyPath } from '../plugin/layers.js';
|
|
27
|
+
const TARGETS = ['base', 'cli', 'console', 'daemon'];
|
|
28
|
+
/**
|
|
29
|
+
* 🔴 **只读写用户层**(`~/.coral/assembly/*.yml`),不碰包内出厂档。
|
|
30
|
+
*
|
|
31
|
+
* 出厂档在**包目录内部** —— `npm i -g @coralai/sps-cli@latest` 会整个替换包目录,
|
|
32
|
+
* 装过的插件全丢,而且是静默的(升级完一切正常,只是插件不见了)。
|
|
33
|
+
* 用户装的东西必须落在包外面。
|
|
34
|
+
*/
|
|
35
|
+
function readRows(target) {
|
|
36
|
+
return readAssemblyFile(userAssemblyPath(target), false);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 写回装配档。
|
|
40
|
+
*
|
|
41
|
+
* ⚠️ **注释会丢**:yaml 库 round-trip 不保注释,而装配档里的注释解释了每一行为什么在那儿。
|
|
42
|
+
* ⇒ 只在真的改动时写,并且在输出顶部留一行说明,免得后来者以为注释是被人删的。
|
|
43
|
+
*/
|
|
44
|
+
function writeRows(target, rows) {
|
|
45
|
+
mkdirSync(userAssemblyDir(), { recursive: true });
|
|
46
|
+
const header = `# sps 装配档 · ${target}(用户层,叠在包内出厂档之上)\n# ⚠️ 本文件被 \`sps plugin\` 命令改写过,原有注释可能已丢失。\n`;
|
|
47
|
+
writeSecretFile(userAssemblyPath(target), header + stringifyYaml(rows));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 这个包能不能**当插件用**。
|
|
51
|
+
*
|
|
52
|
+
* 🔴 只验"能不能解析"是**不够的**:一个能解析但不是 Cordis 插件的包写进装配档后,
|
|
53
|
+
* 下次启动整个进程起不来 —— 实测 `plugin add yaml` 之后,**连 `plugin remove`
|
|
54
|
+
* 自己都起不来**(它当时也要先挂装配档)。修复路已经独立了,但这一道仍要有:
|
|
55
|
+
* 让人在 add 的那一刻就知道,而不是下一条命令炸了才知道。
|
|
56
|
+
*
|
|
57
|
+
* ⚠️ 验的方式是**真的 import 它**(会执行模块顶层代码)。这是有意的:
|
|
58
|
+
* 我们下一秒本来就要挂它,提前一秒执行不增加风险,却能把失败挪到人还在看屏幕的时候。
|
|
59
|
+
*/
|
|
60
|
+
async function pluginVerdict(name) {
|
|
61
|
+
const req = createRequire(assemblyPath('base'));
|
|
62
|
+
let resolved;
|
|
63
|
+
try {
|
|
64
|
+
resolved = req.resolve(name);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return { ok: false, why: `解析不到这个包(先装到 sps 能看见的地方)` };
|
|
68
|
+
}
|
|
69
|
+
let mod;
|
|
70
|
+
try {
|
|
71
|
+
mod = await import(pathToFileURL(resolved).href);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
return { ok: false, why: `import 失败:${e instanceof Error ? e.message : String(e)}` };
|
|
75
|
+
}
|
|
76
|
+
const cand = mod.default ?? mod;
|
|
77
|
+
const isPlugin = typeof cand === 'function' ||
|
|
78
|
+
(typeof cand === 'object' && cand !== null && typeof cand.apply === 'function');
|
|
79
|
+
return isPlugin
|
|
80
|
+
? { ok: true }
|
|
81
|
+
: { ok: false, why: '这个包不是 Cordis 插件(既不是函数,也没有 apply 方法)' };
|
|
82
|
+
}
|
|
83
|
+
function parseTarget(flags) {
|
|
84
|
+
const raw = String(flags.assembly ?? 'base');
|
|
85
|
+
if (!TARGETS.includes(raw)) {
|
|
86
|
+
throw new Error(`--assembly 只能是 ${TARGETS.join(' | ')},收到:${raw}`);
|
|
87
|
+
}
|
|
88
|
+
return raw;
|
|
89
|
+
}
|
|
90
|
+
export async function executePluginCommand(sub, positionals, flags) {
|
|
91
|
+
const log = new Logger('plugin');
|
|
92
|
+
const target = parseTarget(flags);
|
|
93
|
+
if (sub === 'list') {
|
|
94
|
+
// 🔴 列**生效清单**(出厂 + 用户合并后),不是用户层那几行 ——
|
|
95
|
+
// 只列用户层的话,一台没装过插件的机器会显示"什么都没有",
|
|
96
|
+
// 而实际上跑着 11 个内建 seam。
|
|
97
|
+
for (const t of TARGETS) {
|
|
98
|
+
if (t === 'base')
|
|
99
|
+
continue;
|
|
100
|
+
const rows = effectiveAssembly(t);
|
|
101
|
+
const mine = new Set([...readRows('base'), ...readRows(t)].map((r) => r.id ?? r.name));
|
|
102
|
+
log.info(`${t}: ${rows.length} 个(生效清单)`);
|
|
103
|
+
for (const r of rows) {
|
|
104
|
+
const from = mine.has(r.id ?? r.name) ? '用户' : '出厂';
|
|
105
|
+
const off = r.disabled ? ' [已停用]' : '';
|
|
106
|
+
log.info(` · [${from}] ${r.id ?? r.name} → ${r.name}${off}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const pkg = positionals[0];
|
|
112
|
+
if (!pkg) {
|
|
113
|
+
console.error('Usage: sps plugin <add|remove|list> <包名|id> [--assembly base|cli|console|daemon]');
|
|
114
|
+
process.exit(2);
|
|
115
|
+
}
|
|
116
|
+
if (sub === 'add') {
|
|
117
|
+
const verdict = await pluginVerdict(pkg);
|
|
118
|
+
if (!verdict.ok) {
|
|
119
|
+
// 🔴 当场拒:写进去的话,下次启动整个进程起不来,而症状是"某个功能不见了"。
|
|
120
|
+
log.error(`${pkg} 不能作为插件加入:${verdict.why}`);
|
|
121
|
+
log.info(' 装配档**一个字没改**。');
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
const rows = readRows(target);
|
|
125
|
+
const id = String(flags.id ?? pkg.split('/').pop() ?? pkg);
|
|
126
|
+
if (rows.some((r) => r.id === id)) {
|
|
127
|
+
log.error(`装配档 ${target} 里已经有 id=${id} 了 —— 换个 --id,或先 remove。`);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
rows.push({ id, name: pkg });
|
|
131
|
+
writeRows(target, rows);
|
|
132
|
+
log.ok(`已加入 ${target}(用户层):${id} → ${pkg}`);
|
|
133
|
+
log.info(` ${userAssemblyPath(target)}`);
|
|
134
|
+
log.info(' ⚠️ 长驻进程(console / daemon)要重启或热挂才生效;一次性命令下一条就带上了。');
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (sub === 'remove') {
|
|
138
|
+
const rows = readRows(target);
|
|
139
|
+
const left = rows.filter((r) => r.id !== pkg && r.name !== pkg);
|
|
140
|
+
if (left.length === rows.length) {
|
|
141
|
+
// 出厂档的行删不掉 —— 用户层只能**盖**,不能删。这两种失败的处置完全不同,
|
|
142
|
+
// 合成一句"没找到"会让人去翻自己没写过的文件。
|
|
143
|
+
const factory = effectiveAssembly(target === 'base' ? 'cli' : target);
|
|
144
|
+
if (factory.some((r) => r.id === pkg || r.name === pkg)) {
|
|
145
|
+
log.error(`${pkg} 是**内建**的(出厂档),用户层删不掉。`);
|
|
146
|
+
log.info(` 要停用它:sps plugin add ${pkg} --id ${pkg} 之后把该行改成 disabled: true`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
log.error(`用户层 ${target} 里没有 ${pkg}(按 id 或包名都没匹配到)`);
|
|
150
|
+
}
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
writeRows(target, left);
|
|
154
|
+
log.ok(`已从 ${target} 移除:${pkg}`);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
console.error('Usage: sps plugin <add|remove|list> <包名|id> [--assembly base|cli|console|daemon]');
|
|
158
|
+
process.exit(2);
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=pluginCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginCommand.js","sourceRoot":"","sources":["../../src/commands/pluginCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import type { Context as PluginContext } from '@deepseek-ai/cordis';
|
|
2
|
+
export declare function executeQaTick(project: string, flags: Record<string, boolean>,
|
|
3
|
+
/** 插件装配上下文 —— seam 从这里取(如 app['sps.notifier'])。 */
|
|
4
|
+
app: PluginContext): Promise<void>;
|
|
2
5
|
//# sourceMappingURL=qaTick.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qaTick.d.ts","sourceRoot":"","sources":["../../src/commands/qaTick.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"qaTick.d.ts","sourceRoot":"","sources":["../../src/commands/qaTick.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAcpE,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;AAC9B,mDAAmD;AACnD,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,IAAI,CAAC,CAiEf"}
|
package/dist/commands/qaTick.js
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { ProjectContext } from '../core/context.js';
|
|
2
|
+
import { resolveGitHost } from '../core/gitHost.js';
|
|
2
3
|
import { Logger } from '../core/logger.js';
|
|
3
4
|
import { ProjectPipelineAdapter } from '../core/projectPipelineAdapter.js';
|
|
4
5
|
import { RuntimeStore } from '../core/runtimeStore.js';
|
|
5
6
|
import { SPSEventHandler } from '../engines/EventHandler.js';
|
|
6
7
|
import { StageEngine } from '../engines/StageEngine.js';
|
|
7
8
|
import { CompletionJudge } from '../manager/completion-judge.js';
|
|
9
|
+
import { makeBackendFactory } from '../manager/makeBackendFactory.js';
|
|
8
10
|
import { ProcessSupervisor } from '../manager/supervisor.js';
|
|
9
11
|
import { WorkerManagerImpl } from '../manager/worker-manager-impl.js';
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
import { createTaskBackend } from '../providers/registry.js';
|
|
13
|
+
export async function executeQaTick(project, flags,
|
|
14
|
+
/** 插件装配上下文 —— seam 从这里取(如 app['sps.notifier'])。 */
|
|
15
|
+
app) {
|
|
13
16
|
const log = new Logger('qa', project);
|
|
14
17
|
const jsonOutput = !!flags.json;
|
|
15
18
|
let ctx;
|
|
@@ -33,14 +36,15 @@ export async function executeQaTick(project, flags) {
|
|
|
33
36
|
...pipelineAdapter.stages.flatMap(s => [s.triggerState, s.activeState, s.onCompleteState]),
|
|
34
37
|
].filter(Boolean))];
|
|
35
38
|
const taskBackend = createTaskBackend(ctx.config, allStateNames);
|
|
36
|
-
const repoBackend =
|
|
37
|
-
const notifier =
|
|
39
|
+
const repoBackend = app['sps.repo'].create(resolveGitHost(ctx.config), ctx.config);
|
|
40
|
+
const notifier = app['sps.notifier'].open(ctx.config);
|
|
38
41
|
// Build WorkerManager for standalone QA tick
|
|
39
42
|
const supervisor = new ProcessSupervisor();
|
|
40
43
|
const completionJudge = new CompletionJudge();
|
|
41
44
|
const workerManager = new WorkerManagerImpl({
|
|
45
|
+
app: app,
|
|
42
46
|
supervisor, completionJudge,
|
|
43
|
-
backendFactory: makeBackendFactory({ project, workerModel: ctx.config.WORKER_MODEL, workerAgent: ctx.config.WORKER_AGENT, workerMode: ctx.config.WORKER_MODE, workerProvider: ctx.config.WORKER_PROVIDER, logsDir: ctx.paths.logsDir, runtimeDir: ctx.paths.runtimeDir }),
|
|
47
|
+
backendFactory: makeBackendFactory({ app: app, project, workerModel: ctx.config.WORKER_MODEL, workerAgent: ctx.config.WORKER_AGENT, workerMode: ctx.config.WORKER_MODE, workerProvider: ctx.config.WORKER_PROVIDER, logsDir: ctx.paths.logsDir, runtimeDir: ctx.paths.runtimeDir }),
|
|
44
48
|
stateFile: ctx.paths.stateFile,
|
|
45
49
|
maxWorkers: ctx.maxWorkers,
|
|
46
50
|
});
|
|
@@ -53,7 +57,7 @@ export async function executeQaTick(project, flags) {
|
|
|
53
57
|
// Run last stage (handles integration/merge — equivalent to old CloseoutEngine)
|
|
54
58
|
const lastIdx = pipelineAdapter.stages.length - 1;
|
|
55
59
|
const lastStage = pipelineAdapter.stages[lastIdx];
|
|
56
|
-
const engine = new StageEngine(ctx, lastStage, lastIdx, pipelineAdapter.stages.length, taskBackend, repoBackend, workerManager, pipelineAdapter, notifier);
|
|
60
|
+
const engine = new StageEngine(app, ctx, lastStage, lastIdx, pipelineAdapter.stages.length, taskBackend, repoBackend, workerManager, pipelineAdapter, notifier);
|
|
57
61
|
const result = await engine.tick();
|
|
58
62
|
if (jsonOutput) {
|
|
59
63
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qaTick.js","sourceRoot":"","sources":["../../src/commands/qaTick.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"qaTick.js","sourceRoot":"","sources":["../../src/commands/qaTick.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,KAA8B;AAC9B,mDAAmD;AACnD,GAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IAEhC,IAAI,GAAmB,CAAC;IACxB,IAAI,CAAC;QACH,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACrG,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,sBAAsB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClF,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;YAChC,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO;YAC/D,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI;YACzD,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;SAC3F,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEtD,6CAA6C;IAC7C,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAC3C,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,IAAI,iBAAiB,CAAC;QACxC,GAAG,EAAE,GAAG;QACV,UAAU,EAAE,eAAe;QAC3B,cAAc,EAAE,kBAAkB,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACnR,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;QAC9B,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACjH,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;IAC5B,MAAM,YAAY,GAAG,IAAI,eAAe,CAAC;QACvC,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe;KAC9D,CAAC,CAAC;IACH,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAE7D,gFAAgF;IAChF,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,WAAW,CAC1B,GAAG,EAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;IACpI,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IAEnC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACjF,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -1,2 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @module schedulerTick
|
|
3
|
+
* @description 调度引擎单次执行命令,将就绪卡片从 Backlog 推入工作队列
|
|
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 command
|
|
13
|
+
* @layer command
|
|
14
|
+
* @boundedContext pipeline
|
|
15
|
+
*
|
|
16
|
+
* @trigger sps scheduler <project> [--json] [--dry-run]
|
|
17
|
+
* @inputs 项目名、JSON 输出标志、dry-run 标志
|
|
18
|
+
* @outputs 调度结果(推入队列的卡片列表)
|
|
19
|
+
* @workflow 1. 加载上下文 → 2. 创建 SchedulerEngine → 3. 执行调度 tick → 4. 输出结果
|
|
20
|
+
*/
|
|
21
|
+
import type { Context as PluginContext } from '@deepseek-ai/cordis';
|
|
22
|
+
export declare function executeSchedulerTick(project: string, flags: Record<string, boolean>,
|
|
23
|
+
/** 插件装配上下文 —— seam 从这里取(如 app['sps.notifier'])。 */
|
|
24
|
+
app: PluginContext): Promise<void>;
|
|
2
25
|
//# sourceMappingURL=schedulerTick.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedulerTick.d.ts","sourceRoot":"","sources":["../../src/commands/schedulerTick.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schedulerTick.d.ts","sourceRoot":"","sources":["../../src/commands/schedulerTick.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOpE,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;AAC9B,mDAAmD;AACnD,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,IAAI,CAAC,CAyCf"}
|
|
@@ -1,29 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module schedulerTick
|
|
3
|
-
* @description 调度引擎单次执行命令,将就绪卡片从 Backlog 推入工作队列
|
|
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 command
|
|
13
|
-
* @layer command
|
|
14
|
-
* @boundedContext pipeline
|
|
15
|
-
*
|
|
16
|
-
* @trigger sps scheduler <project> [--json] [--dry-run]
|
|
17
|
-
* @inputs 项目名、JSON 输出标志、dry-run 标志
|
|
18
|
-
* @outputs 调度结果(推入队列的卡片列表)
|
|
19
|
-
* @workflow 1. 加载上下文 → 2. 创建 SchedulerEngine → 3. 执行调度 tick → 4. 输出结果
|
|
20
|
-
*/
|
|
21
1
|
import { ProjectContext } from '../core/context.js';
|
|
22
2
|
import { Logger } from '../core/logger.js';
|
|
23
3
|
import { ProjectPipelineAdapter } from '../core/projectPipelineAdapter.js';
|
|
24
4
|
import { SchedulerEngine } from '../engines/SchedulerEngine.js';
|
|
25
|
-
import {
|
|
26
|
-
export async function executeSchedulerTick(project, flags
|
|
5
|
+
import { createTaskBackend } from '../providers/registry.js';
|
|
6
|
+
export async function executeSchedulerTick(project, flags,
|
|
7
|
+
/** 插件装配上下文 —— seam 从这里取(如 app['sps.notifier'])。 */
|
|
8
|
+
app) {
|
|
27
9
|
const log = new Logger('scheduler', project);
|
|
28
10
|
const jsonOutput = !!flags.json;
|
|
29
11
|
const dryRun = !!flags['dry-run'];
|
|
@@ -42,7 +24,7 @@ export async function executeSchedulerTick(project, flags) {
|
|
|
42
24
|
process.exit(3);
|
|
43
25
|
}
|
|
44
26
|
const taskBackend = createTaskBackend(ctx.config);
|
|
45
|
-
const notifier =
|
|
27
|
+
const notifier = app['sps.notifier'].open(ctx.config);
|
|
46
28
|
const pipelineAdapter = new ProjectPipelineAdapter(ctx.config, ctx.paths.repoDir);
|
|
47
29
|
const engine = new SchedulerEngine(ctx, taskBackend, pipelineAdapter, notifier);
|
|
48
30
|
const result = await engine.tick({ dryRun });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedulerTick.js","sourceRoot":"","sources":["../../src/commands/schedulerTick.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schedulerTick.js","sourceRoot":"","sources":["../../src/commands/schedulerTick.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/tick.d.ts
CHANGED
|
@@ -1,10 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module tick
|
|
3
|
+
* @description 主 tick 循环命令,协调调度、流水线、QA 和监控引擎的周期性执行
|
|
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 command
|
|
13
|
+
* @layer command
|
|
14
|
+
* @boundedContext pipeline
|
|
15
|
+
*
|
|
16
|
+
* @trigger sps tick <project> [--interval N] [--once] [--json]
|
|
17
|
+
* @inputs 项目名、执行间隔、单次/循环模式、JSON 输出标志
|
|
18
|
+
* @outputs 每轮 tick 的调度/流水线/QA/监控结果
|
|
19
|
+
* @workflow 1. 获取锁 → 2. 加载引擎 → 3. 循环执行 scheduler→pipeline→QA→monitor → 4. 释放锁
|
|
20
|
+
*/
|
|
21
|
+
import type { Context as PluginContext } from '@deepseek-ai/cordis';
|
|
1
22
|
import { ProjectContext } from '../core/context.js';
|
|
2
23
|
import { Logger } from '../core/logger.js';
|
|
3
24
|
import { ProjectPipelineAdapter } from '../core/projectPipelineAdapter.js';
|
|
4
25
|
import { MonitorEngine } from '../engines/MonitorEngine.js';
|
|
26
|
+
import { ReviewEngine } from '../engines/ReviewEngine.js';
|
|
5
27
|
import { SchedulerEngine } from '../engines/SchedulerEngine.js';
|
|
6
28
|
import { StageEngine } from '../engines/StageEngine.js';
|
|
7
|
-
import { ReviewEngine } from '../engines/ReviewEngine.js';
|
|
8
29
|
import type { Notifier } from '../interfaces/Notifier.js';
|
|
9
30
|
import type { TaskBackend } from '../interfaces/TaskBackend.js';
|
|
10
31
|
export interface ProjectRunner {
|
|
@@ -36,7 +57,9 @@ export interface ProjectRunner {
|
|
|
36
57
|
* does not affect others.
|
|
37
58
|
*
|
|
38
59
|
*/
|
|
39
|
-
export declare function executeTick(projects: string[], flags: Record<string, boolean
|
|
60
|
+
export declare function executeTick(projects: string[], flags: Record<string, boolean>,
|
|
61
|
+
/** 插件装配上下文 —— seam 从这里取(如 app['sps.notifier'])。 */
|
|
62
|
+
app: PluginContext): Promise<void>;
|
|
40
63
|
/**
|
|
41
64
|
* Build a one-line heartbeat string for idle ticks. Describes whether any
|
|
42
65
|
* workers are active and what they're doing so operators can distinguish
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../src/commands/tick.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../src/commands/tick.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAK3E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAkB,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAkChE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,cAAc,CAAC;IACpB,eAAe,EAAE,sBAAsB,CAAC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,OAAO,mCAAmC,EAAE,iBAAiB,CAAC;IAC7E,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAsJD;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;AAC9B,mDAAmD;AACnD,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,IAAI,CAAC,CA+Kf;AAsGD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA0B5D"}
|
package/dist/commands/tick.js
CHANGED
|
@@ -1,4 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module tick
|
|
3
|
+
* @description 主 tick 循环命令,协调调度、流水线、QA 和监控引擎的周期性执行
|
|
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 command
|
|
13
|
+
* @layer command
|
|
14
|
+
* @boundedContext pipeline
|
|
15
|
+
*
|
|
16
|
+
* @trigger sps tick <project> [--interval N] [--once] [--json]
|
|
17
|
+
* @inputs 项目名、执行间隔、单次/循环模式、JSON 输出标志
|
|
18
|
+
* @outputs 每轮 tick 的调度/流水线/QA/监控结果
|
|
19
|
+
* @workflow 1. 获取锁 → 2. 加载引擎 → 3. 循环执行 scheduler→pipeline→QA→monitor → 4. 释放锁
|
|
20
|
+
*/
|
|
1
21
|
import { ProjectContext } from '../core/context.js';
|
|
22
|
+
import { resolveGitHost } from '../core/gitHost.js';
|
|
23
|
+
import { loadAgentsConfig } from '../core/intel/agentsConfig.js';
|
|
2
24
|
import { acquireTickLock, releaseTickLock } from '../core/lock.js';
|
|
3
25
|
import { Logger } from '../core/logger.js';
|
|
4
26
|
import { isPipelineMember, pipelineLabelOf } from '../core/pipelineMembership.js';
|
|
@@ -8,20 +30,18 @@ import { cleanupOrphanWorkerSessions } from '../core/sessionCleanup.js';
|
|
|
8
30
|
import { readState } from '../core/state.js';
|
|
9
31
|
import { SPSEventHandler } from '../engines/EventHandler.js';
|
|
10
32
|
import { MonitorEngine } from '../engines/MonitorEngine.js';
|
|
33
|
+
import { REVIEWED_LABEL, ReviewEngine } from '../engines/ReviewEngine.js';
|
|
11
34
|
import { SchedulerEngine } from '../engines/SchedulerEngine.js';
|
|
12
35
|
import { StageEngine } from '../engines/StageEngine.js';
|
|
13
|
-
import { ReviewEngine, REVIEWED_LABEL } from '../engines/ReviewEngine.js';
|
|
14
|
-
import { LLMClient } from '../providers/LLMClient.js';
|
|
15
|
-
import { loadAgentsConfig } from '../core/intel/agentsConfig.js';
|
|
16
|
-
import { buildMemoryInjection } from '../core/memory2/inject.js';
|
|
17
36
|
import { CompletionJudge } from '../manager/completion-judge.js';
|
|
37
|
+
import { makeBackendFactory } from '../manager/makeBackendFactory.js';
|
|
18
38
|
import { RuntimeCoordinator } from '../manager/runtime-coordinator.js';
|
|
19
39
|
import { ProcessSupervisor } from '../manager/supervisor.js';
|
|
20
40
|
// PostActions and Recovery are no longer used directly — WM handles recovery
|
|
21
41
|
// and SPSEventHandler handles PM operations via the event system.
|
|
22
42
|
import { WorkerManagerImpl } from '../manager/worker-manager-impl.js';
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
43
|
+
import { LLMClient } from '../providers/LLMClient.js';
|
|
44
|
+
import { createTaskBackend } from '../providers/registry.js';
|
|
25
45
|
const DEFAULT_INTERVAL_S = 30;
|
|
26
46
|
// ─── Shared Manager modules (global across all projects) ──────
|
|
27
47
|
let sharedSupervisor = null;
|
|
@@ -38,7 +58,7 @@ function getSharedModules() {
|
|
|
38
58
|
completionJudge: sharedCompletionJudge,
|
|
39
59
|
};
|
|
40
60
|
}
|
|
41
|
-
function createRunner(project) {
|
|
61
|
+
function createRunner(project, app) {
|
|
42
62
|
const log = new Logger('tick', project);
|
|
43
63
|
let ctx;
|
|
44
64
|
try {
|
|
@@ -76,8 +96,8 @@ function createRunner(project) {
|
|
|
76
96
|
let taskBackend, repoBackend, notifier;
|
|
77
97
|
try {
|
|
78
98
|
taskBackend = createTaskBackend(ctx.config, allStateNames);
|
|
79
|
-
repoBackend =
|
|
80
|
-
notifier =
|
|
99
|
+
repoBackend = app['sps.repo'].create(resolveGitHost(ctx.config), ctx.config);
|
|
100
|
+
notifier = app['sps.notifier'].open(ctx.config);
|
|
81
101
|
}
|
|
82
102
|
catch (err) {
|
|
83
103
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -88,7 +108,7 @@ function createRunner(project) {
|
|
|
88
108
|
// Get shared Manager modules
|
|
89
109
|
const { supervisor, completionJudge } = getSharedModules();
|
|
90
110
|
// L3 P4-part2:worker 执行**唯一**走 per-slot AgentBackend(北极星,agent 无关);旧 AgentRuntime 路已退役。
|
|
91
|
-
const backendFactory = makeBackendFactory({
|
|
111
|
+
const backendFactory = makeBackendFactory({ app: app,
|
|
92
112
|
project,
|
|
93
113
|
workerModel: ctx.config.WORKER_MODEL,
|
|
94
114
|
workerAgent: ctx.config.WORKER_AGENT,
|
|
@@ -99,6 +119,7 @@ function createRunner(project) {
|
|
|
99
119
|
});
|
|
100
120
|
// Create per-project WorkerManager (wraps supervisor + judge)
|
|
101
121
|
const workerManager = new WorkerManagerImpl({
|
|
122
|
+
app: app,
|
|
102
123
|
supervisor,
|
|
103
124
|
completionJudge,
|
|
104
125
|
stateFile: ctx.paths.stateFile,
|
|
@@ -128,9 +149,9 @@ function createRunner(project) {
|
|
|
128
149
|
notifier,
|
|
129
150
|
workerManager,
|
|
130
151
|
scheduler: new SchedulerEngine(ctx, taskBackend, pipelineAdapter, notifier),
|
|
131
|
-
stages: pipelineAdapter.stages.map((stage, i) => new StageEngine(ctx, stage, i, pipelineAdapter.stages.length, taskBackend, repoBackend, workerManager, pipelineAdapter, notifier)),
|
|
152
|
+
stages: pipelineAdapter.stages.map((stage, i) => new StageEngine(app, ctx, stage, i, pipelineAdapter.stages.length, taskBackend, repoBackend, workerManager, pipelineAdapter, notifier)),
|
|
132
153
|
monitor: new MonitorEngine(ctx, taskBackend, repoBackend, notifier, supervisor, pipelineAdapter, workerManager),
|
|
133
|
-
review: ctx.config.REVIEW_ENABLED ? buildReviewEngine(project, ctx, taskBackend, pipelineAdapter, fullLog) : null,
|
|
154
|
+
review: ctx.config.REVIEW_ENABLED ? buildReviewEngine(project, app, ctx, taskBackend, pipelineAdapter, fullLog) : null,
|
|
134
155
|
done: false,
|
|
135
156
|
fatalError: false,
|
|
136
157
|
tickNum: 0,
|
|
@@ -141,7 +162,7 @@ function createRunner(project) {
|
|
|
141
162
|
* 构造清单验收引擎(SPS_REVIEW=on 时)。验收员 = OpenAI 三方角色(去相关盲点)+ 只读探查项目 +
|
|
142
163
|
* reviewer 判据 + 卡自身 skills SOP + project/global 记忆注入。
|
|
143
164
|
*/
|
|
144
|
-
function buildReviewEngine(project, ctx, taskBackend, pipelineAdapter, log) {
|
|
165
|
+
function buildReviewEngine(project, app, ctx, taskBackend, pipelineAdapter, log) {
|
|
145
166
|
const agents = loadAgentsConfig();
|
|
146
167
|
const reviewerModel = ctx.config.SA_REVIEWER_MODEL; // 项目级 reviewer 模型覆盖(conf 手写 SA_REVIEWER_MODEL 生效)
|
|
147
168
|
if (reviewerModel)
|
|
@@ -155,7 +176,7 @@ function buildReviewEngine(project, ctx, taskBackend, pipelineAdapter, log) {
|
|
|
155
176
|
pipelineLabel: ctx.config.PIPELINE_LABEL || 'AI-PIPELINE',
|
|
156
177
|
log,
|
|
157
178
|
reviewer,
|
|
158
|
-
buildMemory: (query) =>
|
|
179
|
+
buildMemory: (query) => app['sps.memory'].buildInjection([{ scope: 'project', project }, { scope: 'global' }]),
|
|
159
180
|
});
|
|
160
181
|
}
|
|
161
182
|
// ─── Entry point ─────────────────────────────────────────────────
|
|
@@ -171,7 +192,9 @@ function buildReviewEngine(project, ctx, taskBackend, pipelineAdapter, log) {
|
|
|
171
192
|
* does not affect others.
|
|
172
193
|
*
|
|
173
194
|
*/
|
|
174
|
-
export async function executeTick(projects, flags
|
|
195
|
+
export async function executeTick(projects, flags,
|
|
196
|
+
/** 插件装配上下文 —— seam 从这里取(如 app['sps.notifier'])。 */
|
|
197
|
+
app) {
|
|
175
198
|
const globalLog = new Logger('tick', '');
|
|
176
199
|
const jsonOutput = !!flags.json;
|
|
177
200
|
const dryRun = !!flags['dry-run'];
|
|
@@ -183,7 +206,7 @@ export async function executeTick(projects, flags) {
|
|
|
183
206
|
// ─── Initialize runners ────────────────────────────────────────
|
|
184
207
|
const runners = [];
|
|
185
208
|
for (const project of projects) {
|
|
186
|
-
const runner = createRunner(project);
|
|
209
|
+
const runner = createRunner(project, app);
|
|
187
210
|
if (runner) {
|
|
188
211
|
runners.push(runner);
|
|
189
212
|
}
|