@nitra/cursor 1.27.2 → 1.27.3

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 CHANGED
@@ -4,6 +4,17 @@
4
4
 
5
5
  Формат — [Keep a Changelog](https://keepachangelog.com/uk/1.1.0/), нумерація — [SemVer](https://semver.org/lang/uk/).
6
6
 
7
+ ## [1.27.3] - 2026-05-26
8
+
9
+ ### Fixed
10
+
11
+ - **`js-lint` coverage provider `detect()`**: у workspace-проєктах (типовий bun monorepo з hoisted node_modules і `npm-module` правилом, що забороняє devDeps у published workspace-у) перевіряємо `vitest` як у JS-root `package.json`, так і у кореневому. Раніше `detect()` повертав false у monorepo, де vitest коректно живе у кореневому `devDependencies` — `n-cursor coverage` мовчки виходив із «0 провайдерів».
12
+
13
+ ### Changed
14
+
15
+ - **Dogfooding-міграція cursor → vitest**: 100 `*.test.mjs` файлів у `npm/` перенесено з `bun:test` на `vitest`; `npm/stryker.config.mjs` оновлено до canonical baseline (vitest-runner + perTest + incremental); додано `npm/vitest.config.js`; кореневий `package.json#devDependencies` отримав `vitest`, `@vitest/coverage-v8`, `@stryker-mutator/vitest-runner`. Node-сумісність: `Bun.file().text()` → `readFile(..., 'utf8')`, `Bun.spawn` → `spawnSync`, `import.meta.dir` → `dirname(fileURLToPath(import.meta.url))`, EventEmitter duck-typing → `new EventEmitter()` (node-у `events.once` приймає лише EventEmitter інстанси).
16
+ - **`npm/rules/vue/vue.mdc` v2.4**: секцію «Тестування» приведено у відповідність із новим canon-ом (`test.mdc` v2.4 → Vitest+happy-dom). Замість прямого заперечення Vitest у Vue-проєктах рекомендується frontend-варіант `vitest.config.js` з `environment: 'happy-dom'`.
17
+
7
18
  ## [1.27.2] - 2026-05-26
8
19
 
9
20
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "1.27.2",
3
+ "version": "1.27.3",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -44,8 +44,9 @@
44
44
  "type": "module",
45
45
  "types": "./types/bin/n-cursor.d.ts",
46
46
  "scripts": {
47
- "test": "bun test --parallel",
48
- "test:coverage": "bun test --parallel --coverage --timeout 15000 scripts/tests/ rules/",
47
+ "test": "vitest run",
48
+ "test:watch": "vitest",
49
+ "test:coverage": "vitest run --coverage",
49
50
  "start": "bun ./bin/n-cursor.js",
50
51
  "rename-yaml-extensions": "bun ./bin/n-cursor.js rename-yaml-extensions"
51
52
  },
@@ -22,15 +22,18 @@ const VITEST_HINT =
22
22
  /**
23
23
  * Чи у пакеті встановлено vitest (через dependencies або devDependencies).
24
24
  * @param {{dependencies?: Record<string,string>, devDependencies?: Record<string,string>}} pkg package.json
25
- * @returns {boolean}
25
+ * @returns {boolean} true, якщо `vitest` декларовано хоча б в одному dep-section
26
26
  */
27
27
  function hasVitestDep(pkg) {
28
28
  return Boolean(pkg.devDependencies?.vitest) || Boolean(pkg.dependencies?.vitest)
29
29
  }
30
30
 
31
31
  /**
32
- * Чи провайдер застосовний у поточному cwd. Активується, коли у JS-root знайдено
33
- * `vitest` як залежність інакше silent skip із hint у stderr (одноразово).
32
+ * Чи провайдер застосовний у поточному cwd. Активується, коли `vitest`
33
+ * декларовано у JS-root АБО у кореневому `package.json` (workspace-проєкт із
34
+ * hoisted node_modules — типовий патерн bun monorepo, де npm-module rule
35
+ * забороняє devDeps у published workspace-у, тож вони живуть у корені).
36
+ * Інакше silent skip із hint у stderr (одноразово).
34
37
  * @param {string} cwd корінь проєкту
35
38
  * @returns {Promise<boolean>} true, якщо проєкт сумісний з vitest-based coverage
36
39
  */
@@ -40,14 +43,19 @@ export async function detect(cwd) {
40
43
  const pkgPath = join(jsRoot, 'package.json')
41
44
  if (!existsSync(pkgPath)) return false
42
45
  const pkg = JSON.parse(await readFile(pkgPath, 'utf8'))
43
- if (!hasVitestDep(pkg)) {
44
- if (!detect._hinted) {
45
- console.error(VITEST_HINT)
46
- detect._hinted = true
46
+ if (hasVitestDep(pkg)) return true
47
+ if (jsRoot !== cwd) {
48
+ const rootPkgPath = join(cwd, 'package.json')
49
+ if (existsSync(rootPkgPath)) {
50
+ const rootPkg = JSON.parse(await readFile(rootPkgPath, 'utf8'))
51
+ if (hasVitestDep(rootPkg)) return true
47
52
  }
48
- return false
49
53
  }
50
- return true
54
+ if (!detect._hinted) {
55
+ console.error(VITEST_HINT)
56
+ detect._hinted = true
57
+ }
58
+ return false
51
59
  }
52
60
 
53
61
  /**
package/rules/vue/vue.mdc CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Vue
3
- version: '1.9'
3
+ version: '2.0'
4
4
  globs: "**/*.vue"
5
5
  alwaysApply: false
6
6
  ---
@@ -104,21 +104,25 @@ const additionalInstructions = `
104
104
 
105
105
  ### Тестування
106
106
 
107
- - **Unit:** **Bun Test Runner** (`bun test`) використовуй його замість **Vitest**. API сумісне (`describe` / `it` / `expect` з `bun:test`), моки через `mock` і `mock.module`. У `package.json` тримай `"test": "bun test <шляхи>"`; не додавай `vitest`, `vitest.config.*` і пов’язані залежності.
108
- - **Component / DOM:** **Vue Test Utils** + **Bun Test Runner** з **happy-dom** як DOM-середовищем. Підключення — через `@happy-dom/global-registrator` у preload-файлі та `bunfig.toml`:
107
+ - **Unit + Component / DOM:** **Vitest** (`vitest`) + **Vue Test Utils** з **happy-dom** як DOM-середовищем. Це канон, узгоджений з `test.mdc` (Stryker з vitest-runner + `perTest`-аналіз покриття). `vitest.config.js` реюзає `vite.config.js` через `mergeConfig` і перемикає `environment` на `'happy-dom'`:
109
108
 
110
- ```toml title="bunfig.toml"
111
- [test]
112
- preload = ["./test/happy-dom.preload.js"]
113
- ```
109
+ ```js title="vitest.config.js"
110
+ import { defineConfig, mergeConfig } from 'vitest/config'
111
+ import viteConfig from './vite.config.js'
114
112
 
115
- ```js title="test/happy-dom.preload.js"
116
- import { GlobalRegistrator } from '@happy-dom/global-registrator'
117
- GlobalRegistrator.register()
113
+ export default mergeConfig(viteConfig, defineConfig({
114
+ test: {
115
+ include: ['**/*.test.{js,mjs}', 'tests/**/*.test.{js,mjs}'],
116
+ environment: 'happy-dom',
117
+ coverage: { provider: 'v8', reporter: ['lcov', 'text-summary'] }
118
+ }
119
+ }))
118
120
  ```
119
121
 
120
122
  `jsdom` не використовуй — happy-dom швидший і достатній для типових Vue-компонентних тестів.
121
123
 
124
+ У `package.json#scripts` тримай `"test": "vitest run"`; vitest devDeps (`vitest`, `@vitest/coverage-v8`, `@stryker-mutator/vitest-runner`) — у кореневому `devDependencies` (npm-module rule забороняє devDeps у published workspace-у).
125
+
122
126
  - **E2E:** **Playwright** змістовні сценарії користувацьких потоків.
123
127
 
124
128
  ### Інструменти (узгоджено з Vite і цим правилом)