@dommaker/harness 0.16.0 → 0.16.2

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 (87) hide show
  1. package/README.md +1 -0
  2. package/bin/harness.js +73 -1
  3. package/dist/cli/commands/doc-freshness-check.d.ts +53 -0
  4. package/dist/cli/commands/doc-freshness-check.d.ts.map +1 -0
  5. package/dist/cli/commands/doc-freshness-check.js +366 -0
  6. package/dist/cli/commands/doc-freshness-check.js.map +1 -0
  7. package/dist/cli/commands/index.d.ts +4 -1
  8. package/dist/cli/commands/index.d.ts.map +1 -1
  9. package/dist/cli/commands/index.js +13 -1
  10. package/dist/cli/commands/index.js.map +1 -1
  11. package/dist/cli/commands/knowledge.d.ts +12 -0
  12. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  13. package/dist/cli/commands/knowledge.js +134 -0
  14. package/dist/cli/commands/knowledge.js.map +1 -1
  15. package/dist/cli/commands/release.d.ts +11 -0
  16. package/dist/cli/commands/release.d.ts.map +1 -1
  17. package/dist/cli/commands/release.js +43 -12
  18. package/dist/cli/commands/release.js.map +1 -1
  19. package/dist/cli/commands/sdd.d.ts +8 -0
  20. package/dist/cli/commands/sdd.d.ts.map +1 -0
  21. package/dist/cli/commands/sdd.js +68 -0
  22. package/dist/cli/commands/sdd.js.map +1 -0
  23. package/dist/cli/commands/spec-baseline-check.d.ts +30 -0
  24. package/dist/cli/commands/spec-baseline-check.d.ts.map +1 -0
  25. package/dist/cli/commands/spec-baseline-check.js +366 -0
  26. package/dist/cli/commands/spec-baseline-check.js.map +1 -0
  27. package/dist/cli/commands/sync-docs.d.ts +2 -0
  28. package/dist/cli/commands/sync-docs.d.ts.map +1 -1
  29. package/dist/cli/commands/sync-docs.js +320 -1
  30. package/dist/cli/commands/sync-docs.js.map +1 -1
  31. package/dist/knowledge/audit.d.ts +1 -1
  32. package/dist/knowledge/audit.d.ts.map +1 -1
  33. package/dist/knowledge/audit.js +59 -7
  34. package/dist/knowledge/audit.js.map +1 -1
  35. package/dist/knowledge/index-generator.d.ts +36 -0
  36. package/dist/knowledge/index-generator.d.ts.map +1 -0
  37. package/dist/knowledge/index-generator.js +241 -0
  38. package/dist/knowledge/index-generator.js.map +1 -0
  39. package/dist/knowledge/index.d.ts +2 -0
  40. package/dist/knowledge/index.d.ts.map +1 -1
  41. package/dist/knowledge/index.js +3 -1
  42. package/dist/knowledge/index.js.map +1 -1
  43. package/dist/knowledge/ingest.js +2 -2
  44. package/dist/knowledge/ingest.js.map +1 -1
  45. package/dist/knowledge/lifecycle.d.ts +15 -0
  46. package/dist/knowledge/lifecycle.d.ts.map +1 -1
  47. package/dist/knowledge/lifecycle.js +70 -0
  48. package/dist/knowledge/lifecycle.js.map +1 -1
  49. package/dist/knowledge/lint.js +3 -3
  50. package/dist/knowledge/lint.js.map +1 -1
  51. package/dist/knowledge/primitives/code-structure.d.ts +37 -0
  52. package/dist/knowledge/primitives/code-structure.d.ts.map +1 -0
  53. package/dist/knowledge/primitives/code-structure.js +168 -0
  54. package/dist/knowledge/primitives/code-structure.js.map +1 -0
  55. package/dist/knowledge/types.d.ts +3 -1
  56. package/dist/knowledge/types.d.ts.map +1 -1
  57. package/dist/knowledge/types.js.map +1 -1
  58. package/dist/sdd/index-generator.d.ts +22 -0
  59. package/dist/sdd/index-generator.d.ts.map +1 -0
  60. package/dist/sdd/index-generator.js +118 -0
  61. package/dist/sdd/index-generator.js.map +1 -0
  62. package/package.json +1 -1
  63. package/src/cli/commands/CONTEXT.md +3 -3
  64. package/src/cli/commands/__tests__/doc-freshness-check.test.ts +168 -0
  65. package/src/cli/commands/__tests__/knowledge.test.ts +69 -1
  66. package/src/cli/commands/__tests__/spec-baseline-check.test.ts +235 -0
  67. package/src/cli/commands/__tests__/sync-docs-agents.test.ts +226 -0
  68. package/src/cli/commands/doc-freshness-check.ts +397 -0
  69. package/src/cli/commands/index.ts +4 -1
  70. package/src/cli/commands/knowledge.ts +150 -0
  71. package/src/cli/commands/release.ts +48 -12
  72. package/src/cli/commands/sdd.ts +44 -0
  73. package/src/cli/commands/spec-baseline-check.ts +384 -0
  74. package/src/cli/commands/sync-docs.ts +355 -1
  75. package/src/knowledge/__tests__/audit.test.ts +56 -0
  76. package/src/knowledge/__tests__/index-generator.test.ts +335 -0
  77. package/src/knowledge/audit.ts +64 -8
  78. package/src/knowledge/index-generator.ts +233 -0
  79. package/src/knowledge/index.ts +2 -0
  80. package/src/knowledge/ingest.ts +2 -2
  81. package/src/knowledge/lifecycle.ts +71 -0
  82. package/src/knowledge/lint.ts +3 -3
  83. package/src/knowledge/primitives/__tests__/code-structure.test.ts +120 -0
  84. package/src/knowledge/primitives/code-structure.ts +161 -0
  85. package/src/knowledge/types.ts +4 -1
  86. package/src/sdd/__tests__/index-generator.test.ts +150 -0
  87. package/src/sdd/index-generator.ts +109 -0
