Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
6b74ae2
fix(io): address audit issue 4 findings
Mar 23, 2026
238d6c6
chore(ax): align imports, tests, and usage comments
Mar 26, 2026
514ecd7
fix(io): enforce ax v0.8.0 polish spec
Mar 26, 2026
5e4bc3b
test(ax): cover wrapper APIs and add package docs
Mar 30, 2026
bdd925e
Add complete API reference
Mar 30, 2026
61193c0
fix: use UK English spelling throughout
Mar 30, 2026
aaf0aca
docs: add AX design principles RFC for agent dispatch
Snider Mar 30, 2026
d9f5b71
refactor(ax): replace option chains with config structs
Mar 30, 2026
977218c
docs: align CLAUDE with s3 client rename
Mar 30, 2026
5f780e6
refactor(ax): normalize remaining agent-facing names
Mar 30, 2026
1743b98
refactor(ax): remove remaining short names
Mar 30, 2026
0cb5985
refactor(ax): expand remaining API names
Mar 30, 2026
d900a78
refactor(ax): replace placeholder doc comments
Mar 30, 2026
518309a
refactor(ax): add explicit node traversal options
Mar 30, 2026
b19617c
refactor(ax): prune redundant api comments
Mar 30, 2026
9fb978d
refactor(ax): make docs and helpers example-driven
Mar 30, 2026
b0bcdad
refactor(ax): make store and traversal explicit
Mar 30, 2026
d175fc2
refactor(ax): make names and errors explicit
Mar 30, 2026
48c328f
refactor(ax): tighten names and ipc keys
Mar 30, 2026
f0b828a
refactor(ax): drop legacy compatibility shims
Mar 30, 2026
d5b5915
refactor(ax): make sigil names explicit
Mar 30, 2026
41dd111
refactor(ax): make exported docs example-driven
Mar 30, 2026
16d968b
refactor(ax): make public docs example-driven
Mar 30, 2026
a8eaaa1
refactor(ax): tighten AX-facing docs
Mar 30, 2026
bab889e
refactor(ax): clarify core storage names
Mar 30, 2026
d4615a2
refactor(ax): align backend names and examples
Mar 30, 2026
c0ee582
refactor(ax): expand semantic backend naming
Mar 30, 2026
25b12a2
refactor(ax): add memory medium aliases
Mar 30, 2026
e8b87df
refactor(ax): make memory medium primary
Mar 30, 2026
0927aab
refactor: align AX surfaces and semantic file names
Mar 30, 2026
a8caeda
docs(local): convert constructor note to usage example
Mar 30, 2026
fc34a75
refactor(ax): continue AX surface alignment
Mar 30, 2026
14418b7
refactor: tighten AX-facing comments
Mar 30, 2026
64427ae
refactor(ax): add semantic workspace message handler
Mar 30, 2026
64854a8
refactor(ax): simplify workspace options
Mar 30, 2026
3a5f9bb
refactor(ax): encapsulate memory medium internals
Mar 30, 2026
b80a162
refactor(ax): rename placeholder test cases
Mar 30, 2026
f8988c5
refactor(ax): tighten naming and comment surfaces
Mar 30, 2026
347c4b1
refactor(ax): trim prose comments to examples
Mar 30, 2026
32cfabb
refactor(ax): normalize remaining usage examples
Mar 31, 2026
6aa96dc
refactor(ax): align remaining example names and walk APIs
Mar 31, 2026
1cc185c
Align node and sigil APIs with AX principles
Mar 31, 2026
313b704
refactor(ax): trim test prose comments
Mar 31, 2026
619f731
refactor(ax): align remaining semantic names
Mar 31, 2026
9f0e155
refactor(ax): rename workspace provider surface
Mar 31, 2026
bcf780c
refactor(ax): align memory medium test names
Mar 31, 2026
a290cba
refactor(ax): remove redundant compatibility surfaces
Mar 31, 2026
b3d12ce
refactor(ax): remove fileget/fileset compatibility aliases
Mar 31, 2026
38066a6
refactor(ax): rename workspace file helpers
Mar 31, 2026
3054217
refactor(ax): remove workspace message compatibility map
Mar 31, 2026
97535f6
docs(ax): align guidance with current medium surface
Mar 31, 2026
cc2b553
docs(ax): align RFC API reference with current surfaces
Mar 31, 2026
48b7776
refactor(workspace): fail unsupported workspace messages explicitly
Mar 31, 2026
378fc7c
docs(ax): align sigil references with current surfaces
Mar 31, 2026
702286a
feat(ax): apply AX compliance sweep — usage examples and predictable …
Snider Mar 31, 2026
e1efd36
refactor(ax): align remaining AX docs and invalid-input errors
Mar 31, 2026
eab112c
refactor(workspace): accept declarative root and medium options
Mar 31, 2026
bd8d7c6
refactor(ax): tighten local naming
Mar 31, 2026
50bb356
refactor(ax): align remaining AX naming surfaces
Mar 31, 2026
c6adf47
refactor(ax): rename nonce helper for clearer naming
Mar 31, 2026
45bd963
refactor(workspace): harden path boundaries and naming
Mar 31, 2026
e922734
refactor(store): rename key-value store surface
Mar 31, 2026
9dbcc5d
refactor(ax): rename medium test variables and examples
Mar 31, 2026
db6bbb6
refactor(ax): normalize interface compliance test names
Mar 31, 2026
bf4ba41
refactor(ax): demote internal memory helpers and document sigil errors
Mar 31, 2026
ede0c8b
refactor(ax): rename remaining test helpers and examples
Mar 31, 2026
15b6074
refactor(ax): align remaining AX surfaces
Mar 31, 2026
c713baf
refactor(ax): align remaining AX examples and names
Mar 31, 2026
df9c443
feat(workspace): encrypt workspace files using ChaChaPolySigil
Snider Mar 31, 2026
cee004f
feat(io): export memory file helpers
Apr 1, 2026
35b725d
Preserve MemoryMedium file modes
Apr 1, 2026
3c8c163
Polish io memory medium naming
Apr 3, 2026
3efb43a
Improve memory medium metadata
Apr 3, 2026
8994c8b
Infer in-memory directory paths
Apr 3, 2026
ef58763
Refine io memory helpers
Apr 3, 2026
c60c4d9
docs: add AX examples to memory medium
Apr 3, 2026
2f186d2
Align workspace docs with AX examples
Apr 3, 2026
c95697e
Sort local listings deterministically
Apr 3, 2026
5e14c79
Lock in io helper interfaces
Apr 3, 2026
a6d473f
merge: resolve dev←github/main conflicts — accept dev restructure
Snider Apr 5, 2026
a43a16f
fix: address CodeRabbit PR #2 findings
Snider Apr 5, 2026
2c18322
fix: address CodeRabbit PR #2 findings (batch 2)
Snider Apr 5, 2026
054be73
fix: address CodeRabbit PR #2 findings (batch 3)
Snider Apr 5, 2026
d07c4ce
fix(store): export ErrNotDirectory sentinel and fix duplicate RFC met…
Snider Apr 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ GOWORK=off go test -cover ./...

