doc-freshness-checker 1.0.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 (246) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +305 -0
  3. package/dist/cache/cacheManager.d.ts +42 -0
  4. package/dist/cache/cacheManager.js +138 -0
  5. package/dist/cache/cacheManager.js.map +1 -0
  6. package/dist/cache/cacheManager.test.d.ts +1 -0
  7. package/dist/cache/cacheManager.test.js +142 -0
  8. package/dist/cache/cacheManager.test.js.map +1 -0
  9. package/dist/cli.d.ts +32 -0
  10. package/dist/cli.js +137 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/cli.test.d.ts +1 -0
  13. package/dist/cli.test.js +184 -0
  14. package/dist/cli.test.js.map +1 -0
  15. package/dist/config/defaults.d.ts +5 -0
  16. package/dist/config/defaults.js +135 -0
  17. package/dist/config/defaults.js.map +1 -0
  18. package/dist/config/defineConfig.d.ts +28 -0
  19. package/dist/config/defineConfig.js +30 -0
  20. package/dist/config/defineConfig.js.map +1 -0
  21. package/dist/config/defineConfig.test.d.ts +1 -0
  22. package/dist/config/defineConfig.test.js +10 -0
  23. package/dist/config/defineConfig.test.js.map +1 -0
  24. package/dist/config/loader.d.ts +7 -0
  25. package/dist/config/loader.js +250 -0
  26. package/dist/config/loader.js.map +1 -0
  27. package/dist/config/loader.test.d.ts +1 -0
  28. package/dist/config/loader.test.js +276 -0
  29. package/dist/config/loader.test.js.map +1 -0
  30. package/dist/git/changeTracker.d.ts +44 -0
  31. package/dist/git/changeTracker.js +149 -0
  32. package/dist/git/changeTracker.js.map +1 -0
  33. package/dist/git/changeTracker.test.d.ts +1 -0
  34. package/dist/git/changeTracker.test.js +184 -0
  35. package/dist/git/changeTracker.test.js.map +1 -0
  36. package/dist/graph/codeDocGraph.d.ts +43 -0
  37. package/dist/graph/codeDocGraph.js +103 -0
  38. package/dist/graph/codeDocGraph.js.map +1 -0
  39. package/dist/graph/codeDocGraph.test.d.ts +1 -0
  40. package/dist/graph/codeDocGraph.test.js +78 -0
  41. package/dist/graph/codeDocGraph.test.js.map +1 -0
  42. package/dist/graph/graphBuilder.d.ts +17 -0
  43. package/dist/graph/graphBuilder.js +76 -0
  44. package/dist/graph/graphBuilder.js.map +1 -0
  45. package/dist/graph/graphBuilder.test.d.ts +1 -0
  46. package/dist/graph/graphBuilder.test.js +87 -0
  47. package/dist/graph/graphBuilder.test.js.map +1 -0
  48. package/dist/index.d.ts +37 -0
  49. package/dist/index.js +37 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/parsers/documentParser.d.ts +22 -0
  52. package/dist/parsers/documentParser.js +76 -0
  53. package/dist/parsers/documentParser.js.map +1 -0
  54. package/dist/parsers/documentParser.test.d.ts +1 -0
  55. package/dist/parsers/documentParser.test.js +116 -0
  56. package/dist/parsers/documentParser.test.js.map +1 -0
  57. package/dist/parsers/extractors/baseExtractor.d.ts +19 -0
  58. package/dist/parsers/extractors/baseExtractor.js +33 -0
  59. package/dist/parsers/extractors/baseExtractor.js.map +1 -0
  60. package/dist/parsers/extractors/baseExtractor.test.d.ts +1 -0
  61. package/dist/parsers/extractors/baseExtractor.test.js +43 -0
  62. package/dist/parsers/extractors/baseExtractor.test.js.map +1 -0
  63. package/dist/parsers/extractors/codePatternExtractor.d.ts +13 -0
  64. package/dist/parsers/extractors/codePatternExtractor.js +108 -0
  65. package/dist/parsers/extractors/codePatternExtractor.js.map +1 -0
  66. package/dist/parsers/extractors/codePatternExtractor.test.d.ts +1 -0
  67. package/dist/parsers/extractors/codePatternExtractor.test.js +49 -0
  68. package/dist/parsers/extractors/codePatternExtractor.test.js.map +1 -0
  69. package/dist/parsers/extractors/dependencyExtractor.d.ts +12 -0
  70. package/dist/parsers/extractors/dependencyExtractor.js +92 -0
  71. package/dist/parsers/extractors/dependencyExtractor.js.map +1 -0
  72. package/dist/parsers/extractors/dependencyExtractor.test.d.ts +1 -0
  73. package/dist/parsers/extractors/dependencyExtractor.test.js +48 -0
  74. package/dist/parsers/extractors/dependencyExtractor.test.js.map +1 -0
  75. package/dist/parsers/extractors/directoryStructureExtractor.d.ts +34 -0
  76. package/dist/parsers/extractors/directoryStructureExtractor.js +168 -0
  77. package/dist/parsers/extractors/directoryStructureExtractor.js.map +1 -0
  78. package/dist/parsers/extractors/directoryStructureExtractor.test.d.ts +1 -0
  79. package/dist/parsers/extractors/directoryStructureExtractor.test.js +121 -0
  80. package/dist/parsers/extractors/directoryStructureExtractor.test.js.map +1 -0
  81. package/dist/parsers/extractors/externalUrlExtractor.d.ts +14 -0
  82. package/dist/parsers/extractors/externalUrlExtractor.js +53 -0
  83. package/dist/parsers/extractors/externalUrlExtractor.js.map +1 -0
  84. package/dist/parsers/extractors/externalUrlExtractor.test.d.ts +1 -0
  85. package/dist/parsers/extractors/externalUrlExtractor.test.js +85 -0
  86. package/dist/parsers/extractors/externalUrlExtractor.test.js.map +1 -0
  87. package/dist/parsers/extractors/filePathExtractor.d.ts +18 -0
  88. package/dist/parsers/extractors/filePathExtractor.js +72 -0
  89. package/dist/parsers/extractors/filePathExtractor.js.map +1 -0
  90. package/dist/parsers/extractors/filePathExtractor.test.d.ts +1 -0
  91. package/dist/parsers/extractors/filePathExtractor.test.js +73 -0
  92. package/dist/parsers/extractors/filePathExtractor.test.js.map +1 -0
  93. package/dist/parsers/extractors/versionExtractor.d.ts +11 -0
  94. package/dist/parsers/extractors/versionExtractor.js +74 -0
  95. package/dist/parsers/extractors/versionExtractor.js.map +1 -0
  96. package/dist/parsers/extractors/versionExtractor.test.d.ts +1 -0
  97. package/dist/parsers/extractors/versionExtractor.test.js +55 -0
  98. package/dist/parsers/extractors/versionExtractor.test.js.map +1 -0
  99. package/dist/plugins/plugin.d.ts +32 -0
  100. package/dist/plugins/plugin.js +40 -0
  101. package/dist/plugins/plugin.js.map +1 -0
  102. package/dist/plugins/plugin.test.d.ts +1 -0
  103. package/dist/plugins/plugin.test.js +23 -0
  104. package/dist/plugins/plugin.test.js.map +1 -0
  105. package/dist/reporters/consoleReporter.d.ts +15 -0
  106. package/dist/reporters/consoleReporter.js +73 -0
  107. package/dist/reporters/consoleReporter.js.map +1 -0
  108. package/dist/reporters/consoleReporter.test.d.ts +1 -0
  109. package/dist/reporters/consoleReporter.test.js +155 -0
  110. package/dist/reporters/consoleReporter.test.js.map +1 -0
  111. package/dist/reporters/enhancedReporter.d.ts +12 -0
  112. package/dist/reporters/enhancedReporter.js +81 -0
  113. package/dist/reporters/enhancedReporter.js.map +1 -0
  114. package/dist/reporters/enhancedReporter.test.d.ts +1 -0
  115. package/dist/reporters/enhancedReporter.test.js +152 -0
  116. package/dist/reporters/enhancedReporter.test.js.map +1 -0
  117. package/dist/reporters/jsonReporter.d.ts +11 -0
  118. package/dist/reporters/jsonReporter.js +20 -0
  119. package/dist/reporters/jsonReporter.js.map +1 -0
  120. package/dist/reporters/jsonReporter.test.d.ts +1 -0
  121. package/dist/reporters/jsonReporter.test.js +31 -0
  122. package/dist/reporters/jsonReporter.test.js.map +1 -0
  123. package/dist/reporters/markdownReporter.d.ts +11 -0
  124. package/dist/reporters/markdownReporter.js +55 -0
  125. package/dist/reporters/markdownReporter.js.map +1 -0
  126. package/dist/reporters/markdownReporter.test.d.ts +1 -0
  127. package/dist/reporters/markdownReporter.test.js +136 -0
  128. package/dist/reporters/markdownReporter.test.js.map +1 -0
  129. package/dist/runner.d.ts +9 -0
  130. package/dist/runner.js +265 -0
  131. package/dist/runner.js.map +1 -0
  132. package/dist/runner.test.d.ts +1 -0
  133. package/dist/runner.test.js +353 -0
  134. package/dist/runner.test.js.map +1 -0
  135. package/dist/scoring/freshnessScorer.d.ts +40 -0
  136. package/dist/scoring/freshnessScorer.js +170 -0
  137. package/dist/scoring/freshnessScorer.js.map +1 -0
  138. package/dist/scoring/freshnessScorer.test.d.ts +1 -0
  139. package/dist/scoring/freshnessScorer.test.js +397 -0
  140. package/dist/scoring/freshnessScorer.test.js.map +1 -0
  141. package/dist/semantic/vectorSearch.d.ts +84 -0
  142. package/dist/semantic/vectorSearch.js +484 -0
  143. package/dist/semantic/vectorSearch.js.map +1 -0
  144. package/dist/semantic/vectorSearch.test.d.ts +1 -0
  145. package/dist/semantic/vectorSearch.test.js +660 -0
  146. package/dist/semantic/vectorSearch.test.js.map +1 -0
  147. package/dist/setupTests.d.ts +4 -0
  148. package/dist/setupTests.js +11 -0
  149. package/dist/setupTests.js.map +1 -0
  150. package/dist/test-utils/console.d.ts +2 -0
  151. package/dist/test-utils/console.js +3 -0
  152. package/dist/test-utils/console.js.map +1 -0
  153. package/dist/test-utils/factories.d.ts +3 -0
  154. package/dist/test-utils/factories.js +25 -0
  155. package/dist/test-utils/factories.js.map +1 -0
  156. package/dist/test-utils/tempFiles.d.ts +1 -0
  157. package/dist/test-utils/tempFiles.js +12 -0
  158. package/dist/test-utils/tempFiles.js.map +1 -0
  159. package/dist/types.d.ts +304 -0
  160. package/dist/types.js +5 -0
  161. package/dist/types.js.map +1 -0
  162. package/dist/utils/boundedMap.d.ts +8 -0
  163. package/dist/utils/boundedMap.js +22 -0
  164. package/dist/utils/boundedMap.js.map +1 -0
  165. package/dist/utils/boundedMap.test.d.ts +1 -0
  166. package/dist/utils/boundedMap.test.js +57 -0
  167. package/dist/utils/boundedMap.test.js.map +1 -0
  168. package/dist/utils/illustrativePatterns.d.ts +28 -0
  169. package/dist/utils/illustrativePatterns.js +80 -0
  170. package/dist/utils/illustrativePatterns.js.map +1 -0
  171. package/dist/utils/illustrativePatterns.test.d.ts +1 -0
  172. package/dist/utils/illustrativePatterns.test.js +48 -0
  173. package/dist/utils/illustrativePatterns.test.js.map +1 -0
  174. package/dist/utils/incremental.d.ts +36 -0
  175. package/dist/utils/incremental.js +87 -0
  176. package/dist/utils/incremental.js.map +1 -0
  177. package/dist/utils/incremental.test.d.ts +1 -0
  178. package/dist/utils/incremental.test.js +84 -0
  179. package/dist/utils/incremental.test.js.map +1 -0
  180. package/dist/utils/parallel.d.ts +14 -0
  181. package/dist/utils/parallel.js +43 -0
  182. package/dist/utils/parallel.js.map +1 -0
  183. package/dist/utils/parallel.test.d.ts +1 -0
  184. package/dist/utils/parallel.test.js +48 -0
  185. package/dist/utils/parallel.test.js.map +1 -0
  186. package/dist/utils/pathSecurity.d.ts +12 -0
  187. package/dist/utils/pathSecurity.js +22 -0
  188. package/dist/utils/pathSecurity.js.map +1 -0
  189. package/dist/utils/pathSecurity.test.d.ts +1 -0
  190. package/dist/utils/pathSecurity.test.js +34 -0
  191. package/dist/utils/pathSecurity.test.js.map +1 -0
  192. package/dist/utils/similarity.d.ts +12 -0
  193. package/dist/utils/similarity.js +64 -0
  194. package/dist/utils/similarity.js.map +1 -0
  195. package/dist/utils/similarity.test.d.ts +1 -0
  196. package/dist/utils/similarity.test.js +49 -0
  197. package/dist/utils/similarity.test.js.map +1 -0
  198. package/dist/utils/validation.d.ts +13 -0
  199. package/dist/utils/validation.js +24 -0
  200. package/dist/utils/validation.js.map +1 -0
  201. package/dist/utils/validation.test.d.ts +1 -0
  202. package/dist/utils/validation.test.js +28 -0
  203. package/dist/utils/validation.test.js.map +1 -0
  204. package/dist/validators/codePatternValidator.d.ts +28 -0
  205. package/dist/validators/codePatternValidator.js +200 -0
  206. package/dist/validators/codePatternValidator.js.map +1 -0
  207. package/dist/validators/codePatternValidator.test.d.ts +1 -0
  208. package/dist/validators/codePatternValidator.test.js +86 -0
  209. package/dist/validators/codePatternValidator.test.js.map +1 -0
  210. package/dist/validators/dependencyValidator.d.ts +12 -0
  211. package/dist/validators/dependencyValidator.js +102 -0
  212. package/dist/validators/dependencyValidator.js.map +1 -0
  213. package/dist/validators/dependencyValidator.test.d.ts +1 -0
  214. package/dist/validators/dependencyValidator.test.js +179 -0
  215. package/dist/validators/dependencyValidator.test.js.map +1 -0
  216. package/dist/validators/directoryValidator.d.ts +30 -0
  217. package/dist/validators/directoryValidator.js +192 -0
  218. package/dist/validators/directoryValidator.js.map +1 -0
  219. package/dist/validators/directoryValidator.test.d.ts +1 -0
  220. package/dist/validators/directoryValidator.test.js +193 -0
  221. package/dist/validators/directoryValidator.test.js.map +1 -0
  222. package/dist/validators/fileValidator.d.ts +16 -0
  223. package/dist/validators/fileValidator.js +114 -0
  224. package/dist/validators/fileValidator.js.map +1 -0
  225. package/dist/validators/fileValidator.test.d.ts +1 -0
  226. package/dist/validators/fileValidator.test.js +108 -0
  227. package/dist/validators/fileValidator.test.js.map +1 -0
  228. package/dist/validators/urlValidator.d.ts +25 -0
  229. package/dist/validators/urlValidator.js +320 -0
  230. package/dist/validators/urlValidator.js.map +1 -0
  231. package/dist/validators/urlValidator.test.d.ts +1 -0
  232. package/dist/validators/urlValidator.test.js +252 -0
  233. package/dist/validators/urlValidator.test.js.map +1 -0
  234. package/dist/validators/validationEngine.d.ts +23 -0
  235. package/dist/validators/validationEngine.js +117 -0
  236. package/dist/validators/validationEngine.js.map +1 -0
  237. package/dist/validators/validationEngine.test.d.ts +1 -0
  238. package/dist/validators/validationEngine.test.js +82 -0
  239. package/dist/validators/validationEngine.test.js.map +1 -0
  240. package/dist/validators/versionValidator.d.ts +18 -0
  241. package/dist/validators/versionValidator.js +211 -0
  242. package/dist/validators/versionValidator.js.map +1 -0
  243. package/dist/validators/versionValidator.test.d.ts +1 -0
  244. package/dist/validators/versionValidator.test.js +308 -0
  245. package/dist/validators/versionValidator.test.js.map +1 -0
  246. package/package.json +98 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import type { DocFreshnessConfig, ValidationResults } from './types.js';