package/README.md CHANGED
@@ -123,3 +123,4 @@ preset: standard # strict | standard | relaxed
123
123
  ## 许可证
124
124
 
125
125
  MIT
126
+ # force CI re-run
package/bin/harness.js CHANGED
@@ -42,6 +42,8 @@ const {
42
42
  knowledgeAudit,
43
43
  knowledgeSnapshot,
44
44
  knowledgeMigrate,
45
+ knowledgeHealth,
46
+ knowledgeIndex,
45
47
  failureList,
46
48
  failureStats,
47
49
  failureClear,
@@ -50,6 +52,9 @@ const {
50
52
  updateUserModel,
51
53
  release,
52
54
  constraints,
55
+ docFreshnessCheck,
56
+ specBaselineCheck,
57
+ sddIndex,
53
58
  } = require('../dist/cli/commands/index');
54
59
 
55
60
  const program = new Command();
@@ -338,10 +343,11 @@ program
338
343
  // ========================================
339
344
  program
340
345
  .command('sync-docs')
341
- .description('同步项目文档(CAPABILITIES.md、CONTEXT.md)')
346
+ .description('同步项目文档(CAPABILITIES.md、CONTEXT.md、AGENTS.md)')
342
347
  .option('-p, --project-path <path>', '项目路径')
343
348
  .option('-c, --check', '只检查不修改(CI 模式)', false)
344
349
  .option('--json', '输出 JSON 格式(供 LLM 消费)', false)
350
+ .option('--agents', '同步 AGENTS.md(agent 导读)', false)
345
351
  .action(async (options) => {
346
352
  const ok = await syncDocs(options);
347
353
  if (!ok && options.check) {
@@ -431,6 +437,14 @@ program
431
437
  case 'migrate':
432
438
  knowledgeMigrate({ ...opts, dir: options.dir });
433
439
  break;
440
+ case 'index':
441
+ case 'idx':
442
+ knowledgeIndex({ ...opts, dir: options.dir });
443
+ break;
444
+ case 'health':
445
+ case 'h':
446
+ await knowledgeHealth({ ...opts, dir: options.dir });
447
+ break;
434
448
  default:
435
449
  // 无子命令时显示帮助
436
450
  if (!subcommand) {
@@ -442,6 +456,32 @@ program
442
456
  }
443
457
  });
444
458
 
459
+ // ========================================
460
+ // harness sdd
461
+ // ========================================
462
+ program
463
+ .command('sdd [subcommand]')
464
+ .description('SDD 管理(index)')
465
+ .option('-p, --project-path <path>', '项目路径')
466
+ .option('--dir <dir>', '指定基础目录')
467
+ .option('--json', 'JSON 输出')
468
+ .action(async (subcommand, options) => {
469
+ const opts = { projectPath: options.projectPath, json: options.json };
470
+ switch (subcommand) {
471
+ case 'index':
472
+ case 'idx':
473
+ sddIndex({ ...opts, dir: options.dir });
474
+ break;
475
+ default:
476
+ if (!subcommand) {
477
+ program.commands.find(c => c.name() === 'sdd').help();
478
+ } else {
479
+ console.error(`未知子命令: ${subcommand}`);
480
+ process.exit(1);
481
+ }
482
+ }
483
+ });
484
+
445
485
  // ========================================
446
486
  // harness failure
447
487
  // ========================================
@@ -539,5 +579,37 @@ program
539
579
  await constraints(options);
540
580
  });
541
581
 
582
+ // ========================================
583
+ // harness doc-freshness-check
584
+ // ========================================
585
+ program
586
+ .command('doc-freshness-check <docPath>')
587
+ .description('检查文档声明的新鲜度:提取可验证声明,与代码对照')
588
+ .option('--changed-files <list>', '变更文件列表(逗号分隔)')
589
+ .option('--format <format>', '输出格式 (table/json)', 'table')
590
+ .option('-p, --project-path <path>', '项目路径')
591
+ .action(async (docPath, options) => {
592
+ await docFreshnessCheck(docPath, {
593
+ changedFiles: options.changedFiles,
594
+ format: options.format,
595
+ projectPath: options.projectPath,
596
+ });
597
+ });
598
+
599
+ // ========================================
600
+ // harness spec-baseline-check
601
+ // ========================================
602
+ program
603
+ .command('spec-baseline-check <specPath>')
604
+ .description('验证 spec 文件的前置条件是否满足')
605
+ .option('-p, --project-path <path>', '项目路径')
606
+ .option('--json', '输出 JSON 格式', false)
607
+ .action(async (specPath, options) => {
608
+ await specBaselineCheck(specPath, {
609
+ projectPath: options.projectPath,
610
+ json: options.json,
611
+ });
612
+ });
613
+
542
614
  // 解析命令行参数