### Core Interface

`io.Medium` — 18 methods: Read, Write, EnsureDir, IsFile, FileGet, FileSet, Delete, DeleteAll, Rename, List, Stat, Open, Create, Append, ReadStream, WriteStream, Exists, IsDir.
`io.Medium` — 17 methods: Read, Write, WriteMode, EnsureDir, IsFile, Delete, DeleteAll, Rename, List, Stat, Open, Create, Append, ReadStream, WriteStream, Exists, IsDir.

```go
// Sandboxed to a project directory
Expand All @@ -60,7 +60,7 @@ io.Copy(s3Medium, "backup.tar", localMedium, "restore/backup.tar")
| `datanode` | Borg DataNode | Thread-safe (RWMutex) in-memory, snapshot/restore via tar |
| `store` | SQLite KV store | Group-namespaced key-value with Go template rendering |
| `workspace` | Core service | Encrypted workspaces, SHA-256 IDs, PGP keypairs |
| `MockMedium` | In-memory map | Testing — no filesystem needed |
| `MemoryMedium` | In-memory map | Testing — no filesystem needed |

`store.Medium` maps filesystem paths as `group/key` — first path segment is the group, remainder is the key. `List("")` returns groups as directories.

Expand Down Expand Up @@ -128,8 +128,8 @@ Backend packages use `var _ io.Medium = (*Medium)(nil)` to verify interface comp

### Sentinel Errors

Sentinel errors (`var ErrNotFound`, `var ErrInvalidKey`, etc.) use standard `errors.New()` — this is correct Go convention. Only inline error returns in functions should use `coreerr.E()`.
Sentinel errors (`var NotFoundError`, `var InvalidKeyError`, etc.) use standard `errors.New()` — this is correct Go convention. Only inline error returns in functions should use `coreerr.E()`.

## Testing

Use `io.MockMedium` or `io.NewSandboxed(t.TempDir())` in tests — never hit real S3/SQLite unless integration testing. S3 tests use an interface-based mock (`s3API`).
Use `io.NewMemoryMedium()` or `io.NewSandboxed(t.TempDir())` in tests — never hit real S3/SQLite unless integration testing. S3 tests use an interface-based mock (`s3.Client`).
24 changes: 12 additions & 12 deletions bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,31 @@ import (
"testing"
)

func BenchmarkMockMedium_Write(b *testing.B) {
m := NewMockMedium()
func BenchmarkMemoryMedium_Write(b *testing.B) {
medium := NewMemoryMedium()
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = m.Write("test.txt", "some content")
_ = medium.Write("test.txt", "some content")
}
}

func BenchmarkMockMedium_Read(b *testing.B) {
m := NewMockMedium()
_ = m.Write("test.txt", "some content")
func BenchmarkMemoryMedium_Read(b *testing.B) {
medium := NewMemoryMedium()
_ = medium.Write("test.txt", "some content")
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _ = m.Read("test.txt")
_, _ = medium.Read("test.txt")
}
}

func BenchmarkMockMedium_List(b *testing.B) {
m := NewMockMedium()
_ = m.EnsureDir("dir")
func BenchmarkMemoryMedium_List(b *testing.B) {
medium := NewMemoryMedium()
_ = medium.EnsureDir("dir")
for i := 0; i < 100; i++ {
_ = m.Write("dir/file"+string(rune(i))+".txt", "content")
_ = medium.Write("dir/file"+string(rune(i))+".txt", "content")
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _ = m.List("dir")
_, _ = medium.List("dir")
}
}
260 changes: 0 additions & 260 deletions client_test.go

This file was deleted.

Loading
Loading