create-principles-disciple 1.132.2 → 1.132.3
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/console/dist/server/routes/update.js +187 -19
- package/console/dist/server/update/mutation-controller.d.ts +18 -0
- package/console/dist/server/update/mutation-controller.js +29 -0
- package/console/dist/server/utils/installed-layout.d.ts +1 -0
- package/console/dist/server/utils/installed-layout.js +2 -0
- package/console/package.json +1 -0
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +15 -0
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.d.ts +2 -0
- package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.js +71 -0
- package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.js.map +1 -0
- package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.d.ts +2 -0
- package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.js +219 -0
- package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.js.map +1 -0
- package/core/dist/runtime-v2/adapter/artificer-l2-adapter.d.ts.map +1 -1
- package/core/dist/runtime-v2/adapter/artificer-l2-adapter.js +2 -3
- package/core/dist/runtime-v2/adapter/artificer-l2-adapter.js.map +1 -1
- package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.d.ts +12 -1
- package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.d.ts.map +1 -1
- package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.js +15 -2
- package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.js.map +1 -1
- package/core/dist/runtime-v2/adapter/pi-ai-http-transport.d.ts +50 -0
- package/core/dist/runtime-v2/adapter/pi-ai-http-transport.d.ts.map +1 -0
- package/core/dist/runtime-v2/adapter/pi-ai-http-transport.js +93 -0
- package/core/dist/runtime-v2/adapter/pi-ai-http-transport.js.map +1 -0
- package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
- package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +5 -0
- package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/owner-decision.test.js +152 -0
- package/core/dist/runtime-v2/internalization/__tests__/owner-decision.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/owner-review.d.ts +7 -1
- package/core/dist/runtime-v2/internalization/owner-review.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/owner-review.js +22 -3
- package/core/dist/runtime-v2/internalization/owner-review.js.map +1 -1
- package/core/package.json +3 -2
- package/dist/installer.d.ts.map +1 -1
- package/dist/installer.js +50 -0
- package/dist/installer.js.map +1 -1
- package/dist/update/release-manager-authority.d.ts +69 -0
- package/dist/update/release-manager-authority.d.ts.map +1 -0
- package/dist/update/release-manager-authority.js +125 -0
- package/dist/update/release-manager-authority.js.map +1 -0
- package/dist/utils/workspace-divergence.d.ts +36 -0
- package/dist/utils/workspace-divergence.d.ts.map +1 -0
- package/dist/utils/workspace-divergence.js +87 -0
- package/dist/utils/workspace-divergence.js.map +1 -0
- package/install-layout/dist/index.d.ts +5 -0
- package/install-layout/dist/index.js +1 -0
- package/install-layout/package.json +1 -1
- package/package.json +3 -2
- package/plugin/dist/bundle.js +870 -734
- package/plugin/dist/governance-audit.js +381 -247
- package/plugin/dist/openclaw-sdk.d.ts +3 -0
- package/plugin/dist/rulehost-evidence.js +420 -286
- package/plugin/dist/service/subagent-workflow/types.d.ts +2 -2
- package/plugin/dist/utils/retry.d.ts +1 -1
- package/plugin/dist/utils/workspace-resolver.d.ts +35 -4
- package/plugin/openclaw.plugin.json +1 -1
- package/plugin/package.json +1 -1
- package/release-manager/dist/i18n.d.ts +6 -0
- package/release-manager/dist/i18n.d.ts.map +1 -0
- package/release-manager/dist/i18n.js +234 -0
- package/release-manager/dist/i18n.js.map +1 -0
- package/release-manager/dist/index.d.ts +7 -0
- package/release-manager/dist/index.d.ts.map +1 -0
- package/release-manager/dist/index.js +474 -0
- package/release-manager/dist/index.js.map +1 -0
- package/release-manager/dist/installer.d.ts +185 -0
- package/release-manager/dist/installer.d.ts.map +1 -0
- package/release-manager/dist/installer.js +2305 -0
- package/release-manager/dist/installer.js.map +1 -0
- package/release-manager/dist/installers/codex-host-installer.d.ts +29 -0
- package/release-manager/dist/installers/codex-host-installer.d.ts.map +1 -0
- package/release-manager/dist/installers/codex-host-installer.js +494 -0
- package/release-manager/dist/installers/codex-host-installer.js.map +1 -0
- package/release-manager/dist/installers/index.d.ts +40 -0
- package/release-manager/dist/installers/index.d.ts.map +1 -0
- package/release-manager/dist/installers/index.js +35 -0
- package/release-manager/dist/installers/index.js.map +1 -0
- package/release-manager/dist/installers/openclaw-host-installer.d.ts +18 -0
- package/release-manager/dist/installers/openclaw-host-installer.d.ts.map +1 -0
- package/release-manager/dist/installers/openclaw-host-installer.js +414 -0
- package/release-manager/dist/installers/openclaw-host-installer.js.map +1 -0
- package/release-manager/dist/mvp-config.d.ts +197 -0
- package/release-manager/dist/mvp-config.d.ts.map +1 -0
- package/release-manager/dist/mvp-config.js +509 -0
- package/release-manager/dist/mvp-config.js.map +1 -0
- package/release-manager/dist/prompts.d.ts +30 -0
- package/release-manager/dist/prompts.d.ts.map +1 -0
- package/release-manager/dist/prompts.js +231 -0
- package/release-manager/dist/prompts.js.map +1 -0
- package/release-manager/dist/skill-language.d.ts +32 -0
- package/release-manager/dist/skill-language.d.ts.map +1 -0
- package/release-manager/dist/skill-language.js +107 -0
- package/release-manager/dist/skill-language.js.map +1 -0
- package/release-manager/dist/uninstaller.d.ts +55 -0
- package/release-manager/dist/uninstaller.d.ts.map +1 -0
- package/release-manager/dist/uninstaller.js +409 -0
- package/release-manager/dist/uninstaller.js.map +1 -0
- package/release-manager/dist/update/atomic-file.d.ts +35 -0
- package/release-manager/dist/update/atomic-file.d.ts.map +1 -0
- package/release-manager/dist/update/atomic-file.js +120 -0
- package/release-manager/dist/update/atomic-file.js.map +1 -0
- package/release-manager/dist/update/bootstrap-protocol.d.ts +55 -0
- package/release-manager/dist/update/bootstrap-protocol.d.ts.map +1 -0
- package/release-manager/dist/update/bootstrap-protocol.js +132 -0
- package/release-manager/dist/update/bootstrap-protocol.js.map +1 -0
- package/release-manager/dist/update/channel-metadata.d.ts +28 -0
- package/release-manager/dist/update/channel-metadata.d.ts.map +1 -0
- package/release-manager/dist/update/channel-metadata.js +90 -0
- package/release-manager/dist/update/channel-metadata.js.map +1 -0
- package/release-manager/dist/update/channel-promotion.d.ts +39 -0
- package/release-manager/dist/update/channel-promotion.d.ts.map +1 -0
- package/release-manager/dist/update/channel-promotion.js +55 -0
- package/release-manager/dist/update/channel-promotion.js.map +1 -0
- package/release-manager/dist/update/data-compatibility.d.ts +35 -0
- package/release-manager/dist/update/data-compatibility.d.ts.map +1 -0
- package/release-manager/dist/update/data-compatibility.js +45 -0
- package/release-manager/dist/update/data-compatibility.js.map +1 -0
- package/release-manager/dist/update/install-layout.d.ts +59 -0
- package/release-manager/dist/update/install-layout.d.ts.map +1 -0
- package/release-manager/dist/update/install-layout.js +127 -0
- package/release-manager/dist/update/install-layout.js.map +1 -0
- package/release-manager/dist/update/legacy-migration.d.ts +56 -0
- package/release-manager/dist/update/legacy-migration.d.ts.map +1 -0
- package/release-manager/dist/update/legacy-migration.js +254 -0
- package/release-manager/dist/update/legacy-migration.js.map +1 -0
- package/release-manager/dist/update/product-identity.d.ts +50 -0
- package/release-manager/dist/update/product-identity.d.ts.map +1 -0
- package/release-manager/dist/update/product-identity.js +63 -0
- package/release-manager/dist/update/product-identity.js.map +1 -0
- package/release-manager/dist/update/release-asset-manifest.d.ts +31 -0
- package/release-manager/dist/update/release-asset-manifest.d.ts.map +1 -0
- package/release-manager/dist/update/release-asset-manifest.js +161 -0
- package/release-manager/dist/update/release-asset-manifest.js.map +1 -0
- package/release-manager/dist/update/release-identity.d.ts +33 -0
- package/release-manager/dist/update/release-identity.d.ts.map +1 -0
- package/release-manager/dist/update/release-identity.js +108 -0
- package/release-manager/dist/update/release-identity.js.map +1 -0
- package/release-manager/dist/update/release-manager-authority.d.ts +69 -0
- package/release-manager/dist/update/release-manager-authority.d.ts.map +1 -0
- package/release-manager/dist/update/release-manager-authority.js +125 -0
- package/release-manager/dist/update/release-manager-authority.js.map +1 -0
- package/release-manager/dist/update/release-manager.d.ts +96 -0
- package/release-manager/dist/update/release-manager.d.ts.map +1 -0
- package/release-manager/dist/update/release-manager.js +253 -0
- package/release-manager/dist/update/release-manager.js.map +1 -0
- package/release-manager/dist/update/release-metadata.d.ts +57 -0
- package/release-manager/dist/update/release-metadata.d.ts.map +1 -0
- package/release-manager/dist/update/release-metadata.js +200 -0
- package/release-manager/dist/update/release-metadata.js.map +1 -0
- package/release-manager/dist/update/release-policy.d.ts +51 -0
- package/release-manager/dist/update/release-policy.d.ts.map +1 -0
- package/release-manager/dist/update/release-policy.js +103 -0
- package/release-manager/dist/update/release-policy.js.map +1 -0
- package/release-manager/dist/update/rollback-policy.d.ts +56 -0
- package/release-manager/dist/update/rollback-policy.d.ts.map +1 -0
- package/release-manager/dist/update/rollback-policy.js +61 -0
- package/release-manager/dist/update/rollback-policy.js.map +1 -0
- package/release-manager/dist/update/transaction-journal.d.ts +131 -0
- package/release-manager/dist/update/transaction-journal.d.ts.map +1 -0
- package/release-manager/dist/update/transaction-journal.js +346 -0
- package/release-manager/dist/update/transaction-journal.js.map +1 -0
- package/release-manager/dist/update/trust-metadata.d.ts +55 -0
- package/release-manager/dist/update/trust-metadata.d.ts.map +1 -0
- package/release-manager/dist/update/trust-metadata.js +170 -0
- package/release-manager/dist/update/trust-metadata.js.map +1 -0
- package/release-manager/dist/update/update-history.d.ts +46 -0
- package/release-manager/dist/update/update-history.d.ts.map +1 -0
- package/release-manager/dist/update/update-history.js +123 -0
- package/release-manager/dist/update/update-history.js.map +1 -0
- package/release-manager/dist/utils/config-file-io.d.ts +26 -0
- package/release-manager/dist/utils/config-file-io.d.ts.map +1 -0
- package/release-manager/dist/utils/config-file-io.js +128 -0
- package/release-manager/dist/utils/config-file-io.js.map +1 -0
- package/release-manager/dist/utils/env.d.ts +60 -0
- package/release-manager/dist/utils/env.d.ts.map +1 -0
- package/release-manager/dist/utils/env.js +308 -0
- package/release-manager/dist/utils/env.js.map +1 -0
- package/release-manager/dist/utils/logger.d.ts +15 -0
- package/release-manager/dist/utils/logger.d.ts.map +1 -0
- package/release-manager/dist/utils/logger.js +30 -0
- package/release-manager/dist/utils/logger.js.map +1 -0
- package/release-manager/dist/utils/workspace-divergence.d.ts +36 -0
- package/release-manager/dist/utils/workspace-divergence.d.ts.map +1 -0
- package/release-manager/dist/utils/workspace-divergence.js +87 -0
- package/release-manager/dist/utils/workspace-divergence.js.map +1 -0
- package/release-manager/package.json +78 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 环境检测工具
|
|
3
|
+
*
|
|
4
|
+
* PRI-605: 跨平台 child_process 调用统一为数组形式 execFileSync(不走 shell),
|
|
5
|
+
* 并按平台路由二进制:
|
|
6
|
+
* - win32: 无 .exe 的 shim(openclaw/clawd/npm 等)经 cmd.exe /c 解析 PATH;
|
|
7
|
+
* python 探测 python3 → python; 网关 PID 用 netstat.exe 而非 PowerShell。
|
|
8
|
+
* - 非 win32: 直接 execFileSync 字面量二进制。
|
|
9
|
+
* 语义与原 execSync 字符串形式一致(找不到命令 → 对应能力置 false / PID 留空,
|
|
10
|
+
* rc-9 不静默抛出)。
|
|
11
|
+
*/
|
|
12
|
+
import { execFileSync } from 'child_process';
|
|
13
|
+
import * as fs from 'fs';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
import * as os from 'os';
|
|
16
|
+
import * as net from 'net';
|
|
17
|
+
const IS_WIN32 = process.platform === 'win32';
|
|
18
|
+
/** 探测超时:卡死的 .cmd shim / 挂起的二进制不应挂住安装器(rc-9 降级)。 */
|
|
19
|
+
const DETECT_TIMEOUT_MS = 5000;
|
|
20
|
+
/**
|
|
21
|
+
* 探测工具版本。失败(未安装/退出非零/超时)返回 null,调用方据此降级
|
|
22
|
+
* (能力置 false / 进入回退链),绝不抛出(rc-9)。探测函数由调用点以
|
|
23
|
+
* 字面量二进制构造,保持 Mimosa 写门要求的 literal argv。
|
|
24
|
+
*/
|
|
25
|
+
function probeVersion(probe) {
|
|
26
|
+
try {
|
|
27
|
+
return probe().trim();
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 检测运行环境
|
|
35
|
+
*/
|
|
36
|
+
export function checkEnvironment() {
|
|
37
|
+
const result = {
|
|
38
|
+
hasOpenClaw: false,
|
|
39
|
+
hasNode: false,
|
|
40
|
+
isNodeSupported: false,
|
|
41
|
+
hasPython: false,
|
|
42
|
+
hasGit: false,
|
|
43
|
+
};
|
|
44
|
+
// 检测 Node.js(PRI-605 数组形式;native 运行时最低要求 major>=22)。
|
|
45
|
+
// win32 上必须经 cmd.exe /c:PATH 里可能只有 node.cmd shim(测试桩、
|
|
46
|
+
// nvm-windows 等场景),CreateProcess 直连会跳过它命中真 node.exe,
|
|
47
|
+
// 让版本门形同虚设。
|
|
48
|
+
const nodeVersion = IS_WIN32
|
|
49
|
+
? probeVersion(() => execFileSync('cmd.exe', ['/c', 'node', '-v'], { encoding: 'utf-8', timeout: DETECT_TIMEOUT_MS }))
|
|
50
|
+
: probeVersion(() => execFileSync('node', ['-v'], { encoding: 'utf-8', timeout: DETECT_TIMEOUT_MS }));
|
|
51
|
+
if (nodeVersion !== null && nodeVersion.length > 0) {
|
|
52
|
+
result.nodeVersion = nodeVersion;
|
|
53
|
+
// 注:此处刻意用 String.match 并禁用 prefer-regexp-exec——写门确定性
|
|
54
|
+
// 规则会把同块内的 ".exec(" 记号与子进程调用合并判为命令注入(已
|
|
55
|
+
// 实测确认的假阳性),而本块必须包含 execFileSync 探测。
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/prefer-regexp-exec
|
|
57
|
+
const major = Number(nodeVersion.match(/^v?(\d+)/)?.[1]);
|
|
58
|
+
result.hasNode = true;
|
|
59
|
+
result.isNodeSupported = Number.isInteger(major) && major >= 22;
|
|
60
|
+
}
|
|
61
|
+
// 检测 OpenClaw(win32 上 openclaw 是 .cmd shim,无 .exe,须经 cmd.exe /c)
|
|
62
|
+
const openclawVersion = IS_WIN32
|
|
63
|
+
? probeVersion(() => execFileSync('cmd.exe', ['/c', 'openclaw', '--version'], { encoding: 'utf-8', timeout: DETECT_TIMEOUT_MS }))
|
|
64
|
+
: probeVersion(() => execFileSync('openclaw', ['--version'], { encoding: 'utf-8', timeout: DETECT_TIMEOUT_MS }));
|
|
65
|
+
if (openclawVersion !== null) {
|
|
66
|
+
result.openclawVersion = openclawVersion;
|
|
67
|
+
result.hasOpenClaw = true;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// 尝试 clawd 命令
|
|
71
|
+
const clawdVersion = IS_WIN32
|
|
72
|
+
? probeVersion(() => execFileSync('cmd.exe', ['/c', 'clawd', '--version'], { encoding: 'utf-8', timeout: DETECT_TIMEOUT_MS }))
|
|
73
|
+
: probeVersion(() => execFileSync('clawd', ['--version'], { encoding: 'utf-8', timeout: DETECT_TIMEOUT_MS }));
|
|
74
|
+
if (clawdVersion !== null) {
|
|
75
|
+
result.openclawVersion = clawdVersion;
|
|
76
|
+
result.hasOpenClaw = true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// 检测 Python(win32 上 python.org 安装通常只提供 python.exe,python3 可能不在 PATH)
|
|
80
|
+
let pythonVersion = probeVersion(() => execFileSync('python3', ['--version'], { encoding: 'utf-8', timeout: DETECT_TIMEOUT_MS }));
|
|
81
|
+
if (pythonVersion === null && IS_WIN32) {
|
|
82
|
+
pythonVersion = probeVersion(() => execFileSync('python', ['--version'], { encoding: 'utf-8', timeout: DETECT_TIMEOUT_MS }));
|
|
83
|
+
}
|
|
84
|
+
if (pythonVersion !== null) {
|
|
85
|
+
const [, version] = pythonVersion.split(' ');
|
|
86
|
+
result.pythonVersion = version;
|
|
87
|
+
result.hasPython = true;
|
|
88
|
+
}
|
|
89
|
+
// 检测 Git
|
|
90
|
+
const gitVersion = probeVersion(() => execFileSync('git', ['--version'], { encoding: 'utf-8', timeout: DETECT_TIMEOUT_MS }));
|
|
91
|
+
if (gitVersion !== null) {
|
|
92
|
+
result.hasGit = true;
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 检测 OpenClaw 工作区
|
|
98
|
+
*/
|
|
99
|
+
export function detectWorkspace() {
|
|
100
|
+
const homeDir = os.homedir();
|
|
101
|
+
const candidates = [];
|
|
102
|
+
// 安全地添加候选路径
|
|
103
|
+
if (process.env.OPENCLAW_WORKSPACE) {
|
|
104
|
+
candidates.push(process.env.OPENCLAW_WORKSPACE);
|
|
105
|
+
}
|
|
106
|
+
if (process.env.PD_WORKSPACE_DIR) {
|
|
107
|
+
candidates.push(process.env.PD_WORKSPACE_DIR);
|
|
108
|
+
}
|
|
109
|
+
candidates.push(path.join(homeDir, 'clawd'));
|
|
110
|
+
candidates.push(path.join(homeDir, '.openclaw', 'workspace'));
|
|
111
|
+
// 核心文件列表(用于检测是否已安装)
|
|
112
|
+
const CORE_FILES = [
|
|
113
|
+
'AGENTS.md',
|
|
114
|
+
'SOUL.md',
|
|
115
|
+
'USER.md',
|
|
116
|
+
];
|
|
117
|
+
for (const candidate of candidates) {
|
|
118
|
+
if (fs.existsSync(candidate)) {
|
|
119
|
+
// Fix-8 (P1-BUG-2): detect via THINKING_OS.md — the file the installer
|
|
120
|
+
// actually creates under .principles/. The previous check for
|
|
121
|
+
// PRINCIPLES.md never matched because the installer doesn't create
|
|
122
|
+
// that file, so hasPrinciples was always false on reinstall.
|
|
123
|
+
const principlesPath = path.join(candidate, '.principles', 'THINKING_OS.md');
|
|
124
|
+
const hasPrinciples = fs.existsSync(principlesPath);
|
|
125
|
+
// 检测已存在的核心文件
|
|
126
|
+
const coreFiles = [];
|
|
127
|
+
for (const file of CORE_FILES) {
|
|
128
|
+
if (fs.existsSync(path.join(candidate, file))) {
|
|
129
|
+
coreFiles.push(file);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// 判断是否首次安装:没有 THINKING_OS.md 且没有核心文件
|
|
133
|
+
const isFirstInstall = !hasPrinciples && coreFiles.length === 0;
|
|
134
|
+
return {
|
|
135
|
+
detectedPath: candidate,
|
|
136
|
+
exists: true,
|
|
137
|
+
hasPrinciples,
|
|
138
|
+
isFirstInstall,
|
|
139
|
+
coreFiles,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// 默认返回 ~/clawd(首次安装)
|
|
144
|
+
const defaultPath = path.join(homeDir, 'clawd');
|
|
145
|
+
return {
|
|
146
|
+
detectedPath: defaultPath,
|
|
147
|
+
exists: false,
|
|
148
|
+
hasPrinciples: false,
|
|
149
|
+
isFirstInstall: true,
|
|
150
|
+
coreFiles: [],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 获取 OpenClaw 配置目录
|
|
155
|
+
*/
|
|
156
|
+
export function getOpenClawConfigDir() {
|
|
157
|
+
return path.join(os.homedir(), '.openclaw');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 获取插件扩展目录
|
|
161
|
+
*/
|
|
162
|
+
export function getPluginExtDir() {
|
|
163
|
+
return path.join(getOpenClawConfigDir(), 'extensions', 'principles-disciple');
|
|
164
|
+
}
|
|
165
|
+
function readOpenClawPort() {
|
|
166
|
+
const configPath = path.join(getOpenClawConfigDir(), 'openclaw.json');
|
|
167
|
+
if (!fs.existsSync(configPath))
|
|
168
|
+
return null;
|
|
169
|
+
try {
|
|
170
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
171
|
+
const config = JSON.parse(raw);
|
|
172
|
+
if (config && typeof config === 'object' && !Array.isArray(config)) {
|
|
173
|
+
const { gateway } = config;
|
|
174
|
+
if (gateway && typeof gateway === 'object' && !Array.isArray(gateway)) {
|
|
175
|
+
const { port } = gateway;
|
|
176
|
+
if (typeof port === 'number' && port > 0 && port < 65536)
|
|
177
|
+
return port;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch { /* ignore */ }
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
function checkPortListening(port) {
|
|
185
|
+
return new Promise((resolve) => {
|
|
186
|
+
const socket = new net.Socket();
|
|
187
|
+
const timeout = 2000;
|
|
188
|
+
socket.setTimeout(timeout);
|
|
189
|
+
socket.on('connect', () => { socket.destroy(); resolve(true); });
|
|
190
|
+
socket.on('error', () => { socket.destroy(); resolve(false); });
|
|
191
|
+
socket.on('timeout', () => { socket.destroy(); resolve(false); });
|
|
192
|
+
socket.connect(port, '127.0.0.1');
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 从 netstat -ano -p tcp 输出解析监听指定端口的 PID。
|
|
197
|
+
* 行形如:TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1234(IPv6 本地地址为 [::]:port)。
|
|
198
|
+
* rc-1/rc-5: 按 unknown 语义逐字段校验,键/列缺失即跳过,不信任列位置。
|
|
199
|
+
*/
|
|
200
|
+
export function parseNetstatPid(output, port) {
|
|
201
|
+
for (const line of output.split('\n')) {
|
|
202
|
+
const parts = line.trim().split(/\s+/);
|
|
203
|
+
if (parts.length < 5)
|
|
204
|
+
continue;
|
|
205
|
+
// parts.length >= 5 已守卫,[0],[1],[3],[4] 存在;`?? ''` 仅为满足严格类型
|
|
206
|
+
const proto = parts[0] ?? '';
|
|
207
|
+
const local = parts[1] ?? '';
|
|
208
|
+
const state = parts[3] ?? '';
|
|
209
|
+
const pidField = parts[4] ?? '';
|
|
210
|
+
if (proto !== 'TCP' || state !== 'LISTENING')
|
|
211
|
+
continue;
|
|
212
|
+
if (!local.endsWith(`:${port}`))
|
|
213
|
+
continue;
|
|
214
|
+
if (!/^\d+$/.test(pidField))
|
|
215
|
+
continue;
|
|
216
|
+
const pid = parseInt(pidField, 10);
|
|
217
|
+
if (Number.isInteger(pid) && pid > 0)
|
|
218
|
+
return pid;
|
|
219
|
+
}
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
export async function checkOpenClawGateway() {
|
|
223
|
+
const port = readOpenClawPort();
|
|
224
|
+
if (!port)
|
|
225
|
+
return { isRunning: false };
|
|
226
|
+
const listening = await checkPortListening(port);
|
|
227
|
+
if (!listening)
|
|
228
|
+
return { isRunning: false };
|
|
229
|
+
let pid = undefined;
|
|
230
|
+
try {
|
|
231
|
+
// ERR-045: argv-array execution only. The validated port is an argv
|
|
232
|
+
// element or a JS-side output match — it never enters a shell string.
|
|
233
|
+
if (Number.isInteger(port) && port > 0 && port < 65536) {
|
|
234
|
+
const output = IS_WIN32
|
|
235
|
+
? execFileSync('netstat.exe', ['-ano', '-p', 'tcp'], { encoding: 'utf-8', timeout: 5000 })
|
|
236
|
+
: execFileSync('lsof', ['-i', `:${port}`, '-t', '-sTCP:LISTEN'], { encoding: 'utf-8', timeout: 5000 });
|
|
237
|
+
const text = output.trim();
|
|
238
|
+
if (text) {
|
|
239
|
+
let listeningLine;
|
|
240
|
+
if (IS_WIN32) {
|
|
241
|
+
listeningLine = text.split('\n').find((line) => {
|
|
242
|
+
const [, localAddress, , state] = line.trim().split(/\s+/);
|
|
243
|
+
return state === 'LISTENING' && localAddress !== undefined && localAddress.endsWith(`:${port}`);
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
[listeningLine] = text.split('\n');
|
|
248
|
+
}
|
|
249
|
+
const pidColumn = IS_WIN32
|
|
250
|
+
? listeningLine?.trim().split(/\s+/)[4]
|
|
251
|
+
: listeningLine?.trim();
|
|
252
|
+
if (pidColumn)
|
|
253
|
+
pid = parseInt(pidColumn, 10);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
catch { /* ignore */ }
|
|
258
|
+
return { isRunning: true, port, pid };
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Run `openclaw gateway <subcommand>` (service-level: launchd/systemd/schtasks).
|
|
262
|
+
* rc-9: never throws — returns {ok:false, error} so callers can degrade with a
|
|
263
|
+
* structured reason + nextAction instead of crashing mid-install.
|
|
264
|
+
*/
|
|
265
|
+
function runGatewayServiceCommand(subcommand) {
|
|
266
|
+
const failedOperation = `openclaw gateway ${subcommand}`;
|
|
267
|
+
try {
|
|
268
|
+
// ERR-045: argv-array execution only. Every branch below is fully
|
|
269
|
+
// literal (compile-time subcommand union), so nothing runtime-derived
|
|
270
|
+
// is ever interpolated into a command line.
|
|
271
|
+
if (subcommand === 'stop') {
|
|
272
|
+
if (IS_WIN32) {
|
|
273
|
+
execFileSync('cmd.exe', ['/c', 'openclaw', 'gateway', 'stop'], { encoding: 'utf-8', timeout: 15000, windowsHide: true });
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
execFileSync('openclaw', ['gateway', 'stop'], { encoding: 'utf-8', timeout: 15000 });
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
if (IS_WIN32) {
|
|
281
|
+
execFileSync('cmd.exe', ['/c', 'openclaw', 'gateway', 'start'], { encoding: 'utf-8', timeout: 15000, windowsHide: true });
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
execFileSync('openclaw', ['gateway', 'start'], { encoding: 'utf-8', timeout: 15000 });
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return { ok: true };
|
|
288
|
+
}
|
|
289
|
+
catch (e) {
|
|
290
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
291
|
+
return { ok: false, error: `${failedOperation} failed: ${msg}` };
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Stop the OpenClaw gateway service. Call before mutating the plugin ext dir
|
|
296
|
+
* to release file locks held on native modules (EPERM on backup rename).
|
|
297
|
+
*/
|
|
298
|
+
export async function stopOpenClawGateway() {
|
|
299
|
+
return runGatewayServiceCommand('stop');
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Start the OpenClaw gateway service (inverse of stopOpenClawGateway). Called
|
|
303
|
+
* after install completes (success or failure) to leave the gateway running.
|
|
304
|
+
*/
|
|
305
|
+
export async function restartOpenClawGateway() {
|
|
306
|
+
return runGatewayServiceCommand('start');
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function setQuietMode(quiet: boolean): void;
|
|
2
|
+
declare const logger: {
|
|
3
|
+
info: (msg: string) => void;
|
|
4
|
+
success: (msg: string) => void;
|
|
5
|
+
warn: (msg: string) => void;
|
|
6
|
+
error: (msg: string) => void;
|
|
7
|
+
step: (msg: string) => void;
|
|
8
|
+
list: (title: string, entries: {
|
|
9
|
+
name: string;
|
|
10
|
+
value: string;
|
|
11
|
+
}[]) => void;
|
|
12
|
+
};
|
|
13
|
+
declare const banner: string;
|
|
14
|
+
export { logger, banner };
|
|
15
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEjD;AAED,QAAA,MAAM,MAAM;IACV,IAAI,QAAQ,MAAM;IAClB,OAAO,QAAQ,MAAM;IACrB,IAAI,QAAQ,MAAM;IAClB,KAAK,QAAQ,MAAM;IAEnB,IAAI,QAAQ,MAAM;IAIlB,IAAI,UAAU,MAAM,WAAW;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE;CAKjE,CAAC;AAEF,QAAA,MAAM,MAAM,QAEmE,CAAC;AAEhF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
let _quiet = false;
|
|
3
|
+
export function setQuietMode(quiet) {
|
|
4
|
+
_quiet = quiet;
|
|
5
|
+
}
|
|
6
|
+
const logger = {
|
|
7
|
+
info: (msg) => { if (!_quiet)
|
|
8
|
+
console.log(`${pc.blue('ℹ')} ${msg}`); },
|
|
9
|
+
success: (msg) => { if (!_quiet)
|
|
10
|
+
console.log(`${pc.green('✔')} ${msg}`); },
|
|
11
|
+
warn: (msg) => { if (!_quiet)
|
|
12
|
+
console.log(`${pc.yellow('⚠')} ${msg}`); },
|
|
13
|
+
error: (msg) => { if (!_quiet)
|
|
14
|
+
console.log(`${pc.red('✖')} ${msg}`); },
|
|
15
|
+
step: (msg) => {
|
|
16
|
+
if (!_quiet)
|
|
17
|
+
console.log(`\n${pc.yellow('📦')} ${msg}\n`);
|
|
18
|
+
},
|
|
19
|
+
list: (title, entries) => {
|
|
20
|
+
if (_quiet)
|
|
21
|
+
return;
|
|
22
|
+
console.log(`\n${pc.bold(title)}`);
|
|
23
|
+
entries.forEach(e => console.log(` ${pc.cyan(e.name)}: ${e.value}`));
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const banner = `${pc.blue('╔══════════════════════════════════════════════════════════════╗')}
|
|
27
|
+
${pc.blue('║')} ${pc.bold(pc.red('🦞 Principles Disciple'))} - Installer ${pc.blue('║')}
|
|
28
|
+
${pc.blue('╚══════════════════════════════════════════════════════════════╝')}`;
|
|
29
|
+
export { logger, banner };
|
|
30
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,IAAI,MAAM,GAAG,KAAK,CAAC;AAEnB,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,GAAG,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9E,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAClF,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAChF,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAE9E,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE;QACpB,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,EAAE,CAAC,KAAa,EAAE,OAA0C,EAAE,EAAE;QAClE,IAAI,MAAM;YAAE,OAAO;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;CACF,CAAC;AAEF,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,kEAAkE,CAAC;EAC3F,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,uCAAuC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;EAChH,EAAE,CAAC,IAAI,CAAC,kEAAkE,CAAC,EAAE,CAAC;AAEhF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRI-686 Fix C: detect divergence between PD's canonical workspace and
|
|
3
|
+
* OpenClaw's resolved workspace for the `main` agent.
|
|
4
|
+
*
|
|
5
|
+
* Why: OpenClaw 2026.8/9 multi-agent layouts resolve an unpinned
|
|
6
|
+
* `agents.entries.main` to `<agents.defaults.workspace>/main`. When an
|
|
7
|
+
* Owner relocates the workspace root to a custom path, PD's installer pins
|
|
8
|
+
* the canonical config to that root while OpenClaw sessions run inside the
|
|
9
|
+
* `<root>/main` subdirectory — the plugin's hooks (PD explicit priority)
|
|
10
|
+
* and commands (ctx.workspaceDir) then split across two state trees, and
|
|
11
|
+
* every pain candidate is gated `needs_evidence` with no error pointing at
|
|
12
|
+
* the cause. This check makes the divergence visible at install time.
|
|
13
|
+
*
|
|
14
|
+
* Pure read-only check — never mutates openclaw.json.
|
|
15
|
+
*/
|
|
16
|
+
export interface WorkspaceDivergenceFinding {
|
|
17
|
+
/** true when OpenClaw's resolved main-agent workspace differs from PD canonical. */
|
|
18
|
+
divergent: boolean;
|
|
19
|
+
/** Path OpenClaw will resolve for the main agent (best-effort mirror of resolveAgentWorkspaceDir). */
|
|
20
|
+
openclawMainWorkspace: string | null;
|
|
21
|
+
/** Where each input came from, for the warning message. */
|
|
22
|
+
detail: string;
|
|
23
|
+
nextAction: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Mirror of OpenClaw's resolveAgentWorkspaceDir(cfg, 'main') for the
|
|
27
|
+
* branches that matter here (custom-workspace machines):
|
|
28
|
+
* 1. agents.entries.main.workspace (explicit pin) — wins
|
|
29
|
+
* 2. legacy-compatibility inheritance — out of scope; the join fallback
|
|
30
|
+
* below is the dangerous branch this check exists to catch
|
|
31
|
+
* 3. path.join(agents.defaults.workspace, 'main') — the split case
|
|
32
|
+
* 4. <stateDir>/workspace-main — default layout, never divergent from
|
|
33
|
+
* PD canonical in the dangerous way; reported as non-divergent.
|
|
34
|
+
*/
|
|
35
|
+
export declare function detectOpenClawMainWorkspaceDivergence(pdCanonicalWorkspace: string, openclawConfigPath?: string): WorkspaceDivergenceFinding;
|
|
36
|
+
//# sourceMappingURL=workspace-divergence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-divergence.d.ts","sourceRoot":"","sources":["../../src/utils/workspace-divergence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,0BAA0B;IACzC,oFAAoF;IACpF,SAAS,EAAE,OAAO,CAAC;IACnB,sGAAsG;IACtG,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAgBD;;;;;;;;;GASG;AACH,wBAAgB,qCAAqC,CACnD,oBAAoB,EAAE,MAAM,EAC5B,kBAAkB,GAAE,MAA8D,GACjF,0BAA0B,CAuD5B"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRI-686 Fix C: detect divergence between PD's canonical workspace and
|
|
3
|
+
* OpenClaw's resolved workspace for the `main` agent.
|
|
4
|
+
*
|
|
5
|
+
* Why: OpenClaw 2026.8/9 multi-agent layouts resolve an unpinned
|
|
6
|
+
* `agents.entries.main` to `<agents.defaults.workspace>/main`. When an
|
|
7
|
+
* Owner relocates the workspace root to a custom path, PD's installer pins
|
|
8
|
+
* the canonical config to that root while OpenClaw sessions run inside the
|
|
9
|
+
* `<root>/main` subdirectory — the plugin's hooks (PD explicit priority)
|
|
10
|
+
* and commands (ctx.workspaceDir) then split across two state trees, and
|
|
11
|
+
* every pain candidate is gated `needs_evidence` with no error pointing at
|
|
12
|
+
* the cause. This check makes the divergence visible at install time.
|
|
13
|
+
*
|
|
14
|
+
* Pure read-only check — never mutates openclaw.json.
|
|
15
|
+
*/
|
|
16
|
+
import * as fs from 'fs';
|
|
17
|
+
import * as path from 'path';
|
|
18
|
+
import * as os from 'os';
|
|
19
|
+
function isRecord(value) {
|
|
20
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
21
|
+
}
|
|
22
|
+
function readJsonFile(filePath) {
|
|
23
|
+
try {
|
|
24
|
+
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
25
|
+
const parsed = JSON.parse(raw);
|
|
26
|
+
return isRecord(parsed) ? parsed : null;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Mirror of OpenClaw's resolveAgentWorkspaceDir(cfg, 'main') for the
|
|
34
|
+
* branches that matter here (custom-workspace machines):
|
|
35
|
+
* 1. agents.entries.main.workspace (explicit pin) — wins
|
|
36
|
+
* 2. legacy-compatibility inheritance — out of scope; the join fallback
|
|
37
|
+
* below is the dangerous branch this check exists to catch
|
|
38
|
+
* 3. path.join(agents.defaults.workspace, 'main') — the split case
|
|
39
|
+
* 4. <stateDir>/workspace-main — default layout, never divergent from
|
|
40
|
+
* PD canonical in the dangerous way; reported as non-divergent.
|
|
41
|
+
*/
|
|
42
|
+
export function detectOpenClawMainWorkspaceDivergence(pdCanonicalWorkspace, openclawConfigPath = path.join(os.homedir(), '.openclaw', 'openclaw.json')) {
|
|
43
|
+
const nonDivergent = (openclawMainWorkspace, detail) => ({
|
|
44
|
+
divergent: false,
|
|
45
|
+
openclawMainWorkspace,
|
|
46
|
+
detail,
|
|
47
|
+
nextAction: '',
|
|
48
|
+
});
|
|
49
|
+
const cfg = readJsonFile(openclawConfigPath);
|
|
50
|
+
if (!cfg) {
|
|
51
|
+
return nonDivergent(null, 'openclaw.json not found or unreadable — OpenClaw will use its default workspace layout');
|
|
52
|
+
}
|
|
53
|
+
const { agents } = cfg;
|
|
54
|
+
if (!isRecord(agents)) {
|
|
55
|
+
return nonDivergent(null, 'openclaw.json has no agents section — single-agent default layout');
|
|
56
|
+
}
|
|
57
|
+
const { entries } = agents;
|
|
58
|
+
const mainEntry = isRecord(entries) && isRecord(entries.main) ? entries.main : null;
|
|
59
|
+
// Branch 1: explicit pin on the main entry → no join, no split.
|
|
60
|
+
if (mainEntry && typeof mainEntry.workspace === 'string' && mainEntry.workspace.trim()) {
|
|
61
|
+
const pinned = path.resolve(mainEntry.workspace.trim());
|
|
62
|
+
return {
|
|
63
|
+
divergent: path.resolve(pdCanonicalWorkspace) !== pinned,
|
|
64
|
+
openclawMainWorkspace: pinned,
|
|
65
|
+
detail: `agents.entries.main.workspace = ${pinned}`,
|
|
66
|
+
nextAction: `Align them: set agents.entries.main.workspace to "${pdCanonicalWorkspace}" in ${openclawConfigPath}, or run the PD installer against "${pinned}".`,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// Branch 3: join(defaults.workspace, 'main') — the split case.
|
|
70
|
+
const { defaults } = agents;
|
|
71
|
+
const defaultsWorkspace = isRecord(defaults) && typeof defaults.workspace === 'string' && defaults.workspace.trim()
|
|
72
|
+
? path.resolve(defaults.workspace.trim())
|
|
73
|
+
: null;
|
|
74
|
+
if (defaultsWorkspace) {
|
|
75
|
+
const joinedMain = path.join(defaultsWorkspace, 'main');
|
|
76
|
+
return {
|
|
77
|
+
divergent: path.resolve(pdCanonicalWorkspace) !== joinedMain,
|
|
78
|
+
openclawMainWorkspace: joinedMain,
|
|
79
|
+
detail: `agents.defaults.workspace = ${defaultsWorkspace}; unpinned agents.entries.main resolves to ${joinedMain}`,
|
|
80
|
+
nextAction: `OpenClaw will run main-agent sessions in "${joinedMain}" while PD uses "${pdCanonicalWorkspace}". ` +
|
|
81
|
+
`Fix: pin "workspace": "${pdCanonicalWorkspace}" on agents.entries.main in ${openclawConfigPath} (OpenClaw restart required).`,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// Branch 4: OpenClaw default layout — no custom root, not the split case.
|
|
85
|
+
return nonDivergent(null, 'agents.defaults.workspace not set — OpenClaw uses its default workspace layout');
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=workspace-divergence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-divergence.js","sourceRoot":"","sources":["../../src/utils/workspace-divergence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-principles-disciple",
|
|
3
|
+
"version": "1.132.3",
|
|
4
|
+
"description": "Interactive CLI installer for Principles Disciple OpenClaw plugin",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"create-principles-disciple": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"plugin",
|
|
12
|
+
"pd-cli",
|
|
13
|
+
"console",
|
|
14
|
+
"core",
|
|
15
|
+
"host-runtime",
|
|
16
|
+
"install-layout",
|
|
17
|
+
"release-manager",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc",
|
|
23
|
+
"dev": "tsc --watch",
|
|
24
|
+
"bundle": "node scripts/bundle-plugin.mjs",
|
|
25
|
+
"build:release-asset": "node scripts/build-self-contained-release.mjs",
|
|
26
|
+
"generate:release-locks": "node scripts/generate-release-locks.mjs",
|
|
27
|
+
"check:release-locks": "node scripts/check-release-locks.mjs",
|
|
28
|
+
"prepack": "npm run build && npm run bundle",
|
|
29
|
+
"prepublishOnly": "npm run build && npm run bundle",
|
|
30
|
+
"test": "vitest run",
|
|
31
|
+
"test:fast": "vitest run --exclude tests/smoke-packaged-install.test.ts --exclude tests/release-asset-smoke.test.ts",
|
|
32
|
+
"test:smoke:packaged": "vitest run tests/smoke-packaged-install.test.ts",
|
|
33
|
+
"test:smoke:release-asset": "vitest run tests/release-asset-smoke.test.ts"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"openclaw",
|
|
37
|
+
"principles-disciple",
|
|
38
|
+
"cli",
|
|
39
|
+
"installer",
|
|
40
|
+
"interactive"
|
|
41
|
+
],
|
|
42
|
+
"author": "csuzngjh",
|
|
43
|
+
"license": "MIT",
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@principles/install-layout": "file:../install-layout",
|
|
46
|
+
"@tufjs/models": "3.0.1",
|
|
47
|
+
"@inquirer/prompts": "^8.5.2",
|
|
48
|
+
"commander": "^14.0.3",
|
|
49
|
+
"fs-extra": "^11.4.0",
|
|
50
|
+
"js-yaml": "^5.3.0",
|
|
51
|
+
"ora": "^9.4.0",
|
|
52
|
+
"picocolors": "^1.0.0",
|
|
53
|
+
"semver": "^7.8.5",
|
|
54
|
+
"tar": "^7.5.22",
|
|
55
|
+
"tuf-js": "3.1.0"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/fs-extra": "^11.0.4",
|
|
59
|
+
"@types/js-yaml": "^4.0.9",
|
|
60
|
+
"@types/node": "^26.1.2",
|
|
61
|
+
"@types/semver": "^7.7.0",
|
|
62
|
+
"@types/tar": "^7.0.87",
|
|
63
|
+
"typescript": "^7.0.2",
|
|
64
|
+
"vite": "^8.0.16",
|
|
65
|
+
"vitest": "^4.1.10"
|
|
66
|
+
},
|
|
67
|
+
"engines": {
|
|
68
|
+
"node": ">=22.0.0"
|
|
69
|
+
},
|
|
70
|
+
"repository": {
|
|
71
|
+
"type": "git",
|
|
72
|
+
"url": "https://github.com/csuzngjh/principles.git",
|
|
73
|
+
"directory": "packages/create-principles-disciple"
|
|
74
|
+
},
|
|
75
|
+
"pd": {
|
|
76
|
+
"bundledPluginVersion": "1.230.2"
|
|
77
|
+
}
|
|
78
|
+
}
|