543
615
  program.parse();
@@ -0,0 +1,53 @@
1
+ /**
2
+ * harness doc-freshness-check 命令
3
+ *
4
+ * 从文档中提取可验证的声明(claims),与代码/文件系统对照,输出差异。
5
+ * 纯代码操作,零 LLM 调用。
6
+ */
7
+ export interface DocFreshnessCheckOptions {
8
+ /** 输出 JSON 格式 */
9
+ format?: 'json' | 'table';
10
+ /** 变更文件列表(逗号分隔),用于聚焦检查 */
11
+ changedFiles?: string;
12
+ /** 项目路径 */
13
+ projectPath?: string;
14
+ }
15
+ /** 声明类型 */
16
+ export type ClaimType = 'numeric' | 'list' | 'status' | 'narrative';
17
+ /** 单条声明 */
18
+ export interface Claim {
19
+ /** 原始文本片段 */
20
+ text: string;
21
+ /** 声明类型 */
22
+ type: ClaimType;
23
+ /** 行号 */
24
+ line: number;
25
+ }
26
+ /** 验证结果 */
27
+ export interface ClaimResult {
28
+ /** 原始声明 */
29
+ claim: string;
30
+ /** 声明类型 */
31
+ type: ClaimType;
32
+ /** 文档中的期望值 */
33
+ expected: string;
34
+ /** 实际值 */
35
+ actual: string;
36
+ /** 来源文件 */
37
+ file: string;
38
+ /** 是否匹配 */
39
+ match: boolean;
40
+ }
41
+ /**
42
+ * 从 markdown 内容提取 claims
43
+ */
44
+ export declare function extractClaims(content: string, filePath: string): ClaimResult[];
45
+ /**
46
+ * 验证所有 claims
47
+ */
48
+ export declare function verifyClaims(claims: ClaimResult[], projectPath: string): ClaimResult[];
49
+ /**
50
+ * doc-freshness-check CLI 命令
51
+ */
52
+ export declare function docFreshnessCheck(docPath: string, options?: DocFreshnessCheckOptions): Promise<void>;
53
+ //# sourceMappingURL=doc-freshness-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-freshness-check.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doc-freshness-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,wBAAwB;IACvC,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,0BAA0B;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,WAAW;AACX,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEpE,WAAW;AACX,MAAM,WAAW,KAAK;IACpB,aAAa;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS;IACT,IAAI,EAAE,MAAM,CAAC;CACd;AAED,WAAW;AACX,MAAM,WAAW,WAAW;IAC1B,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU;IACV,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,KAAK,EAAE,OAAO,CAAC;CAChB;AA4BD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CA6D9E;AAqID;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,EAAE,EACrB,WAAW,EAAE,MAAM,GAClB,WAAW,EAAE,CAaf;AAuDD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
@@ -0,0 +1,366 @@
1
+ "use strict";
2
+ /**
3
+ * harness doc-freshness-check 命令
4
+ *
5
+ * 从文档中提取可验证的声明(claims),与代码/文件系统对照,输出差异。
6
+ * 纯代码操作,零 LLM 调用。
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __importDefault = (this && this.__importDefault) || function (mod) {
42
+ return (mod && mod.__esModule) ? mod : { "default": mod };
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.extractClaims = extractClaims;
46
+ exports.verifyClaims = verifyClaims;
47
+ exports.docFreshnessCheck = docFreshnessCheck;
48
+ const chalk_1 = __importDefault(require("chalk"));
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ // ============================================
52
+ // Claim 提取器
53
+ // ============================================
54
+ /** 数字声明:N 个/条/项 + 名词 */
55
+ const NUMERIC_PATTERNS = [
56
+ /(\d+)\s*个\s*(Agent|角色|能力|子系统|模块|端点|命令|组件|层级|阶段|步骤|断点|问题|维度|门|规则|约束)/g,
57
+ /(\d+)\s*条\s*(知识|规则|约束|命令|铁律|指南|提示|断点|问题|结果|记录)/g,
58
+ /(\d+)\s*项\s*(检查|任务|功能|变更|修复|优化|指标|配置)/g,
59
+ /(\d+)\s*(?:大|层)\s*(能力|约束|架构|层级)/g,
60
+ /(\d+)\s*个\s*(?:CLI\s*)?subcommand/gi,
61
+ ];
62
+ /** 列表声明:A, B, C, ... (至少 3 项) */
63
+ const LIST_PATTERN = /[A-Z][a-zA-Z]+(?:[,,、]\s*[A-Z][a-zA-Z]+){2,}/g;
64
+ /** 状态标记 */
65
+ const STATUS_PATTERNS = [
66
+ /✅\s*(已完成|已实现|已修复|已部署|已连通|已验证)/g,
67
+ /❌\s*(缺失|未实现|未完成|失败)/g,
68
+ /\bDEPRECATED\b/g,
69
+ /\bTODO\b/g,
70
+ /待(开发|实现|修复|完善|验证)/g,
71
+ /已(废弃|弃用|移除|删除)/g,
72
+ ];
73
+ /**
74
+ * 从 markdown 内容提取 claims
75
+ */
76
+ function extractClaims(content, filePath) {
77
+ const lines = content.split('\n');
78
+ const results = [];
79
+ for (let i = 0; i < lines.length; i++) {
80
+ const line = lines[i];
81
+ // 数字声明
82
+ for (const pattern of NUMERIC_PATTERNS) {
83
+ pattern.lastIndex = 0;
84
+ let match;
85
+ while ((match = pattern.exec(line)) !== null) {
86
+ const fullMatch = match[0];
87
+ const number = match[1];
88
+ results.push({
89
+ claim: fullMatch,
90
+ type: 'numeric',
91
+ expected: number,
92
+ actual: '', // 待验证
93
+ file: filePath,
94
+ match: false,
95
+ });
96
+ }
97
+ }
98
+ // 列表声明
99
+ const listMatches = line.match(LIST_PATTERN);
100
+ if (listMatches) {
101
+ for (const m of listMatches) {
102
+ const items = m.split(/[,,、]/).map(s => s.trim()).filter(Boolean);
103
+ if (items.length >= 3) {
104
+ results.push({
105
+ claim: m,
106
+ type: 'list',
107
+ expected: items.join(', '),
108
+ actual: '', // 待验证
109
+ file: filePath,
110
+ match: false,
111
+ });
112
+ }
113
+ }
114
+ }
115
+ // 状态标记
116
+ for (const pattern of STATUS_PATTERNS) {
117
+ pattern.lastIndex = 0;
118
+ let match;
119
+ while ((match = pattern.exec(line)) !== null) {
120
+ results.push({
121
+ claim: match[0],
122
+ type: 'status',
123
+ expected: match[0],
124
+ actual: '', // 待验证
125
+ file: filePath,
126
+ match: false,
127
+ });
128
+ }
129
+ }
130
+ }
131
+ return results;
132
+ }
133
+ // ============================================
134
+ // 验证器
135
+ // ============================================
136
+ /**
137
+ * 在项目目录中 grep 搜索匹配内容,返回匹配行数
138
+ */
139
+ function countGrepMatches(pattern, projectPath, fileGlob) {
140
+ const searchDir = projectPath || process.cwd();
141
+ let count = 0;
142
+ function walkDir(dir) {
143
+ let entries;
144
+ try {
145
+ entries = fs.readdirSync(dir, { withFileTypes: true });
146
+ }
147
+ catch {
148
+ return;
149
+ }
150
+ for (const entry of entries) {
151
+ if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist')
152
+ continue;
153
+ const fullPath = path.join(dir, entry.name);
154
+ if (entry.isDirectory()) {
155
+ walkDir(fullPath);
156
+ }
157
+ else if (entry.isFile()) {
158
+ if (fileGlob && !matchGlob(entry.name, fileGlob))
159
+ continue;
160
+ try {
161
+ const content = fs.readFileSync(fullPath, 'utf-8');
162
+ const regex = new RegExp(pattern, 'gi');
163
+ const matches = content.match(regex);
164
+ if (matches)
165
+ count += matches.length;
166
+ }
167
+ catch {
168
+ // skip unreadable files
169
+ }
170
+ }
171
+ }
172
+ }
173
+ walkDir(searchDir);
174
+ return count;
175
+ }
176
+ /**
177
+ * 简单 glob 匹配(支持 *.ext 和 *)
178
+ */
179
+ function matchGlob(filename, glob) {
180
+ if (glob === '*')
181
+ return true;
182
+ if (glob.startsWith('*.')) {
183
+ const ext = glob.slice(1);
184
+ return filename.endsWith(ext);
185
+ }
186
+ return filename === glob;
187
+ }
188
+ /**
189
+ * 验证数字声明:计数相关文件/代码模式
190
+ */
191
+ function verifyNumericClaim(claim, projectPath) {
192
+ const expected = parseInt(claim.expected, 10);
193
+ // 从声明文本推断搜索模式
194
+ let searchPattern = '';
195
+ let fileGlob = '*.ts';
196
+ if (claim.claim.includes('Agent')) {
197
+ searchPattern = 'export (class|interface|function) \\w*Agent';
198
+ }
199
+ else if (claim.claim.includes('命令') || claim.claim.includes('subcommand')) {
200
+ fileGlob = '*.ts';
201
+ searchPattern = "program\\.command\\(";
202
+ }
203
+ else if (claim.claim.includes('铁律') || claim.claim.includes('约束') || claim.claim.includes('规则')) {
204
+ searchPattern = "severity:\\s*['\"]?error";
205
+ fileGlob = '*.ts';
206
+ }
207
+ else if (claim.claim.includes('指南')) {
208
+ searchPattern = "severity:\\s*['\"]?warning";
209
+ fileGlob = '*.ts';
210
+ }
211
+ else if (claim.claim.includes('端点')) {
212
+ searchPattern = '(router|app)\\.(get|post|put|delete|patch)\\(';
213
+ fileGlob = '*.ts';
214
+ }
215
+ else {
216
+ // 无法自动验证的数字声明
217
+ return { ...claim, actual: 'N/A (cannot auto-verify)', match: true };
218
+ }
219
+ const actual = countGrepMatches(searchPattern, projectPath, fileGlob);
220
+ return {
221
+ ...claim,
222
+ actual: String(actual),
223
+ match: Math.abs(actual - expected) <= Math.max(1, Math.floor(expected * 0.1)), // 10% tolerance
224
+ };
225
+ }
226
+ /**
227
+ * 验证列表声明:检查列表中的每一项是否存在于代码中
228
+ */
229
+ function verifyListClaim(claim, projectPath) {
230
+ const items = claim.expected.split(',').map(s => s.trim());
231
+ const found = [];
232
+ const missing = [];
233
+ for (const item of items) {
234
+ const count = countGrepMatches(item, projectPath);
235
+ if (count > 0) {
236
+ found.push(item);
237
+ }
238
+ else {
239
+ missing.push(item);
240
+ }
241
+ }
242
+ return {
243
+ ...claim,
244
+ actual: missing.length === 0
245
+ ? `all ${items.length} found`
246
+ : `missing: ${missing.join(', ')}`,
247
+ match: missing.length === 0,
248
+ };
249
+ }
250
+ /**
251
+ * 验证状态声明:检查标记是否与代码/文件一致
252
+ */
253
+ function verifyStatusClaim(claim, projectPath) {
254
+ // 状态声明的验证较复杂,标记为需要人工确认
255
+ return {
256
+ ...claim,
257
+ actual: 'needs manual verification',
258
+ match: true, // 不阻断
259
+ };
260
+ }
261
+ /**
262
+ * 验证所有 claims
263
+ */
264
+ function verifyClaims(claims, projectPath) {
265
+ return claims.map(claim => {
266
+ switch (claim.type) {
267
+ case 'numeric':
268
+ return verifyNumericClaim(claim, projectPath);
269
+ case 'list':
270
+ return verifyListClaim(claim, projectPath);
271
+ case 'status':
272
+ return verifyStatusClaim(claim, projectPath);
273
+ default:
274
+ return { ...claim, actual: 'N/A', match: true };
275
+ }
276
+ });
277
+ }
278
+ // ============================================
279
+ // 输出格式化
280
+ // ============================================
281
+ function formatTable(results) {
282
+ if (results.length === 0)
283
+ return chalk_1.default.yellow('未发现可验证的声明');
284
+ const lines = [];
285
+ lines.push(chalk_1.default.blue(`文档新鲜度检查 (${results.length} 条声明)\n`));
286
+ // 统计
287
+ const mismatches = results.filter(r => !r.match);
288
+ lines.push(chalk_1.default.bold(` 匹配: ${results.length - mismatches.length}/${results.length}`));
289
+ if (mismatches.length > 0) {
290
+ lines.push(chalk_1.default.red(` 不匹配: ${mismatches.length}\n`));
291
+ }
292
+ else {
293
+ lines.push(chalk_1.default.green(' 全部匹配\n'));
294
+ }
295
+ // 按类型分组
296
+ const byType = {};
297
+ for (const r of results) {
298
+ if (!byType[r.type])
299
+ byType[r.type] = [];
300
+ byType[r.type].push(r);
301
+ }
302
+ const typeLabels = {
303
+ numeric: '数字声明',
304
+ list: '列表声明',
305
+ status: '状态标记',
306
+ narrative: '叙述声明',
307
+ };
308
+ for (const [type, items] of Object.entries(byType)) {
309
+ lines.push(chalk_1.default.bold(` ${typeLabels[type] || type} (${items.length}):`));
310
+ for (const item of items) {
311
+ const icon = item.match ? chalk_1.default.green('✓') : chalk_1.default.red('✗');
312
+ lines.push(` ${icon} ${item.claim}`);
313
+ if (!item.match) {
314
+ lines.push(` 期望: ${item.expected}`);
315
+ lines.push(` 实际: ${chalk_1.default.yellow(item.actual)}`);
316
+ }
317
+ }
318
+ lines.push('');
319
+ }
320
+ return lines.join('\n');
321
+ }
322
+ // ============================================
323
+ // 主入口
324
+ // ============================================
325
+ /**
326
+ * doc-freshness-check CLI 命令
327
+ */
328
+ async function docFreshnessCheck(docPath, options = {}) {
329
+ // 验证文件存在
330
+ const resolvedPath = path.resolve(docPath);
331
+ if (!fs.existsSync(resolvedPath)) {
332
+ console.error(chalk_1.default.red(`文件不存在: ${resolvedPath}`));
333
+ process.exitCode = 1;
334
+ return;
335
+ }
336
+ if (!resolvedPath.endsWith('.md')) {
337
+ console.error(chalk_1.default.yellow(`警告: 文件不是 .md 格式,可能无法正确解析`));
338
+ }
339
+ const projectPath = options.projectPath || path.dirname(resolvedPath);
340
+ // 读取文档
341
+ const content = fs.readFileSync(resolvedPath, 'utf-8');
342
+ // 提取声明
343
+ let claims = extractClaims(content, resolvedPath);
344
+ // 如果指定了变更文件,只验证与变更文件相关的声明
345
+ if (options.changedFiles) {
346
+ const changed = options.changedFiles.split(',').map(s => s.trim());
347
+ // 过滤:保留所有 claims,但只验证与变更文件相关的
348
+ // 实际实现中可以根据声明内容推断相关文件
349
+ void changed; // 预留
350
+ }
351
+ // 验证
352
+ const results = verifyClaims(claims, projectPath);
353
+ // 输出
354
+ if (options.format === 'json') {
355
+ console.log(JSON.stringify(results, null, 2));
356
+ }
357
+ else {
358
+ console.log(formatTable(results));
359
+ }
360
+ // 有不匹配时 exit 1
361
+ const mismatches = results.filter(r => !r.match);
362
+ if (mismatches.length > 0) {
363
+ process.exitCode = 1;
364
+ }
365
+ }
366
+ //# sourceMappingURL=doc-freshness-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-freshness-check.js","sourceRoot":"","sources":["../../../src/cli/commands/doc-freshness-check.ts"],"names":[],"mappings":"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"}
@@ -16,11 +16,14 @@ export { contract, validateSchema, type ContractOptions } from './contract';
16
16
  export { review, reviewStatus, type ReviewOptions } from './review';
