@nitra/cursor 12.15.0 → 12.16.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.
- package/CHANGELOG.md +16 -0
- package/bin/n-cursor.js +2 -11
- package/lib/docs/index.md +9 -6
- package/lib/docs/pi-agent-fix.md +28 -0
- package/lib/docs/pi-agent-skill.md +36 -0
- package/lib/docs/pi-model-tiers.md +46 -0
- package/lib/docs/pi-one-shot.md +34 -0
- package/lib/docs/pi-telemetry-store.md +33 -0
- package/lib/docs/pi-trace.md +27 -0
- package/lib/docs/pi-write-guard.md +32 -0
- package/lib/pi-agent-fix.mjs +253 -0
- package/lib/pi-agent-skill.mjs +181 -0
- package/lib/pi-model-tiers.mjs +109 -0
- package/lib/pi-one-shot.mjs +129 -0
- package/lib/pi-telemetry-store.mjs +0 -0
- package/lib/pi-trace.mjs +40 -0
- package/lib/pi-write-guard.mjs +147 -0
- package/package.json +5 -1
- package/rules/bun/docs/main.md +7 -6
- package/rules/doc-files/js/docgen-files-batch.mjs +20 -5
- package/rules/doc-files/js/docgen-gen.mjs +42 -25
- package/rules/doc-files/js/docgen-judge-measure.mjs +16 -13
- package/rules/doc-files/js/docgen-judge.mjs +11 -9
- package/rules/doc-files/js/docs/docgen-files-batch.md +3 -20
- package/rules/doc-files/js/docs/docgen-gen.md +3 -20
- package/rules/doc-files/js/docs/docgen-judge-measure.md +3 -18
- package/rules/doc-files/js/docs/docgen-judge.md +3 -22
- package/rules/npm-module/js/docs/skill_meta.md +22 -15
- package/rules/npm-module/js/skill_meta.mjs +5 -1
- package/rules/python/docs/main.md +11 -11
- package/rules/rust/docs/main.md +5 -5
- package/rules/text/js/cspell-fix.mjs +15 -16
- package/rules/text/js/docs/cspell-fix.md +16 -9
- package/rules/text/main.mjs +4 -4
- package/schemas/skill-meta.json +8 -0
- package/scripts/docs/skills-cli.md +21 -25
- package/scripts/docs/update-blue-oak.md +8 -8
- package/scripts/lib/adr/docs/normalize-cli.md +3 -20
- package/scripts/lib/adr/docs/normalize-pipeline.md +3 -33
- package/scripts/lib/adr/normalize-cli.mjs +2 -2
- package/scripts/lib/adr/normalize-pipeline.mjs +78 -44
- package/scripts/lib/docs/discover-checkable-rules.md +6 -6
- package/scripts/lib/docs/inline-template-links.md +8 -6
- package/scripts/lib/docs/list-project-rules-mdc.md +5 -3
- package/scripts/lib/docs/root-notice.md +13 -16
- package/scripts/lib/docs/run-lint.md +10 -8
- package/scripts/lib/docs/skill-meta.md +29 -10
- package/scripts/lib/fix/docs/discover-t0-patterns.md +10 -13
- package/scripts/lib/fix/docs/escalation-log.md +10 -9
- package/scripts/lib/fix/docs/index.md +0 -1
- package/scripts/lib/fix/docs/orchestrator.md +15 -13
- package/scripts/lib/fix/escalation-log.mjs +1 -1
- package/scripts/lib/fix/orchestrator.mjs +67 -32
- package/scripts/lib/run-lint.mjs +2 -10
- package/scripts/lib/skill-meta.mjs +22 -0
- package/scripts/skills-cli.mjs +52 -14
- package/scripts/utils/ast-extract.mjs +105 -0
- package/scripts/utils/docs/ast-extract.md +30 -0
- package/scripts/utils/docs/walkDir.md +17 -20
- package/lib/docs/llm.md +0 -33
- package/lib/docs/models.md +0 -48
- package/lib/docs/omlx-trace.md +0 -49
- package/lib/docs/omlx.md +0 -41
- package/lib/llm.mjs +0 -215
- package/lib/models.mjs +0 -75
- package/lib/omlx-trace.mjs +0 -158
- package/lib/omlx.mjs +0 -220
- package/scripts/lib/fix/analyze-escalation.mjs +0 -353
- package/scripts/lib/fix/docs/analyze-escalation.md +0 -44
- package/scripts/lib/fix/docs/llm-fix-apply.md +0 -31
- package/scripts/lib/fix/docs/llm-lint-fix.md +0 -31
- package/scripts/lib/fix/docs/llm-worker.md +0 -33
- package/scripts/lib/fix/docs/verbose-block.md +0 -27
- package/scripts/lib/fix/llm-fix-apply.mjs +0 -113
- package/scripts/lib/fix/llm-lint-fix.mjs +0 -82
- package/scripts/lib/fix/llm-worker.mjs +0 -332
- package/scripts/lib/fix/verbose-block.mjs +0 -82
package/rules/rust/docs/main.md
CHANGED
|
@@ -3,25 +3,25 @@ type: JS Module
|
|
|
3
3
|
title: main.mjs
|
|
4
4
|
resource: npm/rules/rust/main.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 93dfaee0
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 100
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
Модуль надає
|
|
13
|
+
Модуль надає функції `run` та `lint` для аналізу коду на Rust. Функція `lint` виконує стандартну перевірку коду. Функція `run` запускає повну оркестрацію, яка включає форматування за допомогою `rustfmt` та статичний аналіз за допомогою `clippy` через `cargo` (rust.mdc).
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
17
|
run виконує стандартну перевірку для Rust-коду.
|
|
18
18
|
|
|
19
|
-
lint запускає оркестрацію перевірки Rust-коду,
|
|
19
|
+
lint запускає оркестрацію перевірки Rust-коду, виконуючи `rustfmt` та `clippy` через `cargo`.
|
|
20
20
|
|
|
21
21
|
## Публічний API
|
|
22
22
|
|
|
23
|
-
run — виконує основну
|
|
24
|
-
lint — забезпечує
|
|
23
|
+
run — виконує основну логіку: перевіряє відповідність вимогам (JS-занепокложення $\rightarrow$ політика $\rightarrow$ mdc-посилання) (rust.mdc).
|
|
24
|
+
lint — забезпечує оркестрацію для статичного аналізу коду Rust.
|
|
25
25
|
|
|
26
26
|
## Гарантії поведінки
|
|
27
27
|
|
|
@@ -20,7 +20,7 @@ import { existsSync, readFileSync, writeFileSync } from 'node:fs'
|
|
|
20
20
|
import { join } from 'node:path'
|
|
21
21
|
|
|
22
22
|
import { resolveCmd } from '../../../scripts/utils/resolve-cmd.mjs'
|
|
23
|
-
import {
|
|
23
|
+
import { runOneShot } from '../../../lib/pi-one-shot.mjs'
|
|
24
24
|
|
|
25
25
|
/** Слово у рядку cspell: `<file>:<line>:<col> - Unknown word (xxx)`. */
|
|
26
26
|
const UNKNOWN_WORD_RE = /Unknown word \(([^)]+)\)/u
|
|
@@ -114,10 +114,10 @@ export function appendWordsToDict(cwd, words) {
|
|
|
114
114
|
* cspell-крок lint-text: класифікація → словник (нова схема).
|
|
115
115
|
* @param {string} [cwd] корінь
|
|
116
116
|
* @param {boolean} [readOnly] true → лише детект (нуль мутацій)
|
|
117
|
-
* @param {boolean} [llmFix] opt-in
|
|
118
|
-
* @returns {number} 0 — чисто; 1 — лишились знахідки / помилка середовища
|
|
117
|
+
* @param {boolean} [llmFix] opt-in LLM-класифікація (з `meta.json: llmFix:true`); без нього — лише детект
|
|
118
|
+
* @returns {Promise<number>} 0 — чисто; 1 — лишились знахідки / помилка середовища
|
|
119
119
|
*/
|
|
120
|
-
export function runCspellText(cwd = process.cwd(), readOnly = false, llmFix = false) {
|
|
120
|
+
export async function runCspellText(cwd = process.cwd(), readOnly = false, llmFix = false) {
|
|
121
121
|
const bin = resolveCmd('npx')
|
|
122
122
|
if (!bin) {
|
|
123
123
|
process.stderr.write('❌ npx не знайдено в PATH (cspell).\n')
|
|
@@ -133,9 +133,8 @@ export function runCspellText(cwd = process.cwd(), readOnly = false, llmFix = fa
|
|
|
133
133
|
|
|
134
134
|
// Fix-режим: класифікація знахідок (bounded JSON-вихід), валідні → у словник.
|
|
135
135
|
const model = fixModel()
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
process.stdout.write(`⚠️ cspell: класифікацію пропущено (${problem})\n`)
|
|
136
|
+
if (!model) {
|
|
137
|
+
process.stdout.write('⚠️ cspell: класифікацію пропущено (локальну модель не задано)\n')
|
|
139
138
|
process.stdout.write(first.out)
|
|
140
139
|
return first.code
|
|
141
140
|
}
|
|
@@ -148,19 +147,19 @@ export function runCspellText(cwd = process.cwd(), readOnly = false, llmFix = fa
|
|
|
148
147
|
)
|
|
149
148
|
}
|
|
150
149
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
process.stdout.write(`⚠️ cspell:
|
|
150
|
+
const res = await runOneShot({
|
|
151
|
+
messages: [{ role: 'user', content: classifyPrompt(batch) }],
|
|
152
|
+
modelSpec: model,
|
|
153
|
+
caller: 'cspell-classify',
|
|
154
|
+
cwd
|
|
155
|
+
})
|
|
156
|
+
if (res.error) {
|
|
157
|
+
process.stdout.write(`⚠️ cspell: LLM-класифікація впала (${res.error}) — без авто-словника\n`)
|
|
159
158
|
process.stdout.write(first.out)
|
|
160
159
|
return first.code
|
|
161
160
|
}
|
|
162
161
|
|
|
163
|
-
const parsed = parseClassify(
|
|
162
|
+
const parsed = parseClassify(res.content)
|
|
164
163
|
if (!parsed) {
|
|
165
164
|
process.stdout.write('⚠️ cspell: не вдалося розпарсити класифікацію — без авто-словника\n')
|
|
166
165
|
process.stdout.write(first.out)
|
|
@@ -3,24 +3,31 @@ type: JS Module
|
|
|
3
3
|
title: cspell-fix.mjs
|
|
4
4
|
resource: npm/rules/text/js/cspell-fix.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 3469ac34
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
-
score:
|
|
8
|
+
score: 95
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## Огляд
|
|
12
|
+
|
|
13
|
+
Огляд: Цей модуль інтегрує `cspell` у ланцюжок `lint-text` для забезпечення термінологічної коректності у тексті, використовуючи схему `omlx-класифікації`. Він ідентифікує неозначені слова, класифікує їх за допомогою LLM та автоматично доповнює словник `.cspell.json` валідними термінами, залишаючи потенційні помилки для ручного рев'ю.
|
|
14
|
+
|
|
15
|
+
Поведінка:
|
|
16
|
+
unknownWords витягує унікальні неозначені слова з виводу інструмента `cspell`.
|
|
17
|
+
appendWordsToDict додає визначені як валідні слова до конфігураційного файлу `.cspell.json`, оновлюючи його в алфавітному порядку.
|
|
18
|
+
runCspellText запускає процес класифікації неозначених слів, спочатку визначаючи їх, а потім, за умови увімкненого LLM-класифікатора, відправляючи їх на перевірку та додаючи валідні слова до словника, після чого повторно перевіряє код.
|
|
12
19
|
|
|
13
20
|
## Поведінка
|
|
14
21
|
|
|
15
|
-
unknownWords витягує унікальні
|
|
16
|
-
appendWordsToDict
|
|
17
|
-
runCspellText запускає
|
|
22
|
+
unknownWords витягує унікальні неозначені слова з виводу інструмента `cspell`.
|
|
23
|
+
appendWordsToDict додає визначені як валідні слова до конфігураційного файлу `.cspell.json`, оновлюючи його в алфавітному порядку.
|
|
24
|
+
runCspellText запускає процес класифікації неозначених слів, спочатку визначаючи їх, а потім, за умови увімкненого LLM-класифікатора, відправляючи їх на перевірку та додаючи валідні слова до словника, після чого повторно перевіряє код.
|
|
18
25
|
|
|
19
26
|
## Публічний API
|
|
20
27
|
|
|
21
|
-
unknownWords — Збирає унікальні слова, які
|
|
22
|
-
appendWordsToDict — Додає зібрані слова до словника `.cspell.json
|
|
23
|
-
runCspellText — Виконує
|
|
28
|
+
unknownWords — Збирає унікальні слова, які `cspell` виявив як незнайомі у виводі.
|
|
29
|
+
appendWordsToDict — Додає зібрані слова до словника `.cspell.json#words`, забезпечуючи унікальність та сортування.
|
|
30
|
+
runCspellText — Виконує лінтування тексту з `cspell`: класифікує слова та оновлює словник з новою схемою.
|
|
24
31
|
|
|
25
32
|
## Гарантії поведінки
|
|
26
33
|
|
package/rules/text/main.mjs
CHANGED
|
@@ -110,9 +110,9 @@ function preflight(dep) {
|
|
|
110
110
|
* Внутрішні кроки `lint-text` без локу.
|
|
111
111
|
* @param {boolean} [readOnly] true → лише детект без авто-фіксу (нуль мутацій — CI/pre-commit)
|
|
112
112
|
* @param {boolean} [llmFix] opt-in omlx-класифікація cspell (інші кроки фіксяться детерміновано за readOnly)
|
|
113
|
-
* @returns {number} 0 — все OK, інакше — код першого кроку, що впав
|
|
113
|
+
* @returns {Promise<number>} 0 — все OK, інакше — код першого кроку, що впав
|
|
114
114
|
*/
|
|
115
|
-
function runLintTextSteps(readOnly = false, llmFix = false) {
|
|
115
|
+
async function runLintTextSteps(readOnly = false, llmFix = false) {
|
|
116
116
|
// Auto-install: throws on failure → propagates as exit 1 from runStandardLint
|
|
117
117
|
ensureTool('shellcheck')
|
|
118
118
|
ensureTool('dotenv-linter')
|
|
@@ -120,8 +120,8 @@ function runLintTextSteps(readOnly = false, llmFix = false) {
|
|
|
120
120
|
// patch потрібен лише для авто-фіксу shellcheck; у read-only пропускаємо preflight.
|
|
121
121
|
if (!readOnly && !preflight(PATCH_PREFLIGHT)) return 1
|
|
122
122
|
|
|
123
|
-
console.log(`\n▶ cspell (${!readOnly && llmFix ? '
|
|
124
|
-
const cspellCode = runCspellText(process.cwd(), readOnly, llmFix)
|
|
123
|
+
console.log(`\n▶ cspell (${!readOnly && llmFix ? 'LLM-класифікація + словник + перевірка' : 'перевірка'})`)
|
|
124
|
+
const cspellCode = await runCspellText(process.cwd(), readOnly, llmFix)
|
|
125
125
|
if (cspellCode !== 0) return cspellCode
|
|
126
126
|
|
|
127
127
|
console.log(`\n▶ shellcheck (${readOnly ? 'перевірка' : 'авто-фікс + фінальна перевірка'} *.sh)`)
|
package/schemas/skill-meta.json
CHANGED
|
@@ -17,6 +17,14 @@
|
|
|
17
17
|
"worktree": {
|
|
18
18
|
"type": "boolean",
|
|
19
19
|
"description": "true — виконувати скіл в окремому git-worktree, один інстанс за раз (без паралельного запуску); false — у worktree не виконується."
|
|
20
|
+
},
|
|
21
|
+
"requireRoot": {
|
|
22
|
+
"type": "boolean",
|
|
23
|
+
"description": "true — скіл мутує CWD без worktree-ізоляції і має стартувати з кореня репо. Для worktree:true поле зайве (корінь гарантує worktree)."
|
|
24
|
+
},
|
|
25
|
+
"tier": {
|
|
26
|
+
"description": "Тира моделі для агентного виконання скіла через pi-runner. За відсутності — \"max\" (відкриті скіли потребують сильної моделі).",
|
|
27
|
+
"enum": ["min", "avg", "max"]
|
|
20
28
|
}
|
|
21
29
|
}
|
|
22
30
|
}
|
|
@@ -3,40 +3,36 @@ type: JS Module
|
|
|
3
3
|
title: skills-cli.mjs
|
|
4
4
|
resource: npm/scripts/skills-cli.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: e2d5fac6
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
7
8
|
score: 100
|
|
9
|
+
issues: judge:inaccurate:0.99
|
|
10
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
8
11
|
---
|
|
9
12
|
|
|
10
|
-
|
|
13
|
+
## Огляд
|
|
11
14
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
normalizeSkillId
|
|
15
|
-
Перетворює ім'я скілу на ідентифікатор, видаляючи префікс n-
|
|
16
|
-
|
|
17
|
-
listSkillIds
|
|
18
|
-
Отримує відсортований список ідентифікаторів скілів, що мають файл SKILL.md
|
|
15
|
+
Цей модуль забезпечує керування функціоналом скілів пакета `@nitra/cursor`. Він каталогізує доступні скіли на основі наявності файлу `SKILL.md` у відповідному пакеті. Для виконання скілу збирається контекст, що включає інструкції скілу та інформацію з конфігураційних файлів проєкту: `package.json`, `tsconfig.json`, `.n-cursor.json` та `main.json`. Система дозволяє або вивести список доступних скілів (`npx @nitra/cursor skill list`), або ініціювати виконання обраного скілу (наприклад, `npx @nitra/cursor skill pi taze`), з можливістю передачі додаткових аргументів. Пріоритетним механізмом виконання є інтеграція з вбудованим pi-агентом, тоді як для забезпечення сумісності підтримуються застарілі виклики через зовнішні CLI (`cursor`, `claude`).
|
|
19
16
|
|
|
20
|
-
|
|
21
|
-
Створює промпт, збираючи інструкцію скілу та контекст поточного проєкту з файлів package.json, tsconfig.json та .n-cursor.json
|
|
22
|
-
|
|
23
|
-
resolveBundledPackageRoot
|
|
24
|
-
Визначає абсолютний шлях до кореня пакета з урахуванням модуля
|
|
17
|
+
## Поведінка
|
|
25
18
|
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
Поведінка
|
|
20
|
+
normalizeSkillId знімає префікс `n-` з імені скілу для приведення його до стандартного ID.
|
|
21
|
+
listSkillIds отримує відсортований список ID скілів, які мають файл `SKILL.md` у вказаній директорії скілів.
|
|
22
|
+
buildSkillPrompt збирає комплексний промпт для виконання скілу, об'єднуючи інструкцію скілу з конфігураційними файлами проєкту, такими як `package.json`, `tsconfig.json` та `.n-cursor.json`.
|
|
23
|
+
resolveBundledPackageRoot визначає абсолютний шлях до кореня пакету `@nitra/cursor`, використовуючи інформацію про поточний модуль.
|
|
24
|
+
runSkillsCli виконує логіку командного інтерфейсу для керування скілами: може вивести список доступних скілів, зібрати промпт для скілу або ініціювати його виконання через вбудований pi-агент, використовуючи зовнішні CLI як резервний варіант.
|
|
28
25
|
|
|
29
26
|
## Публічний API
|
|
30
27
|
|
|
31
|
-
normalizeSkillId —
|
|
32
|
-
listSkillIds —
|
|
33
|
-
buildSkillPrompt —
|
|
34
|
-
resolveBundledPackageRoot —
|
|
35
|
-
runSkillsCli —
|
|
28
|
+
- normalizeSkillId — знімає префікс `n-` з імені скілу, приводячи його до id каталогу в пакеті.
|
|
29
|
+
- listSkillIds — повертає відсортований список id скілів, що мають `SKILL.md`.
|
|
30
|
+
- buildSkillPrompt — збирає промпт виконання: інструкція скілу + контекст проєкту (`package.json`, `tsconfig.json`, `.n-cursor.json`); кидає, якщо скіл невідомий.
|
|
31
|
+
- resolveBundledPackageRoot — абсолютний шлях до кореня встановленого пакета `@nitra/cursor`.
|
|
32
|
+
- runSkillsCli — асинхронний entrypoint підкоманди `skill`: `list`, друк промпта на stdout, або виконання через `pi` (рекомендовано), `cursor`/`claude` (deprecated). Повертає exit-код.
|
|
36
33
|
|
|
37
34
|
## Гарантії поведінки
|
|
38
35
|
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
- Не звертається до мережі.
|
|
36
|
+
- Сам модуль лише читає файли й збирає промпт; **виконання** делегується агенту: `pi` (вбудований, мутує дерево, запускає bash) або зовнішнім `cursor`/`claude` CLI.
|
|
37
|
+
- Тира моделі для `pi`-runner береться з `main.json.tier` скіла (дефолт `max`).
|
|
38
|
+
- `cursor`/`claude` — deprecated: друкують попередження й лишаються як fallback, доки не налаштовано pi-модель.
|
|
@@ -3,25 +3,25 @@ type: JS Module
|
|
|
3
3
|
title: update-blue-oak.mjs
|
|
4
4
|
resource: npm/scripts/update-blue-oak.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: dac30fed
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
8
|
score: 95
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## Огляд
|
|
12
12
|
|
|
13
|
-
Оновлює вбудований список ліцензій Blue Oak Council,
|
|
13
|
+
Оновлює вбудований список ліцензій Blue Oak Council, звертаючись до мережі за даними з https://blueoakcouncil.org/list.json. Цей процес створює або оновлює файл npm/data/blue-oak.json, який містить SPDX-ідентифікатори ліцензій рівнів Model, Gold, Silver та Bronze. Запуск здійснюється вручну у `@nitra/cursor` за допомогою команди `bun npm/scripts/update-blue-oak.mjs`. Оновлення необхідне при апгрейді @nitra/cursor, оскільки нові permissive ліцензії з'являються рідко. Lead-рівень (найгірший, GPL-compatible) навмисно виключений.
|
|
14
14
|
|
|
15
15
|
## Поведінка
|
|
16
16
|
|
|
17
17
|
1. Завантажує дані з https://blueoakcouncil.org/list.json.
|
|
18
|
-
2. Перевіряє успішність отримання даних. У разі невдачі
|
|
19
|
-
3. Парсить
|
|
18
|
+
2. Перевіряє успішність отримання даних. У разі невдачі припиняє виконання.
|
|
19
|
+
3. Парсить отримані дані.
|
|
20
20
|
4. Ітерує по рейтингах у даних.
|
|
21
|
-
5.
|
|
22
|
-
6.
|
|
23
|
-
7. Формує об'єкт, що містить версію
|
|
24
|
-
8. Зберігає цей об'єкт у файл blue-oak.json
|
|
21
|
+
5. Вибирає лише рейтинги Model, Gold, Silver та Bronze.
|
|
22
|
+
6. Збирає всі SPDX-ідентифікатори ліцензій, що належать до обраних рейтингів.
|
|
23
|
+
7. Формує об'єкт, що містить версію та список зібраних SPDX-ідентифікаторів.
|
|
24
|
+
8. Зберігає цей об'єкт у файл npm/data/blue-oak.json.
|
|
25
25
|
|
|
26
26
|
## Гарантії поведінки
|
|
27
27
|
|
|
@@ -3,29 +3,12 @@ type: JS Module
|
|
|
3
3
|
title: normalize-cli.mjs
|
|
4
4
|
resource: npm/scripts/lib/adr/normalize-cli.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 222bfca4
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
-
score:
|
|
8
|
+
score: 55
|
|
9
|
+
issues: no-overview,short-behavior,best-of-2:retry-lost
|
|
9
10
|
---
|
|
10
11
|
|
|
11
|
-
Цей файл є CLI-обгорткою для локального нормалізатора ADR. Він зчитує шляхи до чернеток (`--batch <file>`) та список чистих ADR (`--clean <file>`), використовуючи директорію ADR (`--adr-dir <dir>`) для резолву шляхів. Обгортка запускає `normalizePipeline`, яка генерує JSON-контракт у форматі `{ "operations": [...] }` та виводить його у stdout для подальшого парсингу bash-скриптом. Прогрес та помилки записуються у stderr. Поведінка нормалізатора може бути змінена через змінні середовища: `ADR_NORMALIZE_ALLOW_CLOUD` контролює можливість хмарної ескалації, а `ADR_NORMALIZE_VOTES` визначає кількість голосів self-consistency для чистих ADR.
|
|
12
|
-
|
|
13
|
-
## Поведінка
|
|
14
|
-
|
|
15
|
-
1. Викликати runAdrNormalizeLocalCli.
|
|
16
|
-
2. Зчитувати список шляхів до чернеток батчу з файлу, вказаного через аргумент `--batch`.
|
|
17
|
-
3. Зчитувати список імен чистих ADR (кандидатів до злиття) з файлу, вказаного через аргумент `--clean`, якщо він наданий.
|
|
18
|
-
4. Визначати директорію ADR, використовуючи аргумент `--adr-dir` або за замовчуванням `cwd/docs/adr`.
|
|
19
|
-
5. Зчитувати вміст кожної чернетки батчу, резолвя шляхи відносно `--adr-dir`.
|
|
20
|
-
6. Зчитувати значення змінних середовища `ADR_NORMALIZE_ALLOW_CLOUD` та `ADR_NORMALIZE_VOTES`.
|
|
21
|
-
7. Викликати внутрішній механізм нормалізації, передаючи зібрані чернетки, список чистих ADR, та конфігурацію, отриману з змінних середовища.
|
|
22
|
-
8. Виводити інформацію про прогрес та статистику в stderr.
|
|
23
|
-
9. Виводити JSON-об'єкт, що містить операції, у stdout.
|
|
24
|
-
|
|
25
|
-
## Публічний API
|
|
26
|
-
|
|
27
|
-
runAdrNormalizeLocalCli — запускає субкоманду, виводячи JSON операцій у стандартний вивід та прогрес у стандартний помилковий вивід.
|
|
28
|
-
|
|
29
12
|
## Гарантії поведінки
|
|
30
13
|
|
|
31
14
|
- Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -3,42 +3,12 @@ type: JS Module
|
|
|
3
3
|
title: normalize-pipeline.mjs
|
|
4
4
|
resource: npm/scripts/lib/adr/normalize-pipeline.mjs
|
|
5
5
|
docgen:
|
|
6
|
-
crc:
|
|
6
|
+
crc: 8e9ca76f
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
-
score:
|
|
9
|
-
issues:
|
|
8
|
+
score: 55
|
|
9
|
+
issues: no-overview,short-behavior,best-of-2:retry-lost
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
-
Файл реалізує локально-орієнтований конвеєр для нормалізації чернеток архітектурних рішень (ADR). Він працює за принципом інверсії керування: JavaScript оркеструє процес, а LLM відповідає лише на вузькі, верифіковані запитання, будучи заточеним під малу локальну модель (omlx/gemma-4b). LLM використовується лише для бінарного судження схожості між записами (наприклад, через `edge-judge`) та витягування змісту секцій у JSON (через `gen-MADR`). Конвеєр збирає, валідує та складає повний MADR-каркас, використовуючи кластеризацію (`cluster` та `union-find`) та проходить через `validation gate`, повертаючи результат у вигляді операцій для застосування.
|
|
13
|
-
|
|
14
|
-
## Поведінка
|
|
15
|
-
|
|
16
|
-
tokenize: Токенізує назву або слаг, видаляючи стоп-слова та розширюючи його на значущі токени.
|
|
17
|
-
jaccard: Обчислює коефіцієнт Jaccard між двома множинами токенів.
|
|
18
|
-
draftTitle: Витягує заголовок з тіла чернетки, використовуючи ADR-шаблон або перший не-MADR заголовок.
|
|
19
|
-
isNoDecision: Детерміновано визначає, чи рішення в чернетці явно не прийняте.
|
|
20
|
-
buildEdges: Будує кандидати-ребра між чернетками та між чернетками і чистими ADR-файлами на основі лексичної схожості.
|
|
21
|
-
validateMadr: Перевіряє згенерований MADR-текст на відповідність вимогам OKF та структурним елементам.
|
|
22
|
-
madrDate: Детерміновано визначає ISO-дату для поля **Date:**, використовуючи дані з чернетки або імені файлу.
|
|
23
|
-
normalizeSections: Нормалізує сирий JSON-вивід LLM у строгу структуру секцій MADR, толерантно до дрібних відхилень моделі.
|
|
24
|
-
assembleMadr: Збирає канонічний MADR-markdown, використовуючи заголовок, дату та нормалізований контент секцій.
|
|
25
|
-
genMadr: Витягує зміст архітектурного рішення з чернетки у JSON, а потім збирає його у валідний MADR-текст.
|
|
26
|
-
normalizePipeline: Виконує повний конвеєр нормалізації, кластеризуючи чернетки та генеруючи операції для застосування.
|
|
27
|
-
|
|
28
|
-
## Публічний API
|
|
29
|
-
|
|
30
|
-
tokenize — Розбиває назву чи слаг на значущі слова, ігноруючи стоп-слова.
|
|
31
|
-
jaccard — Вимірює схожість двох наборів слів.
|
|
32
|
-
draftTitle — Витягує заголовок з чернетки, надаючи пріоритет заголовку ADR.
|
|
33
|
-
isNoDecision — Визначає, чи не було прийнято рішення у чернетці, щоб уникнути створення зайвих ADR.
|
|
34
|
-
buildEdges — Створює потенційні зв'язки між елементами на основі схожості слів.
|
|
35
|
-
validateMadr — Перевіряє якість згенерованого документа ADR.
|
|
36
|
-
madrDate — Формує стандартизовану дату для документа, використовуючи метадані або ім'я файлу.
|
|
37
|
-
normalizeSections — Приводить неструктурований вивід генеративної моделі до чіткого формату секцій.
|
|
38
|
-
assembleMadr — Збирає повний, стандартизований документ ADR, використовуючи фіксовані шаблони.
|
|
39
|
-
genMadr — Створює чернетку документа ADR на основі вхідних даних.
|
|
40
|
-
normalizePipeline — Виконує повний потік обробки даних, повертаючи результати та статистику.
|
|
41
|
-
|
|
42
12
|
## Гарантії поведінки
|
|
43
13
|
|
|
44
14
|
- (специфічних машинно-виведених гарантій немає)
|
|
@@ -43,7 +43,7 @@ const readLines = (file) =>
|
|
|
43
43
|
* @param {string[]} argv аргументи після назви команди
|
|
44
44
|
* @returns {number} exit-code (0 — успіх, 1 — помилка вводу)
|
|
45
45
|
*/
|
|
46
|
-
export function runAdrNormalizeLocalCli(argv) {
|
|
46
|
+
export async function runAdrNormalizeLocalCli(argv) {
|
|
47
47
|
const args = parseArgs(argv)
|
|
48
48
|
const adrDir = args['adr-dir'] ?? join(process.cwd(), 'docs/adr')
|
|
49
49
|
if (!args.batch) {
|
|
@@ -61,7 +61,7 @@ export function runAdrNormalizeLocalCli(argv) {
|
|
|
61
61
|
const allowCloud = env.ADR_NORMALIZE_ALLOW_CLOUD === '1'
|
|
62
62
|
const votes = Number(env.ADR_NORMALIZE_VOTES) || 2
|
|
63
63
|
|
|
64
|
-
const { operations, stats, trace } = normalizePipeline(drafts, cleanList, {
|
|
64
|
+
const { operations, stats, trace } = await normalizePipeline(drafts, cleanList, {
|
|
65
65
|
allowCloud,
|
|
66
66
|
votes,
|
|
67
67
|
onProgress: (m) => console.error(`adr-normalize-local: ${m}`)
|