@nitra/cursor 1.27.1 → 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 +23 -1
- package/package.json +5 -4
- package/rules/js-lint/coverage/coverage.mjs +17 -9
- package/rules/vue/vue.mdc +14 -10
- package/scripts/coverage-fix.mjs +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -4,11 +4,33 @@
|
|
|
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
|
+
|
|
18
|
+
## [1.27.2] - 2026-05-26
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **`package.json#dependencies`**: `@anthropic-ai/claude-code` (^1.0.0) → `@anthropic-ai/claude-agent-sdk` (^0.3.0). У claude-code v2.x пакет реструктуризовано в CLI-only (бінарі через optionalDependencies, без `sdk.mjs`); SDK з функцією `query` винесли в окремий пакет `@anthropic-ai/claude-agent-sdk`. Сигнатура `query({ prompt, options })` і поля `options.cwd/maxTurns/allowedTools` зберігаються.
|
|
23
|
+
- **`scripts/coverage-fix.mjs`**: дзеркальна заміна імпорту `@anthropic-ai/claude-code` → `@anthropic-ai/claude-agent-sdk`. Тіло споживача без змін.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- **ADR Stop-hook у Node v26 / Zed**: `capture-decisions.sh` спавнить bare `claude -p` як subprocess. PATH у Zed Claude Agent-сесіях має `node_modules/.bin` попереду `/opt/homebrew/bin`, тож резолвив локальний `@anthropic-ai/claude-code@1.0.128`, який краш-падає на старті під Node 26 (`TypeError: Cannot read properties of undefined (reading 'prototype')` у bundled google-auth-library коді, який припускає, що `require('stream')` повертає клас зі `.prototype`). Хук фіксував `empty response from LLM CLI` і виходив без створення чернетки. Після зняття v1-залежності з канона `node_modules/.bin/claude` shadow зникає, subprocess резолвить системний `claude` (homebrew або інший global) — той працює під Node 26 без правок.
|
|
28
|
+
|
|
7
29
|
## [1.27.1] - 2026-05-26
|
|
8
30
|
|
|
9
31
|
### Changed
|
|
10
32
|
|
|
11
|
-
-
|
|
33
|
+
- Стилістичні правки бенчмарк-артефактів `benchmarks/runner-comparison/` (форматування таблиць, code blocks) після ручного `bun run lint` у dev-репо. Без змін у поведінці rules чи правила `test`.
|
|
12
34
|
|
|
13
35
|
## [1.27.0] - 2026-05-26
|
|
14
36
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nitra/cursor",
|
|
3
|
-
"version": "1.27.
|
|
3
|
+
"version": "1.27.3",
|
|
4
4
|
"description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -44,13 +44,14 @@
|
|
|
44
44
|
"type": "module",
|
|
45
45
|
"types": "./types/bin/n-cursor.d.ts",
|
|
46
46
|
"scripts": {
|
|
47
|
-
"test": "
|
|
48
|
-
"test:
|
|
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
|
},
|
|
52
53
|
"dependencies": {
|
|
53
|
-
"@anthropic-ai/claude-
|
|
54
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.0",
|
|
54
55
|
"@anthropic-ai/sdk": "^0.54.0",
|
|
55
56
|
"oxc-parser": "^0.128.0",
|
|
56
57
|
"picomatch": "^4.0.4",
|
|
@@ -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. Активується, коли
|
|
33
|
-
*
|
|
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 (
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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: '
|
|
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
|
|
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
|
-
```
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
```
|
|
109
|
+
```js title="vitest.config.js"
|
|
110
|
+
import { defineConfig, mergeConfig } from 'vitest/config'
|
|
111
|
+
import viteConfig from './vite.config.js'
|
|
114
112
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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 і цим правилом)
|
package/scripts/coverage-fix.mjs
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* (file, line, оригінальний код, вижилий варіант, тип мутації) і самостійно
|
|
5
5
|
* знаходить або створює відповідні test-файли.
|
|
6
6
|
*
|
|
7
|
-
* Залежить від `@anthropic-ai/claude-
|
|
7
|
+
* Залежить від `@anthropic-ai/claude-agent-sdk` (dependencies у npm/package.json).
|
|
8
8
|
*/
|
|
9
9
|
import { readFile } from 'node:fs/promises'
|
|
10
10
|
import { join } from 'node:path'
|
|
@@ -30,9 +30,9 @@ export async function fixSurvivedMutants(survived, projectRoot) {
|
|
|
30
30
|
const prompt = await buildFixPrompt(survived, projectRoot)
|
|
31
31
|
console.log(`\n🤖 coverage --fix: запускаю агента для ${totalMutants} вижилих мутантів...\n`)
|
|
32
32
|
|
|
33
|
-
// Dynamic import: @anthropic-ai/claude-
|
|
33
|
+
// Dynamic import: @anthropic-ai/claude-agent-sdk завантажується лише при --fix,
|
|
34
34
|
// щоб не гальмувати звичайний coverage-прогін за відсутності пакету.
|
|
35
|
-
const { query } = await import('@anthropic-ai/claude-
|
|
35
|
+
const { query } = await import('@anthropic-ai/claude-agent-sdk')
|
|
36
36
|
|
|
37
37
|
for await (const msg of query({
|
|
38
38
|
prompt,
|