17
17
  export { executeCommand, type CommandCheckOptions } from './command';
18
18
  export { syncDocs, type SyncDocsOptions } from './sync-docs';
19
- export { knowledgeList, knowledgeSearch, knowledgeImport, knowledgeDecay, knowledgeStats, knowledgeUpsert, knowledgeSyncStatus, knowledgeSyncRag, knowledgeAudit, knowledgeSnapshot, knowledgeMigrate, type KnowledgeOptions, type KnowledgeUpsertOptions } from './knowledge';
19
+ export { knowledgeList, knowledgeSearch, knowledgeImport, knowledgeDecay, knowledgeStats, knowledgeUpsert, knowledgeSyncStatus, knowledgeSyncRag, knowledgeAudit, knowledgeSnapshot, knowledgeMigrate, knowledgeHealth, knowledgeIndex, type KnowledgeOptions, type KnowledgeUpsertOptions } from './knowledge';
20
20
  export { failureList, failureStats, failureClear, type FailureOptions } from './failure';
21
21
  export { postevalPlan, type PostEvalPlanOptions } from './posteval-plan';
22
22
  export { release, type ReleaseOptions } from './release';
23
23
  export { analyzeSessions, type AnalyzeSessionsOptions } from './analyze-sessions';
24
24
  export { updateUserModel, type UpdateUserModelOptions } from './update-user-model';
