SQLite key-value store wrapper
Find a file
Virgil 79581e9824 docs(store): tighten workspace AX comments
Align workspace public comments with the AX guidance by using more concrete examples and clearer phrasing.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-03 07:17:46 +00:00
.core chore: add .core/ build and release configs 2026-03-06 18:52:37 +00:00
.forgejo/workflows ci: add Forgejo Actions test and security scan workflows 2026-02-23 03:28:08 +00:00
.github/workflows ci: add Core ecosystem CI workflow with CodeRabbit auto-fix 2026-03-17 14:05:30 +00:00
docs feat(store): add prefix cleanup helpers 2026-04-03 07:14:22 +00:00
.editorconfig chore: add Go repo norms (badges, contributing, lint, taskfile, editorconfig) 2026-02-23 06:45:49 +00:00
.gitignore chore: add .core/ and .idea/ to .gitignore 2026-03-15 10:17:50 +00:00
.golangci.yml chore(repo): enforce AX review conventions 2026-03-26 11:17:06 +00:00
bench_test.go refactor(store): tighten AX naming and examples 2026-03-30 18:17:07 +00:00
CLAUDE.md docs(store): align agent-facing file layout docs 2026-04-03 06:20:04 +00:00
CODEX.md docs(store): align agent-facing file layout docs 2026-04-03 06:20:04 +00:00
compact.go fix(store): add nil-safe guards 2026-04-03 06:31:35 +00:00
compact_test.go feat(store): add zstd archive support 2026-03-30 20:53:12 +00:00
CONTRIBUTING.md chore: add Go repo norms (badges, contributing, lint, taskfile, editorconfig) 2026-02-23 06:45:49 +00:00
conventions_test.go docs(ax): add Codex conventions bridge 2026-03-30 15:16:16 +00:00
coverage_test.go refactor(store): clarify backing store names 2026-04-03 06:35:23 +00:00
doc.go docs(store): clarify workspace recovery flow 2026-04-03 07:08:33 +00:00
events.go fix(store): add nil-safe guards 2026-04-03 06:31:35 +00:00
events_test.go refactor(scope): make scoped helpers explicit 2026-04-03 05:45:24 +00:00
go.mod feat(store): add zstd archive support 2026-03-30 20:53:12 +00:00
go.sum feat(store): add zstd archive support 2026-03-30 20:53:12 +00:00
journal.go refactor(store): tighten AX workspace naming 2026-04-03 06:51:49 +00:00
journal_test.go fix(store): honour Flux range stop bound 2026-04-03 04:50:26 +00:00
README.md refactor(scope): make scoped helpers explicit 2026-04-03 05:45:24 +00:00
scope.go feat(store): add prefix cleanup helpers 2026-04-03 07:14:22 +00:00
scope_test.go feat(store): add prefix cleanup helpers 2026-04-03 07:14:22 +00:00
store.go feat(store): add prefix cleanup helpers 2026-04-03 07:14:22 +00:00
store_test.go feat(store): add prefix cleanup helpers 2026-04-03 07:14:22 +00:00
test_helpers_test.go feat(store): implement RFC workspace and journal surfaces 2026-03-30 20:46:43 +00:00
workspace.go docs(store): tighten workspace AX comments 2026-04-03 07:17:46 +00:00
workspace_test.go refactor(workspace): keep orphan recovery explicit 2026-04-03 07:04:33 +00:00

Go Reference License: EUPL-1.2 Go Version

go-store

Group-namespaced SQLite key-value store with TTL expiry, namespace isolation, quota enforcement, and a reactive event system. Backed by a pure-Go SQLite driver (no CGO), uses WAL mode for concurrent reads, and enforces a single connection to keep pragma settings consistent. Supports scoped stores for multi-tenant use, Watch/Unwatch subscriptions, and OnChange callbacks for downstream event consumers.

Module: dappco.re/go/core/store Licence: EUPL-1.2 Language: Go 1.26

Quick Start

package main

import (
	"fmt"
	"time"

	"dappco.re/go/core/store"
)

func main() {
	// Store the database on disk with "/tmp/go-store.db", or use ":memory:" for ephemeral data.
	storeInstance, err := store.New("/tmp/go-store.db")
	if err != nil {
		return
	}
	defer storeInstance.Close()

	if err := storeInstance.Set("config", "colour", "blue"); err != nil {
		return
	}
	if err := storeInstance.SetWithTTL("session", "token", "abc123", 24*time.Hour); err != nil {
		return
	}
	colourValue, err := storeInstance.Get("config", "colour")
	if err != nil {
		return
	}
	fmt.Println(colourValue)

	// Watch "config" mutations and print each event as it arrives.
	events := storeInstance.Watch("config")
	defer storeInstance.Unwatch("config", events)
	go func() {
		for event := range events {
			fmt.Println(event.Type, event.Group, event.Key, event.Value)
		}
	}()

	// Store tenant-42 preferences under the "tenant-42:" prefix.
	scopedStore := store.NewScoped(storeInstance, "tenant-42")
	if scopedStore == nil {
		return
	}
	if err := scopedStore.SetIn("preferences", "locale", "en-GB"); err != nil {
		return
	}
}

Documentation

  • Agent Conventions - Codex-facing repo rules and AX notes
  • AX RFC - naming, comment, and path conventions for agent consumers
  • Architecture — storage layer, group/key model, TTL expiry, event system, namespace isolation
  • Development Guide — prerequisites, test patterns, benchmarks, adding methods
  • Project History — completed phases, known limitations, future considerations

Build & Test

go test ./...
go test -race ./...
go test -bench=. ./...
go build ./...

Licence

European Union Public Licence 1.2 — see LICENCE for details.