oh-my-knowledge 0.27.0 → 0.28.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 +31 -34
- package/README.zh.md +31 -34
- package/dist/src/analysis/report-diagnostics.d.ts +2 -2
- package/dist/src/analysis/report-diagnostics.js +2 -2
- package/dist/src/analysis/sample-diagnostics.d.ts +3 -3
- package/dist/src/analysis/sample-diagnostics.js +3 -3
- package/dist/src/authoring/generator.js +1 -1
- package/dist/src/authoring/generator.js.map +1 -1
- package/dist/src/cli/commands/doctor.d.ts.map +1 -1
- package/dist/src/cli/commands/doctor.js +39 -2
- package/dist/src/cli/commands/doctor.js.map +1 -1
- package/dist/src/cli/commands/eval.d.ts.map +1 -1
- package/dist/src/cli/commands/eval.js +0 -5
- package/dist/src/cli/commands/eval.js.map +1 -1
- package/dist/src/cli/commands/{export.d.ts → evolve.d.ts} +1 -1
- package/dist/src/cli/commands/evolve.d.ts.map +1 -0
- package/dist/src/cli/commands/{improve-skill.js → evolve.js} +3 -3
- package/dist/src/cli/commands/evolve.js.map +1 -0
- package/dist/src/cli/commands/registry.d.ts.map +1 -1
- package/dist/src/cli/commands/registry.js +4 -22
- package/dist/src/cli/commands/registry.js.map +1 -1
- package/dist/src/cli/commands/{improve.d.ts → sample.d.ts} +1 -1
- package/dist/src/cli/commands/sample.d.ts.map +1 -0
- package/dist/src/cli/commands/{improve-samples.js → sample.js} +5 -4
- package/dist/src/cli/commands/sample.js.map +1 -0
- package/dist/src/cli/i18n-dict.d.ts +2 -4
- package/dist/src/cli/i18n-dict.d.ts.map +1 -1
- package/dist/src/cli/i18n-dict.js +165 -373
- package/dist/src/cli/i18n-dict.js.map +1 -1
- package/dist/src/cli/parse-run-config.d.ts +1 -1
- package/dist/src/cli/parse-run-config.js +1 -1
- package/dist/src/doctor/health/builtin-dimensions.d.ts +11 -0
- package/dist/src/doctor/health/builtin-dimensions.d.ts.map +1 -0
- package/dist/src/doctor/health/builtin-dimensions.js +94 -0
- package/dist/src/doctor/health/builtin-dimensions.js.map +1 -0
- package/dist/src/doctor/health/composer.d.ts +19 -0
- package/dist/src/doctor/health/composer.d.ts.map +1 -0
- package/dist/src/doctor/health/composer.js +289 -0
- package/dist/src/doctor/health/composer.js.map +1 -0
- package/dist/src/doctor/health/dimension-registry.d.ts +13 -0
- package/dist/src/doctor/health/dimension-registry.d.ts.map +1 -0
- package/dist/src/doctor/health/dimension-registry.js +28 -0
- package/dist/src/doctor/health/dimension-registry.js.map +1 -0
- package/dist/src/doctor/health/dimension-spec.d.ts +46 -0
- package/dist/src/doctor/health/dimension-spec.d.ts.map +1 -0
- package/dist/src/doctor/health/dimension-spec.js +12 -0
- package/dist/src/doctor/health/dimension-spec.js.map +1 -0
- package/dist/src/doctor/health/parser.d.ts +27 -0
- package/dist/src/doctor/health/parser.d.ts.map +1 -0
- package/dist/src/doctor/health/parser.js +190 -0
- package/dist/src/doctor/health/parser.js.map +1 -0
- package/dist/src/doctor/health/prompt-builder.d.ts +22 -0
- package/dist/src/doctor/health/prompt-builder.d.ts.map +1 -0
- package/dist/src/doctor/health/prompt-builder.js +162 -0
- package/dist/src/doctor/health/prompt-builder.js.map +1 -0
- package/dist/src/doctor/health/register.d.ts +13 -0
- package/dist/src/doctor/health/register.d.ts.map +1 -0
- package/dist/src/doctor/health/register.js +20 -0
- package/dist/src/doctor/health/register.js.map +1 -0
- package/dist/src/doctor/html-renderer.d.ts +20 -0
- package/dist/src/doctor/html-renderer.d.ts.map +1 -0
- package/dist/src/doctor/html-renderer.js +366 -0
- package/dist/src/doctor/html-renderer.js.map +1 -0
- package/dist/src/doctor/index.d.ts.map +1 -1
- package/dist/src/doctor/index.js +55 -6
- package/dist/src/doctor/index.js.map +1 -1
- package/dist/src/doctor/renderer.d.ts +4 -0
- package/dist/src/doctor/renderer.d.ts.map +1 -1
- package/dist/src/doctor/renderer.js +72 -18
- package/dist/src/doctor/renderer.js.map +1 -1
- package/dist/src/doctor/rules.d.ts +6 -5
- package/dist/src/doctor/rules.d.ts.map +1 -1
- package/dist/src/doctor/rules.js +4 -3
- package/dist/src/doctor/rules.js.map +1 -1
- package/dist/src/types/doctor.d.ts +41 -3
- package/dist/src/types/doctor.d.ts.map +1 -1
- package/dist/src/types/doctor.js +3 -0
- package/dist/src/types/doctor.js.map +1 -1
- package/dist/src/types/eval.d.ts +1 -1
- package/dist/src/types/report.d.ts +2 -2
- package/dist/src/types/report.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/src/cli/commands/eval-debias.d.ts +0 -2
- package/dist/src/cli/commands/eval-debias.d.ts.map +0 -1
- package/dist/src/cli/commands/eval-debias.js +0 -88
- package/dist/src/cli/commands/eval-debias.js.map +0 -1
- package/dist/src/cli/commands/export-diff.d.ts +0 -2
- package/dist/src/cli/commands/export-diff.d.ts.map +0 -1
- package/dist/src/cli/commands/export-diff.js +0 -177
- package/dist/src/cli/commands/export-diff.js.map +0 -1
- package/dist/src/cli/commands/export-saturation.d.ts +0 -2
- package/dist/src/cli/commands/export-saturation.d.ts.map +0 -1
- package/dist/src/cli/commands/export-saturation.js +0 -59
- package/dist/src/cli/commands/export-saturation.js.map +0 -1
- package/dist/src/cli/commands/export-verdict.d.ts +0 -2
- package/dist/src/cli/commands/export-verdict.d.ts.map +0 -1
- package/dist/src/cli/commands/export-verdict.js +0 -45
- package/dist/src/cli/commands/export-verdict.js.map +0 -1
- package/dist/src/cli/commands/export.d.ts.map +0 -1
- package/dist/src/cli/commands/export.js +0 -150
- package/dist/src/cli/commands/export.js.map +0 -1
- package/dist/src/cli/commands/improve-failures.d.ts +0 -2
- package/dist/src/cli/commands/improve-failures.d.ts.map +0 -1
- package/dist/src/cli/commands/improve-failures.js +0 -59
- package/dist/src/cli/commands/improve-failures.js.map +0 -1
- package/dist/src/cli/commands/improve-plan.d.ts +0 -2
- package/dist/src/cli/commands/improve-plan.d.ts.map +0 -1
- package/dist/src/cli/commands/improve-plan.js +0 -75
- package/dist/src/cli/commands/improve-plan.js.map +0 -1
- package/dist/src/cli/commands/improve-samples.d.ts +0 -2
- package/dist/src/cli/commands/improve-samples.d.ts.map +0 -1
- package/dist/src/cli/commands/improve-samples.js.map +0 -1
- package/dist/src/cli/commands/improve-skill.d.ts +0 -2
- package/dist/src/cli/commands/improve-skill.d.ts.map +0 -1
- package/dist/src/cli/commands/improve-skill.js.map +0 -1
- package/dist/src/cli/commands/improve.d.ts.map +0 -1
- package/dist/src/cli/commands/improve.js +0 -34
- package/dist/src/cli/commands/improve.js.map +0 -1
- package/dist/src/cli/coverage-renderer.d.ts +0 -15
- package/dist/src/cli/coverage-renderer.d.ts.map +0 -1
- package/dist/src/cli/coverage-renderer.js +0 -74
- package/dist/src/cli/coverage-renderer.js.map +0 -1
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM 输出解析:JSON 提取 + dim_id 派发 + 容错。
|
|
3
|
+
*
|
|
4
|
+
* 流程:
|
|
5
|
+
* 1. extractJson 从 LLM 文本(可能带寒暄/code fence)抽出顶层 JSON。
|
|
6
|
+
* 2. 按 dim_id 把 checklist 项派发到 Map<dimId, HealthDimensionResult>。
|
|
7
|
+
* 3. 缺失维度(LLM 漏报)塞 _missing=true 的 placeholder,composer 据此 status=skipped。
|
|
8
|
+
* 4. 不合法 dim_id(LLM 编了 registry 之外的)直接丢弃。
|
|
9
|
+
*
|
|
10
|
+
* dimension_level_count / finding_count_by_level 由调用方 / renderer 自己算
|
|
11
|
+
* (LLM 算术不可靠,prompt 已声明不输出这两字段)。
|
|
12
|
+
*/
|
|
13
|
+
import type { HealthDimensionResult, HealthDimensionSpec } from './dimension-spec.js';
|
|
14
|
+
/** 深度跟踪 brace,在 LLM 文本里找出顶层 JSON。多个候选时优先选含 ≥2 required key 的。 */
|
|
15
|
+
export declare function extractJson(text: string): string | null;
|
|
16
|
+
export interface HealthParseResult {
|
|
17
|
+
byDimId: Map<string, HealthDimensionResult>;
|
|
18
|
+
/** LLM 给的 overall(框架视情况覆盖)。 */
|
|
19
|
+
overall: '良好' | '部分缺陷' | '严重缺陷' | null;
|
|
20
|
+
topSuggestions: string[];
|
|
21
|
+
/** 原样保留 feature_points,塞进 composer 主结果 detail。 */
|
|
22
|
+
featurePoints: unknown[];
|
|
23
|
+
}
|
|
24
|
+
/** 从 cleaned JSON 字串(extractJson 的输出)派发到各维度。 */
|
|
25
|
+
export declare function parseHealthOutput(jsonText: string, dims: HealthDimensionSpec[]): HealthParseResult;
|
|
26
|
+
export declare function deriveOverallHealth(byDimId: Map<string, HealthDimensionResult>): '良好' | '部分缺陷' | '严重缺陷';
|
|
27
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../src/doctor/health/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EAIpB,MAAM,qBAAqB,CAAC;AAS7B,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoDvD;AA0BD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC5C,+BAA+B;IAC/B,OAAO,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,kDAAkD;IAClD,aAAa,EAAE,OAAO,EAAE,CAAC;CAC1B;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,mBAAmB,EAAE,GAC1B,iBAAiB,CAuDnB;AAYD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAWvG"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM 输出解析:JSON 提取 + dim_id 派发 + 容错。
|
|
3
|
+
*
|
|
4
|
+
* 流程:
|
|
5
|
+
* 1. extractJson 从 LLM 文本(可能带寒暄/code fence)抽出顶层 JSON。
|
|
6
|
+
* 2. 按 dim_id 把 checklist 项派发到 Map<dimId, HealthDimensionResult>。
|
|
7
|
+
* 3. 缺失维度(LLM 漏报)塞 _missing=true 的 placeholder,composer 据此 status=skipped。
|
|
8
|
+
* 4. 不合法 dim_id(LLM 编了 registry 之外的)直接丢弃。
|
|
9
|
+
*
|
|
10
|
+
* dimension_level_count / finding_count_by_level 由调用方 / renderer 自己算
|
|
11
|
+
* (LLM 算术不可靠,prompt 已声明不输出这两字段)。
|
|
12
|
+
*/
|
|
13
|
+
const REQUIRED_TOP_KEYS = new Set(['skill_name', 'checklist', 'summary']);
|
|
14
|
+
/** 深度跟踪 brace,在 LLM 文本里找出顶层 JSON。多个候选时优先选含 ≥2 required key 的。 */
|
|
15
|
+
export function extractJson(text) {
|
|
16
|
+
if (!text)
|
|
17
|
+
return null;
|
|
18
|
+
const candidates = [];
|
|
19
|
+
let pos = 0;
|
|
20
|
+
while (true) {
|
|
21
|
+
const start = text.indexOf('{', pos);
|
|
22
|
+
if (start === -1)
|
|
23
|
+
break;
|
|
24
|
+
let depth = 0;
|
|
25
|
+
let inString = false;
|
|
26
|
+
let escape = false;
|
|
27
|
+
let end = -1;
|
|
28
|
+
for (let i = start; i < text.length; i += 1) {
|
|
29
|
+
const c = text[i];
|
|
30
|
+
if (escape) {
|
|
31
|
+
escape = false;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (inString) {
|
|
35
|
+
if (c === '\\')
|
|
36
|
+
escape = true;
|
|
37
|
+
else if (c === '"')
|
|
38
|
+
inString = false;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (c === '"')
|
|
42
|
+
inString = true;
|
|
43
|
+
else if (c === '{')
|
|
44
|
+
depth += 1;
|
|
45
|
+
else if (c === '}') {
|
|
46
|
+
depth -= 1;
|
|
47
|
+
if (depth === 0) {
|
|
48
|
+
end = i;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (end === -1)
|
|
54
|
+
break;
|
|
55
|
+
const cand = text.slice(start, end + 1);
|
|
56
|
+
try {
|
|
57
|
+
const obj = JSON.parse(cand);
|
|
58
|
+
if (obj && typeof obj === 'object' && !Array.isArray(obj)) {
|
|
59
|
+
candidates.push({ text: cand, obj: obj });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// skip non-parseable; brace inside string is the common reason
|
|
64
|
+
}
|
|
65
|
+
pos = start + 1;
|
|
66
|
+
}
|
|
67
|
+
if (candidates.length === 0)
|
|
68
|
+
return null;
|
|
69
|
+
const strong = candidates.filter((c) => {
|
|
70
|
+
let hits = 0;
|
|
71
|
+
for (const k of REQUIRED_TOP_KEYS)
|
|
72
|
+
if (k in c.obj)
|
|
73
|
+
hits += 1;
|
|
74
|
+
return hits >= 2;
|
|
75
|
+
});
|
|
76
|
+
if (strong.length > 0) {
|
|
77
|
+
strong.sort((a, b) => b.text.length - a.text.length);
|
|
78
|
+
return strong[0].text;
|
|
79
|
+
}
|
|
80
|
+
const keyed = candidates.filter((c) => 'skill_name' in c.obj);
|
|
81
|
+
const pool = keyed.length > 0 ? keyed : candidates;
|
|
82
|
+
pool.sort((a, b) => b.text.length - a.text.length);
|
|
83
|
+
return pool[0].text;
|
|
84
|
+
}
|
|
85
|
+
// ---------------------------------------------------------------------------
|
|
86
|
+
// Type guards & dispatch
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
function isDimLevel(s) {
|
|
89
|
+
return s === '健康' || s === '亚健康' || s === '不健康' || s === '不适用';
|
|
90
|
+
}
|
|
91
|
+
function isFindingLevel(s) {
|
|
92
|
+
return s === '错误' || s === '警告' || s === '建议';
|
|
93
|
+
}
|
|
94
|
+
function asFinding(raw) {
|
|
95
|
+
if (!raw || typeof raw !== 'object')
|
|
96
|
+
return null;
|
|
97
|
+
const r = raw;
|
|
98
|
+
if (!isFindingLevel(r.level))
|
|
99
|
+
return null;
|
|
100
|
+
return {
|
|
101
|
+
level: r.level,
|
|
102
|
+
subtype: typeof r.subtype === 'string' ? r.subtype : '',
|
|
103
|
+
evidence: typeof r.evidence === 'string' ? r.evidence : '',
|
|
104
|
+
description: typeof r.description === 'string' ? r.description : '',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** 从 cleaned JSON 字串(extractJson 的输出)派发到各维度。 */
|
|
108
|
+
export function parseHealthOutput(jsonText, dims) {
|
|
109
|
+
let parsed;
|
|
110
|
+
try {
|
|
111
|
+
parsed = JSON.parse(jsonText);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
parsed = {};
|
|
115
|
+
}
|
|
116
|
+
const validIds = new Set(dims.map((d) => d.id));
|
|
117
|
+
const byDimId = new Map();
|
|
118
|
+
const checklist = Array.isArray(parsed.checklist) ? parsed.checklist : [];
|
|
119
|
+
for (const itemRaw of checklist) {
|
|
120
|
+
if (!itemRaw || typeof itemRaw !== 'object')
|
|
121
|
+
continue;
|
|
122
|
+
const item = itemRaw;
|
|
123
|
+
const dimId = item.dim_id;
|
|
124
|
+
if (typeof dimId !== 'string' || !validIds.has(dimId))
|
|
125
|
+
continue; // 容错:丢弃未注册 id
|
|
126
|
+
if (byDimId.has(dimId))
|
|
127
|
+
continue; // 容错:重复 id 取首条
|
|
128
|
+
const findingsRaw = Array.isArray(item.findings) ? item.findings : [];
|
|
129
|
+
const findings = [];
|
|
130
|
+
for (const fRaw of findingsRaw) {
|
|
131
|
+
const f = asFinding(fRaw);
|
|
132
|
+
if (f)
|
|
133
|
+
findings.push(f);
|
|
134
|
+
}
|
|
135
|
+
const suggestions = Array.isArray(item.suggestions)
|
|
136
|
+
? item.suggestions.filter((s) => typeof s === 'string')
|
|
137
|
+
: [];
|
|
138
|
+
const level = isDimLevel(item.level)
|
|
139
|
+
? item.level
|
|
140
|
+
: deriveDimLevel(findings);
|
|
141
|
+
byDimId.set(dimId, { level, findings, suggestions });
|
|
142
|
+
}
|
|
143
|
+
// 漏报维度填 placeholder
|
|
144
|
+
for (const dim of dims) {
|
|
145
|
+
if (!byDimId.has(dim.id)) {
|
|
146
|
+
byDimId.set(dim.id, { level: '不适用', findings: [], suggestions: [], _missing: true });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const summaryRaw = (parsed.summary && typeof parsed.summary === 'object'
|
|
150
|
+
? parsed.summary
|
|
151
|
+
: {});
|
|
152
|
+
const validOveralls = new Set(['良好', '部分缺陷', '严重缺陷']);
|
|
153
|
+
const overallRaw = summaryRaw.overall_health;
|
|
154
|
+
const overall = typeof overallRaw === 'string' && validOveralls.has(overallRaw)
|
|
155
|
+
? overallRaw
|
|
156
|
+
: null;
|
|
157
|
+
const topSuggestions = Array.isArray(summaryRaw.top_suggestions)
|
|
158
|
+
? summaryRaw.top_suggestions.filter((s) => typeof s === 'string')
|
|
159
|
+
: [];
|
|
160
|
+
const featurePoints = Array.isArray(parsed.feature_points) ? parsed.feature_points : [];
|
|
161
|
+
return { byDimId, overall, topSuggestions, featurePoints };
|
|
162
|
+
}
|
|
163
|
+
// ---------------------------------------------------------------------------
|
|
164
|
+
// Aggregation helpers
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
function deriveDimLevel(findings) {
|
|
167
|
+
if (findings.some((f) => f.level === '错误'))
|
|
168
|
+
return '不健康';
|
|
169
|
+
if (findings.length > 0)
|
|
170
|
+
return '亚健康';
|
|
171
|
+
return '健康';
|
|
172
|
+
}
|
|
173
|
+
export function deriveOverallHealth(byDimId) {
|
|
174
|
+
let hasUnhealthy = false;
|
|
175
|
+
let hasSubhealthy = false;
|
|
176
|
+
for (const r of byDimId.values()) {
|
|
177
|
+
if (r._missing)
|
|
178
|
+
continue; // 漏报不算
|
|
179
|
+
if (r.level === '不健康')
|
|
180
|
+
hasUnhealthy = true;
|
|
181
|
+
else if (r.level === '亚健康')
|
|
182
|
+
hasSubhealthy = true;
|
|
183
|
+
}
|
|
184
|
+
if (hasUnhealthy)
|
|
185
|
+
return '严重缺陷';
|
|
186
|
+
if (hasSubhealthy)
|
|
187
|
+
return '部分缺陷';
|
|
188
|
+
return '良好';
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../src/doctor/health/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 健康度体检 prompt 拼装器。
|
|
3
|
+
*
|
|
4
|
+
* 4 个区块:
|
|
5
|
+
* Block 1: 任务说明 + skill 输入(固定)
|
|
6
|
+
* Block 2: 检查维度章节(动态:遍历 dims,自动加 ## N. 标题 + (id: ...))
|
|
7
|
+
* Block 3: 通用规则(同根因合并 / Finding level / 维度 level / overall_health)
|
|
8
|
+
* Block 4: JSON schema(半动态:dim_id 枚举 + checklist 项数 = dims.length)
|
|
9
|
+
*
|
|
10
|
+
* 关键约束:LLM 用 dim_id(英文)在输出中标识维度,而不是中文 displayName —
|
|
11
|
+
* displayName 翻译/重命名时不会让 parser 崩。
|
|
12
|
+
*/
|
|
13
|
+
import type { HealthDimensionSpec } from './dimension-spec.js';
|
|
14
|
+
export interface PromptInput {
|
|
15
|
+
skillName: string;
|
|
16
|
+
skillContent: string;
|
|
17
|
+
skillRoot: string | null;
|
|
18
|
+
subFiles: string[];
|
|
19
|
+
siblingSkills: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare function buildHealthPrompt(input: PromptInput, dims: HealthDimensionSpec[]): string;
|
|
22
|
+
//# sourceMappingURL=prompt-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../../../src/doctor/health/prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAOzF"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 健康度体检 prompt 拼装器。
|
|
3
|
+
*
|
|
4
|
+
* 4 个区块:
|
|
5
|
+
* Block 1: 任务说明 + skill 输入(固定)
|
|
6
|
+
* Block 2: 检查维度章节(动态:遍历 dims,自动加 ## N. 标题 + (id: ...))
|
|
7
|
+
* Block 3: 通用规则(同根因合并 / Finding level / 维度 level / overall_health)
|
|
8
|
+
* Block 4: JSON schema(半动态:dim_id 枚举 + checklist 项数 = dims.length)
|
|
9
|
+
*
|
|
10
|
+
* 关键约束:LLM 用 dim_id(英文)在输出中标识维度,而不是中文 displayName —
|
|
11
|
+
* displayName 翻译/重命名时不会让 parser 崩。
|
|
12
|
+
*/
|
|
13
|
+
export function buildHealthPrompt(input, dims) {
|
|
14
|
+
return [
|
|
15
|
+
renderBlock1Header(input),
|
|
16
|
+
renderBlock2Dimensions(dims),
|
|
17
|
+
renderBlock3CommonRules(),
|
|
18
|
+
renderBlock4JsonSchema(input.skillName, dims),
|
|
19
|
+
].join('\n\n');
|
|
20
|
+
}
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Block 1: 任务 + skill 输入
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
function renderBlock1Header(input) {
|
|
25
|
+
const { skillName, skillContent, skillRoot, subFiles, siblingSkills } = input;
|
|
26
|
+
const siblingList = siblingSkills.length > 0
|
|
27
|
+
? siblingSkills.map((s) => `\`${s}\``).join(', ')
|
|
28
|
+
: '(none)';
|
|
29
|
+
const subFilesList = subFiles.length > 0
|
|
30
|
+
? subFiles.map((f) => `- ${f}`).join('\n')
|
|
31
|
+
: '(no sub-files; pure SKILL.md skill)';
|
|
32
|
+
const skillRootHint = skillRoot
|
|
33
|
+
? `skill 根目录: \`${skillRoot}\`(子文件需要时用 Read 工具自取)`
|
|
34
|
+
: 'skill 是单文件 .md;没有子目录可 Read。';
|
|
35
|
+
return `你正在对 \`${skillName}\` 这个 skill 做**健康度体检**——按下面注册的所有维度逐一检查,给出 level、findings、改进建议。
|
|
36
|
+
|
|
37
|
+
# 输入
|
|
38
|
+
|
|
39
|
+
- skill 名: \`${skillName}\`
|
|
40
|
+
- ${skillRootHint}
|
|
41
|
+
- 子文件清单(仅参考,需要时用 Read 工具按路径自取):
|
|
42
|
+
${subFilesList}
|
|
43
|
+
|
|
44
|
+
# 系统 skill 列表(跨 skill 引用判断用)
|
|
45
|
+
|
|
46
|
+
${siblingList}
|
|
47
|
+
|
|
48
|
+
## SKILL.md 内容(已 inline,无需再 Read)
|
|
49
|
+
|
|
50
|
+
\`\`\`markdown
|
|
51
|
+
${skillContent}
|
|
52
|
+
\`\`\``;
|
|
53
|
+
}
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Block 2: 维度章节
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
function renderBlock2Dimensions(dims) {
|
|
58
|
+
const sections = dims.map((dim, idx) => {
|
|
59
|
+
const num = idx + 1;
|
|
60
|
+
return `## ${num}. ${dim.displayName} (id: \`${dim.id}\`)
|
|
61
|
+
${dim.promptSection.trim()}`;
|
|
62
|
+
});
|
|
63
|
+
return `# 检查维度
|
|
64
|
+
|
|
65
|
+
${sections.join('\n\n')}`;
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Block 3: 通用规则
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
function renderBlock3CommonRules() {
|
|
71
|
+
return `# 同根因合并(去重规则)
|
|
72
|
+
|
|
73
|
+
多个 finding 如果**根因相同 + 修复方式相同**,必须合并成**一条** finding(可以跨维度合并)。在 \`evidence\` 字段里把所有出现位置列全(用 \` ; \` 分隔),\`description\` 里点明"在 N 处出现"。
|
|
74
|
+
|
|
75
|
+
合并后,该 finding 的 \`level\` 取所有出现位置中**最严重的一个**。\`suggestions\` 给统一修法。
|
|
76
|
+
|
|
77
|
+
# Finding level 判定
|
|
78
|
+
|
|
79
|
+
- \`错误\`:**必须修**。包括:
|
|
80
|
+
- 在**常见用户环境 / 默认安装方式 / 不同版本号下直接跑不通**(不只是"在文档作者机子上跑不通")
|
|
81
|
+
- 硬编码绝对路径含具体版本号 / 用户名 → 换环境必失败
|
|
82
|
+
- 引用了不存在的脚本 / CLI / MCP 工具 / skill
|
|
83
|
+
- 不可逆操作没有人工确认
|
|
84
|
+
- 指令严重歧义会让 LLM 在多次执行中跑出截然不同结果
|
|
85
|
+
- \`警告\`:**应该修**。规范不符 / 可读性明显差 / 误触发风险但不会直接挂掉
|
|
86
|
+
- \`建议\`:锦上添花
|
|
87
|
+
|
|
88
|
+
# 维度 level 派生规则
|
|
89
|
+
|
|
90
|
+
- \`健康\`:0 个 finding
|
|
91
|
+
- \`亚健康\`:有警告 / 建议但无错误
|
|
92
|
+
- \`不健康\`:至少 1 个错误
|
|
93
|
+
- \`不适用\`:该维度对本 skill 无意义(谨慎使用,不要拿来回避检查)
|
|
94
|
+
|
|
95
|
+
# overall_health
|
|
96
|
+
|
|
97
|
+
- \`良好\`:所有维度都是 \`健康\` 或 \`不适用\`
|
|
98
|
+
- \`部分缺陷\`:有 \`亚健康\` 但无 \`不健康\`
|
|
99
|
+
- \`严重缺陷\`:任一维度 \`不健康\``;
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Block 4: JSON schema
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
function renderBlock4JsonSchema(skillName, dims) {
|
|
105
|
+
const dimIdEnum = dims.map((d) => `"${d.id}"`).join(' | ');
|
|
106
|
+
const dimIdList = dims.map((d) => `\`${d.id}\``).join(', ');
|
|
107
|
+
return `# 输出 JSON schema
|
|
108
|
+
|
|
109
|
+
输出**必须是单一合法 JSON 对象**。第一字符 \`{\`,最后 \`}\`,**不要**用 \`\`\`json\`\`\` 围栏,**不要**寒暄。
|
|
110
|
+
|
|
111
|
+
{
|
|
112
|
+
"skill_name": "${skillName}",
|
|
113
|
+
"feature_points": [
|
|
114
|
+
{
|
|
115
|
+
"name": "<功能点名>",
|
|
116
|
+
"description": "<1-2 行>",
|
|
117
|
+
"simulation": [
|
|
118
|
+
{
|
|
119
|
+
"step": 1,
|
|
120
|
+
"action": "<这一步做什么>",
|
|
121
|
+
"input": "<参数>",
|
|
122
|
+
"simulated_output": "<假设返回值,**不真跑**>",
|
|
123
|
+
"derivable_from_doc": true,
|
|
124
|
+
"note": "<指令模糊处>"
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
"checklist": [
|
|
130
|
+
{
|
|
131
|
+
"dim_id": ${dimIdEnum},
|
|
132
|
+
"level": "健康 | 亚健康 | 不健康 | 不适用",
|
|
133
|
+
"findings": [
|
|
134
|
+
{
|
|
135
|
+
"level": "错误 | 警告 | 建议",
|
|
136
|
+
"subtype": "<仅 \`security\` 维度需填:不可逆操作 | 凭据硬编码 | 个人化耦合;其它维度留空字符串>",
|
|
137
|
+
"evidence": "<具体引用:SKILL.md L<行号> / 章节标题 / 文件名 / 功能点 X 第 Y 步>",
|
|
138
|
+
"description": "<一句话讲清问题>"
|
|
139
|
+
}
|
|
140
|
+
],
|
|
141
|
+
"suggestions": ["<可执行的改进动作>"]
|
|
142
|
+
}
|
|
143
|
+
],
|
|
144
|
+
"summary": {
|
|
145
|
+
"overall_health": "良好 | 部分缺陷 | 严重缺陷",
|
|
146
|
+
"top_suggestions": ["<整 skill 视角下最该先改的 3 条,按优先级从高到低>"]
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
# 字段约束
|
|
151
|
+
|
|
152
|
+
- \`checklist\` 必须**恰好包含 ${dims.length} 项**,\`dim_id\` 必须是以下之一,**每个 id 出现且仅出现一次**:
|
|
153
|
+
${dimIdList}
|
|
154
|
+
- \`level\` / \`subtype\` 字段值用精确中文字符串,不允许英文或别名
|
|
155
|
+
- \`evidence\` 必须有具体引用,不能笼统说"全文"
|
|
156
|
+
- 字符串里的 skill / 文件 / 命令名用反引号 \`xxx\` 包裹
|
|
157
|
+
- **不要**冒虚假 finding,宁可少报也不要把"看起来可能有问题"硬塞进来
|
|
158
|
+
- 不要输出 \`dimension_level_count\` / \`finding_count_by_level\` 字段(框架自己重算)
|
|
159
|
+
|
|
160
|
+
读 SKILL.md(已 inline)→ 模拟执行 → 出 JSON。`;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=prompt-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../../../src/doctor/health/prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAYH,MAAM,UAAU,iBAAiB,CAAC,KAAkB,EAAE,IAA2B;IAC/E,OAAO;QACL,kBAAkB,CAAC,KAAK,CAAC;QACzB,sBAAsB,CAAC,IAAI,CAAC;QAC5B,uBAAuB,EAAE;QACzB,sBAAsB,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC;KAC9C,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,SAAS,kBAAkB,CAAC,KAAkB;IAC5C,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;IAC9E,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC;QAC1C,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACjD,CAAC,CAAC,QAAQ,CAAC;IACb,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;QACtC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1C,CAAC,CAAC,qCAAqC,CAAC;IAC1C,MAAM,aAAa,GAAG,SAAS;QAC7B,CAAC,CAAC,gBAAgB,SAAS,uBAAuB;QAClD,CAAC,CAAC,6BAA6B,CAAC;IAElC,OAAO,UAAU,SAAS;;;;eAIb,SAAS;IACpB,aAAa;;EAEf,YAAY;;;;EAIZ,WAAW;;;;;EAKX,YAAY;OACP,CAAC;AACR,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,SAAS,sBAAsB,CAAC,IAA2B;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QACpB,OAAO,MAAM,GAAG,KAAK,GAAG,CAAC,WAAW,WAAW,GAAG,CAAC,EAAE;EACvD,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,OAAO;;EAEP,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,SAAS,uBAAuB;IAC9B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA4Be,CAAC;AACzB,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAS,sBAAsB,CAAC,SAAiB,EAAE,IAA2B;IAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5D,OAAO;;;;;mBAKU,SAAS;;;;;;;;;;;;;;;;;;;kBAmBV,SAAS;;;;;;;;;;;;;;;;;;;;;2BAqBA,IAAI,CAAC,MAAM;IAClC,SAAS;;;;;;;qCAOwB,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 副作用入口:把 7 个内置维度注册到 dimensionRegistry,把 composer rule
|
|
3
|
+
* 注册到 doctor customRules。
|
|
4
|
+
*
|
|
5
|
+
* CLI doctor.ts 默认动态 import 本文件 → 副作用一次性完成。
|
|
6
|
+
* `--static-only` 会在 CLI 层过滤掉 composer rule,不触发 LLM 审计。
|
|
7
|
+
* 测试 import 各 module 的具名 export 不会触发本文件,保持 registry 干净。
|
|
8
|
+
*
|
|
9
|
+
* 用户自定义维度:在自己的代码里 `registerHealthDimension(spec)`,只要在
|
|
10
|
+
* composer 跑之前注册即可(eg. 在 omk 配置 / plugin 入口里)。
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../src/doctor/health/register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 副作用入口:把 7 个内置维度注册到 dimensionRegistry,把 composer rule
|
|
3
|
+
* 注册到 doctor customRules。
|
|
4
|
+
*
|
|
5
|
+
* CLI doctor.ts 默认动态 import 本文件 → 副作用一次性完成。
|
|
6
|
+
* `--static-only` 会在 CLI 层过滤掉 composer rule,不触发 LLM 审计。
|
|
7
|
+
* 测试 import 各 module 的具名 export 不会触发本文件,保持 registry 干净。
|
|
8
|
+
*
|
|
9
|
+
* 用户自定义维度:在自己的代码里 `registerHealthDimension(spec)`,只要在
|
|
10
|
+
* composer 跑之前注册即可(eg. 在 omk 配置 / plugin 入口里)。
|
|
11
|
+
*/
|
|
12
|
+
import { registerRule } from '../rules.js';
|
|
13
|
+
import { BUILTIN_HEALTH_DIMENSIONS } from './builtin-dimensions.js';
|
|
14
|
+
import { registerHealthDimension } from './dimension-registry.js';
|
|
15
|
+
import { makeSkillHealthComposer } from './composer.js';
|
|
16
|
+
for (const spec of BUILTIN_HEALTH_DIMENSIONS) {
|
|
17
|
+
registerHealthDimension(spec);
|
|
18
|
+
}
|
|
19
|
+
registerRule(makeSkillHealthComposer());
|
|
20
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../../../src/doctor/health/register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD,KAAK,MAAM,IAAI,IAAI,yBAAyB,EAAE,CAAC;IAC7C,uBAAuB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AACD,YAAY,CAAC,uBAAuB,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* doctor HTML 报告渲染器。
|
|
3
|
+
*
|
|
4
|
+
* 输出 single-file HTML(JSON inline,CSS/JS 内嵌,无外部依赖),双击可看,
|
|
5
|
+
* 不需 http server。专为 LLM 健康度审计报告设计 — 重点展示 composer group 内的
|
|
6
|
+
* 维度结果,但也兼容显示静态 rule 段。
|
|
7
|
+
*
|
|
8
|
+
* 排序约定:
|
|
9
|
+
* - 维度卡片按 fail → warn → pass → skipped(STATUS_RANK)排
|
|
10
|
+
* - 每个维度卡片内的 finding 按 错误 → 警告 → 建议 排
|
|
11
|
+
* - skill 级别按 outcome (failed / warnings_only / passed) 排
|
|
12
|
+
*
|
|
13
|
+
* 前端交互:
|
|
14
|
+
* - 顶部 filter pills:全部 / 仅失败 / 仅警告 / 仅通过 — 切换时 dim card 显隐
|
|
15
|
+
* - 维度卡片头部点击折叠/展开 findings 区
|
|
16
|
+
*/
|
|
17
|
+
import type { DoctorReport } from '../types/index.js';
|
|
18
|
+
import { type CliLang } from '../cli/i18n.js';
|
|
19
|
+
export declare function renderDoctorReportHtml(report: DoctorReport, lang?: CliLang): string;
|
|
20
|
+
//# sourceMappingURL=html-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-renderer.d.ts","sourceRoot":"","sources":["../../../src/doctor/html-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAQ,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAsVpD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,GAAE,OAAc,GAAG,MAAM,CA0BzF"}
|