doc-freshness-checker 2.0.22 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +10 -3
  2. package/dist/cache/cacheManager.d.ts +20 -2
  3. package/dist/cache/cacheManager.js +137 -39
  4. package/dist/cache/cacheManager.js.map +1 -1
  5. package/dist/cache/cacheManager.test.js +132 -4
  6. package/dist/cache/cacheManager.test.js.map +1 -1
  7. package/dist/index.d.ts +6 -1
  8. package/dist/index.js +5 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/manifests/manifestInventory.d.ts +28 -0
  11. package/dist/manifests/manifestInventory.js +225 -0
  12. package/dist/manifests/manifestInventory.js.map +1 -0
  13. package/dist/manifests/manifestInventory.test.d.ts +1 -0
  14. package/dist/manifests/manifestInventory.test.js +176 -0
  15. package/dist/manifests/manifestInventory.test.js.map +1 -0
  16. package/dist/manifests/validatorConstructors.test.d.ts +1 -0
  17. package/dist/manifests/validatorConstructors.test.js +17 -0
  18. package/dist/manifests/validatorConstructors.test.js.map +1 -0
  19. package/dist/parsers/documentParser.d.ts +2 -3
  20. package/dist/parsers/documentParser.js.map +1 -1
  21. package/dist/parsers/extractorInterface.test.d.ts +1 -0
  22. package/dist/parsers/extractorInterface.test.js +34 -0
  23. package/dist/parsers/extractorInterface.test.js.map +1 -0
  24. package/dist/parsers/extractors/codeSnippetExtractor.js.map +1 -1
  25. package/dist/plugins/plugin.d.ts +5 -1
  26. package/dist/plugins/plugin.js +5 -1
  27. package/dist/plugins/plugin.js.map +1 -1
  28. package/dist/reporters/consoleReporter.d.ts +5 -11
  29. package/dist/reporters/consoleReporter.js +74 -76
  30. package/dist/reporters/consoleReporter.js.map +1 -1
  31. package/dist/reporters/consoleReporter.test.js +22 -27
  32. package/dist/reporters/consoleReporter.test.js.map +1 -1
  33. package/dist/reporters/enhancedReporter.d.ts +51 -7
  34. package/dist/reporters/enhancedReporter.js +128 -74
  35. package/dist/reporters/enhancedReporter.js.map +1 -1
  36. package/dist/reporters/enhancedReporter.test.js +110 -122
  37. package/dist/reporters/enhancedReporter.test.js.map +1 -1
  38. package/dist/reporters/jsonReporter.d.ts +6 -6
  39. package/dist/reporters/jsonReporter.js +24 -14
  40. package/dist/reporters/jsonReporter.js.map +1 -1
  41. package/dist/reporters/jsonReporter.test.js +26 -11
  42. package/dist/reporters/jsonReporter.test.js.map +1 -1
  43. package/dist/reporters/markdownIssueCells.d.ts +7 -0
  44. package/dist/reporters/markdownIssueCells.js +9 -0
  45. package/dist/reporters/markdownIssueCells.js.map +1 -0
  46. package/dist/reporters/markdownReporter.d.ts +2 -7
  47. package/dist/reporters/markdownReporter.js +57 -56
  48. package/dist/reporters/markdownReporter.js.map +1 -1
  49. package/dist/reporters/markdownReporter.test.js +104 -76
  50. package/dist/reporters/markdownReporter.test.js.map +1 -1
  51. package/dist/reporters/publicReporterApi.test.d.ts +1 -0
  52. package/dist/reporters/publicReporterApi.test.js +28 -0
  53. package/dist/reporters/publicReporterApi.test.js.map +1 -0
  54. package/dist/reporters/reportContext.d.ts +12 -0
  55. package/dist/reporters/reportContext.js +8 -0
  56. package/dist/reporters/reportContext.js.map +1 -0
  57. package/dist/reporters/reportContext.test.d.ts +1 -0
  58. package/dist/reporters/reportContext.test.js +30 -0
  59. package/dist/reporters/reportContext.test.js.map +1 -0
  60. package/dist/reporters/reporters.characterization.test.d.ts +1 -0
  61. package/dist/reporters/reporters.characterization.test.js +208 -0
  62. package/dist/reporters/reporters.characterization.test.js.map +1 -0
  63. package/dist/runner.js +88 -85
  64. package/dist/runner.js.map +1 -1
  65. package/dist/runner.test.js +545 -56
  66. package/dist/runner.test.js.map +1 -1
  67. package/dist/semantic/vectorSearch.d.ts +3 -3
  68. package/dist/semantic/vectorSearch.js +29 -30
  69. package/dist/semantic/vectorSearch.js.map +1 -1
  70. package/dist/semantic/vectorSearch.test.js +53 -4
  71. package/dist/semantic/vectorSearch.test.js.map +1 -1
  72. package/dist/source/sourceIndex.d.ts +39 -0
  73. package/dist/source/sourceIndex.js +444 -0
  74. package/dist/source/sourceIndex.js.map +1 -0
  75. package/dist/source/sourceIndex.largeGlob.test.d.ts +1 -0
  76. package/dist/source/sourceIndex.largeGlob.test.js +29 -0
  77. package/dist/source/sourceIndex.largeGlob.test.js.map +1 -0
  78. package/dist/source/sourceIndex.test.d.ts +1 -0
  79. package/dist/source/sourceIndex.test.js +263 -0
  80. package/dist/source/sourceIndex.test.js.map +1 -0
  81. package/dist/source/sourceValidators.d.ts +7 -0
  82. package/dist/source/sourceValidators.js +8 -0
  83. package/dist/source/sourceValidators.js.map +1 -0
  84. package/dist/source/sourceValidators.test.d.ts +1 -0
  85. package/dist/source/sourceValidators.test.js +17 -0
  86. package/dist/source/sourceValidators.test.js.map +1 -0
  87. package/dist/types.d.ts +12 -2
  88. package/dist/utils/incremental.d.ts +3 -1
  89. package/dist/utils/incremental.js +32 -8
  90. package/dist/utils/incremental.js.map +1 -1
  91. package/dist/utils/incremental.test.js +17 -0
  92. package/dist/utils/incremental.test.js.map +1 -1
  93. package/dist/validators/codePatternValidator.d.ts +5 -11
  94. package/dist/validators/codePatternValidator.js +17 -145
  95. package/dist/validators/codePatternValidator.js.map +1 -1
  96. package/dist/validators/codeSnippetValidator.d.ts +5 -18
  97. package/dist/validators/codeSnippetValidator.js +19 -312
  98. package/dist/validators/codeSnippetValidator.js.map +1 -1
  99. package/dist/validators/dependencyValidator.d.ts +0 -5
  100. package/dist/validators/dependencyValidator.js +7 -64
  101. package/dist/validators/dependencyValidator.js.map +1 -1
  102. package/dist/validators/versionValidator.d.ts +1 -10
  103. package/dist/validators/versionValidator.js +7 -157
  104. package/dist/validators/versionValidator.js.map +1 -1
  105. package/dist/validators/versionValidator.test.js +1 -101
  106. package/dist/validators/versionValidator.test.js.map +1 -1
  107. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publicReporterApi.test.js","sourceRoot":"","sources":["../../src/reporters/publicReporterApi.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AAOzC,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,YAAY,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,qBAAqB,EAAE,CAAC;QAChE,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,qBAAqB,EAAE,CAAC;QAC7D,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,EAAE,CAAC;QACjE,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,EAAE,CAAC;QAEjE,YAAY,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,aAAa,EAAuB,CAAC;QAC3G,YAAY,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC9E,YAAY,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,aAAa,EAE1F,CAAC;QACJ,YAAY,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACxF,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,aAAa,EAAuB,CAAC;QACxG,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7E,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,aAAa,EAA6C,CAAC;QACxI,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACvF,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,aAAa,EAAuB,CAAC;QAC5G,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACjF,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,aAAa,EAE3F,CAAC;QACJ,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3F,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,aAAa,EAE3F,CAAC;QACJ,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3F,YAAY,EAAqB,CAAC,OAAO,EAAE,CAAC;QAE5C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QACtD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ProjectScores, ValidationResults } from '../types.js';
