@7n/rules 1.48.1 → 1.49.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 (34) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/bin/n-rules-cli.mjs +2045 -0
  3. package/bin/n-rules.js +4 -2026
  4. package/package.json +1 -1
  5. package/rules/changelog/.changes/260724-1500.md +5 -0
  6. package/rules/doc-files/docgen-files-batch/docs/index.md +9 -0
  7. package/rules/doc-files/docgen-files-batch/docs/main.md +59 -18
  8. package/rules/doc-files/docgen-files-batch/main.mjs +280 -29
  9. package/rules/doc-files/docgen-gen/docs/index.md +9 -0
  10. package/rules/doc-files/docgen-gen/docs/main.md +40 -29
  11. package/rules/doc-files/docgen-gen/main.mjs +79 -25
  12. package/rules/test/coverage/fix-worker.mjs +9 -1
  13. package/rules/test/coverage/lib/classify/verdict-schema.mjs +3 -1
  14. package/scripts/docs/skills-cli.md +18 -24
  15. package/scripts/lib/acp-runner.mjs +1 -1
  16. package/scripts/lib/lint-surface/collateral-veto.mjs +78 -2
  17. package/scripts/lib/lint-surface/docs/collateral-veto.md +30 -16
  18. package/scripts/lib/lint-surface/docs/index.md +1 -0
  19. package/scripts/lib/lint-surface/docs/run-fix.md +8 -23
  20. package/scripts/lib/lint-surface/docs/snapshot.md +6 -17
  21. package/scripts/lib/lint-surface/docs/test-gate.md +29 -0
  22. package/scripts/lib/lint-surface/run-fix.mjs +209 -38
  23. package/scripts/lib/lint-surface/snapshot.mjs +6 -0
  24. package/scripts/lib/lint-surface/test-gate.mjs +87 -0
  25. package/scripts/skills-cli.mjs +60 -10
  26. package/scripts/utils/docs/glob-compat.md +20 -14
  27. package/scripts/utils/glob-compat.mjs +18 -3
  28. package/skills/git-reconcile/SKILL.md +58 -0
  29. package/skills/git-reconcile/js/docs/index.md +9 -0
  30. package/skills/git-reconcile/js/docs/orchestrate.md +33 -0
  31. package/skills/git-reconcile/js/orchestrate.mjs +776 -0
  32. package/skills/git-reconcile/main.json +1 -0
  33. package/skills/taze/js/docs/orchestrate.md +40 -18
  34. package/skills/taze/js/orchestrate.mjs +6 -3
@@ -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
+ - Кешує результати в межах одного прогону.