@wenaixi/dsh-ponytail 5.1.0 → 5.3.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/README.md CHANGED
@@ -5,165 +5,158 @@
5
5
  </p>
6
6
 
7
7
  <p align="center">
8
- <strong>懒惰的资深工程师 · 移植到 DeepSeek Harness</strong><br/>
8
+ 懒惰的资深工程师,移植到 DeepSeek Harness。<br/>
9
9
  <em>The best code is the code you never wrote.</em>
10
10
  </p>
11
11
 
12
12
  <p align="center">
13
13
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-111111?style=flat-square" alt="MIT"/></a>
14
14
  <a href="https://www.npmjs.com/package/@wenaixi/dsh-ponytail"><img src="https://img.shields.io/npm/v/@wenaixi/dsh-ponytail?color=111111&style=flat-square" alt="npm"/></a>
15
- <img src="https://img.shields.io/badge/DSH-333333?style=flat-square" alt="DSH"/>
16
- <img src="https://img.shields.io/badge/skills-6-008080?style=flat-square" alt="skills"/>
17
15
  </p>
18
16
 
19
17
  <p align="center">
20
- <a href="CHANGELOG.md">Changelog</a> · <a href="https://github.com/DietrichGebert/ponytail">上游</a> · <a href="https://www.npmjs.com/package/@wenaixi/dsh-ponytail">npm</a>
18
+ <a href="CHANGELOG.md">Changelog</a> ·
19
+ <a href="https://github.com/DietrichGebert/ponytail">上游</a> ·
20
+ <a href="https://www.npmjs.com/package/@wenaixi/dsh-ponytail">npm</a>
21
21
  </p>
22
22
 
23
- ---
23
+ 面向 DeepSeek Harness 的常驻插件:把七阶梯子注入系统提示词,提供 6 个中文技能,不注册任何 tool。实现参考 [DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail),本地版本与上游参考版本独立维护。
24
24
 
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`。上游参考版本不会自动决定本地版本号。
25
+ ## 安装
28
26
 
29
- ## 🚀 安装(默认装到 `web`)
30
-
31
- > `web` 即日常的 DSH Web UI(3080)。示例中的 `demo` 可换成任意 `--profile <name>`。
27
+ 装到任意 profile。示例里的 `web` 换成你的 `--profile <name>`。
32
28
 
33
29
  ```bash
34
- # 方式一:npm
35
30
  dsh plugin --profile web add @wenaixi/dsh-ponytail
36
-
37
- # 方式二:GitHub 直装(lib 已提交,无需构建)
38
- dsh plugin --profile web add github:Wenaixi/dsh-ponytail
39
-
40
- # 方式三:本地 / tarball
41
- pnpm install && pnpm build && dsh plugin --profile web add ./
42
- pnpm pack && dsh plugin --profile web add ./wenaixi-dsh-ponytail-*.tgz
43
-
44
- # 卸载
45
31
  dsh plugin --profile web remove @wenaixi/dsh-ponytail
46
-
47
- # 验证
48
32
  dsh --profile web --dump-config | grep -A2 ponytail