2
+ type DeepReadonly<T> = T extends readonly (infer Item)[] ? readonly DeepReadonly<Item>[] : T extends object ? {
3
+ readonly [Key in keyof T]: DeepReadonly<T[Key]>;
4
+ } : T;
5
+ interface ReportContext {
6
+ readonly results: DeepReadonly<ValidationResults>;
7
+ readonly freshnessScores: DeepReadonly<ProjectScores> | null | undefined;
8
+ readonly generatedAt?: string;
9
+ }
10
+ export declare function createReportContext(results: ValidationResults, freshnessScores?: ProjectScores | null | undefined): ReportContext;
11
+ export declare function createTimestampedReportContext(results: ValidationResults, freshnessScores?: ProjectScores | null | undefined): ReportContext;
12
+ export {};
@@ -0,0 +1,8 @@
1
+ export function createReportContext(results, freshnessScores = undefined) {
2
+ return Object.freeze({ results, freshnessScores });
3
+ }
4
+ export function createTimestampedReportContext(results, freshnessScores = undefined) {
5
+ const capturedResults = Object.freeze({ ...results });
6
+ return Object.freeze({ results: capturedResults, freshnessScores, generatedAt: new Date().toISOString() });
7
+ }
8
+ //# sourceMappingURL=reportContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reportContext.js","sourceRoot":"","sources":["../../src/reporters/reportContext.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,mBAAmB,CACjC,OAA0B,EAC1B,kBAAoD,SAAS;IAE7D,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,OAA0B,EAC1B,kBAAoD,SAAS;IAE7D,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC7G,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
1
+ import { createReportContext } from './reportContext.js';
2
+ const results = {
3
+ documents: [],
4
+ summary: { total: 0, valid: 0, errors: 0, warnings: 0, skipped: 0 },
5
+ };
6
+ const scores = {
7
+ projectScore: 100,
8
+ projectGrade: 'A',
9
+ documents: [],
10
+ summary: { total: 0, gradeA: 0, gradeB: 0, gradeC: 0, gradeD: 0, gradeF: 0 },
11
+ };
12
+ describe('ReportContext ownership', () => {
13
+ it('exposes caller data as deeply readonly without freezing caller-owned objects', () => {
14
+ const report = createReportContext(results, scores);
15
+ const readonlyContract = () => {
16
+ // @ts-expect-error Report contexts expose validation results as readonly views.
17
+ report.results.summary.total = 1;
18
+ // @ts-expect-error Report contexts expose nested arrays as readonly views.
19
+ report.results.documents.push({ path: 'docs/new.md', issues: [] });
20
+ // @ts-expect-error Report contexts expose scores as readonly views.
21
+ report.freshnessScores.documents.push({});
22
+ };
23
+ expectTypeOf(readonlyContract).toBeFunction();
24
+ expect(Object.isFrozen(report)).toBe(true);
25
+ expect(Object.isFrozen(results)).toBe(false);
26
+ expect(Object.isFrozen(results.summary)).toBe(false);
27
+ expect(Object.isFrozen(scores)).toBe(false);
28
+ });
29
+ });
30
+ //# sourceMappingURL=reportContext.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reportContext.test.js","sourceRoot":"","sources":["../../src/reporters/reportContext.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,OAAO,GAAsB;IACjC,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;CACpE,CAAC;AAEF,MAAM,MAAM,GAAkB;IAC5B,YAAY,EAAE,GAAG;IACjB,YAAY,EAAE,GAAG;IACjB,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;CAC7E,CAAC;AAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,gBAAgB,GAAG,GAAS,EAAE;YAClC,gFAAgF;YAChF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;YACjC,2EAA2E;YAC3E,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACnE,oEAAoE;YACpE,MAAM,CAAC,eAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEF,YAAY,CAAC,gBAAgB,CAAC,CAAC,YAAY,EAAE,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,208 @@
1
+ import { CodeDocGraph } from '../graph/codeDocGraph.js';
2
+ import { captureConsoleLog } from '../test-utils/console.js';
3
+ import { ConsoleReporter } from './consoleReporter.js';
4
+ import { EnhancedReporter } from './enhancedReporter.js';
5
+ import { JsonReporter } from './jsonReporter.js';
6
+ import { MarkdownReporter } from './markdownReporter.js';
7
+ const generatedAt = '2025-01-02T03:04:05.678Z';
8
+ const reference = (type, lineNumber) => ({
9
+ type,
10
+ value: 'value',
11
+ lineNumber,
12
+ raw: 'value',
13
+ sourceFile: 'api.md',
14
+ });
15
+ const cleanResults = {
16
+ documents: [],
17
+ summary: { total: 2, valid: 2, errors: 0, warnings: 0, skipped: 0 },
18
+ };
19
+ const issueResults = {
20
+ documents: [
21
+ {
22
+ path: 'docs/api.md',
23
+ issues: [
24
+ { reference: reference('file-path', 4), valid: false, severity: 'error', message: 'Missing | file', suggestion: 'Try | next' },
25
+ { reference: reference('external-url', 8), valid: false, severity: 'warning', message: 'Old URL' },
26
+ { reference: reference('dependency', 12), valid: false, severity: 'info', message: '', suggestion: null },
27
+ ],
28
+ },
29
+ ],
30
+ summary: { total: 3, valid: 0, errors: 1, warnings: 1, info: 1, skipped: 0 },
31
+ vectorMismatches: [
32
+ {
33
+ docPath: 'docs/api.md',
34
+ docSection: 'Usage',
35
+ docText: 'Example',
36
+ bestMatchScore: 0.125,
37
+ bestMatch: null,
38
+ suggestion: 'Review this section',
39
+ },
40
+ ],
41
+ };
42
+ const scores = {
43
+ projectScore: 85,
44
+ projectGrade: 'B',
45
+ documents: [
46
+ {
47
+ document: 'docs/api.md',
48
+ totalScore: 85,
49
+ factors: { referenceValidity: 100, gitTimeDelta: 80, codeChangeFrequency: 75, symbolCoverage: 85 },
50
+ grade: 'B',
51
+ },
52
+ ],
53
+ summary: { total: 1, gradeA: 0, gradeB: 1, gradeC: 0, gradeD: 0, gradeF: 0 },
54
+ };
55
+ describe('reporter output compatibility', () => {
56
+ beforeEach(() => {
57
+ vi.useFakeTimers();
58
+ vi.setSystemTime(new Date(generatedAt));
59
+ });
60
+ afterEach(() => vi.useRealTimers());
61
+ it('preserves Console chunks, fallbacks, blank lines, and vector output', () => {
62
+ const log = captureConsoleLog();
63
+ const reporter = new ConsoleReporter();
64
+ reporter.generate(issueResults);
65
+ expect(log.mock.calls).toEqual([
66
+ '\n📚 Documentation Freshness Report\n',
67
+ '━'.repeat(50),
68
+ '\n📊 Summary:',
69
+ ' Total references checked: 3',
70
+ ' ✅ Valid: 0',
71
+ ' ❌ Errors: 1',
72
+ ' ⚠️ Warnings: 1',
73
+ ' ℹ️ Info: 1',
74
+ ' ⏭️ Skipped: 0',
75
+ '\n📋 Issues by Document:\n',
76
+ '\n📄 docs/api.md',
77
+ '─'.repeat(40),
78
+ ' ❌ Line 4: Missing | file',
79
+ ' 💡 Try | next',
80
+ ' ⚠️ Line 8: Old URL',
81
+ ' ℹ️ Line 12: ',
82
+ '\n',
83
+ '🔍 Semantic Analysis (Vector Search):\n',
84
+ ' Found 1 potential semantic mismatches:\n',
85
+ ' ⚠️ docs/api.md',
86
+ ' Section: "Usage"',
87
+ ' Similarity: 12.5%',
88
+ ' Best match: -',
89
+ ' 💡 Review this section',
90
+ '',
91
+ ].map((line) => [line]));
92
+ log.mockClear();
93
+ reporter.generateWithScores(issueResults, null);
94
+ expect(log.mock.calls.slice(-8)).toEqual([
95
+ '🔍 Semantic Analysis (Vector Search):\n',
96
+ ' Found 1 potential semantic mismatches:\n',
97
+ ' ⚠️ docs/api.md',
98
+ ' Section: "Usage"',
99
+ ' Similarity: 12.5%',
100
+ ' Best match: -',
101
+ ' 💡 Review this section',
102
+ '',
103
+ ].map((line) => [line]));
104
+ log.mockClear();
105
+ reporter.generate(cleanResults);
106
+ expect(log.mock.calls.at(-1)).toEqual(['\n✨ All documentation is up to date!\n']);
107
+ });
108
+ it('preserves JSON bytes, key order, indentation, timestamp, and score modes', () => {
109
+ const reporter = new JsonReporter();
110
+ expect(reporter.generate(issueResults)).toBe(JSON.stringify(issueResults, null, 2));
111
+ expect(reporter.generateWithScores(cleanResults, null)).toBe(JSON.stringify({ ...cleanResults, summary: { ...cleanResults.summary, info: 0 }, freshnessScores: null, generatedAt }, null, 2));
112
+ expect(reporter.generateWithScores(cleanResults, scores)).toBe(JSON.stringify({ ...cleanResults, summary: { ...cleanResults.summary, info: 0 }, freshnessScores: scores, generatedAt }, null, 2));
113
+ });
114
+ it('preserves Markdown issue, clean, null-score, and populated-score bytes', () => {
115
+ const reporter = new MarkdownReporter();
116
+ expect(reporter.generate(issueResults)).toBe(`# Documentation Freshness Report
117
+
118
+ Generated: ${generatedAt}
119
+
120
+ ## Summary
121
+
122
+ | Metric | Count |
123
+ |--------|-------|
124
+ | Total Checked | 3 |
125
+ | ✅ Valid | 0 |
126
+ | ❌ Errors | 1 |
127
+ | ⚠️ Warnings | 1 |
128
+ | ℹ️ Info | 1 |
129
+ | ⏭️ Skipped | 0 |
130
+
131
+ ## Issues
132
+
133
+ ### 📄 \`docs/api.md\`
134
+
135
+ | Line | Severity | Issue | Suggestion |
136
+ |------|----------|-------|------------|
137
+ | 4 | ❌ Error | Missing \\| file | Try \\| next |
138
+ | 8 | ⚠️ Warning | Old URL | - |
139
+ | 12 | ℹ️ Info | | - |
140
+
141
+ ## 🔍 Semantic Analysis (Vector Search)
142
+
143
+ | Document | Section | Similarity | Best Match | Suggestion |
144
+ |----------|---------|------------|------------|------------|
145
+ | docs/api.md | Usage | 12.5% | - | Review this section |
146
+
147
+ `);
148
+ const clean = `# Documentation Freshness Report
149
+
150
+ Generated: ${generatedAt}
151
+
152
+ ## Summary
153
+
154
+ | Metric | Count |
155
+ |--------|-------|
156
+ | Total Checked | 2 |
157
+ | ✅ Valid | 2 |
158
+ | ❌ Errors | 0 |
159
+ | ⚠️ Warnings | 0 |
160
+ | ℹ️ Info | 0 |
161
+ | ⏭️ Skipped | 0 |
162
+
163
+ ✨ **All documentation is up to date!**
164
+ `;
165
+ expect(reporter.generate(cleanResults)).toBe(clean);
166
+ expect(reporter.generateWithScores(cleanResults, null)).toBe(clean);
167
+ expect(reporter.generateWithScores(cleanResults, scores)).toBe(`${clean}## Freshness Scores\n\n**Project Score:** 85/100 (Grade: B)\n\n` +
168
+ '| Document | Score | Grade |\n|----------|-------|-------|\n| `docs/api.md` | 85/100 | B |\n\n');
169
+ });
170
+ it('preserves complete Enhanced bytes and collaborator order', () => {
171
+ const calls = [];
172
+ const graph = new CodeDocGraph();
173
+ for (const file of ['src/z.ts', 'src/a.ts']) {
174
+ graph.addReference('docs/api.md', file, reference('file-path', 1));
175
+ }
176
+ const locale = vi.spyOn(Date.prototype, 'toLocaleDateString').mockImplementation(function () {
177
+ calls.push(`locale:${this.getTime()}`);
178
+ return '1/1/2025';
179
+ });
180
+ const gitTracker = {
181
+ isGitRepo: vi.fn(() => (calls.push('isGitRepo'), true)),
182
+ getFileCommitInfo: vi.fn((file) => {
183
+ calls.push(`commit:${file}`);
184
+ return { hash: 'abc', timestamp: file === 'src/z.ts' ? 1735689600000 : 1735776000000, message: 'change' };
185
+ }),
186
+ getChangedFilesSince: vi.fn(() => (calls.push('changedFiles'), ['src/z.ts'])),
187
+ getAffectedDocs: vi.fn(() => (calls.push('affectedDocs'), ['docs/api.md', 'docs/other.md'])),
188
+ };
189
+ const expected = `# 📚 Documentation Freshness Scan Report\n\n**Generated:** ${generatedAt}\n\n` +
190
+ '## 📊 Project Freshness Score: 85/100 (Grade: B)\n\n| Grade | Count |\n|-------|-------|\n' +
191
+ '| A (90-100) | 0 |\n| B (80-89) | 1 |\n| C (70-79) | 0 |\n| D (60-69) | 0 |\n| F (0-59) | 0 |\n\n' +
192
+ '## ✅ Validation Summary\n\n- **Total References:** 3\n- **Valid:** 0\n- **Errors:** 1\n- **Warnings:** 1\n- **Info:** 1\n\n' +
193
+ '## 📋 Affected Documents\n\n### 📄 `docs/api.md` (Score: 85, Grade: B)\n\n**Referenced Code Files:**\n' +
194
+ '- `src/z.ts` (last modified: 1/1/2025)\n- `src/a.ts` (last modified: 1/1/2025)\n\n' +
195
+ '| Line | Type | Issue | Suggestion |\n|------|------|-------|------------|\n' +
196
+ '| 4 | ❌ file-path | Missing \\| file | Try \\| next |\n| 8 | ⚠️ external-url | Old URL | - |\n| 12 | ℹ️ dependency | | - |\n\n' +
197
+ '## 🔍 Semantic Analysis (Vector Search)\n\n| Document | Section | Similarity | Best Match | Suggestion |\n' +
198
+ '|----------|---------|------------|------------|------------|\n' +
199
+ '| docs/api.md | Usage | 12.5% | - | Review this section |\n\n' +
200
+ '## 🔄 Recent Code Changes Impacting Docs\n\nThe following documents reference code that changed in the last 7 days:\n\n' +
201
+ '- `docs/api.md`\n- `docs/other.md`\n\n';
202
+ expect(new EnhancedReporter().generateScanReport(issueResults, graph, gitTracker, scores)).toBe(expected);
203
+ expect(gitTracker.getChangedFilesSince).toHaveBeenCalledWith(Date.parse(generatedAt) - 7 * 24 * 60 * 60 * 1000);
204
+ expect(calls.join('|')).toBe('commit:src/z.ts|locale:1735689600000|commit:src/a.ts|locale:1735776000000|isGitRepo|changedFiles|affectedDocs');
205
+ locale.mockRestore();
206
+ });
207
+ });
208
+ //# sourceMappingURL=reporters.characterization.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporters.characterization.test.js","sourceRoot":"","sources":["../../src/reporters/reporters.characterization.test.ts"],"names":[],"mappings":"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"}
package/dist/runner.js CHANGED
@@ -11,21 +11,23 @@ import { CodeSnippetExtractor } from './parsers/extractors/codeSnippetExtractor.
11
11
  import { ValidationEngine } from './validators/validationEngine.js';
