@nitra/cursor 12.7.0 → 12.8.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 (172) hide show
  1. package/.pi-template/extensions/n-cursor-adr/docs/index.md +2 -2
  2. package/CHANGELOG.md +15 -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 +10 -2
  35. package/rules/doc-files/js/docs/docgen-crc.md +25 -14
  36. package/rules/doc-files/js/docs/docgen-extract.md +15 -13
  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/index.md +16 -16
  41. package/rules/docker/docs/fix.md +6 -6
  42. package/rules/docker/docs/index.md +3 -3
  43. package/rules/docker/js/docs/index.md +2 -2
  44. package/rules/docker/lib/docs/docker-hadolint.md +2 -2
  45. package/rules/docker/lib/docs/index.md +5 -5
  46. package/rules/efes/docs/fix.md +8 -8
  47. package/rules/efes/docs/index.md +3 -3
  48. package/rules/feedback/docs/fix.md +5 -5
  49. package/rules/feedback/docs/index.md +3 -3
  50. package/rules/ga/docs/fix.md +5 -5
  51. package/rules/ga/docs/index.md +3 -3
  52. package/rules/ga/js/docs/index.md +3 -3
  53. package/rules/graphql/docs/fix.md +8 -8
  54. package/rules/graphql/docs/index.md +3 -3
  55. package/rules/graphql/docs/main.md +8 -8
  56. package/rules/graphql/js/docs/index.md +2 -2
  57. package/rules/graphql/lib/docs/index.md +2 -2
  58. package/rules/hasura/docs/fix.md +11 -11
  59. package/rules/hasura/docs/index.md +3 -3
  60. package/rules/hasura/js/docs/index.md +2 -2
  61. package/rules/image-avif/docs/fix.md +3 -3
  62. package/rules/image-avif/docs/index.md +3 -3
  63. package/rules/image-avif/js/docs/avif_generation.md +6 -6
  64. package/rules/image-avif/js/docs/index.md +2 -2
  65. package/rules/image-compress/docs/fix.md +2 -2
  66. package/rules/image-compress/docs/index.md +3 -3
  67. package/rules/image-compress/js/docs/index.md +3 -3
  68. package/rules/js-bun-db/docs/fix.md +5 -5
  69. package/rules/js-bun-db/docs/index.md +3 -3
  70. package/rules/js-bun-db/js/docs/index.md +2 -2
  71. package/rules/js-bun-db/lib/docs/index.md +2 -2
  72. package/rules/js-bun-redis/docs/fix.md +6 -6
  73. package/rules/js-bun-redis/docs/index.md +3 -3
  74. package/rules/js-bun-redis/js/docs/index.md +2 -2
  75. package/rules/js-bun-redis/lib/docs/index.md +2 -2
  76. package/rules/js-lint/docs/fix.md +9 -9
  77. package/rules/js-lint/docs/index.md +3 -3
  78. package/rules/js-lint/js/docs/check.md +5 -5
  79. package/rules/js-lint/js/docs/index.md +4 -4
  80. package/rules/js-lint-ci/docs/fix.md +3 -3
  81. package/rules/js-lint-ci/docs/index.md +3 -3
  82. package/rules/js-lint-ci/js/docs/index.md +2 -2
  83. package/rules/js-mssql/docs/fix.md +5 -5
  84. package/rules/js-mssql/docs/index.md +3 -3
  85. package/rules/js-mssql/js/docs/index.md +2 -2
  86. package/rules/js-mssql/lib/docs/index.md +2 -2
  87. package/rules/js-run/docs/fix.md +8 -8
  88. package/rules/js-run/docs/index.md +3 -3
  89. package/rules/js-run/js/docs/index.md +2 -2
  90. package/rules/js-run/lib/docs/index.md +7 -7
  91. package/rules/k8s/docs/fix.md +4 -4
  92. package/rules/k8s/docs/index.md +3 -3
  93. package/rules/k8s/js/docs/index.md +3 -3
  94. package/rules/nginx-default-tpl/docs/fix.md +7 -7
  95. package/rules/nginx-default-tpl/docs/index.md +3 -3
  96. package/rules/nginx-default-tpl/js/docs/index.md +2 -2
  97. package/rules/nginx-default-tpl/js/docs/template.md +2 -2
  98. package/rules/npm-module/docs/fix.md +8 -8
  99. package/rules/npm-module/docs/index.md +3 -3
  100. package/rules/npm-module/js/docs/index.md +5 -5
  101. package/rules/npm-module/js/docs/rule_meta.md +6 -6
  102. package/rules/npm-module/js/header_doc_pointer.mjs +1 -3
  103. package/rules/php/docs/fix.md +6 -6
  104. package/rules/php/docs/index.md +3 -3
  105. package/rules/php/js/docs/index.md +3 -3
  106. package/rules/python/docs/fix.md +11 -11
  107. package/rules/python/docs/index.md +3 -3
  108. package/rules/python/js/docs/index.md +3 -3
  109. package/rules/python/main.mjs +2 -1
  110. package/rules/rego/docs/fix.md +5 -5
  111. package/rules/rego/docs/index.md +3 -3
  112. package/rules/rego/js/docs/index.md +3 -3
  113. package/rules/release/docs/index.md +5 -5
  114. package/rules/release/lib/docs/index.md +4 -4
  115. package/rules/rust/docs/fix.md +4 -4
  116. package/rules/rust/docs/index.md +3 -3
  117. package/rules/rust/js/docs/index.md +3 -3
  118. package/rules/rust/lib/docs/index.md +2 -2
  119. package/rules/rust/main.mjs +7 -1
  120. package/rules/security/docs/fix.md +6 -6
  121. package/rules/security/docs/index.md +3 -3
  122. package/rules/security/js/docs/index.md +4 -4
  123. package/rules/style-lint/docs/fix.md +3 -3
  124. package/rules/style-lint/docs/index.md +3 -3
  125. package/rules/style-lint/js/docs/index.md +3 -3
  126. package/rules/tauri/docs/fix.md +11 -11
  127. package/rules/tauri/docs/index.md +3 -3
  128. package/rules/tauri/js/docs/index.md +3 -3
  129. package/rules/test/docs/fix.md +5 -5
  130. package/rules/test/docs/index.md +3 -3
  131. package/rules/test/js/data/stryker_config/docs/index.md +4 -4
  132. package/rules/test/js/data/vitest_config/docs/index.md +2 -2
  133. package/rules/test/js/docs/index.md +7 -7
  134. package/rules/text/docs/fix.md +11 -11
  135. package/rules/text/docs/index.md +3 -3
  136. package/rules/text/js/cspell-fix.mjs +7 -2
  137. package/rules/text/js/docs/index.md +8 -8
  138. package/rules/text/js/docs/run-v8r.md +3 -3
  139. package/rules/text/main.mjs +3 -1
  140. package/rules/tool-surface/docs/index.md +3 -3
  141. package/rules/tool-surface/meta.json +6 -1
  142. package/rules/vue/docs/fix.md +6 -6
  143. package/rules/vue/docs/index.md +3 -3
  144. package/rules/vue/js/docs/index.md +2 -2
  145. package/rules/vue/lib/docs/index.md +2 -2
  146. package/rules/worktree/docs/fix.md +11 -11
  147. package/rules/worktree/docs/index.md +3 -3
  148. package/scripts/coverage-classify/docs/index.md +6 -6
  149. package/scripts/dispatcher/docs/index.md +2 -2
  150. package/scripts/docs/index.md +16 -16
  151. package/scripts/lib/docs/index.md +36 -36
  152. package/scripts/lib/docs/run-lint.md +3 -3
  153. package/scripts/lib/docs/run-standard-lint.md +7 -5
  154. package/scripts/lib/fix/analyze-escalation.mjs +4 -1
  155. package/scripts/lib/fix/docs/index.md +10 -10
  156. package/scripts/lib/fix/docs/run-conformance-check.md +4 -3
  157. package/scripts/lib/fix/docs/run-fix-check.md +3 -3
  158. package/scripts/lib/fix/orchestrator.mjs +26 -3
  159. package/scripts/lib/fix/t0.mjs +4 -1
  160. package/scripts/lib/run-lint.mjs +1 -3
  161. package/scripts/utils/docs/index.md +14 -14
  162. package/skills/doc-aggregate/js/docs/index.md +3 -3
  163. package/skills/doc-files/.changes/260612-0002.md +1 -0
  164. package/skills/doc-files/.changes/260612-0006.md +1 -0
  165. package/skills/doc-files/.changes/260612-0008.md +1 -0
  166. package/skills/doc-files/.changes/260612-0012.md +1 -0
  167. package/skills/doc-files/.changes/260612-0031.md +1 -0
  168. package/skills/doc-files/.changes/260612-0036.md +1 -0
  169. package/skills/doc-files/.changes/260612-0114.md +1 -0
  170. package/skills/start-check/js/docs/index.md +2 -2
  171. package/skills/taze/js/docs/index.md +2 -2
  172. package/types/bin/n-cursor.d.ts +1 -1
