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
Copy file name to clipboardExpand all lines: COMPLETED_TASKS.md
+13Lines changed: 13 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,6 +4,19 @@ Task cards moved here from ROADMAP.md after completion. Organized by milestone.
4
4
5
5
---
6
6
7
+
# M11 — Locksmith (v5.1.0) ✅ CLOSED
8
+
9
+
**Theme:** Multi-recipient encryption via envelope encryption (DEK/KEK model). Each file is encrypted with a random Data Encryption Key; the DEK is wrapped per-recipient. Adding or removing access never re-encrypts the data.
10
+
11
+
**Completed:** v5.1.0 (2026-02-28)
12
+
13
+
-**Task 11.1:** Envelope encryption (DEK/KEK model) — random 32-byte DEK encrypts content via existing AES-256-GCM pipeline; DEK is wrapped per-recipient with AES-256-GCM key-wrapping. Manifest stores `encryption.recipients: [{ label, wrappedDek, nonce, tag }]`. Restore tries each recipient entry to unwrap DEK. Full backward compatibility with old-style manifests.
14
+
-**Task 11.2:** Recipient management API — `addRecipient()` unwraps DEK with existing key, re-wraps for new recipient. `removeRecipient()` removes by label with last-recipient guard. `listRecipients()` returns labels. All return new immutable Manifest value objects. Defense-in-depth post-filter guard for corrupted manifests.
15
+
-**Task 11.3:** Manifest schema for multi-recipient metadata — `RecipientSchema` (Zod), `EncryptionSchema` extended with `recipients: z.array(RecipientSchema).min(1).optional()`. Error codes: `NO_MATCHING_RECIPIENT`, `DEK_UNWRAP_FAILED`, `RECIPIENT_NOT_FOUND`, `RECIPIENT_ALREADY_EXISTS`, `CANNOT_REMOVE_LAST_RECIPIENT`. `RecipientEntry` type exported.
16
+
-**Task 11.4:** CLI multi-recipient support — `--recipient <label:keyfile>` repeatable flag on `git cas store`, `git cas recipient add/remove/list` subcommands, mutual exclusivity guard (`--recipient` vs `--key-file`/`--vault-passphrase`), empty keyfile rejection.
17
+
18
+
---
19
+
7
20
# M10 — Hydra (v5.0.0) ✅ CLOSED
8
21
9
22
**Theme:** Content-defined chunking for dramatically better dedup on versioned files.
-**Vault** GC-safe ref-based storage. One ref (`refs/cas/vault`) indexes all assets by slug. No more silent data loss from `git gc`.
33
+
-**Interactive dashboard**`git cas inspect` with chunk heatmap, animated progress bars, and rich manifest views.
34
+
-**Verify & JSON output**`git cas verify` checks integrity; `--json` on all commands for CI/scripting.
32
35
33
36
**Use it for:** binary assets, build artifacts, model weights, data packs, secret bundles, weird experiments, etc.
34
37
35
38
<imgsrc="./docs/demo.gif"alt="git-cas demo" />
36
39
37
-
## What's new in v2.0.0
40
+
## What's new in v5.1.0
38
41
39
-
**Compression** — `compression: { algorithm: 'gzip' }` on `store()`. Compression runs before encryption. Decompression on `restore()` is automatic.
42
+
**Multi-recipient envelope encryption** — Each file is encrypted with a random DEK; recipient KEKs wrap the DEK. Add or remove team members without re-encrypting data.
40
43
41
-
**Passphrase-based encryption** — Pass `passphrase` instead of `encryptionKey`. Keys are derived via PBKDF2 (default) or scrypt. KDF parameters are stored in the manifest for deterministic re-derivation. Use `deriveKey()` directly for manual control.
44
+
```js
45
+
// API: store for multiple recipients
46
+
constmanifest=awaitcas.storeFile({
47
+
filePath:'./secrets.tar.gz',
48
+
slug:'prod-secrets',
49
+
recipients: [
50
+
{ label:'alice', key: aliceKey },
51
+
{ label:'bob', key: bobKey },
52
+
],
53
+
});
42
54
43
-
**Merkle tree manifests** — When chunk count exceeds `merkleThreshold` (default: 1000), manifests are automatically split into sub-manifests stored as separate blobs. `readManifest()` transparently reconstitutes them. Full backward compatibility with v1 manifests.
git cas store ./secrets.tar.gz --slug prod-secrets \
68
+
--recipient alice:./keys/alice.key \
69
+
--recipient bob:./keys/bob.key --tree
70
+
71
+
# Manage recipients
72
+
git cas recipient list prod-secrets
73
+
git cas recipient add prod-secrets --label carol --key-file ./keys/carol.key --existing-key-file ./keys/alice.key
74
+
git cas recipient remove prod-secrets --label bob
75
+
```
44
76
45
77
See [CHANGELOG.md](./CHANGELOG.md) for the full list of changes.
46
78
@@ -83,6 +115,28 @@ See [CHANGELOG.md](./CHANGELOG.md) for the full list of changes.
83
115
84
116
See [CHANGELOG.md](./CHANGELOG.md) for the full list of changes.
85
117
118
+
## What's new in v3.1.0
119
+
120
+
**Interactive vault dashboard** — `git cas inspect --slug my-asset` renders a rich TUI with chunk heatmap, encryption card, and history timeline. Animated progress bars for long store/restore operations.
121
+
122
+
See [CHANGELOG.md](./CHANGELOG.md) for the full list of changes.
123
+
124
+
## What's new in v3.0.0
125
+
126
+
**Vault** — GC-safe ref-based storage under `refs/cas/vault`. Assets are indexed by slug and survive `git gc`. Full CLI: `git cas vault init`, `list`, `info`, `remove`, `history`. Store with `--tree` to vault automatically.
127
+
128
+
See [CHANGELOG.md](./CHANGELOG.md) for the full list of changes.
129
+
130
+
## What's new in v2.0.0
131
+
132
+
**Compression** — `compression: { algorithm: 'gzip' }` on `store()`. Compression runs before encryption. Decompression on `restore()` is automatic.
133
+
134
+
**Passphrase-based encryption** — Pass `passphrase` instead of `encryptionKey`. Keys are derived via PBKDF2 (default) or scrypt. KDF parameters are stored in the manifest for deterministic re-derivation. Use `deriveKey()` directly for manual control.
135
+
136
+
**Merkle tree manifests** — When chunk count exceeds `merkleThreshold` (default: 1000), manifests are automatically split into sub-manifests stored as separate blobs. `readManifest()` transparently reconstitutes them. Full backward compatibility with v1 manifests.
137
+
138
+
See [CHANGELOG.md](./CHANGELOG.md) for the full list of changes.
0 commit comments