ygl-trees 0.77.1 → 0.77.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/CHANGELOG.md +10 -0
- package/dist/apps/cli/src/bin.js +8 -3
- package/dist/bundle/bin.cjs +10 -3
- package/dist/packages/techtree/model/src/cmds.js +14 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.77.3(2026-10-17)node list 位置参数 UX + 树漂移修正
|
|
4
|
+
- **UX**:node list <tree> 位置参数现在真的选中该树(此前静默忽略并回退 current_tree——巡检中实际踩中)
|
|
5
|
+
- 非树名位置参数给显式提示而非静默误导;-t 标志仍优先
|
|
6
|
+
- 树漂移修正:v2-roadmap 三个已实现节点解锁(time-travel/nl-interface/multi-workspace,138/154=90%)
|
|
7
|
+
|
|
8
|
+
## 0.77.2(2026-10-17)JSON 纯净性修复
|
|
9
|
+
- **契约修复**:unknown-group 错误路径的 try 提示不再泄漏到 --json stdout(冷启动之旅实测发现)
|
|
10
|
+
- degraded mode 提示在 json 模式改走 stderr
|
|
11
|
+
- 冷安装全链路验证通过(npm install → init → doctor → research → tree → kb → webui)
|
|
12
|
+
|
|
3
13
|
## 0.77.1(2026-10-17)DEP0190 hotfix
|
|
4
14
|
- 所有 shell:true 消除(resolvePm 的 where/version 检查改用无 shell 调用)
|
|
5
15
|
- plugin install/remove 零弃用警告
|
package/dist/apps/cli/src/bin.js
CHANGED
|
@@ -386,7 +386,11 @@ async function main(argv) {
|
|
|
386
386
|
home, dbFile: dbFile2, ctx,
|
|
387
387
|
db: null, store: null, cordis: null,
|
|
388
388
|
};
|
|
389
|
-
|
|
389
|
+
// JSON purity: stdout is the machine channel — degraded-mode notice goes to stderr there
|
|
390
|
+
if (ctx.json)
|
|
391
|
+
console.error((0, fmt_1.paint)(fmt_1.C.yellow, " ! degraded mode: user plugins failed to load — plugin commands only", ctx.color));
|
|
392
|
+
else
|
|
393
|
+
(0, fmt_1.out)(ctx, (0, fmt_1.paint)(fmt_1.C.yellow, " ! degraded mode: user plugins failed to load — plugin commands only", ctx.color));
|
|
390
394
|
return pluginCmds.runPluginCommand(env2, action || "list", args._.slice(2), args);
|
|
391
395
|
}
|
|
392
396
|
(0, startup_diagnostics_1.reportStartupFailure)(e, home, VERSION);
|
|
@@ -541,8 +545,9 @@ async function main(argv) {
|
|
|
541
545
|
else {
|
|
542
546
|
(0, fmt_1.bad)(ctx, `unknown group: ${group}`);
|
|
543
547
|
}
|
|
544
|
-
|
|
545
|
-
|
|
548
|
+
if (!ctx.json) {
|
|
549
|
+
(0, fmt_1.out)(ctx, (0, fmt_1.paint)(fmt_1.C.dim, " try: ygl-trees (no args) for full usage", ctx.color));
|
|
550
|
+
}
|
|
546
551
|
if (!ctx.json)
|
|
547
552
|
(0, fmt_1.out)(ctx, usage()); // usage text belongs to the human channel
|
|
548
553
|
return 2;
|
package/dist/bundle/bin.cjs
CHANGED
|
@@ -7830,9 +7830,15 @@ function run$5(env, action, rest, args) {
|
|
|
7830
7830
|
return 0;
|
|
7831
7831
|
}
|
|
7832
7832
|
}
|
|
7833
|
+
let positionalTree;
|
|
7834
|
+
if (env.group === "node" && (action === "list" || action === void 0) && !sel && rest[0]) {
|
|
7835
|
+
positionalTree = trees.treeByName(rest[0]);
|
|
7836
|
+
if (positionalTree) rest = rest.slice(1);
|
|
7837
|
+
else if (!ctx.json) out(ctx, paint(C.yellow, ` ! "${rest[0]}" is not a tree — showing current tree (use -t <tree> to switch)`, ctx.color));
|
|
7838
|
+
}
|
|
7833
7839
|
let tree;
|
|
7834
7840
|
try {
|
|
7835
|
-
tree = trees.treeResolve(sel);
|
|
7841
|
+
tree = positionalTree || trees.treeResolve(sel);
|
|
7836
7842
|
} catch (e) {
|
|
7837
7843
|
bad(ctx, e.message);
|
|
7838
7844
|
return 1;
|
|
@@ -11071,7 +11077,8 @@ async function main(argv) {
|
|
|
11071
11077
|
store: null,
|
|
11072
11078
|
cordis: null
|
|
11073
11079
|
};
|
|
11074
|
-
|
|
11080
|
+
if (ctx.json) console.error(paint(C.yellow, " ! degraded mode: user plugins failed to load — plugin commands only", ctx.color));
|
|
11081
|
+
else out(ctx, paint(C.yellow, " ! degraded mode: user plugins failed to load — plugin commands only", ctx.color));
|
|
11075
11082
|
return pluginCmds.runPluginCommand(env2, action || "list", args._.slice(2), args);
|
|
11076
11083
|
}
|
|
11077
11084
|
reportStartupFailure(e, home, VERSION);
|
|
@@ -11238,7 +11245,7 @@ async function main(argv) {
|
|
|
11238
11245
|
if (suggestions.length === 1) bad(ctx, `unknown group: ${group} — did you mean "${suggestions[0]}"?`);
|
|
11239
11246
|
else if (suggestions.length > 1) bad(ctx, `unknown group: ${group} — did you mean: ${suggestions.slice(0, 3).join(" | ")}?`);
|
|
11240
11247
|
else bad(ctx, `unknown group: ${group}`);
|
|
11241
|
-
out(ctx, paint(C.dim, " try: ygl-trees (no args) for full usage", ctx.color));
|
|
11248
|
+
if (!ctx.json) out(ctx, paint(C.dim, " try: ygl-trees (no args) for full usage", ctx.color));
|
|
11242
11249
|
if (!ctx.json) out(ctx, usage());
|
|
11243
11250
|
return 2;
|
|
11244
11251
|
}
|
|
@@ -119,9 +119,22 @@ function run(env, action, rest, args) {
|
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
// ---------------------------------------------------------------- node group
|
|
122
|
+
// UX guard (drift-fix 2026-10-17): `node list <tree>` positional was silently
|
|
123
|
+
// ignored (fell back to current_tree — user saw the WRONG tree with no hint).
|
|
124
|
+
// Now: a positional that names an existing tree selects it; anything else
|
|
125
|
+
// earns an explicit "ignored" notice instead of silent misdirection.
|
|
126
|
+
let positionalTree;
|
|
127
|
+
if (env.group === "node" && (action === "list" || action === undefined) && !sel && rest[0]) {
|
|
128
|
+
positionalTree = trees.treeByName(rest[0]);
|
|
129
|
+
if (positionalTree)
|
|
130
|
+
rest = rest.slice(1);
|
|
131
|
+
else if (!ctx.json) {
|
|
132
|
+
(0, fmt_1.out)(ctx, (0, fmt_1.paint)(fmt_1.C.yellow, ` ! "${rest[0]}" is not a tree — showing current tree (use -t <tree> to switch)`, ctx.color));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
122
135
|
let tree;
|
|
123
136
|
try {
|
|
124
|
-
tree = trees.treeResolve(sel);
|
|
137
|
+
tree = positionalTree || trees.treeResolve(sel);
|
|
125
138
|
}
|
|
126
139
|
catch (e) {
|
|
127
140
|
(0, fmt_1.bad)(ctx, e.message);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ygl-trees",
|
|
3
|
-
"version": "0.77.
|
|
3
|
+
"version": "0.77.3",
|
|
4
4
|
"description": "猿光 · 科技树 — database-centric CLI for research → production → knowledge reuse, built for AI agents.",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "dist/apps/cli/index.js",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"reflect-metadata": "^0.2.2",
|
|
27
27
|
"typeorm": "^1.1.2",
|
|
28
28
|
"@deepseek-ai/cordis": "~4.0.5-alpha.2",
|
|
29
|
-
"@deepseek-ai/cordis-plugin-timer": "~1.1.7-alpha.2",
|
|
30
29
|
"@deepseek-ai/cosmokit": "~1.8.6-alpha.2",
|
|
30
|
+
"@deepseek-ai/cordis-plugin-timer": "~1.1.7-alpha.2",
|
|
31
31
|
"@deepseek-ai/schemastery": "~3.18.5-alpha.2"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|