@@ -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
 
@@ -160,7 +160,12 @@ function gitIgnoredPaths(root, relPaths) {
160
160
  encoding: 'utf8',
161
161
  stdio: ['pipe', 'pipe', 'ignore'] // git пише «not a git repository» у stderr — глушимо
162
162
  })
163
- return new Set(out.split('\n').map(s => s.trim()).filter(Boolean))
163
+ return new Set(
164
+ out
165
+ .split('\n')
166
+ .map(s => s.trim())
167
+ .filter(Boolean)
168
+ )
164
169
  } catch {
165
170
  // exit 1 (жоден не ігнорується) і 128 (не git-репо) → execFileSync кидає; обидва = «не фільтруємо».
166
171
  return new Set()
@@ -201,7 +206,10 @@ export function scanForDocFiles(root) {
201
206
  }
202
207
 
203
208
  walk(root)
204
- const ignored = gitIgnoredPaths(root, results.map(r => r.sourcePath))
209
+ const ignored = gitIgnoredPaths(
210
+ root,
211
+ results.map(r => r.sourcePath)
212
+ )
205
213
  return ignored.size ? results.filter(r => !ignored.has(r.sourcePath)) : results
206
214
  }
207
215
 
@@ -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
+ б. Визначає публічні експорти (структури, функції, класи), виходячи з префіксів `pub` та атрибутів експозиції.
20
22
  в. Визначає локальні (приватні) символи, які не є публічними.
