v0.163.0
Upgrade ruff to 0.16.7 and ty to 0.0.80 (#126)
d28b466
·
20h ago
plain-code changelog
0.24.0 (2026-08-12)
What's changed
- Ruff is now a bounded dependency (
ruff>=0.16.2,<0.17), so every checkout and app on the same plain.code release lints with the same ruff version and rule set (f52e18f532)
- The bundled config now deliberately tracks ruff's default rules (which expanded significantly in ruff 0.16) instead of pinning a small explicit list. A short, documented ignore list remains:
ISC001 (formatter conflict), B009/B010 (getattr/setattr with literal names is how dynamic-attribute code stays visible to the type checker), and BLE001/S110/S112 (broad catches at error boundaries are design, not accidents) (f52e18f532)
Upgrade instructions
- Upgrading will move you to ruff 0.16 and its expanded default rule set, so
plain fix / plain code check will likely surface new findings in your code without you changing anything. Run plain fix first — many are auto-fixable (import grouping, __all__ sorting, simplifications) — then address the rest: prefer tuples for declarative class attributes and ClassVar[...] for mutable dict class attributes (RUF012), and timezone-aware datetimes (DTZ*)
- Ruff may also flag now-unused
# noqa comments (RUF100) — safe to delete
0.23.1 (2026-08-07)
What's changed
oxlint and oxfmt are now invoked with --no-error-on-unmatched-pattern, so plain code check and plain code fix no longer fail in a project with no JS/TS files — the normal state for a Python-only app. Previously only oxfmt's exact "Expected at least one target file" stderr text was special-cased into a success, which left oxlint failing the same empty-project case. (31180b789a)
Upgrade instructions
0.23.0 (2026-08-02)
What's changed
- Oxc 1.75.0 is now the minimum supported version, enforced before install and before every invocation. A
pyproject.toml pinned below the minimum is rejected with a clear error (run \plain code update``) instead of installing successfully and then dying with an unhandled error on the first lint. (92792ca396, 3796cf6854)
- Ignore patterns are now passed on the command line instead of via shipped config files (
oxlint_defaults.json / oxfmt_defaults.json, both removed — config-file ignorePatterns only match files under the config's own directory, which never matched the project's). The list is also trimmed to committed third-party code (**/vendor/**, **/*.min.*) — node_modules, .venv, htmlcov, and .pytest_cache are already gitignored and both tools honor .gitignore on their own. (3796cf6854, f9a6fe43f9)
- oxfmt's "No config found, using defaults" nudge is suppressed — no config file is passed on purpose, and projects can still add their own
.oxfmtrc.json. (b40819d36f)
Upgrade instructions
- If your project pins an Oxc version below 1.75.0 in
pyproject.toml, run uv run plain code update to move to the latest version.
0.22.0 (2026-07-22)
What's changed
- Oxc binaries (
oxlint, oxfmt) are now downloaded to the machine-level cache at ~/.cache/plain/oxc/<version>/ instead of the per-checkout .plain/ directory, so every checkout and worktree on the machine shares one download. Because the path is version-addressed, projects pinned to different Oxc versions coexist without re-downloading on every switch. (0cc0500f63)
- The
.plain/oxc.version sidecar lockfile is gone — the version in the cache path is the state, and OxcTool.needs_update() was removed along with it. plain code install, check, and fix now simply install when a binary for the configured version isn't present. (0cc0500f63)
plain code install now also verifies oxfmt is present, not just oxlint — previously a missing or partially installed oxfmt could go unnoticed. (0cc0500f63)
- Downloads extract to a temporary file and are atomically moved into place, so two checkouts installing at the same time can't leave a truncated or corrupted binary behind. (0cc0500f63)
- Running Oxc with no version configured in
pyproject.toml now raises a clear error pointing at plain code install instead of failing on a missing binary path. (0cc0500f63)
Upgrade instructions
- No changes required — the new binaries download on the next
plain code check/fix/install. If you want the disk back, the stale oxlint, oxfmt, and oxc.version files left in each checkout's .plain/ can be deleted.
- If you called
OxcTool.needs_update() or OxcTool.standalone_path directly, use is_installed() and binary_path(version) instead.
0.21.8 (2026-07-15)
What's changed
- Migrated the oxc downloader from
requests to httpx, keeping behavioral parity (redirects followed, streamed download with progress bar). requests is no longer a dependency. (17570d71cf)
- Updated the shipped
plain-code style rules: prefer keyword-only parameters for functions taking more than one argument, and spell out real parameters instead of passing **kwargs through blindly (so type checking works at call sites). (249769ece3)
Upgrade instructions
0.21.7 (2026-05-05)
What's changed
- Exposes
__version__ from importlib.metadata on plain.code for version probes that don't want to scrape pip metadata. (c6cf6edb)
Upgrade instructions
0.21.6 (2026-04-13)
What's changed
- The annotation coverage report now counts
ty: ignore comments alongside type: ignore. (9cb678ba4602)
- Upgraded ty to 0.0.29 and migrated internal type suppression comments to
ty: ignore. (4ec631a7ef51)
Upgrade instructions
0.21.5 (2026-03-19)
What's changed
fix, check, and annotations commands now accept multiple paths as arguments (e.g., plain fix src/ lib/), with each path routed to the appropriate tools based on file type (63a2d55ca6b1)
Upgrade instructions
0.21.4 (2026-03-18)
What's changed
- When
fix or check targets a single file, irrelevant tools are now skipped — Python-only tools (ruff, ty, annotations) won't run on non-Python files, and JS-only tools (oxlint, oxfmt) won't run on Python files (64189f969ef2)
oxfmt no longer errors when no matching files are found (64189f969ef2)
Upgrade instructions
0.21.3 (2026-03-10)
What's changed
- Updated default ruff target version from
py311 to py313 (aa5b2db6e8ed)
Upgrade instructions
0.21.2 (2026-03-10)
What's changed
- Bumped minimum
ty dependency from >=0.0.11 to >=0.0.21 (f56c6454b164)
Upgrade instructions
0.21.1 (2026-03-04)
What's changed
- Fixed
plain code update failing with a 404 error when downloading oxlint/oxfmt — GitHub's "latest" release now points to crates_v tags which don't contain the binaries. The update command now queries the GitHub API to find the correct apps_v release. (54298b724d3b)
Upgrade instructions
0.21.0 (2026-02-25)
What's changed
- Replaced Biome with oxc tools — JS/TS linting is now handled by oxlint and formatting by oxfmt (5eb7ba6f6f7f)
- The
--skip-biome CLI flag is now --skip-oxc (5eb7ba6f6f7f)
- Configuration key changed from
[tool.plain.code.biome] to [tool.plain.code.oxc] in pyproject.toml (5eb7ba6f6f7f)
Upgrade instructions
- If you have
[tool.plain.code.biome] in your pyproject.toml, rename it to [tool.plain.code.oxc].
- Replace
--skip-biome with --skip-oxc in any scripts or CI configuration.
- The oxlint and oxfmt binaries will be downloaded automatically on first run.
0.20.3 (2026-02-04)
What's changed
- Removed
@internalcode decorator from Biome class (e7164d3891b2)
Upgrade instructions
0.20.2 (2026-01-28)
What's changed
- Converted the
plain-fix skill to a passive .claude/rules/ file with path-based activation on **/*.py files (512040ac51)
Upgrade instructions
- Run
plain agent install to update your .claude/ directory.
0.20.1 (2026-01-28)
What's changed
Upgrade instructions
0.20.0 (2026-01-17)
What's changed
- Added docstring style guideline to the
plain-fix AI skill: don't include args/returns in docstrings if already type annotated (bbc8749)
Upgrade instructions
0.19.0 (2026-01-15)
What's changed
- Added code style guidelines to the
plain-fix AI skill for consistent formatting practices (fac8673)
Upgrade instructions
0.18.1 (2026-01-13)
What's changed
- The top-level
exclude config option now applies to ty type checking and annotation checks, in addition to tool-specific excludes (f3ead51)
- Added
node_modules to the default exclude patterns for both annotations and Biome (f3ead51)
Upgrade instructions
0.18.0 (2026-01-13)
What's changed
- Added
plain code annotations command for checking type annotation coverage in Python files (df353b8)
- Use
--details to list untyped functions
- Use
--json for machine-readable output
- Renamed the
plain-check skill to plain-lint, then to plain-fix to better match the primary command (d51294a, 519c5af)
Upgrade instructions
- If you were using the
plain-check or plain-lint AI skill, it has been renamed to plain-fix
0.17.0 (2026-01-13)
What's changed
- Updated the minimum ty type checker version to 0.0.11 for improved Self type inference and unused-ignore-comment detection (9d83576)
- Added a
plain-check skill for AI agents with instructions for running code quality checks (b592c32)
Upgrade instructions
0.16.0 (2025-12-26)
What's changed
- Updated the minimum ty type checker version to 0.0.7 (a5eef56)
Upgrade instructions
0.15.0 (2025-12-12)
What's changed
- Updated the minimum ty type checker version to 0.0.1a33 (54cadc9)
Upgrade instructions
0.14.0 (2025-12-05)
What's changed
- Updated the minimum ty type checker version to 0.0.1a31 for improved type checking capabilities (17a2e6d)
Upgrade instructions
0.13.0 (2025-12-01)
What's changed
- Simplified CLI output with cleaner single-line status messages for all check and fix operations (b09edfd)
- The ty type checker now runs with
--no-progress for cleaner output (5b70918)
- Biome now ignores
.pytest_cache directories by default (f9963d0)
Upgrade instructions
0.12.0 (2025-11-24)
What's changed
- Added ty type checker integration, running automatically as part of
plain code check (40db43a)
- Added
--skip-ruff, --skip-ty, and --skip-biome flags to plain code check for selectively skipping tools (40db43a)
- ty can be disabled in configuration via
[tool.plain.code.ty] with enabled = false (40db43a)
Upgrade instructions
0.11.4 (2025-11-17)
What's changed
- The
plain fix command now displays styled output that matches the format of plain code check, showing the tool name in bold and the command being run in dim text (cde9a8e)
Upgrade instructions
0.11.3 (2025-11-03)
What's changed
- Improved CLI command descriptions to be more concise and user-friendly (fdb9e80)
- The
plain fix command is now marked as a common command and registered as a shortcut for plain code fix (73d3a48, 7910a06)
Upgrade instructions
0.11.2 (2025-10-31)
What's changed
- Added BSD-3-Clause license identifier to package metadata (8477355)
Upgrade instructions
0.11.1 (2025-10-27)
What's changed
- Improved
plain code check output with styled command labels and a clearer error message when checks fail (5e75a0d)
Upgrade instructions
0.11.0 (2025-10-22)
What's changed
- All CLI commands now skip runtime setup for faster execution by using the
@without_runtime_setup decorator (b7358d7)
Upgrade instructions
0.10.2 (2025-10-06)
What's changed
- Added comprehensive type annotations throughout the codebase for improved IDE support and type checking (7455fa0)
Upgrade instructions
0.10.1 (2025-09-25)
What's changed
- Improved Biome download performance by using larger chunk sizes (1MB instead of 8KB) for faster binary downloads (9bf4eca)
Upgrade instructions
0.10.0 (2025-09-19)
What's changed
- Minimum Python version increased from 3.11 to 3.13 (d86e307)
Upgrade instructions
- Ensure your Python environment is running Python 3.13 or later before upgrading
0.9.2 (2025-07-30)
What's changed
- Skip Biome installation and updates when Biome is disabled in configuration (b8beb5c)
- Enhanced README with better structure, usage examples, and configuration documentation (4ebecd1)
Upgrade instructions
0.9.1 (2025-07-18)
What's changed
- Improved error handling by using
click.UsageError instead of print and sys.exit for better CLI error messages (88f06c5)
Upgrade instructions
0.9.0 (2025-07-03)
What's changed
- Updated Biome integration to support the new Biome 2 release. The download logic now uses the new
@biomejs/biome@<version> tag format and the built-in default configuration has been modernised (root: true, files.includes, etc.) (83fa906).
- A progress bar is now displayed while the Biome binary is being downloaded so you can see the download progress in real time (ec637aa).
Upgrade instructions
- If you have pinned a specific Biome version in your
pyproject.toml under [tool.plain.code.biome], make sure it is compatible with Biome 2 (for example, version = "2.0.0"). Otherwise, use plain code update to update to Biome 2.
0.8.3 (2025-06-26)
What's changed
- Added this
CHANGELOG.md file to start tracking changes for the plain.code package (82710c3).
- No functional changes were introduced in this release.
Upgrade instructions