oh-my-knowledge 0.26.0 → 0.27.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.
Files changed (152) hide show
  1. package/README.md +109 -347
  2. package/README.zh.md +146 -376
  3. package/dist/src/analysis/report-diagnostics.d.ts +1 -1
  4. package/dist/src/analysis/report-diagnostics.js +1 -1
  5. package/dist/src/analysis/sample-diagnostics.d.ts +2 -2
  6. package/dist/src/analysis/sample-diagnostics.js +2 -2
  7. package/dist/src/authoring/generator.d.ts.map +1 -1
  8. package/dist/src/authoring/generator.js +9 -8
  9. package/dist/src/authoring/generator.js.map +1 -1
  10. package/dist/src/cli/cli-exit.d.ts +15 -0
  11. package/dist/src/cli/cli-exit.d.ts.map +1 -0
  12. package/dist/src/cli/cli-exit.js +19 -0
  13. package/dist/src/cli/cli-exit.js.map +1 -0
  14. package/dist/src/cli/commands/_shared.d.ts +12 -0
  15. package/dist/src/cli/commands/_shared.d.ts.map +1 -0
  16. package/dist/src/cli/commands/_shared.js +26 -0
  17. package/dist/src/cli/commands/_shared.js.map +1 -0
  18. package/dist/src/cli/commands/doctor.d.ts +2 -0
  19. package/dist/src/cli/commands/doctor.d.ts.map +1 -0
  20. package/dist/src/cli/commands/doctor.js +137 -0
  21. package/dist/src/cli/commands/doctor.js.map +1 -0
  22. package/dist/src/cli/commands/eval-debias.d.ts +2 -0
  23. package/dist/src/cli/commands/eval-debias.d.ts.map +1 -0
  24. package/dist/src/cli/commands/eval-debias.js +88 -0
  25. package/dist/src/cli/commands/eval-debias.js.map +1 -0
  26. package/dist/src/cli/commands/eval-gold.d.ts +2 -0
  27. package/dist/src/cli/commands/eval-gold.d.ts.map +1 -0
  28. package/dist/src/cli/commands/eval-gold.js +137 -0
  29. package/dist/src/cli/commands/eval-gold.js.map +1 -0
  30. package/dist/src/cli/commands/eval-runner.d.ts +2 -0
  31. package/dist/src/cli/commands/eval-runner.d.ts.map +1 -0
  32. package/dist/src/cli/commands/eval-runner.js +299 -0
  33. package/dist/src/cli/commands/eval-runner.js.map +1 -0
  34. package/dist/src/cli/commands/eval.d.ts +2 -0
  35. package/dist/src/cli/commands/eval.d.ts.map +1 -0
  36. package/dist/src/cli/commands/eval.js +16 -0
  37. package/dist/src/cli/commands/eval.js.map +1 -0
  38. package/dist/src/cli/commands/export-diff.d.ts +2 -0
  39. package/dist/src/cli/commands/export-diff.d.ts.map +1 -0
  40. package/dist/src/cli/commands/export-diff.js +177 -0
  41. package/dist/src/cli/commands/export-diff.js.map +1 -0
  42. package/dist/src/cli/commands/export-saturation.d.ts +2 -0
  43. package/dist/src/cli/commands/export-saturation.d.ts.map +1 -0
  44. package/dist/src/cli/commands/export-saturation.js +59 -0
  45. package/dist/src/cli/commands/export-saturation.js.map +1 -0
  46. package/dist/src/cli/commands/export-verdict.d.ts +2 -0
  47. package/dist/src/cli/commands/export-verdict.d.ts.map +1 -0
  48. package/dist/src/cli/commands/export-verdict.js +45 -0
  49. package/dist/src/cli/commands/export-verdict.js.map +1 -0
  50. package/dist/src/cli/commands/export.d.ts +2 -0
  51. package/dist/src/cli/commands/export.d.ts.map +1 -0
  52. package/dist/src/cli/commands/export.js +150 -0
  53. package/dist/src/cli/commands/export.js.map +1 -0
  54. package/dist/src/cli/commands/improve-failures.d.ts +2 -0
  55. package/dist/src/cli/commands/improve-failures.d.ts.map +1 -0
  56. package/dist/src/cli/commands/improve-failures.js +59 -0
  57. package/dist/src/cli/commands/improve-failures.js.map +1 -0
  58. package/dist/src/cli/commands/improve-plan.d.ts +2 -0
  59. package/dist/src/cli/commands/improve-plan.d.ts.map +1 -0
  60. package/dist/src/cli/commands/improve-plan.js +75 -0
  61. package/dist/src/cli/commands/improve-plan.js.map +1 -0
  62. package/dist/src/cli/commands/improve-samples.d.ts +2 -0
  63. package/dist/src/cli/commands/improve-samples.d.ts.map +1 -0
  64. package/dist/src/cli/commands/improve-samples.js +120 -0
  65. package/dist/src/cli/commands/improve-samples.js.map +1 -0
  66. package/dist/src/cli/commands/improve-skill.d.ts +2 -0
  67. package/dist/src/cli/commands/improve-skill.d.ts.map +1 -0
  68. package/dist/src/cli/commands/improve-skill.js +115 -0
  69. package/dist/src/cli/commands/improve-skill.js.map +1 -0
  70. package/dist/src/cli/commands/improve.d.ts +2 -0
  71. package/dist/src/cli/commands/improve.d.ts.map +1 -0
  72. package/dist/src/cli/commands/improve.js +34 -0
  73. package/dist/src/cli/commands/improve.js.map +1 -0
  74. package/dist/src/cli/commands/init.d.ts +2 -0
  75. package/dist/src/cli/commands/init.d.ts.map +1 -0
  76. package/dist/src/cli/commands/init.js +110 -0
  77. package/dist/src/cli/commands/init.js.map +1 -0
  78. package/dist/src/cli/commands/observe.d.ts +2 -0
  79. package/dist/src/cli/commands/observe.d.ts.map +1 -0
  80. package/dist/src/cli/commands/observe.js +77 -0
  81. package/dist/src/cli/commands/observe.js.map +1 -0
  82. package/dist/src/cli/commands/registry.d.ts +11 -0
  83. package/dist/src/cli/commands/registry.d.ts.map +1 -0
  84. package/dist/src/cli/commands/registry.js +42 -0
  85. package/dist/src/cli/commands/registry.js.map +1 -0
  86. package/dist/src/cli/commands/studio.d.ts +2 -0
  87. package/dist/src/cli/commands/studio.d.ts.map +1 -0
  88. package/dist/src/cli/commands/studio.js +76 -0
  89. package/dist/src/cli/commands/studio.js.map +1 -0
  90. package/dist/src/cli/coverage-renderer.d.ts +1 -1
  91. package/dist/src/cli/coverage-renderer.js +1 -1
  92. package/dist/src/cli/i18n-dict.d.ts +4 -4
  93. package/dist/src/cli/i18n-dict.d.ts.map +1 -1
  94. package/dist/src/cli/i18n-dict.js +558 -564
  95. package/dist/src/cli/i18n-dict.js.map +1 -1
  96. package/dist/src/cli/index.js +43 -1516
  97. package/dist/src/cli/index.js.map +1 -1
  98. package/dist/src/cli/parse-run-config.d.ts +3 -4
  99. package/dist/src/cli/parse-run-config.d.ts.map +1 -1
  100. package/dist/src/cli/parse-run-config.js +5 -5
  101. package/dist/src/cli/parse-run-config.js.map +1 -1
  102. package/dist/src/cli/parse-strict.d.ts +0 -13
  103. package/dist/src/cli/parse-strict.d.ts.map +1 -1
  104. package/dist/src/cli/parse-strict.js +2 -1
  105. package/dist/src/cli/parse-strict.js.map +1 -1
  106. package/dist/src/doctor/index.d.ts +1 -1
  107. package/dist/src/doctor/index.js +2 -2
  108. package/dist/src/doctor/index.js.map +1 -1
  109. package/dist/src/doctor/preflight.d.ts +2 -2
  110. package/dist/src/doctor/preflight.js +2 -2
  111. package/dist/src/eval-core/fact-checker.js +1 -1
  112. package/dist/src/eval-core/fact-checker.js.map +1 -1
  113. package/dist/src/eval-core/layer-gates.d.ts +1 -1
  114. package/dist/src/eval-core/layer-gates.js +1 -1
  115. package/dist/src/eval-core/verdict.d.ts +4 -4
  116. package/dist/src/eval-core/verdict.d.ts.map +1 -1
  117. package/dist/src/eval-core/verdict.js +2 -2
  118. package/dist/src/eval-workflows/batch-evaluation-workflow.d.ts +15 -2
  119. package/dist/src/eval-workflows/batch-evaluation-workflow.d.ts.map +1 -1
  120. package/dist/src/eval-workflows/batch-evaluation-workflow.js +13 -2
  121. package/dist/src/eval-workflows/batch-evaluation-workflow.js.map +1 -1
  122. package/dist/src/eval-workflows/evaluation-pipeline.d.ts +6 -3
  123. package/dist/src/eval-workflows/evaluation-pipeline.d.ts.map +1 -1
  124. package/dist/src/eval-workflows/evaluation-pipeline.js +10 -9
  125. package/dist/src/eval-workflows/evaluation-pipeline.js.map +1 -1
  126. package/dist/src/eval-workflows/run-evaluation.d.ts +1 -1
  127. package/dist/src/eval-workflows/run-evaluation.d.ts.map +1 -1
  128. package/dist/src/eval-workflows/run-evaluation.js +13 -6
  129. package/dist/src/eval-workflows/run-evaluation.js.map +1 -1
  130. package/dist/src/executors/script.d.ts.map +1 -1
  131. package/dist/src/executors/script.js +16 -3
  132. package/dist/src/executors/script.js.map +1 -1
  133. package/dist/src/grading/debias-validate.d.ts +2 -2
  134. package/dist/src/grading/debias-validate.js +2 -2
  135. package/dist/src/grading/gold-cli.d.ts +2 -5
  136. package/dist/src/grading/gold-cli.d.ts.map +1 -1
  137. package/dist/src/grading/gold-cli.js +4 -8
  138. package/dist/src/grading/gold-cli.js.map +1 -1
  139. package/dist/src/grading/judge.d.ts +1 -1
  140. package/dist/src/renderer/html-renderer.js +1 -1
  141. package/dist/src/renderer/layout.js +5 -5
  142. package/dist/src/renderer/layout.js.map +1 -1
  143. package/dist/src/renderer/skill-health-renderer.d.ts +1 -1
  144. package/dist/src/renderer/skill-health-renderer.js +1 -1
  145. package/dist/src/renderer/summary.js +8 -8
  146. package/dist/src/server/report-server.d.ts.map +1 -1
  147. package/dist/src/server/report-server.js +8 -7
  148. package/dist/src/server/report-server.js.map +1 -1
  149. package/dist/src/types/doctor.d.ts +3 -3
  150. package/dist/src/types/eval.d.ts +1 -1
  151. package/dist/src/types/report.d.ts +1 -1
  152. package/package.json +1 -1