21
- г. Класифікує імпорти (`std`, зовнішні, внутрішні).
22
- д. Визначає поведінкові маркери (readOnly, network, caches тощо) на основі специфічних Rust-конструкцій.
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. Якщо якість документації відповідає порогу, передає вміст джерела та згенеровану документацію для оцінки сильною моделлю.
22
+ 6. Оцінювач повертає вердикт (точний, загальний, неточний) з обґрунтуванням.
23
+ 7. Зберігає результати для кожного файлу.
24
+ 8. Агрегує результати: підраховує загальну кількість файлів, успішно згенерованих, пройшли перевірку, а також розподіл вердиктів серед тих, що пройшли перевірку.
25
+ 9. Формує звіт, який включає конфігурацію, підрахунки та відсотки помилкових спрацьовувань.
26
+ 10. Зберігає фінальний звіт у файл `report.json` у каталозі кешу.
27
+ 11. Виводить консольний звіт про результати вимірювання.
26
28
 
27
29
  ## Гарантії поведінки
28
30
 
@@ -6,20 +6,20 @@ resource: npm/rules/doc-files/js/
6
6
 
7
7
  # npm/rules/doc-files/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
11
- | [docgen-crc.mjs](docgen-crc.md) | JS Module |
9
+ | Файл | Тип |
10
+ | ------------------------------------------------------- | --------- |
11
+ | [docgen-crc.mjs](docgen-crc.md) | JS Module |
12
12
  | [docgen-extract-anchors.mjs](docgen-extract-anchors.md) | JS Module |
