@nitra/cursor 5.0.3 → 5.2.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.
Files changed (206) hide show
  1. package/.claude-template/settings.template.json +22 -0
  2. package/.pi-template/extensions/n-cursor-adr/docs/index.md +15 -9
  3. package/CHANGELOG.md +18 -1
  4. package/bin/n-cursor.js +73 -16
  5. package/docs/stryker.config.md +6 -0
  6. package/docs/vitest.config.md +6 -0
  7. package/lib/docs/llm.md +29 -0
  8. package/lib/docs/omlx.md +32 -0
  9. package/lib/llm.mjs +137 -0
  10. package/lib/models.mjs +9 -1
  11. package/lib/omlx.mjs +147 -0
  12. package/package.json +1 -1
  13. package/rules/abie/docs/fix.md +6 -0
  14. package/rules/abie/js/docs/applies.md +6 -0
  15. package/rules/abie/js/docs/env_dns.md +25 -22
  16. package/rules/abie/js/docs/firebase_hosting.md +6 -0
  17. package/rules/abie/js/docs/hc_pairing.md +21 -25
  18. package/rules/abie/js/docs/ua_http_route.md +27 -19
  19. package/rules/abie/js/docs/ua_node_selector.md +24 -19
  20. package/rules/abie/lib/docs/enabled.md +13 -7
  21. package/rules/abie/lib/docs/env-dns.md +9 -3
  22. package/rules/abie/lib/docs/hc-yaml.md +6 -0
  23. package/rules/abie/lib/docs/http-route.md +6 -0
  24. package/rules/abie/lib/docs/k8s-tree.md +6 -0
  25. package/rules/abie/lib/docs/kustomization-patches.md +6 -0
  26. package/rules/abie/lib/docs/overlay-paths.md +6 -0
  27. package/rules/abie/lib/docs/yaml.md +6 -0
  28. package/rules/adr/docs/fix.md +6 -0
  29. package/rules/adr/js/docs/hooks.md +29 -244
  30. package/rules/bun/docs/fix.md +6 -0
  31. package/rules/bun/js/docs/layout.md +37 -375
  32. package/rules/capacitor/docs/fix.md +22 -108
  33. package/rules/capacitor/js/docs/platforms.md +62 -268
  34. package/rules/changelog/docs/fix.md +6 -0
  35. package/rules/changelog/lib/docs/package-manifest.md +6 -0
  36. package/rules/ci4/docs/fix.md +23 -165
  37. package/rules/ci4/js/docs/marksman_config.md +9 -1
  38. package/rules/docker/docs/fix.md +6 -0
  39. package/rules/docker/js/docs/lint.md +55 -239
  40. package/rules/docker/lib/docs/docker-hadolint.md +6 -0
  41. package/rules/docker/lib/docs/docker-mirror.md +6 -0
  42. package/rules/docker/lib/docs/docker-native-addon.md +6 -0
  43. package/rules/docker/lib/docs/docker-nginx-user.md +6 -0
  44. package/rules/docker/lint/docs/lint.md +9 -1
  45. package/rules/efes/docs/fix.md +6 -0
  46. package/rules/ga/lint/docs/lint.md +6 -0
  47. package/rules/graphql/docs/fix.md +6 -0
  48. package/rules/graphql/lib/docs/graphql-gql-scan.md +6 -0
  49. package/rules/image-avif/docs/fix.md +6 -0
  50. package/rules/image-avif/js/docs/avif_generation.md +6 -0
  51. package/rules/js-bun-db/lib/docs/bun-sql-scan.md +9 -3
  52. package/rules/js-bun-redis/lib/docs/redis-imports.md +6 -0
  53. package/rules/js-lint/js/docs/utils_imports.md +6 -0
  54. package/rules/js-lint-ci/docs/fix.md +7 -1
  55. package/rules/js-mssql/docs/fix.md +6 -0
  56. package/rules/js-mssql/lib/docs/mssql-pool-scan.md +6 -0
  57. package/rules/js-run/docs/fix.md +6 -0
  58. package/rules/js-run/lib/docs/bunyan-imports.md +6 -0
  59. package/rules/js-run/lib/docs/check-env-scan.md +6 -0
  60. package/rules/js-run/lib/docs/conn-file-rules.md +6 -0
  61. package/rules/js-run/lib/docs/conn-imports-scan.md +6 -0
  62. package/rules/js-run/lib/docs/promise-settimeout-scan.md +6 -0
  63. package/rules/js-run/lib/docs/temporal-scan.md +6 -0
  64. package/rules/k8s/docs/fix.md +6 -0
  65. package/rules/k8s/lint/docs/lint.md +6 -0
  66. package/rules/nginx-default-tpl/docs/fix.md +6 -0
  67. package/rules/npm-module/js/docs/header_doc_pointer.md +7 -0
  68. package/rules/npm-module/js/header_doc_pointer.mjs +2 -8
  69. package/rules/php/docs/fix.md +6 -0
  70. package/rules/php/lint/docs/lint.md +6 -0
  71. package/rules/python/docs/fix.md +6 -0
  72. package/rules/python/lint/docs/lint.md +6 -0
  73. package/rules/rego/lint/docs/lint.md +6 -0
  74. package/rules/release/docs/change.md +6 -0
  75. package/rules/release/docs/fix.md +6 -0
  76. package/rules/release/docs/release.md +6 -0
  77. package/rules/release/lib/docs/aggregate.md +6 -0
  78. package/rules/release/lib/docs/change-file.md +6 -0
  79. package/rules/release/lib/docs/fallback.md +6 -0
  80. package/rules/rust/lib/docs/has-cargo-toml.md +6 -0
  81. package/rules/security/docs/fix.md +7 -1
  82. package/rules/security/js/docs/lint.md +6 -0
  83. package/rules/style-lint/docs/fix.md +6 -0
  84. package/rules/tauri/docs/fix.md +6 -0
  85. package/rules/test/docs/fix.md +6 -0
  86. package/rules/test/js/data/stryker_config/docs/stryker-vue-macros-ignorer.md +6 -0
  87. package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +6 -0
  88. package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +6 -0
  89. package/rules/test/js/data/vitest_config/docs/vitest.config.baseline.md +6 -0
  90. package/rules/text/docs/fix.md +6 -0
  91. package/rules/text/lint/docs/lint.md +6 -0
  92. package/rules/text/lint/docs/run-dotenv-linter.md +6 -0
  93. package/rules/text/lint/docs/run-shellcheck.md +6 -0
  94. package/rules/text/lint/docs/run-v8r.md +6 -0
  95. package/rules/vue/lib/docs/vue-forbidden-imports.md +6 -0
  96. package/scripts/coverage-classify/cache.mjs +1 -1
  97. package/scripts/coverage-classify/docs/apply.md +6 -0
  98. package/scripts/coverage-classify/docs/cache.md +6 -0
  99. package/scripts/coverage-classify/docs/prompt.md +6 -0
  100. package/scripts/coverage-classify/docs/verdict-schema.md +6 -0
  101. package/scripts/coverage-classify/index.mjs +24 -15
  102. package/scripts/coverage-classify/prompt.mjs +1 -1
  103. package/scripts/coverage-fix-extract.mjs +1 -1
  104. package/scripts/coverage-fix.mjs +2 -1
  105. package/scripts/docs/auto-skills.md +6 -0
  106. package/scripts/docs/build-agents-commands.md +7 -1
  107. package/scripts/docs/cli-entry.md +6 -0
  108. package/scripts/docs/coverage-fix-extract.md +6 -0
  109. package/scripts/docs/coverage-fix.md +6 -0
  110. package/scripts/docs/ensure-nitra-cursor-dev-dependencies.md +6 -0
  111. package/scripts/docs/lint-cli.md +6 -0
  112. package/scripts/docs/post-tool-use-fix.md +6 -0
  113. package/scripts/docs/rename-yaml-extensions.md +6 -0
  114. package/scripts/docs/skills-cli.md +6 -0
  115. package/scripts/docs/sync-setup-bun-deps-action.md +6 -0
  116. package/scripts/docs/upgrade-nitra-cursor-and-install.md +6 -0
  117. package/scripts/docs/worktree-cli.md +6 -0
  118. package/scripts/lib/docs/assert-project-root.md +6 -0
  119. package/scripts/lib/docs/check-mdc-template-refs.md +6 -0
  120. package/scripts/lib/docs/check-reporter.md +6 -0
  121. package/scripts/lib/docs/diff-added-lines.md +6 -0
  122. package/scripts/lib/docs/discover-check-rules-from-cursor.md +6 -0
  123. package/scripts/lib/docs/discover-checkable-rules.md +6 -0
  124. package/scripts/lib/docs/ensure-tool.md +6 -0
  125. package/scripts/lib/docs/generated-markdown.md +6 -0
  126. package/scripts/lib/docs/gha-workflow.md +6 -0
  127. package/scripts/lib/docs/inline-template-links.md +6 -0
  128. package/scripts/lib/docs/list-rule-ids.md +6 -0
  129. package/scripts/lib/docs/load-cursor-config.md +6 -0
  130. package/scripts/lib/docs/mirror-parity.md +6 -0
  131. package/scripts/lib/docs/read-n-cursor-config-lite.md +6 -0
  132. package/scripts/lib/docs/resolve-target-files.md +6 -0
  133. package/scripts/lib/docs/root-notice.md +6 -0
  134. package/scripts/lib/docs/rule-meta-helpers.md +6 -0
  135. package/scripts/lib/docs/rule-meta.md +6 -0
  136. package/scripts/lib/docs/run-conftest-batch.md +6 -0
  137. package/scripts/lib/docs/run-lint-step.md +6 -0
  138. package/scripts/lib/docs/run-rule-cli.md +6 -0
  139. package/scripts/lib/docs/run-rule.md +6 -0
  140. package/scripts/lib/docs/run-standard-lint.md +6 -0
  141. package/scripts/lib/docs/run-standard-rule.md +6 -0
  142. package/scripts/lib/docs/skill-meta.md +6 -0
  143. package/scripts/lib/docs/template.md +6 -0
  144. package/scripts/lib/docs/timing-summary.md +6 -0
  145. package/scripts/lib/docs/workspaces.md +6 -0
  146. package/scripts/lib/docs/worktree-notice.md +6 -0
  147. package/scripts/lib/docs/worktree.md +6 -0
  148. package/scripts/lib/mirror-parity.mjs +1 -1
  149. package/scripts/lib/root-notice.mjs +1 -1
  150. package/scripts/lib/worktree-notice.mjs +5 -5
  151. package/scripts/lib/worktree.mjs +1 -1
  152. package/scripts/sync-claude-config.mjs +3 -0
  153. package/scripts/utils/docs/ast-scan-utils.md +6 -0
  154. package/scripts/utils/docs/ensure-gitignore-entries.md +6 -0
  155. package/scripts/utils/docs/find-package-json-paths.md +6 -0
  156. package/scripts/utils/docs/lock-cache-dir.md +6 -0
  157. package/scripts/utils/docs/pass.md +6 -0
  158. package/scripts/utils/docs/resolve-cargo-manifest.md +6 -0
  159. package/scripts/utils/docs/resolve-cmd.md +6 -0
  160. package/scripts/utils/docs/resolve-js-root.md +6 -0
  161. package/scripts/utils/docs/test-helpers.md +6 -0
  162. package/scripts/utils/docs/walk-cache.md +6 -0
  163. package/scripts/utils/docs/walkDir.md +6 -0
  164. package/scripts/utils/docs/worktree-fingerprint.md +6 -0
  165. package/scripts/utils/resolve-js-root.mjs +1 -1
  166. package/skills/doc-aggregate/SKILL.md +129 -0
  167. package/skills/doc-aggregate/js/docgen-ignore.mjs +9 -0
  168. package/skills/{docgen → doc-aggregate}/js/docgen-scan.mjs +22 -67
  169. package/skills/doc-aggregate/js/docs/docgen-ignore.md +21 -0
  170. package/skills/doc-files/SKILL.md +100 -0
  171. package/skills/doc-files/js/docgen-crc.mjs +164 -0
  172. package/skills/{docgen → doc-files}/js/docgen-extract-anchors.mjs +24 -15
  173. package/skills/{docgen → doc-files}/js/docgen-extract.mjs +15 -9
  174. package/skills/doc-files/js/docgen-files-batch.mjs +181 -0
  175. package/skills/doc-files/js/docgen-gen.mjs +291 -0
  176. package/skills/{docgen → doc-files}/js/docgen-prompts.mjs +43 -40
  177. package/skills/doc-files/js/docgen-scan.mjs +298 -0
  178. package/skills/doc-files/js/docs/docgen-crc.md +32 -0
  179. package/skills/doc-files/js/docs/docgen-extract-anchors.md +27 -0
  180. package/skills/doc-files/js/docs/docgen-extract.md +29 -0
  181. package/skills/doc-files/js/docs/docgen-files-batch.md +25 -0
  182. package/skills/doc-files/js/docs/docgen-gen.md +30 -0
  183. package/skills/doc-files/js/docs/docgen-prompts.md +32 -0
  184. package/skills/doc-files/js/docs/docgen-scan.md +25 -0
  185. package/skills/doc-files/meta.json +1 -0
  186. package/skills/fix/js/docs/llm-worker.md +6 -0
  187. package/skills/fix/js/docs/orchestrator.md +6 -0
  188. package/skills/fix/js/llm-worker.mjs +23 -14
  189. package/skills/fix/js/orchestrator.mjs +1 -1
  190. package/skills/start-check/js/check.mjs +5 -3
  191. package/skills/start-check/js/docs/check.md +6 -0
  192. package/skills/docgen/SKILL.md +0 -224
  193. package/skills/docgen/bench/etalon/firebase_hosting.md +0 -19
  194. package/skills/docgen/bench/etalon/k8s-tree.md +0 -24
  195. package/skills/docgen/bench/etalon/overlay-paths.md +0 -24
  196. package/skills/docgen/js/docgen-batch-omlx.mjs +0 -82
  197. package/skills/docgen/js/docgen-batch.mjs +0 -95
  198. package/skills/docgen/js/docgen-compare-pi-vs-direct.mjs +0 -95
  199. package/skills/docgen/js/docgen-gen.mjs +0 -339
  200. package/skills/docgen/js/docs/docgen-extract.md +0 -28
  201. package/skills/docgen/js/docs/docgen-gen.md +0 -41
  202. package/skills/docgen/js/docs/docgen-ignore.md +0 -24
  203. package/skills/docgen/js/docs/docgen-prompts.md +0 -24
  204. package/skills/docgen/js/docs/docgen-scan.md +0 -48
  205. /package/skills/{docgen → doc-aggregate}/meta.json +0 -0
  206. /package/skills/{docgen → doc-files}/js/docgen-ignore.mjs +0 -0
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/js-run/lib/conn-imports-scan.mjs
4
+ crc: 5234d8ba
5
+ ---
6
+
1
7
  # conn-imports-scan.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/js-run/lib/promise-settimeout-scan.mjs
