@nitra/cursor 1.18.0 → 1.18.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/bin/rename-yaml-extensions.mjs +1 -1
  3. package/package.json +1 -1
  4. package/rules/abie/fix.mjs +1 -1
  5. package/rules/adr/fix.mjs +1 -1
  6. package/rules/bun/fix.mjs +1 -1
  7. package/rules/capacitor/fix.mjs +1 -1
  8. package/rules/changelog/fix.mjs +1 -1
  9. package/rules/ci4/fix.mjs +1 -1
  10. package/rules/docker/fix.mjs +1 -1
  11. package/rules/docker/lint/lint.mjs +1 -1
  12. package/rules/efes/fix.mjs +1 -1
  13. package/rules/feedback/fix.mjs +1 -1
  14. package/rules/ga/fix.mjs +1 -1
  15. package/rules/graphql/fix.mjs +1 -1
  16. package/rules/hasura/fix.mjs +1 -1
  17. package/rules/image-avif/fix.mjs +1 -1
  18. package/rules/image-compress/fix.mjs +1 -1
  19. package/rules/js-bun-db/fix.mjs +1 -1
  20. package/rules/js-bun-redis/fix.mjs +1 -1
  21. package/rules/js-lint/fix.mjs +1 -1
  22. package/rules/js-mssql/fix.mjs +1 -1
  23. package/rules/js-run/fix.mjs +1 -1
  24. package/rules/k8s/fix.mjs +1 -1
  25. package/rules/k8s/lint/lint.mjs +1 -1
  26. package/rules/nginx-default-tpl/fix.mjs +1 -1
  27. package/rules/npm-module/fix.mjs +1 -1
  28. package/rules/php/fix.mjs +1 -1
  29. package/rules/php/lint/lint.mjs +1 -1
  30. package/rules/rego/fix.mjs +1 -1
  31. package/rules/rego/lint/lint.mjs +1 -1
  32. package/rules/rust/fix.mjs +1 -1
  33. package/rules/security/fix.mjs +1 -1
  34. package/rules/style-lint/fix.mjs +1 -1
  35. package/rules/tauri/fix.mjs +1 -1
  36. package/rules/test/fix.mjs +1 -1
  37. package/rules/text/fix.mjs +1 -1
  38. package/rules/text/lint/run-dotenv-linter.mjs +1 -1
  39. package/rules/text/lint/run-shellcheck.mjs +1 -1
  40. package/rules/text/lint/run-v8r.mjs +1 -1
  41. package/rules/vue/fix.mjs +1 -1
  42. package/scripts/cli-entry.mjs +19 -9
  43. package/scripts/lib/run-rule-cli.mjs +5 -11
package/CHANGELOG.md CHANGED
@@ -4,6 +4,16 @@
4
4
 