12
12
  import { FileValidator } from './validators/fileValidator.js';
13
13
  import { UrlValidator } from './validators/urlValidator.js';
14
- import { VersionValidator } from './validators/versionValidator.js';
15
14
  import { DirectoryValidator } from './validators/directoryValidator.js';
16
- import { CodePatternValidator } from './validators/codePatternValidator.js';
17
15
  import { DependencyValidator } from './validators/dependencyValidator.js';
18
- import { CodeSnippetValidator } from './validators/codeSnippetValidator.js';
19
- import { ConsoleReporter } from './reporters/consoleReporter.js';
20
- import { JsonReporter } from './reporters/jsonReporter.js';
21
- import { MarkdownReporter } from './reporters/markdownReporter.js';
22
- import { EnhancedReporter } from './reporters/enhancedReporter.js';
16
+ import { VersionValidator } from './validators/versionValidator.js';
17
+ import { attachInventory, ManifestInventory } from './manifests/manifestInventory.js';
18
+ import { emitConsoleReport } from './reporters/consoleReporter.js';
19
+ import { createScoredJsonReportContext, renderJsonReport } from './reporters/jsonReporter.js';
20
+ import { generateMarkdownReport } from './reporters/markdownReporter.js';
21
+ import { createEnhancedReportContext, renderEnhancedReport } from './reporters/enhancedReporter.js';
22
+ import { createReportContext } from './reporters/reportContext.js';
23
23
  import { GraphBuilder } from './graph/graphBuilder.js';
