@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.
- package/CHANGELOG.md +25 -0
- package/bin/n-rules-cli.mjs +2045 -0
- package/bin/n-rules.js +4 -2026
- 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
|
@@ -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
|
+
- Кешує результати в межах одного прогону.
|