@7n/rules 1.48.2 → 1.49.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 (33) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/bin/n-rules-cli.mjs +5 -8
  3. package/package.json +1 -1
  4. package/rules/changelog/.changes/260724-1500.md +5 -0
  5. package/rules/doc-files/docgen-files-batch/docs/index.md +9 -0
  6. package/rules/doc-files/docgen-files-batch/docs/main.md +59 -18
  7. package/rules/doc-files/docgen-files-batch/main.mjs +280 -29
  8. package/rules/doc-files/docgen-gen/docs/index.md +9 -0
  9. package/rules/doc-files/docgen-gen/docs/main.md +40 -29
  10. package/rules/doc-files/docgen-gen/main.mjs +79 -25
  11. package/rules/test/coverage/fix-worker.mjs +9 -1
  12. package/rules/test/coverage/lib/classify/verdict-schema.mjs +3 -1
  13. package/scripts/docs/skills-cli.md +18 -24
  14. package/scripts/lib/acp-runner.mjs +1 -1
  15. package/scripts/lib/lint-surface/collateral-veto.mjs +78 -2
  16. package/scripts/lib/lint-surface/docs/collateral-veto.md +30 -16
  17. package/scripts/lib/lint-surface/docs/index.md +1 -0
  18. package/scripts/lib/lint-surface/docs/run-fix.md +8 -23
  19. package/scripts/lib/lint-surface/docs/snapshot.md +6 -17
  20. package/scripts/lib/lint-surface/docs/test-gate.md +29 -0
  21. package/scripts/lib/lint-surface/run-fix.mjs +209 -38
  22. package/scripts/lib/lint-surface/snapshot.mjs +6 -0
  23. package/scripts/lib/lint-surface/test-gate.mjs +87 -0
  24. package/scripts/skills-cli.mjs +60 -10
  25. package/scripts/utils/docs/glob-compat.md +20 -14
  26. package/scripts/utils/glob-compat.mjs +18 -3
  27. package/skills/git-reconcile/SKILL.md +58 -0
  28. package/skills/git-reconcile/js/docs/index.md +9 -0
  29. package/skills/git-reconcile/js/docs/orchestrate.md +33 -0
  30. package/skills/git-reconcile/js/orchestrate.mjs +776 -0
  31. package/skills/git-reconcile/main.json +1 -0
  32. package/skills/taze/js/docs/orchestrate.md +40 -18
  33. package/skills/taze/js/orchestrate.mjs +6 -3
@@ -3,29 +3,35 @@ type: JS Module
3
3
  title: glob-compat.mjs
4
4
  resource: npm/scripts/utils/glob-compat.mjs
5
5
  docgen:
6
- crc: a226a048
7
- model: manual
8
- tier: manual
6
+ crc: 0c6af731
7
+ model: openai-codex/gpt-5.4-mini
8
+ tier: cloud-min
9
9
  score: 100
10
+ issues: judge-refine:kept-original,judge:inaccurate:0.98
11
+ judgeModel: openai-codex/gpt-5.4-mini
10
12
  ---
11
13
 
12
14
  ## Огляд
13
15
 
14
- Runtime-нейтральний glob-обхід для коду, що виконується і під Bun, і під Node. Потрібен, бо hook запускається через `npx` Node, де глобал `Bun` не визначений (top-level `new Bun.Glob(...)` зривав import модуля-детектора), а прямий `node:fs/promises#glob` не працює на self-hosted Linux Bun 1.3.14, де Node-compat шим не надає export `glob`. Реалізація вибирається за середовищем виконання: `Bun.Glob` під Bun, `node:fs/promises#glob` під Node (гарантовано за `engines: node >=25`).
16
+ Файл забезпечує runtime-нейтральний glob-обхід для коду, що має працювати і під Bun, і під Node. Це потрібно, щоб імпорт модуля не падав у hook-сценаріях, які запускаються через `npx` у Node, де глобал `Bun` не визначений і top-level `new Bun.Glob` ламає завантаження модуля. Вибір механізму обходу відбувається за середовищем виконання: `Bun.Glob` під Bun, `node:fs/promises#glob` під Node (`node >=25`). Публічні точки файлу — `resolveGlobScan` і `hasIgnoredPathSegment`; друга відсікає шляхи через службові теки перед подальшою обробкою.
15
17
 
16
- ## Публічний API
18
+ ## Поведінка
19
+
20
+ `resolveGlobScan` уніфікує результат сканування glob перед подальшою ітерацією: якщо `Bun.Glob.scan` повертає Promise, він дочікується розв’язання, якщо вже повертає async-iterable — передає його далі без змін. Це прибирає різницю між середовищами виконання й дозволяє наступним крокам працювати з одним форматом даних.
17
21
 
