@wenaixi/dsh-ponytail 4.10.0-dsh.9 → 5.0.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 +95 -3
- package/README.md +13 -10
- package/lib/client.js +62 -39
- 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 +6 -5
- package/lib/ponytail-config.d.ts.map +1 -1
- package/lib/ponytail-config.js +51 -57
- package/lib/ponytail-config.js.map +1 -1
- package/lib/ponytail-http.d.ts +45 -0
- package/lib/ponytail-http.d.ts.map +1 -0
- package/lib/ponytail-http.js +162 -0
- package/lib/ponytail-http.js.map +1 -0
- package/lib/ponytail-instructions.d.ts +1 -1
- package/lib/ponytail-instructions.js +1 -1
- package/lib/ponytail-state.d.ts +14 -3
- package/lib/ponytail-state.d.ts.map +1 -1
- package/lib/ponytail-state.js +42 -4
- package/lib/ponytail-state.js.map +1 -1
- package/lib/ponytail.d.ts +2 -2
- package/lib/ponytail.d.ts.map +1 -1
- package/lib/ponytail.js +69 -152
- package/lib/ponytail.js.map +1 -1
- package/locale/en.json +36 -4
- package/locale/zh.json +36 -4
- package/package.json +5 -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,13 +1,97 @@
|
|
|
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.0.0`。上游参考:`DietrichGebert/ponytail 4.10.3`(2026-10-04 核验)。历史 `-dsh.N` 记录仅用于追溯,不再作为现行版本规则。
|
|
6
|
+
|
|
7
|
+
## [5.0.0] - 2026-10-04
|
|
8
|
+
|
|
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.`,避免浏览器导入失败。
|
|
6
17
|
|
|
7
18
|
## [Unreleased]
|
|
8
19
|
|
|
9
20
|
(本段暂无待发布内容)
|
|
10
21
|
|
|
22
|
+
## [4.10.0-dsh.12] - 2026-10-04
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
- 修复默认档持久化后 HTTP 诊断仍读取旧 patch/env 快照的问题:配置端点改用实时 getter,GET 与 POST 共享当前优先级事实。
|
|
26
|
+
- 修复 systemPrompt 生产接线绕过 `renderPromptSection` 的问题,保留技能禁用配置热收敛。
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
- 新增两项生产接线回归测试,覆盖动态 HTTP handler 与外部 flag 变化;行为测试达到 64 项。
|
|
30
|
+
- 延后统一多个 SKILL.md frontmatter 解析器:provider、HTTP 与构建脚本的输入接受范围和 fallback 语义不同,暂不引入共享 seam。
|
|
31
|
+
|
|
32
|
+
### Migration
|
|
33
|
+
- 无配置格式迁移;现有配置继续有效。
|
|
34
|
+
|
|
35
|
+
## [4.10.0-dsh.11] - 2026-10-04
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
- **客户端产物内嵌宿侧死代码 `import.meta`(C4 回归)**:`build-client.mjs` 模板残留一行
|
|
39
|
+
`const skillRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'skills')`
|
|
40
|
+
(4.10.0-dsh.10 引入),产物 `lib/client.js` 里零引用却携带 `import.meta`——宿主把 bundle
|
|
41
|
+
原样拼接进 `<script src>` 加载,浏览器解析即 SyntaxError,整个客户端 bundle 加载失败
|
|
42
|
+
(配置面板静默消失)。删除死行;`verify.mjs` 新增反向断言:`lib/client.js` 不得含
|
|
43
|
+
`import.meta` / `process.`(先破坏实测再还原)。
|
|
44
|
+
- **默认档命令层分裂(真 bug)**:apply 启动判定与 UI 面板走 `resolvePriority`(含 patch 层),
|
|
45
|
+
而命令调度器未注入 `getDefaultMode` 时落到 `getDefaultMode()`(无 patch 层)。当
|
|
46
|
+
cordis.patch.yml 显式声明 `defaultMode` 且 config.json 缺失/不同时,`/ponytail foobar`
|
|
47
|
+
(上游 else 兜底切默认档)把等级从 patch 档切到 config 档,裸 `/ponytail` 报告档也错误。
|
|
48
|
+
修复:dispatcher 注入实时 `resolvePriority` 闭包(同 apply/UI 同源同刻),
|
|
49
|
+
三条消费路径统一真源。
|
|
50
|
+
|
|
51
|
+
### Changed
|
|
52
|
+
- **config.json 读侧收敛单一解析出口(C2)**:新增私有 `parseConfigObject(raw)` 归一解析
|
|
53
|
+
唯一真源,`readFullConfig` 退化为薄包装;`getDefaultMode`(无 patch 层、无 trim)与
|
|
54
|
+
`writeFullConfig`(保留未知键)语义不动。
|
|
55
|
+
- **HTTP 快照合并单求值(C3)**:一次 GET/POST 快照内 `resolvePriority` 双调 + 双读盘
|
|
56
|
+
(最坏 4 次 readFileSync)合并为读一次 configMode → 单次求值,`defaultMode ===
|
|
57
|
+
priority.effective` 由结构保证并以行为测试锁定。
|
|
58
|
+
- **技能禁用补文件优先收敛(C1)**:`PonytailState` 新增 `reloadDisabledSkills()`
|
|
59
|
+
(与等级侧 `syncFromFile` 同构,外部手改 config.json 后注入时收敛);「禁用 ponytail →
|
|
60
|
+
关闭等级」规则提为 `isMainSkillDisabled()` 纯函数,HTTP POST 两分支共用同一守卫。
|
|
61
|
+
|
|
62
|
+
### Removed
|
|
63
|
+
- **`src/ponytail-runtime.ts`(C6)**:46 行薄壳(`resolveStateDir` 只是 `getConfigDir`
|
|
64
|
+
的无谓转发)内联进 `ponytail-state.ts`,净减 1 文件 + 一层间接委托;测试 import 与
|
|
65
|
+
verify 产物清单同步;`.gitignore` 排除 `.local/`(桌面版调试备份不入库)。
|
|
66
|
+
- **ADR-0007**:记录命令层默认档并入 resolvePriority 真源(修订 ADR-0006 决策 1)、
|
|
67
|
+
读侧收敛、快照合并、flag 内联、C5 维持否决(宿主 collectCache 已兜底 list 侧)。
|
|
68
|
+
|
|
69
|
+
### Migration
|
|
70
|
+
- 命令层兜底切档语义变更:从「独立于 patch 层」变为「并入 patch 层」——这是修复而非回归
|
|
71
|
+
(分裂本身就是 bug);无数据丢失,无配置格式变化。
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
## [4.10.0-dsh.10] - 2026-10-04
|
|
75
|
+
|
|
76
|
+
### Added
|
|
77
|
+
- **客户端面板接入官方 `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 接入反向断言。
|
|
78
|
+
- **HTTP 配置端点剥离为独立深工厂(C1)**:新增 `src/ponytail-http.ts` 的 `createConfigHttpEndpoint(deps)`,GET/POST/405、请求体解析、快照组装、技能元数据读取全部内聚,依赖全注入不碰 `ctx`,行为测试新增 5 条端点单测(此前 0 覆盖)。
|
|
79
|
+
- **技能元数据单一真源(C2)**:宿侧 `readSkillMeta` 实时读取 `skills/*/SKILL.md` frontmatter 为唯一真源(读不到回退 `FALLBACK_SKILL_META`),客户端构建期提取内嵌;删除 `rawSkillsMeta` / `SKILL_META` 两处硬编码(6/6 技能文案原已漂移)。`verify.mjs` 反向断言锁死描述不回退到硬编码。
|
|
80
|
+
- **行为测试 44 → 59 项全绿**:新增 C1 端点 5 条、C2 技能元数据 4 条、C3 写盘 3 条、C4 一致性 3 条。
|
|
81
|
+
- **ADR-0006**:记录优先级与配置收敛、HTTP 剥离、元数据真源、客户端 locale 接入全部决策,含 C5 否决理由(官方 `skills/change` 是消费方通知缝,提供者反向 invalidate 会同步递归栈溢出)。
|
|
82
|
+
|
|
83
|
+
### Changed
|
|
84
|
+
- **优先级统一为 `resolvePriority` 唯一真源(C4)**:apply initialMode 与 GET/POST defaultMode 全部消费其 `effective`(此前三处并行实现)。**行为变更声明**:patch 显式值的大小写变体/非法值从「生效(注入垃圾态)」变为「忽略(落合法档)」。
|
|
85
|
+
- **配置写盘字段级 merge(C3)**:`writeFullConfig` 保留 `config.json` 中用户手写的未知字段(不再重建为两键对象),defaultMode 非法值拒绝写盘返回 null;`writeDefaultMode` 退化为其薄包装。
|
|
86
|
+
- **修复 `providerInstance` 死变量(C1)**:`skills.registerProvider` 工厂现捕获实例到 `providerInstance`,UI 变更后的 `invalidateSkills()` 从空操作恢复真实失效语义(此前 UI 改禁用技能后模型侧目录不刷新)。
|
|
87
|
+
|
|
88
|
+
### Removed
|
|
89
|
+
- **双孤儿函数**:`ponytail-config.ts` 的 `isDeactivationCommand`(`commands` 版唯一实现保留)与 `normalizeConfigMode`(全仓零调用方),以及失效类型 `VALID_MODES` / `ValidMode`。
|
|
90
|
+
- **HTTP 端点从 `apply()` 剥离**:`src/ponytail.ts` 410 行 → 约 330 行,回归纯生命周期编排。
|
|
91
|
+
|
|
92
|
+
### Migration
|
|
93
|
+
- 行为变更:曾有非法/大小写 patch 显式值的现有配置在升级后按新语义忽略(落合法档),属有意修复,非数据丢失。
|
|
94
|
+
|
|
11
95
|
## [4.10.0-dsh.9] - 2026-10-04
|
|
12
96
|
|
|
13
97
|
### Removed
|
|
@@ -229,7 +313,8 @@
|
|
|
229
313
|
- 不注册 tool(不在 `ctx.tools` 注册任何占位),`scripts/verify.mjs` 校验
|
|
230
314
|
- 构建:`pnpm build` (`tsc -p tsconfig.build.json`),`pnpm typecheck`,`pnpm verify`
|
|
231
315
|
|
|
232
|
-
[Unreleased]: https://github.com/Wenaixi/dsh-ponytail/compare/
|
|
316
|
+
[Unreleased]: https://github.com/Wenaixi/dsh-ponytail/compare/v5.0.0...HEAD
|
|
317
|
+
[5.0.0]: https://github.com/Wenaixi/dsh-ponytail/releases/tag/v5.0.0
|
|
233
318
|
[4.10.0-dsh.2]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.1...v4.10.0-dsh.2
|
|
234
319
|
[4.10.0-dsh.1]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.0...v4.10.0-dsh.1
|
|
235
320
|
[4.10.0-dsh.0]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.9.0-dsh.5...v4.10.0-dsh.0
|
|
@@ -241,3 +326,10 @@
|
|
|
241
326
|
[4.9.0-dsh.0]: https://github.com/Wenaixi/dsh-ponytail/releases/tag/v4.9.0-dsh.0
|
|
242
327
|
|
|
243
328
|
[4.10.0-dsh.4]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.3...v4.10.0-dsh.4
|
|
329
|
+
[4.10.0-dsh.5]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.4...v4.10.0-dsh.5
|
|
330
|
+
[4.10.0-dsh.6]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.5...v4.10.0-dsh.6
|
|
331
|
+
[4.10.0-dsh.7]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.6...v4.10.0-dsh.7
|
|
332
|
+
[4.10.0-dsh.8]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.7...v4.10.0-dsh.8
|
|
333
|
+
[4.10.0-dsh.9]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.8...v4.10.0-dsh.9
|
|
334
|
+
[4.10.0-dsh.10]: https://github.com/Wenaixi/dsh-ponytail/compare/v4.10.0-dsh.9...v4.10.0-dsh.10
|
|
335
|
+
[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-04 核验)**:本地发行版本为 `5.0.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,13 +70,13 @@ 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`) |
|
|
@@ -118,7 +120,7 @@ HMR: 全部走 ctx,热重载逆序自动清理
|
|
|
118
120
|
|
|
119
121
|
插件在已安装插件卡片详情内嵌配置面板(`plugins.bundle.config` 插槽),支持四档运行等级、6 个技能的独立开关、一键恢复默认,并给出**四级优先级诊断链**——逐行显示环境变量、Profile 补丁、配置文件、内置兜底各自的值与生效状态,被更高优先级压制的那一级会显式标为"被覆盖",等级选择器同时禁用。面板读写均经 `/api/plugins/ponytail/config`,落盘位置同样是 `$DSH_HOME/ponytail/config.json`。
|
|
120
122
|
|
|
121
|
-
|
|
123
|
+
若从旧位置升级,首次读取会兼容旧配置,但新写入一律落到 DSH 数据根;旧目录不删不改。
|
|
122
124
|
|
|
123
125
|
## 🎮 使用
|
|
124
126
|
|
|
@@ -133,16 +135,17 @@ HMR: 全部走 ctx,热重载逆序自动清理
|
|
|
133
135
|
# 四道门禁,改完必须全绿
|
|
134
136
|
pnpm typecheck # tsc --noEmit
|
|
135
137
|
pnpm build # tsc 出 lib/,再由 build-client.mjs 生成 lib/client.js
|
|
136
|
-
node scripts/verify.mjs #
|
|
137
|
-
node scripts/behavior.test.mjs # 行为单测(
|
|
138
|
+
node scripts/verify.mjs # 静态门禁:38 条断言(含 client.js Node API 残留反向断言)(产物/技能/零 tool/落点/元数据真源/locale)
|
|
139
|
+
node scripts/behavior.test.mjs # 行为单测(64 项)
|
|
138
140
|
|
|
139
141
|
# 0 侵入联调
|
|
140
|
-
dsh --profile web --patch ./cordis.patch.yml --dump-config
|
|
142
|
+
dsh --profile web --patch ./cordis.patch.yml --dump-config # 仅验证补丁解析,不替代真实启动验收
|
|
141
143
|
pnpm dsh web --patch ./cordis.patch.yml # 热重载
|
|
142
144
|
```
|
|
143
145
|
|
|
144
|
-
-
|
|
145
|
-
-
|
|
146
|
+
- **版本策略**:本地发行版本使用独立的标准 SemVer,例如当前 `5.0.0`;使用 `pnpm version:bump` 递增 patch,或 `pnpm version:set -- 5.1.0` 设置明确版本。旧的 `-dsh.N` 仅属于历史版本策略,不再生成。
|
|
147
|
+
- **上游参考**:README 记录上游参考版本和核验日期,但上游发布不会自动改变本地版本;是否升级参考实现由本地兼容性评估决定。
|
|
148
|
+
- **发布铁律**:严禁本地 `npm publish` 和未经授权的 `git push`。本地完成门禁后,由授权的 CI tag 流程发布 npm 与 GitHub Release。
|
|
146
149
|
- **客户端产物单一来源**:`lib/client.js` 只由 `scripts/build-client.mjs` 生成。`tsconfig.build.json` 不得把它列入编译输入,否则会出现同名双产物并静默漂移。
|
|
147
150
|
|
|
148
151
|
---
|
package/lib/client.js
CHANGED
|
@@ -9,6 +9,21 @@ window.__ModuleLoader__.load({
|
|
|
9
9
|
let P = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
10
10
|
let e = React.createElement;
|
|
11
11
|
|
|
12
|
+
// 官方 locale 接入:注册 ponytail 命名空间双语字典(真源 locale/*.json,构建期内嵌)
|
|
13
|
+
// 技能描述不翻译(用户边界):由 server/frontmatter 下发,字典不含技能描述键
|
|
14
|
+
var NS = "ponytail";
|
|
15
|
+
var ZH = {"meta.title":"懒人模式(ponytail)","meta.description":"DietrichGebert/ponytail 的 DSH 完整移植:常驻懒人 senior 模式与七阶梯子(YAGNI 到最小实现),6 个中文原生技能(本体、评审、审计、债务、收益、帮助),零 tool 注册。","panel.title":"懒人模式配置","mode.title":"运行强度等级","mode.hint":"控制梯子提示词的注入强度,改动即时生效并写入配置文件,对所有会话生效。","mode.lockedHint":"当前有更高优先级的配置在生效,此处的修改不会改变实际运行等级。","mode.off":"关闭","mode.lite":"轻量","mode.full":"标准","mode.ultra":"激进","skills.title":"原生技能开关","skills.hint":"关闭后该技能不会出现在斜杠菜单,也不会被模型加载。","skills.toggleOn":"启用 {name}","skills.enabledToast":"技能 {name} 已启用","skills.hiddenToast":"技能 {name} 已隐藏","chain.hit":"生效中","chain.shadowed":"被覆盖","chain.unset":"未设置","chain.valueUnset":"(未设置)","priority.title":"配置优先级","priority.unavailable":"诊断信息不可用,请确认宿主版本已包含优先级诊断接口。","priority.intro":"运行等级按下列顺序取第一个有效值;被更高优先级压制的项,在界面上修改不会生效。当前生效:","state.loading":"读取中…","state.saved":"配置保存在 DSH 数据目录的 ponytail/config.json","error.operation":"操作失败:","confirm.reset":"确定恢复默认配置吗?等级回到标准(full),并重新启用全部 6 个技能。","button.reset":"恢复默认配置","toast.modeChanged":"运行等级已切为「{name}」","toast.resetDone":"已恢复默认配置","level.env":"环境变量","level.patch":"Profile 补丁","level.config":"用户配置文件","level.fallback":"内置兜底","problem.env":"值无效,已忽略","problem.patch":"值无效,已忽略","problem.config":"文件损坏或字段缺失"};
|
|
16
|
+
var EN = {"meta.title":"Ponytail (lazy senior mode)","meta.description":"A full DSH port of DietrichGebert/ponytail: the always-on lazy senior developer mode and its seven-rung ladder (YAGNI down to the minimum implementation), with six native Chinese skills (core, review, audit, debt, gain, help) and zero tool registrations.","panel.title":"Ponytail Config","mode.title":"Intensity Level","mode.hint":"Controls how strongly the ladder prompt is injected. Changes apply immediately and are written to the config file for all sessions.","mode.lockedHint":"A higher-priority configuration is in effect; changes here will not affect the actual runtime level.","mode.off":"Off","mode.lite":"Lite","mode.full":"Standard","mode.ultra":"Ultra","skills.title":"Native Skills","skills.hint":"Disabled skills disappear from the slash menu and are not loaded by the model.","skills.toggleOn":"Enable {name}","skills.enabledToast":"Skill {name} enabled","skills.hiddenToast":"Skill {name} hidden","chain.hit":"In effect","chain.shadowed":"Shadowed","chain.unset":"Unset","chain.valueUnset":"(unset)","priority.title":"Config Priority","priority.unavailable":"Diagnostics unavailable. Please confirm the host version ships the priority diagnostics endpoint.","priority.intro":"The runtime level takes the first valid value in the following order; items shadowed by a higher-priority source cannot be changed from the UI. Current: ","state.loading":"Loading…","state.saved":"Config is stored in ponytail/config.json under the DSH data directory","error.operation":"Operation failed: ","confirm.reset":"Restore default config? Level returns to Standard (full) and all 6 skills are re-enabled.","button.reset":"Restore defaults","toast.modeChanged":"Level switched to {name}","toast.resetDone":"Defaults restored","level.env":"Environment variable","level.patch":"Profile patch","level.config":"User config file","level.fallback":"Built-in fallback","problem.env":"Invalid value, ignored","problem.patch":"Invalid value, ignored","problem.config":"File corrupted or field missing"};
|
|
17
|
+
// t 在 apply 时经 ctx.locale.bind 赋值;组件读取 factory 级变量(不接收 ctx,铁律)
|
|
18
|
+
var localeCtx = null;
|
|
19
|
+
var t = function (key, params) {
|
|
20
|
+
var s = ZH[key];
|
|
21
|
+
if (typeof s === "string" && params) {
|
|
22
|
+
return s.replace(/{([^}]+)}/g, function (_, n) { return params[n] != null ? String(params[n]) : ""; });
|
|
23
|
+
}
|
|
24
|
+
return typeof s === "string" ? s : key;
|
|
25
|
+
};
|
|
26
|
+
|
|
12
27
|
// 只做布局,不定义视觉:颜色与形状一律交给 DSH 官方组件与 CSS 变量
|
|
13
28
|
const L = {
|
|
14
29
|
section: {
|
|
@@ -83,6 +98,9 @@ window.__ModuleLoader__.load({
|
|
|
83
98
|
fontSize: "12px",
|
|
84
99
|
color: "var(--dsw-alias-label-tertiary)",
|
|
85
100
|
lineHeight: 1.4,
|
|
101
|
+
overflow: "hidden",
|
|
102
|
+
textOverflow: "ellipsis",
|
|
103
|
+
whiteSpace: "nowrap",
|
|
86
104
|
},
|
|
87
105
|
footer: {
|
|
88
106
|
display: "flex",
|
|
@@ -93,20 +111,15 @@ window.__ModuleLoader__.load({
|
|
|
93
111
|
};
|
|
94
112
|
|
|
95
113
|
const MODE_OPTIONS = [
|
|
96
|
-
{ value: "off", label: "
|
|
97
|
-
{ value: "lite", label: "
|
|
98
|
-
{ value: "full", label: "
|
|
99
|
-
{ value: "ultra", label: "
|
|
114
|
+
{ value: "off", label: t("mode.off") },
|
|
115
|
+
{ value: "lite", label: t("mode.lite") },
|
|
116
|
+
{ value: "full", label: t("mode.full") },
|
|
117
|
+
{ value: "ultra", label: t("mode.ultra") },
|
|
100
118
|
];
|
|
101
119
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
{ id: "ponytail-audit", description: "全仓审计:按可删行数降序猎取臃肿" },
|
|
106
|
-
{ id: "ponytail-debt", description: "收割 ponytail: 注释,建立延期债务台账" },
|
|
107
|
-
{ id: "ponytail-gain", description: "收益看板:展示 benchmark 中位数" },
|
|
108
|
-
{ id: "ponytail-help", description: "速查卡:模式、技能与命令一览" },
|
|
109
|
-
];
|
|
120
|
+
|
|
121
|
+
// 技能元数据从 SKILL.md frontmatter 构建期提取(唯一真源,与宿侧 readSkillMeta 同源)
|
|
122
|
+
const SKILL_META = [{"id":"ponytail","description":"强制使用最懒但可用的解法,追求最简、最短、最精。像一位见过一切的老手:先质疑需求是否该存在(YAGNI),优先复用标准库、平台原生能力,一行能解决就不用五十行。支持 lite/full(默认)/ultra 三档强度。适用于任何编码任务:编写、新增、重构、修复、评审、设计代码,以及选型依赖。触发词:ponytail / 偷懒 / 懒人模式 / 最简解法 / 最小解法 / yagni / 少做一点 / 最短路径 / 讨厌过度设计、臃肿、样板代码、没必要的依赖时也请使用。非编码请求(常识、文案、翻译、总结、菜谱)请勿使用。\n"},{"id":"ponytail-audit","description":"全仓过度设计审计,类似 ponytail-review,但扫描的是整个代码库而非 diff:按可删行数排序,列出能删、能简化、能用标准库/原生替代的地方。触发词:审计代码库 / 审计过度设计 / 这个仓库能删什么 / 找臃肿 / ponytail-audit / /ponytail-audit。一次性报告,不直接改代码。\n"},{"id":"ponytail-debt","description":"把代码库中所有 `ponytail:` 注释收割为债务台账,让 ponytail 有意留下的捷径和延期不会悄悄烂成「以后再说就是永远不做」。触发词:ponytail debt / /ponytail-debt / ponytail 延期了什么 / 列出捷径 / ponytail 台账 / 标记了什么待做。一次性报告,不改代码。\n"},{"id":"ponytail-gain","description":"以精简看板展示 ponytail 的实测收益:更少代码、更低成本、更快速度,数据来自 benchmark 中位数。一次性展示,非持久模式,也非本仓实时统计。触发词:/ponytail-gain / ponytail gain / ponytail 能省多少 / 展示 ponytail 收益 / ponytail 看板。\n"},{"id":"ponytail-help","description":"ponytail 全量模式、技能与命令的速查卡,一次性展示,非持久模式。触发词:/ponytail-help / ponytail help / ponytail 有哪些命令 / 怎么用 ponytail。\n"},{"id":"ponytail-review","description":"专挑过度设计的代码评审,只找能删的东西:重复造的标准库、没必要的依赖、臆想的抽象、闲置的灵活性。每条发现一行写完:位置、该删什么、用什么替代。触发词:过度设计评审 / 能删什么 / 是否过度设计 / 简化评审 / ponytail-review / /ponytail-review。配合面向正确性的评审使用,本技能只猎复杂度。\n"}];
|
|
110
123
|
|
|
111
124
|
const EMPTY_CONFIG = {
|
|
112
125
|
currentMode: "full",
|
|
@@ -121,15 +134,15 @@ window.__ModuleLoader__.load({
|
|
|
121
134
|
// 诊断链一行的状态语义:生效 / 被覆盖 / 未设置 / 有问题
|
|
122
135
|
function chainRowState(source) {
|
|
123
136
|
if (source.problem) {
|
|
124
|
-
return { dot: "error", tone: "danger", text: source.
|
|
137
|
+
return { dot: "error", tone: "danger", text: t("problem." + source.level) };
|
|
125
138
|
}
|
|
126
139
|
if (source.hit) {
|
|
127
|
-
return { dot: "done", tone: "success", text: "
|
|
140
|
+
return { dot: "done", tone: "success", text: t("chain.hit") };
|
|
128
141
|
}
|
|
129
142
|
if (source.shadowed) {
|
|
130
|
-
return { dot: "warning", tone: "warning", text: "
|
|
143
|
+
return { dot: "warning", tone: "warning", text: t("chain.shadowed") };
|
|
131
144
|
}
|
|
132
|
-
return { dot: "idle", tone: "quiet", text: "
|
|
145
|
+
return { dot: "idle", tone: "quiet", text: t("chain.unset") };
|
|
133
146
|
}
|
|
134
147
|
|
|
135
148
|
function ChainRow(props) {
|
|
@@ -142,8 +155,8 @@ window.__ModuleLoader__.load({
|
|
|
142
155
|
e(
|
|
143
156
|
"div",
|
|
144
157
|
{ style: L.chainMain },
|
|
145
|
-
e("span", { style: L.chainName }, source.
|
|
146
|
-
e("span", { style: L.chainLoc }, source.location + " = " + (source.value === null ? "
|
|
158
|
+
e("span", { style: L.chainName }, t("level." + source.level)),
|
|
159
|
+
e("span", { style: L.chainLoc }, source.location + " = " + (source.value === null ? t("chain.valueUnset") : source.value))
|
|
147
160
|
),
|
|
148
161
|
e(P.Tag, { tone: visual.tone }, visual.text)
|
|
149
162
|
);
|
|
@@ -155,18 +168,18 @@ window.__ModuleLoader__.load({
|
|
|
155
168
|
return e(
|
|
156
169
|
"div",
|
|
157
170
|
{ style: L.section },
|
|
158
|
-
e("h4", { style: L.title }, "
|
|
159
|
-
e("p", { style: L.hint }, "
|
|
171
|
+
e("h4", { style: L.title }, t("priority.title")),
|
|
172
|
+
e("p", { style: L.hint }, t("priority.unavailable"))
|
|
160
173
|
);
|
|
161
174
|
}
|
|
162
175
|
return e(
|
|
163
176
|
"div",
|
|
164
177
|
{ style: L.section },
|
|
165
|
-
e("h4", { style: L.title }, "
|
|
178
|
+
e("h4", { style: L.title }, t("priority.title")),
|
|
166
179
|
e(
|
|
167
180
|
"p",
|
|
168
181
|
{ style: L.hint },
|
|
169
|
-
"
|
|
182
|
+
t("priority.intro"),
|
|
170
183
|
e("strong", { style: { color: "var(--dsw-alias-label-primary)" } }, report.effective)
|
|
171
184
|
),
|
|
172
185
|
e(
|
|
@@ -225,6 +238,9 @@ window.__ModuleLoader__.load({
|
|
|
225
238
|
|
|
226
239
|
React.useEffect(function () {
|
|
227
240
|
load();
|
|
241
|
+
// 语言切换后重取(官方 LocaleFace subscribe 语义:字典注册 bump revision)
|
|
242
|
+
var off = localeCtx ? localeCtx.subscribe(function () { load(); }) : null;
|
|
243
|
+
return function () { if (off) off(); };
|
|
228
244
|
}, [load]);
|
|
229
245
|
|
|
230
246
|
const post = function (body, message) {
|
|
@@ -259,35 +275,35 @@ window.__ModuleLoader__.load({
|
|
|
259
275
|
"div",
|
|
260
276
|
{ style: { display: "flex", flexDirection: "column", gap: "16px", maxWidth: "720px" } },
|
|
261
277
|
e("h3", { style: { fontSize: "15px", fontWeight: "600", margin: "0", color: "var(--dsw-alias-label-primary)" } },
|
|
262
|
-
"
|
|
278
|
+
t("panel.title")),
|
|
263
279
|
e(PrioritySection, { priority: config.priority }),
|
|
264
280
|
e(
|
|
265
281
|
"div",
|
|
266
282
|
{ style: L.section },
|
|
267
|
-
e("h4", { style: L.title }, "
|
|
283
|
+
e("h4", { style: L.title }, t("mode.title")),
|
|
268
284
|
e("p", { style: L.hint },
|
|
269
|
-
"
|
|
285
|
+
t("mode.hint")),
|
|
270
286
|
e(P.SegmentedControl, {
|
|
271
287
|
id: "ponytail-mode",
|
|
272
|
-
label: "
|
|
288
|
+
label: t("mode.title"),
|
|
273
289
|
value: config.defaultMode,
|
|
274
290
|
options: MODE_OPTIONS,
|
|
275
291
|
disabled: state.saving || levelLocked,
|
|
276
292
|
onChange: function (next) {
|
|
277
|
-
post({ mode: next }, "
|
|
293
|
+
post({ mode: next }, t("toast.modeChanged", { name: next }));
|
|
278
294
|
},
|
|
279
295
|
}),
|
|
280
296
|
levelLocked
|
|
281
297
|
? e("p", { style: Object.assign({}, L.hint, { color: "var(--dsw-alias-state-warn-primary)" }) },
|
|
282
|
-
"
|
|
298
|
+
t("mode.lockedHint"))
|
|
283
299
|
: null
|
|
284
300
|
),
|
|
285
301
|
e(
|
|
286
302
|
"div",
|
|
287
303
|
{ style: L.section },
|
|
288
|
-
e("h4", { style: L.title }, "
|
|
304
|
+
e("h4", { style: L.title }, t("skills.title")),
|
|
289
305
|
e("p", { style: L.hint },
|
|
290
|
-
"
|
|
306
|
+
t("skills.hint")),
|
|
291
307
|
e(
|
|
292
308
|
"div",
|
|
293
309
|
{ style: { display: "flex", flexDirection: "column", gap: "6px" } },
|
|
@@ -304,11 +320,11 @@ window.__ModuleLoader__.load({
|
|
|
304
320
|
e(P.Switch, {
|
|
305
321
|
checked: skill.enabled,
|
|
306
322
|
disabled: state.saving,
|
|
307
|
-
label: "
|
|
323
|
+
label: t("skills.toggleOn", { name: skill.name }),
|
|
308
324
|
onChange: function (next) {
|
|
309
325
|
post(
|
|
310
326
|
{ toggleSkill: { name: skill.id, enabled: next } },
|
|
311
|
-
|
|
327
|
+
t(next ? "skills.enabledToast" : "skills.hiddenToast", { name: skill.name })
|
|
312
328
|
);
|
|
313
329
|
},
|
|
314
330
|
})
|
|
@@ -321,26 +337,33 @@ window.__ModuleLoader__.load({
|
|
|
321
337
|
{ style: Object.assign({}, L.footer, L.last) },
|
|
322
338
|
e("span", { style: L.hint },
|
|
323
339
|
state.error
|
|
324
|
-
? "
|
|
340
|
+
? t("error.operation") + state.error
|
|
325
341
|
: state.toast
|
|
326
342
|
? state.toast
|
|
327
343
|
: state.loading
|
|
328
|
-
? "
|
|
329
|
-
: "
|
|
344
|
+
? t("state.loading")
|
|
345
|
+
: t("state.saved")),
|
|
330
346
|
e(P.Button, {
|
|
331
347
|
variant: "outline",
|
|
332
348
|
size: "sm",
|
|
333
349
|
disabled: state.saving,
|
|
334
350
|
onClick: function () {
|
|
335
|
-
if (!confirm("
|
|
336
|
-
post({ action: "reset" }, "
|
|
351
|
+
if (!confirm(t("confirm.reset"))) return;
|
|
352
|
+
post({ action: "reset" }, t("toast.resetDone"));
|
|
337
353
|
},
|
|
338
|
-
}, "
|
|
354
|
+
}, t("button.reset"))
|
|
339
355
|
)
|
|
340
356
|
);
|
|
341
357
|
}
|
|
342
358
|
|
|
343
359
|
function apply(ctx) {
|
|
360
|
+
// 官方 locale:注册 ponytail 命名空间双语字典并绑定 t(真源 locale/*.json 构建期内嵌)
|
|
361
|
+
ctx.effect(function () {
|
|
362
|
+
return ctx.locale.register(NS, { zh: ZH, en: EN });
|
|
363
|
+
}, "ponytail: dictionaries");
|
|
364
|
+
localeCtx = ctx.locale;
|
|
365
|
+
t = ctx.locale.bind(NS);
|
|
366
|
+
|
|
344
367
|
// 插件卡片详情页:内联配置面板(keyed by 包名,已核实宿主 listBundles 的 name 即包名)
|
|
345
368
|
ctx.slots.inject("plugins.bundle.config", function () {
|
|
346
369
|
return ctx.slots.register(
|
|
@@ -351,7 +374,7 @@ window.__ModuleLoader__.load({
|
|
|
351
374
|
}
|
|
352
375
|
|
|
353
376
|
exports.apply = apply;
|
|
354
|
-
exports.inject = ["slots"];
|
|
377
|
+
exports.inject = ["slots", "locale"];
|
|
355
378
|
return module.exports;
|
|
356
379
|
}
|
|
357
380
|
});
|
|
@@ -42,6 +42,8 @@ export interface CommandDispatcherEnv {
|
|
|
42
42
|
logger: CommandDispatcherLogger;
|
|
43
43
|
getDefaultMode?: () => RuntimeMode;
|
|
44
44
|
writeDefaultMode?: (mode: string) => RuntimeMode | null;
|
|
45
|
+
/** 写盘成功后同步外部默认档判定源(如 apply 的 patchMode),使命令层/UI 即时反映用户意图 */
|
|
46
|
+
updateDefaultMode?: (mode: RuntimeMode) => void;
|
|
45
47
|
}
|
|
46
48
|
export interface CommandDispatchResult {
|
|
47
49
|
handled: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-commands.d.ts","sourceRoot":"","sources":["../src/ponytail-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAA;AAE7B;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAA;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CACzC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAS/D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAOrD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,UAAU,EAAE,MAAM,WAAW,GAC5B,kBAAkB,CAiDpB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,aAAa,CAAA;IACpB,MAAM,EAAE,uBAAuB,CAAA;IAC/B,cAAc,CAAC,EAAE,MAAM,WAAW,CAAA;IAClC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"ponytail-commands.d.ts","sourceRoot":"","sources":["../src/ponytail-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAA;AAE7B;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAA;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CACzC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAS/D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAOrD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,UAAU,EAAE,MAAM,WAAW,GAC5B,kBAAkB,CAiDpB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,aAAa,CAAA;IACpB,MAAM,EAAE,uBAAuB,CAAA;IAC/B,cAAc,CAAC,EAAE,MAAM,WAAW,CAAA;IAClC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,CAAA;IACvD,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAA;CAChD;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,qBAAqB,CAAA;IACxD,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,qBAAqB,CAAA;IAC5D,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,qBAAqB,CAAA;CAC/D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,oBAAoB,GAAG,iBAAiB,CA4DpF"}
|
package/lib/ponytail-commands.js
CHANGED
|
@@ -105,6 +105,9 @@ export function createCommandDispatcher(env) {
|
|
|
105
105
|
if (targetMode === 'off' || targetMode === 'lite' || targetMode === 'full' || targetMode === 'ultra') {
|
|
106
106
|
const written = writeDef(targetMode);
|
|
107
107
|
env.logger.info(`[ponytail] 默认等级已持久化:${written}`);
|
|
108
|
+
// 用户最新意图即时生效:同步外部判定源(apply 的 patchMode),
|
|
109
|
+
// 否则 patch 层继续压住 config.json,写盘「成功」却「无效」(静默失效)
|
|
110
|
+
env.updateDefaultMode?.(targetMode);
|
|
108
111
|
env.state.set(targetMode);
|
|
109
112
|
}
|
|
110
113
|
return { handled: true, switched: true };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-commands.js","sourceRoot":"","sources":["../src/ponytail-commands.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,gBAAgB,GAEjB,MAAM,sBAAsB,CAAA;AAE7B;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;IAC7E,OAAO,CAAC,KAAK,eAAe,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,MAAM,CAAA;AAC5F,CAAC;AAcD;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAA;IAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,CAAC,EAAyB,EAAE,CAAC,OAAQ,CAAwB,EAAE,IAAI,KAAK,QAAQ,CAAC;aACzF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,IAAI,CAAC,CAAA;IACf,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAiB;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAA;IACvC,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAE,CAA2B,EAAE,OAAO,CAAC,CAAC;SACzE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAA;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,WAA0B,EAC1B,UAA6B;IAE7B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IAEhC,YAAY;IACZ,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;IAC5D,CAAC;IAED,uCAAuC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAA;IACpF,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;IAEtD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IAClC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAEjD,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IAC1D,CAAC;IAED,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;QACvD,CAAC;QACD,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;QACrD,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;YACxD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,KAAK;gBACf,cAAc,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aACrC,CAAA;QACH,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,0BAA0B;YAC1B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAG,WAAkC,IAAI,UAAU,EAAE;aAC1D,CAAA;QACH,CAAC;QACD,wCAAwC;QACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAA;IAC9D,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AAC5C,CAAC;
|
|
1
|
+
{"version":3,"file":"ponytail-commands.js","sourceRoot":"","sources":["../src/ponytail-commands.ts"],"names":[],"mappings":"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"}
|
package/lib/ponytail-config.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* ponytail-config — 移植自 hooks/ponytail-config.js
|
|
3
3
|
*
|
|
4
4
|
* 三级默认解析:环境变量 > 配置文件 > full
|
|
5
|
-
*
|
|
5
|
+
* 保留已核对的上游行为边界,并按 DSH 运行时契约适配:
|
|
6
6
|
* - review 不可作默认 (#377)
|
|
7
7
|
* - isDeactivationCommand 全句匹配
|
|
8
8
|
* - isShellSafe 仅白名单路径字符
|
|
@@ -15,13 +15,9 @@
|
|
|
15
15
|
* 不再使用 XDG / APPDATA 等宿主平台约定(旧位置仅作一次性兼容读取)。
|
|
16
16
|
*/
|
|
17
17
|
export declare const DEFAULT_MODE = "full";
|
|
18
|
-
export declare const VALID_MODES: readonly ["off", "lite", "full", "ultra", "review"];
|
|
19
18
|
export declare const RUNTIME_MODES: readonly ["off", "lite", "full", "ultra"];
|
|
20
19
|
export type RuntimeMode = (typeof RUNTIME_MODES)[number];
|
|
21
|
-
export type ValidMode = (typeof VALID_MODES)[number];
|
|
22
20
|
export declare function normalizeMode(mode: string): RuntimeMode | null;
|
|
23
|
-
export declare function normalizeConfigMode(mode: string): ValidMode | null;
|
|
24
|
-
export declare function isDeactivationCommand(text: string): boolean;
|
|
25
21
|
export declare function isShellSafe(p: string): boolean;
|
|
26
22
|
/** DSH 数据根环境变量(与 @deepseek-ai/dsh-home-paths 的 DSH_HOME_ENV 一致) */
|
|
27
23
|
export declare const DSH_HOME_ENV = "DSH_HOME";
|
|
@@ -63,6 +59,11 @@ export interface FullConfigData {
|
|
|
63
59
|
disabledSkills: string[];
|
|
64
60
|
}
|
|
65
61
|
export declare function readFullConfig(): FullConfigData;
|
|
62
|
+
/**
|
|
63
|
+
* 字段级 merge 写盘:保留 config.json 中用户手写的未知字段(不再重建为两键对象),
|
|
64
|
+
* defaultMode 经 normalizeMode 校验——非法值拒绝返回 null 不写盘(writeDefaultMode 语义统一)。
|
|
65
|
+
* 失败契约:写盘异常返回 null(与 resetFullConfig/writeDefaultMode 一致)。
|
|
66
|
+
*/
|
|
66
67
|
export declare function writeFullConfig(patch: Partial<FullConfigData>): FullConfigData | null;
|
|
67
68
|
export declare function resetFullConfig(): FullConfigData | null;
|
|
68
69
|
export declare function writeDefaultMode(mode: string): RuntimeMode | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ponytail-config.d.ts","sourceRoot":"","sources":["../src/ponytail-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,eAAO,MAAM,YAAY,SAAS,CAAA;AAClC,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"ponytail-config.d.ts","sourceRoot":"","sources":["../src/ponytail-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,eAAO,MAAM,YAAY,SAAS,CAAA;AAClC,eAAO,MAAM,aAAa,2CAA4C,CAAA;AAEtE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAI9D;AAID,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE9C;AAMD,mEAAmE;AACnE,eAAO,MAAM,YAAY,aAAa,CAAA;AAetC;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,CAKjH;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAQlD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAGnD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAWlD;AAED,wBAAgB,cAAc,IAAI,WAAW,CAiB5C;AAGD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,WAAW,CAAA;IACxB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AA0BD,wBAAgB,cAAc,IAAI,cAAc,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,GAAG,IAAI,CA8BrF;AAED,wBAAgB,eAAe,IAAI,cAAc,GAAG,IAAI,CAKvD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAMjE;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,gBAAgB;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sBAAsB;IACtB,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;CAChD"}
|