13
- | [docgen-extract.mjs](docgen-extract.md) | JS Module |
14
- | [docgen-files-batch.mjs](docgen-files-batch.md) | JS Module |
15
- | [docgen-gen.mjs](docgen-gen.md) | JS Module |
16
- | [docgen-ignore.mjs](docgen-ignore.md) | JS Module |
17
- | [docgen-judge-measure.mjs](docgen-judge-measure.md) | JS Module |
18
- | [docgen-judge.mjs](docgen-judge.md) | JS Module |
19
- | [docgen-prompts.mjs](docgen-prompts.md) | JS Module |
20
- | [docgen-scan.mjs](docgen-scan.md) | JS Module |
21
- | [lint.mjs](lint.md) | JS Module |
22
- | [run-lint.mjs](run-lint.md) | JS Module |
23
- | [units-js.mjs](units-js.md) | JS Module |
24
- | [units-rs.mjs](units-rs.md) | JS Module |
25
- | [units.mjs](units.md) | JS Module |
13
+ | [docgen-extract.mjs](docgen-extract.md) | JS Module |
14
+ | [docgen-files-batch.mjs](docgen-files-batch.md) | JS Module |
15
+ | [docgen-gen.mjs](docgen-gen.md) | JS Module |
16
+ | [docgen-ignore.mjs](docgen-ignore.md) | JS Module |
17
+ | [docgen-judge-measure.mjs](docgen-judge-measure.md) | JS Module |
18
+ | [docgen-judge.mjs](docgen-judge.md) | JS Module |
19
+ | [docgen-prompts.mjs](docgen-prompts.md) | JS Module |
20
+ | [docgen-scan.mjs](docgen-scan.md) | JS Module |
21
+ | [lint.mjs](lint.md) | JS Module |
22
+ | [run-lint.mjs](run-lint.md) | JS Module |
23
+ | [units-js.mjs](units-js.md) | JS Module |
24
+ | [units-rs.mjs](units-rs.md) | JS Module |
25
+ | [units.mjs](units.md) | JS Module |
@@ -14,14 +14,14 @@ docgen:
14
14
  ## Поведінка
15
15
 
16
16
  1. Запуск правила.
17
- * Приймає контекст прогону.
18
- * Виконує застосування JS-занепокоєних до політики до mdc-refs.
19
- * Повертає результат.
17
+ - Приймає контекст прогону.
18
+ - Виконує застосування JS-занепокоєних до політики до mdc-refs.
19
+ - Повертає результат.
20
20
 
21
21
  2. Виконання у режимі CLI.
22
- * Викликається через оркестрацію CLI.
23
- * Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
24
- * Виконує завантаження конфігурації, перевірку дозволених елементів та підбиття підсумку.
22
+ - Викликається через оркестрацію CLI.
23
+ - Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
24
+ - Виконує завантаження конфігурації, перевірку дозволених елементів та підбиття підсумку.
25
25
 
26
26
  ## Публічний API
27
27
 
@@ -6,7 +6,7 @@ resource: npm/rules/docker/
6
6
 
7
7
  # npm/rules/docker
8
8
 
9
- | Файл | Тип |
10
- |---|---|
11
- | [fix.mjs](fix.md) | JS Module |
9
+ | Файл | Тип |
10
+ | ------------------- | --------- |
11
+ | [fix.mjs](fix.md) | JS Module |
12
12
  | [main.mjs](main.md) | JS Module |
@@ -6,6 +6,6 @@ resource: npm/rules/docker/js/
6
6
 
7
7
  # npm/rules/docker/js
8
8
 
9
- | Файл | Тип |
10
- |---|---|
9
+ | Файл | Тип |
10
+ | ------------------- | --------- |
11
11
  | [lint.mjs](lint.md) | JS Module |
@@ -22,8 +22,8 @@ lintDockerfileWithHadolint
22
22
 
23
23
  ## Публічний API
24
24
 