18
- - `scanGlob(pattern, cwd)` async-генератор: ітерує відносні (до `cwd`) шляхи файлів, що відповідають glob-патерну (наприклад, `cf/*/package.json`).
19
- - `hasIgnoredPathSegment(relPath, ignoredDirs)` — чи містить відносний шлях сегмент зі службових тек (наприклад, `node_modules`), які glob-обхід має ігнорувати; еквівалент ignore-патернів `**/<dir>/**` по кожній теці з `ignoredDirs`. Розділювачі `\` нормалізуються до `/`.
22
+ `hasIgnoredPathSegment` застосовує спільне правило відсікання службових тек до відносних шляхів, щоб результати glob-обходу не потрапляли в обробку, якщо шлях проходить через одну з ігнорованих тек. Перевірка працює по сегментах шляху, тож однаковий результат дає і для Unix-, і для Windows-розділювачів.
20
23
 
21
- ## Де використовується
24
+ Разом ці функції формують потік: сканування дає сирі збіги, `resolveGlobScan` стабілізує форму їх повернення, а `hasIgnoredPathSegment` відсікає небажані шляхи до передачі результатів далі. Поведінка узгоджується з очікуваннями, закладеними в `package.json`.
25
+
26
+ ## Публічний API
22
27
 
23
- - `npm/scripts/lib/workspaces.mjs`розгортання workspace-патернів із `*`.
24
- - `npm/scripts/utils/resolve-js-root.mjs` резолв JS-roots за workspace-патернами.
25
- - `npm/rules/changelog/lib/package-manifest.mjs`пошук `pyproject.toml` по репо.
26
- - `npm/rules/tauri/core_test_isolation/main.mjs` glob-члени `[workspace] members` і обхід `**/*.rs`.
28
+ - resolveGlobScanРозрізняє дві форми повернення `Bun.Glob#scan()`: async-iterable напряму
29
+ (macOS) або Promise, що резолвиться в async-iterable (спостережено на
30
+ self-hosted Linux Bun 1.3.14 — `yield*` на Promise падає з "is not async
31
+ iterable", бо в Promise немає ні `Symbol.asyncIterator`, ні `Symbol.iterator`).
32
+ - hasIgnoredPathSegment — Чи містить відносний шлях сегмент зі службових тек, які glob-обхід має ігнорувати.
33
+ Еквівалент колишніх ignore-патернів `**\/<dir>/**` по кожній теці з `ignoredDirs`.
27
34
 
28
35
  ## Гарантії поведінки
29
36
 
30
- - Read-only: не виконує операцій запису (ФС/БД).
31
- - Не фільтрує результати сам: ігнорування службових тек — відповідальність викликача (через `hasIgnoredPathSegment` або власні перевірки).
37
+ - Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
@@ -8,15 +8,30 @@
8
8
  * Node (engines: node >=25).
9
9
  */
10
10
 
11
+ /**
12
+ * Розрізняє дві форми повернення `Bun.Glob#scan()`: async-iterable напряму
13
+ * (macOS) або Promise, що резолвиться в async-iterable (спостережено на
14
+ * self-hosted Linux Bun 1.3.14 — `yield*` на Promise падає з "is not async
15
+ * iterable", бо в Promise немає ні `Symbol.asyncIterator`, ні `Symbol.iterator`).
16
+ * @param {unknown} scanned повернення `Bun.Glob#scan()`
17
+ * @returns {Promise<unknown>} async-iterable шляхів (резолвлений, якщо `scanned` — Promise)
18
+ */
19
+ export async function resolveGlobScan(scanned) {
20
+ return typeof (/** @type {{ then?: unknown }} */ (scanned).then) === 'function' ? await scanned : scanned
21
+ }
22
+
11
23
  /**
12
24
  * Ітерує відносні шляхи файлів за glob-патерном.
13
25
  * @param {string} pattern glob-патерн (наприклад, `cf/*\/package.json`)
14
26
  * @param {string} cwd корінь обходу
27
+ * @param {{ bun?: { Glob: new (pattern: string) => { scan(opts: { cwd: string }): unknown } } }} [opts] `bun` —
28
+ * ін'єкція `Bun`-подібної реалізації для тестів (типово — глобал `Bun`).
15
29
  * @yields {string} кожен відносний шлях збігу
16
30
  */
