v0.1.0
Pre-release
Pre-release
What's Changed
- chore: flag pre-release status in the npm description by @allens in #82
- docs: settle the local-config / remote-structure redesign (ADR-0024..0026) by @allens in #83
- chore: reword npm description "eternal" -> "tool-independent" by @allens in #84
- refactor(env): drop the per-bucket env layer (ADR-0025) by @allens in #85
- Set name is the whole identity: collision-claim + --inherit (ADR-0024, ADR-0026 setup-half) by @allens in #86
- Fold resolveRemoteSet into resolveSet — finish the ADR-0026 redesign by @allens in #87
- chore: trim low-value historical commentary from code comments by @allens in #88
- compare is local-only; setup --inherit syncs manifests (ADR-0027) by @allens in #89
- docs(readme): lead with everyday recovery; fix post-redesign drift by @allens in #90
- Make per-session worktrees the default for any write (CLAUDE.md #13) by @allens in #91
- chore: correct convention #15 — GraphQL botIds requests Copilot review by @allens in #92
- refactor: a resolved BackupSet carries its own on-disk paths by @allens in #93
- chore: narrow git-push deny rule so it stops blocking '+' branch names by @allens in #95
- Handoff: load user env at the entry point; a loadSet door for set env by @allens in #97
- refactor: load user env at entry; loadSet door for set env by @allens in #98
- docs(proposals): snapshot-pipeline architecture deepening candidates by @allens in #99
- Collapse the snapshot-writing pipeline into one deep module by @allens in #103
- Build(deps): Bump actions/checkout from 6 to 7 in the actions group by @dependabot[bot] in #100
- Build(deps): Bump the aws-sdk group with 3 updates by @dependabot[bot] in #101
- Build(deps-dev): Bump the dev-dependencies group with 2 updates by @dependabot[bot] in #102
- docs(adr): the walk is eager, not streamed (ADR-0029) by @allens in #104
- feat(hooks): auto-request Copilot review on gh pr create by @allens in #105
- chore: adopt the .claude/worktrees convention + exclude it from tooling by @allens in #106
- docs(proposals): capture the architecture deepening candidates by @allens in #107
- Adopt NN/g error-message guidelines (ADR-0030) + conform messages by @allens in #108
- docs(claude): run bare git in cwd — git -C defeats the allowlist by @allens in #110
- fix(format): correct byte formatting + reconnect upload progress; settle display-formatting design by @allens in #109
- fix: knock out all four bugs from proposals/bugs.md by @allens in #111
- feat: actionable error for expired AWS credentials + error-handling cleanup by @allens in #112
- chore: remove parked SIGINT handler, sharpen temp-file cleanup note by @allens in #113
- feat:
s3cab awscommand to configure the AWS profile by @allens in #114 - chore: allow
gh apiandgit worktreewithout prompting by @allens in #115 - feat: actionable guidance when
s3cab awsshows no profile set by @allens in #116 - docs: cloud-onboarding (
bucketcommand) design + ADR-0032 by @allens in #117 - chore: allow read-only git (status/diff/log) without prompting by @allens in #118
- feat:
bucketcommand — generative cloud onboarding by @allens in #119 - docs: rationalize bucket/aws/setup commands (ADR-0035) by @allens in #120
- chore: persist the permission-prompt fix to shared source by @allens in #121
- Rationalize CLI commands: bucket→aws, aws→profile, setup folds into sets (ADR-0035) by @allens in #122
- docs: ADR-0036 —
setup/listcommand shape, dropsetsby @allens in #123 - Reshape sets→setup + list (ADR-0036) by @allens in #124
- feat: cli-design skill (distilled clig.dev) + ADR-0030 adopts Nielsen heuristic #9 by @allens in #126
- docs: trim CLAUDE.md — merge consent rules, distill, renumber (16→11) by @allens in #125
- Extract fileProps primitive; make prop path-only by @allens in #127
- docs(proposals): record the 2026-06-29 deepening follow-up by @allens in #128
- docs: give every ADR a uniform Status line by @allens in #129
- feat: standardize user-facing wording on "directory"; complete no-sets hint by @allens in #133
- Build(deps): Bump the aws-sdk group with 3 updates by @dependabot[bot] in #130
- Build(deps-dev): Bump the dev-dependencies group with 3 updates by @dependabot[bot] in #131
- Build(deps): Bump @smithy/shared-ini-file-loader from 4.6.2 to 4.6.4 by @dependabot[bot] in #132
- docs: ADR-0037 — categorize AWS auth errors by code, not HTTP status by @allens in #134
- feat: friendly messages for request-time AWS auth rejections (ADR-0037) by @allens in #135
- chore: replace Copilot-review hook with a gh --reviewer @copilot convention by @allens in #136
- chore: delete completed auth-error-categorization proposal by @allens in #137
- feat: usage errors show synopsis + arg description, not the full help block (ADR-0038) by @allens in #138
- docs: request Copilot review once at PR-create, not on push by @allens in #139
- feat: auth & onboarding UX — self-explanatory credential/setup failures by @allens in #140
- chore: sweep stale code comments and the dead zstd-bench default by @allens in #141
- chore: point code comments at docs/design/ (specs rename follow-up) by @allens in #142
- docs: dedupe env.mjs header against the auth design doc by @allens in #143
- clig.dev review: examples-first help, help routing, pre-network notice, restore/hashes shape by @allens in #144
- Rename profile to auth; fold the auth topic into its help (ADR-0041) by @allens in #145
- Gate progress animation and help styling on a TTY (shared style.mjs gate) by @allens in #147
- New sets start with a starter exclude.txt (real defaults + help discovery) by @allens in #146
- feat: one stderr-progress module (route every consumer through the TTY gate) by @allens in #148
- style: require braces on all control blocks (curly: all) by @allens in #149
- feat: implement
verify(bucket-operand backup completeness check) by @allens in #150 - feat: add
deleteandcleanup(slice 5 admin pair) by @allens in #151 - verify: per-path problems + move orphan reporting to cleanup by @allens in #152
- feat: human-first output mechanism +
--json(slice 1) by @allens in #153 - feat: human-readable compare/snapshot + structured CompareResult (slice 2) by @allens in #154
- feat: human-readable query renderers (slice 3) by @allens in #155
- feat: human-readable action confirmations (slice 4) by @allens in #156
- feat: human-first output close-out — required render, --json docs (slice 5) by @allens in #157
- feat: change-detection simplification — drop the objects cache (slice 1) by @allens in #158
- feat: unify upload command surface; backup = snapshot + upload (ADR-0044) by @allens in #159
- test: co-locate integration tests as *.integration.test.mjs (ADR-0046) by @allens in #160
- Build(deps-dev): Bump @types/node from 26.0.1 to 26.1.0 in the dev-dependencies group by @dependabot[bot] in #161
- Build(deps): Bump @smithy/shared-ini-file-loader from 4.6.4 to 4.6.6 by @dependabot[bot] in #162
- refactor: extract pure planCleanup, mirroring verifySet by @allens in #164
- Build(deps): Bump the aws-sdk group with 3 updates by @dependabot[bot] in #163
- ci: skip s3-integration on Dependabot PRs by @allens in #165
- feat: create env files owner-only (0600) and ~/.s3cab dirs 0700 by @allens in #166
- refactor: architecture-review bundle — planUpload, diff tests, seedStarterExclude, emptyBucket by @allens in #167
- refactor: architecture bundle — thread previous snapshot, downloadToFile, snapshot-name authority by @allens in #168
- feat: snapshot concurrency lock via atomic wx on the temp file by @allens in #169
- fix: surface S3 download errors, and tidy the s3.mjs read/write surface by @allens in #171
- refactor(test): flatten platform-label nested ternary to a lookup table by @allens in #172
- docs: prune & distill CLAUDE.md working conventions (11→9) by @allens in #173
- test: split unit/integration by directory; hard-fail gate; per-platform release round-trip by @allens in #174
- Report where the AWS profile came from; isolate integration harness from ~/.s3cab/env by @allens in #175
- Skip a snapshot that vanished mid-scan in referencedObjects by @allens in #176
- fix: show file path, not object hash, in upload progress by @allens in #177
- feat: align upload-progress byte columns so paths left-align by @allens in #178
- feat: default-exclude .git with disclosure; native separators in the starter by @allens in #179
- Retire setup update mode; edit directories in dirs.txt by @allens in #180
- Split setup --inherit into a standalone reattach command by @allens in #181
- Fail a backup when a member directory is missing by @allens in #182
- Per-set credentials: drop the user env layer, one mode per set (ADR-0055) by @allens in #183
- feat: CloudFormation template for AWS onboarding; retire --sso (Phase A-1) by @allens in #184
- docs: Roles Anywhere signer validated — preserve spike + design doc by @allens in #189
- Build(deps): Bump actions/setup-node from 6 to 7 in the actions group by @dependabot[bot] in #185
- Build(deps): Bump the aws-sdk group with 3 updates by @dependabot[bot] in #186
- Build(deps-dev): Bump the dev-dependencies group with 4 updates by @dependabot[bot] in #187
- Build(deps): Bump @smithy/shared-ini-file-loader from 4.6.6 to 4.6.8 by @dependabot[bot] in #188
- Roles Anywhere setup (Phase A-2): cert gen, RA CloudFormation, ARN capture by @allens in #190
- Roles Anywhere Phase B: the native SigV4-X509 credential signer by @allens in #191
- refactor(roles-anywhere): extract pure arnsFromOutputs + single-source the ARN contract by @allens in #192
- fix(s3): teach authNotice the Roles Anywhere mode by @allens in #193
- fix(provider): route both RA-marker reads through canonical isRolesAnywhereMode by @allens in #194
- refactor(onboarding): move the --save confirmation into a pure awsSaveConfirmation by @allens in #195
- aws: write the CloudFormation template to a file; fix Windows-broken deploy command by @allens in #196
- refactor(aws): quarantine CloudFormation to an aws-only module (ADR-0059) by @allens in #197
- refactor(aws): one parameterized bucket-name validator by @allens in #198
- fix(aws): honor --profile in
aws --save --from-stackby @allens in #199 - fix(sets): route dirs.txt readers through parseLines so # comments aren't walked by @allens in #201
- fix(help): correct compare --help output; add missing examples by @allens in #200
- refactor(backup): take the fresh name + baseline from snapshot()'s diff by @allens in #202
- perf(walk): fail at the first duplicate file, not after the whole walk by @allens in #204
- refactor(s3): drop objectExists's metadata heuristic; inline into putFile by @allens in #203
- fix(s3): stop stamping objects with metadata — it broke non-ASCII backups by @allens in #205
- fix(help): point provider's footer at guide/auth.md, not a README anchor by @allens in #206
- fix(help): print s3cab.plantegral.com URLs, never github.com links by @allens in #207
- feat(provider): one read of a set's provider config (readProviderConfig) by @allens in #208
- refactor(snapshot-file): own the filename grammar's construct direction (snapshotFileName + remoteSnapshotUri) by @allens in #209
- test(s3): close the upload skip-semantics coverage gaps by @allens in #210
- refactor: E-bundle finish — getOrInsertComputed in remote scan, fail-fast upload validation by @allens in #211
- refactor: JSDoc @import tags for every imported type, enforced by a lint rule by @allens in #212
- fix(upload): abort backup when a file changes mid-snapshot-upload by @allens in #213
- perf(s3): multipart uploads at 16 MiB parts × 32 concurrent by @allens in #214
- Bulk operands positional, addressing via --set (ADR-0062) by @allens in #215
- Show a flag's short form in missing-argument errors (ADR-0038) by @allens in #216
- The orphan check for delete (docs/design/snapshot-deletion.md) by @allens in #217
- Rename delete to forget, and name the file-side consequence unrestorable by @allens in #218
- fix(upload): trust a --since baseline only if it still exists remotely by @allens in #220
- fix(restore): skip a missing object instead of aborting the whole run by @allens in #219
- feat: path-scoped delete with repository deletion record (ADR-0064) by @allens in #221
- refactor: extract long command help bodies into command-details.mjs by @allens in #222
- feat: convert cleanup/forget to the destructive-command pattern (ADR-0064) by @allens in #223
- feat(aws): suffix-scheme resource names + resource tagging by @allens in #224
- fix(aws): drop unsupported Tags from ManagedPolicy in CFN template by @allens in #225
- fix(s3): request + connection timeouts so a dropped connection fails instead of hanging by @allens in #226
- feat(upload): add --dir to seed a folder's objects before the first backup by @allens in #227
- feat(aws): upload to Glacier Instant Retrieval, the cheapest instant tier (ADR-0066) by @allens in #228
- Build(deps): Bump the aws-sdk group with 4 updates by @dependabot[bot] in #229
- Build(deps-dev): Bump the dev-dependencies group across 1 directory with 4 updates by @dependabot[bot] in #235
- Build(deps): Bump @smithy/signature-v4 from 5.6.7 to 5.6.11 by @dependabot[bot] in #234
- Build(deps): Bump @smithy/shared-ini-file-loader from 4.6.8 to 4.6.15 by @dependabot[bot] in #236
- feat(format): pad whole scaled byte sizes to one decimal (3MB → 3.0MB) by @allens in #237
- fix(s3): use socketTimeout, not requestTimeout — the hang fix never worked by @allens in #239
- Build(deps-dev): Bump brace-expansion from 5.0.6 to 5.0.8 by @dependabot[bot] in #240
- Capture fused snapshot+upload pipeline design (proposal + spike) by @allens in #238
- feat(snapshot): park hashes on a graceful interrupt so a restart doesn't re-hash by @allens in #241
- fix(s3): survive a dropped network — explain it, then ride it out by @allens in #242
- feat(output): say when a backup is waiting out a dropped network by @allens in #243
- docs: record why the retry window is 120s and not configurable by @allens in #244
- Fuse snapshot generation and upload into one streaming pass by @allens in #245
- Tidy the backup preamble: fewer lines, shortened paths, live progress by @allens in #246
- Route putText through putObjectParams; give PreconditionFailed its predicate twin by @allens in #247
- Give every hash-then-PUT path the confirmation guard (one PUT loop) by @allens in #248
- fix(snapshot): resolve a snapshot name to its file, not to anything that exists by @allens in #249
- Build the settled snapshot-format decisions (ADR-0071/0072/0073) by @allens in #250
- Name the bucket on the existing-object scan line by @allens in #251
- Name the bucket's unreadable snapshots (ADR-0074) by @allens in #252
- Diagnose an expired sign-in instead of the pick-one credential menu by @allens in #253
- One count, one plural, one aligned-total table by @allens in #254
- Progress output: one line per pass, driven by a clock by @allens in #255
- Survive a background credential refresh that fails by @allens in #256
- Lifecycle windows as constants, asserted on the template by @allens in #257
- Drop surplus exports, fold the duplicated lifecycle test by @allens in #258
- Stop the walk losing files silently, and show progress in bytes by @allens in #259
- Retire the env-loaded tripwire that guards a caller which cannot exist by @allens in #263
- docs: split CLAUDE.md into project scope and user-only conventions (517 → 251) by @allens in #264
- Doc-rot sweep: four live claims naming symbols that no longer exist by @allens in #265
- refactor(skills): extract the sweep's stage-1 queries into scripts/sweep.mjs by @allens in #266
- Build(deps): Bump the aws-sdk group across 1 directory with 4 updates by @dependabot[bot] in #260
- Build(deps): Bump @smithy/shared-ini-file-loader from 4.6.15 to 4.6.16 by @dependabot[bot] in #261
- build(deps): group @smithy/* with the AWS SDK in Dependabot by @allens in #268
- Build(deps-dev): Bump globals from 17.8.0 to 17.9.0 in the dev-dependencies group by @dependabot[bot] in #270
- Retire the planned-stub convention; share countOf; drop the empty-file special case by @allens in #267
- sweep.mjs: a docs mode for names the live docs no longer define by @allens in #269
- Drop listSnapshotNames'
latestoption; the return type is always string[] by @allens in #271 - ci: a weekly fresh-deps canary, and auto-merge for Dependabot's npm updates by @allens in #272
- The over-engineering skill owns its own script by @allens in #273
- ci: drop Dependabot auto-merge, and gate releases on
npm auditby @allens in #274 - A pre-commit hook for the fast half of CI's lint job by @allens in #275
- Fix a dev-scoped advisory, and stop the lockfile leaking a private registry by @allens in #276
- Give the counted pass an owner, so the walk's line stops freezing by @allens in #277
- ci: make
ci gatefail closed by @allens in #278 - fix(cli): report an unknown help topic as a failure, not a silent success by @allens in #279
- refactor(lib): let
referenced.mjsanswer its own size questions by @allens in #280 - test(lib): make the drift-test flake say when the drift never happened by @allens in #281
- fix(auth): make a refused request say who it refused by @allens in #282
- List what a snapshot skipped, and say what it was by @allens in #283
- Stop saying pre-0072 snapshots are still read by @allens in #284
- Say what a finished backup actually did by @allens in #285
- Say what a file that was unreadable last time really is by @allens in #290
- Stop calling a folder we can't resolve missing by @allens in #289
- Fail a dropped snapshot download instead of stalling the parser by @allens in #291
- Show what the exclude patterns are dropping by @allens in #288
- Leave cloud placeholders online instead of downloading them by @allens in #292
- Fail CI when two ADRs claim the same number by @allens in #293
- Build(deps): Bump the aws-sdk group with 4 updates by @dependabot[bot] in #286
- Build(deps-dev): Bump the dev-dependencies group with 2 updates by @dependabot[bot] in #287
- Add the format-spec clean-room audit and its restorer by @allens in #294
- docs: stop advertising MinIO as a supported provider by @allens in #295
- Test-bucket naming convention + conformance provisioning by @allens in #296
- Model-based test suite with restore as the invariant by @allens in #297
- Crash-injection and multi-machine concurrency tier (real kills, real S3) by @allens in #298
- Snapshot #END trailer makes truncation loud (ADR-0082) by @allens in #299
- putFile verifies the streamed digest, closing the mid-transfer window (ADR-0083) by @allens in #300
- backup exits 1 when files couldn't be read by @allens in #301
- Trust a remote snapshot only when byte-identical to the local file (ADR-0084) by @allens in #302
- restore detects folded-name collisions by the filesystem's own equivalence (ADR-0086) by @allens in #304
- Serialize the real-bucket CI job so runs stop sharing the bucket by @allens in #306
- Move the repo to auto permission mode by @allens in #307
- Build(deps): Bump the aws-sdk group with 6 updates by @dependabot[bot] in #308
- Build(deps-dev): Bump the dev-dependencies group with 2 updates by @dependabot[bot] in #309
- Fix the uploadDir drift flake, and the restore --output bug behind it by @allens in #310
- Tell the truth when a minute-resolution name is already taken by @allens in #311
- Group the compare renderer's counts; delete the snapshotName alias by @allens in #312
- Count and pluralise in English, and hold restore's progress line still by @allens in #313
- Fix seven dead cross-links, and check them from now on by @allens in #314
- Finish the countOf sweep #313 started by @allens in #316
- Make the docs show what the code actually prints by @allens in #315
- Say the outcome once, on stdout, in forget and delete by @allens in #317
- Fix three printed remedies that no longer match the tool by @allens in #318
- Fix the release round trip, broken by ADR-0062 since July by @allens in #319
- Skip the release ship gate off main, instead of failing the matrix by @allens in #320
- chore: release 0.1.0 by @allens in #321
Full Changelog: v0.1.0-alpha.1...v0.1.0