@nitra/cursor 12.7.0 → 12.8.1

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 (208) hide show
  1. package/.pi-template/extensions/n-cursor-adr/docs/index.md +2 -2
  2. package/CHANGELOG.md +21 -5
  3. package/bin/n-cursor.js +1 -1
  4. package/docs/index.md +3 -3
  5. package/docs/stryker.config.md +3 -3
  6. package/lib/docs/index.md +5 -5
  7. package/lib/docs/llm.md +4 -4
  8. package/package.json +2 -2
  9. package/rules/abie/docs/fix.md +8 -8
  10. package/rules/abie/docs/index.md +3 -3
  11. package/rules/abie/js/docs/index.md +6 -6
  12. package/rules/abie/lib/docs/index.md +9 -9
  13. package/rules/bun/docs/fix.md +5 -5
  14. package/rules/bun/docs/index.md +3 -3
  15. package/rules/bun/js/docs/index.md +2 -2
  16. package/rules/capacitor/docs/fix.md +10 -10
  17. package/rules/capacitor/docs/index.md +3 -3
  18. package/rules/capacitor/js/docs/index.md +2 -2
  19. package/rules/changelog/docs/fix.md +11 -11
  20. package/rules/changelog/docs/index.md +3 -3
  21. package/rules/changelog/js/docs/consistency.md +12 -12
  22. package/rules/changelog/js/docs/index.md +2 -2
  23. package/rules/changelog/lib/docs/index.md +2 -2
  24. package/rules/ci4/docs/fix.md +4 -4
  25. package/rules/ci4/docs/index.md +3 -3
  26. package/rules/ci4/js/docs/index.md +2 -2
  27. package/rules/doc-files/docs/index.md +3 -3
  28. package/rules/doc-files/js/docgen-crc.mjs +2 -8
  29. package/rules/doc-files/js/docgen-extract.mjs +5 -3
  30. package/rules/doc-files/js/docgen-files-batch.mjs +18 -3
  31. package/rules/doc-files/js/docgen-gen.mjs +11 -3
  32. package/rules/doc-files/js/docgen-judge-measure.mjs +67 -18
  33. package/rules/doc-files/js/docgen-judge.mjs +8 -1
  34. package/rules/doc-files/js/docgen-scan.mjs +14 -4
  35. package/rules/doc-files/js/docs/docgen-crc.md +25 -14
  36. package/rules/doc-files/js/docs/docgen-extract.md +16 -14
  37. package/rules/doc-files/js/docs/docgen-files-batch.md +11 -11
  38. package/rules/doc-files/js/docs/docgen-gen.md +15 -26
  39. package/rules/doc-files/js/docs/docgen-judge-measure.md +14 -12
  40. package/rules/doc-files/js/docs/docgen-judge.md +13 -11
  41. package/rules/doc-files/js/docs/docgen-scan.md +28 -27
  42. package/rules/doc-files/js/docs/index.md +0 -1
  43. package/rules/docker/docs/fix.md +6 -6
  44. package/rules/docker/docs/index.md +3 -3
  45. package/rules/docker/js/docs/index.md +2 -2
  46. package/rules/docker/lib/docs/docker-hadolint.md +2 -2
  47. package/rules/docker/lib/docs/index.md +5 -5
  48. package/rules/efes/docs/fix.md +8 -8
  49. package/rules/efes/docs/index.md +3 -3
  50. package/rules/feedback/docs/fix.md +5 -5
  51. package/rules/feedback/docs/index.md +3 -3
  52. package/rules/ga/docs/fix.md +5 -5
  53. package/rules/ga/docs/index.md +3 -3
  54. package/rules/ga/js/docs/index.md +3 -3
  55. package/rules/graphql/docs/fix.md +8 -8
  56. package/rules/graphql/docs/index.md +3 -3
  57. package/rules/graphql/docs/main.md +8 -8
  58. package/rules/graphql/js/docs/index.md +2 -2
  59. package/rules/graphql/lib/docs/index.md +2 -2
  60. package/rules/hasura/docs/fix.md +11 -11
  61. package/rules/hasura/docs/index.md +3 -3
  62. package/rules/hasura/js/docs/index.md +2 -2
  63. package/rules/image-avif/docs/fix.md +3 -3
  64. package/rules/image-avif/docs/index.md +3 -3
  65. package/rules/image-avif/js/docs/avif_generation.md +6 -6
  66. package/rules/image-avif/js/docs/index.md +2 -2
  67. package/rules/image-compress/docs/fix.md +2 -2
  68. package/rules/image-compress/docs/index.md +3 -3
  69. package/rules/image-compress/js/docs/index.md +3 -3
  70. package/rules/{js-lint → js}/docs/fix.md +9 -9
  71. package/rules/{js-lint → js}/docs/index.md +3 -3
  72. package/rules/{js-lint → js}/js/docs/check.md +5 -5
  73. package/rules/{js-lint → js}/js/docs/index.md +4 -4
  74. package/rules/js-bun-db/docs/fix.md +5 -5
  75. package/rules/js-bun-db/docs/index.md +3 -3
  76. package/rules/js-bun-db/js/docs/index.md +2 -2
  77. package/rules/js-bun-db/lib/docs/index.md +2 -2
  78. package/rules/js-bun-redis/docs/fix.md +6 -6
  79. package/rules/js-bun-redis/docs/index.md +3 -3
  80. package/rules/js-bun-redis/js/docs/index.md +2 -2
  81. package/rules/js-bun-redis/lib/docs/index.md +2 -2
  82. package/rules/js-lint-ci/docs/fix.md +3 -3
  83. package/rules/js-lint-ci/docs/index.md +3 -3
  84. package/rules/js-lint-ci/js/docs/index.md +2 -2
  85. package/rules/js-mssql/docs/fix.md +5 -5
  86. package/rules/js-mssql/docs/index.md +3 -3
  87. package/rules/js-mssql/js/docs/index.md +2 -2
  88. package/rules/js-mssql/lib/docs/index.md +2 -2
  89. package/rules/js-run/docs/fix.md +8 -8
  90. package/rules/js-run/docs/index.md +3 -3
  91. package/rules/js-run/js/docs/index.md +2 -2
  92. package/rules/js-run/lib/docs/index.md +7 -7
  93. package/rules/k8s/docs/fix.md +4 -4
  94. package/rules/k8s/docs/index.md +3 -3
  95. package/rules/k8s/js/docs/index.md +3 -3
  96. package/rules/nginx-default-tpl/docs/fix.md +7 -7
  97. package/rules/nginx-default-tpl/docs/index.md +3 -3
  98. package/rules/nginx-default-tpl/js/docs/index.md +2 -2
  99. package/rules/nginx-default-tpl/js/docs/template.md +2 -2
  100. package/rules/npm-module/docs/fix.md +8 -8
  101. package/rules/npm-module/docs/index.md +3 -3
  102. package/rules/npm-module/js/docs/header_doc_pointer.md +23 -13
  103. package/rules/npm-module/js/docs/index.md +5 -5
  104. package/rules/npm-module/js/docs/rule_meta.md +6 -6
  105. package/rules/npm-module/js/header_doc_pointer.mjs +1 -3
  106. package/rules/php/docs/fix.md +6 -6
  107. package/rules/php/docs/index.md +3 -3
  108. package/rules/php/js/docs/index.md +3 -3
  109. package/rules/python/docs/fix.md +11 -11
  110. package/rules/python/docs/index.md +3 -3
  111. package/rules/python/docs/main.md +10 -10
  112. package/rules/python/js/docs/index.md +3 -3
  113. package/rules/python/main.mjs +2 -1
  114. package/rules/rego/docs/fix.md +5 -5
  115. package/rules/rego/docs/index.md +3 -3
  116. package/rules/rego/js/docs/index.md +3 -3
  117. package/rules/release/docs/index.md +5 -5
  118. package/rules/release/lib/docs/index.md +4 -4
  119. package/rules/rust/docs/fix.md +4 -4
  120. package/rules/rust/docs/index.md +3 -3
  121. package/rules/rust/docs/main.md +7 -7
  122. package/rules/rust/js/docs/index.md +3 -3
  123. package/rules/rust/lib/docs/index.md +2 -2
  124. package/rules/rust/main.mjs +7 -1
  125. package/rules/security/docs/fix.md +6 -6
  126. package/rules/security/docs/index.md +3 -3
  127. package/rules/security/js/docs/index.md +4 -4
  128. package/rules/style-lint/docs/fix.md +3 -3
  129. package/rules/style-lint/docs/index.md +3 -3
  130. package/rules/style-lint/js/docs/index.md +3 -3
  131. package/rules/tauri/docs/fix.md +11 -11
  132. package/rules/tauri/docs/index.md +3 -3
  133. package/rules/tauri/js/docs/index.md +3 -3
  134. package/rules/test/docs/fix.md +5 -5
  135. package/rules/test/docs/index.md +3 -3
  136. package/rules/test/js/data/stryker_config/docs/index.md +4 -4
  137. package/rules/test/js/data/vitest_config/docs/index.md +2 -2
  138. package/rules/test/js/docs/index.md +7 -7
  139. package/rules/text/docs/fix.md +11 -11
  140. package/rules/text/docs/index.md +3 -3
  141. package/rules/text/docs/main.md +8 -8
  142. package/rules/text/js/cspell-fix.mjs +7 -2
  143. package/rules/text/js/docs/cspell-fix.md +8 -8
  144. package/rules/text/js/docs/index.md +7 -8
  145. package/rules/text/js/docs/run-v8r.md +3 -3
  146. package/rules/text/main.mjs +3 -1
  147. package/rules/tool-surface/docs/index.md +3 -3
  148. package/rules/tool-surface/meta.json +6 -1
  149. package/rules/vue/docs/fix.md +6 -6
  150. package/rules/vue/docs/index.md +3 -3
  151. package/rules/vue/js/docs/index.md +2 -2
  152. package/rules/vue/lib/docs/index.md +2 -2
  153. package/rules/worktree/docs/fix.md +11 -11
  154. package/rules/worktree/docs/index.md +3 -3
  155. package/scripts/coverage-classify/docs/index.md +6 -6
  156. package/scripts/dispatcher/docs/index.md +2 -2
  157. package/scripts/docs/index.md +16 -16
  158. package/scripts/lib/docs/index.md +36 -36
  159. package/scripts/lib/docs/run-lint.md +7 -7
  160. package/scripts/lib/docs/run-standard-lint.md +7 -5
  161. package/scripts/lib/fix/analyze-escalation.mjs +4 -1
  162. package/scripts/lib/fix/docs/analyze-escalation.md +28 -15
  163. package/scripts/lib/fix/docs/index.md +10 -10
  164. package/scripts/lib/fix/docs/orchestrator.md +14 -15
  165. package/scripts/lib/fix/docs/run-conformance-check.md +4 -3
  166. package/scripts/lib/fix/docs/run-fix-check.md +3 -3
  167. package/scripts/lib/fix/docs/t0.md +8 -7
  168. package/scripts/lib/fix/orchestrator.mjs +26 -3
  169. package/scripts/lib/fix/t0.mjs +4 -1
  170. package/scripts/lib/run-lint.mjs +1 -3
  171. package/scripts/utils/docs/index.md +14 -14
  172. package/skills/doc-aggregate/js/docs/index.md +3 -3
  173. package/skills/doc-files/.changes/260612-0002.md +1 -0
  174. package/skills/doc-files/.changes/260612-0006.md +1 -0
  175. package/skills/doc-files/.changes/260612-0008.md +1 -0
  176. package/skills/doc-files/.changes/260612-0012.md +1 -0
  177. package/skills/doc-files/.changes/260612-0031.md +1 -0
  178. package/skills/doc-files/.changes/260612-0036.md +1 -0
  179. package/skills/doc-files/.changes/260612-0114.md +1 -0
  180. package/skills/start-check/js/docs/index.md +2 -2
  181. package/skills/taze/js/docs/index.md +2 -2
  182. package/types/bin/n-cursor.d.ts +1 -1
  183. /package/rules/{js-lint → js}/coverage/coverage.mjs +0 -0
  184. /package/rules/{js-lint → js}/docs/main.md +0 -0
  185. /package/rules/{js-lint → js}/js/check.mjs +0 -0
  186. /package/rules/{js-lint → js}/js/data/tooling/knip-canonical.json +0 -0
  187. /package/rules/{js-lint → js}/js/data/tooling/oxlint-canonical.json +0 -0
  188. /package/rules/{js-lint → js}/js/docs/lint-findings.md +0 -0
  189. /package/rules/{js-lint → js}/js/docs/tooling.md +0 -0
  190. /package/rules/{js-lint → js}/js/docs/utils_imports.md +0 -0
  191. /package/rules/{js-lint → js}/js/lint-findings.mjs +0 -0
  192. /package/rules/{js-lint → js}/js/tooling.mjs +0 -0
  193. /package/rules/{js-lint → js}/js/utils_imports.mjs +0 -0
  194. /package/rules/{js-lint/js-lint.mdc → js/js.mdc} +0 -0
  195. /package/rules/{js-lint → js}/main.mjs +0 -0
  196. /package/rules/{js-lint → js}/meta.json +0 -0
  197. /package/rules/{js-lint → js}/policy/jscpd/jscpd.rego +0 -0
  198. /package/rules/{js-lint → js}/policy/jscpd/target.json +0 -0
  199. /package/rules/{js-lint → js}/policy/jscpd/template/.jscpd.json.snippet.json +0 -0
  200. /package/rules/{js-lint → js}/policy/lint_js_yml/lint_js_yml.rego +0 -0
  201. /package/rules/{js-lint → js}/policy/lint_js_yml/target.json +0 -0
  202. /package/rules/{js-lint → js}/policy/lint_js_yml/template/lint-js.yml.snippet.yml +0 -0
  203. /package/rules/{js-lint → js}/policy/package_json/package_json.rego +0 -0
  204. /package/rules/{js-lint → js}/policy/package_json/target.json +0 -0
  205. /package/rules/{js-lint → js}/policy/package_json/template/package.json.snippet.json +0 -0
  206. /package/rules/{js-lint → js}/policy/vscode_extensions/target.json +0 -0
  207. /package/rules/{js-lint → js}/policy/vscode_extensions/template/extensions.json.snippet.json +0 -0
  208. /package/rules/{js-lint → js}/policy/vscode_extensions/vscode_extensions.rego +0 -0