5
5
  Формат — [Keep a Changelog](https://keepachangelog.com/uk/1.1.0/), нумерація — [SemVer](https://semver.org/lang/uk/).
6
6
 
7
+ ## [1.18.1] - 2026-05-25
8
+
9
+ ### Fixed
10
+
11
+ - **`scripts/cli-entry.mjs::isRunAsCli`** + **`scripts/lib/run-rule-cli.mjs::isRunAsCli`** — функція приймала `()` без аргументів і всередині дивилася на власний `import.meta.url`, а не на caller'а. Через те, що `import.meta` лексично прив'язаний до файлу, де записаний, helper-функція ВСІГДА бачила свій файл — `cli-entry.mjs` / `run-rule-cli.mjs` — і ніколи не дорівнювала `process.argv[1]`. Результат: усі ~40 `if (isRunAsCli())` у `rules/<id>/fix.mjs` / `lint/*.mjs` / `bin/rename-yaml-extensions.mjs` ВСІГДА йшли в else-гілку, і `bun rules/<id>/fix.mjs` мовчки виходив `0` без жодного output'у. `npx @nitra/cursor fix <rule>` → `runFixCommand` → `spawnSync('bun', [fix.mjs])` → exit 0 без жодного reporter-звіту.
12
+ - **Fix:** функція тепер приймає `metaUrl` параметром: `isRunAsCli(import.meta.url)`. Реалізація через `realpathSync(fileURLToPath(metaUrl)) === realpathSync(resolve(process.argv[1]))` — `realpath` знімає різницю «symlink vs canonical» (macOS `/tmp` ↔ `/private/tmp`, pnpm content-addressable links, `node_modules/.bin/*` shim).
13
+ - **Консолідація:** `run-rule-cli.mjs::isRunAsCli` тепер `export { isRunAsCli } from '../cli-entry.mjs'` — одне джерело правди. Existing import paths у callers лишилися без змін.
14
+ - **Callsites:** всі ~40 викликів `isRunAsCli()` оновлено на `isRunAsCli(import.meta.url)`.
15
+ - **Tests:** додано три нові кейси у `scripts/tests/cli-entry.test.mjs` (entry-detection через spawn-fixture, symlink-нормалізація через `/tmp` → `/private/tmp`, no-arg fallback). Fixture — `scripts/tests/fixtures/cli-entry-as-cli.mjs`.
16
+
7
17
  ## [1.18.0] - 2026-05-25
8
18
 
9
19
  ### Added
@@ -34,7 +34,7 @@ export async function runRenameYamlExtensionsCli(argv) {
34
34
  return errors.length > 0 ? 1 : 0
35
35
  }
36
36
 
37
- if (isRunAsCli()) {
37
+ if (isRunAsCli(import.meta.url)) {
38
38
  const code = await runRenameYamlExtensionsCli(process.argv.slice(2))
39
39
  if (code !== 0) {
40
40
  process.exitCode = 1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.18.0",
3
+ "version": "1.18.1",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
package/rules/adr/fix.mjs CHANGED
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
package/rules/bun/fix.mjs CHANGED
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
package/rules/ci4/fix.mjs CHANGED
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -90,6 +90,6 @@ async function runLintDockerSteps() {
90
90
  */
91
91
  export const runLintDocker = () => runStandardLint(import.meta.dirname, runLintDockerSteps)
92
92
 
93
- if (isRunAsCli()) {
93
+ if (isRunAsCli(import.meta.url)) {
94
94
  process.exitCode = await runLintDocker()
95
95
  }
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
package/rules/ga/fix.mjs CHANGED
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
package/rules/k8s/fix.mjs CHANGED
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -354,6 +354,6 @@ async function runLintK8sSteps() {
354
354
  */
355
355
  export const runLintK8s = () => runStandardLint(import.meta.dirname, runLintK8sSteps)
356
356
 
357
- if (isRunAsCli()) {
357
+ if (isRunAsCli(import.meta.url)) {
358
358
  process.exitCode = await runLintK8s()
359
359
  }
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
package/rules/php/fix.mjs CHANGED
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -120,6 +120,6 @@ export function run() {
120
120
  return reporter.getExitCode()
121
121
  }
122
122
 
123
- if (isRunAsCli()) {
123
+ if (isRunAsCli(import.meta.url)) {
124
124
  process.exitCode = run()
125
125
  }
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -143,6 +143,6 @@ export function runLintRegoSteps(cwd = process.cwd()) {
143
143
  */
144
144
  export const runLintRego = () => runStandardLint(import.meta.dirname, () => runLintRegoSteps())
145
145
 
146
- if (isRunAsCli()) {
146
+ if (isRunAsCli(import.meta.url)) {
147
147
  process.exitCode = await runLintRego()
148
148
  }
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -90,6 +90,6 @@ export function runDotenvLinter(cwd = process.cwd()) {
90
90
  return 1
91
91
  }
92
92
 
93
- if (isRunAsCli()) {
93
+ if (isRunAsCli(import.meta.url)) {
94
94
  process.exitCode = runDotenvLinter()
95
95
  }
@@ -215,6 +215,6 @@ function runFinalShellcheck(shellcheck, files, root) {
215
215
  return 1
216
216
  }
217
217
 
218
- if (isRunAsCli()) {
218
+ if (isRunAsCli(import.meta.url)) {
219
219
  process.exitCode = runShellcheckText()
220
220
  }
@@ -76,7 +76,7 @@ export function runV8rWithGlobs(globs = DEFAULT_V8R_GLOBS) {
76
76
  return 0
77
77
  }
78
78
 
79
- if (isRunAsCli()) {
79
+ if (isRunAsCli(import.meta.url)) {
80
80
  const globs = process.argv.length > 2 ? process.argv.slice(2) : DEFAULT_V8R_GLOBS
81
81
  process.exitCode = runV8rWithGlobs(globs)
82
82
  }
package/rules/vue/fix.mjs CHANGED
@@ -11,7 +11,7 @@ export function run(ctx) {
11
11
  return runStandardRule(import.meta.dirname, ctx)
12
12
  }
13
13
 
14
- if (isRunAsCli()) {
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
17
  // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
@@ -1,23 +1,33 @@
1
1
  /**
2
2
  * Визначення, чи виконується поточний ESM-модуль як точка входу CLI, а не як import у тестах чи інших модулях.
3
3
  *
4
- * Порівняння `import.meta.url` з `process.argv[1]` після `resolve`, щоб `bun path/to/script.mjs`
5
- * і `node path/to/script.mjs` коректно вважалися прямим запуском.
4
+ * Прийом: модуль, що хоче знати свій статус, передає `import.meta.url`
5
+ * `import.meta` лексично прив'язаний до файлу, де він записаний, тому helper-функція
6
+ * без аргументу неминуче дивилася б на свій файл, а не на caller. `realpathSync` на обох
7
+ * сторонах знімає різницю «symlink vs canonical» (macOS `/tmp` ↔ `/private/tmp`,
8
+ * `node_modules/.bin/*` shim, pnpm-style content-addressable links).
6
9
  */
10
+ import { realpathSync } from 'node:fs'
7
11
  import { resolve } from 'node:path'
8
12
  import { fileURLToPath } from 'node:url'
9
13
 
10
14
  /**
11
15
  * Чи виконується модуль як точка входу CLI (прямий запуск), а не через import.
12
- * @returns {boolean} `true`, якщо файл запущено напряму; інакше `false`.
16
+ * @param {string | URL} [metaUrl] `import.meta.url` модуля-caller'а. Без нього завжди `false`.
17
+ * @returns {boolean} `true`, якщо файл, з якого передано `metaUrl`, є `process.argv[1]`.
13
18
  */
14
- export function isRunAsCli() {
19
+ export function isRunAsCli(metaUrl) {
20
+ if (!metaUrl) {
21
+ return false
22
+ }
23
+ const entry = process.argv[1]
24
+ if (!entry) {
25
+ return false
26
+ }
15
27
  try {
16
- const entry = process.argv[1]
17
- if (!entry) {
18
- return false
19
- }
20
- return fileURLToPath(import.meta.url) === resolve(entry)
28
+ const callerPath = realpathSync(fileURLToPath(metaUrl))
29
+ const entryPath = realpathSync(resolve(entry))
30
+ return callerPath === entryPath
21
31
  } catch {
22
32
  return false
23
33
  }
@@ -7,23 +7,17 @@
7
7
  * Library-mode виклик з CLI orchestration — інше: див. `runStandardRule` + `fix.mjs::run(ctx)`.
8
8
  */
9
9
  import { basename } from 'node:path'
10
- import { pathToFileURL } from 'node:url'
11
10
 
12
11
  import { isRuleEnabled, readNCursorConfigLite } from './read-n-cursor-config-lite.mjs'
13
12
  import { runStandardRule } from './run-standard-rule.mjs'
14
13
  import { getOrCreateWalkCache } from '../utils/walk-cache.mjs'
15
14
 
16
- const PACKAGE_NAME = '@nitra/cursor'
15
+ // Re-export для зворотної сумісності: уся `rules/<id>/fix.mjs` уже імпортує `isRunAsCli`
16
+ // саме звідси. Канонічна реалізація — у `scripts/cli-entry.mjs`. Caller передає
17
+ // `import.meta.url`: `if (isRunAsCli(import.meta.url)) …`.
18
+ export { isRunAsCli } from '../cli-entry.mjs'
17
19
 
18
- /**
19
- * Чи поточний модуль запущено як CLI entry-point (`bun rules/<id>/fix.mjs`).
20
- * @returns {boolean} true, коли `import.meta.url` збігається з `process.argv[1]`
21
- */
22
- export function isRunAsCli() {
23
- const entry = process.argv[1]
24
- if (!entry) return false
25
- return import.meta.url === pathToFileURL(entry).href
26
- }
20
+ const PACKAGE_NAME = '@nitra/cursor'
27
21
 
28
22
  /**
29
23
  * @param {string} ruleDir абсолютний шлях до `rules/<id>/`