25
25
  export { constraints, getConstraintsMeta, type ConstraintsMeta } from './constraints';
26
+ export { docFreshnessCheck, extractClaims, verifyClaims, type DocFreshnessCheckOptions, type ClaimResult, type ClaimType } from './doc-freshness-check';
27
+ export { specBaselineCheck, extractBaselineSection, type SpecBaselineCheckOptions, type PrerequisiteResult } from './spec-baseline-check';
28
+ export { sddIndex, type SDDOptions } from './sdd';
26
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1G,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC/Q,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1G,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAChT,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,wBAAwB,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACxJ,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,KAAK,wBAAwB,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC1I,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,OAAO,CAAC"}
@@ -3,7 +3,8 @@
3
3
  * CLI 命令导出
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getConstraintsMeta = exports.constraints = exports.updateUserModel = exports.analyzeSessions = exports.release = exports.postevalPlan = exports.failureClear = exports.failureStats = exports.failureList = exports.knowledgeMigrate = exports.knowledgeSnapshot = exports.knowledgeAudit = exports.knowledgeSyncRag = exports.knowledgeSyncStatus = exports.knowledgeUpsert = exports.knowledgeStats = exports.knowledgeDecay = exports.knowledgeImport = exports.knowledgeSearch = exports.knowledgeList = exports.syncDocs = exports.executeCommand = exports.reviewStatus = exports.review = exports.validateSchema = exports.contract = exports.auditDetails = exports.security = exports.performance = exports.listAcceptanceCriteria = exports.acceptance = exports.listSpecTypes = exports.specValidate = exports.flow = exports.status = exports.report = exports.init = exports.checkCoverage = exports.runPassesGate = exports.DEFAULT_CHECKPOINTS = exports.createExampleCheckpoint = exports.validate = exports.listLaws = exports.check = void 0;
6
+ exports.specBaselineCheck = exports.verifyClaims = exports.extractClaims = exports.docFreshnessCheck = exports.getConstraintsMeta = exports.constraints = exports.updateUserModel = exports.analyzeSessions = exports.release = exports.postevalPlan = exports.failureClear = exports.failureStats = exports.failureList = exports.knowledgeIndex = exports.knowledgeHealth = exports.knowledgeMigrate = exports.knowledgeSnapshot = exports.knowledgeAudit = exports.knowledgeSyncRag = exports.knowledgeSyncStatus = exports.knowledgeUpsert = exports.knowledgeStats = exports.knowledgeDecay = exports.knowledgeImport = exports.knowledgeSearch = exports.knowledgeList = exports.syncDocs = exports.executeCommand = exports.reviewStatus = exports.review = exports.validateSchema = exports.contract = exports.auditDetails = exports.security = exports.performance = exports.listAcceptanceCriteria = exports.acceptance = exports.listSpecTypes = exports.specValidate = exports.flow = exports.status = exports.report = exports.init = exports.checkCoverage = exports.runPassesGate = exports.DEFAULT_CHECKPOINTS = exports.createExampleCheckpoint = exports.validate = exports.listLaws = exports.check = void 0;
7
+ exports.sddIndex = exports.extractBaselineSection = void 0;
7
8
  var check_1 = require("./check");