@@ -64,8 +64,16 @@ function judgeCached(src, doc) {
64
64
  const hit = cacheGet(key)
65
65
  if (hit) return { ...hit, cached: true }
66
66
  const user = `SOURCE FILE:\n\`\`\`\n${src.slice(0, 12000)}\n\`\`\`\n\nGENERATED DOC:\n\`\`\`md\n${doc.slice(0, 8000)}\n\`\`\`\n\nReturn the JSON verdict.`
67
- const raw = callLlm([{ role: 'system', content: SYSTEM }, { role: 'user', content: user }], JUDGE_MODEL, { timeoutMs: JUDGE_TIMEOUT, temperature: 0 })
68
- const a = raw.indexOf('{'), b = raw.lastIndexOf('}')
67
+ const raw = callLlm(
68
+ [
69
+ { role: 'system', content: SYSTEM },
70
+ { role: 'user', content: user }
71
+ ],
72
+ JUDGE_MODEL,
73
+ { timeoutMs: JUDGE_TIMEOUT, temperature: 0 }
74
+ )
75
+ const a = raw.indexOf('{'),
76
+ b = raw.lastIndexOf('}')
69
77
  if (a === -1 || b === -1) throw new Error('no JSON in judge reply: ' + raw.slice(0, 160))
70
78
  const v = JSON.parse(raw.slice(a, b + 1))
71
79
  cacheSet(key, v)
@@ -81,17 +89,34 @@ function main() {
81
89
  console.error('Usage: node docgen-judge-measure.mjs <file1> <file2> ...')
82
90
  process.exit(2)
83
91
  }
84
- console.error(`[measure] gen=${GEN_MODEL} judge=${JUDGE_MODEL} threshold=${THRESHOLD} files=${files.length} cache=${CACHE_DIR}`)
92
+ console.error(
93
+ `[measure] gen=${GEN_MODEL} judge=${JUDGE_MODEL} threshold=${THRESHOLD} files=${files.length} cache=${CACHE_DIR}`
94
+ )
85
95
 
86
96
  const rows = []
87
97
  for (const [i, file] of files.entries()) {
88
98
  const tag = `(${i + 1}/${files.length}) ${file}`
89
99
  let src
90
- try { src = readFileSync(file, 'utf8') } catch (error) { console.error(`[skip] ${tag}: read ${error.message}`); continue }
100
+ try {
101
+ src = readFileSync(file, 'utf8')
102
+ } catch (error) {
103
+ console.error(`[skip] ${tag}: read ${error.message}`)
104
+ continue
105
+ }
91
106
 
92
107
  let gen
93
- try { gen = genCached(file, src) } catch (error) { console.error(`[gen-err] ${tag}: ${error.message.slice(0, 120)}`); rows.push({ file, error: 'gen', detail: error.message.slice(0, 200) }); continue }
94
- if (gen.score === null) { console.error(`[unsupported] ${tag}`); rows.push({ file, score: null, unsupported: true }); continue }
108
+ try {
109
+ gen = genCached(file, src)
110
+ } catch (error) {
111
+ console.error(`[gen-err] ${tag}: ${error.message.slice(0, 120)}`)
112
+ rows.push({ file, error: 'gen', detail: error.message.slice(0, 200) })
113
+ continue
114
+ }
115
+ if (gen.score === null) {
116
+ console.error(`[unsupported] ${tag}`)
117
+ rows.push({ file, score: null, unsupported: true })
118
+ continue
119
+ }
95
120
 
96
121
  const passed = gen.score >= THRESHOLD
97
122
  const row = { file, score: gen.score, degraded: gen.degraded, passed, genCached: gen.cached }
@@ -100,9 +125,18 @@ function main() {
100
125
  if (passed) {
101
126
  try {
102
127
  const v = judgeCached(src, gen.md)
103
- row.verdict = v.verdict; row.confidence = v.confidence; row.reason = v.reason; row.offending = v.offending; row.judgeCached = v.cached
104
- console.error(` [judge${v.cached ? '*' : ''}] ${v.verdict} (${v.confidence}) — ${(v.reason || '').slice(0, 90)}`)
105
- } catch (error) { row.judgeError = error.message.slice(0, 200); console.error(` [judge-err] ${error.message.slice(0, 120)}`) }
128
+ row.verdict = v.verdict
129
+ row.confidence = v.confidence
130
+ row.reason = v.reason
131
+ row.offending = v.offending
132
+ row.judgeCached = v.cached
133
+ console.error(
134
+ ` [judge${v.cached ? '*' : ''}] ${v.verdict} (${v.confidence}) — ${(v.reason || '').slice(0, 90)}`
135
+ )
136
+ } catch (error) {
137
+ row.judgeError = error.message.slice(0, 200)
138
+ console.error(` [judge-err] ${error.message.slice(0, 120)}`)
139
+ }
106
140
  }
107
141
  rows.push(row)
108
142
  }
@@ -119,17 +153,26 @@ function main() {
119
153
  const report = {
120
154
  config: { genModel: GEN_MODEL, judgeModel: JUDGE_MODEL, threshold: THRESHOLD },
121
155
  counts: {
122
- files: files.length, generated: scored.length,
156
+ files: files.length,
157
+ generated: scored.length,
123
158
  unsupported: rows.filter(r => r.unsupported).length,
124
159
  genErrors: rows.filter(r => r.error === 'gen').length,
125
160
  passedDetScorer: scored.filter(r => r.passed).length,
126
- judged: M, judgeErrors: rows.filter(r => r.judgeError).length
161
+ judged: M,
162
+ judgeErrors: rows.filter(r => r.judgeError).length
127
163
  },
128
- falsePositiveRate: { // серед PASSED+judged
129
- accurate: byVerdict.accurate, generic: byVerdict.generic, inaccurate: byVerdict.inaccurate,
130
- badPct: pct(bad), inaccuratePct: pct(byVerdict.inaccurate), genericPct: pct(byVerdict.generic)
164
+ falsePositiveRate: {
165
+ // серед PASSED+judged
166
+ accurate: byVerdict.accurate,
167
+ generic: byVerdict.generic,
168
+ inaccurate: byVerdict.inaccurate,
169
+ badPct: pct(bad),
170
+ inaccuratePct: pct(byVerdict.inaccurate),
171
+ genericPct: pct(byVerdict.generic)
131
172
  },
132
- offenders: passedRows.filter(r => r.verdict !== 'accurate').map(r => ({ file: r.file, score: r.score, verdict: r.verdict, confidence: r.confidence, reason: r.reason })),
173
+ offenders: passedRows
174
+ .filter(r => r.verdict !== 'accurate')
175
+ .map(r => ({ file: r.file, score: r.score, verdict: r.verdict, confidence: r.confidence, reason: r.reason })),
133
176
  rows
134
177
  }
135
178
 
@@ -138,10 +181,16 @@ function main() {
138
181
  writeFileSync(out, JSON.stringify(report, null, 2))
139
182
 
140
183
  console.log('\n===== Q4 MEASUREMENT =====')
141
- console.log(`generated: ${report.counts.generated}/${files.length} (unsupported=${report.counts.unsupported}, gen-errors=${report.counts.genErrors})`)
184
+ console.log(
185
+ `generated: ${report.counts.generated}/${files.length} (unsupported=${report.counts.unsupported}, gen-errors=${report.counts.genErrors})`
186
+ )
142
187
  console.log(`passed det-scorer (score≥${THRESHOLD}): ${report.counts.passedDetScorer} judged: ${M}`)
143
- console.log(`among PASSED+judged → accurate=${byVerdict.accurate} generic=${byVerdict.generic} inaccurate=${byVerdict.inaccurate}`)
144
- console.log(`>>> det-scorer FALSE-POSITIVE rate: ${pct(bad)}% (inaccurate=${pct(byVerdict.inaccurate)}%, generic=${pct(byVerdict.generic)}%)`)
188
+ console.log(
189
+ `among PASSED+judged accurate=${byVerdict.accurate} generic=${byVerdict.generic} inaccurate=${byVerdict.inaccurate}`
190
+ )
191
+ console.log(
192
+ `>>> det-scorer FALSE-POSITIVE rate: ${pct(bad)}% (inaccurate=${pct(byVerdict.inaccurate)}%, generic=${pct(byVerdict.generic)}%)`
193
+ )
145
194
  console.log(`decision guide: <~5% → don't build gate; >~15% → build (inaccurate-only)`)
146
195
  console.log(`report: ${out}`)
147
196
  }
@@ -58,7 +58,14 @@ export function parseDocVerdict(rawText) {
58
58
  */
59
59
  export function judgeDoc(src, doc, { model = JUDGE_MODEL, timeoutMs = 120_000 } = {}) {
60
60
  const user = `SOURCE FILE:\n\`\`\`\n${src.slice(0, 12_000)}\n\`\`\`\n\nGENERATED DOC:\n\`\`\`md\n${doc.slice(0, 8000)}\n\`\`\`\n\nReturn the JSON verdict.`
61
- const raw = callLlm([{ role: 'system', content: JUDGE_SYSTEM }, { role: 'user', content: user }], model, { timeoutMs, temperature: 0 })
61
+ const raw = callLlm(
62
+ [
63
+ { role: 'system', content: JUDGE_SYSTEM },
64
+ { role: 'user', content: user }
65
+ ],
66
+ model,
67
+ { timeoutMs, temperature: 0 }
68
+ )
62
69
  return parseDocVerdict(raw)
63
70
  }
64
71
 
@@ -115,9 +115,11 @@ export function scanOrphanedDocs(root) {
115
115
  }
116
116
  }
117
117
 
118
- /** Обходить дерево, шукаючи docs/-директорії для orphan-перевірки.
118
+ /**
119
+ * Обходить дерево, шукаючи docs/-директорії для orphan-перевірки.
119
120
  * docs/ — входимо завжди (батьківська пройшла ignore-перевірку);
120
- * інші — перевіряємо через isDocgenIgnored. */
121
+ * інші — перевіряємо через isDocgenIgnored.
122
+ */
121
123
  function walk(dir) {
122
124
  let entries
123
125
  try {
@@ -160,7 +162,12 @@ function gitIgnoredPaths(root, relPaths) {
160
162
  encoding: 'utf8',
161
163
  stdio: ['pipe', 'pipe', 'ignore'] // git пише «not a git repository» у stderr — глушимо
162
164
  })
163
- return new Set(out.split('\n').map(s => s.trim()).filter(Boolean))
165
+ return new Set(
166
+ out
167
+ .split('\n')
168
+ .map(s => s.trim())
169
+ .filter(Boolean)
170
+ )
164
171
  } catch {
165
172
  // exit 1 (жоден не ігнорується) і 128 (не git-репо) → execFileSync кидає; обидва = «не фільтруємо».
166
173
  return new Set()
@@ -201,7 +208,10 @@ export function scanForDocFiles(root) {
201
208
  }
202
209
 
203
210
  walk(root)
204
- const ignored = gitIgnoredPaths(root, results.map(r => r.sourcePath))
211
+ const ignored = gitIgnoredPaths(
212
+ root,
213
+ results.map(r => r.sourcePath)
214
+ )
205
215
  return ignored.size ? results.filter(r => !ignored.has(r.sourcePath)) : results
206
216
  }
207
217
 
@@ -3,28 +3,39 @@ type: JS Module
3
3
  title: docgen-crc.mjs
4
4
  resource: npm/rules/doc-files/js/docgen-crc.mjs
5
5
  docgen:
6
- crc: cca0a79f
6
+ crc: 0c277bb7
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 100
7
9
  ---
8
10
 
9
- Детермінований маркер актуальності файлових док: контрольна сума джерела у frontmatter плюс опційний degraded-маркер якості. Єдине джерело правди про «дока свіжа/застаріла/неякісна» для генерації, перевірок і хуків.
11
+ ## Огляд
12
+
13
+ Модуль забезпечує роботу з метаданими та оцінкою якості документів. Він дозволяє парсити метадані з Markdown-файлів за допомогою `parseDocFrontmatter`, створювати та заповнювати блоки метаданих за допомогою `buildDocFrontmatter`. Документи можуть бути промарковані за допомогою `stampDoc`. Якість документа оцінюється за допомогою `readDocQuality`, а його актуальність визначається функцією `staleness`, яка використовує `crc32` для перевірки хеш-суми. Модель документа зчитується через `readDocModel`.
10
14
 
11
15
  ## Поведінка
12
16
 
13
- 1. Контрольна сума обчислюється з байтів джерела і записується у машинний frontmatter доки разом зі шляхом джерела; розбіжність суми з поточним джерелом (або відсутність доки) означає застарілість.
14
- 2. Якщо генерація не дотягнула до порогу якості, frontmatter додатково несе оцінку (`score`) і коди проблем (`issues`); коди нормалізуються до YAML-безпечних (без пробілів, обмежена кількість), а старі доки без цих полів лишаються валідними.
15
- 3. Поріг degraded `70`, override через `N_CURSOR_DOC_FILES_THRESHOLD`.
16
- 4. Перештампування знімає наявний frontmatter і ставить свіжий, не торкаючись тіла документа; якість при цьому передається явно — без неї поля якості зникають.
17
+ QUALITY_THRESHOLD визначає поріг якості, нижче якого дока вважається неякісним.
18
+ crc32 обчислює CRC32 вмісту в hex-форматі.
19
+ parseDocFrontmatter парсить YAML-блок у вмісті md-файлу, виділяючи метадані та тіло.
20
+ buildDocFrontmatter створює OKF-сумісний YAML-блок для доки, включаючи метадані.
21
+ stampDoc замінює або додає свіжий YAML-блок у тіло md-доку, використовуючи дані джерела та оцінку.
22
+ readDocCrc зчитує CRC32 з YAML-блоку md-доки за заданим абсолютним шляхом.
23
+ readDocQuality зчитує оцінку якості (score, issues, retried, judgeModel) з YAML-блоку md-доки за абсолютним шляхом.
24
+ readDocModel зчитує повний ID моделі-генератора з YAML-блоку md-доки за абсолютним шляхом.
25
+ staleness визначає, чи є дока застарілою, порівнюючи CRC джерела з CRC у доці за абсолютними шляхами.
17
26
 
18
27
  ## Публічний API
19
28
 
20
- - `crc32` контрольна сума вмісту в hex.
21
- - `staleness` стан доки відносно джерела: `missing` / `crc-mismatch` / свіжа.
22
- - `parseDocFrontmatter` / `buildDocFrontmatter` / `stampDoc` читання і (пере)штампування машинного блока.
23
- - `readDocCrc` / `readDocQuality` точкове читання суми та якості з доки.
24
- - `QUALITY_THRESHOLD` чинний поріг degraded.
29
+ QUALITY_THRESHOLDВизначає рівень якості документа: дока з низьким показником вважається неякісним.
30
+ crc32Генерує 32-бітний контрольний сума вмісту у шістнадцятковому форматі.
31
+ parseDocFrontmatter Витягує метадані з початку документа. Якщо метаданих немає, повертає порожні дані.
32
+ buildDocFrontmatter Створює блок метаданих, сумісний з OKF, включаючи дані про генерацію документа (CRC, модель, якість).
33
+ stampDocДодає метадані до документа, що фіксують його стан.
34
+ readDocCrc — Зчитує контрольний сума з метаданих документа.
35
+ readDocQuality — Зчитує рівень якості, збережений у метаданих документа.
36
+ readDocModel — Зчитує назву моделі, використаної для генерації документа.
37
+ staleness — Визначає, чи є документ актуальним, порівнюючи його з джерелом.
25
38
 
26
39
  ## Гарантії поведінки
27
40
 
28
- - Сума не залежить від git-стану: rebase, гілки й незакомічені зміни на неї не впливають.
29
- - Frontmatter — єдиний машинний виняток із правила «чистий Markdown»; тіло доки модуль не редагує.
30
- - Відсутні поля якості читаються як «не оцінено» (`score: null`), а не як нуль.
41
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -3,31 +3,33 @@ type: JS Module
3
3
  title: docgen-extract.mjs
4
4
  resource: npm/rules/doc-files/js/docgen-extract.mjs
5
5
  docgen:
6
- crc: a0680e77
6
+ crc: 369662fe
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
- Витягує структурований факт-лист з вмісту файлів, аналізуючи їх залежно від мови. Для Rust витягує модульний опис, публічні експорти, локальні символи та класифікує імпорти й поведінкові маркери. Для JavaScript/TypeScript/MJS витягує опис, експортовані елементи з JSDoc, класифікує імпорти та визначає поведінкові маркери. При аналізі ігноруються директорії: .github, .git, node_modules, base/, ua/, .firebase. Звертається до мережі та кешує дані протягом одного прогону.
11
+ ## Огляд
12
+
13
+ Модуль витягує структурований факт-лист з вмісту файлів, звертаючись до мережі. Функція `extractFacts` аналізує вміст файлів, визначаючи публічні експорти, локальні символи та поведінкові маркери для Rust та JavaScript/TypeScript файлів. При цьому ігноруються системні та залежності, включаючи каталоги `.github`, `.git`, `node_modules`, `base/`, `ua/` та `.firebase`. Результати аналізу кешуються протягом одного прогону.
12
14
 
13
15
  ## Поведінка
14
16
 
15
17
  1. Витягує факт-лист з вмісту файлу.
16
18
  2. Визначає мову файлу за розширенням.
17
19
  3. Якщо мова — Rust, виконує аналіз Rust-коду:
18
- а. Витягує модульний опис з `//!`.
19
- б. Визначає публічні експорти (структури, функції, енуми) на основі `pub` префікса або експозиційних атрибутів.
20
- в. Визначає локальні (приватні) символи, які не є публічними.
21
- г. Класифікує імпорти (`std`, зовнішні, внутрішні).
22
- д. Визначає поведінкові маркери (readOnly, network, caches тощо) на основі специфічних Rust-конструкцій.
20
+ а. Витягує модульний заголовок (`//!`).
21
+ б. Визначає публічні експорти (структури, функції, класи), виходячи з префіксів `pub` та атрибутів експозиції.
22
+ в. Визначає локальні (приватні) символи, які не є публічними.
23
+ г. Класифікує імпорти (`use`) як стандартні, зовнішні чи внутрішні.
24
+ д. Визначає поведінкові маркери (наприклад, чи є код лише для читання, чи обробляє помилки).
23
25
  4. Якщо мова — JavaScript/TypeScript/MJS, виконує аналіз JS-коду:
24
- а. Витягує загальний опис файлу з верхнього блоку коментарів.
25
- б. Витягує експортовані функції та класи разом із їхніми JSDoc-описами.
26
- в. Класифікує імпорти на стандартні бібліотеки, NPM-пакети та внутрішні модулі.
27
- г. Визначає локальні (неекспортовані) функції та класи.
28
- д. Визначає поведінкові маркери (readOnly, network, caches тощо) на основі евристик.
29
- 5. При аналізі JS-коду, свідомо ігнорує шляхи: .github, .git, node_modules, base/, ua/, .firebase.
30
- 6. Повертає структуру фактів, що містить метадані про файл.
26
+ а. Витягує заголовок файлу.
27
+ б. Визначає публічні експорти з їхнім JSDoc.
28
+ в. Класифікує імпорти як стандартні, npm або внутрішні.
29
+ г. Визначає локальні символи (службові функції).
30
+ д. Визначає поведінкові маркери (наприклад, чи є код лише для читання, чи звертається до мережі).
31
+ 5. Усі аналізи свідомо ігнорують шляхи: `.github`, `.git`, `node_modules`, `base/`, `ua/`, `.firebase`.
32
+ 6. Повертає структуру фактів, що містить інформацію про файл.
31
33
 
32
34
  ## Публічний API
33
35
 
@@ -3,30 +3,30 @@ type: JS Module
3
3
  title: docgen-files-batch.mjs
4
4
  resource: npm/rules/doc-files/js/docgen-files-batch.mjs
5
5
  docgen:
6
- crc: f68c0832
6
+ crc: 6316eecb
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
11
  ## Огляд
12
12
 
13
- Модуль керує життєвим циклом документації. Він вибирає цільові документи для оновлення, видаляє непов'язані документи та виконує пакетну генерацію. Модуль забезпечує стійкість роботи, перехоплюючи помилки та не кидаючи винятків назовні. Він також детерміновано оновлює метадані існуючих документів.
13
+ Модуль керує життєвим циклом документації. Він вибирає цілі для оновлення за допомогою `selectTargets`, очищає від неіснуючих джерел за допомогою `purgeOrphanedDocs`, запускає генерацію файлів через `runDocFilesGenCli` та `runDocFilesStampCli`, а також виконує пакетну генерацію за допомогою `runGenerationBatch`. Усі операції виконуються з механізмом перехоплення помилок, що запобігає виникненню винятків назовні.
14
14
 
15
15
  ## Поведінка
16
16
 
17
- selectTargets фільтрує знайдені файли, вибираючи ті, що застарілі або мають низьку якість і не були спробовані раніше.
18
- purgeOrphanedDocs видаляє доки, для яких не існує відповідного джерела, і оновлює індекси директорій.
19
- runDocFilesGenCli ініціює генерацію документації, видаляючи сирітських доків, вибираючи цілі та запускаючи пакетну генерацію.
20
- runGenerationBatch виконує послідовний прогін цільових файлів, генеруючи документацію та керуючи цим процесом через механізм захисту від збоїв.
21
- runDocFilesStampCli детерміновано оновлює метадані (frontmatter) існуючих доків, додаючи CRC та зберігаючи якість, без виклику LLM.
17
+ selectTargets відфільтровує документи для генерації, вибираючи застарілі або ті, які мають низьку якість і не були спробовані раніше.
18
+ purgeOrphanedDocs видаляє документи, для яких не існує відповідного джерела, і оновлює індекси директорій.
19
+ runDocFilesGenCli запускає генерацію документації для застарілих або низькоякісних файлів, після попереднього очищення сирітських документів.
20
+ runGenerationBatch виконує послідовну генерацію документації для заданого набору цілей, керуючи процесом через механізм виходу з ладу.
21
+ runDocFilesStampCli детерміновано оновлює метадані (frontmatter) існуючих документів, додаючи CRC та зберігаючи дані про якість.
22
22
 
23
23
  ## Публічний API
24
24
 
25
- selectTargets — Визначає цілі для генерації: застарілі або погіршені документи, які ще не пройшли перевірку CRC, або всі документи при використанні прапора перезапису.
26
- purgeOrphanedDocs — Видаляє документи, для яких відсутній вихідний файл, та оновлює/очищає файл `index.md` у відповідній директорії.
25
+ selectTargets — Визначає цілі для генерації документації: застарілі або деградовані документи, або всі документи при використанні прапора перезапису.
26
+ purgeOrphanedDocs — Видаляє документи, для яких відсутній відповідний вихідний файл, та оновлює файл індексу.
27
27
  runDocFilesGenCli — Генерує документацію для застарілих або відсутніх документів.
28
- runGenerationBatch — Виконує послідовну генерацію документів: перевіряє локальний бекенд, обробляє цілі генерації з механізмом захисту від збоїв, і надає фінальний звіт.
29
- runDocFilesStampCli — Додає або оновлює метадані `source` та `crc` до існуючих документів без залучення великих мовних моделей, використовуючи наявні дані про модель та якість.
28
+ runGenerationBatch — Виконує повний цикл генерації: перевіряє стан локального бекенду, послідовно генерує документи з обробкою збоїв, та створює фінальний звіт.
29
+ runDocFilesStampCli — Додає або оновлює метадані джерела та контрольної суми до існуючих документів без використання великих мовних моделей.
30
30
 
31
31
  ## Гарантії поведінки
32
32
 
@@ -3,42 +3,31 @@ type: JS Module
3
3
  title: docgen-gen.mjs
4
4
  resource: npm/rules/doc-files/js/docgen-gen.mjs
5
5
  docgen:
6
- crc: 7674d2b2
6
+ crc: 059d7d6e
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
7
8
  score: 100
8
9
  ---
9
10
 
10
- Огляд
11
- Публічні функції виконують операції з текстом та оцінками. Вони включають виділення коду, вставлення інформації та генерацію документів на основі визначених параметрів.
11
+ ## Огляд
12
12
 
13
- ## Поведінка
14
-
15
- splitProtected
16
- Вибирає та видаляє код-фенс-обгортку з секції
17
-
18
- insertProtected
19
- Вставляє захищений блок Призначення після заголовка Огляд
13
+ Модуль забезпечує повний цикл роботи з документами: відокремлює захищений блок за допомогою `splitProtected`, вставляє його у визначене місце за допомогою `insertProtected`, генерує повний Markdown-документ через `generateDoc` (з використанням `DEFAULT_LOCAL_MODEL`), а також оцінює якість документа за допомогою `scoreDoc`. Кешування застосовується протягом прогону. (abie.mdc)
20
14
 
21
- scoreDoc
22
- Перевіряє вихід проти фактів і повертає оцінку та список проблем
23
-
24
- DEFAULT_LOCAL_MODEL
25
- Повертає дефолтну модель для роботи
15
+ ## Поведінка
26
16
 
27
- generateDoc
28
- Генерує документ з детермінованою оцінкою та метаданими
17
+ splitProtected відокремлює захищений блок Призначення від основного документа.
18
+ insertProtected вставляє захищений блок Призначення у фіксовану позицію після заголовка документа.
19
+ scoreDoc оцінює якість згенерованого документа за заданими критеріями.
20
+ DEFAULT_LOCAL_MODEL визначає модель, яка використовується для генерації документа.
21
+ generateDoc генерує повний Markdown-документ з опису файлу, застосовуючи оцінку та можливий ретрай.
29
22
 
30
23
  ## Публічний API
31
24
 
32
- splitProtected — Відокремлює захищену секцію `## Призначення` (Варіант B). Межа наступний `## ` і `###` не обриває блок. (abie.mdc)
33
- insertProtected — Вставляє захищений блок `## Призначення` одразу після H1 (фіксована позиція). (abie.mdc)
34
- scoreDoc — Stage 2.5 Детермінований скоринг (0 токенів): перевіряє вихід проти фактів. (abie.mdc)
35
- DEFAULT_LOCAL_MODEL — Дефолтна модель: N_CURSOR_DOCGEN_MODEL resolveModel omlx напряму. Останній fallback гарантує локальний виклик без змін середовища (через pi CLI той самий локальний виклик виміряно повільніший на ~46%). (abie.mdc)
36
- generateDoc — Головний API: файл md-дока з det-оцінкою. (abie.mdc)
25
+ splitProtected — Розділяє захищений розділ `## Призначення` (Варіант B), використовуючи наступний заголовок рівня H2 або H3 як межу.
26
+ insertProtected — Розміщує захищений блок `## Призначення` безпосередньо після основного заголовка (H1).
27
+ scoreDoc — Виконує детерміновану оцінку (Stage 2.5), порівнюючи вихідні дані з фактичною інформацією.
28
+ DEFAULT_LOCAL_MODEL — Визначає модель для генерації документа, використовуючи мінімальну локальну модель. Якщо модель не задана, процес зупиняється з помилкою.
29
+ generateDoc — Основна функція, яка перетворює вхідний файл у Markdown-документ з оцінкою достовірності.
37
30
 
38
31
  ## Гарантії поведінки
39
32
 
40
- - Read-only: файл не виконує операцій запису у файлову систему.
41
- - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
42
- - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
43
33
  - Кешує результати в межах одного прогону.
44
- - Не звертається до мережі.
@@ -3,26 +3,28 @@ type: JS Module
3
3
  title: docgen-judge-measure.mjs
4
4
  resource: npm/rules/doc-files/js/docgen-judge-measure.mjs
5
5
  docgen:
6
- crc: e6e19732
6
+ crc: 86b3120f
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
- Файл зчитує список файлів для аналізу, спираючись на конфігурацію `report.json`. Для кожного файлу генерується технічна документація за допомогою локальної моделі. Після генерації документація оцінюється хмарною моделлю. Результати оцінки кешуються у межах прогону, а потім збираються у звіт. Звіт зберігається у `report.json` та виводиться у консоль.
11
+ ## Огляд
12
+
13
+ Файл аналізує надані файли коду, створюючи документацію та оцінюючи її якість відповідно до конфігурації, що міститься у report.json. Процес збирає результати для кожного файлу, використовуючи кешування у межах прогону на основі вмісту джерела та вже згенерованої документації. У кінці процес агрегує дані та зберігає повний звіт у report.json, а також виводить його у консоль.
12
14
 
13
15
  ## Поведінка
14
16
 
15
- 1. Зчитує список файлів для аналізу з командного рядка.
17
+ 1. Зчитує список файлів для аналізу з аргументів командного рядка.
16
18
  2. Для кожного файлу зчитує його вміст.
17
- 3. Генерує документацію для файлу, використовуючи локальну модель. Результат кешується за хешем вмісту джерела.
18
- 4. Якщо генерація документації неможлива або не пройшла встановлений поріг якості, фіксує це як помилку або непідтримуваний файл.
19
- 5. Якщо документація пройшла поріг якості, вона передається для оцінки.
20
- 6. Оцінює згенеровану документацію за допомогою потужної хмарної моделі. Результат оцінки кешується за хешем вмісту джерела та документації.
21
- 7. Якщо оцінка неможлива, фіксує помилку оцінки.
22
- 8. Збирає результати для всіх файлів.
23
- 9. Обчислює звіт, включаючи загальну кількість файлів, кількість успішно згенерованих та оцінених, а також відсоток хибнопозитивних результатів (false-positive rate).
24
- 10. Зберігає повний звіт у файл `report.json` у каталозі кешу.
25
- 11. Виводить консольний звіт з ключовими показниками.
19
+ 3. Генерує документацію для файлу, використовуючи кешування за вмістом джерела.
20
+ 4. Якщо генерація документації успішна і отриманий бал перевищує встановлений поріг, переходить до етапу оцінки.
21
+ 5. Якщо бал не перевищує порогу, файл вважається "degraded" (зниженою якістю) і не підлягає подальшій оцінці.
22
+ 6. Якщо бал перевищує поріг, документація передається для оцінки потужній моделі, використовуючи кешування за вмістом джерела та згенерованою документацією.
23
+ 7. Оцінка повертає вердикт ("accurate", "generic" або "inaccurate"), впевненість та причину.
24
+ 8. Збираються результати для кожного файлу.
25
+ 9. Після обробки всіх файлів агрегуються результати: підраховуються загальні показники (кількість файлів, помилки генерації, кількість пройшлих тестів, розподіл вердиктів).
26
+ 10. Зберігається звіт у файл `report.json` у каталозі кешу.
27
+ 11. Виводиться консольний звіт про результати вимірювання.
26
28
 
27
29
  ## Гарантії поведінки
28
30
 
@@ -3,30 +3,32 @@ type: JS Module
3
3
  title: docgen-judge.mjs
4
4
  resource: npm/rules/doc-files/js/docgen-judge.mjs
5
5
  docgen:
6
- crc: c6ab093a
6
+ crc: fcbf72fa
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
- Модуль оцінює згенеровану документацію, порівнюючи її з вихідним файлом за допомогою великої мовної моделі. Це дозволяє визначити відповідність та якість документації. Модуль надає функції для запуску оцінки (`judgeDoc`, `judgeFailsDoc`), отримання результатів (`parseDocVerdict`), визначення моделі (`JUDGE_MODEL`), перевірки статусу оцінювача (`JUDGE_ENABLED`) та отримання рівня впевненості (`JUDGE_CONFIDENCE`).
11
+ ## Огляд
12
+
13
+ Модуль реалізує механізм оцінки якості документації. Він визначає модель для оцінки за допомогою `JUDGE_MODEL`, перевіряє статус активності гейту через `JUDGE_ENABLED` та встановлює поріг впевненості за допомогою `JUDGE_CONFIDENCE`. Модуль отримує, парсить та визначає фінальний статус документації, викликаючи `judgeDoc` для отримання висновків, а також може використовувати `judgeFailsDoc` для визначення провалу.
12
14
 
13
15
  ## Поведінка
14
16
 
15
17
  JUDGE_MODEL — Вказує модель, яку використовує суддя для оцінки документації.
16
- JUDGE_ENABLED — Позначає, чи активна функціональність судді.
17
- JUDGE_CONFIDENCE — Визначає мінімальний рівень впевненості, необхідний для позначення документації як деградованої.
18
- parseDocVerdict — Витягує та валідує об'єкт з оцінкою документації з сирого текстового виводу судді.
19
- judgeDoc — Виконує оцінку згенерованої документації проти вмісту вихідного файлу за допомогою великої мовної моделі.
18
+ JUDGE_ENABLED — Позначає, чи активний семантичний гейт судді.
19
+ JUDGE_CONFIDENCE — Визначає мінімальну впевненість, необхідну для позначення документації як деградованої.
20
+ parseDocVerdict — Витягує та валідує об'єкт оцінки з сирого текстового виводу судді.
21
+ judgeDoc — Зіставляє вміст вихідного файлу та згенеровану документацію, щоб отримати оцінку від судді.
20
22
  judgeFailsDoc — Визначає, чи слід вважати документацію деградованою на основі оцінки судді.
21
23
 
22
24
  ## Публічний API
23
25
 
24
26
  JUDGE_MODEL — Визначає модель-суддю як `N_CLOUD_MIN_MODEL` (хмарний мінімальний рівень).
25
- JUDGE_ENABLED — Автоматично вмикає механізм судді, якщо обрано `N_CLOUD_MIN_MODEL`.
26
- JUDGE_CONFIDENCE — Встановлює мінімальний рівень впевненості, необхідний для позначення документа як погіршеного (degraded) за неточним вердиктом.
27
- parseDocVerdict — Витягує та перевіряє структуру вердикту у форматі JSON із сирих даних від великої мовної моделі.
28
- judgeDoc — Оцінює згенерований документ потужною моделлю, порівнюючи його з вихідним джерелом.
29
- judgeFailsDoc — Визначає, чи повинен документ бути позначений як погіршений (degraded) на підставі вердикту, якщо він неточний і має достатню впевненість.
27
+ JUDGE_ENABLED — Автоматично вмикає механізм суддівства, якщо обрано `N_CLOUD_MIN_MODEL`.
28
+ JUDGE_CONFIDENCE — Встановлює мінімальний рівень впевненості для позначення документа як погіршеного (degraded) через неточність.
29
+ parseDocVerdict — Витягує та перевіряє JSON-вердикт із відповіді великої мовної моделі.
30
+ judgeDoc — Оцінює згенерований документ потужною моделлю порівняно з оригінальним джерелом.
31
+ judgeFailsDoc — Визначає, чи повинен документ бути позначений як погіршений, якщо вердикт є `inaccurate` і впевненість достатня.
30
32
 
31
33
  ## Гарантії поведінки
32
34
 
@@ -3,47 +3,48 @@ type: JS Module
3
3
  title: docgen-scan.mjs
4
4
  resource: npm/rules/doc-files/js/docgen-scan.mjs
5
5
  docgen:
6
- crc: f01465d8
6
+ crc: 563b7722
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
11
  ## Огляд
12
12
 
13
- Модуль аналізує кодову базу та пов'язану з нею документацію. Він визначає, які файли є джерелами за допомогою `isSourceFile` та знаходить відповідні шляхи документації за допомогою `docPathForSource`. Модуль перевіряє, чи не залишилися без зв'язку (сиротами) документи, використовуючи `scanOrphanedDocs`, та сканує файли документації за допомогою `scanForDocFiles`. Для роботи з кореневими каталогами використовується `resolveRoot`. Усі операції виконуються з механізмом перехоплення помилок (fail-safe), при цьому при певних збоях повертається `null` замість викидання винятків.
13
+ Модуль визначає, які файли є кодовим джерелом за допомогою `isSourceFile`. Він обчислює відповідні шляхи до Markdown-документів для коду за допомогою `docPathForSource`. Модуль ідентифікує потенційні кандидати для документування за допомогою `isDocCandidate` та надає опис файлу за допомогою `describeFile`. Для аналізу файлової системи використовуються `scanOrphanedDocs` для пошуку "сирітських" документів та `scanForDocFiles` для сканування файлів. Модуль також може визначати кореневий каталог за допомогою `resolveRoot` та виконувати сканування файлів документації через `runDocFilesScanCli` або перевірку через `runDocFilesCheckCli`.
14
14
 
15
15
  ## Поведінка
16
16
 
17
17
  isSourceFile визначає, чи є ім'я файлу кодовим джерелом для документування.
18
- docPathForSource обчислює шлях до відповідного MD-документа для заданого кодового файлу.
19
- isDocCandidate визначає, чи підлягає певний файл документуванню, враховуючи розширення, статус тесту та ігнорування.
20
- describeFile описує кодовий файл, надаючи його шлях, шлях до документації та стан застарілості.
21
- scanOrphanedDocs знаходить MD-документи, які посилаються на кодові файли, що більше не існують.
22
- scanForDocFiles рекурсивно обходить дерево і повертає список кодових файлів із їхнім станом застарілості, відфільтрований за ігноруванням Git.
23
- resolveRoot парсить аргументи для визначення абсолютного кореня обходу, використовуючи поточну робочу директорію за замовчуванням.
18
+ docPathForSource обчислює шлях до відповідного md-документа для заданого кодового файлу.
19
+ isDocCandidate визначає, чи є файл кандидатом на документування, враховуючи розширення, статус тесту та ігнорування.
20
+ describeFile описує кодовий файл, надаючи шлях джерела, шлях доки та стан застарілості.
21
+ scanOrphanedDocs знаходить md-документи, які посилаються на джерела, що більше не існують.
22
+ scanForDocFiles рекурсивно сканує дерево і повертає список кодових файлів зі станом застарілості, відфільтрований за ігноруванням Git.
23
+ resolveRoot визначає абсолютний корінь обходу, використовуючи аргументи або поточний робочий каталог.
24
24
  runDocFilesScanCli сканує дерево і друкує JSON-масив усіх кодових файлів зі станом застарілості.
25
- runDocFilesCheckCli виконує перевірку застарілості, підтримуючи режими для перевірки одного файлу, Git-гейту або звітів про знижену якість.
25
+ runDocFilesCheckCli виконує перевірку застарілості, що може бути використана для хуків, Git-гейтів або ручного переліку шляхів.
26
26
 
27
27
  ## Публічний API
28
28
 
29
- isSourceFile — визначає, чи є файл кодовим джерелом для створення документації.
30
- docPathForSource — визначає шлях до відповідного MD-документа, розміщений у теці `docs/` відносно коду.
31
- isDocCandidate — вирішує, чи повинен кодовий файл бути документований: має правильне розширення, не є тестом, не ігнорується та не є системним документом.
32
- describeFile — надає опис кодового файлу, включаючи його шлях, шлях до документації та статус застарілості.
33
- scanOrphanedDocs — шукає документи, які посилаються на кодові файли, що більше не існують, перевіряючи лише згенеровані файли.
34
- scanForDocFiles — рекурсивно збирає всі кодові файли з дерева, визначаючи їхній статус застарілості, і відсіюючи ті, що ігноруються через `.gitignore`.
35
- resolveRoot — встановлює кореневу директорію для сканування, використовуючи аргумент командного рядка або поточну робочу директорію.
36
- runDocFilesScanCli — сканує дерево та виводить JSON-масив усіх кодових файлів зі статусом застарілості, дозволяючи фільтрувати лише застарілі або всі файли.
37
- runDocFilesCheckCli — виконує перевірку застарілості для використання у хуках та командному інтерфейсі.
38
-
39
- Режими:
40
- --hook — перевіряє один файл, отриманий з JSON через стандартний ввід.
41
- --git — порівнює файли у `git diff` та блокує процес, якщо знайдено більше за встановлений поріг застарілих файлів.
42
- --degraded — виводить звіт про документи з низьким показником якості.
43
- <paths…> — обробляє лише вказані шляхи-джерела.
44
-
45
- Вихідний код 2 — вказує на знаходження застарілих файлів (для блокування хука).
46
- Вихідний код 0 — вказує на відсутність застарілих файлів або проходження перевірки згідно з порогом.
29
+ isSourceFile — визначає, чи є файл вихідним кодом для створення документації.
30
+ docPathForSource — визначає шлях до файлу документації, розміщений у теці `docs/` відносно коду.
31
+ isDocCandidate — вирішує, чи повинен кодовий файл бути документований (правильне розширення, не тест, не ігнорується, не системний).
32
+ describeFile — надає опис кодового файлу, включаючи його шлях та статус застарілості.
33
+ scanOrphanedDocs — знаходить файли документації, які посилаються на вихідний код, що більше не існує.
34
+ scanForDocFiles — рекурсивно шукає всі кодові файли у заданому дереві та визначає їхній статус застарілості.
35
+ resolveRoot — встановлює кореневу директорію для сканування, використовуючи аргумент командного рядка або поточну директорію.
36
+ runDocFilesScanCli — сканує дерево та виводить JSON-масив усіх кодових файлів зі статусом застарілості.
37
+ runDocFilesCheckCli — виконує перевірку застарілості файлів для хуків та командного інтерфейсу.
38
+
39
+ **Режими роботи:**
40
+ `--hook` — перевіряє один файл, отриманий із вхідного JSON, у контексті хука.
41
+ `--git` — порівнює файли у `git diff` та блокує виконання, якщо знайдено застарілі файли, перевищуючи встановлений ліміт.
42
+ `--degraded`генерує звіт про файли документації, які не відповідають встановленому рівню якості.
43
+ `<paths…>` — обробляє лише вказані явно шляхи-джерела.
44
+
45
+ **Коди виходу:**
46
+ Вихід 2 — вказує на знаходження застарілих файлів (для блокування хука).
47
+ Вихід 0 — вказує на відсутність застарілих файлів або проходження перевірки згідно з лімітом.
47
48
 
48
49
  ## Гарантії поведінки
49
50