4
+ crc: a7cea379
5
+ ---
6
+
1
7
  # promise-settimeout-scan.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/js-run/lib/temporal-scan.mjs
4
+ crc: 5b15b070
5
+ ---
6
+
1
7
  # temporal-scan.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/k8s/fix.mjs
4
+ crc: 12fc1644
5
+ ---
6
+
1
7
  # fix.mjs — точка входу правила `k8s`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/k8s/lint/lint.mjs
4
+ crc: b6119c36
5
+ ---
6
+
1
7
  # lint.mjs — лінт Kubernetes-маніфестів (kubeconform + kubescape)
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/nginx-default-tpl/fix.mjs
4
+ crc: 12fc1644
5
+ ---
6
+
1
7
  # `fix.mjs` — точка входу правила `nginx-default-tpl`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/npm-module/js/header_doc_pointer.mjs
4
+ crc: 9058c4ea
5
+ ---
6
+
1
7
  # header_doc_pointer.mjs
2
8
 
3
9
  ## Огляд
@@ -13,6 +19,7 @@
13
19
  5. Рахує непорожні змістовні рядки блоку (після зрізання відступу `*`). Більше одного → порушення.
14
20
 
15
21
  Допустимі форми при наявних docs:
22
+
16
23
  - відсутній module-level JSDoc (0 рядків)
