Skip to content

fix(lint): worktree-ізоляція перед self-upgrade + posix-relative шлях у js/eslint detector - #200

Merged
vitaliytv merged 2 commits into
mainfrom
claude/7n-rules-lint-full-bugs-ff9a9a
Jul 24, 2026
Merged

fix(lint): worktree-ізоляція перед self-upgrade + posix-relative шлях у js/eslint detector#200
vitaliytv merged 2 commits into
mainfrom
claude/7n-rules-lint-full-bugs-ff9a9a

Conversation

@vitaliytv

Copy link
Copy Markdown
Member

Summary

Два незалежні баги в lint --full, знайдені в одному прогоні поза .worktrees/ на bun workspaces:

  • Bug 1 (false-positive dirty-tree abort): ensureNRulesInRootDevDependencies мутувала package.json (self-upgrade) ДО ensureRunningInWorktree — self-upgrade бруднив дерево прямо перед власним dirty-гейтом і провалював auto-create worktree на інакше чистому дереві. Виніс спільний предикат isLintFullFixArgs() (щоб skipDevDepsEnsure і needsWorktreeIsolation не розійшлись) і відклав ensure до ПІСЛЯ worktree-ізоляції — той самий патерн, що вже застосований для skill taze.
  • Bug 2 (DetectorError валить весь --full-прогін): toViolation() у js/eslint detector-і робив relative(cwd, f.file) без попереднього resolve(). oxlint (на відміну від eslint programmatic API) віддає відносні filePath, а node:path relative() резолвить відносний другий аргумент проти process.cwd(), не проти переданого cwd. Після auto-created worktree (CLI не робить chdir) це давало ..-шлях і валило інваріант у detect.mjs (violation.file має бути posix-relative без "..").

Changes

  • npm/bin/n-rules.jsisLintFullFixArgs() предикат; skipDevDepsEnsure поширено на lint --full; явний виклик ensureNRulesInRootDevDependencies(runCwd) після worktree-ізоляції.
  • plugins/lang-js/rules/js/eslint/main.mjsresolve(cwd, f.file) перед relative() у toViolation; функцію експортовано для тестованості.
  • plugins/lang-js/rules/js/eslint/tests/main.test.mjs (новий) — regression-тести для toViolation/filterJsFiles/lint() (whole-project/per-file/empty), покриття main.mjs піднято з 9.7% до 83.9% (поріг 80%).
  • plugins/lang-js/rules/js/eslint/docs/{index,main}.md — синхронізовано з новим експортом.
  • change-файли для npm і plugins/lang-js (patch/Fixed).

Known gap

test/coverage все ще падає на npm/bin/n-rules.js (0% покриття, 844 рядки) — це pre-existing debt (файл мав 0% покриття і до цих змін), не нова проблема. Файл — shebang-скрипт з top-level CLI-диспатчем без import.meta.main-гейту, тож його не можна безпечно import-нути в тестах без рефакторингу на окремий main(). Залишив як відому нерозв'язану проблему — рефакторинг за межами цієї задачі.

Test plan

  • node --check на обох змінених файлах
  • bunx vitest run rules/js/eslint/ (plugins/lang-js) — 24/24 passed
  • bunx vitest run bin/ scripts/ (npm) — 838/838 passed
  • Покриття js/eslint/main.mjs перевірено (--coverage) — 83.87% рядків
  • npx @7n/rules lint --full end-to-end на консюмер-репо з nested bun workspace (не прогнано в цій сесії — потребує окремого репро-середовища з описаної структурою run/<pkg> + node_modules/<pkg> symlink)

🤖 Generated with Claude Code

vitaliytv and others added 2 commits July 24, 2026 11:07
…типологія 1/2a/2b/3, задачі T1-T10

Фіксує рішення brainstorm-сесії: три копії тір/ACP-логіки (llm-lib JS,
llm-cascade Rust, tauri-components) зводяться до одного Rust-крейта
llm-lib (нині llm-cascade) з napi-проєкцією для Node і tauri-командами
для webview. Типологія викликів: 1 ACP (cursor/codex/pi), 2a OpenAI-
сумісний sync, 2b batch (v1 — емуляція, перший споживач doc-files),
3 pi-npm (Node-only). MIN/AVG/MAX — спільний Tier-інтерфейс усіх типів.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… у js/eslint detector

Два незалежні баги в lint --full поза .worktrees/:

1. ensureNRulesInRootDevDependencies мутувала package.json ДО
   ensureRunningInWorktree — self-upgrade бруднив дерево прямо перед власним
   dirty-гейтом і провалював auto-create worktree на інакше чистому дереві.
   Виніс спільний предикат isLintFullFixArgs(), відклав ensure до ПІСЛЯ
   worktree-ізоляції (той самий патерн, що вже застосований для `skill taze`).

2. toViolation() у js/eslint detector-і робив relative(cwd, f.file) без
   попереднього resolve(). oxlint (на відміну від eslint API) віддає
   ВІДНОСНІ filePath — node:path relative() резолвить відносний другий
   аргумент проти process.cwd(), не проти переданого cwd. Після
   auto-created worktree (CLI не робить chdir) це давало `..`-шлях і
   валило весь --full прогін через DetectorError.

Додав regression-тести для toViolation/lint(), підняв покриття
js/eslint/main.mjs з 9.7% до 83.9% (поріг 80%), синхронізував
docs/main.md.

Coverage-below-threshold для npm/bin/n-rules.js (0%, 844 рядки)
лишається невирішеним — pre-existing debt, файл структурно не
імпортується безпечно в тестах (top-level CLI-диспатч без
import.meta.main-гейту), рефакторинг за межами цієї задачі.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@vitaliytv
vitaliytv merged commit 8acf5b2 into main Jul 24, 2026
7 checks passed
@vitaliytv
vitaliytv deleted the claude/7n-rules-lint-full-bugs-ff9a9a branch July 25, 2026 05:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant