Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
bced1d1
chore(tooling): adopt ultracite and anti-slop
cv Aug 12, 2026
38618d6
docs(tooling): clarify incremental lint coverage
cv Aug 12, 2026
7838f0c
fix(build): refresh plugin npm cache seed
cv Aug 12, 2026
ba2807f
test(tooling): cover incremental lint enforcement
cv Aug 12, 2026
ae67bb2
test(tooling): clarify lint behavior titles
cv Aug 12, 2026
529dacb
fix(tooling): handle optional ultracite ignores
cv Aug 12, 2026
50eb5b2
docs(tooling): distinguish incremental hook actions
cv Aug 12, 2026
337b002
test(tooling): keep anti-slop cases linear
cv Aug 12, 2026
993e87b
Merge branch 'main' into chore/ultracite-anti-slop
cv Aug 13, 2026
e89232d
fix(tooling): address lint review feedback
cv Aug 13, 2026
13177d4
docs(tooling): clarify configured lint base
cv Aug 13, 2026
15d0031
docs(tooling): clarify anti-slop file scope
cv Aug 13, 2026
c49ce0c
fix(tooling): clarify lint remediation
cv Aug 13, 2026
4495524
docs(tooling): name anti-slop hook scope
cv Aug 13, 2026
798def9
docs(tooling): name local anti-slop change
cv Aug 13, 2026
b6b75cf
docs(tooling): combine vendored source exceptions
cv Aug 13, 2026
54a0f0f
refactor(tooling): remove obsolete formatter suppressions
cv Aug 13, 2026
c25a4a5
docs(tooling): list vendored source differences
cv Aug 13, 2026
d522ba0
docs(tooling): separate provenance list
cv Aug 13, 2026
444bfbc
docs(tooling): clarify lint baseline failures
cv Aug 13, 2026
8274d47
docs(tooling): review sonarjs license boundary
cv Aug 13, 2026
eb0cc75
docs(tooling): clarify sonarjs review record
cv Aug 13, 2026
85beac8
docs(tooling): name sonarjs re-review boundaries
cv Aug 13, 2026
e6d2b03
docs(tooling): list sonarjs re-review conditions
cv Aug 13, 2026
cc94705
merge: resolve conflicts with main
github-actions[bot] Aug 13, 2026
4aa1f28
refactor(tooling): remove vendored anti-slop
cv Aug 13, 2026
f11b15e
docs(tooling): clarify lint guidance
cv Aug 13, 2026
b9df988
merge: resolve conflicts with main
github-actions[bot] Aug 13, 2026
a9f3736
refactor(tooling): remove remaining Biome directives
cv Aug 13, 2026
7591d91
docs(tooling): clarify SonarJS packaging evidence
cv Aug 13, 2026
1b58fad
docs(tooling): specify SonarJS usage
cv Aug 13, 2026
28a435b
docs(tooling): clarify repository check scope
cv Aug 13, 2026
115692b
merge: refresh from main
cv Aug 13, 2026
2a99c55
Merge branch 'main' into chore/ultracite-anti-slop
cv Aug 13, 2026
43d263c
refactor(tooling): remove Ultracite dependency
cv Aug 13, 2026
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
28 changes: 18 additions & 10 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
# Priority groups (prek runs same-priority hooks in parallel):
# 0 — General file fixers (whitespace, EOF, line endings)
# 4 — SPDX header insertion (--fix)
# 5 — Shell / JS / TS formatters (shfmt, Biome)
# 6 — Fixes that should follow formatters (ruff check --fix, Biome lint --write)
# 5 — Shell / JS / TS formatters (shfmt, Oxfmt)
# 6 — Oxlint fixes after formatting
# 10 — Linters and read-only checks
# 20 — Project-level checks (vitest, coverage, ratchet)

Expand Down Expand Up @@ -111,22 +111,22 @@ repos:

- repo: local
hooks:
- id: biome-format
name: Biome format
entry: npx biome format --write --no-errors-on-unmatched
- id: oxfmt
name: Oxfmt
entry: bash tools/lint/format-added-files.sh --write
language: system
files: ^(biome\.json|package(-lock)?\.json|nemoclaw/package(-lock)?\.json|commitlint\.config\.js|bin/.*\.js|scripts/.*\.js|test/.*\.js|.*\.ts)$
files: \.(cjs|cts|js|jsx|mjs|mts|ts|tsx)$
pass_filenames: true
priority: 5

# ── Priority 6: auto-fix after formatting ─────────────────────────────────
- repo: local
hooks:
- id: biome-lint-fix
name: Biome lint fixes
entry: npx biome lint --write
- id: oxlint-fix
name: Oxlint fixes
entry: npx oxlint --fix --no-error-on-unmatched-pattern
language: system
files: ^(commitlint\.config\.js|bin/.*\.js|scripts/.*\.js|test/.*\.js|.*\.ts)$
files: \.(cjs|cts|js|jsx|mjs|mts|ts|tsx)$
pass_filenames: true
priority: 6

Expand Down Expand Up @@ -159,6 +159,14 @@ repos:

- repo: local
hooks:
- id: oxlint-type-aware
name: Oxlint type-aware rules
entry: npx oxlint --config oxlint.type-aware.config.ts --no-error-on-unmatched-pattern
language: system
files: ^nemoclaw/src/.*\.ts$
pass_filenames: true
priority: 10

