You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Release version 0.11.0: Introduced a comprehensive addon/plugin system with lifecycle hooks, enhanced support for package.yaml, and new CLI flags for global package scanning and cache management. Fixed transport fidelity for .npmrc and improved JSON output for machine readability. Updated documentation to reflect new features and ensured all changes are covered by tests, increasing test coverage to 598 passing tests. Updated CHANGELOG.md with detailed release notes.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+27Lines changed: 27 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,32 @@
2
2
3
3
Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Semver because I'm not a psychopath.
4
4
5
+
## [0.11.0] - 2026-02-23
6
+
7
+
The "close every gap or shut up" release. Ran a full codebase audit against taze, found 5 gaps, closed all 5 in one pass. Verified with real code inspection, runtime test runs, and CLI smoke checks on actual repos. Not vibes. Not a roadmap. Shipped code with 598 passing tests.
8
+
9
+
### Added
10
+
11
+
-**Addon/plugin system** -- first-class `addons` with deterministic lifecycle ordering, async hooks, and per-package write veto. Failures surface as `AddonError` (`ERR_ADDON`) with addon name + hook metadata. Debugging no longer requires telepathy.
12
+
-**`package.yaml` support** -- full pipeline: discovery, resolve, write. Both `package.json` and `package.yaml` load, with deterministic same-directory precedence (YAML wins). Overrides, `pnpm.overrides`, `packageManager`, protocol-preserving rewrites, CRLF/trailing-newline preservation -- all work. Workspace-boundary parity included.
13
+
-**`--global-all`** -- scans npm + pnpm + bun global packages in one run. Dedupes by package name, maps write targets back to every matching manager. `--global` still works for single-manager mode.
14
+
-**`--ignore-paths`** -- exclude directories from package discovery. The flag taze had that we didn't. Now we do.
15
+
-**`--refresh-cache` / `--no-cache`** -- explicit cache bypass without overloading `--force` semantics. Fresh registry metadata, no guessing.
16
+
17
+
### Fixed
18
+
19
+
-**`.npmrc` transport fidelity** -- registry requests now actually use `proxy`, `https-proxy`, `strict-ssl`, and `cafile` via `undici` transport. Previously parsed, politely ignored. HTTPS prefers `https-proxy`, HTTP prefers `proxy`, CA bundles loaded once and reused.
20
+
-**Non-transient transport failures fail fast** -- broken `cafile` paths no longer waste retry attempts. `ResolveError` immediately. You're welcome.
21
+
-**JSON output cleaned** -- `--output json` forces silent logging. No ANSI cursor restore leaking into stdout in non-TTY. Machine-parseable means machine-parseable.
22
+
23
+
### Changed
24
+
25
+
-**Docs parity** -- all new flags documented in README, CLI reference, and configuration docs. No "added the flag, forgot the docs" energy.
26
+
27
+
### Stats
28
+
29
+
- 60 new tests (538 -> 598). 77 test files. Build, typecheck, lint clean. Verified against taze v19.9.2 (55 tests, 13 test files). The numbers speak.
30
+
5
31
## [0.10.1] - 2026-02-23
6
32
7
33
The "your age column was a decoration" patch. Turns out npm's abbreviated metadata endpoint doesn't return the `time` field, so the age column was rendering headers with no data like a restaurant menu with no prices. Switched to full metadata. The cache means you pay the bandwidth once per TTL, cry about it never.
@@ -296,6 +322,7 @@ First release. Wrote it from scratch because waiting for PRs to get merged in ta
296
322
- TTY detection. No spinners in your CI logs. `NO_COLOR` respected.
297
323
- 54 tests. More than some production apps I've seen.
-**Programmatic API** -- 9 exported functions, 7 lifecycle callbacks, full type safety.
32
+
-**Programmatic API** -- lifecycle callbacks + addon system for custom workflows.
33
33
34
34
## Why
35
35
36
36
Because `npm outdated` gives you a table and then abandons you. Because Renovate requires a PhD in YAML. Because your AI coding assistant should be able to update your deps without you holding its hand.
37
37
38
-
depfresh checks every `package.json` in your project, tells you what's outdated, and optionally writes the updates. Monorepos, workspace catalogs, private registries - it handles all of it without a config file.
38
+
depfresh checks every package manifest (`package.json`, `package.yaml`) in your project, tells you what's outdated, and optionally writes the updates. Monorepos, workspace catalogs, private registries - it handles all of it without a config file.
39
+
40
+
If both `package.yaml` and `package.json` exist in the same directory, depfresh uses `package.yaml` and skips the sibling `package.json` to avoid duplicate package entries.
| Bun |`workspaces` in `package.json`|`workspaces.catalog`|
257
-
| Yarn |`workspaces` in `package.json`|`.yarnrc.yml` catalogs |
258
-
| npm |`workspaces` in `package.json`| -- |
288
+
| Bun |`workspaces` in `package.json`or `package.yaml`|`workspaces.catalog`|
289
+
| Yarn |`workspaces` in `package.json`or `package.yaml`|`.yarnrc.yml` catalogs |
290
+
| npm |`workspaces` in `package.json`or `package.yaml`| -- |
259
291
260
-
Workspace catalogs are resolved and updated in-place. Your `pnpm-workspace.yaml` catalog entries get depfreshaded alongside your `package.json`deps. No manual sync needed.
292
+
Workspace catalogs are resolved and updated in-place. Your `pnpm-workspace.yaml` catalog entries get depfreshaded alongside your manifest deps (`package.json`/ `package.yaml`). No manual sync needed.
261
293
262
294
## Private Registries
263
295
@@ -271,30 +303,67 @@ depfresh reads `.npmrc` from your project and home directory. Scoped registries,
271
303
272
304
This was broken in taze for 4+ years. I fixed it on day one. You're welcome.
273
305
274
-
## What I Fixed from taze
275
-
276
-
Not to throw shade at taze -- it served the community well for years. But some things needed fixing, and "PR welcome" only goes so far when the PRs sit open for months.
277
-
278
-
| Problem | taze | depfresh |
279
-
|---------|------|------|
280
-
|`.npmrc` / private registries | Ignored | Full support |
281
-
| Network retry | None | Exponential backoff |
282
-
| Write clobber (bun catalogs) | Data loss | Single-writer architecture |
Verified against taze v19.9.2 (commit `31c6fe8`, 2026-01-20). Not marketing. Real code inspection, runtime test runs, CLI smoke checks on actual repos.
-**[Programmatic API](./api/)** -- Exported functions, lifecycle callbacks, types, and workflow examples. For when you want to wrap depfresh in your own tooling and take credit for it. I respect the hustle.
19
+
-**[Programmatic API](./api/)** -- Exported functions, lifecycle callbacks, addon plugins, types, and workflow examples. For when you want to wrap depfresh in your own tooling and take credit for it. I respect the hustle.
Copy file name to clipboardExpand all lines: docs/api/README.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,8 +6,8 @@ I exposed the internals. On purpose. You can `import` from `depfresh` and do wha
6
6
7
7
-**[Overview](./overview.md)** -- Quick start, defaults, workflow examples. The "just show me some code" page.
8
8
9
-
-**[Functions](./functions.md)** -- Every exported function: `check`, `resolveConfig`, `loadPackages`, `resolvePackage`, `writePackage`, and the rest. Plus lifecycle callbacks for the control freaks.
9
+
-**[Functions](./functions.md)** -- Every exported function: `check`, `resolveConfig`, `loadPackages`, `resolvePackage`, `writePackage`, and the rest. Includes lifecycle callbacks and addon plugin hooks.
10
10
11
-
-**[Types](./types.md)** -- The full type catalogue. `depfreshOptions`, `PackageMeta`, `ResolvedDepChange`, and 15 other things your editor wants to autocomplete.
11
+
-**[Types](./types.md)** -- The full type catalogue. `depfreshOptions`, `depfreshAddon`, `PackageMeta`, `ResolvedDepChange`, and everything your editor wants to autocomplete.
12
12
13
-
-**[Errors](./errors.md)** -- Structured error classes: `RegistryError`, `CacheError`, `ConfigError`, `WriteError`, `ResolveError`. All extend `depfreshError`, all have stable codes.
13
+
-**[Errors](./errors.md)** -- Structured error classes: `RegistryError`, `CacheError`, `ConfigError`, `WriteError`, `ResolveError`, `AddonError`. All extend `depfreshError`, all have stable codes.
Copy file name to clipboardExpand all lines: docs/api/errors.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,6 +5,7 @@ All errors thrown by depfresh extend `depfreshError`, which gives you a stable `
5
5
```ts
6
6
import {
7
7
depfreshError,
8
+
AddonError,
8
9
RegistryError,
9
10
CacheError,
10
11
ConfigError,
@@ -20,6 +21,7 @@ import {
20
21
|`depfreshError`| (base) | Abstract base. Use `instanceof depfreshError` to catch everything depfresh throws. |
21
22
|`RegistryError`|`ERR_REGISTRY`| HTTP errors from the npm/JSR registry. Has `.status` (number) and `.url` (string). 4xx errors don't retry. 5xx errors do. |
22
23
|`CacheError`|`ERR_CACHE`| SQLite failures, corrupt entries, connection issues. depfresh logs and falls back to memory cache -- you'll only see this if you're using the cache API directly. |
24
+
|`AddonError`|`ERR_ADDON`| Addon hook failures. Includes `.addon` and `.hook` to identify the failing plugin and lifecycle stage. |
23
25
|`ConfigError`|`ERR_CONFIG`| Invalid config file, malformed regex patterns in `include`/`exclude`, bad `packageMode` entries. Thrown during `resolveConfig()` or `parseDependencies()`. |
24
26
|`WriteError`|`ERR_WRITE`| File system failures during package writes. Permission denied, disk full, the usual suspects. |
25
27
|`ResolveError`|`ERR_RESOLVE`| Network timeouts, DNS failures, fetch errors that aren't HTTP status codes. The "something went wrong between you and the registry" bucket. |
0 commit comments