@nitra/cursor 3.27.0 → 3.28.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 +11 -0
- package/package.json +1 -1
- package/rules/abie/js/applies.mjs +1 -5
- package/rules/abie/js/env_dns.mjs +1 -9
- package/rules/abie/js/firebase_hosting.mjs +1 -5
- package/rules/abie/js/hc_pairing.mjs +1 -8
- package/rules/abie/js/ua_http_route.mjs +1 -10
- package/rules/abie/js/ua_node_selector.mjs +1 -8
- package/rules/adr/js/hooks.mjs +1 -20
- package/rules/bun/js/layout.mjs +1 -19
- package/rules/capacitor/js/platforms.mjs +1 -23
- package/rules/changelog/js/consistency.mjs +1 -29
- package/rules/ci4/js/marksman_config.mjs +1 -19
- package/rules/docker/js/lint.mjs +1 -34
- package/rules/ga/docs/fix.md +4 -4
- package/rules/ga/js/docs/lint.md +3 -3
- package/rules/ga/js/docs/workflows.md +14 -14
- package/rules/ga/js/workflows.mjs +1 -16
- package/rules/ga/lint/docs/lint.md +9 -9
- package/rules/graphql/js/tooling.mjs +1 -9
- package/rules/hasura/js/internal_urls.mjs +1 -24
- package/rules/image-avif/js/avif_generation.mjs +1 -27
- package/rules/image-compress/js/package_setup.mjs +1 -18
- package/rules/js-bun-db/js/safety.mjs +1 -31
- package/rules/js-bun-redis/js/imports.mjs +1 -12
- package/rules/js-lint/js/docs/lint-findings.md +30 -0
- package/rules/js-lint/js/lint-findings.mjs +1 -7
- package/rules/js-lint/js/lint.mjs +1 -10
- package/rules/js-lint/js/tooling.mjs +1 -13
- package/rules/js-lint/js/utils_imports.mjs +1 -18
- package/rules/js-lint-ci/js/lint.mjs +1 -6
- package/rules/js-mssql/js/deps.mjs +1 -10
- package/rules/js-run/js/runtime.mjs +1 -37
- package/rules/js-run/lib/docs/temporal-scan.md +25 -0
- package/rules/k8s/js/manifests.mjs +1 -137
- package/rules/nginx-default-tpl/js/template.mjs +1 -18
- package/rules/npm-module/js/docs/header_doc_pointer.md +25 -0
- package/rules/npm-module/js/header_doc_pointer.mjs +82 -0
- package/rules/npm-module/js/package_structure.mjs +1 -28
- package/rules/npm-module/js/rule_meta.mjs +1 -10
- package/rules/npm-module/js/skill_meta.mjs +1 -13
- package/rules/php/js/tooling.mjs +1 -11
- package/rules/python/js/applies.mjs +1 -8
- package/rules/python/js/tooling.mjs +1 -21
- package/rules/rego/js/applies.mjs +1 -11
- package/rules/rust/js/applies.mjs +1 -7
- package/rules/security/js/sample_secret.mjs +1 -28
- package/rules/security/js/trufflehog.mjs +1 -8
- package/rules/style-lint/js/lint.mjs +1 -5
- package/rules/style-lint/js/tooling.mjs +1 -19
- package/rules/tauri/js/cargo_mutants_config.mjs +1 -20
- package/rules/tauri/js/tooling.mjs +1 -21
- package/rules/test/js/cargo_mutants_config.mjs +1 -12
- package/rules/test/js/location.mjs +1 -9
- package/rules/test/js/no-process-chdir.mjs +1 -21
- package/rules/test/js/no-relative-fs-path.mjs +1 -23
- package/rules/test/js/stryker_config.mjs +4 -25
- package/rules/test/js/vitest-config-pool-forks.mjs +1 -17
- package/rules/text/js/forbidden-prettier.mjs +1 -10
- package/rules/text/js/formatting.mjs +1 -31
- package/rules/vue/js/packages.mjs +1 -24
- package/scripts/docs/coverage-fix-extract.md +32 -0
- package/scripts/docs/lint-cli.md +25 -0
- package/scripts/docs/post-tool-use-fix.md +27 -0
- package/scripts/docs/rename-yaml-extensions.md +36 -0
- package/scripts/docs/skills-cli.md +35 -0
- package/scripts/docs/sync-claude-config.md +52 -0
- package/scripts/docs/sync-setup-bun-deps-action.md +26 -0
- package/scripts/docs/upgrade-nitra-cursor-and-install.md +29 -0
- package/scripts/docs/worktree-cli.md +46 -0
- package/scripts/lib/docs/assert-project-root.md +28 -0
- package/scripts/lib/docs/diff-added-lines.md +34 -0
- package/scripts/lib/docs/read-n-cursor-config-lite.md +28 -0
- package/scripts/lib/docs/resolve-target-files.md +34 -0
- package/scripts/lib/docs/root-notice.md +28 -0
- package/scripts/lib/docs/rule-meta-helpers.md +34 -0
- package/scripts/lib/docs/rule-meta.md +34 -0
- package/scripts/lib/docs/rule-predicates.md +30 -0
- package/scripts/lib/docs/run-conftest-batch.md +26 -0
- package/scripts/lib/docs/run-lint-step.md +25 -0
- package/scripts/lib/docs/run-rule-cli.md +27 -0
- package/scripts/lib/docs/run-rule.md +32 -0
- package/scripts/lib/docs/run-standard-lint.md +22 -0
- package/scripts/lib/docs/run-standard-rule.md +24 -0
- package/scripts/lib/docs/skill-meta.md +31 -0
- package/scripts/lib/docs/sync-gitignore-worktree.md +31 -0
- package/scripts/lib/docs/template.md +40 -0
- package/scripts/lib/docs/timing-summary.md +24 -0
- package/scripts/lib/docs/workspaces.md +30 -0
- package/scripts/lib/docs/worktree-notice.md +27 -0
- package/scripts/lib/docs/worktree.md +38 -0
- package/scripts/utils/docs/ast-scan-utils.md +50 -0
- package/scripts/utils/docs/ensure-gitignore-entries.md +28 -0
- package/scripts/utils/docs/find-package-json-paths.md +26 -0
- package/scripts/utils/docs/lock-cache-dir.md +25 -0
- package/scripts/utils/docs/pass.md +25 -0
- package/scripts/utils/docs/resolve-cargo-manifest.md +23 -0
- package/scripts/utils/docs/resolve-cmd.md +29 -0
- package/scripts/utils/docs/resolve-js-root.md +25 -0
- package/scripts/utils/docs/test-helpers.md +36 -0
- package/scripts/utils/docs/walk-cache.md +27 -0
- package/scripts/utils/docs/walkDir.md +32 -0
- package/scripts/utils/docs/with-lock.md +25 -0
- package/scripts/utils/docs/worktree-fingerprint.md +27 -0
- package/skills/docgen/js/docgen-batch.mjs +95 -0
- package/skills/docgen/js/docgen-extract.mjs +33 -18
- package/skills/docgen/js/docgen-gen.mjs +125 -98
- package/skills/docgen/js/docgen-ignore.mjs +1 -6
- package/skills/docgen/js/docgen-prompts.mjs +33 -22
- package/skills/docgen/js/docgen-scan.mjs +1 -8
- package/skills/docgen/js/docs/docgen-extract.md +28 -0
- package/skills/docgen/js/docs/docgen-gen.md +41 -0
- package/skills/docgen/js/docs/docgen-ignore.md +24 -0
- package/skills/docgen/js/docs/docgen-prompts.md +24 -0
- package/skills/docgen/js/docs/docgen-scan.md +48 -0
- package/skills/fix/js/docs/llm-worker.md +27 -0
- package/skills/fix/js/docs/orchestrator.md +32 -0
- package/skills/fix/js/docs/t0.md +29 -0
- package/skills/fix/js/llm-worker.mjs +64 -29
- package/skills/fix/js/orchestrator.mjs +45 -54
- package/skills/fix/js/t0.mjs +16 -32
- package/skills/start-check/js/check.mjs +1 -16
- package/skills/start-check/js/docs/check.md +34 -0
- package/skills/taze/js/diff.mjs +1 -15
- package/skills/taze/js/docs/diff.md +33 -0
package/skills/fix/js/t0.mjs
CHANGED
|
@@ -1,18 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* T0-auto: детермінований рівень виправлень для n-fix оркестратора.
|
|
3
|
-
*
|
|
4
|
-
* Парсить `output` з `n-cursor fix --json` → застосовує програмний фікс без LLM.
|
|
5
|
-
* Умова застосування: violation-message містить конкретне цільове значення
|
|
6
|
-
* (назву файлу, рядок для вставки, ім'я залежності), яке можна видобути regex.
|
|
7
|
-
*
|
|
8
|
-
* Ієрархія: T0 (rm/create, знаний тип) → T0-auto (parse violation) → T1 (LLM).
|
|
9
|
-
* T0-auto запускається першим у конвергентному циклі; T1 — лише для решти.
|
|
10
|
-
*
|
|
11
|
-
* Публічний API:
|
|
12
|
-
* applyT0Auto(ruleId, violationOutput, cwd) → { applied: boolean, actions: string[] }
|
|
13
|
-
* listT0AutoRules() → string[] (ids що мають хоч один паттерн)
|
|
14
|
-
* runT0AutoCli(args, cwd) → Promise<number> (exit 0=clean, 1=violation)
|
|
15
|
-
*/
|
|
1
|
+
/** @see ./docs/t0.md */
|
|
16
2
|
import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
|
|
17
3
|
import { join } from 'node:path'
|
|
18
4
|
import { spawnSync } from 'node:child_process'
|
|
@@ -57,7 +43,7 @@ const PATTERNS = [
|
|
|
57
43
|
parsed.recommendations = [...recs, ...toAdd]
|
|
58
44
|
writeFileSync(extPath, JSON.stringify(parsed, null, 2) + '\n', 'utf8')
|
|
59
45
|
return { ok: true, action: `додано до extensions.json: ${toAdd.join(', ')}` }
|
|
60
|
-
}
|
|
46
|
+
}
|
|
61
47
|
},
|
|
62
48
|
|
|
63
49
|
// ── rm-forbidden-file ────────────────────────────────────────────────────────
|
|
@@ -80,8 +66,8 @@ const PATTERNS = [
|
|
|
80
66
|
}
|
|
81
67
|
if (removed.length === 0) return { ok: false, action: 'файлів не знайдено' }
|
|
82
68
|
return { ok: true, action: `видалено: ${removed.join(', ')}` }
|
|
83
|
-
}
|
|
84
|
-
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
85
71
|
]
|
|
86
72
|
|
|
87
73
|
/**
|
|
@@ -116,9 +102,7 @@ export function applyT0Auto(ruleId, violationOutput, cwd) {
|
|
|
116
102
|
* @returns {string[]}
|
|
117
103
|
*/
|
|
118
104
|
export function filterT0AutoRules(failedRules) {
|
|
119
|
-
return failedRules
|
|
120
|
-
.filter(r => PATTERNS.some(p => p.test(r.output)))
|
|
121
|
-
.map(r => r.ruleId)
|
|
105
|
+
return failedRules.filter(r => PATTERNS.some(p => p.test(r.output))).map(r => r.ruleId)
|
|
122
106
|
}
|
|
123
107
|
|
|
124
108
|
// ─── CLI entry-point ──────────────────────────────────────────────────────────
|
|
@@ -141,11 +125,11 @@ export async function runT0AutoCli(args, cwd) {
|
|
|
141
125
|
const verbose = args.includes('--verbose') || args.includes('-v')
|
|
142
126
|
|
|
143
127
|
// 1. Запустити fix --json
|
|
144
|
-
const fixResult = spawnSync(
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
)
|
|
128
|
+
const fixResult = spawnSync('bun', [N_CURSOR_BIN, '_fix-check', ...ruleFilter], {
|
|
129
|
+
cwd,
|
|
130
|
+
encoding: 'utf8',
|
|
131
|
+
timeout: 120_000
|
|
132
|
+
})
|
|
149
133
|
const raw = fixResult.stdout?.trim()
|
|
150
134
|
if (!raw) {
|
|
151
135
|
console.error(`n-cursor fix-t0: fix --json повернув порожній stdout`)
|
|
@@ -191,11 +175,11 @@ export async function runT0AutoCli(args, cwd) {
|
|
|
191
175
|
}
|
|
192
176
|
|
|
193
177
|
// 4. Check-gate: перевірити лише ті правила, що ми чіпали
|
|
194
|
-
const recheck = spawnSync(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
)
|
|
178
|
+
const recheck = spawnSync('bun', [N_CURSOR_BIN, '_fix-check', ...applied.map(a => a.ruleId)], {
|
|
179
|
+
cwd,
|
|
180
|
+
encoding: 'utf8',
|
|
181
|
+
timeout: 120_000
|
|
182
|
+
})
|
|
199
183
|
const recheckRaw = recheck.stdout?.trim()
|
|
200
184
|
if (!recheckRaw) {
|
|
201
185
|
console.error(`fix-t0: check-gate: fix --json повернув порожній stdout`)
|
|
@@ -223,7 +207,7 @@ export async function runT0AutoCli(args, cwd) {
|
|
|
223
207
|
const total = failed.length
|
|
224
208
|
console.log(
|
|
225
209
|
`✅ fix-t0: ${totalFixed}/${total} правил закрито T0-auto` +
|
|
226
|
-
|
|
210
|
+
(skipped.length > 0 ? `; ${skipped.join(', ')} → T1 (LLM)` : '')
|
|
227
211
|
)
|
|
228
212
|
return 0
|
|
229
213
|
}
|
|
@@ -1,19 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `n-cursor start-check scan|run` — детермінована частина smoke-перевірки
|
|
3
|
-
* bun-монорепо для скілу `n-start-check`.
|
|
4
|
-
*
|
|
5
|
-
* Мотивація: скіл раніше казав LLM-агенту вручну розгортати glob-воркспейси,
|
|
6
|
-
* читати кожен `package.json`, класифікувати `start` (сервер vs CLI), запускати
|
|
7
|
-
* процес із таймаутом через `perl alarm`, інтерпретувати exit-коди й парсити лог
|
|
8
|
-
* на рядки готовності/помилки. Усе це детерміновано — скрипт робить це надійно й
|
|
9
|
-
* крос-платформно (`spawnSync` з `timeout`), а агент лишається тільки з
|
|
10
|
-
* діагностикою: **чому** саме воркспейс упав.
|
|
11
|
-
*
|
|
12
|
-
* `scan` — `[{workspace, name, hasStart, startCmd, type}]`.
|
|
13
|
-
* `run <ws>` — `{workspace, type, exitCode, timedOut, status, ready, firstError,
|
|
14
|
-
* logTail, sideEffects}` (sideEffects — read-only git-diff проти стану до запуску;
|
|
15
|
-
* власне відкат лишається явним кроком скіла).
|
|
16
|
-
*/
|
|
1
|
+
/** @see ./docs/check.md */
|
|
17
2
|
import { spawnSync } from 'node:child_process'
|
|
18
3
|
import { existsSync } from 'node:fs'
|
|
19
4
|
import { readFile } from 'node:fs/promises'
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# check.mjs
|
|
2
|
+
|
|
3
|
+
## Огляд
|
|
4
|
+
|
|
5
|
+
Файл `n-cursor start-check scan|run` є частиною smoke-перевірки для скілу `n-start-check`. Він автоматично аналізує та запускає воркспейси, визначаючи тип стартового скрипта (сервер чи CLI) та перевіряючи успішність його виконання з обмеженням часу. Результати аналізу та запуску записуються у форматі JSON для подальшого аналізу та діагностики проблем.
|
|
6
|
+
|
|
7
|
+
## Поведінка
|
|
8
|
+
|
|
9
|
+
- `classifyStartType` визначає, чи є команда `start` CLI чи довгим процесом (сервером).
|
|
10
|
+
- `scanStartWorkspaces` сканує монорепо, визначаючи воркспейси з `start`, їхні команди та типи.
|
|
11
|
+
- `parseStartLog` витягує готовність, першу помилку та хвіст логу з процесу.
|
|
12
|
+
- `runWorkspaceStart` запускає команду `start` воркспейсу з grace-таймаутом, класифікує результат та повертає інформацію про процес.
|
|
13
|
+
- `runStartCheckCli` виконує `scan` або `run` воркспейсу, приймаючи аргументи командного рядка.
|
|
14
|
+
|
|
15
|
+
## Публічний API
|
|
16
|
+
|
|
17
|
+
- classifyStartType — Визначає, чи є команда `start` сервером або CLI.
|
|
18
|
+
- scanStartWorkspaces — Перевіряє монорепо на наявність команди `start` та її типу у кожному воркспейсі.
|
|
19
|
+
- parseStartLog — Аналізує лог процесу `start` для виявлення статусу, помилок та кінця.
|
|
20
|
+
- runWorkspaceStart — Запускає команду `start` у воркспейсі з обмеженим часом та визначає результат.
|
|
21
|
+
- runStartCheckCli — Запускає CLI для сканування воркспейсів з `start` та індивідуального запуску воркспейсу з подальшим виводом результатів у JSON.
|
|
22
|
+
|
|
23
|
+
## Гарантії поведінки
|
|
24
|
+
|
|
25
|
+
- Скрипт детерміновано виконує перевірку запуску воркспейса.
|
|
26
|
+
- Скрипт використовує `spawnSync` з таймаутом для запуску процесів.
|
|
27
|
+
- Скрипт інтерпретує exit-коди та парсить логи.
|
|
28
|
+
- Результат перевірки воркспейса представлений у форматі `[{workspace, name, hasStart, startCmd, type}]`.
|
|
29
|
+
- У разі невдачі перевірки, скрипт повертає `false` або `null`.
|
|
30
|
+
- Скрипт не кидає винятків.
|
|
31
|
+
- Скрипт не використовує кешування.
|
|
32
|
+
- Скрипт не взаємодіє з мережею.
|
|
33
|
+
- Результат запуску воркспейса представлений у форматі `{workspace, type, exitCode, timedOut, status, ready, firstError, logTail, sideEffects}`.
|
|
34
|
+
- `sideEffects` містить відкат стану воркспейса до його початкового стану перед запуском.
|
package/skills/taze/js/diff.mjs
CHANGED
|
@@ -1,18 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `n-cursor taze diff` — read-only детермінований diff версій залежностей між
|
|
3
|
-
* `package.json` і його бекапом `package.json.taze-bak` (root + усі воркспейси
|
|
4
|
-
* монорепо), із класифікацією кожної зміни за semver.
|
|
5
|
-
*
|
|
6
|
-
* Мотивація: скіл `n-taze` раніше казав LLM-агенту вручну порівнювати backup із
|
|
7
|
-
* новим `package.json` по всіх воркспейсах і вирішувати, де «змінилась перша
|
|
8
|
-
* значуща цифра semver» (major). Це детермінований JSON-diff + semver-логіка —
|
|
9
|
-
* скрипт робить це за мілісекунди й без помилок, а агент отримує готовий список
|
|
10
|
-
* major-оновлень для справді когнітивної роботи (читання CHANGELOG, рефакторинг).
|
|
11
|
-
*
|
|
12
|
-
* «Breaking» (major) рахуємо за caret-семантикою — змінилась найлівіша ненульова
|
|
13
|
-
* компонента: `1.x→2.x`, `0.4.x→0.5.x`, `0.0.3→0.0.4`. Minor/patch вважаємо
|
|
14
|
-
* сумісними.
|
|
15
|
-
*/
|
|
1
|
+
/** @see ./docs/diff.md */
|
|
16
2
|
import { existsSync } from 'node:fs'
|
|
17
3
|
import { readFile } from 'node:fs/promises'
|
|
18
4
|
import { join } from 'node:path'
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# diff.mjs
|
|
2
|
+
|
|
3
|
+
## Огляд
|
|
4
|
+
|
|
5
|
+
Файл `n-cursor taze diff` порівнює поточну версію `package.json` з її резервною копією (`package.json.taze-bak`) для виявлення змін залежностей. Він класифікує ці зміни за семантикою версій (major, minor, patch) та надає список оновлень, які потребують уваги. Це автоматизує процес, який раніше виконувався вручну, забезпечуючи швидкий та точний аналіз змін у залежностях монорепо.
|
|
6
|
+
|
|
7
|
+
## Поведінка
|
|
8
|
+
|
|
9
|
+
`parseVersion` парсує версійний specifier, ігноруючи range-префікси, і повертає об'єкт з major, minor та patch компонентами, або null, якщо spec не є semver.
|
|
10
|
+
`isBreaking` визначає, чи є перехід від старої до нової версії "breaking" за caret-семантикою.
|
|
11
|
+
`diffPackageJson` порівнює два об'єкти `package.json`, виявляє major-оновлення та підраховує minor/patch зміни для залежностей.
|
|
12
|
+
`collectTazeDiff` збирає diff по всіх воркспейсах монорепо, порівнюючи `package.json` з бекапом, та повертає список major-оновлень, кількість minor/patch змін, загальну кількість порівняних воркспейсів та кількість воркспейсів, які були порівняні.
|
|
13
|
+
`runTazeCli` запускає CLI `n-cursor taze diff`, збирає diff по воркспейсах, та виводить результат у форматі JSON.
|
|
14
|
+
|
|
15
|
+
## Публічний API
|
|
16
|
+
|
|
17
|
+
- parseVersion — Розбирає semver-версію з специфікатора.
|
|
18
|
+
- isBreaking — Визначає, чи є перехід breaking за caret-семантикою.
|
|
19
|
+
- diffPackageJson — Порівнює два package.json-об'єкти та визначає зміни залежностей.
|
|
20
|
+
- collectTazeDiff — Збирає diff для монорепо, порівнюючи package.json з резервною копією.
|
|
21
|
+
- runTazeCli — Запускає CLI для виведення компактного JSON з інформацією про major-оновлення та кількість minor/patch.
|
|
22
|
+
|
|
23
|
+
## Гарантії поведінки
|
|
24
|
+
|
|
25
|
+
- Скрипт повертає `true`, якщо всі воркспейси монорепо успішно порівняні.
|
|
26
|
+
- Скрипт повертає `false` та `null`, якщо виникла будь-яка помилка під час порівняння.
|
|
27
|
+
- Результат порівняння завжди є `null`, якщо `package.json` або `package.json.taze-bak` не є валідним JSON.
|
|
28
|
+
- Результат порівняння містить список major-оновлень, визначених за caret-семантикою.
|
|
29
|
+
- Minor та patch оновлення не включаються в результат.
|
|
30
|
+
- Результат завжди детермінований, тобто при однаковому вході скрипт завжди повертає однаковий результат.
|
|
31
|
+
- Скрипт не використовує кешування.
|
|
32
|
+
- Скрипт не кидає винятків.
|
|
33
|
+
- Скрипт перехоплює помилки та повертає `false` та `null`.
|