@wenaixi/dsh-ponytail 4.10.0-dsh.9 → 5.1.0
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 +122 -5
- package/README.md +29 -17
- package/lib/client.js +297 -153
- package/lib/ponytail-commands.d.ts +2 -0
- package/lib/ponytail-commands.d.ts.map +1 -1
- package/lib/ponytail-commands.js +3 -0
- package/lib/ponytail-commands.js.map +1 -1
- package/lib/ponytail-config.d.ts +42 -24
- package/lib/ponytail-config.d.ts.map +1 -1
- package/lib/ponytail-config.js +84 -86
- package/lib/ponytail-config.js.map +1 -1
- package/lib/ponytail-instructions.d.ts +1 -1
- package/lib/ponytail-instructions.js +1 -1
- package/lib/ponytail-priority.d.ts +8 -6
- package/lib/ponytail-priority.d.ts.map +1 -1
- package/lib/ponytail-priority.js +10 -9
- package/lib/ponytail-priority.js.map +1 -1
- package/lib/ponytail-remote.d.ts +56 -0
- package/lib/ponytail-remote.d.ts.map +1 -0
- package/lib/ponytail-remote.js +138 -0
- package/lib/ponytail-remote.js.map +1 -0
- package/lib/ponytail-settings.d.ts +96 -0
- package/lib/ponytail-settings.d.ts.map +1 -0
- package/lib/ponytail-settings.js +165 -0
- package/lib/ponytail-settings.js.map +1 -0
- package/lib/ponytail-state.d.ts +18 -3
- package/lib/ponytail-state.d.ts.map +1 -1
- package/lib/ponytail-state.js +56 -17
- package/lib/ponytail-state.js.map +1 -1
- package/lib/ponytail.d.ts +26 -6
- package/lib/ponytail.d.ts.map +1 -1
- package/lib/ponytail.js +194 -204
- package/lib/ponytail.js.map +1 -1
- package/locale/en.json +39 -3
- package/locale/zh.json +39 -3
- package/package.json +7 -2
- package/lib/ponytail-runtime.d.ts +0 -13
- package/lib/ponytail-runtime.d.ts.map +0 -1
- package/lib/ponytail-runtime.js +0 -42
- package/lib/ponytail-runtime.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,121 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
所有重要变更记录于此,格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)
|
|
3
|
+
所有重要变更记录于此,格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)。本地版本与上游参考版本独立维护。
|
|
4
4
|
|
|
5
|
-
>
|
|
5
|
+
> 当前本地版本:`5.1.0`。上游参考:`DietrichGebert/ponytail 4.10.3`(2026-10-04 核验)。历史 `-dsh.N` 记录仅用于追溯,不再作为现行版本规则。
|
|
6
6
|
|
|
7
|
-
## [
|
|
7
|
+
## [5.0.0] - 2026-10-04
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
### Changed
|
|
10
|
+
- 本地版本从 `4.10.0-dsh.12` 切换为独立的 `5.0.0`,不再随上游版本自动重置或生成 `-dsh.N`。
|
|
11
|
+
- README、架构记录和发布流程明确区分本地发行版本与上游参考版本。
|
|
12
|
+
- CI 行为测试步骤改为以实际命令输出为准,不再写死历史数量。
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
- 客户端 locale 字典改为 DSH 要求的扁平键,避免界面显示 `panel.title`、`priority.title` 等裸 key。
|
|
16
|
+
- 客户端产物继续禁止 `import.meta` 和 `process.`,避免浏览器导入失败。
|
|
17
|
+
|
|
18
|
+
## [5.1.0] - 2026-10-05
|
|
19
|
+
|
|
20
|
+
### Breaking
|
|
21
|
+
|
|
22
|
+
- **配置与 flag 的落点从全局数据根改为 profile 目录**(`profiles/<name>/ponytail/`)。升级用户的当前档位会重置为 `full`:迁移读取的是 profile 内的新位置,全局共享的旧 `config.json` 只需一次性导入。
|
|
23
|
+
- **优先级链从四级降为三级**(`env > patch > fallback`),`config.json` 层退役。界面上的「用户配置文件」一行已移除。
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
- 配置与 flag 的 profile 维度:全部配置文件读写函数与 `createDiskStorage` 接受 `profileDir`,目录来自宿主 `profileContext.dir`,落点改为 `profiles/<name>/ponytail/`。同机多实例不再共享 `$DSH_HOME/ponytail`,最后写者赢的串扰消失。`src/ponytail-settings.ts` 提供两条通道——`createSettingsSink` 经 `ctx.settings.mutate('ponytail', ops, revision)` 写入,由宿主落到 profile 补丁并自带 revision 冲突保护;`createFileSink` 在无 settings 服务的组合(headless / CLI)回退读写 profile 内 `config.json`;`migrateLegacyConfig` 把全局共享的旧 `config.json` 一次性导入 profile 补丁并改名使其幂等。
|
|
27
|
+
- `src/ponytail-remote.ts`:`PonytailRemote extends TypertRemoteService`,命名空间 `ponytail`,只暴露只读端点 `snapshot()`(当前生效等级 + 三级优先级诊断链)。宿主网关按服务上的 `typertRemote` 绑定自动发现端点,浏览器侧即 `ctx.remote.ponytail.snapshot()`。
|
|
28
|
+
- 客户端 Remote 贡献声明 `PONYTAIL_REMOTE`:`apply()` 先 `await ctx.remote.$mount(...)` 再建 store。此前客户端只读命名空间却从未挂载,而网关的命名空间不是按需自动开通的(`dsh-api-remotes` 只遍历编译期写死的 25 个官方贡献),`remote.ponytail` 永不出现,面板因此永久显示「诊断信息不可用」——宿主完全正常。`$mount` 返回即命名空间就绪,故 40 次 x 50ms 轮询一并删除,改为挂载失败直接降级。
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
- 配置卡改用 DSH 官方插件配置组合:`Config` 的 `defaultMode` 与 `disabledSkills` 声明为 `.volatile()` 字段,宿主 `volatileForm()` 投影成官方表单;客户端经 `ctx.configForms.get('ponytail')` 读写,插槽注册包在 `configForms.whileServed(['ponytail'])` 内。
|
|
32
|
+
- 优先级链从四级降为三级 `env > patch > fallback`:`config.json` 层随 1A 下沉退役。留在链里就是一层永远不生效的空壳,而「看着能改其实不生效」正是这套面板最初要解决的坑。`LEVELS` / `LABELS` / `PROBLEMS` 各删一项,`resolvePriority` 去掉 `configMode` 参数,locale 同步删除 `level.config` 与 `problem.config`。
|
|
33
|
+
- `patchMode` 改为实时读取 volatile 引用,不再缓存启动期快照。
|
|
34
|
+
- `PonytailConfig` 的两个可持久化字段类型为 `VolatileRef<T>`,新增 `readVolatile()` 兼容「引用 / 裸值 / 未配置」三态。
|
|
35
|
+
- 技能启用态的失效触发点从自制 HTTP 端点直调改为监听宿主 `loader/volatile-update`。
|
|
36
|
+
|
|
37
|
+
### Removed
|
|
38
|
+
- 删除 `src/ponytail-http.ts` 与 `/api/plugins/ponytail/config` 端点,以及 `webServer` 注入。
|
|
39
|
+
- 删除 `apply()` 里对 `settings.register('ponytail', Config)` 的调用——`@deepseek-ai/dsh-settings@0.2.0-rc.2` 没有 `register` 方法(全文件零次出现),该调用此前被 `typeof` 守卫静默跳过,属于从未生效的死代码。命名空间改由「唯一 profile 条目 + 含 volatile 字段的 Config」自动产生。
|
|
40
|
+
- 删除平台位置兼容读取 `getLegacyConfigDir()` / `getLegacyConfigPath()`(`%APPDATA%` / `XDG_CONFIG_HOME` / `~/.config` 三条分支)。1A 下沉后它们不再有任何读取者,`scripts/verify.mjs` 的对应豁免同时移除——现在 `src/` 下出现任何平台路径字面量直接判失败。
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
- 技能禁用状态此前只存在 `config.json` 且只能由 HTTP 端点修改;迁移后 UI 改开关后模型侧目录不收敛(写入链不经过本插件任何函数)。现由 loader 的 volatile 提交事件驱动失效。
|
|
44
|
+
- 客户端配置卡此前自建 `fetch` 状态机(含空配置兜底、加载态、错误态),现完全走官方表单控制器,不发起任何 HTTP 请求。
|
|
45
|
+
- 等级选择器的锁定判定原为「除 patch 与 config 外、只要有层级命中就锁」,而兜底层在没有 env 与 patch 时恒命中,于是按钮永久禁用、提示永远显示「当前有更高优先级的配置在生效」——但兜底不是更高优先级的配置,改补丁立刻生效,文案在说谎。改为只认 env 命中。
|
|
46
|
+
|
|
47
|
+
## [4.10.0-dsh.12] - 2026-10-04
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
- 修复默认档持久化后 HTTP 诊断仍读取旧 patch/env 快照的问题:配置端点改用实时 getter,GET 与 POST 共享当前优先级事实。
|
|
51
|
+
- 修复 systemPrompt 生产接线绕过 `renderPromptSection` 的问题,保留技能禁用配置热收敛。
|
|
52
|
+
|
|
53
|
+
### Changed
|
|
54
|
+
- 新增两项生产接线回归测试,覆盖动态 HTTP handler 与外部 flag 变化;行为测试达到 64 项。
|
|
55
|
+
- 延后统一多个 SKILL.md frontmatter 解析器:provider、HTTP 与构建脚本的输入接受范围和 fallback 语义不同,暂不引入共享 seam。
|
|
56
|
+
|
|
57
|
+
### Migration
|
|
58
|
+
- 无配置格式迁移;现有配置继续有效。
|
|
59
|
+
|
|
60
|
+
## [4.10.0-dsh.11] - 2026-10-04
|
|
61
|
+
|
|
62
|
+
### Fixed
|
|
63
|
+
- **客户端产物内嵌宿侧死代码 `import.meta`(C4 回归)**:`build-client.mjs` 模板残留一行
|
|
64
|
+
`const skillRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'skills')`
|
|
65
|
+
(4.10.0-dsh.10 引入),产物 `lib/client.js` 里零引用却携带 `import.meta`——宿主把 bundle
|
|
66
|
+
原样拼接进 `<script src>` 加载,浏览器解析即 SyntaxError,整个客户端 bundle 加载失败
|
|
67
|
+
(配置面板静默消失)。删除死行;`verify.mjs` 新增反向断言:`lib/client.js` 不得含
|
|
68
|
+
`import.meta` / `process.`(先破坏实测再还原)。
|
|
69
|
+
- **默认档命令层分裂(真 bug)**:apply 启动判定与 UI 面板走 `resolvePriority`(含 patch 层),
|
|
70
|
+
而命令调度器未注入 `getDefaultMode` 时落到 `getDefaultMode()`(无 patch 层)。当
|
|
71
|
+
cordis.patch.yml 显式声明 `defaultMode` 且 config.json 缺失/不同时,`/ponytail foobar`
|
|
72
|
+
(上游 else 兜底切默认档)把等级从 patch 档切到 config 档,裸 `/ponytail` 报告档也错误。
|
|
73
|
+
修复:dispatcher 注入实时 `resolvePriority` 闭包(同 apply/UI 同源同刻),
|
|
74
|
+
三条消费路径统一真源。
|
|
75
|
+
|
|
76
|
+
### Changed
|
|
77
|
+
- **config.json 读侧收敛单一解析出口(C2)**:新增私有 `parseConfigObject(raw)` 归一解析
|
|
78
|
+
唯一真源,`readFullConfig` 退化为薄包装;`getDefaultMode`(无 patch 层、无 trim)与
|
|
79
|
+
`writeFullConfig`(保留未知键)语义不动。
|
|
80
|
+
- **HTTP 快照合并单求值(C3)**:一次 GET/POST 快照内 `resolvePriority` 双调 + 双读盘
|
|
81
|
+
(最坏 4 次 readFileSync)合并为读一次 configMode → 单次求值,`defaultMode ===
|
|
82
|
+
priority.effective` 由结构保证并以行为测试锁定。
|
|
83
|
+
- **技能禁用补文件优先收敛(C1)**:`PonytailState` 新增 `reloadDisabledSkills()`
|
|
84
|
+
(与等级侧 `syncFromFile` 同构,外部手改 config.json 后注入时收敛);「禁用 ponytail →
|
|
85
|
+
关闭等级」规则提为 `isMainSkillDisabled()` 纯函数,HTTP POST 两分支共用同一守卫。
|
|
86
|
+
|
|
87
|
+
### Removed
|
|
88
|
+
- **`src/ponytail-runtime.ts`(C6)**:46 行薄壳(`resolveStateDir` 只是 `getConfigDir`
|
|
89
|
+
的无谓转发)内联进 `ponytail-state.ts`,净减 1 文件 + 一层间接委托;测试 import 与
|
|
90
|
+
verify 产物清单同步;`.gitignore` 排除 `.local/`(桌面版调试备份不入库)。
|
|
91
|
+
- **ADR-0007**:记录命令层默认档并入 resolvePriority 真源(修订 ADR-0006 决策 1)、
|
|
92
|
+
读侧收敛、快照合并、flag 内联、C5 维持否决(宿主 collectCache 已兜底 list 侧)。
|
|
93
|
+
|
|
94
|
+
### Migration
|
|
95
|
+
- 命令层兜底切档语义变更:从「独立于 patch 层」变为「并入 patch 层」——这是修复而非回归
|
|
96
|
+
(分裂本身就是 bug);无数据丢失,无配置格式变化。
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
## [4.10.0-dsh.10] - 2026-10-04
|
|
100
|
+
|
|
101
|
+
### Added
|
|
102
|
+
- **客户端面板接入官方 `ctx.locale`(C6)**:新增 `@deepseek-ai/dsh-client-locale` 到 `dsh.client.inject`,面板全部文案经 `ctx.locale.register('ponytail', {zh, en})` + `bind` 双语提供(36 键成对,真源 `locale/*.json`),诊断链 label/problem 在客户端按 level 查字典覆盖(宿侧契约零改动),语言切换即时刷新;**技能说明保持中文不翻译**(用户边界)。`scripts/verify.mjs` 新增 locale 接入反向断言。
|
|
103
|
+
- **HTTP 配置端点剥离为独立深工厂(C1)**:新增 `src/ponytail-http.ts` 的 `createConfigHttpEndpoint(deps)`,GET/POST/405、请求体解析、快照组装、技能元数据读取全部内聚,依赖全注入不碰 `ctx`,行为测试新增 5 条端点单测(此前 0 覆盖)。
|
|
104
|
+
- **技能元数据单一真源(C2)**:宿侧 `readSkillMeta` 实时读取 `skills/*/SKILL.md` frontmatter 为唯一真源(读不到回退 `FALLBACK_SKILL_META`),客户端构建期提取内嵌;删除 `rawSkillsMeta` / `SKILL_META` 两处硬编码(6/6 技能文案原已漂移)。`verify.mjs` 反向断言锁死描述不回退到硬编码。
|
|
105
|
+
- **行为测试 44 → 59 项全绿**:新增 C1 端点 5 条、C2 技能元数据 4 条、C3 写盘 3 条、C4 一致性 3 条。
|
|
106
|
+
- **ADR-0006**:记录优先级与配置收敛、HTTP 剥离、元数据真源、客户端 locale 接入全部决策,含 C5 否决理由(官方 `skills/change` 是消费方通知缝,提供者反向 invalidate 会同步递归栈溢出)。
|
|
107
|
+
|
|
108
|
+
### Changed
|
|
109
|
+
- **优先级统一为 `resolvePriority` 唯一真源(C4)**:apply initialMode 与 GET/POST defaultMode 全部消费其 `effective`(此前三处并行实现)。**行为变更声明**:patch 显式值的大小写变体/非法值从「生效(注入垃圾态)」变为「忽略(落合法档)」。
|
|
110
|
+
- **配置写盘字段级 merge(C3)**:`writeFullConfig` 保留 `config.json` 中用户手写的未知字段(不再重建为两键对象),defaultMode 非法值拒绝写盘返回 null;`writeDefaultMode` 退化为其薄包装。
|
|
111
|
+
- **修复 `providerInstance` 死变量(C1)**:`skills.registerProvider` 工厂现捕获实例到 `providerInstance`,UI 变更后的 `invalidateSkills()` 从空操作恢复真实失效语义(此前 UI 改禁用技能后模型侧目录不刷新)。
|
|
112
|
+
|
|
113
|
+
### Removed
|
|
114
|
+
- **双孤儿函数**:`ponytail-config.ts` 的 `isDeactivationCommand`(`commands` 版唯一实现保留)与 `normalizeConfigMode`(全仓零调用方),以及失效类型 `VALID_MODES` / `ValidMode`。
|
|
115
|
+
- **HTTP 端点从 `apply()` 剥离**:`src/ponytail.ts` 410 行 → 约 330 行,回归纯生命周期编排。
|
|
116
|
+
|
|
117
|
+
### Migration
|
|
118
|
+
- 行为变更:曾有非法/大小写 patch 显式值的现有配置在升级后按新语义忽略(落合法档),属有意修复,非数据丢失。
|
|
10
119
|
|
|
11
120
|
## [4.10.0-dsh.9] - 2026-10-04
|
|
12
121
|
|
|
@@ -229,7 +338,8 @@
|
|
|
229
338
|
- 不注册 tool(不在 `ctx.tools` 注册任何占位),`scripts/verify.mjs` 校验
|
|
230
339
|
- 构建:`pnpm build` (`tsc -p tsconfig.build.json`),`pnpm typecheck`,`pnpm verify`
|
|
231
340
|
|
|
232
|
-
[Unreleased]: https://github.com/Wenaixi/dsh-ponytail/compare/
|
|
341
|
+
[Unreleased]: https://github.com/Wenaixi/dsh-ponytail/compare/v5.0.0...HEAD
|
|
342
|
+
[5.0.0]: https://github.com/Wenaixi/dsh-ponytail/releases/tag/v5.0.0
|
|
233
343
|
[4.10.0-dsh.2]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.1...v4.10.0-dsh.2
|
|
234
344
|
[4.10.0-dsh.1]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.0...v4.10.0-dsh.1
|
|
235
345
|
[4.10.0-dsh.0]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.9.0-dsh.5...v4.10.0-dsh.0
|
|
@@ -241,3 +351,10 @@
|
|
|
241
351
|
[4.9.0-dsh.0]: https://github.com/Wenaixi/dsh-ponytail/releases/tag/v4.9.0-dsh.0
|
|
242
352
|
|
|
243
353
|
[4.10.0-dsh.4]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.3...v4.10.0-dsh.4
|
|
354
|
+
[4.10.0-dsh.5]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.4...v4.10.0-dsh.5
|
|
355
|
+
[4.10.0-dsh.6]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.5...v4.10.0-dsh.6
|
|
356
|
+
[4.10.0-dsh.7]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.6...v4.10.0-dsh.7
|
|
357
|
+
[4.10.0-dsh.8]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.7...v4.10.0-dsh.8
|
|
358
|
+
[4.10.0-dsh.9]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.8...v4.10.0-dsh.9
|
|
359
|
+
[4.10.0-dsh.10]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.9...v4.10.0-dsh.10
|
|
360
|
+
[4.10.0-dsh.11]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.10...v4.10.0-dsh.11
|
package/README.md
CHANGED
|
@@ -22,7 +22,9 @@
|
|
|
22
22
|
|
|
23
23
|
---
|
|
24
24
|
|
|
25
|
-
> [DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail)
|
|
25
|
+
> 这是面向 DeepSeek Harness 的 Ponytail 适配插件:提供常驻懒人 senior 模式、七阶梯子、6 个中文原生技能和零 tool 注册。实现参考 [DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail),但本地版本、发布节奏和 DSH 兼容边界独立维护。
|
|
26
|
+
>
|
|
27
|
+
> **版本对照(2026-10-05 核验)**:本地发行版本为 `5.1.0`;上游参考版本为 `4.10.3`。上游参考版本不会自动决定本地版本号。
|
|
26
28
|
|
|
27
29
|
## 🚀 安装(默认装到 `web`)
|
|
28
30
|
|
|
@@ -54,7 +56,7 @@ dsh --profile web --dump-config | grep -A2 ponytail
|
|
|
54
56
|
|
|
55
57
|
- **梯子 7 阶**:YAGNI → 复用 → 标准库 → 平台原生 → 已有依赖 → 一行 → 最小实现,`off` 时静默
|
|
56
58
|
- **6 个中文 Skill**(`rank: 550`):`ponytail` / `ponytail-review` / `ponytail-audit` / `ponytail-debt` / `ponytail-gain` / `ponytail-help`
|
|
57
|
-
-
|
|
59
|
+
- **四种运行模式**:`off` / `lite` / `full`(默认)/ `ultra`
|
|
58
60
|
- **无 tool 注册**:全部能力经 `ctx.skills` 暴露
|
|
59
61
|
|
|
60
62
|
| 能力 | 说明 |
|
|
@@ -68,19 +70,19 @@ dsh --profile web --dump-config | grep -A2 ponytail
|
|
|
68
70
|
|
|
69
71
|
## 🪝 Hook 注入
|
|
70
72
|
|
|
71
|
-
> 上游 `hooks/` 的 6 个 Hook(config / instructions / runtime / activate / mode-tracker / subagent)已合并进单一 DSH
|
|
73
|
+
> 上游 `hooks/` 的 6 个 Hook(config / instructions / runtime / activate / mode-tracker / subagent)已合并进单一 DSH 插件(runtime 的 flag 存取并入 state),无需宿主配置。
|
|
72
74
|
|
|
73
75
|
| 上游 | DSH 侧 |
|
|
74
76
|
|---|---|
|
|
75
77
|
| `ponytail-config.js` | `src/ponytail-config.ts`(`env > 文件 > full`,`review` 不可默认) |
|
|
76
78
|
| `ponytail-instructions.js` | `src/ponytail-instructions.ts`(唯一出口 `renderPromptSection(skillDir, state)`:review 短路 + 按档裁剪 + 中文 fallback 全部内聚) |
|
|
77
|
-
| `ponytail-
|
|
79
|
+
| `ponytail-state.js` | `src/ponytail-state.ts`(`.ponytail-active` 物理存取内联于此——上游 runtime 的 flag 存取已并入 state,DSH 单一宿主无外部探针;技能禁用 reload 收敛同在此) |
|
|
78
80
|
| `ponytail-activate.js` | `src/ponytail.ts` 的 `agent/created`(startup/resume 对齐 flag) |
|
|
79
81
|
| `ponytail-mode-tracker.js` | `src/ponytail-commands.ts` 的 `createCommandDispatcher`(指令解析纯函数 + 状态机副作用) |
|
|
80
82
|
| `ponytail-subagent.js` | `src/ponytail.ts` 的 `agent/created`(`PONYTAIL_SUBAGENT_MATCHER`) |
|
|
81
83
|
|
|
82
84
|
```
|
|
83
|
-
启动: env PONYTAIL_DEFAULT_MODE → cordis defaultMode →
|
|
85
|
+
启动: env PONYTAIL_DEFAULT_MODE → cordis defaultMode → full
|
|
84
86
|
→ setMode(flag 文件) // 会话启动对齐语义,见下方说明
|
|
85
87
|
|
|
86
88
|
每轮请求前: agent/pre-step (waterfall, 必须 return next())
|
|
@@ -90,14 +92,14 @@ dsh --profile web --dump-config | grep -A2 ponytail
|
|
|
90
92
|
order 50 在 persona(0) 之后、工具(100) 之前;回调收敛为单行 text: () => renderPromptSection(skillDir, state)
|
|
91
93
|
off → 空,review → 指向技能,读盘失败 → 中文 fallback,assembly 前以 readMode() 对齐
|
|
92
94
|
|
|
93
|
-
持久化: /ponytail default <mode> → 写入 config.json
|
|
95
|
+
持久化: /ponytail default <mode> → 写入 profile 补丁或 profile 内 config.json
|
|
94
96
|
子智能体: PONYTAIL_SUBAGENT_MATCHER 正则(非法 warn 回退),共享同一 section
|
|
95
97
|
HMR: 全部走 ctx,热重载逆序自动清理
|
|
96
98
|
```
|
|
97
99
|
|
|
98
|
-
`systemPrompt` 而非 `agent.inject`:落入日志可重建,`order: 50` 优先级高,每次 `assemble` 动态求值,`off` 零成本。flag(`.ponytail-active
|
|
100
|
+
`systemPrompt` 而非 `agent.inject`:落入日志可重建,`order: 50` 优先级高,每次 `assemble` 动态求值,`off` 零成本。flag(`.ponytail-active`)与配置同源持久化在当前 profile 内(`profiles/<name>/ponytail/`),`/ponytail` 切换在 DSH 内闭环。作用域随 profile 隔离,同机多实例互不干扰。
|
|
99
101
|
|
|
100
|
-
**会话启动对齐**:每次会话启动都会按默认档(env > patch >
|
|
102
|
+
**会话启动对齐**:每次会话启动都会按默认档(env > patch > full)重写 flag,这是对齐上游 SessionStart 语义。因此 `/ponytail <档>` **只在本会话生效**;要让某个等级跨会话持久化,必须用 `/ponytail default <档>` 写进配置文件。
|
|
101
103
|
|
|
102
104
|
## ⚙️ 配置
|
|
103
105
|
|
|
@@ -110,15 +112,24 @@ HMR: 全部走 ctx,热重载逆序自动清理
|
|
|
110
112
|
defaultMode: full # off|lite|full|ultra
|
|
111
113
|
```
|
|
112
114
|
|
|
113
|
-
|
|
115
|
+
优先级(三级,取第一个有效值):`PONYTAIL_DEFAULT_MODE` env > `cordis.defaultMode` > 内置兜底 `full`。持久化:`/ponytail default <mode>` 写入 profile 补丁,`review` 不可作默认。
|
|
114
116
|
|
|
115
|
-
**注意**:`Config.defaultMode` 的 Schema 刻意不带默认值。Cordis 校验会把缺省 fill
|
|
117
|
+
**注意**:`Config.defaultMode` 的 Schema 刻意不带默认值。Cordis 校验会把缺省 fill 成显式配置——补丁里显式写 `full` 与什么都不写会读出同一个值,诊断面板就无法区分"用户配过"与"没配过",界面因此说谎。
|
|
116
118
|
|
|
117
119
|
### 界面配置
|
|
118
120
|
|
|
119
|
-
插件在已安装插件卡片详情内嵌配置面板(`plugins.bundle.config` 插槽),支持四档运行等级、6
|
|
121
|
+
插件在已安装插件卡片详情内嵌配置面板(`plugins.bundle.config` 插槽),支持四档运行等级、6 个技能的独立开关、一键恢复默认,并给出**三级优先级诊断链**——逐行显示环境变量、Profile 补丁、内置兜底各自的值与生效状态,被更高优先级压制的那一级会显式标为"被覆盖"。只有环境变量命中时等级选择器才禁用(env 压过一切,此时改补丁确实无效);兜底命中属于"补丁与 env 都没写",不是更高优先级的配置,必须放行。
|
|
120
122
|
|
|
121
|
-
|
|
123
|
+
面板不使用自制 HTTP 端点,读写分两条官方通道:
|
|
124
|
+
|
|
125
|
+
| 通道 | 内容 | 落点 |
|
|
126
|
+
| --- | --- | --- |
|
|
127
|
+
| `ctx.configForms.get('ponytail')` | 默认档、技能启用列表(写入自带 revision 冲突检测) | Profile 补丁 `profiles/<name>/cordis.patch.yml` |
|
|
128
|
+
| `ctx.remote.ponytail.snapshot()` | 当前生效等级、三级优先级诊断链(只读) | 不落盘,按需拉取 |
|
|
129
|
+
|
|
130
|
+
在无 Profile 上下文的组合(headless / CLI)里,宿主没有装配 Settings 服务,此时配置读写回退到 profile 内的 `ponytail/config.json`。从旧版本升级时,全局共享的 `$DSH_HOME/ponytail/config.json` 会在首次启动时一次性导入 Profile 补丁,随后旧文件被改名为 `config.json.imported`;导入失败不影响启动,可用 `/ponytail default <档>` 重新设置。
|
|
131
|
+
|
|
132
|
+
旧的平台位置(`%APPDATA%` / `XDG_CONFIG_HOME` / `~/.config`)兼容读取已随 1A 下沉一并删除;`scripts/verify.mjs` 现在对 `src/` 下任何平台路径字面量直接判失败。
|
|
122
133
|
|
|
123
134
|
## 🎮 使用
|
|
124
135
|
|
|
@@ -133,16 +144,17 @@ HMR: 全部走 ctx,热重载逆序自动清理
|
|
|
133
144
|
# 四道门禁,改完必须全绿
|
|
134
145
|
pnpm typecheck # tsc --noEmit
|
|
135
146
|
pnpm build # tsc 出 lib/,再由 build-client.mjs 生成 lib/client.js
|
|
136
|
-
node scripts/verify.mjs #
|
|
137
|
-
node scripts/behavior.test.mjs # 行为单测(
|
|
147
|
+
node scripts/verify.mjs # 静态门禁:38 条断言(含 client.js Node API 残留反向断言)(产物/技能/零 tool/落点/元数据真源/locale)
|
|
148
|
+
node scripts/behavior.test.mjs # 行为单测(64 项)
|
|
138
149
|
|
|
139
150
|
# 0 侵入联调
|
|
140
|
-
dsh --profile web --patch ./cordis.patch.yml --dump-config
|
|
151
|
+
dsh --profile web --patch ./cordis.patch.yml --dump-config # 仅验证补丁解析,不替代真实启动验收
|
|
141
152
|
pnpm dsh web --patch ./cordis.patch.yml # 热重载
|
|
142
153
|
```
|
|
143
154
|
|
|
144
|
-
-
|
|
145
|
-
-
|
|
155
|
+
- **版本策略**:本地发行版本使用独立的标准 SemVer,例如当前 `5.1.0`;使用 `pnpm version:bump` 递增 patch,或 `pnpm version:set -- 5.1.1` 设置明确版本。旧的 `-dsh.N` 仅属于历史版本策略,不再生成。
|
|
156
|
+
- **上游参考**:README 记录上游参考版本和核验日期,但上游发布不会自动改变本地版本;是否升级参考实现由本地兼容性评估决定。
|
|
157
|
+
- **发布铁律**:严禁本地 `npm publish` 和未经授权的 `git push`。本地完成门禁后,由授权的 CI tag 流程发布 npm 与 GitHub Release。
|
|
146
158
|
- **客户端产物单一来源**:`lib/client.js` 只由 `scripts/build-client.mjs` 生成。`tsconfig.build.json` 不得把它列入编译输入,否则会出现同名双产物并静默漂移。
|
|
147
159
|
|
|
148
160
|
---
|