17
24
  - `/** @see ./docs/<stem>.md */` (1 рядок)
18
25
  - `/** Контракт: ./docs/<stem>.md */` (1 рядок)
@@ -26,8 +26,7 @@ function contentLineCount(block) {
26
26
  return block
27
27
  .split('\n')
28
28
  .slice(1, -1)
29
- .filter(l => NON_WHITESPACE_RE.test(l.replace(STAR_INDENT_RE, '')))
30
- .length
29
+ .filter(l => NON_WHITESPACE_RE.test(l.replace(STAR_INDENT_RE, ''))).length
31
30
  }
32
31
 
33
32
  /**
@@ -63,12 +62,7 @@ export async function check(cwd = process.cwd()) {
63
62
  if (!existsSync(jsDir)) continue
64
63
 
65
64
  for (const fileEntry of await readdir(jsDir, { withFileTypes: true })) {
66
- if (
67
- !fileEntry.isFile() ||
68
- !fileEntry.name.endsWith('.mjs') ||
69
- fileEntry.name.endsWith('.test.mjs')
70
- )
71
- continue
65
+ if (!fileEntry.isFile() || !fileEntry.name.endsWith('.mjs') || fileEntry.name.endsWith('.test.mjs')) continue
72
66
 
73
67
  const stem = basename(fileEntry.name, '.mjs')
74
68
  const docsPath = join(jsDir, 'docs', `${stem}.md`)
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/php/fix.mjs
4
+ crc: 12fc1644
5
+ ---
6
+
1
7
  # fix.mjs — правило `php`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/php/lint/lint.mjs
4
+ crc: cafd914f
5
+ ---
6
+
1
7
  # lint.mjs — PHP lint runner
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/python/fix.mjs
4
+ crc: 12fc1644
5
+ ---
6
+
1
7
  # fix.mjs — entry-point правила `python`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/python/lint/lint.mjs
4
+ crc: 92c8f115
5
+ ---
6
+
1
7
  # `lint.mjs` — лінт-крок `lint-python`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/rego/lint/lint.mjs
4
+ crc: 1059537a
5
+ ---
6
+
1
7
  # lint.mjs — Лінт Rego-полісі (`opa` + `regal` + опційний `conftest`)
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/release/change.mjs
4
+ crc: 1ff4f816
5
+ ---
6
+
1
7
  # `change.mjs` — створення одного change-файлу
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/release/fix.mjs
4
+ crc: 0508fb5e
5
+ ---
6
+
1
7
  # fix.mjs — точка входу правила `release`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/release/release.mjs
4
+ crc: b2b02de4
5
+ ---
6
+
1
7
  # `release.mjs` — оркестратор реліз-процесу `n-cursor release`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/release/lib/aggregate.mjs
4
+ crc: 1f78a0fe
5
+ ---
6
+
1
7
  # aggregate.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/release/lib/change-file.mjs
4
+ crc: 9284bc96
5
+ ---
6
+
1
7
  # `change-file.mjs`
2
8
 
3
9
  Модуль для роботи з одиничним **change-файлом** релізного процесу — невеликою markdown-нотаткою, що описує одну зміну в межах workspace і агрегується пізніше при формуванні CHANGELOG / bump версії.
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/release/lib/fallback.mjs
4
+ crc: 99eb10bc
5
+ ---
6
+
1
7
  # fallback.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/rust/lib/has-cargo-toml.mjs
4
+ crc: f55fc57e
5
+ ---
6
+
1
7
  # has-cargo-toml.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/security/fix.mjs
4
+ crc: 12fc1644
5
+ ---
6
+
1
7
  # fix.mjs — entry-point правила `security`
2
8
 
3
9
  ## Огляд
@@ -74,7 +80,7 @@ export function run(ctx)
74
80
  Рядок із `process.exit(await runRuleCli(...))` має локальну директиву:
75
81
 
76
82
  ```js
77
-
83
+
78
84
  ```
79
85
 
80
86
  Це свідома відмова від загальної заборони `process.exit`: для CLI entry-point потрібно повертати числовий код, інакше CI/IDE не зможуть розрізнити OK і порушення. Заборона залишається активною для решти кодової бази.
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/security/js/lint.mjs
4
+ crc: f3265f82
5
+ ---
6
+
1
7
  # lint.mjs — Security: TruffleHog filesystem scan
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/style-lint/fix.mjs
4
+ crc: 12fc1644
5
+ ---
6
+
1
7
  # fix.mjs — точка входу правила `style-lint`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/tauri/fix.mjs
4
+ crc: 12fc1644
5
+ ---
6
+
1
7
  # fix.mjs — entry-point правила `tauri`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/test/fix.mjs
4
+ crc: 12fc1644
5
+ ---
6
+
1
7
  # fix.mjs — правило `test`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/test/js/data/stryker_config/stryker-vue-macros-ignorer.mjs
4
+ crc: 30a5e9f9
5
+ ---
6
+
1
7
  # stryker-vue-macros-ignorer.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/test/js/data/stryker_config/stryker.config.baseline.mjs
4
+ crc: 6271a5ad
5
+ ---
6
+
1
7
  # stryker.config.baseline.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/test/js/data/stryker_config/stryker.config.vue.baseline.mjs
4
+ crc: a1405dc2
5
+ ---
6
+
1
7
  # stryker.config.vue.baseline.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/test/js/data/vitest_config/vitest.config.baseline.js
4
+ crc: d32a8e2d
5
+ ---
6
+
1
7
  # vitest.config.baseline.js
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/text/fix.mjs
4
+ crc: 12fc1644
5
+ ---
6
+
1
7
  # fix.mjs — entry-point правила `text`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/text/lint/lint.mjs
4
+ crc: 05f3f108
5
+ ---
6
+
1
7
  # `lint.mjs` — CLI-обгортка `lint-text`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/text/lint/run-dotenv-linter.mjs
4
+ crc: 8bb94af4
5
+ ---
6
+
1
7
  # run-dotenv-linter.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/text/lint/run-shellcheck.mjs
4
+ crc: e6fa8c23
5
+ ---
6
+
1
7
  # run-shellcheck.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/text/lint/run-v8r.mjs
4
+ crc: caf707a8
5
+ ---
6
+
1
7
  # run-v8r.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/rules/vue/lib/vue-forbidden-imports.mjs
4
+ crc: 946eb1a6
5
+ ---
6
+
1
7
  # vue-forbidden-imports.mjs
2
8
 
3
9
  ## Огляд
@@ -29,7 +29,7 @@ export function deriveBlobHash(filePath) {
29
29
  return execFileSync('git', ['hash-object', filePath], { encoding: 'utf8' }).trim()
30
30
  } catch {
31
31
  const content = readFileSync(filePath)
32
- return createHash('sha1').update(content).digest('hex')
32
+ return createHash('sha256').update(content).digest('hex')
33
33
  }
34
34
  }
35
35
 
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/coverage-classify/apply.mjs
4
+ crc: 0f54e6a0
5
+ ---
6
+
1
7
  # apply.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/coverage-classify/cache.mjs
4
+ crc: 53b251b1
5
+ ---
6
+
1
7
  # cache.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/coverage-classify/prompt.mjs
4
+ crc: 12bfb99a
5
+ ---
6
+
1
7
  # prompt.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/coverage-classify/verdict-schema.mjs
4
+ crc: 8a2c0df1
5
+ ---
6
+
1
7
  # verdict-schema.mjs
2
8
 
3
9
  ## Огляд
@@ -3,14 +3,19 @@
3
3
  *
4
4
  * Routing:
5
5
  * 1. Cache lookup → hit → використати збережений verdict.
6
- * 2. Cache miss → Tier 1 (LOCAL_MIN через pi) → parseVerdict.
7
- * 3. Tier 1 fail (pi error / bad JSON / Zod) → Tier 2 (CLOUD_MIN через pi).
6
+ * 2. Cache miss → Tier 1 (resolveModel('min')) → parseVerdict.
7
+ * 3. Tier 1 fail (model error / bad JSON / Zod) → Tier 2 (CLOUD_MIN через pi).
8
8
  * 4. Tier 2 fail → conservative fallback worth-testing/confidence=0.
9
+ *
10
+ * Бекенд обирається за model-id: `omlx/...` → прямий HTTP до omlx (локально),
11
+ * решта → pi CLI. Якщо omlx-Tier 1 недоступний, помилка падає в той самий catch
12
+ * і класифікація відкочується на хмарний Tier 2 через pi.
9
13
  */
