@akasha-book/gate 1.4.2 → 1.4.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/README.md +1 -1
- package/cordis.patch.yml +3 -0
- package/index.js +35 -1
- package/package.json +3 -3
package/README.md
CHANGED
package/cordis.patch.yml
CHANGED
package/index.js
CHANGED
|
@@ -38,6 +38,39 @@ export function expandHome(p) {
|
|
|
38
38
|
if (p.startsWith('~/') || p.startsWith('~\\')) return join(homedir(), p.slice(2));
|
|
39
39
|
return p;
|
|
40
40
|
}
|
|
41
|
+
// ── 占位符守卫(2026-10-19 发布面 P0)──────────────────────────────
|
|
42
|
+
// OSS 的 `cordis.patch.yml` 用 `<AKASHA_DIR>` / `<LOCAL_PATH>` 作示例字面量。用户照抄不改时,
|
|
43
|
+
// config 里的字面量**优先于** AKASHA_DIR 环境变量默认值(见下面 apply 里的三元判断)⇒ 插件指向不存在的路径:
|
|
44
|
+
// 门控写保护空转、日志写不进去,而且全是静默的。这里**明确抛错**(fail closed),让配置错误在启动时说话。
|
|
45
|
+
const PLACEHOLDER_TOKEN = /<[A-Za-z][A-Za-z0-9_]{2,}>/; // 大小写都认(2026-10-19 审计 B:小写/混合形态此前漏检)
|
|
46
|
+
/** 递归找配置里的未替换占位符(只认全大写尖括号 token,不误伤普通文本)。 */
|
|
47
|
+
export function findPlaceholders(value, path = 'config', depth = 0) {
|
|
48
|
+
if (depth > 8) return [];
|
|
49
|
+
if (typeof value === 'string') {
|
|
50
|
+
const m = value.match(PLACEHOLDER_TOKEN);
|
|
51
|
+
return m ? [{ field: path, token: m[0] }] : [];
|
|
52
|
+
}
|
|
53
|
+
if (Array.isArray(value)) return value.flatMap((v, i) => findPlaceholders(v, `${path}[${i}]`, depth + 1));
|
|
54
|
+
if (!value || typeof value !== 'object') return [];
|
|
55
|
+
return Object.entries(value).flatMap(([k, v]) => findPlaceholders(v, `${path}.${k}`, depth + 1));
|
|
56
|
+
}
|
|
57
|
+
export function assertNoPlaceholders(config) {
|
|
58
|
+
const hits = findPlaceholders(config);
|
|
59
|
+
// 2026-10-19(审计 B):环境变量路线此前完全没设防——AKASHA_DIR='<AKASHA_DIR>' 时插件事先不知道。
|
|
60
|
+
const envVal = process.env.AKASHA_DIR;
|
|
61
|
+
if (typeof envVal === 'string' && envVal.trim() !== '') {
|
|
62
|
+
const m = envVal.match(PLACEHOLDER_TOKEN);
|
|
63
|
+
if (m) hits.push({ field: 'AKASHA_DIR(环境变量)', token: m[0] });
|
|
64
|
+
}
|
|
65
|
+
if (!hits.length) return;
|
|
66
|
+
const fields = [...new Set(hits.map((h) => h.field))].join('、');
|
|
67
|
+
throw new Error(
|
|
68
|
+
`akasha-gate: 配置里还有未替换的占位符 ${hits[0].token}(${fields})。` +
|
|
69
|
+
'请先把 cordis.patch.yml 里的 <AKASHA_DIR> / <LOCAL_PATH> 改成你的实际路径;' +
|
|
70
|
+
'或删掉这些字段,改用 AKASHA_DIR 环境变量。' +
|
|
71
|
+
'(宁可启动失败,也不静默降级——照抄占位符会让门控指向不存在的库。)'
|
|
72
|
+
);
|
|
73
|
+
}
|
|
41
74
|
const WRITE_TOOLS = new Set(['edit', 'write', 'apply_patch', 'ops_replace']);
|
|
42
75
|
// 命令类工具:能间接写盘的**全部**入口(2026-10-10 人读复查补 dsh_wsl 与 codex 系;
|
|
43
76
|
// 2026-10-12 窗口 4 再补 ops_bash——dsh-ops 落地后它是新的间接写盘入口,漏了就是真盲区)。
|
|
@@ -356,8 +389,9 @@ export function apply(ctx, config = {}) {
|
|
|
356
389
|
try { (ctx.logger?.info ?? (() => {}))('gate: abOff=true(A/B 关闭臂)——本插件不注册任何面'); } catch { /* 静默 */ }
|
|
357
390
|
return;
|
|
358
391
|
}
|
|
392
|
+
assertNoPlaceholders(config);
|
|
359
393
|
const logPath = typeof config.log === 'string' && config.log.trim() !== '' ? expandHome(config.log) : DEFAULT_LOG;
|
|
360
|
-
// 路径用 Node 自己的 resolve(2026-10 复查)。此前把 '/'
|
|
394
|
+
// 路径用 Node 自己的 resolve(2026-10 复查)。此前把 '/' 一律换成反斜杠再 join,
|
|
361
395
|
// 在 POSIX 上不再是绝对路径,require 核心库失败,用法条永远停在兜底。
|
|
362
396
|
const dataDir = typeof config.dataDir === 'string' && config.dataDir.trim() !== '' ? expandHome(config.dataDir) : DEFAULT_DATA_DIR;
|
|
363
397
|
const akashaDir = typeof config.akashaDir === 'string' && config.akashaDir.trim() !== '' ? expandHome(config.akashaDir) : DEFAULT_AKASHA_DIR;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akasha-book/gate",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.3",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=18"
|
|
6
6
|
},
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
"repository": {
|
|
29
29
|
"type": "git",
|
|
30
30
|
"url": "git+https://github.com/Ersith/akasha-book.git",
|
|
31
|
-
"directory": "
|
|
31
|
+
"directory": "plugins/akasha-gate"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"test": "node selftest.test.mjs",
|
|
35
|
-
"check": "node --check
|
|
35
|
+
"check": "node --check index.js"
|
|
36
36
|
},
|
|
37
37
|
"publishConfig": {
|
|
38
38
|
"access": "public"
|