8
9
  Object.defineProperty(exports, "check", { enumerable: true, get: function () { return check_1.check; } });
9
10
  Object.defineProperty(exports, "listLaws", { enumerable: true, get: function () { return check_1.listLaws; } });
@@ -55,6 +56,8 @@ Object.defineProperty(exports, "knowledgeSyncRag", { enumerable: true, get: func
55
56
  Object.defineProperty(exports, "knowledgeAudit", { enumerable: true, get: function () { return knowledge_1.knowledgeAudit; } });
56
57
  Object.defineProperty(exports, "knowledgeSnapshot", { enumerable: true, get: function () { return knowledge_1.knowledgeSnapshot; } });
57
58
  Object.defineProperty(exports, "knowledgeMigrate", { enumerable: true, get: function () { return knowledge_1.knowledgeMigrate; } });
59
+ Object.defineProperty(exports, "knowledgeHealth", { enumerable: true, get: function () { return knowledge_1.knowledgeHealth; } });
60
+ Object.defineProperty(exports, "knowledgeIndex", { enumerable: true, get: function () { return knowledge_1.knowledgeIndex; } });
58
61
  var failure_1 = require("./failure");
59
62
  Object.defineProperty(exports, "failureList", { enumerable: true, get: function () { return failure_1.failureList; } });
60
63
  Object.defineProperty(exports, "failureStats", { enumerable: true, get: function () { return failure_1.failureStats; } });
@@ -70,4 +73,13 @@ Object.defineProperty(exports, "updateUserModel", { enumerable: true, get: funct
70
73
  var constraints_1 = require("./constraints");
71
74
  Object.defineProperty(exports, "constraints", { enumerable: true, get: function () { return constraints_1.constraints; } });
72
75
  Object.defineProperty(exports, "getConstraintsMeta", { enumerable: true, get: function () { return constraints_1.getConstraintsMeta; } });
76
+ var doc_freshness_check_1 = require("./doc-freshness-check");
77
+ Object.defineProperty(exports, "docFreshnessCheck", { enumerable: true, get: function () { return doc_freshness_check_1.docFreshnessCheck; } });
78
+ Object.defineProperty(exports, "extractClaims", { enumerable: true, get: function () { return doc_freshness_check_1.extractClaims; } });
79
+ Object.defineProperty(exports, "verifyClaims", { enumerable: true, get: function () { return doc_freshness_check_1.verifyClaims; } });
80
+ var spec_baseline_check_1 = require("./spec-baseline-check");
81
+ Object.defineProperty(exports, "specBaselineCheck", { enumerable: true, get: function () { return spec_baseline_check_1.specBaselineCheck; } });
82
+ Object.defineProperty(exports, "extractBaselineSection", { enumerable: true, get: function () { return spec_baseline_check_1.extractBaselineSection; } });
83
+ var sdd_1 = require("./sdd");
84
+ Object.defineProperty(exports, "sddIndex", { enumerable: true, get: function () { return sdd_1.sddIndex; } });
73
85
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,iCAA6D;AAApD,8FAAA,KAAK,OAAA;AAAE,iGAAA,QAAQ,OAAA;AACxB,uCAA0G;AAAjG,oGAAA,QAAQ,OAAA;AAAE,mHAAA,uBAAuB,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAC/D,6CAAqF;AAA5E,4GAAA,aAAa,OAAA;AAAE,4GAAA,aAAa,OAAA;AACrC,+BAAgD;AAAvC,4FAAA,IAAI,OAAA;AACb,mCAAsD;AAA7C,gGAAA,MAAM,OAAA;AACf,mCAAsD;AAA7C,gGAAA,MAAM,OAAA;AACf,+BAAgD;AAAvC,4FAAA,IAAI,OAAA;AACb,+BAA+E;AAAtE,oGAAA,YAAY,OAAA;AAAE,qGAAA,aAAa,OAAA;AACpC,2CAA0F;AAAjF,wGAAA,UAAU,OAAA;AAAE,oHAAA,sBAAsB,OAAA;AAC3C,6CAAqE;AAA5D,0GAAA,WAAW,OAAA;AACpB,uCAA0E;AAAjE,oGAAA,QAAQ,OAAA;AAAE,wGAAA,YAAY,OAAA;AAC/B,uCAA4E;AAAnE,oGAAA,QAAQ,OAAA;AAAE,0GAAA,cAAc,OAAA;AACjC,mCAAoE;AAA3D,gGAAA,MAAM,OAAA;AAAE,sGAAA,YAAY,OAAA;AAC7B,qCAAqE;AAA5D,yGAAA,cAAc,OAAA;AACvB,yCAA6D;AAApD,qGAAA,QAAQ,OAAA;AACjB,yCAA+Q;AAAtQ,0GAAA,aAAa,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AACrM,qCAAyF;AAAhF,sGAAA,WAAW,OAAA;AAAE,uGAAA,YAAY,OAAA;AAAE,uGAAA,YAAY,OAAA;AAChD,iDAAyE;AAAhE,6GAAA,YAAY,OAAA;AACrB,qCAAyD;AAAhD,kGAAA,OAAO,OAAA;AAChB,uDAAkF;AAAzE,mHAAA,eAAe,OAAA;AACxB,yDAAmF;AAA1E,oHAAA,eAAe,OAAA;AACxB,6CAAsF;AAA7E,0GAAA,WAAW,OAAA;AAAE,iHAAA,kBAAkB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;AAEH,iCAA6D;AAApD,8FAAA,KAAK,OAAA;AAAE,iGAAA,QAAQ,OAAA;AACxB,uCAA0G;AAAjG,oGAAA,QAAQ,OAAA;AAAE,mHAAA,uBAAuB,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAC/D,6CAAqF;AAA5E,4GAAA,aAAa,OAAA;AAAE,4GAAA,aAAa,OAAA;AACrC,+BAAgD;AAAvC,4FAAA,IAAI,OAAA;AACb,mCAAsD;AAA7C,gGAAA,MAAM,OAAA;AACf,mCAAsD;AAA7C,gGAAA,MAAM,OAAA;AACf,+BAAgD;AAAvC,4FAAA,IAAI,OAAA;AACb,+BAA+E;AAAtE,oGAAA,YAAY,OAAA;AAAE,qGAAA,aAAa,OAAA;AACpC,2CAA0F;AAAjF,wGAAA,UAAU,OAAA;AAAE,oHAAA,sBAAsB,OAAA;AAC3C,6CAAqE;AAA5D,0GAAA,WAAW,OAAA;AACpB,uCAA0E;AAAjE,oGAAA,QAAQ,OAAA;AAAE,wGAAA,YAAY,OAAA;AAC/B,uCAA4E;AAAnE,oGAAA,QAAQ,OAAA;AAAE,0GAAA,cAAc,OAAA;AACjC,mCAAoE;AAA3D,gGAAA,MAAM,OAAA;AAAE,sGAAA,YAAY,OAAA;AAC7B,qCAAqE;AAA5D,yGAAA,cAAc,OAAA;AACvB,yCAA6D;AAApD,qGAAA,QAAQ,OAAA;AACjB,yCAAgT;AAAvS,0GAAA,aAAa,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,2GAAA,cAAc,OAAA;AACtO,qCAAyF;AAAhF,sGAAA,WAAW,OAAA;AAAE,uGAAA,YAAY,OAAA;AAAE,uGAAA,YAAY,OAAA;AAChD,iDAAyE;AAAhE,6GAAA,YAAY,OAAA;AACrB,qCAAyD;AAAhD,kGAAA,OAAO,OAAA;AAChB,uDAAkF;AAAzE,mHAAA,eAAe,OAAA;AACxB,yDAAmF;AAA1E,oHAAA,eAAe,OAAA;AACxB,6CAAsF;AAA7E,0GAAA,WAAW,OAAA;AAAE,iHAAA,kBAAkB,OAAA;AACxC,6DAAwJ;AAA/I,wHAAA,iBAAiB,OAAA;AAAE,oHAAA,aAAa,OAAA;AAAE,mHAAA,YAAY,OAAA;AACvD,6DAA0I;AAAjI,wHAAA,iBAAiB,OAAA;AAAE,6HAAA,sBAAsB,OAAA;AAClD,6BAAkD;AAAzC,+FAAA,QAAQ,OAAA"}
@@ -61,6 +61,12 @@ export declare function knowledgeSyncRag(options: KnowledgeOptions): Promise<voi
61
61
  * 知识同步状态:检测所有 tracked scope 的新鲜度
62
62
  */
63
63
  export declare function knowledgeSyncStatus(options: KnowledgeOptions): Promise<void>;
64
+ /**
65
+ * 飞轮健康检查 — 零 token 检测知识飞轮数据流状态
66
+ */
67
+ export declare function knowledgeHealth(options: KnowledgeOptions & {
68
+ dir?: string;
69
+ }): Promise<void>;
64
70
  /**
65
71
  * 知识库质量审计
66
72
  */
@@ -82,4 +88,10 @@ export declare function knowledgeSnapshot(options: KnowledgeOptions & {
82
88
  export declare function knowledgeMigrate(options: KnowledgeOptions & {
83
89
  dir?: string;
84
90
  }): void;
91
+ /**
92
+ * 知识库索引重建 — 生成 _index.md 供 Agent grep 使用,同时同步 index.json
93
+ */
94
+ export declare function knowledgeIndex(options: KnowledgeOptions & {
95
+ dir?: string;
96
+ }): void;
85
97
  //# sourceMappingURL=knowledge.d.ts.map