17
- export async function* scanGlob(pattern, cwd) {
18
- if (typeof Bun !== 'undefined') {
19
- yield* new Bun.Glob(pattern).scan({ cwd })
31
+ export async function* scanGlob(pattern, cwd, opts = {}) {
32
+ const bun = opts.bun ?? (typeof Bun === 'undefined' ? undefined : Bun)
33
+ if (bun !== undefined) {
34
+ yield* await resolveGlobScan(new bun.Glob(pattern).scan({ cwd }))
20
35
  return
21
36
  }
22
37
  const { glob } = await import('node:fs/promises')
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: n-git-reconcile
3
+ description: >-
4
+ JS-оркестрований аналіз git-гілок, worktree та stash відносно актуального
5
+ origin/main: детерміновано відсіює merged і patch-equivalent refs, передає
6
+ LLM лише semantic triage та conflict resolution, а корисні зміни переносить
7
+ у перевірені PR. Використовуй, коли просять розібрати, консолідувати,
8
+ підготувати PR або безпечно почистити старі Git refs і stash.
9
+ ---
10
+
11
+ # n-git-reconcile — узгодження Git-графа
12
+
13
+ Запускай через JS-оркестратор:
14
+
15
+ ```bash
16
+ npx @7n/rules skill pi git-reconcile
17
+ ```
18
+
19
+ `cursor` і `codex` підтримуються замість `pi`. Без раннера команда лише друкує
20
+ цей skill як промпт і не виконує reconciliation.
21
+
22
+ ## Розподіл відповідальності
23
+
24
+ JS виконує `fetch`, inventory, patch-equivalence, дедуплікацію refs, збір
25
+ worktree/PR/stash, підготовку worktree від `origin/main`, cherry-pick або
26
+ застосування stash, gates, commit, push, PR і фінальний звіт.
27
+
28
+ LLM отримує лише два bounded-завдання:
29
+
30
+ 1. semantic triage кандидатів, які JS не може оцінити за Git-фактами;
31
+ 2. розв'язання змістових конфліктів і перевірку перенесеної поведінки у вже
32
+ підготовленому worktree.
33
+
34
+ LLM не видаляє refs, не створює worktree, не push-ить і не відкриває PR.
35
+
36
+ ## Інваріанти
37
+
38
+ - База — тільки свіжий `origin/main`.
39
+ - Живі worktree та гілки відкритих PR — protected.
40
+ - Стара дата або великий divergence не означають, що зміна непотрібна.
41
+ - `ours`/`theirs` не застосовуються всліпу: конфлікт розв'язується за
42
+ поведінкою й підтверджується тестом.
43
+ - За невизначеності джерело лишається `kept`; misleading ready PR не
44
+ створюється.
45
+ - Cleanup виконує лише JS і тільки після inventory/PR-фази: видаляє точні refs,
46
+ уже merged/patch-equivalent, явно класифіковані як `drop` або повністю
47
+ перенесені в успішний PR.
48
+ - Live worktree, open PR, `kept` і будь-яке джерело з проваленим перенесенням
49
+ не видаляються.
50
+ - `git stash clear` заборонено; stash видаляється лише по одному після
51
+ підтвердженого перенесення і явного cleanup-запиту.
52
+
53
+ ## Результат
54
+
55
+ Оркестратор повертає для кожного джерела один verdict: `merged`,
56
+ `patch-equivalent`, `open-pr`, `protected`, `pr-created`, `kept`,
57
+ `drop-recommended` або `failed`. Для `pr-created` додає URL, перенесені коміти,
58
+ конфлікти та виконані перевірки.
@@ -0,0 +1,9 @@
1
+ ---
2
+ type: Directory Index
3
+ title: npm/skills/git-reconcile/js
4
+ resource: npm/skills/git-reconcile/js/
5
+ ---
6
+
7
+ | Файл | Тип |
8
+ | --------------------------------- | --------- |
9
+ | [orchestrate.mjs](orchestrate.md) | JS Module |
@@ -0,0 +1,33 @@
1
+ ---
2
+ type: JS Module
3
+ title: orchestrate.mjs
4
+ resource: npm/skills/git-reconcile/js/orchestrate.mjs
5
+ docgen:
6
+ crc: f9dd9d0d
7
+ model: openai-codex/gpt-5.4-mini
8
+ tier: cloud-min
9
+ score: 55
10
+ issues: no-overview,short-behavior,best-of-2:retry-lost
11
+ ---
12
+
13
+ ## Публічний API
14
+
15
+ - parseWorktrees — Парсить `git worktree list --porcelain` у branch→path.
16
+ - dedupeRefs — Дедуплікує local/remote refs одного commit: remote має пріоритет, але
17
+ worktree-protection локального ref переноситься у запис.
18
+ - conflictFiles — Витягає конфліктні файли з `git merge-tree`.
19
+ - inventoryRepository — Збирає детермінований Git inventory. Нічого не видаляє і не змінює у
20
+ checkout, крім оновлення remote refs через fetch --prune.
21
+ - buildTriagePrompt — Формує bounded semantic-triage prompt. Git-факти вже пораховані JS; модель
22
+ не виконує shell-команди й повертає лише JSON-рішення.
23
+ - parseDecisionEnvelope — Витягає JSON object із чистої або fenced відповіді.
24
+ - callRunner — Викликає вибраний LLM runner для одного bounded-завдання.
25
+ - branchSlug — Перетворює довільний title/ref на branch slug.
26
+ - formatReport — Формує deterministic report.
27
+ - runGitReconcileOrchestrator — JS-оркестратор: inventory → bounded LLM triage → deterministic PR pipeline.
28
+ Нічого не видаляє; `drop` є лише рекомендацією у звіті.
29
+
30
+ ## Гарантії поведінки
31
+
32
+ - Власних операцій запису (ФС/БД) у файлі немає; виклики імпортованих модулів можуть писати.
33
+ - Кешує результати в межах одного прогону.