3.7 KiB
HANDOFF.md
State of the notfiles repo as of 2026-04-01.
What Was Done
Session 1 (2026-03-31)
Restructured from a flat src/ layout into a Cargo workspace of 5 crates:
notcore— shared library (types, config, paths, errors)notfiles— dotfiles linker, migrated fromsrc/notsecrets— age key retrieval (Bitwarden/file/prompt) + SOPS decryptnothooks— Nushell hook runner with phase/state trackingnotstrap— new-machine bootstrap orchestrator
Session 2 (2026-04-01)
Completed the age-native redesign of notsecrets — all 12 tasks done.
All tasks complete:
| Task | Status | Commit |
|---|---|---|
| 1: Scaffold (Cargo.toml, error.rs, domain types, legacy shim) | ✅ | 34d9e3d |
| 2: format.rs (age wire format parser/serializer) | ✅ | 2476daa |
| 3: X25519 identity + recipient | ✅ | 6202c5d |
| 4: Scrypt identity + recipient | ✅ | b899198 |
| 5: SSH Ed25519 identity + recipient | ✅ | 566501c |
| 6: SSH RSA identity + recipient | ✅ | a0fe6f7 |
| 7: EncryptedIdentity (passphrase-protected identity file) | ✅ | 545a45b |
| 8: Encryptor — multi-recipient age encryption | ✅ | 9863af6 |
| 9: Decryptor + wire EncryptedIdentity | ✅ | e388d75 |
| 10+11: sources/ migration + resolve_identities() | ✅ | f80ea02 |
| 12: notstrap migration, remove sops shell-out | ✅ | 58de007 |
Current state:
- 80 tests pass, 0 clippy warnings,
cargo check --workspaceclean _legacy.rsdeleted; all deprecated shims removednotsecretsis now a self-contained age encryption/decryption librarynotstrapusesresolve_identities+Decryptordirectly; no sops shell-outEnvInjectorchanged toFnOnce;main.rssetsenv_injector: None- Example at
crates/notsecrets/examples/age_smoke.rsdemonstrates round-trip encrypt/decrypt
Also done this session (outside notfiles):
- Fixed
~/.config/sops/age/keys.txt— wasAGE-SECRET-KEY-1TESTKEYplaceholder, now real key from 1Password itemage-key-dotfiles(UUID6meypnchchq3tsb32mdnzxtlia) env.nunow self-healskeys.txtfrom 1Password on fresh login if missing/placeholder- Expanded
~/.secretsto cover 18 keys (AWS, Docker, GitHub, Slack, ElevenLabs, Groq, Mistral, LangChain/Smith, SerpAPI, Twilio, Tavily, Context7) — all viaop://UUID refs, resolved byop injectat shell startup - Removed duplicate
op readcalls for OPENAI/ANTHROPIC fromenv.nu - Cleaned up
~/.config/dev-bootstrap/secrets.env— removed TAVILY/CONTEXT7 (now in~/.secrets), kept non-secret MCP config vars
Pending Issues
1. Push to remote
Several commits ahead of gitea/main. Push when ready.
2. notstrap has an empty lib.rs
crates/notstrap/src/lib.rs is empty — created as a stub. Either delete [lib] from notstrap/Cargo.toml or remove the file.
3. notstrap config not documented
notstrap.toml format is defined inline via serde structs but never written down. A sample config would help.
4. Integration test coverage for nothooks assumes nu in PATH
nothooks integration tests call nu directly. CI needs nu installed or tests need #[ignore] + feature flag.
5. notstrap sops_file path footgun
If sops_file in notstrap.toml is an absolute path, the join will silently override the base. Low priority.
6. HuggingFace token not in ~/.secrets
No API token found in 1Password — only login credentials. Add token manually if needed.
7. notsecrets is not wire-compatible with standard age
The Encryptor/Decryptor use single-block ChaCha20-Poly1305 rather than the STREAM construction. Files encrypted by notsecrets cannot be decrypted by rage/age CLI and vice versa. This is intentional per the spec but worth documenting.