@nitra/cursor 5.3.4 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-template/settings.template.json +2 -2
- package/.pi-template/extensions/n-cursor-adr/docs/index.md +13 -24
- package/CHANGELOG.md +21 -0
- package/bin/n-cursor.js +47 -24
- package/lib/docs/models.md +29 -18
- package/lib/docs/omlx-trace.md +51 -0
- package/lib/docs/omlx.md +31 -15
- package/lib/omlx.mjs +2 -5
- package/package.json +1 -1
- package/rules/abie/docs/fix.md +17 -11
- package/rules/adr/docs/fix.md +25 -140
- package/rules/bun/docs/fix.md +18 -151
- package/rules/capacitor/docs/fix.md +16 -13
- package/rules/capacitor/js/docs/platforms.md +31 -43
- package/rules/changelog/docs/fix.md +25 -169
- package/rules/ci4/docs/fix.md +11 -14
- package/rules/doc-files/doc-files.mdc +60 -0
- package/rules/doc-files/docs/fix.md +31 -0
- package/rules/doc-files/fix.mjs +19 -0
- package/{skills → rules}/doc-files/js/docgen-extract.mjs +42 -19
- package/{skills → rules}/doc-files/js/docgen-files-batch.mjs +18 -5
- package/{skills → rules}/doc-files/js/docgen-gen.mjs +46 -5
- package/{skills → rules}/doc-files/js/docgen-ignore.mjs +2 -1
- package/{skills → rules}/doc-files/js/docgen-scan.mjs +11 -3
- package/{skills → rules}/doc-files/js/docs/docgen-crc.md +1 -1
- package/{skills → rules}/doc-files/js/docs/docgen-extract-anchors.md +1 -1
- package/{skills → rules}/doc-files/js/docs/docgen-extract.md +2 -2
- package/{skills → rules}/doc-files/js/docs/docgen-files-batch.md +2 -2
- package/{skills → rules}/doc-files/js/docs/docgen-gen.md +2 -2
- package/{skills → rules}/doc-files/js/docs/docgen-ignore.md +4 -4
- package/rules/doc-files/js/docs/docgen-prompts.md +39 -0
- package/rules/doc-files/js/docs/docgen-scan.md +54 -0
- package/rules/doc-files/js/docs/lint.md +36 -0
- package/rules/doc-files/js/docs/units-js.md +31 -0
- package/rules/doc-files/js/docs/units-rs.md +35 -0
- package/rules/doc-files/js/docs/units.md +30 -0
- package/rules/doc-files/js/lint.mjs +96 -0
- package/{skills → rules}/doc-files/js/units-rs.mjs +37 -17
- package/rules/doc-files/lint/docs/lint.md +37 -0
- package/rules/doc-files/lint/lint.mjs +105 -0
- package/rules/doc-files/meta.json +1 -0
- package/rules/docker/docs/fix.md +21 -161
- package/rules/efes/docs/fix.md +23 -194
- package/rules/feedback/docs/fix.md +10 -8
- package/rules/ga/docs/fix.md +10 -5
- package/rules/ga/meta.json +1 -1
- package/rules/graphql/docs/fix.md +23 -119
- package/rules/hasura/docs/fix.md +19 -5
- package/rules/hasura/js/docs/internal_urls.md +34 -307
- package/rules/image-avif/docs/fix.md +16 -127
- package/rules/image-compress/docs/fix.md +20 -141
- package/rules/image-compress/js/docs/package_setup.md +22 -182
- package/rules/js-bun-db/docs/fix.md +23 -139
- package/rules/js-bun-db/js/docs/safety.md +33 -221
- package/rules/js-bun-redis/docs/fix.md +25 -114
- package/rules/js-bun-redis/js/docs/imports.md +18 -166
- package/rules/js-lint/docs/fix.md +30 -108
- package/rules/js-lint/js/docs/lint-findings.md +37 -17
- package/rules/js-lint/js/docs/lint.md +22 -238
- package/rules/js-lint/js/docs/tooling.md +34 -331
- package/rules/js-lint/js/lint.mjs +19 -12
- package/rules/js-lint/js-lint.mdc +1 -1
- package/rules/js-lint/meta.json +1 -1
- package/rules/js-lint-ci/docs/fix.md +16 -149
- package/rules/js-lint-ci/js/docs/lint.md +16 -136
- package/rules/js-lint-ci/js-lint-ci.mdc +1 -1
- package/rules/js-lint-ci/meta.json +1 -1
- package/rules/js-mssql/docs/fix.md +18 -123
- package/rules/js-mssql/js/docs/deps.md +28 -251
- package/rules/js-run/docs/fix.md +23 -138
- package/rules/js-run/js/docs/runtime.md +24 -378
- package/rules/k8s/docs/fix.md +18 -123
- package/rules/nginx-default-tpl/docs/fix.md +22 -118
- package/rules/nginx-default-tpl/js/docs/template.md +38 -360
- package/rules/npm-module/docs/fix.md +27 -89
- package/rules/npm-module/js/docs/header_doc_pointer.md +15 -15
- package/rules/npm-module/js/docs/package_structure.md +36 -258
- package/rules/npm-module/js/docs/rule_meta.md +25 -127
- package/rules/npm-module/js/docs/skill_meta.md +18 -180
- package/rules/npm-module/js/rule_meta.mjs +3 -3
- package/rules/php/docs/fix.md +21 -98
- package/rules/php/js/docs/tooling.md +20 -143
- package/rules/python/docs/fix.md +25 -157
- package/rules/python/js/docs/applies.md +20 -98
- package/rules/python/js/docs/tooling.md +27 -144
- package/rules/rego/docs/fix.md +24 -112
- package/rules/rego/js/docs/applies.md +20 -164
- package/rules/rego/js/docs/lint.md +15 -110
- package/rules/rego/meta.json +1 -1
- package/rules/release/docs/fix.md +16 -114
- package/rules/rust/docs/fix.md +24 -119
- package/rules/rust/js/docs/applies.md +20 -129
- package/rules/security/docs/fix.md +21 -78
- package/rules/security/js/docs/sample_secret.md +23 -182
- package/rules/security/js/docs/trufflehog.md +19 -128
- package/rules/security/meta.json +1 -1
- package/rules/style-lint/docs/fix.md +16 -150
- package/rules/style-lint/js/docs/lint.md +21 -172
- package/rules/style-lint/js/docs/tooling.md +19 -184
- package/rules/style-lint/js/lint.mjs +4 -3
- package/rules/style-lint/meta.json +1 -1
- package/rules/tauri/docs/fix.md +26 -152
- package/rules/tauri/js/docs/cargo_mutants_config.md +21 -159
- package/rules/tauri/js/docs/tooling.md +20 -217
- package/rules/test/docs/fix.md +19 -127
- package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +15 -127
- package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +17 -153
- package/rules/test/js/docs/cargo_mutants_config.md +24 -164
- package/rules/test/js/docs/location.md +24 -126
- package/rules/test/js/docs/no-process-chdir.md +20 -151
- package/rules/test/js/docs/no-relative-fs-path.md +24 -261
- package/rules/test/js/docs/stryker_config.md +48 -148
- package/rules/test/js/docs/vitest-config-pool-forks.md +21 -164
- package/rules/text/docs/fix.md +25 -113
- package/rules/text/js/docs/forbidden-prettier.md +21 -132
- package/rules/text/js/docs/formatting.md +60 -251
- package/rules/text/js/docs/lint.md +17 -114
- package/rules/text/js/lint.mjs +5 -3
- package/rules/text/lint/docs/lint.md +1 -1
- package/rules/text/lint/docs/run-dotenv-linter.md +1 -1
- package/rules/text/lint/docs/run-shellcheck.md +1 -1
- package/rules/text/lint/lint.mjs +13 -9
- package/rules/text/lint/run-dotenv-linter.mjs +13 -10
- package/rules/text/lint/run-shellcheck.mjs +10 -6
- package/rules/text/meta.json +1 -1
- package/rules/vue/docs/fix.md +25 -118
- package/rules/vue/js/docs/packages.md +25 -323
- package/rules/worktree/docs/fix.md +31 -150
- package/scripts/coverage-classify/docs/index.md +23 -209
- package/scripts/coverage-classify/docs/verdict-schema.md +14 -159
- package/scripts/dispatcher/docs/trace.md +35 -0
- package/scripts/docs/auto-rules.md +37 -361
- package/scripts/docs/lint-cli.md +12 -13
- package/scripts/docs/post-tool-use-fix.md +16 -15
- package/scripts/docs/skills-cli.md +26 -23
- package/scripts/docs/sync-claude-config.md +94 -34
- package/scripts/docs/worktree-cli.md +11 -34
- package/scripts/lib/docs/assert-project-root.md +14 -16
- package/scripts/lib/docs/changed-files.md +24 -139
- package/scripts/lib/docs/discover-check-rules-from-cursor.md +14 -146
- package/scripts/lib/docs/rule-meta.md +1 -1
- package/scripts/lib/docs/rule-predicates.md +20 -17
- package/scripts/lib/docs/run-rule-cli.md +14 -18
- package/scripts/lib/docs/run-rule.md +13 -20
- package/scripts/lib/docs/run-standard-rule.md +12 -15
- package/scripts/lib/docs/sync-gitignore-worktree.md +15 -18
- package/scripts/lib/rule-meta.mjs +10 -6
- package/scripts/lib/rule-predicates.mjs +1 -1
- package/scripts/lint-cli.mjs +28 -20
- package/scripts/sync-claude-config.mjs +4 -1
- package/scripts/utils/docs/with-lock.md +19 -12
- package/scripts/utils/with-lock.mjs +4 -2
- package/skills/doc-aggregate/SKILL.md +2 -2
- package/skills/doc-aggregate/js/docgen-ignore.mjs +6 -6
- package/skills/doc-aggregate/js/docs/docgen-ignore.md +1 -1
- package/skills/doc-aggregate/js/docs/docgen-scan.md +78 -0
- package/skills/doc-files/.changes/260612-0031.md +5 -0
- package/skills/doc-files/.changes/260612-0036.md +5 -0
- package/skills/doc-files/.changes/260612-0114.md +5 -0
- package/skills/doc-files/SKILL.md +6 -6
- package/skills/fix/js/docs/llm-worker.md +17 -15
- package/skills/fix/js/docs/orchestrator.md +30 -23
- package/skills/fix/js/docs/t0.md +26 -16
- package/skills/start-check/js/docs/check.md +26 -22
- package/skills/taze/js/docs/diff.md +44 -20
- package/skills/doc-files/js/docs/docgen-prompts.md +0 -32
- package/skills/doc-files/js/docs/docgen-scan.md +0 -25
- package/skills/doc-files/js/docs/units-rs.md +0 -35
- /package/{skills → rules}/doc-files/js/docgen-crc.mjs +0 -0
- /package/{skills → rules}/doc-files/js/docgen-extract-anchors.mjs +0 -0
- /package/{skills → rules}/doc-files/js/docgen-prompts.mjs +0 -0
- /package/{skills → rules}/doc-files/js/units-js.mjs +0 -0
- /package/{skills → rules}/doc-files/js/units.mjs +0 -0
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"hooks": [
|
|
27
27
|
{
|
|
28
28
|
"type": "command",
|
|
29
|
-
"command": "npx --no @nitra/cursor doc-files
|
|
29
|
+
"command": "npx --no @nitra/cursor lint-doc-files --hook",
|
|
30
30
|
"timeout": 120
|
|
31
31
|
}
|
|
32
32
|
]
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"hooks": [
|
|
39
39
|
{
|
|
40
40
|
"type": "command",
|
|
41
|
-
"command": "npx --no @nitra/cursor doc-files
|
|
41
|
+
"command": "npx --no @nitra/cursor lint-doc-files --git",
|
|
42
42
|
"timeout": 120
|
|
43
43
|
}
|
|
44
44
|
]
|
|
@@ -2,39 +2,28 @@
|
|
|
2
2
|
docgen:
|
|
3
3
|
source: npm/.pi-template/extensions/n-cursor-adr/index.ts
|
|
4
4
|
crc: 3233716f
|
|
5
|
+
score: 100
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# index.ts
|
|
8
9
|
|
|
9
10
|
## Огляд
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Файл слугує механізмом для підготовки даних сесії та ініціації виконання зовнішніх рішень. Він серіалізує поточний стан сесії для формування вхідного JSON і запускає відповідні скрипти для прийняття рішень.
|
|
12
|
+
Файл збирає записи сесії, серіалізує їх у формат JSONL, записує у тимчасову директорію, а потім ініціює виконання скриптів хуків capture та normalize.
|
|
14
13
|
|
|
15
14
|
## Поведінка
|
|
16
15
|
|
|
17
|
-
1.
|
|
18
|
-
2.
|
|
19
|
-
3.
|
|
20
|
-
4.
|
|
21
|
-
5.
|
|
22
|
-
6.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
10. Обидва скрипти отримують вхідний JSON-пакет і виконуються через адаптер pi.exec.
|
|
27
|
-
11. Виконування здійснюється асинхронно. Якщо скрипти відсутні, це може призвести до помилки, яка буде зареєстрована у результаті виконання.
|
|
28
|
-
12. Помилки виконання ловляться, щоб забезпечити стабільність системи.
|
|
16
|
+
1. Виклик події agent_end.
|
|
17
|
+
2. Перевірка захисту від рекурсії через змінні середовища. Якщо встановлено змінні, виконання зупиняється.
|
|
18
|
+
3. Серіалізація записів сесії. Зчитування записів з sessionManager та формування рядка JSONL.
|
|
19
|
+
4. Запис JSONL файлу. Запис серіалізованого тексту у тимчасову директорію.
|
|
20
|
+
5. Формування вхідного навантаження. Створення JSON об'єкта для передачі у башку.
|
|
21
|
+
6. Передача виконання скриптів. Паралельний запуск двох окремих скриптів.
|
|
22
|
+
а. Виконання хука capture.
|
|
23
|
+
б. Виконання хука normalize.
|
|
24
|
+
7. Обробка результатів. Очікування завершення обох виконання. Помилки обробляються у загальному режимі.
|
|
29
25
|
|
|
30
26
|
## Гарантії поведінки
|
|
31
27
|
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
- При виникненні помилок система перехоплює їх
|
|
35
|
-
- Система не генерує винятків назовні
|
|
36
|
-
- Система не використовує кешування
|
|
37
|
-
- Система не виконує операцій з мережею
|
|
38
|
-
- Логіка пропуску та обмеження швидкості залишається у бах (bash)
|
|
39
|
-
- Логіка вибору LLM-CLI залишається у бах (bash)
|
|
40
|
-
- Перевірка рекурсії здійснюється через змінні середовища встановлені бах перед запуском LLM CLI
|
|
28
|
+
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
29
|
+
- Не звертається до мережі.
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [6.0.0] - 2026-06-14
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- fix-doc-files: пер-файловий таймінг у виводі — `<total>s (llm <llmS>/<N> calls, orch <orchS>)`: видно, скільки часу зайняла модель (і кількість LLM-викликів) проти JS-оркестрації. `generateDoc` повертає `llmMs`/`llmCalls`; облік через прозору обгортку `callLlm` (синхронні spawnSync-виклики, послідовна генерація — без гонок).
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- lint: вісь scope per-file|full (база-origin) + вісь behavior fix-by-default/--read-only; meta.json:lint hard-rename quick|ci→per-file|full; lint-ci=--read-only --full; контракт lint(files,cwd,{readOnly})
|
|
12
|
+
|
|
13
|
+
## [5.4.0] - 2026-06-14
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- doc-files: міграція скіл→правило `npm/rules/doc-files/` (git mv `js/`); нові команди `lint-doc-files` (детермінований детектор stale `missing`∪`crc-mismatch`, exit 1; режими `--json`/`--missing-only`/`--hook`/`--git`/`--degraded`) і `fix-doc-files` (local-only генерація + `--stamp`); `lint`-адаптер агрегатора (`lint:"quick"`); `doc-files <sub>` стає делегувальним deprecated-аліасом (plain `check` exit 2→1; `--hook`/`--git` лишають exit 2); hook-маркер `@nitra/cursor lint-doc-files` із cleanup legacy `doc-files check`; тонкий скіл doc-files.
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- lint-js: 12 oxlint-помилок — RS\_\*-регекспи догори module scope і прибрані невикористані (docgen-extract, docgen-protected.test), повернуто JSDoc extractReasoning на місце (omlx), async без await (rule-predicates), сигнальний re-raise замість process.exit у with-lock (коректні коди 130/143), опис @returns (units-rs)
|
|
22
|
+
- doc-files check <paths>: перший позиційний шлях мовчки губився без --max (порівняння зі значенням argv[maxIdx+1] при maxIdx=-1); значення прапорців тепер виключаються за індексом (--max, --root) + регресійні тести
|
|
23
|
+
|
|
3
24
|
## [5.3.4] - 2026-06-11
|
|
4
25
|
|
|
5
26
|
### Changed
|
package/bin/n-cursor.js
CHANGED
|
@@ -25,10 +25,9 @@
|
|
|
25
25
|
* `npx \@nitra/cursor lint-docker` — канонічний lint-docker (docker.mdc): `hadolint` по `Dockerfile`/`*.Dockerfile`
|
|
26
26
|
* `npx \@nitra/cursor lint-text` — канонічний lint-text (text.mdc): `cspell` → `shellcheck` (з auto-fix) →
|
|
27
27
|
* `markdownlint-cli2 --fix` → `v8r` (json/json5/yaml/yml/toml)
|
|
28
|
-
* `npx \@nitra/cursor doc-files
|
|
29
|
-
* `npx \@nitra/cursor doc-files
|
|
30
|
-
* `npx \@nitra/cursor doc-files
|
|
31
|
-
* `npx \@nitra/cursor doc-files stamp` — детерміновано (пере)штампувати CRC у наявних доках без LLM
|
|
28
|
+
* `npx \@nitra/cursor lint-doc-files` — детермінований детектор застарілості файлових док (`stale`: `missing`|`crc-mismatch`); правило doc-files (ignore-glob у `npm/rules/doc-files/js/docgen-ignore.mjs`; тека `docs/` поряд із джерелом). Режими: повний (exit 1), `--json` (exit 0), `--missing-only`, `--hook`/`--git` (hook-протокол, exit 2), `--degraded`
|
|
29
|
+
* `npx \@nitra/cursor fix-doc-files` — JS-оркестрована генерація файлових док (роутинг local/cloud) зі штампом CRC (`--limit`/`--from`/`--overwrite`/`--retry-degraded`); `--stamp` — детерміноване перештампування CRC без LLM
|
|
30
|
+
* `npx \@nitra/cursor doc-files <sub>` — DEPRECATED-аліас (scan|check|gen|stamp) → `lint-doc-files`/`fix-doc-files`
|
|
32
31
|
* `npx \@nitra/cursor doc-aggregate modules` — JSON-лістинг логічних модулів (межі за `package.json`) для Tier 2 скілу doc-aggregate
|
|
33
32
|
* `npx \@nitra/cursor skill list` — скіли пакета без синку в проєкт
|
|
34
33
|
* `npx \@nitra/cursor skill taze` — промпт на stdout
|
|
@@ -1595,7 +1594,7 @@ async function runSync() {
|
|
|
1595
1594
|
/**
|
|
1596
1595
|
* Команди, що мутують проєкт у CWD і вимагають кореня репо. `undefined`/`''` —
|
|
1597
1596
|
* дефолтний sync; `check` — deprecated-alias `fix`. Решта (read-only `trace`,
|
|
1598
|
-
* `--root`-команди `doc-files`/`doc-aggregate`/`rename-yaml-extensions`, `worktree`,
|
|
1597
|
+
* `--root`-команди `lint-doc-files`/`fix-doc-files`/`doc-files`/`doc-aggregate`/`rename-yaml-extensions`, `worktree`,
|
|
1599
1598
|
* sub-лінтери) гард не зачіпає.
|
|
1600
1599
|
*/
|
|
1601
1600
|
const ROOT_GUARDED_COMMANDS = new Set([undefined, '', 'fix', 'check', 'lint', 'coverage', 'change', 'release'])
|
|
@@ -1641,7 +1640,7 @@ try {
|
|
|
1641
1640
|
// .n-cursor.json + bun install, а fix/lint/coverage/change/release переписують файли в CWD —
|
|
1642
1641
|
// усе це ключиться на cwd(). Запуск із піддиректорії git-репо (типово прямий
|
|
1643
1642
|
// `bun npm/bin/n-cursor.js` не з кореня) зачепив би не той каталог → STOP. Read-only та
|
|
1644
|
-
// `--root`-команди (trace, graph, doc-files, doc-aggregate, rename-yaml-extensions) не зачіпаємо.
|
|
1643
|
+
// `--root`-команди (trace, graph, lint-doc-files, fix-doc-files, doc-files, doc-aggregate, rename-yaml-extensions) не зачіпаємо.
|
|
1645
1644
|
if (ROOT_GUARDED_COMMANDS.has(command)) {
|
|
1646
1645
|
assertCwdIsProjectRoot(cwd(), describeRootGuardedAction(command))
|
|
1647
1646
|
}
|
|
@@ -1687,12 +1686,14 @@ try {
|
|
|
1687
1686
|
break
|
|
1688
1687
|
}
|
|
1689
1688
|
case 'lint': {
|
|
1690
|
-
|
|
1689
|
+
// Дві ортогональні осі: --full (scope: весь репо vs дельта vs origin) × --read-only (behavior).
|
|
1690
|
+
process.exitCode = await runLint({ full: args.includes('--full'), readOnly: args.includes('--read-only') })
|
|
1691
1691
|
|
|
1692
1692
|
break
|
|
1693
1693
|
}
|
|
1694
1694
|
case 'lint-ci': {
|
|
1695
|
-
|
|
1695
|
+
// CI = весь репо в read-only (нуль мутацій, нуль LLM) — еквівалент `lint --read-only --full`.
|
|
1696
|
+
process.exitCode = await runLint({ full: true, readOnly: true })
|
|
1696
1697
|
|
|
1697
1698
|
break
|
|
1698
1699
|
}
|
|
@@ -1810,36 +1811,58 @@ try {
|
|
|
1810
1811
|
|
|
1811
1812
|
break
|
|
1812
1813
|
}
|
|
1814
|
+
case 'lint-doc-files': {
|
|
1815
|
+
// n-cursor lint-doc-files — детермінований детектор застарілості файлових док
|
|
1816
|
+
// (missing ∪ crc-mismatch). Режими: (повний) exit 1, --json exit 0, --missing-only,
|
|
1817
|
+
// --hook/--git/--degraded — hook-протокол (exit 2/0). Деталі — doc-files.mdc.
|
|
1818
|
+
const { runLintDocFilesCli } = await import('../rules/doc-files/lint/lint.mjs')
|
|
1819
|
+
process.exitCode = await runLintDocFilesCli(args)
|
|
1820
|
+
|
|
1821
|
+
break
|
|
1822
|
+
}
|
|
1823
|
+
case 'fix-doc-files': {
|
|
1824
|
+
// n-cursor fix-doc-files — local-only генерація файлових док (omlx) + CRC-штамп
|
|
1825
|
+
// (--limit/--from/--overwrite/--retry-degraded); --stamp — детерміноване
|
|
1826
|
+
// перештампування source+crc без LLM. У CI не запускається (потрібна локальна модель).
|
|
1827
|
+
if (args.includes('--stamp')) {
|
|
1828
|
+
const { runDocFilesStampCli } = await import('../rules/doc-files/js/docgen-files-batch.mjs')
|
|
1829
|
+
process.exitCode = runDocFilesStampCli(args.filter(a => a !== '--stamp'))
|
|
1830
|
+
} else {
|
|
1831
|
+
const { runDocFilesGenCli } = await import('../rules/doc-files/js/docgen-files-batch.mjs')
|
|
1832
|
+
process.exitCode = await runDocFilesGenCli(args)
|
|
1833
|
+
}
|
|
1834
|
+
|
|
1835
|
+
break
|
|
1836
|
+
}
|
|
1813
1837
|
case 'doc-files': {
|
|
1814
|
-
//
|
|
1815
|
-
//
|
|
1816
|
-
//
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
// stamp — детерміновано (пере)штампувати CRC у наявних доках без LLM.
|
|
1838
|
+
// Делегувальний аліас (deprecated): doc-files scan|check|gen|stamp →
|
|
1839
|
+
// lint-doc-files / fix-doc-files. Зняття — наступний major (спека 2026-06-12).
|
|
1840
|
+
// Зміна exit: plain `check` 2→1 (через lint-doc-files); --hook/--git зберігають 2.
|
|
1841
|
+
console.error('⚠ `doc-files <sub>` застаріло — використовуй `lint-doc-files` / `fix-doc-files`.')
|
|
1842
|
+
const rest = args.slice(1)
|
|
1820
1843
|
switch (args[0]) {
|
|
1821
1844
|
case 'scan': {
|
|
1822
|
-
const {
|
|
1823
|
-
process.exitCode =
|
|
1845
|
+
const { runLintDocFilesCli } = await import('../rules/doc-files/lint/lint.mjs')
|
|
1846
|
+
process.exitCode = await runLintDocFilesCli(['--json', ...rest])
|
|
1824
1847
|
break
|
|
1825
1848
|
}
|
|
1826
1849
|
case 'check': {
|
|
1827
|
-
const {
|
|
1828
|
-
process.exitCode = await
|
|
1850
|
+
const { runLintDocFilesCli } = await import('../rules/doc-files/lint/lint.mjs')
|
|
1851
|
+
process.exitCode = await runLintDocFilesCli(rest)
|
|
1829
1852
|
break
|
|
1830
1853
|
}
|
|
1831
1854
|
case 'gen': {
|
|
1832
|
-
const { runDocFilesGenCli } = await import('../
|
|
1833
|
-
process.exitCode = await runDocFilesGenCli(
|
|
1855
|
+
const { runDocFilesGenCli } = await import('../rules/doc-files/js/docgen-files-batch.mjs')
|
|
1856
|
+
process.exitCode = await runDocFilesGenCli(rest)
|
|
1834
1857
|
break
|
|
1835
1858
|
}
|
|
1836
1859
|
case 'stamp': {
|
|
1837
|
-
const { runDocFilesStampCli } = await import('../
|
|
1838
|
-
process.exitCode = runDocFilesStampCli(
|
|
1860
|
+
const { runDocFilesStampCli } = await import('../rules/doc-files/js/docgen-files-batch.mjs')
|
|
1861
|
+
process.exitCode = runDocFilesStampCli(rest)
|
|
1839
1862
|
break
|
|
1840
1863
|
}
|
|
1841
1864
|
default: {
|
|
1842
|
-
console.error('Usage: npx @nitra/cursor doc-files
|
|
1865
|
+
console.error('Usage: npx @nitra/cursor lint-doc-files | fix-doc-files [--root <dir>]')
|
|
1843
1866
|
process.exitCode = 1
|
|
1844
1867
|
}
|
|
1845
1868
|
}
|
|
@@ -1869,7 +1892,7 @@ try {
|
|
|
1869
1892
|
default: {
|
|
1870
1893
|
console.error(`❌ Невідома команда: ${command}`)
|
|
1871
1894
|
console.error(
|
|
1872
|
-
` Очікується: (без аргументів) синхронізація правил, fix, check, rename-yaml-extensions, post-tool-use-fix, lint, lint-ga, lint-rego, lint-k8s, lint-docker, lint-text, coverage, coverage-fix, taze, start-check, fix-t0, change, release, skill, worktree, lint-ci, trace, doc-files, doc-aggregate`
|
|
1895
|
+
` Очікується: (без аргументів) синхронізація правил, fix, check, rename-yaml-extensions, post-tool-use-fix, lint, lint-ga, lint-rego, lint-k8s, lint-docker, lint-text, lint-doc-files, fix-doc-files, coverage, coverage-fix, taze, start-check, fix-t0, change, release, skill, worktree, lint-ci, trace, doc-files, doc-aggregate`
|
|
1873
1896
|
)
|
|
1874
1897
|
process.exitCode = 1
|
|
1875
1898
|
}
|
package/lib/docs/models.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
docgen:
|
|
3
3
|
source: npm/lib/models.mjs
|
|
4
|
-
crc:
|
|
4
|
+
crc: 181e2bf9
|
|
5
5
|
score: 100
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -9,29 +9,40 @@ docgen:
|
|
|
9
9
|
|
|
10
10
|
## Огляд
|
|
11
11
|
|
|
12
|
-
Файл визначає глобальну класифікацію моделей для
|
|
13
|
-
|
|
14
|
-
Система надає механізм каскадного вибору моделі через функцію `resolveModel`. Цей механізм послідовно перевіряє локальні тири (`LOCAL_MIN` $\rightarrow$ `LOCAL_AVG` $\rightarrow$ `LOCAL_MAX`), а потім хмарні тири, якщо попередні не визначені. Це забезпечує прозору роботу, навіть якщо локальні моделі відсутні. Прямі константи (наприклад, `LOCAL_MIN`) залишені для випадків, що вимагають явного контролю над вибором моделі.
|
|
12
|
+
Файл визначає глобальну класифікацію моделей для pi. Конфігурація встановлюється через змінні середовища (наприклад, `N_LOCAL_MIN_MODEL`) та використовується для визначення, який провайдер буде викликаний. Кожен скіл посилається на потрібний тир, який використовується для вибору моделі.
|
|
15
13
|
|
|
16
14
|
## Поведінка
|
|
17
15
|
|
|
18
|
-
LOCAL_MIN
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
LOCAL_MIN
|
|
17
|
+
Завантажує модель для мінімального локального виведення
|
|
18
|
+
|
|
19
|
+
LOCAL_AVG
|
|
20
|
+
Завантажує модель для середнього локального виведення
|
|
21
|
+
|
|
22
|
+
LOCAL_MAX
|
|
23
|
+
Завантажує модель для максимального локального виведення
|
|
24
|
+
|
|
25
|
+
CLOUD_MIN
|
|
26
|
+
Завантажує модель для мінімального хмарного виведення
|
|
27
|
+
|
|
28
|
+
CLOUD_AVG
|
|
29
|
+
Завантажує модель для середнього хмарного виведення
|
|
30
|
+
|
|
31
|
+
CLOUD_MAX
|
|
32
|
+
Завантажує модель для максимального хмарного виведення
|
|
33
|
+
|
|
34
|
+
resolveModel
|
|
35
|
+
Повертає перший непорожній model-id для запитаного тиру, каскадно перевіряючи локальні тири, а тоді хмарний еквівалент
|
|
25
36
|
|
|
26
37
|
## Публічний API
|
|
27
38
|
|
|
28
|
-
LOCAL_MIN —
|
|
29
|
-
LOCAL_AVG —
|
|
30
|
-
LOCAL_MAX —
|
|
31
|
-
CLOUD_MIN —
|
|
32
|
-
CLOUD_AVG — Середній
|
|
33
|
-
CLOUD_MAX —
|
|
34
|
-
resolveModel — Знаходить
|
|
39
|
+
LOCAL_MIN — Швидкий локальний inference. Напр.: ollama/gemma3:4b
|
|
40
|
+
LOCAL_AVG — Середній локальний. Напр.: ollama/gemma4:26b-moe
|
|
41
|
+
LOCAL_MAX — Максимальний локальний. Напр.: ollama/llama4-maverick
|
|
42
|
+
CLOUD_MIN — Мінімальний хмарний. Напр.: openai/gpt-5.4-mini, google/gemini-2.5-flash, anthropic/claude-haiku-4-5
|
|
43
|
+
CLOUD_AVG — Середній хмарний. Напр.: openai/gpt-5.4, google/gemini-2.5-pro, anthropic/claude-sonnet-4-6
|
|
44
|
+
CLOUD_MAX — Максимальний хмарний. Напр.: openai/gpt-5.5, anthropic/claude-opus-4-8
|
|
45
|
+
resolveModel — Знаходить перший непорожній model-id для запиту, починаючи з локальних, а потім переходить до хмарних варіантів.
|
|
35
46
|
|
|
36
47
|
## Гарантії поведінки
|
|
37
48
|
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
docgen:
|
|
3
|
+
source: npm/lib/omlx-trace.mjs
|
|
4
|
+
crc: 3ff568d5
|
|
5
|
+
score: 100
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# omlx-trace.mjs
|
|
9
|
+
|
|
10
|
+
## Огляд
|
|
11
|
+
|
|
12
|
+
Модуль збирає трасу викликів LLM, фіксуючи думки моделі та спостережуваний слід. Траса записується у локальний файл для ротації та готується для подальшої батч-агрегації. Дизайн-специфікація: docs/specs/2026-06-10-omlx-wire-trace-capture-design.md.
|
|
13
|
+
|
|
14
|
+
## Поведінка
|
|
15
|
+
|
|
16
|
+
MAX_MSG_CHARS
|
|
17
|
+
Ліміт символів на одне message.content у записі
|
|
18
|
+
|
|
19
|
+
ROTATE_BYTES
|
|
20
|
+
Поріг недеструктивної ротації активного файлу в байтах
|
|
21
|
+
|
|
22
|
+
tracePath
|
|
23
|
+
Повертає шлях до trace-файлу або null
|
|
24
|
+
|
|
25
|
+
capMessages
|
|
26
|
+
Обрізає message.content та рахує sha256 повного масиву
|
|
27
|
+
|
|
28
|
+
buildTraceRecord
|
|
29
|
+
Будує нормалізований trace-запис
|
|
30
|
+
|
|
31
|
+
rotateIfNeeded
|
|
32
|
+
Недеструктивно ротує файл при перевищенні ROTATE_BYTES
|
|
33
|
+
|
|
34
|
+
writeTrace
|
|
35
|
+
Записує trace-запис у файл з ротацією та fail-safe
|
|
36
|
+
|
|
37
|
+
## Публічний API
|
|
38
|
+
|
|
39
|
+
MAX_MSG_CHARS — встановлює максимальну кількість символів для вмісту повідомлення.
|
|
40
|
+
ROTATE_BYTES — визначає поріг для ініціювання ротації файлу.
|
|
41
|
+
tracePath — зберігає шлях до файлу трасування або порожній рядок, якщо трасування вимкнено.
|
|
42
|
+
N_CURSOR_LLM_TRACE — визначає пріоритет для вибору шляху трасування: спочатку перевіряється вимкнений перемикач, потім використовується явний шлях.
|
|
43
|
+
buildTraceRecord — створює запис трасування, залишаючи порожні значення для полів, які недоступні.
|
|
44
|
+
rotateIfNeeded — перейменовує файл при перевищенні ліміту, створюючи новий файл з послідовним індексом.
|
|
45
|
+
writeTrace — записує один запис трасування, обробляючи шляхи, ротуючи дані за необхідності та обробляючи помилки вводу/виводу.
|
|
46
|
+
|
|
47
|
+
## Гарантії поведінки
|
|
48
|
+
|
|
49
|
+
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
50
|
+
- За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
|
|
51
|
+
- Не звертається до мережі.
|
package/lib/docs/omlx.md
CHANGED
|
@@ -1,32 +1,48 @@
|
|
|
1
1
|
---
|
|
2
2
|
docgen:
|
|
3
3
|
source: npm/lib/omlx.mjs
|
|
4
|
-
crc:
|
|
4
|
+
crc: 0073bdfd
|
|
5
|
+
score: 90
|
|
5
6
|
---
|
|
6
7
|
|
|
7
|
-
# omlx
|
|
8
|
+
# omlx.mjs
|
|
8
9
|
|
|
9
10
|
## Огляд
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
Файл забезпечує комунікацію з локальним omlx-сервером для отримання відповідей. Він маршрутизує запити, використовуючи конвенцію префікса для визначення, чи слід використовувати прямий HTTP виклик до omlx, чи CLI. Функції надають інструменти для роботи з API ключами та викликів до inference-сервера.
|
|
12
13
|
|
|
13
14
|
## Поведінка
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
DEFAULT_OMLX_URL: Дефолтний endpoint omlx
|
|
17
|
+
|
|
18
|
+
resolveOmlxApiKey: Резолвить API ключ для omlx-сервера
|
|
19
|
+
|
|
20
|
+
DEFAULT_OMLX_MODEL: Дефолтна модель для omlx
|
|
21
|
+
|
|
22
|
+
isOmlxModel: Перевіряє, чи model-id адресує локальний omlx-бекенд
|
|
23
|
+
|
|
24
|
+
omlxModelId: Прибирає префікс omlx/ з model-id
|
|
25
|
+
|
|
26
|
+
extractReasoning: Витягує reasoning з message
|
|
27
|
+
|
|
28
|
+
callOmlxRaw: Ядро прямого HTTP-виклику до omlx через curl
|
|
29
|
+
|
|
30
|
+
callOmlx: Тонка обгортка для отримання тексту відповіді
|
|
20
31
|
|
|
21
32
|
## Публічний API
|
|
22
33
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
DEFAULT_OMLX_URL — дефолтний endpoint omlx (перевизначається як `N_CURSOR_OMLX_URL`).
|
|
35
|
+
resolveOmlxApiKey — отримує API-ключ для omlx-сервера, коли ввімкнено автентифікацію (`auth.skip_api_key_verification: false`). Порядок: явний `apiKey` → env `N_CURSOR_OMLX_KEY` → `auth.api_key` з `~/.omlx/settings.json` (для локальної машини, з читанням як за замовчуванням; читання як за замовчуванням; безпечне читання) → `null` (відсутність заголовка).
|
|
36
|
+
DEFAULT_OMLX_MODEL — дефолтна модель, якщо в ідентифікаторі залишився префікс `omlx/` (перевизначається як `N_CURSOR_OMLX_MODEL`).
|
|
37
|
+
isOmlxModel — перевіряє, чи адресує цей model-id локальний omlx-бекенед (наявність префікса `omlx/`).
|
|
38
|
+
omlxModelId — видаляє префікс `omlx/` — отримує чистий model-id для omlx API. Не-omlx-рядки повертаються без змін.
|
|
39
|
+
extractReasoning — витягує обґрунтування з відповіді.
|
|
40
|
+
callOmlxRaw — виконує прямий HTTP-виклик до omlx через `curl` (за допомогою `spawnSync`). Повертає збагачений об'єкт: контент, обґрунтування, використання, результат завершення та кількість спроб. Перезапускає лише тимчасові помилки curl (18 = закритий трансфер, 52 = порожня відповідь, 56 = збій при отриманні).
|
|
41
|
+
callOmlx — тонко інкапсулює `callOmlxRaw` для споживачів, яким потрібен лише текст. Контракт: повертає вміст з `choices[0].message.content`. Без використання заголовків чи загальних фраз.
|
|
27
42
|
|
|
28
43
|
## Гарантії поведінки
|
|
29
44
|
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
45
|
+
- Read-only: файл не виконує операцій запису у файлову систему.
|
|
46
|
+
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
47
|
+
- За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
|
|
48
|
+
- Не звертається до мережі.
|
package/lib/omlx.mjs
CHANGED
|
@@ -69,6 +69,8 @@ export function omlxModelId(model) {
|
|
|
69
69
|
return isOmlxModel(model) ? model.slice(OMLX_PREFIX.length) : model
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
const THINK_TAG_RE = /<think>([\s\S]*?)<\/think>/
|
|
73
|
+
|
|
72
74
|
/**
|
|
73
75
|
* Витягує reasoning (думки моделі) з omlx-`message`. Джерела за пріоритетом:
|
|
74
76
|
* - `field` — окреме поле `message.reasoning_content` (Qwen3-Thinking тощо);
|
|
@@ -80,11 +82,6 @@ export function omlxModelId(model) {
|
|
|
80
82
|
* @param {string|null} finishReason `choices[0].finish_reason`
|
|
81
83
|
* @returns {{ reasoning: string|null, reasoningSource: 'field'|'think_tag'|'truncated'|null }} текст думок і його джерело
|
|
82
84
|
*/
|
|
83
|
-
const THINK_TAG_RE = /<think>([\s\S]*?)<\/think>/
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
*
|
|
87
|
-
*/
|
|
88
85
|
export function extractReasoning(message, finishReason) {
|
|
89
86
|
const field = message?.reasoning_content
|
|
90
87
|
if (field && field.trim()) return { reasoning: field, reasoningSource: 'field' }
|
package/package.json
CHANGED
package/rules/abie/docs/fix.md
CHANGED
|
@@ -1,30 +1,36 @@
|
|
|
1
1
|
---
|
|
2
2
|
docgen:
|
|
3
3
|
source: npm/rules/abie/fix.mjs
|
|
4
|
-
crc:
|
|
4
|
+
crc: 38cf876b
|
|
5
|
+
score: 100
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# fix.mjs
|
|
8
9
|
|
|
9
10
|
## Огляд
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
Запуск правила приймає контекст прогону, застосовує JS-занепокоєні та політику, генерує посилання MDC та повертає результат прогону.
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
Виконання у режимі CLI виконує повний еквівалент команди `npx @nitra/cursor fix <id>` та повертає код виходу.
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
Викликається для виконання основного процесу перевірки.
|
|
16
|
+
## Поведінка
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
1. Запуск правила.
|
|
19
|
+
* Приймає контекст прогону.
|
|
20
|
+
* Виконує застосування JS-занепокоєних.
|
|
21
|
+
* Застосовує політику.
|
|
22
|
+
* Генерує посилання MDC.
|
|
23
|
+
* Повертає результат прогону.
|
|
20
24
|
|
|
21
|
-
|
|
22
|
-
|
|
25
|
+
2. Виконання у режимі CLI.
|
|
26
|
+
* Виконується при запуску через CLI.
|
|
27
|
+
* Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
|
|
28
|
+
* Повертає код виходу.
|
|
23
29
|
|
|
24
30
|
## Публічний API
|
|
25
31
|
|
|
26
|
-
|
|
27
|
-
|
|
32
|
+
run — запускає правило: applies → JS-concerns → policy → mdc-refs (через runStandardRule).
|
|
33
|
+
Library mode — викликається CLI orchestration через `import + run`.
|
|
28
34
|
|
|
29
35
|
## Гарантії поведінки
|
|
30
36
|
|