24
24
  import { GitChangeTracker } from './git/changeTracker.js';
25
25
  import { CacheManager } from './cache/cacheManager.js';
26
26
  import { FreshnessScorer } from './scoring/freshnessScorer.js';
27
27
  import { IncrementalChecker } from './utils/incremental.js';
28
28
  import { VectorSearch } from './semantic/vectorSearch.js';
29
+ import { SourceIndex } from './source/sourceIndex.js';
30
+ import { createSourceValidators } from './source/sourceValidators.js';
29
31
  import { loadConfig } from './config/loader.js';
30
32
  import { BUILT_IN_RULE_TYPES } from './config/defaults.js';
31
33
  import { validateConfig } from './config/validateConfig.js';
@@ -35,11 +37,38 @@ const REPORTER_OUTPUT = {
35
37
  markdown: 'timestamped',
36
38
  enhanced: 'timestamped',
37
39
  };
40
+ const reporterDefinitions = {
41
+ console: {
42
+ generate: ({ results, freshnessScores }) => {
43
+ emitConsoleReport(createReportContext(results, freshnessScores || undefined));
44
+ return null;
45
+ },
46
+ },
47
+ json: {
48
+ generate: ({ results, freshnessScores }) => ({
49
+ content: renderJsonReport(freshnessScores ? createScoredJsonReportContext(results, freshnessScores) : createReportContext(results)),
50
+ label: 'JSON',
51
+ }),
52
+ },
53
+ markdown: {
54
+ generate: ({ results, freshnessScores }) => ({
55
+ content: generateMarkdownReport(results, freshnessScores || undefined),
56
+ label: 'Markdown',
57
+ }),
58
+ },
59
+ enhanced: {
60
+ generate: ({ results, graph, gitTracker, freshnessScores }) => ({
61
+ content: renderEnhancedReport(createEnhancedReportContext(results, graph, gitTracker, freshnessScores)),
62
+ label: 'Enhanced',
63
+ }),
64
+ },
65
+ };
38
66
  /**
39
67
  * Main entry point - run with config object
40
68
  */
