Skip to content
This repository was archived by the owner on Sep 11, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions .cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@
"plugins/*/coverage/**",
"report"
],
"import": [
"@nitra/cspell-dict/cspell-ext.json"
],
"import": ["@nitra/cspell-dict/cspell-ext.json"],
"words": [
"aàâä",
"AÀÂÄ",
Expand Down Expand Up @@ -483,6 +481,7 @@
"неіснуючим",
"неіснуючу",
"неймспейсах",
"непідтриманого",
"непідтриманих",
"непідтриманої",
"непробільним",
Expand Down Expand Up @@ -748,6 +747,13 @@
"чорновиків",
"шейп",
"шимі",
"кандидатності",
"мутабельну",
"одиночні",
"плагіновий",
"плагінових",
"релізні",
"верхньорівневого",
"яёіїєґ"
]
}
8 changes: 4 additions & 4 deletions .jscpd.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@
"gitignore": true,
"exitCode": 1,
"minLines": 25,
"reporters": [
"console"
],
"reporters": ["console"],
"ignore": [
".git/**",
".claude/worktrees/**",
Expand Down Expand Up @@ -39,6 +37,8 @@
"npm/schemas/target.json",
"npm/rules/k8s/hasura_httproute/tests/main.test.mjs",
"plugins/lang-js/rules/test/storybook-scaffold/tests/scaffold.test.mjs",
"plugins/lang-js/rules/test/stryker_config/main.mjs"
"plugins/lang-js/rules/test/stryker_config/main.mjs",
"plugins/lang-python/package.json",
"plugins/lang-rust/package.json"
]
}
1 change: 1 addition & 0 deletions .v8rignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ npm/schemas/v8r-catalog.json
npm/schemas/vendor/**
.claude/settings.local.json
npm/.claude-template/settings.template.json
npm/.claude-template/codex-hooks.template.json
npm/rules/js/tooling/data/tooling/knip-canonical.json
npm/rules/js/tooling/data/tooling/oxlint-canonical.json
npm/rules/k8s/js/templates/kubescape_exceptions/.kubescape-exceptions.json.snippet.json
Expand Down
17 changes: 7 additions & 10 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,9 @@ export default [
'npm/scripts/lib/run-rule.mjs',
'npm/tests/fix-mjs-contract.test.mjs',
'npm/tests/check-mjs-contract.test.mjs',
'npm/rules/test/coverage/coverage.mjs'
'npm/rules/test/coverage/coverage.mjs',
// Шлях формується лише з discover-нутих rule directories, не з user input.
'npm/scripts/lib/lint-surface/run-detectors.mjs'
],
rules: {
'no-unsanitized/method': 'off'
Expand Down
5 changes: 5 additions & 0 deletions npm/.changes/260728-2145.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
bump: patch
section: Changed
---
fix(ci): resolve repository lint findings
16 changes: 16 additions & 0 deletions npm/.claude-template/codex-hooks.template.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"hooks": {
"PostToolUse": [
{
"matcher": "apply_patch",
"hooks": [
{
"type": "command",
"command": "npx --no @7n/rules hook --post-tool-use",
"timeout": 300
}
]
}
]
}
}
4 changes: 4 additions & 0 deletions npm/AGENTS.template.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ Generated from the root `package.json` on each `npx @7n/rules` sync. Prefer `bun

Before making changes, read the relevant rule files for the area you are working on.

## RTK

Якщо `rtk` встановлено, використовуй підтримувані rtk wrappers, щоб скорочувати вивід для LLM: `rtk git status`, `rtk rg pattern`, `rtk vitest run`, `rtk npm run build`. Для команд без wrapper-а виконуй оригінальну команду.

## Інваріант після змін

`n-changelog.mdc` (alwaysApply) релевантне після **будь-якої** зміни файлів, не лише для релізу. Перед фінальною відповіддю виконай `npx @7n/rules lint changelog` (exit `0`) і познач результат рядком `Changelog: …` у відповіді.
Expand Down
1 change: 1 addition & 0 deletions npm/bin/n-rules-cli.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -1617,6 +1617,7 @@ export async function runSync() {
const parts = []
if (result.settings) parts.push('.claude/settings.json')
if (result.cursorHooks) parts.push('.cursor/hooks.json')
if (result.codexHooks) parts.push('.codex/hooks.json')
if (result.commands.length > 0) parts.push(`${result.commands.length} slash-commands`)
if (result.adrHook) parts.push('.claude/hooks/capture-decisions.sh')
if (result.adrNormalizeHook) parts.push('.claude/hooks/normalize-decisions.sh')
Expand Down
12 changes: 12 additions & 0 deletions npm/bin/tests/n-rules-cwd.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,18 @@ describe('syncClaudeMd / syncAgentsMd (cwd-mock)', () => {
})
})

test('syncAgentsMd додає Codex пряму RTK-інструкцію з bundled шаблону', async () => {
await withTmpDir(async dir => {
cwdState.current = dir

await syncAgentsMd()

const text = await readFile(join(dir, 'AGENTS.md'), 'utf8')
expect(text).toContain('використовуй підтримувані rtk wrappers')
expect(text).not.toContain('@RTK.md')
})
})

test('syncAgentsMd кидає, коли шаблон відсутній у пакеті', async () => {
await withTmpDir(async dir => {
cwdState.current = dir
Expand Down
33 changes: 6 additions & 27 deletions npm/rules/doc-files/docgen-files-batch/docs/main.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,13 @@ type: JS Module
title: main.mjs
resource: npm/rules/doc-files/docgen-files-batch/main.mjs
docgen:
crc: 309bc059
model: openai-codex/gpt-5.4-mini
tier: cloud-min
score: 75
issues: internal-name:generateOne,internal-name:runBatchPass,anchor-miss:http://127.0.0.1:8000/v1/,judge-refine:kept-original,judge:inaccurate:0.99
judgeModel: openai-codex/gpt-5.4-mini
crc: 7531d04c
model: omlx/gemma-4-e2b-it-4bit
tier: local-min
score: 35
issues: no-overview,short-behavior,internal-name:generateOne,internal-name:runBatchPass,best-of-2:retry-lost
---

## Огляд

Визначає цілі для оновлення, генерує й синхронізує docs/ з кодом, оновлює directory index і прибирає orphaned docs, які більше не прив’язані до актуальних джерел. Працює як fail-safe: мережеві звернення не виносять винятки назовні, а результати прогону кешуються в межах одного запуску.

## Поведінка

Генерація документації стартує з виявлення цілей через selectTargets: у звичайному режимі беруться застарілі або degraded-доки, які ще не отримували повторної спроби для поточної версії джерела; у режимі overwrite обробляються всі. Це робить прогін сходинковим: після невдалої спроби degraded-док більше не чіпається, доки не зміниться джерело, а новий CRC автоматично повертає його в потік.

runDocFilesGenCli збирає підсумковий сценарій: спершу прибирає сирітські доки, потім запускає генерацію для відібраних цілей, а в кінці оновлює індекс директорії. Якщо прогін зупиняється достроково або через помилки, зроблене лишається на диску з актуальними CRC, тому наступний запуск підхоплює тільки пропущене.

runGenerationBatch є спільним ядром усієї генерації. Воно бере відібрані цілі, робить preflight для локального бекенда і далі вибирає між послідовним шляхом та batch-шляхом. Якщо доступний native batch-аддон і немає м’якого дедлайну, весь набір іде одним submitBatch, і результати розкладаються назад по файлах. Якщо batch-режим недоступний або примусово вимкнений, обробка йде по одному файлу з fail-safe обробкою помилок та circuit-breaker для системних збоїв підряд. М’який дедлайн підтримується лише на послідовному шляху: перший файл завжди стартує, а наступні зупиняються, коли час вичерпано. Усі стани та лічильники накопичуються в спільній статистиці, а вихідний код відображає лише підсумок прогону.

nativeBatchAvailable використовується як перемикач між batch і fallback-потоком. Перевірка не виконує LLM-виклику, а лише підтверджує, що native-реалізація доступна; результат кешується в межах прогону, щоб не повторювати однакову перевірку.

generateDirIndex підтримує актуальний directory index у docs/ після будь-яких змін у наборах доків. Він читає наявні markdown-файли, витягує frontmatter і будує оглядову таблицю лише для реальних документів; сам index.md не чіпається, якщо в директорії більше нічого немає.

purgeOrphanedDocs прибирає доки, для яких уже немає source-файлів, і після цього синхронізує індекс директорії. Це тримає docs/ у стані, де в ньому лишається тільки те, що ще прив’язане до коду, а порожні директорії очищуються до мінімально можливого стану.

runDocFilesStampCli працює окремо від генерації: він детерміновано оновлює frontmatter у вже наявних доках без звернення до LLM. Це корисно для міграції та для відновлення метаданих, коли треба синхронізувати source і crc без зміни тексту документа.

## Публічний API

- selectTargets — Цілі генерації:
Expand Down Expand Up @@ -81,5 +60,5 @@ T8 (2b-batch, рішення Р): коли доступний native-аддон

## Гарантії поведінки

- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
- Містить локальні fail-safe гілки; інші помилки можуть поширюватися назовні.
- Кешує результати в межах одного прогону.
10 changes: 7 additions & 3 deletions npm/rules/doc-files/docgen-files-batch/main.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -273,9 +273,13 @@ async function runBatchPass(targets, root, opts, stats, { reporter, emit }) {

// Авторські comments уже є джерелом істини: штампуємо такі документи тут,
// не створюючи порожній native batch і не торкаючись LLM.
const llmPrepared = prepared.filter(p => p.mode !== 'comment-only')
for (const p of prepared.filter(p => p.mode === 'comment-only')) {
processBatchResult({ ok: '' }, p, { model, tier: opts.tier ?? null, stats, out })
const llmPrepared = []
for (const preparedItem of prepared) {
if (preparedItem.mode === 'comment-only') {
processBatchResult({ ok: '' }, preparedItem, { model, tier: opts.tier ?? null, stats, out })
} else {
llmPrepared.push(preparedItem)
}
}
if (llmPrepared.length === 0) return

Expand Down
Loading