49
33
  ```
50
34
 
51
- > `WARN missing peer @deepseek-ai/...` 属正常,peer 由 DSH 运行时提供;`Packages: +2 Done` 即成功。
52
-
53
- > **首次安装后若插件卡片只有包名、没有标题描述图标**,说明包的 `exports` 没放行 `./package.json` 与 `./locale/*.json`。这是 DSH 读展示元信息时的硬约束,与安装本身无关。
35
+ `WARN missing peer @deepseek-ai/...` 是正常的,peer 由 DSH 运行时提供。看到 `Packages: +2 Done` 就是装好了。
54
36
 
55
- ## ✨ 特性
37
+ 若插件卡片只有包名、没有标题描述图标,说明包的 `exports` 没放行 `./package.json` 与 `./locale/*.json`。这是 DSH 读取展示元信息的硬约束,与安装本身无关。
56
38
 
57
- - **梯子 7 阶**:YAGNI → 复用 → 标准库 → 平台原生 → 已有依赖 → 一行 → 最小实现,`off` 时静默
58
- - **6 个中文 Skill**(`rank: 550`):`ponytail` / `ponytail-review` / `ponytail-audit` / `ponytail-debt` / `ponytail-gain` / `ponytail-help`
59
- - **四种运行模式**:`off` / `lite` / `full`(默认)/ `ultra`
60
- - **无 tool 注册**:全部能力经 `ctx.skills` 暴露
39
+ ### 安装后:把补丁条目写到顶层
61
40
 
62
- | 能力 | 说明 |
63
- |---|---|
64
- | `ponytail` | 7 阶梯子,触发词兼容中英文 |
65
- | `ponytail-review` | diff 评审,`delete/stdlib/native/yagni/shrink` |
66
- | `ponytail-audit` | 全仓审计,按可删收益排序 |
67
- | `ponytail-debt` | 收割 `ponytail:` 注释 |
68
- | `ponytail-gain` | 收益看板(benchmark 中位数) |
69
- | `ponytail-help` | 速查卡 |
41
+ `dsh plugin add` 只把插件装进 `package.json`,**不写** profile 的 `cordis.patch.yml`。插件包自带的补丁是 `insert:` 列表(bundle 惯例),会被宿主当作 overlay 层合进启动树——因此**热装后 boot 有条目、技能与命令可用,但配置卡片不会渲染**。
70
42
 
71
- ## 🪝 Hook 注入
43
+ 要让配置卡片出现(并让面板的写入真正落盘),手动在 profile 的 `cordis.patch.yml` 里补一条顶层条目:
72
44
 
73
- > 上游 `hooks/` 的 6 个 Hook(config / instructions / runtime / activate / mode-tracker / subagent)已合并进单一 DSH 插件(runtime 的 flag 存取并入 state),无需宿主配置。
45
+ ```yaml
46
+ - id: ponytail
47
+ name: "@wenaixi/dsh-ponytail"
48
+ ```
74
49
 
75
- | 上游 | DSH 侧 |
76
- |---|---|
77
- | `ponytail-config.js` | `src/ponytail-config.ts`(`env > 文件 > full`,`review` 不可默认) |
78
- | `ponytail-instructions.js` | `src/ponytail-instructions.ts`(唯一出口 `renderPromptSection(skillDir, state)`:review 短路 + 按档裁剪 + 中文 fallback 全部内聚) |
79
- | `ponytail-state.js` | `src/ponytail-state.ts`(`.ponytail-active` 物理存取内联于此——上游 runtime 的 flag 存取已并入 state,DSH 单一宿主无外部探针;技能禁用 reload 收敛同在此) |
80
- | `ponytail-activate.js` | `src/ponytail.ts` 的 `agent/created`(startup/resume 对齐 flag) |
81
- | `ponytail-mode-tracker.js` | `src/ponytail-commands.ts` 的 `createCommandDispatcher`(指令解析纯函数 + 状态机副作用) |
82
- | `ponytail-subagent.js` | `src/ponytail.ts` 的 `agent/created`(`PONYTAIL_SUBAGENT_MATCHER`) |
50
+ 然后重启宿主(补丁条目在启动时合成,运行中改不热生效)。卡片出现后如需默认档,再在 `config` 下补字段,或直接在面板里点。
83
51
 
84
- ```
85
- 启动: env PONYTAIL_DEFAULT_MODE → cordis defaultMode → full
86
- → setMode(flag 文件) // 会话启动对齐语义,见下方说明
52
+ **判据**:装完刷浏览器,插件列表里懒人模式卡片是「不包含任何组件」或干脆不出现、点不开配置面板——先查这里。`dsh --profile <name> --dump-config | grep -A2 ponytail` 若报 `patch: entry "ponytail" not found`,同样是这条顶层条目缺失的信号。
87
53
 
88
- 每轮请求前: agent/pre-step (waterfall, 必须 return next())
89
- → 解析 /ponytail 族 / stop ponytail → 切 currentMode + 写 flag → next()
54
+ 宿主的判定在 `dsh-config-editor` 的 `edit()`:它只为 profile 顶层条目管理 `config` 块,`insert` 里的条目永远判为被覆盖,面板显示「本部署没有接受这次修改」。本插件面板不显示只读横幅,所以那句拒绝提示是唯一判据。
90
55
 
91
- 注入: systemPrompt:section { name: ponytail, order: 50 }
92
- order 50 在 persona(0) 之后、工具(100) 之前;回调收敛为单行 text: () => renderPromptSection(skillDir, state)
93
- off → 空,review → 指向技能,读盘失败 → 中文 fallback,assembly 前以 readMode() 对齐
56
+ ## 用法
94
57
 
95
- 持久化: /ponytail default <mode> → 写入 profile 补丁或 profile 内 config.json
96
- 子智能体: PONYTAIL_SUBAGENT_MATCHER 正则(非法 warn 回退),共享同一 section
97
- HMR: 全部走 ctx,热重载逆序自动清理
58
+ ```
59
+ /ponytail 切到 full(七阶梯子全开)
60
+ /ponytail lite 只做最低限度
61
+ /ponytail ultra 先挑战需求本身
62
+ /ponytail off 关闭注入
63
+ /ponytail default lite 跨会话持久化
64
+ stop ponytail 同 off,整句匹配
98
65
  ```
99
66
 
100
- `systemPrompt` 而非 `agent.inject`:落入日志可重建,`order: 50` 优先级高,每次 `assemble` 动态求值,`off` 零成本。flag(`.ponytail-active`)与配置同源持久化在当前 profile 内(`profiles/<name>/ponytail/`),`/ponytail` 切换在 DSH 内闭环。作用域随 profile 隔离,同机多实例互不干扰。
67
+ 等级在每次会话启动时按 `env > Profile 补丁 > 内置兜底 full` 重置,所以 `/ponytail <档>` 只在本会话有效,跨会话要写 `/ponytail default <档>`。
101
68
 
102
- **会话启动对齐**:每次会话启动都会按默认档(env > patch > full)重写 flag,这是对齐上游 SessionStart 语义。因此 `/ponytail <档>` **只在本会话生效**;要让某个等级跨会话持久化,必须用 `/ponytail default <档>` 写进配置文件。
69
+ 六档之外的技能:
103
70
 
104
- ## ⚙️ 配置
71
+ | 技能 | 作用 |
72
+ | --- | --- |
73
+ | `/ponytail-review` | 只看 diff,找能删的东西 |
74
+ | `/ponytail-audit` | 全仓审计,按可删收益排序 |
75
+ | `/ponytail-debt` | 收割 `ponytail:` 注释列成待办 |
76
+ | `/ponytail-gain` | 收益看板 |
77
+ | `/ponytail-help` | 速查卡 |
105
78
 
106
- ```yaml
107
- - insert:
108
- - id: ponytail
109
- name: "@wenaixi/dsh-ponytail"
110
- config:
111
- providerName: ponytail
112
- defaultMode: full # off|lite|full|ultra
79
+ 命令行调试时任务文本不要写 `headless`,否则整句匹配不上 `/ponytail` 前缀:
80
+
81
+ ```bash
82
+ dsh --profile web '<任务>'
113
83
  ```
114
84
 
115
- 优先级(三级,取第一个有效值):`PONYTAIL_DEFAULT_MODE` env > `cordis.defaultMode` > 内置兜底 `full`。持久化:`/ponytail default <mode>` 写入 profile 补丁,`review` 不可作默认。
85
+ ## 技能正文与描述语言
86
+
87
+ 技能正文是上游 DietrichGebert/ponytail v4.10.3 的英文原文,按 tag 逐文件取回。两处内容对 DSH
88
+ 不适用,已就地改写为真实落点:`ponytail-gain` 的数据来源指向 `assets/*.svg`(本仓无上游的
89
+ `benchmarks/`),`ponytail-help` 的配置与更新章节改为 profile 补丁与 `dsh plugin`。
90
+
91
+ 模型目录与配置面板看到的是同一个描述字符串,语言由 `skillDescriptionLang` 决定
92
+ (三态:显式中文 / 显式英文 / 未配置)。未配置时跟随宿主语言 `locale.preference` 的显式选择
93
+ (仅英文触发对齐,其余兜底中文);显式选择即锁定。两套描述的真源是
94
+ `skills/descriptions.zh.json` 与 `skills/descriptions.en.json`,
95
+ 经 `ctx.remote.ponytail.snapshot()` 下发,因此切换后模型侧与界面同时改变。
116
96
 
117
- **注意**:`Config.defaultMode` 的 Schema 刻意不带默认值。Cordis 校验会把缺省 fill 成显式配置——补丁里显式写 `full` 与什么都不写会读出同一个值,诊断面板就无法区分"用户配过"与"没配过",界面因此说谎。
97
+ 描述长度上限来自官方 `dsh-tool-skill` 的 `catalogDescriptionMaxLength`(默认 500),
98
+ 超长会在模型目录里被截断,`verify.mjs` 对两册都断言。
99
+ ## 配置面板
118
100
 
119
- ### 界面配置
101
+ 已安装插件的卡片详情内嵌配置面板:运行等级、6 个技能的独立开关、一键恢复默认,外加一条三级优先级诊断链,逐行显示环境变量、Profile 补丁、内置兜底各自的值与生效状态。
120
102
 
121
- 插件在已安装插件卡片详情内嵌配置面板(`plugins.bundle.config` 插槽),支持四档运行等级、6 个技能的独立开关、一键恢复默认,并给出**三级优先级诊断链**——逐行显示环境变量、Profile 补丁、内置兜底各自的值与生效状态,被更高优先级压制的那一级会显式标为"被覆盖"。只有环境变量命中时等级选择器才禁用(env 压过一切,此时改补丁确实无效);兜底命中属于"补丁与 env 都没写",不是更高优先级的配置,必须放行。
103
+ 等级控件只显示补丁里真实配置的档。补丁没写 `defaultMode` 时选中末尾追加的「未设置」段,「当前生效」由诊断链顶部的文字给出。把兜底档显示成已配置档就是在骗人。
122
104
 
123
- 面板不使用自制 HTTP 端点,读写分两条官方通道:
105
+ 读写走两条官方通道:
124
106
 
125
107
  | 通道 | 内容 | 落点 |
126
108
  | --- | --- | --- |
127
- | `ctx.configForms.get('ponytail')` | 默认档、技能启用列表(写入自带 revision 冲突检测) | Profile 补丁 `profiles/<name>/cordis.patch.yml` |
128
- | `ctx.remote.ponytail.snapshot()` | 当前生效等级、三级优先级诊断链(只读) | 不落盘,按需拉取 |
109
+ | `ctx.configForms.get('ponytail')` | 默认档、技能启用列表,写入自带 revision 冲突检测 | `profiles/<name>/cordis.patch.yml` |
110
+ | `ctx.remote.ponytail.snapshot()` | 当前生效等级、三级诊断链,只读 | 不落盘,按需拉取 |
111
+
112
+ 无 Profile 上下文的组合(headless、CLI)没有 Settings 服务,配置读写回退到 `profiles/<name>/ponytail/config.json`。从旧版本升级时,全局的 `$DSH_HOME/ponytail/config.json` 首次启动时一次性导入 Profile 补丁,旧文件随后被改名 `.imported`;导入失败不影响启动。
113
+
114
+ ## 安装、更新、卸载的真实行为
115
+
116
+ | 动作 | 需要重启宿主 | 原因 |
117
+ | --- | --- | --- |
118
+ | 新装 | 否,刷新浏览器即可 | 宿主检测到新增条目,投递新的产物指纹 |
119
+ | 更新 | 是 | 条目 `rev` 在进程启动时算好就冻结,运行中替换文件不触发重算 |
120
+ | 卸载 | 否,但补丁条目要手工删 | `dsh plugin remove` 清 `package.json`、bundles 与物理包,不删 `cordis.patch.yml` 的条目 |
121
+
122
+ 卸载后的残留条目每次启动打印 `patch: entry "ponytail" not found`,是警告,不致命。宿主侧确实没有删除条目的能力,只能手工清。
123
+
124
+ 更新后请重启宿主再验证界面。
129
125
 
130
- 在无 Profile 上下文的组合(headless / CLI)里,宿主没有装配 Settings 服务,此时配置读写回退到 profile 内的 `ponytail/config.json`。从旧版本升级时,全局共享的 `$DSH_HOME/ponytail/config.json` 会在首次启动时一次性导入 Profile 补丁,随后旧文件被改名为 `config.json.imported`;导入失败不影响启动,可用 `/ponytail default <档>` 重新设置。
126
+ ## 上游映射
131
127
 
132
- 旧的平台位置(`%APPDATA%` / `XDG_CONFIG_HOME` / `~/.config`)兼容读取已随 1A 下沉一并删除;`scripts/verify.mjs` 现在对 `src/` 下任何平台路径字面量直接判失败。
128
+ 上游 `hooks/` 的六个 Hook 合并进单一 DSH 插件:
133
129
 
134
- ## 🎮 使用
130
+ | 上游 | DSH 侧 |
131
+ | --- | --- |
132
+ | `ponytail-config.js` | `src/ponytail-config.ts` |
133
+ | `ponytail-instructions.js` | `src/ponytail-instructions.ts`,唯一出口 `renderPromptSection(skillDir, state)` |
134
+ | `ponytail-state.js` | `src/ponytail-state.ts`,flag 文件存取与技能禁用 reload 都在此 |
135
+ | `ponytail-activate.js` | `src/ponytail.ts` 的 `agent/created` |
136
+ | `ponytail-mode-tracker.js` | `src/ponytail-commands.ts` 的 `createCommandDispatcher` |
137
+ | `ponytail-subagent.js` | `src/ponytail.ts` 的 `agent/created`,`PONYTAIL_SUBAGENT_MATCHER` |
135
138
 
136
- - 自动生效,无需手动触发
137
- - `/ponytail [lite|full|ultra|off]` / `/ponytail default <mode>` / `/ponytail-review` / `/ponytail-audit` / `/ponytail-debt` / `/ponytail-gain` / `/ponytail-help`
138
- - 退出:`stop ponytail` / `normal mode`(整句)或 `/ponytail off`
139
- - 命令行调试:`dsh --profile <name> '<任务>'`——不要写 `headless` 字样,否则任务文本会被 CLI 前置成 `headless <任务>`,整句不再匹配 `/ponytail` 指令前缀(切换指令也就不会生效)。
139
+ 提示词经 `systemPrompt.section('ponytail')` 注入,`order: 50` 落在 persona(0) 与工具(100) 之间,每次 assemble 动态求值,`off` 时零成本。flag 与配置同源持久化在当前 profile 内,同机多实例互不干扰。
140
140
 
141
- ## 🛠️ 开发
141
+ ## 开发
142
142
 
143
143
  ```bash
144
- # 四道门禁,改完必须全绿
145
- pnpm typecheck # tsc --noEmit
146
- pnpm build # tsc 出 lib/,再由 build-client.mjs 生成 lib/client.js
147
- node scripts/verify.mjs # 静态门禁:38 条断言(含 client.js Node API 残留反向断言)(产物/技能/零 tool/落点/元数据真源/locale)
148
- node scripts/behavior.test.mjs # 行为单测(64 项)
149
-
150
- # 0 侵入联调
151
- dsh --profile web --patch ./cordis.patch.yml --dump-config # 仅验证补丁解析,不替代真实启动验收
144
+ pnpm typecheck # tsc --noEmit
145
+ pnpm build # tsc 出 lib/,再由 build-client.mjs 生成 lib/client.js
146
+ node scripts/verify.mjs # 静态门禁:产物、技能、零 tool、UI 落点、locale 键集
147
+ node scripts/docs-verify.mjs # 版本策略文档一致性
148
+ node scripts/behavior.test.mjs # 行为测试
149
+
150
+ dsh --profile web --patch ./cordis.patch.yml --dump-config # 只验证补丁解析
152
151
  pnpm dsh web --patch ./cordis.patch.yml # 热重载
153
152
  ```
154
153
 
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。
158
- - **客户端产物单一来源**:`lib/client.js` 只由 `scripts/build-client.mjs` 生成。`tsconfig.build.json` 不得把它列入编译输入,否则会出现同名双产物并静默漂移。
159
-
160
- ---
154
+ 本地版本用独立的标准 SemVer,`pnpm version:bump` 递增 patch,`pnpm version:set -- 5.3.0` 指定版本。旧的 `-dsh.N` 不再生成。上游发布不会改变本地版本号,是否吸收上游变化由本地兼容性评估决定。
161
155
 
162
- ## 🔗 上游
156
+ 发布只走 tag 触发的 CI。严禁本地 `npm publish`,push 与打 tag 都需要明确授权。
163
157
 
164
- 原仓 https://github.com/DietrichGebert/ponytail(MIT)
158
+ `lib/client.js` 只由 `scripts/build-client.mjs` 生成。`tsconfig.build.json` 不能把它列入编译输入,否则会出现同名双产物并静默漂移。
165
159
 
166
- ## 📄 许可
160
+ ## 许可
167
161
 
168
- [MIT](LICENSE)
169
- © DietrichGebert / Wenaixi
162
+ [MIT](LICENSE),原作 DietrichGebert,移植 Wenaixi。上游仓库 https://github.com/DietrichGebert/ponytail
package/cordis.patch.yml CHANGED
@@ -1,4 +1,3 @@
1
1
  - insert:
2
2
  - id: ponytail
3
3
  name: "@wenaixi/dsh-ponytail"
4
-
package/lib/client.js CHANGED
@@ -12,8 +12,8 @@ window.__ModuleLoader__.load({
12
12
  // 官方 locale 接入:注册 ponytail 命名空间双语字典(真源 locale/*.json,构建期内嵌)
13
13
  // 技能描述不翻译(用户边界):由 configForms 快照与快照通道下发,字典不含技能描述键
14
14
  var NS = "ponytail";
15
- var ZH = {"button.reset":"恢复默认配置","chain.hit":"生效中","chain.shadowed":"被覆盖","chain.unset":"未设置","chain.valueUnset":"(未设置)","confirm.reset":"确定恢复默认配置吗?等级回到标准(full),并重新启用全部 6 个技能。","error.operation":"操作失败:","error.rejected":"本部署没有接受这次修改,值已保留供你核对。","level.env":"环境变量","level.fallback":"内置兜底","level.patch":"Profile 补丁","meta":{"title":"懒人模式","description":"常驻懒人资深开发者模式与七阶梯子(YAGNI 到最小实现),6 个中文原生技能(本体、评审、审计、债务、收益、帮助),零 Tool 注册。"},"meta.description":"DietrichGebert/ponytail 的 DSH 完整移植:常驻懒人 senior 模式与七阶梯子(YAGNI 到最小实现),6 个中文原生技能(本体、评审、审计、债务、收益、帮助),零 tool 注册。","meta.title":"懒人模式(ponytail)","mode.full":"标准","mode.hint":"控制梯子提示词的注入强度,改动即时生效并写入配置文件,对所有会话生效。","mode.lite":"轻量","mode.lockedHint":"当前有更高优先级的配置在生效,此处的修改不会改变实际运行等级。","mode.off":"关闭","mode.title":"运行强度等级","mode.ultra":"激进","panel.title":"懒人模式配置","priority.intro":"运行等级按下列顺序取第一个有效值;被更高优先级压制的项,在界面上修改不会生效。当前生效:","priority.title":"配置优先级","priority.unavailable":"诊断信息不可用,请确认宿主版本已包含优先级诊断接口。","problem.env":"值无效,已忽略","problem.patch":"值无效,已忽略","skills.enabledToast":"技能 {name} 已启用","skills.hiddenToast":"技能 {name} 已隐藏","skills.hint":"关闭后该技能不会出现在斜杠菜单,也不会被模型加载。","skills.title":"原生技能开关","skills.toggleOn":"启用 {name}","state.loading":"读取中…","state.readOnly":"本部署的设置为只读。","state.saved":"配置保存在当前 profile 的 ponytail 目录","toast.modeChanged":"运行等级已切为「{name}」","toast.resetDone":"已恢复默认配置"};
16
- var EN = {"button.reset":"Restore defaults","chain.hit":"In effect","chain.shadowed":"Shadowed","chain.unset":"Unset","chain.valueUnset":"(unset)","confirm.reset":"Restore default config? Level returns to Standard (full) and all 6 skills are re-enabled.","error.operation":"Operation failed: ","error.rejected":"This deployment did not accept the change; your value was kept for you to review.","level.env":"Environment variable","level.fallback":"Built-in fallback","level.patch":"Profile patch","meta":{"title":"Lazy Senior Dev Mode","description":"Persistent lazy senior developer mode with a seven-rung ladder (YAGNI down to the smallest implementation), six native skills, and zero tool registration."},"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.","meta.title":"Ponytail (lazy senior mode)","mode.full":"Standard","mode.hint":"Controls how strongly the ladder prompt is injected. Changes apply immediately and are written to the config file for all sessions.","mode.lite":"Lite","mode.lockedHint":"A higher-priority configuration is in effect; changes here will not affect the actual runtime level.","mode.off":"Off","mode.title":"Intensity Level","mode.ultra":"Ultra","panel.title":"Lazy Senior Dev Mode settings","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: ","priority.title":"Config Priority","priority.unavailable":"Diagnostics unavailable. Please confirm the host version ships the priority diagnostics endpoint.","problem.env":"Invalid value, ignored","problem.patch":"Invalid value, ignored","skills.enabledToast":"Skill {name} enabled","skills.hiddenToast":"Skill {name} hidden","skills.hint":"Disabled skills disappear from the slash menu and are not loaded by the model.","skills.title":"Native Skills","skills.toggleOn":"Enable {name}","state.loading":"Loading…","state.readOnly":"This deployment stores settings read-only.","state.saved":"Config is stored in the ponytail directory of the current profile","toast.modeChanged":"Level switched to {name}","toast.resetDone":"Defaults restored"};
15
+ var ZH = {"button.reset":"恢复默认配置","chain.hit":"生效中","chain.shadowed":"被覆盖","chain.unset":"未设置","chain.valueUnset":"(未设置)","confirm.reset":"确定恢复默认配置吗?等级回到标准(full),并重新启用全部 6 个技能。","error.operation":"操作失败:","error.rejected":"本部署没有接受这次修改,值已保留供你核对。","lang.auto":"跟随宿主(自动)","lang.changed":"技能描述语言已切为「{name}」","lang.en":"English","lang.followHost":"已切为跟随宿主语言","lang.title":"技能描述语言","lang.unsetHint":"未配置:当前跟随宿主语言({lang}),可在上方显式切换","lang.zh":"中文","level.env":"环境变量","level.fallback":"内置兜底","level.patch":"Profile 补丁","meta":{"title":"懒人模式","description":"常驻懒人资深开发者模式与七阶梯子(YAGNI 到最小实现),6 个中文原生技能(本体、评审、审计、债务、收益、帮助),零 Tool 注册。"},"meta.description":"DietrichGebert/ponytail 的 DSH 完整移植:常驻懒人 senior 模式与七阶梯子(YAGNI 到最小实现),6 个中文原生技能(本体、评审、审计、债务、收益、帮助),零 tool 注册。","meta.title":"懒人模式(ponytail)","mode.full":"标准","mode.hint":"控制梯子提示词的注入强度,改动即时生效并写入配置文件,对所有会话生效。","mode.lite":"轻量","mode.lockedHint":"当前有更高优先级的配置在生效,此处的修改不会改变实际运行等级。","mode.off":"关闭","mode.title":"运行强度等级","mode.ultra":"激进","mode.unset":"未设置","mode.unsetHint":"Profile 补丁未配置运行等级,当前由内置兜底决定。点上方任一档位即写入补丁。","panel.title":"懒人模式配置","priority.intro":"运行等级按下列顺序取第一个有效值;被更高优先级压制的项,在界面上修改不会生效。当前生效:","priority.title":"配置优先级","priority.unavailable":"诊断信息不可用,请确认宿主版本已包含优先级诊断接口。","problem.env":"值无效,已忽略","problem.patch":"值无效,已忽略","skills.enabledToast":"技能 {name} 已启用","skills.hiddenToast":"技能 {name} 已隐藏","skills.hint":"关闭后该技能不会出现在斜杠菜单,也不会被模型加载。","skills.title":"原生技能开关","skills.toggleOn":"启用 {name}","state.loading":"读取中…","state.readOnly":"本部署的设置为只读。","state.saved":"配置保存在当前 profile 的 ponytail 目录","toast.modeChanged":"运行等级已切为「{name}」","toast.resetDone":"已恢复默认配置"};
16
+ var EN = {"button.reset":"Restore defaults","chain.hit":"In effect","chain.shadowed":"Shadowed","chain.unset":"Unset","chain.valueUnset":"(unset)","confirm.reset":"Restore default config? Level returns to Standard (full) and all 6 skills are re-enabled.","error.operation":"Operation failed: ","error.rejected":"This deployment did not accept the change; your value was kept for you to review.","lang.auto":"Follow host (auto)","lang.changed":"Skill description language switched to {name}","lang.en":"English","lang.followHost":"Now following the host language","lang.title":"Skill description language","lang.unsetHint":"Not set: follows the host language ({lang}); switch explicitly above","lang.zh":"中文","level.env":"Environment variable","level.fallback":"Built-in fallback","level.patch":"Profile patch","meta":{"title":"Lazy Senior Dev Mode","description":"Persistent lazy senior developer mode with a seven-rung ladder (YAGNI down to the smallest implementation), six native skills, and zero tool registration."},"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.","meta.title":"Ponytail (lazy senior mode)","mode.full":"Standard","mode.hint":"Controls how strongly the ladder prompt is injected. Changes apply immediately and are written to the config file for all sessions.","mode.lite":"Lite","mode.lockedHint":"A higher-priority configuration is in effect; changes here will not affect the actual runtime level.","mode.off":"Off","mode.title":"Intensity Level","mode.ultra":"Ultra","mode.unset":"Unset","mode.unsetHint":"The profile patch has no intensity level; the built-in fallback decides it now. Picking any level above writes it to the patch.","panel.title":"Lazy Senior Dev Mode settings","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: ","priority.title":"Config Priority","priority.unavailable":"Diagnostics unavailable. Please confirm the host version ships the priority diagnostics endpoint.","problem.env":"Invalid value, ignored","problem.patch":"Invalid value, ignored","skills.enabledToast":"Skill {name} enabled","skills.hiddenToast":"Skill {name} hidden","skills.hint":"Disabled skills disappear from the slash menu and are not loaded by the model.","skills.title":"Native Skills","skills.toggleOn":"Enable {name}","state.loading":"Loading…","state.readOnly":"This deployment stores settings read-only.","state.saved":"Config is stored in the ponytail directory of the current profile","toast.modeChanged":"Level switched to {name}","toast.resetDone":"Defaults restored"};
17
17
  // t 在 apply 时经 ctx.locale.bind 赋值;组件读取 factory 级变量(不接收 ctx,铁律)
18
18
  var localeCtx = null;
19
19
  var t = function (key, params) {
@@ -110,19 +110,29 @@ window.__ModuleLoader__.load({
110
110
  },
111
111
  };
112
112
 
113
- // 档位标签在 apply 时才绑定 locale(t 是 factory 级可变变量),因此按需取值而不是模块级求值
114
- function modeOptions() {
115
- return [
113
+ // 档位标签在 apply 时才绑定 locale(t 是 factory 级可变变量),因此按需取值而不是模块级求值。
114
+ //
115
+ // configured=false(补丁未写 defaultMode)时末尾追加一段真实的「未设置」选项,而不是把 value
116
+ // 置成一个不在 options 里的值:官方 SegmentedControl 用 options.findIndex 求下标,
117
+ // 下标 -1 会让所有段 tabIndex=-1(键盘不可达)且指示器整颗滑出轨道左缘
118
+ // (dsh-client-ui-primitives/lib/index.js:3410-3492 与 SegmentedControl.module.css)。
119
+ // 「未设置」排在末尾而非首位:未配置态下 关闭/轻量/标准/激进 仍占 0-3 段,
120
+ // 配好之后四档位置不变,用户已有的肌肉记忆不被打断。
121
+ function modeOptions(configured) {
122
+ var options = [
116
123
  { value: "off", label: t("mode.off") },
117
124
  { value: "lite", label: t("mode.lite") },
118
125
  { value: "full", label: t("mode.full") },
119
126
  { value: "ultra", label: t("mode.ultra") },
120
127
  ];
128
+ if (!configured) options.push({ value: "unset", label: t("mode.unset") });
129
+ return options;
121
130
  }
122
131
 
123
- // 技能元数据从 SKILL.md frontmatter 构建期提取(唯一真源,与宿侧 readSkillMeta 同源)。
132
+ // 技能 id 列表是构建期常量;描述与语言来自 remote 快照(与模型目录同源)。
133
+ // 构建期内嵌描述会让语言切换停在旧值,所以这里只带 id。
124
134
  // 「是否启用」不再随服务端下发:它就是 configForms 快照里的 disabledSkills 取反。
125
- 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"}];
135
+ const SKILL_IDS = ["ponytail","ponytail-audit","ponytail-debt","ponytail-gain","ponytail-help","ponytail-review"];
126
136
 
127
137
  // 诊断链一行的状态语义:生效 / 被覆盖 / 未设置 / 有问题
128
138
  function chainRowState(source) {
@@ -335,11 +345,15 @@ window.__ModuleLoader__.load({
335
345
  applyOps([
336
346
  { op: "unset", path: ["defaultMode"] },
337
347
  { op: "unset", path: ["disabledSkills"] },
348
+ { op: "unset", path: ["skillDescriptionLang"] },
338
349
  ], t("toast.resetDone"));
339
350
  }, [applyOps]);
340
351
 
341
352
  const config = snapshot.value || {};
342
353
  const defaultMode = typeof config.defaultMode === "string" ? config.defaultMode : null;
354
+ // 配置值的有无,而不是运行时推导值的有无:defaultMode 无 Schema 默认值
355
+ // (src/ponytail.ts),所以快照里读得到它,就说明用户的 profile 补丁里写了。
356
+ const modeConfigured = defaultMode !== null;
343
357
  // 只有环境变量命中才锁:env 压过一切,此时改 patch 确实无效。
344
358
  // fallback 命中必须放行——那是「补丁与 env 都没写」的兜底,不是更高优先级的配置,
345
359
  // 用户改 patch 立刻生效(此前把 fallback 也当压制源,提示文案在说谎)。
@@ -347,6 +361,26 @@ window.__ModuleLoader__.load({
347
361
  return s.level === "env" && s.hit;
348
362
  }));
349
363
 
364
+ // 描述语言:三态(src/ponytail.ts 已去 Schema 默认值)。快照里读得到字段 = 显式配置
365
+ // (zh/en,锁定);读不到 = 未配置(跟随宿主,控件显示「跟随宿主」段)。
366
+ // remote.skillLang 是服务端解析后的实际语言(显式值或按宿主对齐值),
367
+ // 未配置时用它提示「当前跟随到 zh/en」。
368
+ var descLangConfigured = typeof config.skillDescriptionLang === "string";
369
+ var descLang = descLangConfigured ? config.skillDescriptionLang : "auto";
370
+ var descLangOptions = [
371
+ { value: "zh", label: t("lang.zh") },
372
+ { value: "en", label: t("lang.en") },
373
+ ];
374
+ if (!descLangConfigured) descLangOptions.push({ value: "auto", label: t("lang.auto") });
375
+ var setDescLang = React.useCallback(function (lang) {
376
+ if (lang === "auto") {
377
+ applyOps([{ op: "unset", path: ["skillDescriptionLang"] }], t("lang.followHost"));
378
+ return;
379
+ }
380
+ applyOps([{ op: "set", path: ["skillDescriptionLang"], value: lang }],
381
+ t("lang.changed", { name: t("lang." + lang) }));
382
+ }, [applyOps]);
383
+
350
384
  return e(
351
385
  "div",
352
386
  { style: { display: "flex", flexDirection: "column", gap: "16px", maxWidth: "720px" } },
@@ -361,11 +395,18 @@ window.__ModuleLoader__.load({
361
395
  e(P.SegmentedControl, {
362
396
  id: "ponytail-mode",
363
397
  label: t("mode.title"),
364
- value: defaultMode === null ? remote && remote.priority ? remote.priority.effective : "full" : defaultMode,
365
- options: modeOptions(),
398
+ // 控件只显示配置值,绝不回退到 priority.effective:那是运行时推导档
399
+ // (env / 补丁 / 兜底合并的结果),回退会让刚安装的用户看到「标准」被高亮,
400
+ // 像亲手选过一样。未配置就如实显示「未设置」段。
401
+ // 「当前生效」由上方优先级链表独占呈现,这里不重复。
402
+ value: modeConfigured ? defaultMode : "unset",
403
+ options: modeOptions(modeConfigured),
366
404
  disabled: busy || !writable || levelLocked,
367
405
  onChange: setMode,
368
406
  }),
407
+ !modeConfigured
408
+ ? e("p", { style: L.hint }, t("mode.unsetHint"))
409
+ : null,
369
410
  levelLocked
370
411
  ? e("p", { style: Object.assign({}, L.hint, { color: "var(--dsw-alias-state-warn-primary)" }) }, t("mode.lockedHint"))
371
412
  : null,
@@ -378,25 +419,39 @@ window.__ModuleLoader__.load({
378
419
  { style: L.section },
379
420
  e("h4", { style: L.title }, t("skills.title")),
380
421
  e("p", { style: L.hint }, t("skills.hint")),
422
+ e(P.SegmentedControl, {
423
+ id: "ponytail-desc-lang",
424
+ label: t("lang.title"),
425
+ value: descLang,
426
+ options: descLangOptions,
427
+ disabled: busy || !writable,
428
+ onChange: setDescLang,
429
+ }),
430
+ !descLangConfigured
431
+ ? e("p", { style: L.hint }, t("lang.unsetHint", { lang: t("lang." + (remote && (remote.skillLang === "en" || remote.skillLang === "zh") ? remote.skillLang : "zh")) }))
432
+ : null,
381
433
  e(
382
434
  "div",
383
435
  { style: { display: "flex", flexDirection: "column", gap: "6px" } },
384
- SKILL_META.map(function (skill) {
385
- const enabled = disabled.indexOf(skill.id) < 0;
436
+ SKILL_IDS.map(function (id) {
437
+ const enabled = disabled.indexOf(id) < 0;
438
+ var meta = (remote && Array.isArray(remote.skills)
439
+ ? remote.skills.find(function (s) { return s.id === id; })
440
+ : null);
386
441
  return e(
387
442
  "div",
388
- { key: skill.id, style: L.row },
443
+ { key: id, style: L.row },
389
444
  e(
390
445
  "div",
391
446
  { style: L.rowText },
392
- e("span", { style: L.rowName }, "/" + skill.id),
393
- e("span", { style: L.rowDesc }, skill.description)
447
+ e("span", { style: L.rowName }, "/" + id),
448
+ e("span", { style: L.rowDesc }, meta ? meta.description : id)
394
449
  ),
395
450
  e(P.Switch, {
396
451
  checked: enabled,
397
452
  disabled: busy || !writable,
398
- label: t("skills.toggleOn", { name: skill.id }),
399
- onChange: function (next) { toggleSkill(skill.id, next); },
453
+ label: t("skills.toggleOn", { name: id }),
454
+ onChange: function (next) { toggleSkill(id, next); },
400
455
  })
401
456
  );
402
457
  })
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * ponytail-config — 移植自 hooks/ponytail-config.js
3
3
  *
4
- * 三级默认解析:环境变量 > 配置文件 > full
4
+ * 三级默认解析:环境变量 > Profile 补丁 > 内置兜底
5
5
  * 保留已核对的上游行为边界,并按 DSH 运行时契约适配:
6
6
  * - review 不可作默认 (#377)
7
7
  * - isDeactivationCommand 全句匹配
@@ -11,7 +11,9 @@
11
11
  * 数据根契约(见 docs/adr/0005):配置与 flag 一律落在 DSH 统一用户数据根
12
12
  * $DSH_HOME/ponytail(默认 ~/.dsh/ponytail),与 cordis 内置包
13
13
  * (.credentials.yaml / profiles/ / attachments/ 等)保持同一根,
14
- * 从而跨平台一致、跟随 DSH_HOME 覆盖、天然随 profile 隔离。
14
+ * 从而跨平台一致、跟随 DSH_HOME 覆盖。
15
+ * 注意 resolveDshHome() 结构上不含 profile 维度:该目录下的文件被同机所有实例共享,
16
+ * 配置与 flag 的 profile 隔离由 getConfigDir(profileDir) 单独承担(ADR-0009)。
15
17
  * 不再使用 XDG / APPDATA 等宿主平台约定(旧位置仅作一次性兼容读取)。
16
18
  */
