@nitra/cursor 3.25.1 → 3.27.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.
- package/CHANGELOG.md +17 -0
- package/bin/n-cursor.js +29 -9
- package/package.json +1 -1
- package/rules/ga/docs/fix.md +16 -149
- package/rules/ga/js/docs/lint.md +12 -93
- package/rules/ga/js/docs/workflows.md +28 -213
- package/rules/ga/lint/docs/lint.md +24 -206
- package/skills/docgen/js/docgen-extract.mjs +158 -0
- package/skills/docgen/js/docgen-gen.mjs +334 -0
- package/skills/docgen/js/docgen-ignore.mjs +3 -1
- package/skills/docgen/js/docgen-prompts.mjs +88 -0
- package/skills/fix/SKILL.md +5 -31
- package/skills/fix/js/llm-worker.mjs +181 -0
- package/skills/fix/js/orchestrator.mjs +128 -0
- package/skills/fix/js/t0.mjs +229 -0
- package/skills/fix/meta.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.27.0] - 2026-06-06
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- add fix-t0 CLI command: T0-auto pattern library for n-fix orchestrator (deterministic vscode-ext-add and rm-forbidden-file fixes, 0 LLM tokens)
|
|
8
|
+
- add fix-run: autonomous n-fix orchestrator (convergence-loop fix-t0+LLM, haiku→sonnet escalation, no agent needed)
|
|
9
|
+
|
|
10
|
+
## [3.26.0] - 2026-06-06
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Root-guard для всіх деструктивних точок: CLI-команди fix/lint/coverage/change/release + дефолтний sync хардом перевіряють cwd===git-toplevel (assertCwdIsProjectRoot); worktree-preflight підсилено root-assert (pwd vs toplevel); новий meta.json-флаг requireRoot + injectRootNotice для in-place root-only скілів (n-start-check); skillRequiresRoot як явна похідна ознака захисту; валідація requireRoot у npm-module
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- n-changelog: directional version-drift — лише version ВПЕРЕД (> опублікованої/git-бази) валить як ручний bump; version ПОЗАДУ (локаль відстала від CI-релізу, ще не git pull) більше не блокує коміт (compareSemverCore/versionIsAhead)
|
|
19
|
+
|
|
3
20
|
## [3.25.1] - 2026-06-06
|
|
4
21
|
|
|
5
22
|
### Fixed
|
package/bin/n-cursor.js
CHANGED
|
@@ -5,14 +5,15 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Використання:
|
|
7
7
|
* `npx \@nitra/cursor` — завантажити cursor-правила
|
|
8
|
-
* `npx \@nitra/cursor fix` —
|
|
8
|
+
* `npx \@nitra/cursor fix` — автономний оркестратор: T0-auto + LLM (haiku→sonnet); convergence-loop до чистого стану [--max-iter N] [rules]
|
|
9
9
|
* якщо в корені вже є `.n-cursor.json`, спочатку зчитується конфіг і за потреби дописується `$schema`
|
|
10
|
-
* `npx \@nitra/cursor fix bun` —
|
|
10
|
+
* `npx \@nitra/cursor fix bun` — оркестратор лише для вказаних правил; `--json` = check-only (structured output для CI)
|
|
11
11
|
* `npx \@nitra/cursor rename-yaml-extensions` — k8s `*.yml` → `*.yaml`, `.github` `*.yaml` → `*.yml` (опції: `--dry-run`, `--root=…`; див. bin/rename-yaml-extensions.mjs)
|
|
12
12
|
* `npx \@nitra/cursor post-tool-use-fix` — точка входу PostToolUse hook Claude Code: читає stdin JSON,
|
|
13
13
|
* дістає `tool_input.file_path`, маршрутизує його у відповідні правила
|
|
14
14
|
* (`*.mjs` → `js-lint`, `*.vue` → `js-lint style-lint vue` тощо) і викликає
|
|
15
15
|
* `fix` лише з ними. Прописується автоматично в `.claude/settings.json`.
|
|
16
|
+
* `npx \@nitra/cursor fix` — автономний оркестратор (meta.json: orchestrator:true): T0-auto → LLM via pi (haiku→sonnet) → check-gate → loop; [--max-iter N] [rules]
|
|
16
17
|
* `npx \@nitra/cursor lint` — оркестратор lint-ланцюжка з кореневого `package.json` з вимірюванням часу
|
|
17
18
|
* кожного `lint-*` / `oxfmt` скрипта (fail-fast); канонічна заміна
|
|
18
19
|
* раніше ручного `lint-ga && lint-js && …` агрегатора.
|
|
@@ -1596,12 +1597,14 @@ try {
|
|
|
1596
1597
|
await ensureNitraCursorInRootDevDependencies(cwd())
|
|
1597
1598
|
switch (command) {
|
|
1598
1599
|
case 'fix': {
|
|
1599
|
-
|
|
1600
|
-
await
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1600
|
+
const { runOrchestratorCli } = await import('../skills/fix/js/orchestrator.mjs')
|
|
1601
|
+
process.exitCode = await runOrchestratorCli(args, cwd())
|
|
1602
|
+
break
|
|
1603
|
+
}
|
|
1604
|
+
case '_fix-check': {
|
|
1605
|
+
// Внутрішня команда оркестратора — не є публічним API.
|
|
1606
|
+
// Повертає JSON {total, failed, rules:[{ruleId, ok, output}]} у stdout.
|
|
1607
|
+
await runFixCommand(args, { json: true })
|
|
1605
1608
|
break
|
|
1606
1609
|
}
|
|
1607
1610
|
case 'check': {
|
|
@@ -1709,6 +1712,23 @@ try {
|
|
|
1709
1712
|
|
|
1710
1713
|
break
|
|
1711
1714
|
}
|
|
1715
|
+
case 'fix-run': {
|
|
1716
|
+
// Backward-compatibility alias → перенаправляємо на `fix`.
|
|
1717
|
+
console.warn(`⚠️ \`fix-run\` deprecated — використовуйте \`fix\``)
|
|
1718
|
+
const { runOrchestratorCli } = await import('../skills/fix/js/orchestrator.mjs')
|
|
1719
|
+
process.exitCode = await runOrchestratorCli(args, cwd())
|
|
1720
|
+
break
|
|
1721
|
+
}
|
|
1722
|
+
case 'fix-t0': {
|
|
1723
|
+
// n-cursor fix-t0 [rule...] — T0-auto рівень n-fix оркестратора.
|
|
1724
|
+
// Запускає fix --json, знаходить violation-output із детермінованим паттерном
|
|
1725
|
+
// (vscode-ext-add, rm-forbidden-file тощо), застосовує програмний фікс (0 LLM),
|
|
1726
|
+
// перевіряє check-gate. Exit 0 = усі T0-паттерни закриті; 1 = є решта для LLM.
|
|
1727
|
+
const { runT0AutoCli } = await import('../skills/fix/js/t0.mjs')
|
|
1728
|
+
process.exitCode = await runT0AutoCli(args, cwd())
|
|
1729
|
+
|
|
1730
|
+
break
|
|
1731
|
+
}
|
|
1712
1732
|
case 'change': {
|
|
1713
1733
|
const { runChangeCli } = await import('../rules/release/change.mjs')
|
|
1714
1734
|
process.exitCode = await runChangeCli(args)
|
|
@@ -1780,7 +1800,7 @@ try {
|
|
|
1780
1800
|
default: {
|
|
1781
1801
|
console.error(`❌ Невідома команда: ${command}`)
|
|
1782
1802
|
console.error(
|
|
1783
|
-
` Очікується: (без аргументів) синхронізація правил, 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, change, release, skill, worktree, lint-ci, flow, trace, graph, docgen`
|
|
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`
|
|
1784
1804
|
)
|
|
1785
1805
|
process.exitCode = 1
|
|
1786
1806
|
}
|
package/package.json
CHANGED
package/rules/ga/docs/fix.md
CHANGED
|
@@ -1,158 +1,25 @@
|
|
|
1
|
-
# fix.mjs
|
|
1
|
+
# fix.mjs
|
|
2
2
|
|
|
3
3
|
## Огляд
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Цей файл запускає процес перевірки наявності та стану необхідних системних ресурсів. Він забезпечує швидку оцінку готовності системи до подальшої роботи, використовуючи кешовані дані для прискорення процесу. Результати перевірки використовуються для прийняття рішень щодо подальших дій.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
2. **Standalone mode** — якщо файл запущено напряму через `bun npm/rules/ga/fix.mjs` (або `node ...`), він самостійно ініціалізує CLI-обгортку (`runRuleCli`) і завершує процес із кодом виходу, придатним для CI/IDE.
|
|
7
|
+
## Поведінка
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
1. Ініціалізує контекст прогону.
|
|
10
|
+
2. Викликає стандартне правило, використовуючи контекст.
|
|
11
|
+
3. Якщо код виконується як окремий CLI-скрипт, то:
|
|
12
|
+
1. Викликає оркестрацію правил.
|
|
13
|
+
2. Повертає код завершення процесу.
|
|
11
14
|
|
|
12
|
-
|
|
13
|
-
- **JS-concerns** — запуск перевірок (`check-*.mjs`) і авто-фіксерів (`fix-*.mjs`) із підтек `js/`, `lint/`;
|
|
14
|
-
- **policy** — застосування policy-перевірок із підтеки `policy/`;
|
|
15
|
-
- **mdc-refs** — валідація посилань всередині `ga.mdc` (cross-link integrity).
|
|
15
|
+
## Публічний API
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
- run — Запускає стандартне правило, враховуючи контекст та перетворюючи його на JS-коду, політику та посилання на MDC.
|
|
18
|
+
- Library mode — Викликається через CLI-оркестрацію за допомогою імпорту та функції `run`.
|
|
18
19
|
|
|
19
|
-
##
|
|
20
|
+
## Гарантії поведінки
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
Default-експорту немає. Файл не реекспортує жодних інших символів.
|
|
26
|
-
|
|
27
|
-
## Функції
|
|
28
|
-
|
|
29
|
-
### `run(ctx)`
|
|
30
|
-
|
|
31
|
-
Бібліотечний інтерфейс правила. Дозволяє оркестратору CLI або іншим правилам запустити перевірку `ga` без створення нового процесу.
|
|
32
|
-
|
|
33
|
-
**Сигнатура:**
|
|
34
|
-
|
|
35
|
-
```js
|
|
36
|
-
export function run(ctx)
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**Параметри:**
|
|
40
|
-
|
|
41
|
-
- `ctx` (`RuleContext`, опційний) — контекст прогону, типізований через JSDoc-імпорт з `../../scripts/lib/run-standard-rule.mjs`. Типово містить:
|
|
42
|
-
- `walkCache` — кеш обходу файлів (щоб уникнути повторного `readdir` між правилами в одній сесії);
|
|
43
|
-
- інші поля, передбачені реалізацією `runStandardRule` (репорти, прапорці dry-run тощо).
|
|
44
|
-
|
|
45
|
-
**Повертає:**
|
|
46
|
-
|
|
47
|
-
- `Promise<number>` — числовий код виходу:
|
|
48
|
-
- `0` — правило не знайшло порушень або всі знайдені були автоматично виправлені;
|
|
49
|
-
- `1` — залишилися порушення, які потребують ручного втручання.
|
|
50
|
-
|
|
51
|
-
**Side effects:**
|
|
52
|
-
|
|
53
|
-
- Може читати файли проєкту (через walkCache і внутрішні `check-*.mjs`/`fix-*.mjs`);
|
|
54
|
-
- Може **писати** файли (auto-fix у режимі за замовчуванням; `fix-*.mjs` із підтек `js/`, `lint/`, `policy/`);
|
|
55
|
-
- Може писати в `stdout`/`stderr` (репорти, попередження, summary), залежно від конфігурації `runStandardRule`;
|
|
56
|
-
- Не викликає `process.exit` напряму — повертає код виходу як значення Promise.
|
|
57
|
-
|
|
58
|
-
**Внутрішня реалізація:**
|
|
59
|
-
|
|
60
|
-
```js
|
|
61
|
-
return runStandardRule(import.meta.dirname, ctx)
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Передає **абсолютний шлях до директорії правила** (`import.meta.dirname` — Node/Bun-нативний спосіб отримати `__dirname` в ESM) і контекст. `runStandardRule` сам визначить ID правила за назвою теки (`ga`), завантажить `meta.json`, `ga.mdc` і виконає пайплайн.
|
|
65
|
-
|
|
66
|
-
### Standalone-блок (top-level `if`)
|
|
67
|
-
|
|
68
|
-
Не є експортованою функцією, але є важливою частиною API файлу.
|
|
69
|
-
|
|
70
|
-
**Логіка:**
|
|
71
|
-
|
|
72
|
-
```js
|
|
73
|
-
if (isRunAsCli(import.meta.url)) {
|
|
74
|
-
process.exit(await runRuleCli(import.meta.dirname))
|
|
75
|
-
}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
**Поведінка:**
|
|
79
|
-
|
|
80
|
-
- `isRunAsCli(import.meta.url)` повертає `true`, якщо файл був запущений як основний модуль (а не імпортований). Це Bun/Node-сумісна заміна звичайного для CommonJS `require.main === module`.
|
|
81
|
-
- У такому разі викликається `runRuleCli(import.meta.dirname)` — обгортка, що додає до простого `run(ctx)`:
|
|
82
|
-
- парсинг аргументів командного рядка (наприклад, `--dry-run`, `--scope`);
|
|
83
|
-
- завантаження користувацького конфігу (`.cursorrc`, whitelist-файлів);
|
|
84
|
-
- друк фінального summary з кодом виходу.
|
|
85
|
-
- Результат (`number`) передається у `process.exit(...)`, тож виклик `bun npm/rules/ga/fix.mjs` повертає shell-у точний exit-code для CI/IDE-інтеграції.
|
|
86
|
-
|
|
87
|
-
**ESLint-винятки** (інлайн-коментар):
|
|
88
|
-
|
|
89
|
-
- `n/no-process-exit` (плагін `eslint-plugin-n`) і `unicorn/no-process-exit` — обидва зазвичай забороняють `process.exit`, оскільки він обриває async-операції без cleanup. Тут виняток виправданий: це **єдиний standalone entry-point**, який мусить повернути exit-code саме через `process.exit`, інакше CI не зможе розрізнити успіх/провал.
|
|
90
|
-
|
|
91
|
-
**Top-level `await`:**
|
|
92
|
-
|
|
93
|
-
- Використовується `await runRuleCli(...)` на верхньому рівні модуля — це валідно для ESM (`.mjs`) у сучасних Node.js (≥14.8) і Bun. Без `await` `process.exit` отримав би `Promise` замість числа.
|
|
94
|
-
|
|
95
|
-
## Залежності
|
|
96
|
-
|
|
97
|
-
### Внутрішні (workspace)
|
|
98
|
-
|
|
99
|
-
| Модуль | Шлях | Експорти, що використовуються |
|
|
100
|
-
| ------------------- | ----------------------------------------- | ------------------------------------------------------------------- |
|
|
101
|
-
| `run-rule-cli` | `../../scripts/lib/run-rule-cli.mjs` | `isRunAsCli`, `runRuleCli` |
|
|
102
|
-
| `run-standard-rule` | `../../scripts/lib/run-standard-rule.mjs` | `runStandardRule`; також імпортується тип `RuleContext` через JSDoc |
|
|
103
|
-
|
|
104
|
-
Шляхи відносні до `npm/rules/ga/fix.mjs`, тобто `../../scripts/lib/` → `npm/scripts/lib/`.
|
|
105
|
-
|
|
106
|
-
### Зовнішні / runtime
|
|
107
|
-
|
|
108
|
-
- **Node.js / Bun ESM API**: `import.meta.url`, `import.meta.dirname` (вимагає Node ≥20.11 або Bun, де `dirname` доступний нативно).
|
|
109
|
-
- **`process`**: глобальний об'єкт (`process.exit`).
|
|
110
|
-
|
|
111
|
-
Жодних npm-залежностей файл напряму не імпортує — всі стороні пакети підтягуються транзитивно через `scripts/lib/*`.
|
|
112
|
-
|
|
113
|
-
## Потік виконання / Використання
|
|
114
|
-
|
|
115
|
-
### Сценарій 1: запуск через `@nitra/cursor` (library mode)
|
|
116
|
-
|
|
117
|
-
1. Користувач виконує `npx @nitra/cursor fix ga` або `npx @nitra/cursor fix` (усі правила).
|
|
118
|
-
2. CLI-бінарник пакету (`bin/cursor.mjs` або аналог) динамічно імпортує `npm/rules/ga/fix.mjs`.
|
|
119
|
-
3. Оскільки модуль імпортовано (а не запущено), `isRunAsCli(import.meta.url)` → `false`, standalone-блок не виконується.
|
|
120
|
-
4. CLI викликає експортовану `run(ctx)` із заздалегідь підготованим контекстом (`walkCache`, прапорці).
|
|
121
|
-
5. `run` повертає `Promise<number>` — CLI агрегує його з результатами інших правил у фінальний exit-code.
|
|
122
|
-
|
|
123
|
-
### Сценарій 2: прямий запуск файлу (standalone)
|
|
124
|
-
|
|
125
|
-
1. Розробник або CI виконує `bun npm/rules/ga/fix.mjs` (зручно для дебагу одного правила).
|
|
126
|
-
2. Модуль завантажується як основний; `isRunAsCli(import.meta.url)` → `true`.
|
|
127
|
-
3. Виконується `await runRuleCli(import.meta.dirname)`:
|
|
128
|
-
- парсяться CLI-аргументи;
|
|
129
|
-
- завантажується конфіг/whitelist;
|
|
130
|
-
- всередині також викликається `runStandardRule` (так само як у library-режимі), але з повним «end-to-end» обрамленням;
|
|
131
|
-
- виводиться summary.
|
|
132
|
-
4. `process.exit(<code>)` завершує процес із отриманим exit-code (0/1).
|
|
133
|
-
|
|
134
|
-
### Стандартний пайплайн `runStandardRule` (у обох сценаріях)
|
|
135
|
-
|
|
136
|
-
Послідовність (детальніше — в документації `runStandardRule`):
|
|
137
|
-
|
|
138
|
-
1. **applies** — `meta.json` визначає, чи треба запускати правило в поточному workspace; якщо ні — ранній вихід з кодом 0.
|
|
139
|
-
2. **JS-concerns** — обходяться підтеки правила (`js/`, `lint/`), виконуються пари `check-*.mjs` + `fix-*.mjs`. Якщо `check` повернув порушення, відповідний `fix` пробує їх прибрати.
|
|
140
|
-
3. **policy** — з підтеки `policy/` запускаються policy-чекери (зазвичай це декларативні правила, без auto-fix або з обмеженим fix).
|
|
141
|
-
4. **mdc-refs** — валідація, що в `ga.mdc` (markdown-документ із описом правила) посилання на `js/`, `lint/`, `policy/` коректні (немає «битих» референсів).
|
|
142
|
-
5. Агрегується фінальний exit-code: `0`, якщо всі стадії чисті; `1` — інакше.
|
|
143
|
-
|
|
144
|
-
### Як додати/змінити поведінку правила `ga`
|
|
145
|
-
|
|
146
|
-
Файл `fix.mjs` змінювати **не треба** — він універсальний. Щоб модифікувати поведінку правила:
|
|
147
|
-
|
|
148
|
-
- додайте/змініть `check-*.mjs` і `fix-*.mjs` у підтеках `js/`, `lint/` теки `ga/`;
|
|
149
|
-
- оновіть `policy/`-чекери для декларативних обмежень;
|
|
150
|
-
- актуалізуйте `ga.mdc` (опис для людини/LLM) і `meta.json` (applies, scope, прапорці);
|
|
151
|
-
- запустіть `bun npm/rules/ga/fix.mjs` для локальної перевірки.
|
|
152
|
-
|
|
153
|
-
### Обмеження та інваріанти
|
|
154
|
-
|
|
155
|
-
- Файл **повинен** залишатися мінімалістичним — будь-яка бізнес-логіка в `fix.mjs` правила вважається порушенням архітектури «standard rule» (див. `n-ci4.mdc`).
|
|
156
|
-
- Не можна вилучати `if (isRunAsCli(...))`-блок: інакше прямий запуск файлу не поверне CI exit-code.
|
|
157
|
-
- Не можна замінювати `process.exit` на `return` у standalone-блоці: top-level `return` у ESM-модулі недопустимий, а без `process.exit` процес не отримає правильний код.
|
|
158
|
-
- ESLint-винятки (`n/no-process-exit`, `unicorn/no-process-exit`) застосовуються **лише** до рядка з `process.exit` — їх не слід розширювати на інші місця.
|
|
22
|
+
* Запускає процес.
|
|
23
|
+
* Кеш зберігає результати попередніх прогонів.
|
|
24
|
+
* Результат залежить від попередніх прогонів.
|
|
25
|
+
* Немає взаємодії з мережею.
|
package/rules/ga/js/docs/lint.md
CHANGED
|
@@ -1,100 +1,19 @@
|
|
|
1
|
-
#
|
|
1
|
+
# lint.mjs
|
|
2
2
|
|
|
3
3
|
## Огляд
|
|
4
4
|
|
|
5
|
-
Файл `lint
|
|
5
|
+
Файл `lint` делегує перевірку коду інструменту, який запускається з командного рядка. Він використовується для автоматизованої перевірки коду на відповідність певним правилам. Це забезпечує консистентність та якість коду в проєкті.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## Поведінка
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
1. Запускає наявний CLI для перевірки правил.
|
|
10
|
+
2. Проводить аналіз всього репозиторію, ігноруючи вказаний список файлів.
|
|
11
|
+
3. Повертає код завершення процесу.
|
|
12
|
+
4. Не використовує кеш результатів.
|
|
13
|
+
5. Не здійснює взаємодії з мережею.
|
|
10
14
|
|
|
11
|
-
|
|
12
|
-
- Канонічний CLI правила (`runLintGaCli`) у `npm/rules/ga/lint/lint.mjs` додатково запускає preflight для зовнішніх інструментів (`shellcheck`, `conftest`, `uv`/`uvx`), а потім послідовно — `bunx github-actionlint`, `uvx zizmor --offline --collect=workflows .` і делегує далі.
|
|
13
|
-
- Сам адаптер `npm/rules/ga/js/lint.mjs` лише викликає цей CLI і повертає його exit code.
|
|
15
|
+
## Гарантії поведінки
|
|
14
16
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
| Експорт | Тип | Призначення |
|
|
20
|
-
| ------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------- |
|
|
21
|
-
| `lint` | `async function (files?: string[]) => Promise<number>` | CI-крок (whole-repo lint) для правила `ga`. Параметр `files` ігнорується. Повертає exit code від канонічного CLI правила. |
|
|
22
|
-
|
|
23
|
-
Інших експортів (`default`, named) у файлі немає.
|
|
24
|
-
|
|
25
|
-
## Функції
|
|
26
|
-
|
|
27
|
-
### `lint(_files)`
|
|
28
|
-
|
|
29
|
-
Єдина функція файлу. Адаптер навколо `runLintGaCli`.
|
|
30
|
-
|
|
31
|
-
- **Сигнатура:**
|
|
32
|
-
```
|
|
33
|
-
async function lint(_files: string[] | undefined): Promise<number>
|
|
34
|
-
```
|
|
35
|
-
- **Параметри:**
|
|
36
|
-
- `_files` — `string[] | undefined`. **Ігнорується.** Префікс `_` у назві параметра — конвенційний маркер «не використовується». Документація в JSDoc явно вказує: «whole-repo аналіз», per-file режиму немає. Аргумент усе одно приймається, щоб задовольнити загальний контракт «JS-частини правила» (інші правила можуть мати per-file lint, який отримує список змінених файлів).
|
|
37
|
-
- **Повертає:** `Promise<number>` — exit code, отриманий від `runLintGaCli()`. Семантика стандартна для CLI: `0` — успіх, ненульове — помилка/порушення.
|
|
38
|
-
- **Виключення:** функція сама не кидає винятків і не обгортає `runLintGaCli` у `try/catch`. Будь-яка нерозвʼязана `Promise` чи синхронний `throw` всередині `runLintGaCli` пробʼється назовні без модифікації.
|
|
39
|
-
- **Side effects:** прямих side effects сам адаптер не виконує. Усі side effects (preflight installs через `ensureTool`, запуск зовнішніх процесів `bunx github-actionlint`, `uvx zizmor`, `conftest`, друк у stdout/stderr, можливі мутації CWD) — на стороні `runLintGaCli` та модулів, до яких він делегує далі (`rules/ga/fix.mjs::check()`, Rego-полісі `npm/policy/ga/`, JS-перевірки `workflows.mjs`).
|
|
40
|
-
|
|
41
|
-
## Залежності
|
|
42
|
-
|
|
43
|
-
### Імпорти
|
|
44
|
-
|
|
45
|
-
| Імпорт | Шлях | Тип | Призначення |
|
|
46
|
-
| -------------- | -------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
|
|
47
|
-
| `runLintGaCli` | `'../lint/lint.mjs'` | Іменований імпорт із сусіднього модуля (відносний шлях у межах правила `ga`) | Канонічний CLI правила `ga`: робить preflight, виконує `actionlint`, `zizmor`, делегує в `rules/ga/fix.mjs::check()`. |
|
|
48
|
-
|
|
49
|
-
Інших імпортів немає — ані вбудованих модулів Node, ані сторонніх npm-пакетів.
|
|
50
|
-
|
|
51
|
-
### Транзитивні залежності (інформативно)
|
|
52
|
-
|
|
53
|
-
Через `runLintGaCli` адаптер опосередковано залежить від:
|
|
54
|
-
|
|
55
|
-
- `node:process` (платформа);
|
|
56
|
-
- внутрішніх хелперів `npm/scripts/lib/`: `ensureTool`, `runLintStep`, `runStandardLint`;
|
|
57
|
-
- утиліти `npm/scripts/utils/resolve-cmd.mjs`;
|
|
58
|
-
- JS-перевірок правила `ga` у `npm/rules/ga/js/workflows.mjs` (експорт `check`);
|
|
59
|
-
- Rego-полісі `npm/policy/ga/` (через `runConftestBatch` у `rules/ga/fix.mjs`);
|
|
60
|
-
- зовнішніх бінарників: `bunx`, `github-actionlint`, `shellcheck`, `uv`/`uvx`, `zizmor`, `conftest`.
|
|
61
|
-
|
|
62
|
-
Прямого знання про ці транзитивні залежності адаптер не має — для нього існує тільки контракт «`runLintGaCli` повертає `Promise<number>` з exit code».
|
|
63
|
-
|
|
64
|
-
## Потік виконання / Використання
|
|
65
|
-
|
|
66
|
-
### Внутрішній потік
|
|
67
|
-
|
|
68
|
-
1. Викликається `lint(_files)`.
|
|
69
|
-
2. Параметр `_files` приймається й ігнорується (whole-repo режим).
|
|
70
|
-
3. Викликається `runLintGaCli()` без аргументів.
|
|
71
|
-
4. Результат (`Promise<number>`) повертається безпосередньо викликачу через `return runLintGaCli()`. Жодного `await` тут немає — функція позначена `async`, тому повернутий проміс автоматично «розтекстується» у проміс async-функції; виклик семантично еквівалентний `return await runLintGaCli()`.
|
|
72
|
-
|
|
73
|
-
### Як використовується
|
|
74
|
-
|
|
75
|
-
Модуль є JS-точкою входу правила `ga` для уніфікованих lint-pipelin-ів проєкту. Типові викликачі:
|
|
76
|
-
|
|
77
|
-
- **Загальний lint-оркестратор** (наприклад, кореневий `bun run lint` або `npx @nitra/cursor lint`), який обходить активні правила й для кожного, що має JS-частину, викликає експортовану функцію `lint`. Передає список файлів (зі staged/змінених) — для правила `ga` цей список буде проігноровано.
|
|
78
|
-
- **CI workflows** — через ту саму lint-команду, але з повним списком файлів репо або без нього.
|
|
79
|
-
|
|
80
|
-
Те, що адаптер ігнорує `files`, — свідома архітектурна декларація: лінт `ga` не вміє швидко перевіряти одинокі workflow-файли, бо правила `ga.mdc` мають cross-file семантику (узгодженість назв джоб, повторювані workflows, спільний `workflow_common` тощо), плюс зовнішні інструменти (`actionlint`, `zizmor`) самі обходять директорію `.github/workflows/` цілком.
|
|
81
|
-
|
|
82
|
-
### Звʼязок з канонічним CLI
|
|
83
|
-
|
|
84
|
-
Існує **дві** окремі точки входу до лінтингу правила `ga`:
|
|
85
|
-
|
|
86
|
-
1. `bin/n-cursor.js` → підкоманда `lint-ga` → `runLintGaCli` напряму (CLI-користувач, дзвонить руками або в скриптах).
|
|
87
|
-
2. Загальний lint pipeline → `npm/rules/ga/js/lint.mjs::lint(files)` → `runLintGaCli` (програмний шлях для обхідника правил).
|
|
88
|
-
|
|
89
|
-
Обидві дороги ведуть у одну й ту саму функцію `runLintGaCli`, що гарантує ідентичну поведінку, exit code і побічні ефекти незалежно від точки входу.
|
|
90
|
-
|
|
91
|
-
### Контракт повернення
|
|
92
|
-
|
|
93
|
-
- Викликач має право трактувати результат як стандартний POSIX exit code: `0` — лінт пройшов, інше — є порушення або інфраструктурна помилка (наприклад, відсутній `uv` без можливості auto-install).
|
|
94
|
-
- Адаптер не нормалізує код помилки й не маскує його — якщо `runLintGaCli` повернув `2`, `lint` поверне `2`.
|
|
95
|
-
|
|
96
|
-
### Обмеження та крайні випадки
|
|
97
|
-
|
|
98
|
-
- **Per-file режиму немає.** Передача `files` нічого не змінює; для оптимізації CI краще запускати правило `ga` тільки коли реально змінилися файли в `.github/workflows/` (це — рішення викликача, а не адаптера).
|
|
99
|
-
- **Жодного захисту від конкурентного запуску** на рівні цього адаптера: серіалізація важких CLI-команд (по конвенції `scripts.mdc`) реалізована всередині `runLintGaCli` через `runStandardLint`.
|
|
100
|
-
- **Жодного preflight тут не виконується** — увесь preflight (ensureTool для `shellcheck`/`conftest`, перевірка `uv`) живе всередині `runLintGaCli`.
|
|
17
|
+
* Делегує правила до існуючого CLI.
|
|
18
|
+
* Не враховує `files` в режимі per-file.
|
|
19
|
+
* Не має кешування.
|