@@ -0,0 +1,59 @@
1
+ import { resolve } from 'node:path';
2
+ import { CliExit } from '../cli-exit.js';
3
+ import { langFromArgv } from '../i18n.js';
4
+ import { COMMON_OPTIONS, DEFAULT_REPORTS_DIR } from '../parse-run-config.js';
5
+ import { parseArgsStrictOrExit } from '../parse-strict.js';
6
+ import { requireEvaluationReport } from './_shared.js';
7
+ export async function execute(argv) {
8
+ const lang = langFromArgv(argv);
9
+ const reportId = argv[0];
10
+ if (!reportId) {
11
+ console.log(lang === 'zh'
12
+ ? '用法:omk export saturation <report-id> [--variant <name>]'
13
+ : 'Usage: omk export saturation <report-id> [--variant <name>]');
14
+ throw new CliExit(1);
15
+ }
16
+ const { values } = parseArgsStrictOrExit({
17
+ args: argv.slice(1),
18
+ options: {
19
+ ...COMMON_OPTIONS,
20
+ 'reports-dir': { type: 'string', default: DEFAULT_REPORTS_DIR },
21
+ variant: { type: 'string' },
22
+ },
23
+ });
24
+ const { createFileStore } = await import('../../server/report-store.js');
25
+ const store = createFileStore(resolve(values['reports-dir']));
26
+ const report = requireEvaluationReport(await store.get(reportId), reportId, lang);
27
+ const saturation = report.variance?.saturation;
28
+ if (!saturation) {
29
+ console.error(lang === 'zh'
30
+ ? '该报告没有 saturation 数据,需要 --repeat ≥ 2 才会记录。'
31
+ : 'This report has no saturation data; it requires --repeat ≥ 2.');
32
+ throw new CliExit(1);
33
+ }
34
+ const targetVariants = values.variant ? [values.variant] : (report.meta.variants ?? []);
35
+ console.log(lang === 'zh'
36
+ ? '\n Saturation 判定(读取报告中已持久化的数据)\n'
37
+ : '\n Saturation verdict (from persisted report data)\n');
38
+ for (const variant of targetVariants) {
39
+ const trace = saturation.perVariant[variant];
40
+ if (!trace || trace.length === 0) {
41
+ console.log(` ${variant}: no trace data`);
42
+ continue;
43
+ }
44
+ console.log(` ${variant}:`);
45
+ console.log(` checkpoints: ${trace.length} (N=${trace.map((p) => p.n).join(', ')})`);
46
+ const last = trace[trace.length - 1];
47
+ console.log(` last point mean=${last.mean.toFixed(3)}, CI=[${last.ciLow.toFixed(3)}, ${last.ciHigh.toFixed(3)}]`);
48
+ const persisted = saturation.verdicts?.[variant];
49
+ if (persisted) {
50
+ const result = persisted.saturated ? `saturated@N=${persisted.atN ?? '?'}` : 'not saturated';
51
+ console.log(` verdict (${persisted.method}): ${result} - ${persisted.reason}`);
52
+ }
53
+ else if (trace.length < 5) {
54
+ console.log(` verdict: only ${trace.length} data points (< 5), skipping`);
55
+ }
56
+ }
57
+ console.log('');
58
+ }
59
+ //# sourceMappingURL=export-saturation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-saturation.js","sourceRoot":"","sources":["../../../../src/cli/commands/export-saturation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function execute(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=export-verdict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-verdict.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/export-verdict.ts"],"names":[],"mappings":"AAQA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC3D"}
@@ -0,0 +1,45 @@
1
+ import { resolve } from 'node:path';
2
+ import { CliExit } from '../cli-exit.js';
3
+ import { langFromArgv } from '../i18n.js';
4
+ import { COMMON_OPTIONS, DEFAULT_REPORTS_DIR } from '../parse-run-config.js';
5
+ import { parseArgsStrictOrExit } from '../parse-strict.js';
6
+ import { requireEvaluationReport } from './_shared.js';
7
+ export async function execute(argv) {
8
+ const lang = langFromArgv(argv);
9
+ const reportId = argv[0];
10
+ if (!reportId) {
11
+ console.log(lang === 'zh'
12
+ ? '用法:omk export verdict <report-id> [--threshold <n>] [--trivial-diff <n>]'
13
+ : 'Usage: omk export verdict <report-id> [--threshold <n>] [--trivial-diff <n>]');
14
+ throw new CliExit(1);
15
+ }
16
+ const { values } = parseArgsStrictOrExit({
17
+ args: argv.slice(1),
18
+ options: {
19
+ ...COMMON_OPTIONS,
20
+ 'reports-dir': { type: 'string', default: DEFAULT_REPORTS_DIR },
21
+ threshold: { type: 'string' },
22
+ 'trivial-diff': { type: 'string' },
23
+ verbose: { type: 'boolean', default: false },
24
+ },
25
+ });
26
+ const { createFileStore } = await import('../../server/report-store.js');
27
+ const store = createFileStore(resolve(values['reports-dir']));
28
+ const report = requireEvaluationReport(await store.get(reportId), reportId, lang);
29
+ const { computeVerdict, formatVerdictText } = await import('../../eval-core/verdict.js');
30
+ const { reportComparabilityWarnings, formatComparabilityWarnings } = await import('../../eval-core/comparability.js');
31
+ const comparability = formatComparabilityWarnings(reportComparabilityWarnings(report), lang);
32
+ if (comparability)
33
+ process.stderr.write(`${comparability}\n`);
34
+ const result = computeVerdict(report, {
35
+ gateThreshold: values.threshold != null ? Number(values.threshold) : undefined,
36
+ triviallySmallDiff: values['trivial-diff'] != null ? Number(values['trivial-diff']) : undefined,
37
+ });
38
+ console.log(formatVerdictText(result, { verbose: Boolean(values.verbose) }));
39
+ if (result.level === 'PROGRESS')
40
+ throw new CliExit(0);
41
+ if (result.level === 'SOLO' && result.headline.includes('PASS'))
42
+ throw new CliExit(0);
43
+ throw new CliExit(1);
44
+ }
45
+ //# sourceMappingURL=export-verdict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-verdict.js","sourceRoot":"","sources":["../../../../src/cli/commands/export-verdict.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function execute(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAaA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE3D"}
@@ -0,0 +1,150 @@
1
+ import { writeFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { CliExit } from '../cli-exit.js';
4
+ import { tCli, langFromArgv } from '../i18n.js';
5
+ import { COMMON_OPTIONS, DEFAULT_REPORTS_DIR } from '../parse-run-config.js';
6
+ import { parseArgsStrictOrExit } from '../parse-strict.js';
7
+ import { execute as diff } from './export-diff.js';
8
+ import { execute as saturation } from './export-saturation.js';
9
+ import { execute as verdictCommand } from './export-verdict.js';
10
+ export async function execute(argv) {
11
+ const lang = langFromArgv(argv);
12
+ const [sub, ...rest] = argv;
13
+ if (sub === 'diff') {
14
+ await diff(rest);
15
+ return;
16
+ }
17
+ if (sub === 'verdict') {
18
+ await verdictCommand(rest);
19
+ return;
20
+ }
21
+ if (sub === 'saturation') {
22
+ await saturation(rest);
23
+ return;
24
+ }
25
+ const { values, positionals } = parseArgsStrictOrExit({
26
+ args: argv,
27
+ allowPositionals: true,
28
+ options: {
29
+ ...COMMON_OPTIONS,
30
+ format: { type: 'string', default: 'html' },
31
+ out: { type: 'string' },
32
+ 'reports-dir': { type: 'string', default: DEFAULT_REPORTS_DIR },
33
+ },
34
+ });
35
+ const id = positionals[0];
36
+ if (!id) {
37
+ console.log(tCli('cli.help.export', lang).trim());
38
+ throw new CliExit(1);
39
+ }
40
+ const format = String(values.format);
41
+ if (!['html', 'markdown', 'github-summary'].includes(format)) {
42
+ console.error(tCli('cli.export.unsupported_format', lang, { format: String(values.format) }));
43
+ throw new CliExit(2);
44
+ }
45
+ const { createFileStore } = await import('../../server/report-store.js');
46
+ const store = createFileStore(resolve(values['reports-dir']));
47
+ const report = await store.get(id);
48
+ if (!report) {
49
+ console.error(tCli('cli.common.report_not_found', lang, { id }));
50
+ throw new CliExit(1);
51
+ }
52
+ if (format === 'html') {
53
+ const { renderReportDocumentDetail } = await import('../../renderer/html-renderer.js');
54
+ const outPath = resolve(values.out ?? `${id}.html`);
55
+ writeFileSync(outPath, renderReportDocumentDetail(report));
56
+ console.log(tCli('cli.export.html_done', lang, { path: outPath }));
57
+ return;
58
+ }
59
+ const verdict = report.kind === 'evaluation' ? await renderVerdict(report) : 'n/a';
60
+ const body = format === 'github-summary'
61
+ ? renderGithubSummary(report, lang, verdict)
62
+ : renderMarkdown(report, lang, verdict);
63
+ const out = values.out;
64
+ if (out) {
65
+ const outPath = resolve(out);
66
+ writeFileSync(outPath, body);
67
+ console.log(tCli('cli.export.done', lang, { path: outPath }));
68
+ return;
69
+ }
70
+ console.log(body);
71
+ }
72
+ async function renderVerdict(report) {
73
+ const { computeVerdict } = await import('../../eval-core/verdict.js');
74
+ return computeVerdict(report).headline;
75
+ }
76
+ function renderGithubSummary(report, lang, verdict) {
77
+ if (report.kind !== 'evaluation') {
78
+ return renderBatchMarkdown(report, lang);
79
+ }
80
+ const lines = [
81
+ lang === 'zh' ? '## omk 评测摘要' : '## omk Evaluation Summary',
82
+ '',
83
+ `- ${lang === 'zh' ? '报告' : 'Report'}:\`${report.id}\``,
84
+ `- ${lang === 'zh' ? '结论' : 'Verdict'}:${verdict}`,
85
+ `- ${lang === 'zh' ? '样本数' : 'Samples'}:${report.meta.sampleCount}`,
86
+ `- ${lang === 'zh' ? '模型' : 'Model'}:${report.meta.executor}:${report.meta.model}`,
87
+ `- ${lang === 'zh' ? '版本' : 'Variants'}:${report.meta.variants.join(' / ')}`,
88
+ '',
89
+ renderVariantTable(report, lang),
90
+ '',
91
+ renderAuditBlock(report, lang),
92
+ ];
93
+ return lines.join('\n').trim();
94
+ }
95
+ function renderMarkdown(report, lang, verdict) {
96
+ if (report.kind !== 'evaluation') {
97
+ return renderBatchMarkdown(report, lang);
98
+ }
99
+ const lines = [
100
+ `# ${lang === 'zh' ? 'omk 评测报告' : 'omk Evaluation Report'}:${report.id}`,
101
+ '',
102
+ `- ${lang === 'zh' ? '结论' : 'Verdict'}:${verdict}`,
103
+ `- ${lang === 'zh' ? '时间' : 'Timestamp'}:${report.meta.timestamp}`,
104
+ `- ${lang === 'zh' ? '样本数' : 'Samples'}:${report.meta.sampleCount}`,
105
+ `- ${lang === 'zh' ? '执行器' : 'Executor'}:${report.meta.executor}`,
106
+ `- ${lang === 'zh' ? '模型' : 'Model'}:${report.meta.model}`,
107
+ '',
108
+ `## ${lang === 'zh' ? '版本摘要' : 'Variant Summary'}`,
109
+ '',
110
+ renderVariantTable(report, lang),
111
+ '',
112
+ `## ${lang === 'zh' ? '审计信息' : 'Audit Evidence'}`,
113
+ '',
114
+ renderAuditBlock(report, lang),
115
+ ];
116
+ return lines.join('\n').trim();
117
+ }
118
+ function renderBatchMarkdown(report, lang) {
119
+ return [
120
+ `# ${lang === 'zh' ? 'omk 批量评测报告' : 'omk Batch Evaluation Report'}:${report.id}`,
121
+ '',
122
+ `- ${lang === 'zh' ? '类型' : 'Kind'}:${report.kind}`,
123
+ `- ${lang === 'zh' ? '时间' : 'Timestamp'}:${report.meta?.timestamp ?? 'n/a'}`,
124
+ ].join('\n');
125
+ }
126
+ function renderVariantTable(report, lang) {
127
+ const header = lang === 'zh'
128
+ ? '| 版本 | 样本 | 成功 | 综合分 | 成本 |\n|---|---:|---:|---:|---:|'
129
+ : '| Variant | Samples | Success | Score | Cost |\n|---|---:|---:|---:|---:|';
130
+ const rows = Object.entries(report.summary ?? {}).map(([variant, s]) => {
131
+ const summary = s;
132
+ const score = summary.avgCompositeScore != null ? summary.avgCompositeScore.toFixed(2) : '-';
133
+ const cost = summary.totalCostUSD != null ? `$${summary.totalCostUSD.toFixed(4)}` : '-';
134
+ return `| ${variant} | ${summary.totalSamples} | ${summary.successCount} | ${score} | ${cost} |`;
135
+ });
136
+ return [header, ...rows].join('\n');
137
+ }
138
+ function renderAuditBlock(report, lang) {
139
+ const hashes = Object.entries(report.meta.artifactHashes ?? {})
140
+ .map(([name, hash]) => ` - ${name}: \`${hash}\``)
141
+ .join('\n') || (lang === 'zh' ? ' - 未记录' : ' - not recorded');
142
+ return [
143
+ `- ${lang === 'zh' ? 'CLI 版本' : 'CLI version'}:${report.meta.cliVersion}`,
144
+ `- ${lang === 'zh' ? 'Node 版本' : 'Node version'}:${report.meta.nodeVersion}`,
145
+ `- ${lang === 'zh' ? '评委提示词指纹' : 'Judge prompt hash'}:${report.meta.judgePromptHash ?? 'n/a'}`,
146
+ `- ${lang === 'zh' ? '样本指纹数量' : 'Sample fingerprints'}:${Object.keys(report.meta.sampleHashes ?? {}).length}`,
147
+ `- ${lang === 'zh' ? 'artifact 指纹' : 'Artifact fingerprints'}:\n${hashes}`,
148
+ ].join('\n');
149
+ }
150
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../../src/cli/commands/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function execute(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=improve-failures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-failures.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/improve-failures.ts"],"names":[],"mappings":"AAQA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD3D"}
@@ -0,0 +1,59 @@
1
+ import { CliExit } from '../cli-exit.js';
2
+ import { resolve } from 'node:path';
3
+ import { tCli, langFromArgv } from '../i18n.js';
4
+ import { COMMON_OPTIONS, DEFAULT_REPORTS_DIR } from '../parse-run-config.js';
5
+ import { parseArgsStrictOrExit } from '../parse-strict.js';
6
+ import { requireEvaluationReport } from './_shared.js';
7
+ export async function execute(argv) {
8
+ const lang = langFromArgv(argv);
9
+ const reportId = argv[0];
10
+ if (!reportId) {
11
+ console.log(tCli('cli.help.improve_failures', lang));
12
+ throw new CliExit(1);
13
+ }
14
+ const { values } = parseArgsStrictOrExit({
15
+ args: argv.slice(1),
16
+ options: {
17
+ ...COMMON_OPTIONS,
18
+ 'reports-dir': { type: 'string', default: DEFAULT_REPORTS_DIR },
19
+ 'judge-models': { type: 'string' },
20
+ 'max-clusters': { type: 'string', default: '5' },
21
+ threshold: { type: 'string', default: '3' },
22
+ 'max-feed': { type: 'string', default: '50' },
23
+ },
24
+ });
25
+ // Parse --judge-models 在 load report 之前 fail-fast。
26
+ const { parseJudgeModelsArgOrExit: parseJudgesB } = await import('../parse-run-config.js');
27
+ const cliJudgeModelsB = values['judge-models'] !== undefined
28
+ ? parseJudgesB(values['judge-models'])
29
+ : undefined;
30
+ if (cliJudgeModelsB && cliJudgeModelsB.length > 1) {
31
+ console.error(tCli('cli.common.judge_models_single_only', lang, { cmd: 'failures' }));
32
+ throw new CliExit(2);
33
+ }
34
+ const { createFileStore } = await import('../../server/report-store.js');
35
+ const store = createFileStore(resolve(values['reports-dir']));
36
+ const report = requireEvaluationReport(await store.get(reportId), reportId, lang);
37
+ const failuresJudges = cliJudgeModelsB
38
+ ?? (report.meta?.judgeModels?.[0]
39
+ ? [{ executor: report.meta.judgeModels[0].executor, model: report.meta.judgeModels[0].model }]
40
+ : []);
41
+ if (failuresJudges.length === 0) {
42
+ console.error(tCli('cli.common.no_judge_model', lang));
43
+ throw new CliExit(1);
44
+ }
45
+ const { createExecutor } = await import('../../executors/index.js');
46
+ const executor = createExecutor(failuresJudges[0].executor);
47
+ const judgeModel = failuresJudges[0].model;
48
+ const { clusterFailures, formatFailureClusterReport } = await import('../../analysis/failure-clusterer.js');
49
+ const out = await clusterFailures({
50
+ report,
51
+ executor,
52
+ judgeModel,
53
+ maxClusters: Number(values['max-clusters']) || 5,
54
+ failureThreshold: Number(values.threshold) || 3,
55
+ maxFailuresFed: Number(values['max-feed']) || 50,
56
+ });
57
+ console.log(formatFailureClusterReport(out));
58
+ }
59
+ //# sourceMappingURL=improve-failures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-failures.js","sourceRoot":"","sources":["../../../../src/cli/commands/improve-failures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAC,CAAC;QACrD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAAC;QACvC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACnB,OAAO,EAAE;YACP,GAAG,cAAc;YACjB,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,EAAE;YAC/D,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAClC,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE;YAChD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE;YAC3C,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;SAC9C;KACF,CAAC,CAAC;IAEH,mDAAmD;IACnD,MAAM,EAAE,yBAAyB,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAC3F,MAAM,eAAe,GAAI,MAAM,CAAC,cAAc,CAAwB,KAAK,SAAS;QAClF,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAW,CAAC;QAChD,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IACzE,MAAM,KAAK,GAAgB,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAW,CAAC,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAElF,MAAM,cAAc,GAAkB,eAAe;WAChD,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YAC9F,CAAC,CAAC,EAAE,CAAC,CAAC;IACZ,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3C,MAAM,EAAE,eAAe,EAAE,0BAA0B,EAAE,GAAG,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAC;IAE5G,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC;QAChC,MAAM;QACN,QAAQ;QACR,UAAU;QACV,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC;QAChD,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;QAC/C,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;KACjD,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function execute(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=improve-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-plan.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/improve-plan.ts"],"names":[],"mappings":"AAUA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsE3D"}
@@ -0,0 +1,75 @@
1
+ import { CliExit } from '../cli-exit.js';
2
+ import { resolve } from 'node:path';
3
+ import { existsSync } from 'node:fs';
4
+ import { tCli, langFromArgv } from '../i18n.js';
5
+ import { COMMON_OPTIONS, DEFAULT_REPORTS_DIR } from '../parse-run-config.js';
6
+ import { parseArgsStrictOrExit } from '../parse-strict.js';
7
+ import { renderSampleDesignCoverage } from '../coverage-renderer.js';
8
+ import { requireEvaluationReport } from './_shared.js';
9
+ export async function execute(argv) {
10
+ const lang = langFromArgv(argv);
11
+ const reportId = argv[0];
12
+ if (!reportId) {
13
+ console.log(tCli('cli.help.improve_plan', lang));
14
+ throw new CliExit(1);
15
+ }
16
+ const { values } = parseArgsStrictOrExit({
17
+ args: argv.slice(1),
18
+ options: {
19
+ ...COMMON_OPTIONS,
20
+ 'reports-dir': { type: 'string', default: DEFAULT_REPORTS_DIR },
21
+ samples: { type: 'string' },
22
+ top: { type: 'string', default: '10' },
23
+ 'duplicate-rouge': { type: 'string' },
24
+ 'ambiguous-stddev': { type: 'string' },
25
+ 'cost-k': { type: 'string' },
26
+ 'latency-k': { type: 'string' },
27
+ flat: { type: 'string' },
28
+ },
29
+ });
30
+ const { createFileStore } = await import('../../server/report-store.js');
31
+ const store = createFileStore(resolve(values['reports-dir']));
32
+ const report = requireEvaluationReport(await store.get(reportId), reportId, lang);
33
+ // Try to read the samples file for near-duplicate detection. Source order:
34
+ // 1. --samples <path> override
35
+ // 2. report.meta.request.samplesPath (recorded at run time)
36
+ // If neither resolves to a readable file, skip near-duplicate gracefully.
37
+ let samples;
38
+ const samplesPath = values.samples ?? report.meta?.request?.samplesPath;
39
+ if (samplesPath && existsSync(samplesPath)) {
40
+ try {
41
+ const { loadSamples } = await import('../../inputs/load-samples.js');
42
+ samples = loadSamples(samplesPath).samples;
43
+ }
44
+ catch (err) {
45
+ process.stderr.write(tCli('cli.common.warn_load_samples_failed', lang, {
46
+ path: samplesPath, message: err.message,
47
+ }));
48
+ }
49
+ }
50
+ const topRaw = Number(values.top);
51
+ const topN = Number.isFinite(topRaw) && topRaw > 0 ? topRaw : undefined;
52
+ const { diagnoseSamples, formatSampleDiagnostics } = await import('../../analysis/sample-diagnostics.js');
53
+ const diag = diagnoseSamples(report, {
54
+ samples,
55
+ duplicateRouge: values['duplicate-rouge'] != null ? Number(values['duplicate-rouge']) : undefined,
56
+ ambiguousStddev: values['ambiguous-stddev'] != null ? Number(values['ambiguous-stddev']) : undefined,
57
+ costOutlierK: values['cost-k'] != null ? Number(values['cost-k']) : undefined,
58
+ latencyOutlierK: values['latency-k'] != null ? Number(values['latency-k']) : undefined,
59
+ flatThreshold: values.flat != null ? Number(values.flat) : undefined,
60
+ });
61
+ console.log(formatSampleDiagnostics(diag, { topN, lang }));
62
+ // Sample design science coverage block. Render after diagnose 主体,因为
63
+ // coverage 是声明式元数据(capability/difficulty/construct/provenance)的整体分布,
64
+ // 跟 issue list 是不同视角的两件事。优先从 samples (现场加载) 算,fallback 到
65
+ // report.analysis.sampleQuality(报告里持久化的数据)。
66
+ const coverageBlock = renderSampleDesignCoverage(samples, report.analysis?.sampleQuality, lang);
67
+ if (coverageBlock)
68
+ console.log(coverageBlock);
69
+ // Exit code: 0 if health ≥ 70 and no errors; 1 otherwise. CI-friendly.
70
+ if (diag.totals.errors === 0 && diag.healthScore >= 70) {
71
+ throw new CliExit(0);
72
+ }
73
+ throw new CliExit(1);
74
+ }
75
+ //# sourceMappingURL=improve-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-plan.js","sourceRoot":"","sources":["../../../../src/cli/commands/improve-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function execute(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=improve-samples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-samples.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/improve-samples.ts"],"names":[],"mappings":"AAYA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsH3D"}
@@ -0,0 +1,120 @@
1
+ import { CliExit } from '../cli-exit.js';
2
+ import { resolve, join } from 'node:path';
3
+ import { existsSync } from 'node:fs';
4
+ import { tCli, langFromArgv } from '../i18n.js';
5
+ import { COMMON_OPTIONS } from '../parse-run-config.js';
6
+ import { parseArgsStrictOrExit } from '../parse-strict.js';
7
+ export async function execute(argv) {
8
+ const lang = langFromArgv(argv);
9
+ const { values } = parseArgsStrictOrExit({
10
+ args: argv,
11
+ options: {
12
+ ...COMMON_OPTIONS,
13
+ batch: { type: 'boolean', default: false },
14
+ count: { type: 'string', default: '5' },
15
+ model: { type: 'string', default: 'sonnet' },
16
+ 'skill-dir': { type: 'string', default: 'skills' },
17
+ },
18
+ allowPositionals: true,
19
+ });
20
+ const { generateSamples } = await import('../../authoring/generator.js');
21
+ const { readFileSync, writeFileSync } = await import('node:fs');
22
+ const count = Math.max(1, Number(values.count) || 5);
23
+ const model = values.model;
24
+ if (values.batch) {
25
+ // Batch mode: generate for all skills missing eval-samples
26
+ const skillDir = resolve(values['skill-dir']);
27
+ if (!existsSync(skillDir)) {
28
+ console.error(tCli('cli.common.skill_dir_not_found', lang, { path: skillDir }));
29
+ throw new CliExit(1);
30
+ }
31
+ const { readdirSync, statSync } = await import('node:fs');
32
+ const entries = readdirSync(skillDir);
33
+ let generated = 0;
34
+ for (const entry of entries) {
35
+ let name;
36
+ let skillPath;
37
+ let samplesPath;
38
+ const fullPath = join(skillDir, entry);
39
+ if (entry.endsWith('.md') && !entry.endsWith('.eval-samples.json')) {
40
+ name = entry.slice(0, -3);
41
+ skillPath = fullPath;
42
+ samplesPath = join(skillDir, `${name}.eval-samples.json`);
43
+ }
44
+ else if (statSync(fullPath).isDirectory()) {
45
+ const skillMd = join(fullPath, 'SKILL.md');
46
+ if (!existsSync(skillMd))
47
+ continue;
48
+ name = entry;
49
+ skillPath = skillMd;
50
+ samplesPath = join(fullPath, 'eval-samples.json');
51
+ }
52
+ else {
53
+ continue;
54
+ }
55
+ if (existsSync(samplesPath)) {
56
+ process.stderr.write(tCli('cli.gen.skill_skipped_existing', lang, { name }));
57
+ continue;
58
+ }
59
+ process.stderr.write(tCli('cli.gen.skill_generating', lang, { name, count }));
60
+ try {
61
+ const skillContent = readFileSync(skillPath, 'utf-8');
62
+ const { samples, costUSD } = await generateSamples({ skillContent, count, model });
63
+ writeFileSync(samplesPath, JSON.stringify(samples, null, 2));
64
+ const cost = costUSD > 0 ? ` $${costUSD.toFixed(4)}` : '';
65
+ process.stderr.write(tCli('cli.gen.skill_done', lang, {
66
+ name, n: samples.length, path: samplesPath, cost,
67
+ }));
68
+ generated++;
69
+ }
70
+ catch (err) {
71
+ process.stderr.write(tCli('cli.gen.skill_failed', lang, {
72
+ name, message: err.message,
73
+ }));
74
+ }
75
+ }
76
+ if (generated === 0) {
77
+ console.log(tCli('cli.gen.batch_none_needed', lang));
78
+ }
79
+ else {
80
+ console.log(tCli('cli.gen.batch_summary', lang, { n: generated }));
81
+ }
82
+ }
83
+ else {
84
+ // Single skill mode
85
+ const skillPath = argv.find((a) => !a.startsWith('-'));
86
+ if (!skillPath) {
87
+ console.error(tCli('cli.gen.specify_skill_path', lang));
88
+ throw new CliExit(1);
89
+ }
90
+ const resolvedPath = resolve(skillPath);
91
+ if (!existsSync(resolvedPath)) {
92
+ console.error(tCli('cli.common.skill_file_not_found', lang, { path: resolvedPath }));
93
+ throw new CliExit(1);
94
+ }
95
+ const skillContent = readFileSync(resolvedPath, 'utf-8');
96
+ const outputPath = resolve('eval-samples.json');
97
+ if (existsSync(outputPath)) {
98
+ console.error(tCli('cli.gen.samples_already_exists', lang));
99
+ throw new CliExit(1);
100
+ }
101
+ process.stderr.write(tCli('cli.gen.single_generating', lang, { count }));
102
+ try {
103
+ const { samples, costUSD } = await generateSamples({ skillContent, count, model });
104
+ writeFileSync(outputPath, JSON.stringify(samples, null, 2));
105
+ const cost = costUSD > 0 ? ` $${costUSD.toFixed(4)}` : '';
106
+ process.stderr.write(tCli('cli.gen.single_done', lang, {
107
+ n: samples.length, path: outputPath, cost,
108
+ }));
109
+ console.log(tCli('cli.gen.review_hint', lang));
110
+ }
111
+ catch (err) {
112
+ // CliExit 透传,保持 eval / improve / doctor 的一致性约束。
113
+ if (err instanceof CliExit)
114
+ throw err;
115
+ console.error(tCli('cli.gen.failed', lang, { message: err.message }));
116
+ throw new CliExit(1);
117
+ }
118
+ }
119
+ }
120
+ //# sourceMappingURL=improve-samples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-samples.js","sourceRoot":"","sources":["../../../../src/cli/commands/improve-samples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function execute(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=improve-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-skill.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/improve-skill.ts"],"names":[],"mappings":"AA0CA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4G3D"}