17
19
  export declare const DEFAULT_MODE = "full";
@@ -88,7 +90,22 @@ export interface PonytailConfig {
88
90
  skillDir?: string;
89
91
  /** 默认强度,off 则不自动激活(volatile 引用) */
90
92
  defaultMode?: VolatileRef<'off' | 'lite' | 'full' | 'ultra'>;
93
+ /**
94
+ * 技能描述下发给模型目录与配置面板的语言(volatile 引用,三态语义)。
95
+ *
96
+ * 三态:显式 'zh' / 显式 'en' / 未配置(引用包 undefined → 运行时 'auto')。
97
+ * 不带 Schema 默认值:未配置必须与显式 zh 可区分——未配置时语言跟随宿主
98
+ * locale.preference(见 ponytail.ts 的 resolveSkillLang),显式 zh 则锁定。
99
+ */
100
+ skillDescriptionLang?: VolatileRef<'zh' | 'en'>;
91
101
  }
102
+ /** 技能描述语言的有效值域:'auto' 仅作为「未配置」的运行时解析态,不落盘。 */
103
+ export type SkillLangSetting = 'zh' | 'en' | 'auto';
104
+ /**
105
+ * 配置值归一:undefined/非法 → 'auto'(未配置,由调用方决定跟随宿主或兜底 zh),
106
+ * zh/en 原样。纯函数,零 I/O;宿主语言对齐逻辑在 ponytail.ts(本模块不读任何服务)。
107
+ */
108
+ export declare function resolveSkillLang(raw: VolatileRef<'zh' | 'en'> | 'zh' | 'en' | undefined): SkillLangSetting;
92
109
  /**
93
110
  * 读一个可能是 volatile 引用、可能是裸值、也可能读到 undefined 的字段。
94
111
  *
@@ -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,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,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWrE;AAED,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAiB/D;AAGD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,WAAW,CAAA;IACxB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AA0BD,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAElE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA8B1G;AAED,wBAAgB,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAK1E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAMtF;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,GAAG,IAAI,CAAC,CAAA;CACT;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;IACtC,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mCAAmC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;CAC7D;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,CAMpF"}
1
+ {"version":3,"file":"ponytail-config.d.ts","sourceRoot":"","sources":["../src/ponytail-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;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,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWrE;AAED,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAiB/D;AAGD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,WAAW,CAAA;IACxB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AA0BD,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAElE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CA8B1G;AAED,wBAAgB,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAK1E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAMtF;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,GAAG,IAAI,CAAC,CAAA;CACT;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;IACtC,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mCAAmC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;IAC5D;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;CAChD;AAED,8CAA8C;AAC9C,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAA;AAEnD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GACtD,gBAAgB,CAElB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,CAMpF"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * ponytail-config — 移植自 hooks/ponytail-config.js
3
3
  *
4
- * 三级默认解析:环境变量 > 配置文件 > full
4
+ * 三级默认解析:环境变量 > Profile 补丁 > 内置兜底
5
5
  * 保留已核对的上游行为边界,并按 DSH 运行时契约适配:
6
6
  * - review 不可作默认 (#377)
7
7
  * - isDeactivationCommand 全句匹配
@@ -11,7 +11,9 @@
11
11
  * 数据根契约(见 docs/adr/0005):配置与 flag 一律落在 DSH 统一用户数据根
12
12
  * $DSH_HOME/ponytail(默认 ~/.dsh/ponytail),与 cordis 内置包
13
13
  * (.credentials.yaml / profiles/ / attachments/ 等)保持同一根,
14
- * 从而跨平台一致、跟随 DSH_HOME 覆盖、天然随 profile 隔离。
14
+ * 从而跨平台一致、跟随 DSH_HOME 覆盖。
15
+ * 注意 resolveDshHome() 结构上不含 profile 维度:该目录下的文件被同机所有实例共享,
16
+ * 配置与 flag 的 profile 隔离由 getConfigDir(profileDir) 单独承担(ADR-0009)。
15
17
  * 不再使用 XDG / APPDATA 等宿主平台约定(旧位置仅作一次性兼容读取)。
16
18
  */