25
- * posixRel — Генерує абсолютний шлях від кореня з використанням лише слешів, забезпечуючи стабільність незалежно від операційної системи.
26
- * lintDockerfileWithHadolint — Запускає інструмент hadolint для аналізу Dockerfile. Якщо інструмент не знайдено у системних шляхах, він намагається встановити його. У разі невдачі встановлення або відключення автоматичного встановлення, повертає помилку, надаючи користувачеві підказку для ручного запуску (детальніше про інструмент можна знайти на https://github.com/hadolint/hadolint/releases).
25
+ - posixRel — Генерує абсолютний шлях від кореня з використанням лише слешів, забезпечуючи стабільність незалежно від операційної системи.
26
+ - lintDockerfileWithHadolint — Запускає інструмент hadolint для аналізу Dockerfile. Якщо інструмент не знайдено у системних шляхах, він намагається встановити його. У разі невдачі встановлення або відключення автоматичного встановлення, повертає помилку, надаючи користувачеві підказку для ручного запуску (детальніше про інструмент можна знайти на https://github.com/hadolint/hadolint/releases).
27
27
 
28
28
  ## Гарантії поведінки
29
29
 
@@ -6,9 +6,9 @@ resource: npm/rules/docker/lib/
6
6
 
7
7
  # npm/rules/docker/lib
8
8
 
9
- | Файл | Тип |
10
- |---|---|
11
- | [docker-hadolint.mjs](docker-hadolint.md) | JS Module |
12
- | [docker-mirror.mjs](docker-mirror.md) | JS Module |
9
+ | Файл | Тип |
10
+ | ------------------------------------------------- | --------- |
11
+ | [docker-hadolint.mjs](docker-hadolint.md) | JS Module |
12
+ | [docker-mirror.mjs](docker-mirror.md) | JS Module |
13
13
  | [docker-native-addon.mjs](docker-native-addon.md) | JS Module |
14
- | [docker-nginx-user.mjs](docker-nginx-user.md) | JS Module |
14
+ | [docker-nginx-user.mjs](docker-nginx-user.md) | JS Module |
@@ -14,16 +14,16 @@ docgen:
14
14
  ## Поведінка
15
15
 
16
16
  1. Запуск правила.
17
- * Приймає контекст прогону.
18
- * Виконує застосування JS-занепокоєних.
19
- * Застосовує політику.
20
- * Генерує посилання MDC.
21
- * Повертає результат прогону.
17
+ - Приймає контекст прогону.
18
+ - Виконує застосування JS-занепокоєних.
19
+ - Застосовує політику.
20
+ - Генерує посилання MDC.
21
+ - Повертає результат прогону.
22
22
 
23
23
  2. Запуск у режимі CLI.
24
- * Виконується при запуску через CLI.
25
- * Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
26
- * Повертає код виходу.
24
+ - Виконується при запуску через CLI.
25
+ - Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
26
+ - Повертає код виходу.
27
27
 
28
28
  ## Публічний API
29
29
 
@@ -6,7 +6,7 @@ resource: npm/rules/efes/
6
6
 
7
7
  # npm/rules/efes
8
8
 
9
- | Файл | Тип |
10
- |---|---|
11
- | [fix.mjs](fix.md) | JS Module |
9
+ | Файл | Тип |
10
+ | ------------------- | --------- |
11
+ | [fix.mjs](fix.md) | JS Module |
12
12
  | [main.mjs](main.md) | JS Module |
@@ -12,11 +12,11 @@ docgen:
12
12
  ## Поведінка
13
13
 
14
14
  1. Запуск правила.
15
- * Приймає контекст прогону.
16
- * Виконує застосування JS-занепокоєних.
17
- * Застосовує політику.
18
- * Генерує посилання MDC.
19
- * Повертає результат прогону.
15
+ - Приймає контекст прогону.
16
+ - Виконує застосування JS-занепокоєних.
17
+ - Застосовує політику.
18
+ - Генерує посилання MDC.
19
+ - Повертає результат прогону.
20
20
 
21
21
  ## Публічний API
22
22