10
14
  import { spawnSync } from 'node:child_process'
11
15
  import { join } from 'node:path'
12
16
 
13
17
  import { CLOUD_MIN, resolveModel } from '../../lib/models.mjs'
18
+ import { callOmlx, isOmlxModel } from '../../lib/omlx.mjs'
14
19
  import { deriveCacheKey, readCache, writeCache } from './cache.mjs'
15
20
  import { buildUserPrompt, SYSTEM_PROMPT } from './prompt.mjs'
16
21
  import { parseVerdict } from './verdict-schema.mjs'
@@ -22,13 +27,17 @@ const FALLBACK_VERDICT = {
22
27
  }
23
28
 
24
29
  /**
25
- * Викликає pi і повертає raw stdout.
30
+ * Викликає LLM за model-id і повертає raw текст відповіді.
31
+ * `omlx/...` → прямий HTTP до omlx (text-only); решта → pi CLI.
26
32
  * @param {string} prompt текст промпта
27
- * @param {string} model provider/model-id або '' для pi-дефолту
28
- * @returns {string} stdout pi-процесу
29
- * @throws якщо pi не знайдено або повертає ненульовий exit code
33
+ * @param {string} model provider/model-id, `omlx/...` або '' для pi-дефолту
34
+ * @returns {string} текст відповіді моделі
35
+ * @throws якщо backend недоступний або повертає помилку
30
36
  */
