@wenaixi/dsh-ponytail 5.0.0 → 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.
@@ -1,162 +0,0 @@
1
- /**
2
- * ponytail-http — HTTP 配置端点深模块(纯 Node 工厂,零 ctx)
3
- *
4
- * 从 apply() 剥离出的 /api/plugins/ponytail/config 处理器:
5
- * GET/POST 全部业务分支、请求体解析、响应组装、405 兜底内聚于此,
6
- * apply() 只保留 webServer.register 一行接线。
7
- * 依赖全部经 deps 注入(state / 解析函数 / 失效回调 / patch/env 原值),
8
- * 因此不经 Cordis ctx 即可用 node:test + 假 req/res 单测。
9
- */
10
- import { readFileSync, readdirSync } from 'node:fs';
11
- import { join } from 'node:path';
12
- import { parse as parseYaml } from 'yaml';
13
- import { resolvePriority } from './ponytail-priority.js';
14
- import { isMainSkillDisabled } from './ponytail-state.js';
15
- /** GET/POST 响应共用的快照:等级、默认档(与 priority 同源)、禁用技能、技能列表、诊断链 */
16
- function snapshot(state, deps) {
17
- const currentMode = state.get() ?? 'off';
18
- // C3 合并:同快照内只求值一次(读盘一次、resolvePriority 一次),
19
- // defaultMode 与 priority.effective 由同一 report 保证同源同值。
20
- const report = resolvePriority({
21
- envRaw: deps.readEnvRaw(),
22
- patchMode: deps.readPatchMode(),
23
- configMode: deps.readRawConfigMode(),
24
- });
25
- const disabledSkills = state.getDisabledSkills();
26
- const skillsList = readSkillMeta(deps.skillDir).map((s) => ({
27
- ...s,
28
- enabled: state.isSkillEnabled(s.id),
29
- }));
30
- return {
31
- currentMode,
32
- defaultMode: report.effective,
33
- disabledSkills,
34
- skills: skillsList,
35
- priority: report,
36
- };
37
- }
38
- // 兜底元数据:仅当 frontmatter 目录不可读时使用(正常路径以 SKILL.md 为唯一真源,
39
- // 见 readSkillMeta)。与面板构建期快照同源,防 API 离线时面板空白。
40
- const FALLBACK_SKILL_META = [
41
- { id: 'ponytail', name: 'ponytail', description: '懒人模式本体:3 档强度,梯子七阶注入' },
42
- { id: 'ponytail-review', name: 'ponytail-review', description: '过度设计评审:只挑能删的代码,一行一条' },
43
- { id: 'ponytail-audit', name: 'ponytail-audit', description: '全仓过度设计审计:按可删行数降序猎取臃肿' },
44
- { id: 'ponytail-debt', name: 'ponytail-debt', description: '债务台账收割:收割所有 ponytail: 注释,建立债务台账' },
45
- { id: 'ponytail-gain', name: 'ponytail-gain', description: '收益看板:展示 benchmark 中位数收益' },
46
- { id: 'ponytail-help', name: 'ponytail-help', description: '速查卡:模式、技能、命令与配置速查' },
47
- ];
48
- function parseSkillFrontmatter(filePath) {
49
- try {
50
- const raw = readFileSync(filePath, 'utf8').replace(/^\uFEFF/, '').replace(/\r\n/g, '\n');
51
- if (!raw.startsWith('---\n'))
52
- return null;
53
- const end = raw.indexOf('\n---\n');
54
- if (end < 0)
55
- return null;
56
- const fm = parseYaml(raw.slice(4, end));
57
- if (typeof fm !== 'object' || fm === null || Array.isArray(fm))
58
- return null;
59
- const desc = fm['description'];
60
- return { description: typeof desc === 'string' ? desc : undefined };
61
- }
62
- catch {
63
- return null;
64
- }
65
- }
66
- /**
67
- * 从 skills/ 目录读取全部技能元数据(SKILL.md frontmatter 为唯一真源)。
68
- * 不按禁用状态过滤——面板需要展示全部 6 项(enabled 由 state.isSkillEnabled 标记)。
69
- * 目录/文件不可读时回退 FALLBACK_SKILL_META(不抛错)。
70
- */
71
- export function readSkillMeta(skillDirPath) {
72
- let names = [];
73
- try {
74
- names = readdirSync(skillDirPath, { withFileTypes: true })
75
- .filter((d) => d.isDirectory() && !d.name.startsWith('.'))
76
- .map((d) => d.name)
77
- .sort();
78
- }
79
- catch {
80
- return FALLBACK_SKILL_META.map((m) => ({ ...m }));
81
- }
82
- const metas = [];
83
- for (const name of names) {
84
- const fm = parseSkillFrontmatter(join(skillDirPath, name, 'SKILL.md'));
85
- metas.push({ id: name, name, description: fm?.description ?? name });
86
- }
87
- return metas.length > 0 ? metas : FALLBACK_SKILL_META.map((m) => ({ ...m }));
88
- }
89
- /**
90
- * 创建 /api/plugins/ponytail/config 处理器。
91
- * @returns 纯 Node http handler(req/res),可被 webServer.register 直接消费
92
- */
93
- export function createConfigHttpEndpoint(deps) {
94
- return async (req, res) => {
95
- res.setHeader('Content-Type', 'application/json; charset=utf-8');
96
- res.setHeader('Cache-Control', 'no-store');
97
- if (req.method === 'GET') {
98
- res.writeHead(200);
99
- res.end(JSON.stringify(snapshot(deps.state, deps)));
100
- return;
101
- }
102
- if (req.method === 'POST') {
103
- let bodyStr = '';
104
- for await (const chunk of req) {
105
- bodyStr += chunk;
106
- }
107
- let payload = {};
108
- try {
109
- if (bodyStr)
110
- payload = JSON.parse(bodyStr);
111
- }
112
- catch {
113
- res.writeHead(400);
114
- res.end(JSON.stringify({ error: 'Invalid JSON body' }));
115
- return;
116
- }
117
- // 一键恢复默认配置
118
- if (payload.action === 'reset') {
119
- deps.state.resetToDefaults();
120
- deps.invalidateSkills();
121
- deps.logger.info('[ponytail] UI 一键重置为默认配置(full 等级,开启所有技能)');
122
- }
123
- else {
124
- // 修改等级(全局持久化与即时生效)
125
- if (typeof payload.mode === 'string') {
126
- const targetMode = payload.mode.toLowerCase();
127
- deps.state.setDefaultMode(targetMode);
128
- deps.state.set(targetMode === 'off' ? null : targetMode);
129
- deps.logger.info(`[ponytail] UI 切换运行等级:${targetMode}(已持久化为默认等级)`);
130
- }
131
- // 修改禁用的技能列表(物理隐藏)
132
- if (Array.isArray(payload.disabledSkills)) {
133
- const newDisabled = payload.disabledSkills.filter((s) => typeof s === 'string');
134
- deps.state.setDisabledSkills(newDisabled);
135
- if (isMainSkillDisabled(newDisabled)) {
136
- deps.state.set(null);
137
- }
138
- deps.invalidateSkills();
139
- deps.logger.info(`[ponytail] UI 更新禁用技能列表:${JSON.stringify(newDisabled)}`);
140
- }
141
- // 切换单个技能
142
- if (typeof payload.toggleSkill === 'object' && payload.toggleSkill !== null) {
143
- const tg = payload.toggleSkill;
144
- if (typeof tg.name === 'string') {
145
- deps.state.toggleSkill(tg.name, tg.enabled);
146
- if (isMainSkillDisabled([tg.name]) && tg.enabled === false) {
147
- deps.state.set(null);
148
- }
149
- deps.invalidateSkills();
150
- deps.logger.info(`[ponytail] UI 切换技能 ${tg.name} 状态:${tg.enabled}`);
151
- }
152
- }
153
- }
154
- res.writeHead(200);
155
- res.end(JSON.stringify({ success: true, ...snapshot(deps.state, deps) }));
156
- return;
157
- }
158
- res.writeHead(405);
159
- res.end(JSON.stringify({ error: 'Method Not Allowed' }));
160
- };
161
- }
162
- //# sourceMappingURL=ponytail-http.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ponytail-http.js","sourceRoot":"","sources":["../src/ponytail-http.ts"],"names":[],"mappings":"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"}