Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
17dad81
fix(uncheck): harden the shared runner, file resolution and package-m…
dinwwwh Sep 24, 2026
2da462b
fix(uncheck): typecheck standalone projects with --noEmit, several at…
dinwwwh Sep 24, 2026
43876ee
test(uncheck): cover dot-file globs, exclusion-only paths, literal gi…
dinwwwh Sep 24, 2026
ec6dafb
docs(uncheck): describe dot-file globs, PnP, --noEmit, sherif in stag…
dinwwwh Sep 24, 2026
bfd42b3
fix(uncheck): check only a commit's own files in `staged` and put uns…
dinwwwh Sep 24, 2026
6747c89
fix(uncheck): keep the pre-commit hook prepare writes safe for every …
dinwwwh Sep 24, 2026
a445de3
fix(uncheck): agent hooks keep your settings, check the right directo…
dinwwwh Sep 24, 2026
46bd3e8
fix(uncheck): typecheck every project a change reaches, the way tsc s…
dinwwwh Sep 24, 2026
9a0b133
fix(uncheck): keep literal file lists in their given order; document …
dinwwwh Sep 24, 2026
5e876d0
fix(uncheck): address the final review of the branch
dinwwwh Sep 24, 2026
0965dc1
test(uncheck): cover the final review fixes and correct the docs they…
dinwwwh Sep 24, 2026
98582cf
refactor(uncheck): simplify and speed up the branch's code
dinwwwh Sep 24, 2026
0ffa8c7
fix(uncheck): address the review of the latest commits
dinwwwh Sep 24, 2026
9ed5272
test(uncheck): cover the latest review fixes and the gaps it found
dinwwwh Sep 24, 2026
e945ed0
refactor(uncheck): keep the oxlint and oxfmt checks separate
dinwwwh Sep 24, 2026
ec14133
build(uncheck): ship the bundle unminified so crash traces stay readable
dinwwwh Sep 24, 2026
2491be9
chore(uncheck): require Node 22.20 or later, nothing more
dinwwwh Sep 24, 2026
40c86a9
docs(uncheck): rewrite the README to be clear, concise and task-first
dinwwwh Sep 24, 2026
3f7831c
docs(uncheck): say that a tsconfig.json without TypeScript fails rath…
dinwwwh Sep 24, 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
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,6 @@
}
},
"engines": {
"node": ">=22.20 <23 || >=24.8"
"node": ">=22.20"
}
}
231 changes: 142 additions & 89 deletions packages/uncheck/README.md

Large diffs are not rendered by default.

7 changes: 4 additions & 3 deletions packages/uncheck/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,16 @@
"@effect/platform-node": "^4.0.0-rc.116",
"effect": "^4.0.0-rc.116",
"jsonc-parser": "^3.3.1",
"minimatch": "^10.2.6",
"oxfmt": "^0.68.0",
"oxlint": "^1.83.0",
"sherif": "^1.13.0",
"typescript": "^7.0.2"
},
"peerDependencies": {
"oxfmt": "*",
"oxlint": "*",
"sherif": "*",
"oxlint": ">=1.60.0",
"sherif": ">=1.10.0",
"typescript": "*"
},
"peerDependenciesMeta": {
Expand All @@ -81,6 +82,6 @@
}
},
"engines": {
"node": ">=22.20 <23 || >=24.8"
"node": ">=22.20"
}
}
37 changes: 4 additions & 33 deletions packages/uncheck/src/bin.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,8 @@
#!/usr/bin/env node

import process from 'node:process'
import { enableCompileCache } from 'node:module'

import * as NodeRuntime from '@effect/platform-node/NodeRuntime'
import * as NodeServices from '@effect/platform-node/NodeServices'
import { Effect } from 'effect'
import { Command } from 'effect/unstable/cli'
// The cache only covers modules compiled after it is on, hence the import that follows it.
enableCompileCache()

import pkg from '../package.json'
import { hooks } from './commands/hooks'
import { prepare } from './commands/prepare'
import { staged } from './commands/staged'
import { uncheck } from './commands/uncheck'

// Any failed write (a reader gone after `| head`, a closed terminal, a full disk) would otherwise end
// the run before `staged` puts unstaged changes back, so output errors are ignored.
for (const stream of [process.stdout, process.stderr]) {
stream.on('error', () => {})
}

Command.run(uncheck.pipe(Command.withSubcommands([staged, prepare, hooks])), {
version: pkg.version,
}).pipe(
Effect.catchTag('CheckFailed', () =>
Effect.sync(() => {
process.exitCode = 1
}),
),
Effect.catchTag('StopBlocked', () =>
Effect.sync(() => {
process.exitCode = 2
}),
),
Effect.provide(NodeServices.layer),
NodeRuntime.runMain,
)
await import('./cli')
4 changes: 2 additions & 2 deletions packages/uncheck/src/checks/oxfmt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import type { Check } from '../types'

export const oxfmt: Check = {
name: 'oxfmt',
fixes: true,
fixes: 'files',
plan: Effect.fn(function* ({ cwd, fix, files }) {
const bin = yield* resolveBin('oxfmt', cwd)

Expand All @@ -20,7 +20,7 @@ export const oxfmt: Check = {
return [{ bin, args }]
}

// Given files may include ones oxfmt does not handle (a Markdown file), which is not a failure.
// Given files may include ones oxfmt does not handle (a .txt file), which is not a failure.
return argvBatches(files).map((batch) => ({
bin,
args: [...args, '--no-error-on-unmatched-pattern'],
Expand Down
2 changes: 1 addition & 1 deletion packages/uncheck/src/checks/oxlint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import type { Check } from '../types'

export const oxlint: Check = {
name: 'oxlint',
fixes: true,
fixes: 'files',
plan: Effect.fn(function* ({ cwd, fix, files }) {
const bin = yield* resolveBin('oxlint', cwd)

Expand Down
2 changes: 1 addition & 1 deletion packages/uncheck/src/checks/sherif.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const WORKSPACE_FILES = new Set(['package.json', 'pnpm-workspace.yaml'])

export const sherif: Check = {
name: 'sherif',
fixes: true,
fixes: 'workspace',
plan: Effect.fn(function* ({ cwd, fix, files }) {
const fs = yield* FileSystem.FileSystem
const path = yield* Path.Path
Expand Down
Loading
Loading