- id: validate-config-schemas
name: Validate config files against JSON schemas
entry: npx tsx scripts/validate-configs.mts
Expand Down
11 changes: 7 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ Package-specific guides:
| Run the broad repo-wide pre-commit and coverage baseline | `npm run check` |
| Type-check CLI | `npm run typecheck:cli` |
| Type-check plugin and plugin tests | `npm --prefix nemoclaw run typecheck` |
| Auto-format | `npm run format` |
| Auto-format added JavaScript and TypeScript files that Oxfmt does not exclude | `npm run format` |
| Build docs | `npm run docs` |
| Serve docs locally | `npm run docs:live` |

Expand Down Expand Up @@ -153,13 +153,15 @@ For shell scripts use `#` comments. For Markdown use HTML comments.

- `bin/` launcher and remaining `scripts/*.js`: **CommonJS** (`require`/`module.exports`), Node.js 22.19+
- `test/`: **ESM** (`import`/`export`)
- Biome config in `biome.json`
- Oxlint uses `oxlint.config.ts`. The isolated `oxlint.type-aware.config.ts` configuration enforces `typescript/no-floating-promises` for plugin sources.

- Use `eslint-plugin-sonarjs` only for the `oxlint.config.ts` cognitive-complexity rules documented in [`tools/lint/DEPENDENCY-REVIEW.md`](tools/lint/DEPENDENCY-REVIEW.md).
- Keep function complexity low; existing complexity hotspots are tracked separately
- Unused vars pattern: prefix with `_`

### TypeScript

- Plugin code in `nemoclaw/src/` is linted and formatted by the root Biome config
- Oxlint lints plugin code in `nemoclaw/src/`. Oxfmt formats added plugin files that it does not exclude.
- CLI type-checking via `tsconfig.cli.json`
- Plugin production and test type-checking via `npm --prefix nemoclaw run typecheck`, using
`nemoclaw/tsconfig.json` and `nemoclaw/tsconfig.test.json`
Expand Down Expand Up @@ -271,7 +273,8 @@ If the command trace contains no reviewer-request write, report the event as an
### Gotchas

- `npm install` at root triggers `prek install` which sets up git hooks. If hooks fail, check that `core.hooksPath` is unset: `git config --unset core.hooksPath`
- The `nemoclaw/` subdirectory has its own `package.json` and `node_modules`, while sharing the root Biome config — it's a separate npm project
- The `nemoclaw/` subdirectory has its own `package.json` and `node_modules`.
It is a separate npm project that shares the root Oxlint and Oxfmt configuration files.
- SPDX headers are auto-inserted by pre-commit hooks; don't worry about adding them manually
- Coverage thresholds are ratcheted in `ci/coverage-threshold-*.json` — new code should not decrease CLI or plugin coverage
- The `.claude/skills` symlink points to `.agents/skills` — both paths resolve to the same content
Expand Down
7 changes: 6 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ These are the primary npm scripts for day-to-day development:
| `npm run check` | Run the broad repo-wide pre-commit and full CLI/plugin coverage baseline |
| `npm run check:diff` | Compatibility alias for `npm run validate:pr` |
| `npm run checks` | Compatibility alias for `npm run checks:repository`; prints scope guidance before delegating |
| `npm run format` | Auto-format Biome-supported source files |
| `npm run format` | Auto-format added JavaScript and TypeScript files that Oxfmt does not exclude |
| `npm run typecheck:cli` | Type-check the root TypeScript project using `tsconfig.cli.json` |
| `npm --prefix nemoclaw run typecheck` | Type-check plugin production and test sources without emitting files |
| `npm test` | Build package artifacts and run every non-live Vitest project for broad changes |
Expand Down Expand Up @@ -383,6 +383,11 @@ All git hooks are managed by [prek](https://prek.j178.dev/), a fast, single-bina
| **commit-msg** | commitlint (Conventional Commits) |
| **pre-push** | Path-scoped incremental CLI/plugin TypeScript checks and checked-JavaScript checks |

The Oxfmt hook formats added JavaScript and TypeScript files that its configuration does not exclude.
The hook reads its base ref from `NEMOCLAW_FORMAT_BASE_REF`, which defaults to `origin/main`.
A file is added when the selected base commit has no file at that path.
If Git cannot resolve the ref named by `NEMOCLAW_FORMAT_BASE_REF`, the Oxfmt hook exits with status 2 before invoking Oxfmt.

For PR preparation, normal `pre-commit`, `commit-msg`, and `pre-push` hooks are valid verification when they pass and were not bypassed with `--no-verify`.
If hooks were skipped, missing, failed, or uncertain, refresh the remote-tracking base with `git fetch origin main`, then run `npm run validate:pr` once to reproduce those checks for the current diff.

Expand Down
219 changes: 0 additions & 219 deletions biome.json

This file was deleted.

4 changes: 2 additions & 2 deletions ci/test-file-size-budget.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
"$comment": "SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\nSPDX-License-Identifier: Apache-2.0",
"defaultMaxLines": 1500,
"legacyMaxLines": {
"nemoclaw/src/commands/migration-state.test.ts": 1301,
"nemoclaw/src/commands/migration-state.test.ts": 1300,
"src/lib/inference/nim.test.ts": 2067,
"src/lib/onboard/preflight.test.ts": 1875,
"test/generate-openclaw-config.test.ts": 1915,
"test/install-preflight.test.ts": 3310,
"test/nemoclaw-start.test.ts": 4790,
"test/onboard-messaging.test.ts": 2036,
"test/onboard-messaging.test.ts": 2035,
"test/onboard-selection.test.ts": 4178
}
}
Loading
Loading