41
69
  export async function run(config) {
42
70
  validateConfig(config);
71
+ const cacheManager = new CacheManager(config);
43
72
  // Show config file status in verbose mode
44
73
  if (config.verbose) {
45
74
  if (config._configFile) {
@@ -54,7 +83,6 @@ export async function run(config) {
54
83
  }
55
84
  // Clear cache if requested
56
85
  if (config.clearCache) {
57
- const cacheManager = new CacheManager(config);
58
86
  await cacheManager.clearCache();
59
87
  if (config.verbose) {
60
88
  console.log('Cache cleared.');
@@ -78,16 +106,23 @@ export async function run(config) {
78
106
  }
79
107
  }
80
108
  // Register validators
81
- const codePatternValidator = new CodePatternValidator();
109
+ const sourceIndex = new SourceIndex();
110
+ const sourceValidators = createSourceValidators(sourceIndex);
111
+ const codePatternValidator = sourceValidators.pattern;
82
112
  const urlValidator = new UrlValidator();
113
+ const manifestInventory = new ManifestInventory();
114
+ const versionValidator = new VersionValidator();
115
+ const dependencyValidator = new DependencyValidator();
116
+ attachInventory(versionValidator, manifestInventory);
117
+ attachInventory(dependencyValidator, manifestInventory);
83
118
  const builtInValidators = {
84
119
  'file-path': new FileValidator(),
85
120
  'external-url': urlValidator,
86
- version: new VersionValidator(),
121
+ version: versionValidator,
87
122
  'directory-structure': new DirectoryValidator(),
88
123
  'code-pattern': codePatternValidator,
89
- 'code-snippet': new CodeSnippetValidator(),
90
- dependency: new DependencyValidator(),
124
+ 'code-snippet': sourceValidators.snippet,
125
+ dependency: dependencyValidator,
91
126
  };
92
127
  for (const type of BUILT_IN_RULE_TYPES) {
93
128
  validationEngine.registerValidator(type, builtInValidators[type]);
@@ -99,11 +134,7 @@ export async function run(config) {
99
134
  }
100
135
  }
101
136
  // Load URL cache if available
102
- if (config.cache?.enabled !== false) {
103
- const cacheManager = new CacheManager(config);
104
- const urlCache = await cacheManager.loadUrlCache();
105
- urlValidator.loadCache(urlCache);
106
- }
137
+ urlValidator.loadCache(await cacheManager.loadUrlCache());
107
138
  // Parse documents
108
139
  if (config.verbose) {
109
140
  console.log('Scanning documentation files...');
@@ -116,16 +147,17 @@ export async function run(config) {
116
147
  // Apply incremental checking if enabled
117
148
  let incrementalChecker = null;
118
149
  if (config.incremental?.enabled && allDocuments.length > 0) {
119
- const stateDir = path.resolve(config.rootDir || process.cwd(), config.cache?.dir || config.graph?.cacheDir || '.doc-freshness-cache');
120
- const incrementalInputs = await validationEngine.captureIncrementalInputs(allDocuments);
121
- const finalFileReporter = (config.reporters || ['console']).findLast((reporter) => REPORTER_OUTPUT[reporter] === 'stable' || REPORTER_OUTPUT[reporter] === 'timestamped');
122
- const inventoryExclusions = config.outputPath && finalFileReporter && REPORTER_OUTPUT[finalFileReporter] === 'timestamped'
123
- ? [path.resolve(config.outputPath)]
124
- : [];
125
- incrementalChecker = new IncrementalChecker(stateDir);
126
- documentsToValidate = await incrementalChecker.filterChanged(allDocuments, config, incrementalInputs, inventoryExclusions);
150
+ if (cacheManager.policy.enabled) {
151
+ const incrementalInputs = await validationEngine.captureIncrementalInputs(allDocuments);
152
+ const finalFileReporter = (config.reporters || ['console']).findLast((reporter) => REPORTER_OUTPUT[reporter] === 'stable' || REPORTER_OUTPUT[reporter] === 'timestamped');
153
+ const inventoryExclusions = config.outputPath && finalFileReporter && REPORTER_OUTPUT[finalFileReporter] === 'timestamped'
154
+ ? [path.resolve(config.outputPath)]
155
+ : [];
156
+ incrementalChecker = new IncrementalChecker(cacheManager);
157
+ documentsToValidate = await incrementalChecker.filterChanged(allDocuments, config, incrementalInputs, inventoryExclusions);
158
+ }
127
159
  if (config.verbose) {
128
- const stats = incrementalChecker.getStats(allDocuments.length, documentsToValidate.length);
160
+ const stats = (incrementalChecker ?? new IncrementalChecker(cacheManager.policy.dir)).getStats(allDocuments.length, documentsToValidate.length);
129
161
  console.log(`Incremental mode: checking ${stats.changed} changed files, skipping ${stats.skipped} unchanged.`);
130
162
  }
131
163
  }
@@ -141,27 +173,29 @@ export async function run(config) {
141
173
  console.log('Validating references...');
142
174
  }
143
175
  const results = await validationEngine.validate(documentsToValidate);
176
+ try {
177
+ await cacheManager.saveUrlCache(urlValidator.exportCache());
178
+ }
179
+ catch (error) {
180
+ if (config.verbose) {
181
+ console.warn(`Could not save the URL cache: ${error instanceof Error ? error.message : String(error)}`);
182
+ }
183
+ }
144
184
  // Build graph if enabled
145
185
  let graph = null;
146
186
  let gitTracker = null;
147
187
  let freshnessScores = null;
188
+ let sourceIndexLoadedByGraph = false;
148
189
  if (config.graph?.enabled !== false) {
149
190
  gitTracker = new GitChangeTracker(config);
150
- // Build source code index for graph
151
- await codePatternValidator.buildSourceIndex(config);
152
- const codeIndex = codePatternValidator.getSourceIndex();
191
+ const sourceSnapshot = await sourceIndex.load(config, 'pattern');
192
+ sourceIndexLoadedByGraph = true;
153
193
  // Build graph
154
194
  const graphBuilder = new GraphBuilder(config);
155
- graph = await graphBuilder.buildGraph(allDocuments, codeIndex);
195
+ graph = await graphBuilder.buildGraph(allDocuments, sourceSnapshot.symbols);
156
196
  if (gitTracker.isGitRepo()) {
157
197
  graph.gitCommit = gitTracker.getCurrentCommit();
158
198
  }
159
- // Save graph cache
160
- if (config.cache?.enabled !== false) {
161
- const cacheManager = new CacheManager(config);
162
- await cacheManager.saveGraph(graph);
163
- await cacheManager.saveUrlCache(urlValidator.exportCache());
164
- }
165
199
  // Calculate freshness scores if enabled
166
200
  if (config.freshnessScoring?.enabled) {
167
201
  const scorer = new FreshnessScorer(config);
@@ -169,25 +203,19 @@ export async function run(config) {
169
203
  }
170
204
  }
171
205
  // Run vector search if enabled
172
- let vectorMismatches = null;
173
206
  if (config.vectorSearch?.enabled) {
174
207
  // Always show this message since embedding generation can take time
175
208
  console.log('🔍 Running semantic analysis (this may take a moment on first run)...');
176
- const vectorSearch = new VectorSearch(config);
209
+ const vectorSearch = new VectorSearch(config, cacheManager);
177
210
  // Index documentation
178
211
  if (config.verbose) {
179
212
  console.log(' Indexing documentation sections...');
180
213
  }
181
214
  await vectorSearch.indexDocumentation(allDocuments);
182
- // Ensure source index is built (may already be built if graph is enabled)
183
- if (!codePatternValidator.getSourceIndex()) {
184
- if (config.verbose) {
185
- console.log(' Building source code index...');
186
- }
187
- await codePatternValidator.buildSourceIndex(config);
215
+ if (!sourceIndexLoadedByGraph && codePatternValidator.getSourceIndex() === null && config.verbose) {
216
+ console.log(' Building source code index...');
188
217
  }
189
- // Index code comments from source files
190
- const sourceFiles = codePatternValidator.getSourceFiles();
218
+ const sourceFiles = (await sourceIndex.load(config, 'pattern')).patternFiles;
191
219
  if (sourceFiles && sourceFiles.size > 0) {
192
220
  if (config.verbose) {
193
221
  console.log(` Indexing code comments from ${sourceFiles.size} source files...`);
@@ -203,7 +231,7 @@ export async function run(config) {
203
231
  if (config.verbose) {
204
232
  console.log(' Finding semantic mismatches...');
205
233
  }
206
- vectorMismatches = await vectorSearch.findMismatches();
234
+ const vectorMismatches = await vectorSearch.findMismatches();
207
235
  const stats = vectorSearch.getCacheStats();
208
236
  console.log(` ✓ Analyzed ${stats.indexedDocSections} doc sections and ${stats.indexedCodeComments} code comments`);
209
237
  if (config.verbose) {
@@ -238,48 +266,23 @@ export async function runWithConfig(configPath) {
238
266
  */
239
267
  async function generateReports(results, config, graph, gitTracker, freshnessScores) {
240
268
  const reporters = config.reporters?.length ? config.reporters : ['console'];
241
- const emitOutput = async (output, reportName) => {
269
+ for (const reporterType of reporters) {
270
+ if (!Object.hasOwn(reporterDefinitions, reporterType)) {
271
+ console.warn(`Unknown reporter type: ${reporterType}`);
272
+ continue;
273
+ }
274
+ const output = reporterDefinitions[reporterType].generate({ results, graph, gitTracker, freshnessScores });
275
+ if (!output) {
276
+ continue;
277
+ }
242
278
  if (config.outputPath) {
243
- await writeOutput(config.outputPath, output);
279
+ await writeOutput(config.outputPath, output.content);
244
280
  if (config.verbose) {
245
- console.log(`${reportName} report written to ${config.outputPath}`);
281
+ console.log(`${output.label} report written to ${config.outputPath}`);
246
282
  }
247
- return;
248
283
  }
249
- console.log(output);
250
- };
251
- for (const reporterType of reporters) {
252
- switch (reporterType) {
253
- case 'console': {
254
- const reporter = new ConsoleReporter();
255
- if (freshnessScores) {
256
- reporter.generateWithScores(results, freshnessScores);
257
- }
258
- else {
259
- reporter.generate(results);
260
- }
261
- break;
262
- }
263
- case 'json': {
264
- const reporter = new JsonReporter();
265
- const output = freshnessScores ? reporter.generateWithScores(results, freshnessScores) : reporter.generate(results);
266
- await emitOutput(output, 'JSON');
267
- break;
268
- }
269
- case 'markdown': {
270
- const reporter = new MarkdownReporter();
271
- const output = freshnessScores ? reporter.generateWithScores(results, freshnessScores) : reporter.generate(results);
272
- await emitOutput(output, 'Markdown');
273
- break;
274
- }
275
- case 'enhanced': {
276
- const reporter = new EnhancedReporter();
277
- const output = reporter.generateScanReport(results, graph, gitTracker, freshnessScores);
278
- await emitOutput(output, 'Enhanced');
279
- break;
280
- }
281
- default:
282
- console.warn(`Unknown reporter type: ${reporterType}`);
284
+ else {
285
+ console.log(output.content);
283
286
  }
284
287
  }
285
288
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}