@nitra/cursor 4.1.0 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/bin/n-cursor.js +25 -13
- package/lib/models.mjs +1 -2
- package/package.json +1 -1
- package/rules/abie/fix.mjs +1 -1
- package/rules/bun/docs/fix.md +3 -0
- package/rules/bun/fix.mjs +1 -1
- package/rules/capacitor/fix.mjs +1 -1
- package/rules/changelog/docs/fix.md +3 -0
- package/rules/changelog/fix.mjs +1 -1
- package/rules/ci4/fix.mjs +1 -1
- package/rules/ci4/js/docs/marksman_config.md +1 -0
- package/rules/docker/docs/fix.md +1 -1
- package/rules/docker/fix.mjs +1 -1
- package/rules/docker/lint/docs/lint.md +1 -0
- package/rules/efes/docs/fix.md +2 -1
- package/rules/efes/fix.mjs +1 -1
- package/rules/feedback/fix.mjs +1 -1
- package/rules/ga/fix.mjs +1 -1
- package/rules/ga/js/lint.mjs +1 -1
- package/rules/graphql/docs/fix.md +4 -1
- package/rules/graphql/fix.mjs +1 -1
- package/rules/graphql/lib/docs/graphql-gql-scan.md +3 -0
- package/rules/hasura/fix.mjs +1 -1
- package/rules/image-avif/docs/fix.md +4 -1
- package/rules/image-avif/fix.mjs +1 -1
- package/rules/image-avif/js/docs/avif_generation.md +1 -0
- package/rules/image-compress/fix.mjs +1 -1
- package/rules/js-bun-db/fix.mjs +1 -1
- package/rules/js-bun-db/lib/docs/bun-sql-scan.md +6 -0
- package/rules/js-bun-redis/fix.mjs +1 -1
- package/rules/js-lint/fix.mjs +1 -1
- package/rules/js-lint/js/docs/utils_imports.md +1 -0
- package/rules/js-lint-ci/docs/fix.md +4 -1
- package/rules/js-lint-ci/fix.mjs +1 -1
- package/rules/js-mssql/docs/fix.md +3 -0
- package/rules/js-mssql/fix.mjs +1 -1
- package/rules/js-mssql/lib/docs/mssql-pool-scan.md +9 -0
- package/rules/js-run/docs/fix.md +3 -0
- package/rules/js-run/fix.mjs +1 -1
- package/rules/js-run/lib/docs/check-env-scan.md +2 -1
- package/rules/js-run/lib/docs/promise-settimeout-scan.md +4 -0
- package/rules/k8s/docs/fix.md +3 -0
- package/rules/k8s/fix.mjs +1 -1
- package/rules/nginx-default-tpl/docs/fix.md +3 -0
- package/rules/nginx-default-tpl/fix.mjs +1 -1
- package/rules/npm-module/fix.mjs +1 -1
- package/rules/npm-module/js/header_doc_pointer.mjs +14 -3
- package/rules/php/docs/fix.md +2 -1
- package/rules/php/fix.mjs +1 -1
- package/rules/python/docs/fix.md +4 -1
- package/rules/python/fix.mjs +1 -1
- package/rules/rego/fix.mjs +1 -1
- package/rules/rego/js/lint.mjs +1 -1
- package/rules/release/docs/fix.md +4 -1
- package/rules/release/fix.mjs +1 -1
- package/rules/rust/fix.mjs +1 -1
- package/rules/security/docs/fix.md +1 -1
- package/rules/security/fix.mjs +1 -1
- package/rules/style-lint/docs/fix.md +3 -0
- package/rules/style-lint/fix.mjs +1 -1
- package/rules/tauri/docs/fix.md +4 -1
- package/rules/tauri/fix.mjs +1 -1
- package/rules/test/docs/fix.md +3 -0
- package/rules/test/fix.mjs +1 -1
- package/rules/test/js/no-relative-fs-path.mjs +2 -1
- package/rules/text/docs/fix.md +3 -0
- package/rules/text/fix.mjs +1 -1
- package/rules/text/js/lint.mjs +1 -1
- package/rules/vue/fix.mjs +1 -1
- package/rules/worktree/fix.mjs +1 -1
- package/scripts/auto-rules.mjs +1 -1
- package/scripts/coverage-classify/index.mjs +10 -10
- package/scripts/coverage-fix.mjs +2 -2
- package/scripts/dispatcher/graph/lib/cmd-init.mjs +112 -0
- package/scripts/dispatcher/graph/lib/cmd-invalidate.mjs +96 -0
- package/scripts/dispatcher/graph/lib/cmd-kill.mjs +141 -0
- package/scripts/dispatcher/graph/lib/cmd-plan.mjs +142 -0
- package/scripts/dispatcher/graph/lib/cmd-run.mjs +328 -0
- package/scripts/dispatcher/graph/lib/cmd-scan.mjs +115 -0
- package/scripts/dispatcher/graph/lib/cmd-setup.mjs +111 -0
- package/scripts/dispatcher/graph/lib/cmd-signals.mjs +328 -0
- package/scripts/dispatcher/graph/lib/cmd-status.mjs +131 -0
- package/scripts/dispatcher/graph/lib/cmd-verify.mjs +100 -0
- package/scripts/dispatcher/graph/lib/cmd-watch.mjs +128 -0
- package/scripts/dispatcher/graph/lib/config.mjs +103 -0
- package/scripts/dispatcher/graph/lib/frontmatter.mjs +224 -0
- package/scripts/dispatcher/graph/lib/nnn.mjs +127 -0
- package/scripts/dispatcher/graph/lib/node-state.mjs +157 -0
- package/scripts/dispatcher/graph/lib/scanner.mjs +235 -0
- package/scripts/dispatcher/graph/lib/worktree-ops.mjs +193 -0
- package/scripts/dispatcher/graph-tasks.mjs +92 -0
- package/scripts/dispatcher/index.mjs +3 -3
- package/scripts/dispatcher/lib/docs/events.md +1 -0
- package/scripts/dispatcher/lib/executor.mjs +1 -1
- package/scripts/dispatcher/lib/subagent-runner.mjs +9 -9
- package/scripts/dispatcher/trace.mjs +6 -2
- package/scripts/docs/build-agents-commands.md +1 -0
- package/scripts/docs/cli-entry.md +6 -0
- package/scripts/graph/index.mjs +115 -0
- package/scripts/graph/lib/config.mjs +62 -0
- package/scripts/graph/lib/dag.mjs +161 -0
- package/scripts/graph/lib/frontmatter.mjs +70 -0
- package/scripts/graph/lib/nnn.mjs +77 -0
- package/scripts/graph/lib/state.mjs +110 -0
- package/scripts/graph/scan.mjs +64 -0
- package/scripts/graph/status.mjs +86 -0
- package/scripts/lib/docs/load-cursor-config.md +3 -0
- package/scripts/lib/root-notice.mjs +4 -2
- package/scripts/lib/rule-predicates.mjs +1 -1
- package/scripts/lib/worktree-notice.mjs +14 -7
- package/scripts/lib/worktree.mjs +3 -2
- package/scripts/utils/resolve-js-root.mjs +2 -1
- package/scripts/utils/with-lock.mjs +1 -1
- package/skills/docgen/js/docgen-batch.mjs +7 -7
- package/skills/docgen/js/docgen-extract.mjs +80 -37
- package/skills/docgen/js/docgen-ignore.mjs +1 -1
- package/skills/docgen/js/docgen-prompts.mjs +21 -5
- package/skills/fix/js/llm-worker.mjs +19 -22
- package/skills/fix/js/orchestrator.mjs +6 -7
- package/skills/fix/js/t0.mjs +14 -13
- package/types/bin/n-cursor.d.ts +1 -1
- package/rules/flow/docs/fix.md +0 -152
- package/rules/flow/fix.mjs +0 -18
- package/rules/flow/flow.mdc +0 -127
- package/rules/flow/meta.json +0 -1
- package/scripts/dispatcher/lib/docs/flow-lock.md +0 -161
- package/scripts/dispatcher/lib/docs/flow-resolve.md +0 -267
- package/scripts/dispatcher/lib/flow-plan.mjs +0 -153
- package/scripts/dispatcher/lib/flow-resolve.mjs +0 -156
- package/scripts/dispatcher/lib/flow-signals.mjs +0 -235
- package/scripts/dispatcher/lib/flow-verify.mjs +0 -127
package/CHANGELOG.md
CHANGED
package/bin/n-cursor.js
CHANGED
|
@@ -1141,7 +1141,6 @@ async function runSyncStep(prefix, action) {
|
|
|
1141
1141
|
* захаращують термінал. Тому буфер скидається в реальний stdout **лише**
|
|
1142
1142
|
* коли крок повернув `fail > 0` (або кинув виняток); за `fail === 0` —
|
|
1143
1143
|
* відкидається мовчки.
|
|
1144
|
-
*
|
|
1145
1144
|
* @template T
|
|
1146
1145
|
* @param {() => Promise<T>} action крок синку, що повертає обʼєкт із лічильником помилок `fail`
|
|
1147
1146
|
* @returns {Promise<T>} результат `action` без змін
|
|
@@ -1564,21 +1563,28 @@ const ROOT_GUARDED_COMMANDS = new Set([undefined, '', 'fix', 'check', 'lint', 'c
|
|
|
1564
1563
|
function describeRootGuardedAction(cmd) {
|
|
1565
1564
|
switch (cmd) {
|
|
1566
1565
|
case undefined:
|
|
1567
|
-
case '':
|
|
1566
|
+
case '': {
|
|
1568
1567
|
return 'Дефолтна синхронізація скаффолдить .cursor/, .claude/, CLAUDE.md, .n-cursor.json і робить bun install у поточному каталозі'
|
|
1568
|
+
}
|
|
1569
1569
|
case 'fix':
|
|
1570
|
-
case 'check':
|
|
1570
|
+
case 'check': {
|
|
1571
1571
|
return '`fix` запускає programmatic-перевірки правил, що переписують конфіги в поточному каталозі'
|
|
1572
|
-
|
|
1572
|
+
}
|
|
1573
|
+
case 'lint': {
|
|
1573
1574
|
return '`lint` запускає авто-fix лінтерів (oxfmt/eslint --fix/stylelint --fix) у поточному каталозі'
|
|
1574
|
-
|
|
1575
|
+
}
|
|
1576
|
+
case 'coverage': {
|
|
1575
1577
|
return '`coverage` генерує COVERAGE.md і Stryker-артефакти в поточному каталозі'
|
|
1576
|
-
|
|
1578
|
+
}
|
|
1579
|
+
case 'change': {
|
|
1577
1580
|
return '`change` пише change-файл у .changes/ поточного каталогу'
|
|
1578
|
-
|
|
1581
|
+
}
|
|
1582
|
+
case 'release': {
|
|
1579
1583
|
return '`release` бампає version і переписує CHANGELOG у поточному каталозі'
|
|
1580
|
-
|
|
1584
|
+
}
|
|
1585
|
+
default: {
|
|
1581
1586
|
return 'Команда @nitra/cursor мутує проєкт у поточному каталозі'
|
|
1587
|
+
}
|
|
1582
1588
|
}
|
|
1583
1589
|
}
|
|
1584
1590
|
|
|
@@ -1768,10 +1774,16 @@ try {
|
|
|
1768
1774
|
break
|
|
1769
1775
|
}
|
|
1770
1776
|
case 'graph': {
|
|
1771
|
-
// n-cursor graph —
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1777
|
+
// n-cursor graph — task DAG orchestration system (думка.MD, file-presence protocol)
|
|
1778
|
+
const { runGraphTasksCli } = await import('../scripts/dispatcher/graph-tasks.mjs')
|
|
1779
|
+
process.exitCode = await runGraphTasksCli(args)
|
|
1780
|
+
|
|
1781
|
+
break
|
|
1782
|
+
}
|
|
1783
|
+
case 'watch': {
|
|
1784
|
+
// n-cursor watch — one-shot DAG scan: audit queue + stale worktrees + needs-plan
|
|
1785
|
+
const { runGraphTasksCli } = await import('../scripts/dispatcher/graph-tasks.mjs')
|
|
1786
|
+
process.exitCode = await runGraphTasksCli(['watch', ...args])
|
|
1775
1787
|
|
|
1776
1788
|
break
|
|
1777
1789
|
}
|
|
@@ -1800,7 +1812,7 @@ try {
|
|
|
1800
1812
|
default: {
|
|
1801
1813
|
console.error(`❌ Невідома команда: ${command}`)
|
|
1802
1814
|
console.error(
|
|
1803
|
-
` Очікується: (без аргументів) синхронізація правил, 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, flow, trace, graph, docgen`
|
|
1815
|
+
` Очікується: (без аргументів) синхронізація правил, 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, flow, trace, graph, watch, docgen`
|
|
1804
1816
|
)
|
|
1805
1817
|
process.exitCode = 1
|
|
1806
1818
|
}
|
package/lib/models.mjs
CHANGED
|
@@ -55,8 +55,7 @@ export const CLOUD_MAX = env.N_CLOUD_MAX_MODEL ?? ''
|
|
|
55
55
|
/**
|
|
56
56
|
* Повертає перший непорожній model-id для запитаного тиру,
|
|
57
57
|
* каскадно перевіряючи локальні тири, а тоді хмарний еквівалент.
|
|
58
|
-
*
|
|
59
|
-
* @param {'min'|'avg'|'max'} tier
|
|
58
|
+
* @param {'min'|'avg'|'max'} tier тир запитуваної моделі
|
|
60
59
|
* @returns {string} provider/model-id або '' для pi-дефолту
|
|
61
60
|
* @throws {TypeError} якщо tier невідомий
|
|
62
61
|
*/
|
package/package.json
CHANGED
package/rules/abie/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
package/rules/bun/docs/fix.md
CHANGED
package/rules/bun/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
package/rules/capacitor/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
package/rules/changelog/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
package/rules/ci4/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
|
@@ -96,6 +96,7 @@ export async function check(cwd = process.cwd()): Promise<number>
|
|
|
96
96
|
1. Зовнішній runner (зазвичай CLI `n-cursor` або агрегатор правил) імпортує `check` і викликає його:
|
|
97
97
|
```js
|
|
98
98
|
import { check } from '@nitra/cursor/npm/rules/ci4/js/marksman_config.mjs'
|
|
99
|
+
|
|
99
100
|
const code = await check(process.cwd())
|
|
100
101
|
process.exit(code)
|
|
101
102
|
```
|
package/rules/docker/docs/fix.md
CHANGED
|
@@ -163,7 +163,7 @@ export function run(ctx) {
|
|
|
163
163
|
|
|
164
164
|
if (isRunAsCli(import.meta.url)) {
|
|
165
165
|
// Standalone-ентрі: повний еквівалент `npx @nitra/cursor fix <id>`.
|
|
166
|
-
// eslint-disable-next-line n/no-process-exit
|
|
166
|
+
// eslint-disable-next-line n/no-process-exit
|
|
167
167
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
168
168
|
}
|
|
169
169
|
```
|
package/rules/docker/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
|
@@ -167,6 +167,7 @@ if (isRunAsCli(import.meta.url)) {
|
|
|
167
167
|
- **Програмно з інших скриптів:**
|
|
168
168
|
```js
|
|
169
169
|
import { runLintDocker } from 'npm/rules/docker/lint/lint.mjs'
|
|
170
|
+
|
|
170
171
|
const code = await runLintDocker() // 0 — OK, 1 — є зауваження/помилки
|
|
171
172
|
```
|
|
172
173
|
- **Тести/допоміжний код:**
|
package/rules/efes/docs/fix.md
CHANGED
|
@@ -83,7 +83,7 @@ export function run(ctx) {
|
|
|
83
83
|
|
|
84
84
|
```js
|
|
85
85
|
if (isRunAsCli(import.meta.url)) {
|
|
86
|
-
// eslint-disable-next-line n/no-process-exit
|
|
86
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
87
87
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
88
88
|
}
|
|
89
89
|
```
|
|
@@ -177,6 +177,7 @@ $ bun npm/rules/efes/fix.mjs
|
|
|
177
177
|
|
|
178
178
|
```js
|
|
179
179
|
import { run } from 'npm/rules/efes/fix.mjs'
|
|
180
|
+
|
|
180
181
|
const code = await run() // 0 або 1
|
|
181
182
|
```
|
|
182
183
|
|
package/rules/efes/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
package/rules/feedback/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
package/rules/ga/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
package/rules/ga/js/lint.mjs
CHANGED
|
@@ -7,6 +7,6 @@ import { runLintGaCli } from '../lint/lint.mjs'
|
|
|
7
7
|
* @param {string[] | undefined} _files ігнорується (whole-repo аналіз)
|
|
8
8
|
* @returns {Promise<number>} exit code
|
|
9
9
|
*/
|
|
10
|
-
export
|
|
10
|
+
export function lint(_files) {
|
|
11
11
|
return runLintGaCli()
|
|
12
12
|
}
|
|
@@ -26,6 +26,9 @@ Default export відсутній. Інших named-експортів файл
|
|
|
26
26
|
### `run(ctx)`
|
|
27
27
|
|
|
28
28
|
```js
|
|
29
|
+
/**
|
|
30
|
+
*
|
|
31
|
+
*/
|
|
29
32
|
export function run(ctx) {
|
|
30
33
|
return runStandardRule(import.meta.dirname, ctx)
|
|
31
34
|
}
|
|
@@ -50,7 +53,7 @@ export function run(ctx) {
|
|
|
50
53
|
|
|
51
54
|
```js
|
|
52
55
|
if (isRunAsCli(import.meta.url)) {
|
|
53
|
-
// eslint-disable-next-line n/no-process-exit
|
|
56
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
54
57
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
55
58
|
}
|
|
56
59
|
```
|
package/rules/graphql/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
|
@@ -163,6 +163,9 @@ Default-експорту **немає**. Усі допоміжні функці
|
|
|
163
163
|
import { isGqlScanSourceFile, shouldSkipFileForGqlScan, sourceFileHasGqlTaggedTemplate } from './graphql-gql-scan.mjs'
|
|
164
164
|
import { readFile } from 'node:fs/promises'
|
|
165
165
|
|
|
166
|
+
/**
|
|
167
|
+
*
|
|
168
|
+
*/
|
|
166
169
|
async function findFilesWithGqlTag(relativePaths) {
|
|
167
170
|
const hits = []
|
|
168
171
|
for (const rel of relativePaths) {
|
package/rules/hasura/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
|
@@ -31,6 +31,9 @@
|
|
|
31
31
|
### `run(ctx)`
|
|
32
32
|
|
|
33
33
|
```js
|
|
34
|
+
/**
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
34
37
|
export function run(ctx) {
|
|
35
38
|
return runStandardRule(import.meta.dirname, ctx)
|
|
36
39
|
}
|
|
@@ -49,7 +52,7 @@ export function run(ctx) {
|
|
|
49
52
|
|
|
50
53
|
```js
|
|
51
54
|
if (isRunAsCli(import.meta.url)) {
|
|
52
|
-
// eslint-disable-next-line n/no-process-exit
|
|
55
|
+
// eslint-disable-next-line n/no-process-exit
|
|
53
56
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
54
57
|
}
|
|
55
58
|
```
|
package/rules/image-avif/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
package/rules/js-bun-db/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
|
@@ -270,6 +270,10 @@ Set-константи:
|
|
|
270
270
|
|
|
271
271
|
```js
|
|
272
272
|
import { SQL } from 'bun'
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
*
|
|
276
|
+
*/
|
|
273
277
|
export async function handler(req) {
|
|
274
278
|
const sql = new SQL(process.env.DATABASE_URL) // <-- порушення
|
|
275
279
|
return sql`select 1`
|
|
@@ -280,6 +284,7 @@ Set-константи:
|
|
|
280
284
|
|
|
281
285
|
```js
|
|
282
286
|
import { sql } from 'bun'
|
|
287
|
+
|
|
283
288
|
const text = `select * from ${tableName}`
|
|
284
289
|
sql.unsafe(text) // <-- порушення: немає // allow-unsafe: <reason>
|
|
285
290
|
```
|
|
@@ -309,6 +314,7 @@ Set-константи:
|
|
|
309
314
|
|
|
310
315
|
```js
|
|
311
316
|
import { sql } from 'bun'
|
|
317
|
+
|
|
312
318
|
await sql.end() // <-- порушення: немає // allow-pg-leftover: <reason>
|
|
313
319
|
```
|
|
314
320
|
|
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
package/rules/js-lint/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
|
@@ -54,6 +54,9 @@ export function run(ctx)
|
|
|
54
54
|
### `run(ctx)`
|
|
55
55
|
|
|
56
56
|
```js
|
|
57
|
+
/**
|
|
58
|
+
*
|
|
59
|
+
*/
|
|
57
60
|
export function run(ctx) {
|
|
58
61
|
return runStandardRule(import.meta.dirname, ctx)
|
|
59
62
|
}
|
|
@@ -79,7 +82,7 @@ if (isRunAsCli(import.meta.url)) {
|
|
|
79
82
|
- **Дія:** виконує `await runRuleCli(import.meta.dirname)` — повний CLI-сценарій (config-loading, whitelist, summary), а потім завершує процес `process.exit(<exit-code>)` з тим самим кодом, що повернув `runRuleCli` (0 або 1) — це критично для CI/IDE, які орієнтуються на код виходу.
|
|
80
83
|
- **Side effects:** завершення процесу (`process.exit`), вся I/O `runRuleCli`. Виклики `process.exit` тут спеціально дозволені директивою:
|
|
81
84
|
```js
|
|
82
|
-
|
|
85
|
+
|
|
83
86
|
```
|
|
84
87
|
|
|
85
88
|
## Залежності
|
package/rules/js-lint-ci/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
package/rules/js-mssql/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
|
@@ -252,6 +252,9 @@ const violationsGuard = findUnsafeMssqlInListMissingEmptyGuardInText(content, re
|
|
|
252
252
|
Порушення:
|
|
253
253
|
|
|
254
254
|
```javascript
|
|
255
|
+
/**
|
|
256
|
+
*
|
|
257
|
+
*/
|
|
255
258
|
export async function handler() {
|
|
256
259
|
const pool = new sql.ConnectionPool(config) // створення на кожен запит
|
|
257
260
|
await pool.connect()
|
|
@@ -326,6 +329,9 @@ await sql.query`SELECT * FROM t WHERE id IN (${rawIds.map(Number)})`
|
|
|
326
329
|
Порушення (`missing_guard` — немає `if (!ids.length) throw`):
|
|
327
330
|
|
|
328
331
|
```javascript
|
|
332
|
+
/**
|
|
333
|
+
*
|
|
334
|
+
*/
|
|
329
335
|
async function load(ids) {
|
|
330
336
|
await sql.query`SELECT * FROM t WHERE id IN (${ids})`
|
|
331
337
|
}
|
|
@@ -334,6 +340,9 @@ async function load(ids) {
|
|
|
334
340
|
Не порушення:
|
|
335
341
|
|
|
336
342
|
```javascript
|
|
343
|
+
/**
|
|
344
|
+
*
|
|
345
|
+
*/
|
|
337
346
|
async function load(ids) {
|
|
338
347
|
if (!ids.length) throw new Error('empty')
|
|
339
348
|
await sql.query`SELECT * FROM t WHERE id IN (${ids})`
|
package/rules/js-run/docs/fix.md
CHANGED
package/rules/js-run/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
|
@@ -74,7 +74,8 @@ regex-перевірці підлягає лише сирий рядок із п
|
|
|
74
74
|
Тип `EnvViolation` (внутрішній, описаний через JSDoc `@typedef`):
|
|
75
75
|
|
|
76
76
|
```js
|
|
77
|
-
/**
|
|
77
|
+
/**
|
|
78
|
+
* @typedef {{
|
|
78
79
|
* line: number,
|
|
79
80
|
* name: string,
|
|
80
81
|
* kind: 'process-env' | 'check-env-missing-checkEnv'
|
|
@@ -14,6 +14,7 @@ await new Promise(resolve => setTimeout(resolve, ms))
|
|
|
14
14
|
|
|
15
15
|
```js
|
|
16
16
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
17
|
+
|
|
17
18
|
await sleep(ms)
|
|
18
19
|
```
|
|
19
20
|
|
|
@@ -243,6 +244,9 @@ function walkAst(
|
|
|
243
244
|
import { findPromiseSetTimeoutInText, isPromiseSetTimeoutScanSourceFile } from './promise-settimeout-scan.mjs'
|
|
244
245
|
import { readFile } from 'node:fs/promises'
|
|
245
246
|
|
|
247
|
+
/**
|
|
248
|
+
*
|
|
249
|
+
*/
|
|
246
250
|
async function scanRepo(files) {
|
|
247
251
|
const violations = []
|
|
248
252
|
for (const relPath of files) {
|
package/rules/k8s/docs/fix.md
CHANGED
package/rules/k8s/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|
package/rules/npm-module/fix.mjs
CHANGED
|
@@ -14,6 +14,6 @@ export function run(ctx) {
|
|
|
14
14
|
if (isRunAsCli(import.meta.url)) {
|
|
15
15
|
// Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
|
|
16
16
|
// (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
|
|
17
|
-
// eslint-disable-next-line n/no-process-exit
|
|
17
|
+
// eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
|
|
18
18
|
process.exit(await runRuleCli(import.meta.dirname))
|
|
19
19
|
}
|