17
19
  import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
@@ -201,6 +203,13 @@ export function writeDefaultMode(mode, profileDir) {
201
203
  return null;
202
204
  return normalized;
203
205
  }
206
+ /**
207
+ * 配置值归一:undefined/非法 → 'auto'(未配置,由调用方决定跟随宿主或兜底 zh),
208
+ * zh/en 原样。纯函数,零 I/O;宿主语言对齐逻辑在 ponytail.ts(本模块不读任何服务)。
209
+ */
210
+ export function resolveSkillLang(raw) {
211
+ return raw === 'en' ? 'en' : raw === 'zh' ? 'zh' : 'auto';
212
+ }
204
213
  /**
205
214
  * 读一个可能是 volatile 引用、可能是裸值、也可能读到 undefined 的字段。
206
215
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ponytail-config.js","sourceRoot":"","sources":["../src/ponytail-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ponytail-config.js","sourceRoot":"","sources":["../src/ponytail-config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ponytail-instructions.d.ts","sourceRoot":"","sources":["../src/ponytail-instructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAKxD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAoBzE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkC5D;AAGD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAKD;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAU7D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAKlF"}
1
+ {"version":3,"file":"ponytail-instructions.d.ts","sourceRoot":"","sources":["../src/ponytail-instructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAKxD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAoBzE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkC5D;AAID,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAKD;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAU7D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAKlF"}