4
+ export interface CLIOptions {
5
+ config?: string;
6
+ reporter?: string;
7
+ output?: string;
8
+ verbose?: boolean;
9
+ only?: string;
10
+ skipUrls?: boolean;
11
+ files?: string;
12
+ manifest?: string;
13
+ source?: string;
14
+ cache?: boolean;
15
+ clearCache?: boolean;
16
+ score?: boolean;
17
+ incremental?: boolean;
18
+ vectorSearch?: boolean;
19
+ }
20
+ interface CliDeps {
21
+ loadConfig: (configPath?: string) => Promise<DocFreshnessConfig>;
22
+ run: (config: DocFreshnessConfig) => Promise<ValidationResults>;
23
+ logError: (...args: unknown[]) => void;
24
+ }
25
+ export declare function createProgram(): Command;
26
+ export declare function parseCliOptions(argv: string[]): CLIOptions;
27
+ export declare function applyCliOverrides(config: DocFreshnessConfig, options: CLIOptions): void;
28
+ export declare function runCli(options: CLIOptions, deps?: CliDeps): Promise<number>;
29
+ export declare function main(argv?: string[], deps?: CliDeps): Promise<number>;
30
+ export declare function runAsCli(argv?: string[], deps?: CliDeps): Promise<void>;
31
+ export declare function isDirectCliInvocation(argv?: string[]): boolean;
32
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { run } from './runner.js';
4
+ import { loadConfig } from './config/loader.js';
5
+ import { readFileSync, realpathSync } from 'fs';
6
+ import { fileURLToPath } from 'url';
7
+ import { dirname, join, resolve } from 'path';
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = dirname(__filename);
10
+ const packageJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
11
+ const defaultDeps = {
12
+ loadConfig,
13
+ run,
14
+ logError: (...args) => console.error(...args),
15
+ };
16
+ export function createProgram() {
17
+ return new Command()
18
+ .name('doc-freshness')
19
+ .description('Check documentation freshness and accuracy for any project')
20
+ .version(packageJson.version)
21
+ .option('-c, --config <path>', 'Path to config file')
22
+ .option('-r, --reporter <type>', 'Reporter type (console, json, markdown)', 'console')
23
+ .option('-o, --output <path>', 'Output file path for reports')
24
+ .option('-v, --verbose', 'Enable verbose logging')
25
+ .option('--only <types>', 'Only check specific reference types (comma-separated)')
26
+ .option('--skip-urls', 'Skip URL validation')
27
+ .option('--files <patterns>', 'Only check specific files (comma-separated glob patterns)')
28
+ .option('--manifest <files>', 'Manifest files to use (comma-separated)')
29
+ .option('--source <patterns>', 'Source patterns to use (comma-separated)')
30
+ .option('--no-cache', 'Disable caching')
31
+ .option('--clear-cache', 'Clear cache before running')
32
+ .option('--score', 'Include freshness scores in report')
33
+ .option('--incremental', 'Only check changed files (requires cache)')
34
+ .option('--vector-search', 'Enable semantic vector search for doc-code mismatches');
35
+ }
36
+ export function parseCliOptions(argv) {
37
+ return createProgram().parse(argv).opts();
38
+ }
39
+ export function applyCliOverrides(config, options) {
40
+ if (options.reporter) {
41
+ config.reporters = [options.reporter];
42
+ }
43
+ if (options.output) {
44
+ config.outputPath = options.output;
45
+ }
46
+ if (options.verbose) {
47
+ config.verbose = true;
48
+ }
49
+ if (options.skipUrls) {
50
+ config.urlValidation ??= {};
51
+ config.urlValidation.enabled = false;
52
+ }
53
+ if (options.only) {
54
+ const types = options.only.split(',');
55
+ const rules = (config.rules ??= {});
56
+ for (const [rule, ruleConfig] of Object.entries(rules)) {
57
+ if (ruleConfig) {
58
+ ruleConfig.enabled = types.includes(rule);
59
+ }
60
+ }
61
+ }
62
+ if (options.files) {
63
+ config.include = options.files.split(',');
64
+ }
65
+ if (options.manifest) {
66
+ config.manifestFiles = options.manifest.split(',');
67
+ }
68
+ if (options.source) {
69
+ config.sourcePatterns = options.source.split(',');
70
+ }
71
+ if (options.cache === false) {
72
+ config.cache = { enabled: false };
73
+ }
74
+ if (options.clearCache) {
75
+ config.clearCache = true;
76
+ }
77
+ if (options.score) {
78
+ config.freshnessScoring = { ...config.freshnessScoring, enabled: true };
79
+ }
80
+ if (options.incremental) {
81
+ config.incremental = { enabled: true };
82
+ }
83
+ if (options.vectorSearch) {
84
+ config.vectorSearch = { ...config.vectorSearch, enabled: true };
85
+ }
86
+ }
87
+ export async function runCli(options, deps = defaultDeps) {
88
+ try {
89
+ const config = await deps.loadConfig(options.config);
90
+ applyCliOverrides(config, options);
91
+ const result = await deps.run(config);
92
+ // Exit with error code if there are errors
93
+ if (result.summary.errors > 0) {
94
+ return 1;
95
+ }
96
+ return 0;
97
+ }
98
+ catch (error) {
99
+ deps.logError('Error:', error.message);
100
+ if (options.verbose) {
101
+ deps.logError(error.stack);
102
+ }
103
+ return 1;
104
+ }
105
+ }
106
+ export async function main(argv = process.argv, deps = defaultDeps) {
107
+ const options = parseCliOptions(argv);
108
+ return runCli(options, deps);
109
+ }
110
+ // This wrapper keeps the process-exit side effect out of `main` so tests can
111
+ // verify CLI behavior without terminating the Vitest process.
112
+ export async function runAsCli(argv = process.argv, deps = defaultDeps) {
113
+ const options = parseCliOptions(argv);
114
+ const exitCode = await runCli(options, deps);
115
+ if (exitCode !== 0) {
116
+ process.exit(exitCode);
117
+ }
118
+ }
119
+ function toRealPath(filePath) {
120
+ try {
121
+ return realpathSync(filePath);
122
+ }
123
+ catch {
124
+ return resolve(filePath);
125
+ }
126
+ }
127
+ export function isDirectCliInvocation(argv = process.argv) {
128
+ const entryPath = argv[1];
129
+ if (!entryPath) {
130
+ return false;
131
+ }
132
+ return toRealPath(entryPath) === toRealPath(__filename);
133
+ }
134
+ if (isDirectCliInvocation()) {
135
+ void runAsCli();
136
+ }
137
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,184 @@
1
+ import { mkdtemp, symlink, rm } from 'fs/promises';
2
+ import { tmpdir } from 'os';
3
+ import path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { applyCliOverrides, isDirectCliInvocation, main, parseCliOptions, runAsCli, runCli } from './cli.js';
6
+ afterEach(() => {
7
+ vi.restoreAllMocks();
8
+ });
9
+ function makeConfig() {
10
+ return {
11
+ reporters: ['console'],
12
+ rules: {
13
+ 'file-path': { enabled: true },
14
+ 'external-url': { enabled: true },
15
+ version: { enabled: true },
16
+ },
17
+ urlValidation: { enabled: true },
18
+ cache: { enabled: true },
19
+ };
20
+ }
21
+ function makeResults(errors) {
22
+ return {
23
+ documents: [],
24
+ summary: {
25
+ total: 0,
26
+ valid: 0,
27
+ errors,
28
+ warnings: 0,
29
+ skipped: 0,
30
+ },
31
+ };
32
+ }
33
+ describe('CLI option parsing', () => {
34
+ it('parses supported flags and values', () => {
35
+ const options = parseCliOptions([
36
+ 'node',
37
+ 'doc-freshness',
38
+ '--config',
39
+ 'my-config.json',
40
+ '--reporter',
41
+ 'json',
42
+ '--only',
43
+ 'file-path,version',
44
+ '--no-cache',
45
+ '--vector-search',
46
+ ]);
47
+ expect(options.config).toBe('my-config.json');
48
+ expect(options.reporter).toBe('json');
49
+ expect(options.only).toBe('file-path,version');
50
+ expect(options.cache).toBe(false);
51
+ expect(options.vectorSearch).toBe(true);
52
+ });
53
+ });
54
+ describe('applyCliOverrides', () => {
55
+ it('applies all overrideable CLI options to config', () => {
56
+ const config = makeConfig();
57
+ const options = {
58
+ reporter: 'markdown',
59
+ output: 'reports/out.md',
60
+ verbose: true,
61
+ skipUrls: true,
62
+ only: 'version',
63
+ files: 'docs/**/*.md,README.md',
64
+ manifest: 'package.json,requirements.txt',
65
+ source: 'src/**/*.ts,lib/**/*.ts',
66
+ cache: false,
67
+ clearCache: true,
68
+ score: true,
69
+ incremental: true,
70
+ vectorSearch: true,
71
+ };
72
+ applyCliOverrides(config, options);
73
+ expect(config.reporters).toEqual(['markdown']);
74
+ expect(config.outputPath).toBe('reports/out.md');
75
+ expect(config.verbose).toBe(true);
76
+ expect(config.urlValidation?.enabled).toBe(false);
77
+ expect(config.rules?.version?.enabled).toBe(true);
78
+ expect(config.rules?.['file-path']?.enabled).toBe(false);
79
+ expect(config.rules?.['external-url']?.enabled).toBe(false);
80
+ expect(config.include).toEqual(['docs/**/*.md', 'README.md']);
81
+ expect(config.manifestFiles).toEqual(['package.json', 'requirements.txt']);
82
+ expect(config.sourcePatterns).toEqual(['src/**/*.ts', 'lib/**/*.ts']);
83
+ expect(config.cache).toEqual({ enabled: false });
84
+ expect(config.clearCache).toBe(true);
85
+ expect(config.freshnessScoring?.enabled).toBe(true);
86
+ expect(config.incremental?.enabled).toBe(true);
87
+ expect(config.vectorSearch?.enabled).toBe(true);
88
+ });
89
+ });
90
+ describe('runCli', () => {
91
+ it('returns 0 on successful run with no errors', async () => {
92
+ const loadConfigMock = vi.fn().mockResolvedValue(makeConfig());
93
+ const runMock = vi.fn().mockResolvedValue(makeResults(0));
94
+ const logErrorMock = vi.fn();
95
+ const exitCode = await runCli({ config: 'doc-freshness.config.ts' }, {
96
+ loadConfig: loadConfigMock,
97
+ run: runMock,
98
+ logError: logErrorMock,
99
+ });
100
+ expect(exitCode).toBe(0);
101
+ expect(loadConfigMock).toHaveBeenCalledWith('doc-freshness.config.ts');
102
+ expect(runMock).toHaveBeenCalledTimes(1);
103
+ expect(logErrorMock).not.toHaveBeenCalled();
104
+ });
105
+ it('returns 1 when validation reports errors', async () => {
106
+ const exitCode = await runCli({}, {
107
+ loadConfig: vi.fn().mockResolvedValue(makeConfig()),
108
+ run: vi.fn().mockResolvedValue(makeResults(2)),
109
+ logError: vi.fn(),
110
+ });
111
+ expect(exitCode).toBe(1);
112
+ });
113
+ it('returns 1 and logs error details on exception', async () => {
114
+ const logErrorMock = vi.fn();
115
+ const thrown = new Error('boom');
116
+ const exitCode = await runCli({ verbose: true }, {
117
+ loadConfig: vi.fn().mockRejectedValue(thrown),
118
+ run: vi.fn(),
119
+ logError: logErrorMock,
120
+ });
121
+ expect(exitCode).toBe(1);
122
+ expect(logErrorMock).toHaveBeenCalledWith('Error:', 'boom');
123
+ expect(logErrorMock).toHaveBeenCalledWith(thrown.stack);
124
+ });
125
+ });
126
+ describe('main', () => {
127
+ it('parses argv and applies options before running', async () => {
128
+ const runMock = vi.fn().mockResolvedValue(makeResults(0));
129
+ const deps = {
130
+ loadConfig: vi.fn().mockResolvedValue(makeConfig()),
131
+ run: runMock,
132
+ logError: vi.fn(),
133
+ };
134
+ const exitCode = await main(['node', 'doc-freshness', '--reporter', 'json', '--no-cache'], deps);
135
+ expect(exitCode).toBe(0);
136
+ expect(runMock).toHaveBeenCalledWith(expect.objectContaining({
137
+ reporters: ['json'],
138
+ cache: { enabled: false },
139
+ }));
140
+ });
141
+ });
142
+ describe('runAsCli', () => {
143
+ it('calls process.exit when CLI run fails', async () => {
144
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => undefined));
145
+ const deps = {
146
+ loadConfig: vi.fn().mockResolvedValue(makeConfig()),
147
+ run: vi.fn().mockResolvedValue(makeResults(1)),
148
+ logError: vi.fn(),
149
+ };
150
+ await runAsCli(['node', 'doc-freshness'], deps);
151
+ expect(exitSpy).toHaveBeenCalledWith(1);
152
+ });
153
+ it('does not call process.exit on successful run', async () => {
154
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation((() => undefined));
155
+ const deps = {
156
+ loadConfig: vi.fn().mockResolvedValue(makeConfig()),
157
+ run: vi.fn().mockResolvedValue(makeResults(0)),
158
+ logError: vi.fn(),
159
+ };
160
+ await runAsCli(['node', 'doc-freshness'], deps);
161
+ expect(exitSpy).not.toHaveBeenCalled();
162
+ });
163
+ });
164
+ describe('isDirectCliInvocation', () => {
165
+ const cliPath = fileURLToPath(new URL('./cli.ts', import.meta.url));
166
+ it('returns true when argv entry points directly to cli file', () => {
167
+ expect(isDirectCliInvocation(['node', cliPath])).toBe(true);
168
+ });
169
+ it('returns true when argv entry is a symlink to cli file', async () => {
170
+ const tempDir = await mkdtemp(path.join(tmpdir(), 'doc-freshness-cli-'));
171
+ const linkPath = path.join(tempDir, 'doc-freshness');
172
+ await symlink(cliPath, linkPath);
173
+ try {
174
+ expect(isDirectCliInvocation(['node', linkPath])).toBe(true);
175
+ }
176
+ finally {
177
+ await rm(tempDir, { recursive: true, force: true });
178
+ }
179
+ });
180
+ it('returns false when argv entry points elsewhere', () => {
181
+ expect(isDirectCliInvocation(['node', '/tmp/not-cli.js'])).toBe(false);
182
+ });
183
+ });
184
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../src/cli.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { DocFreshnessConfig } from '../types.js';
2
+ /**
3
+ * Default configuration values for Documentation Freshness Checker
4
+ */
5
+ export declare const DEFAULT_CONFIG: DocFreshnessConfig;
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Default configuration values for Documentation Freshness Checker
3
+ */
4
+ export const DEFAULT_CONFIG = {
5
+ // Root directory for resolving paths (defaults to process.cwd())
6
+ rootDir: process.cwd(),
7
+ // Documentation files to check
8
+ include: ['docs/**/*.md', 'README.md'],
9
+ // Files to exclude
10
+ exclude: ['**/node_modules/**', '**/vendor/**', '**/dist/**', '**/build/**'],
11
+ // Manifest files to read for version/dependency checking
12
+ // Auto-detected if not specified
13
+ manifestFiles: null,
14
+ // Source code patterns for code pattern validation
15
+ // Auto-detected if not specified
16
+ sourcePatterns: null,
17
+ // URL validation settings
18
+ urlValidation: {
19
+ enabled: true,
20
+ timeout: 10000,
21
+ concurrency: 5,
22
+ skipDomains: ['localhost', '127.0.0.1', 'example.com'],
23
+ cacheSeconds: 3600,
24
+ },
25
+ // Validation rules configuration
26
+ rules: {
27
+ 'file-path': {
28
+ enabled: true,
29
+ severity: 'error',
30
+ // Patterns to identify illustrative/placeholder paths (regex strings)
31
+ illustrativePatterns: [
32
+ // Generic placeholder prefixes (case-insensitive match on filename)
33
+ '^(?:Your|My|Example|Sample|Demo|Test|Foo|Bar|Baz|Dummy|Mock|Fake|Stub)',
34
+ // Common tutorial placeholders
35
+ '^(?:first|second|third|another|some|new)\\.',
36
+ // Placeholder with angle brackets or curly braces in name
37
+ '<[^>]+>',
38
+ '\\{[^}]+\\}',
39
+ // Paths containing obvious placeholder segments
40
+ '/(?:your|my|example|sample)-',
41
+ '/\\[.*\\]/', // Paths with [brackets]
42
+ ],
43
+ skipIllustrative: true,
44
+ },
45
+ 'external-url': {
46
+ enabled: true,
47
+ severity: 'warning',
48
+ },
49
+ version: {
50
+ enabled: true,
51
+ severity: 'warning',
52
+ allowMinorDrift: true,
53
+ },
54
+ 'directory-structure': {
55
+ enabled: true,
56
+ severity: 'warning',
57
+ // Patterns to identify illustrative/placeholder paths in directory trees
58
+ illustrativePatterns: [
59
+ // Generic placeholder prefixes (case-insensitive match on filename)
60
+ '^(?:Your|My|Example|Sample|Demo|Test|Foo|Bar|Baz|Dummy|Mock|Fake|Stub)',
61
+ // Common tutorial placeholders
62
+ '^(?:first|second|third|another|some|new)\\.',
63
+ // Very short generic names without extensions (likely placeholders)
64
+ '^(?:foo|bar|baz|qux|quux)$',
65
+ ],
66
+ skipIllustrative: true,
67
+ },
68
+ 'code-pattern': {
69
+ enabled: true,
70
+ severity: 'warning',
71
+ },
72
+ dependency: {
73
+ enabled: true,
74
+ severity: 'info',
75
+ },
76
+ },
77
+ // Reporter configuration
78
+ reporters: ['console'],
79
+ // Output directory for reports
80
+ outputDir: '.doc-freshness-reports',
81
+ // Ignore patterns (regex strings)
82
+ ignorePatterns: [],
83
+ // Custom extractors (advanced)
84
+ customExtractors: [],
85
+ // Custom validators (advanced)
86
+ customValidators: {},
87
+ // Code-to-Doc Graph settings
88
+ graph: {
89
+ enabled: true,
90
+ cacheDir: '.doc-freshness-cache',
91
+ cacheMaxAge: 24 * 60 * 60 * 1000, // 24 hours for non-git repos
92
+ },
93
+ // Git integration settings
94
+ git: {
95
+ enabled: true, // Auto-detected
96
+ trackChanges: true, // Enable incremental checking
97
+ changeWindow: 7, // Days to look back for changes
98
+ },
99
+ // Freshness scoring settings
100
+ freshnessScoring: {
101
+ enabled: false,
102
+ weights: {
103
+ referenceValidity: 0.4,
104
+ gitTimeDelta: 0.3,
105
+ codeChangeFrequency: 0.15,
106
+ symbolCoverage: 0.15,
107
+ },
108
+ thresholds: {
109
+ gradeA: 90,
110
+ gradeB: 80,
111
+ gradeC: 70,
112
+ gradeD: 60,
113
+ },
114
+ },
115
+ // Vector search settings (optional, requires fastembed package)
116
+ vectorSearch: {
117
+ enabled: false, // Disabled by default
118
+ similarityThreshold: 0.3, // Lower = stricter matching
119
+ indexCodeComments: true,
120
+ indexDocstrings: true,
121
+ },
122
+ // Cache settings
123
+ cache: {
124
+ enabled: true,
125
+ dir: '.doc-freshness-cache',
126
+ maxAge: 24 * 60 * 60 * 1000,
127
+ },
128
+ // Incremental checking (only check changed files)
129
+ incremental: {
130
+ enabled: false,
131
+ },
132
+ // Verbose logging
133
+ verbose: false,
134
+ };
135
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { DocFreshnessConfig } from '../types.js';
2
+ /**
3
+ * Define configuration for Documentation Freshness Checker.
4
+ *
5
+ * This helper function provides IntelliSense support for configuration options.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * // .doc-freshness.config.js
10
+ * import { defineConfig } from 'doc-freshness-checker';
11
+ *
12
+ * export default defineConfig({
13
+ * include: ['docs/**‍/*.md', 'README.md'],
14
+ * exclude: ['**‍/node_modules/**'],
15
+ * rules: {
16
+ * 'file-path': { enabled: true, severity: 'error' },
17
+ * 'external-url': { enabled: true, severity: 'warning' },
18
+ * },
19
+ * vectorSearch: {
20
+ * enabled: true,
21
+ * },
22
+ * });
23
+ * ```
24
+ *
25
+ * @param config - Configuration object
26
+ * @returns The same configuration object (for type inference)
27
+ */
28
+ export declare function defineConfig(config: DocFreshnessConfig): DocFreshnessConfig;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Define configuration for Documentation Freshness Checker.
3
+ *
4
+ * This helper function provides IntelliSense support for configuration options.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * // .doc-freshness.config.js
9
+ * import { defineConfig } from 'doc-freshness-checker';
10
+ *
11
+ * export default defineConfig({
12
+ * include: ['docs/**‍/*.md', 'README.md'],
13
+ * exclude: ['**‍/node_modules/**'],
14
+ * rules: {
15
+ * 'file-path': { enabled: true, severity: 'error' },
16
+ * 'external-url': { enabled: true, severity: 'warning' },
17
+ * },
18
+ * vectorSearch: {
19
+ * enabled: true,
20
+ * },
21
+ * });
22
+ * ```
23
+ *
24
+ * @param config - Configuration object
25
+ * @returns The same configuration object (for type inference)
26
+ */
27
+ export function defineConfig(config) {
28
+ return config;
29
+ }
30
+ //# sourceMappingURL=defineConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineConfig.js","sourceRoot":"","sources":["../../src/config/defineConfig.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import { defineConfig } from './defineConfig.js';
2
+ describe('defineConfig', () => {
3
+ it('returns the same config object for type inference', () => {
4
+ const input = { include: ['docs/**/*.md'], verbose: true };
5
+ const result = defineConfig(input);
6
+ expect(result).toBe(input);
7
+ expect(result).toEqual({ include: ['docs/**/*.md'], verbose: true });
8
+ });
9
+ });
10
+ //# sourceMappingURL=defineConfig.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineConfig.test.js","sourceRoot":"","sources":["../../src/config/defineConfig.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { DEFAULT_CONFIG } from './defaults.js';
2
+ import type { DocFreshnessConfig } from '../types.js';
3
+ export { DEFAULT_CONFIG };
4
+ /**
5
+ * Load and merge configuration
6
+ */
7
+ export declare function loadConfig(configPath?: string): Promise<DocFreshnessConfig>;