@7n/rules 1.48.2 → 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.
- package/CHANGELOG.md +19 -0
- package/bin/n-rules-cli.mjs +5 -8
- package/package.json +1 -1
- package/rules/changelog/.changes/260724-1500.md +5 -0
- package/rules/doc-files/docgen-files-batch/docs/index.md +9 -0
- package/rules/doc-files/docgen-files-batch/docs/main.md +59 -18
- package/rules/doc-files/docgen-files-batch/main.mjs +280 -29
- package/rules/doc-files/docgen-gen/docs/index.md +9 -0
- package/rules/doc-files/docgen-gen/docs/main.md +40 -29
- package/rules/doc-files/docgen-gen/main.mjs +79 -25
- package/rules/test/coverage/fix-worker.mjs +9 -1
- package/rules/test/coverage/lib/classify/verdict-schema.mjs +3 -1
- package/scripts/docs/skills-cli.md +18 -24
- package/scripts/lib/acp-runner.mjs +1 -1
- package/scripts/lib/lint-surface/collateral-veto.mjs +78 -2
- package/scripts/lib/lint-surface/docs/collateral-veto.md +30 -16
- package/scripts/lib/lint-surface/docs/index.md +1 -0
- package/scripts/lib/lint-surface/docs/run-fix.md +8 -23
- package/scripts/lib/lint-surface/docs/snapshot.md +6 -17
- package/scripts/lib/lint-surface/docs/test-gate.md +29 -0
- package/scripts/lib/lint-surface/run-fix.mjs +209 -38
- package/scripts/lib/lint-surface/snapshot.mjs +6 -0
- package/scripts/lib/lint-surface/test-gate.mjs +87 -0
- package/scripts/skills-cli.mjs +60 -10
- package/scripts/utils/docs/glob-compat.md +20 -14
- package/scripts/utils/glob-compat.mjs +18 -3
- package/skills/git-reconcile/SKILL.md +58 -0
- package/skills/git-reconcile/js/docs/index.md +9 -0
- package/skills/git-reconcile/js/docs/orchestrate.md +33 -0
- package/skills/git-reconcile/js/orchestrate.mjs +776 -0
- package/skills/git-reconcile/main.json +1 -0
- package/skills/taze/js/docs/orchestrate.md +40 -18
- 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:
|
|
7
|
-
model:
|
|
8
|
-
tier:
|
|
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
|
-
|
|
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
|
-
##
|
|
18
|
+
## Поведінка
|
|
19
|
+
|
|
20
|
+
`resolveGlobScan` уніфікує результат сканування glob перед подальшою ітерацією: якщо `Bun.Glob.scan` повертає Promise, він дочікується розв’язання, якщо вже повертає async-iterable — передає його далі без змін. Це прибирає різницю між середовищами виконання й дозволяє наступним крокам працювати з одним форматом даних.
|
|
17
21
|
|
|
18
|
-
|
|
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
|
-
-
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
|
|
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
|
-
-
|
|
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
|
-
|
|
19
|
-
|
|
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,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
|
+
- Кешує результати в межах одного прогону.
|