31
- function callPi(prompt, model) {
37
+ function callModel(prompt, model) {
38
+ if (isOmlxModel(model)) {
39
+ return callOmlx([{ role: 'user', content: prompt }], model, { timeoutMs: 60_000 })
40
+ }
32
41
  const modelArgs = model ? ['--model', model] : []
33
42
  const r = spawnSync('pi', ['-p', prompt, ...modelArgs, '--no-session', '--mode', 'text', '--no-tools'], {
34
43
  encoding: 'utf8',
@@ -44,21 +53,21 @@ function callPi(prompt, model) {
44
53
  * @param {{file: string, mutants: object[]}} group група мутантів одного файлу
45
54
  * @param {object} mutant конкретний мутант
46
55
  * @param {string} cwd корінь проєкту
47
- * @param {(prompt: string, model: string) => string} callPiFn ін'єкція для тестів
56
+ * @param {(prompt: string, model: string) => string} callModelFn ін'єкція для тестів
48
57
  * @returns {object} verdict класифікації
49
58
  */
50
- function classifyOne(group, mutant, cwd, callPiFn) {
59
+ function classifyOne(group, mutant, cwd, callModelFn) {
51
60
  const prompt = `${SYSTEM_PROMPT}\n\n${buildUserPrompt({ ...mutant, file: group.file }, cwd)}`
52
61
  const loc = `${group.file}:${mutant.line}:${mutant.col}`
53
62
 
54
63
  // Tier 1: resolveModel('min') — каскад local→cloud якщо локалі нема
55
64
  try {
56
- const text = callPiFn(prompt, resolveModel('min'))
65
+ const text = callModelFn(prompt, resolveModel('min'))
57
66
  return parseVerdict(text)
58
67
  } catch {
59
68
  // Tier 2: CLOUD_MIN
60
69
  try {
61
- const text = callPiFn(prompt, CLOUD_MIN)
70
+ const text = callModelFn(prompt, CLOUD_MIN)
62
71
  return parseVerdict(text)
63
72
  } catch (error) {
64
73
  console.warn(`⚠ coverage classify: ${loc} both tiers failed: ${error.message}`)
@@ -68,15 +77,15 @@ function classifyOne(group, mutant, cwd, callPiFn) {
68
77
  }
69
78
 
70
79
  /**
71
- * Класифікує survived мутантів через pi (LOCAL_MIN → CLOUD_MIN → fallback).
80
+ * Класифікує survived мутантів (resolveModel('min') → CLOUD_MIN → fallback).
72
81
  * @param {Array<{file: string, mutants: object[], exampleTest?: object|null, recommendationText?: string|null}>} survived список вцілілих мутантів
73
82
  * @param {string} cwd корінь проєкту
74
- * @param {{cachePath?: string, callPi?: Function}} [opts] ін'єкції для тестів
83
+ * @param {{cachePath?: string, callModel?: Function}} [opts] ін'єкції для тестів
75
84
  * @returns {Promise<Array<{key: string, verdict: object}>>} verdicts
76
85
  */
77
86
  export function classify(survived, cwd, opts = {}) {
78
87
  const cachePath = opts.cachePath ?? join(cwd, 'npm/reports/coverage-classify.cache.json')
79
- const callPiFn = opts.callPi ?? callPi
88
+ const callModelFn = opts.callModel ?? callModel
80
89
  const cacheModel = `${resolveModel('min') || 'default'}+${CLOUD_MIN || 'cloud'}`
81
90
 
82
91
  const cache = readCache(cachePath)
@@ -102,7 +111,7 @@ export function classify(survived, cwd, opts = {}) {
102
111
  }
103
112
  }
104
113
  if (!verdict) {
105
- verdict = classifyOne(group, mutant, cwd, callPiFn)
114
+ verdict = classifyOne(group, mutant, cwd, callModelFn)
106
115
  if (cacheKey) {
107
116
  cache.entries[cacheKey] = { ...verdict, classifiedAt: new Date().toISOString() }
108
117
  }
@@ -55,7 +55,7 @@ worth-testing with low confidence instead of glue/wrapper.
55
55
  */
56
56
  function extractTestTitles(content) {
57
57
  const titles = []
58
- for (const match of content.matchAll(/^\s*(describe|test|it)\(['"`](.+?)['"`]/gmu)) {
58
+ for (const match of content.matchAll(/^[ \t]{0,16}(describe|test|it)\(['"`](.{1,300}?)['"`]/gmu)) {
59
59
  titles.push(`${match[1]}: ${match[2]}`)
60
60
  }
61
61
  return titles.join('\n') || '(no describe/test blocks found)'
@@ -27,7 +27,7 @@ const SURVIVED_SECTION = '## Вцілілі мутанти'
27
27
  * захоплюється в групу 1 — renderMarkdown пише 3, але oxfmt підвищує до 4+, коли
28
28
  * сам JSON-вміст містить ``` (типово для original/replacement мутантів).
29
29
  */
30
- const FENCE_OPEN_RE = /(`{3,})json[^\n]*\n/
30
+ const FENCE_OPEN_RE = /(`{3,8})json[^\n]{0,200}\n/
31
31
 
32
32
  /**
33
33
  * Витягує JSON-масив вцілілих мутантів із тексту COVERAGE.md: знаходить секцію
@@ -9,10 +9,11 @@
9
9
  import { readFile } from 'node:fs/promises'
10
10
  import { join } from 'node:path'
11
11
  import { spawnSync } from 'node:child_process'
12
+ import { env } from 'node:process'
12
13
 
13
14
  import { resolveModel } from '../lib/models.mjs'
14
15
 
15
- const MODEL = process.env.N_CURSOR_COVERAGE_FIX_MODEL ?? resolveModel('max')
16
+ const MODEL = env.N_CURSOR_COVERAGE_FIX_MODEL ?? resolveModel('max')
16
17
 
17
18
  /**
18
19
  * @typedef {{line:number, col:number, mutantType:string, original:string, replacement:string}} MutantDetail
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/auto-skills.mjs
4
+ crc: 44328898
5
+ ---
6
+
1
7
  # `auto-skills.mjs`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/build-agents-commands.mjs
4
+ crc: 5a4cde2f
5
+ ---
6
+
1
7
  # build-agents-commands.mjs
2
8
 
3
9
  ## Огляд
@@ -154,7 +160,7 @@ const items = await buildAgentsCommandBulletItems(process.cwd())
154
160
 
155
161
  ```js
156
162
  import { buildAgentsCommandBulletItems } from '/абсолютний/шлях/до/build-agents-commands.mjs'
157
-
163
+
158
164
  const items = await buildAgentsCommandBulletItems('/абсолютний/шлях/до/тимчасової/теки')
159
165
  console.log(items)
160
166
  ```
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/cli-entry.mjs
4
+ crc: b51b5d0a
5
+ ---
6
+
1
7
  # `cli-entry.mjs`
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/coverage-fix-extract.mjs
4
+ crc: a7f39f0e
5
+ ---
6
+
1
7
  # coverage-fix-extract.mjs
2
8
 
3
9
  ## Огляд
@@ -1,3 +1,9 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/coverage-fix.mjs
4
+ crc: 7f0568dd
5
+ ---
6
+
1
7
  # coverage-fix.mjs
2
8
 
3
9
  ## Огляд