Layer A + B of convergence wave. Extract common SQLite-CRUD + graph logic into kei-entity-store engine; introduce JSON Schema fragments; pilot-migrate kei-task to verify parity. New crate _primitives/_rust/kei-entity-store/ (1151 LOC): - src/schema.rs — EntitySchema + FieldDef + enabled_verbs + fts_columns + edge_table + custom_migrations - src/engine.rs — Store::open with WAL pragma + migration runner - src/verbs/ — 8 data-driven verb modules (create/get/list/search/ update/delete/link/rank) uniform JSON-in/JSON-out signature - src/error.rs — typed VerbError enum - tests/verb_smoke.rs — 10/10 green New _schemas/fragments/ (83 LOC JSON): - entity-base.json, titled.json, titled-content.json, edge.json kei-task pilot migration: - TASK_SCHEMA: EntitySchema static (67 LOC, was 58) - store.rs becomes thin shim over engine::Store - atoms/create.rs + atoms/search.rs delegate to engine verbs - atoms/schemas/*.json use $ref to _schemas/fragments/ (DRY) - Task-specific secondary tables (milestones, task_deps) stay via schema.custom_migrations; cycle-detection in deps.rs stays hand-rolled (domain logic, not generic CRUD) - 9/9 tests green — full behavioural parity Convergence delta: - kei-task touched files: 342 → 389 LOC (+47 for JSON marshalling boundary; net wash on pilot) - BUT each remaining 5 sibling crate can shrink ~400-500 LOC on migration - Expected total reduction when all 6 migrated: ~2500 LOC across the cluster Follow-ups declared: - Migrate kei-chat-store, kei-content-store, kei-social-store to engine - Migrate kei-sage (needs string-id edge variant; currently generic link/rank assume int ids) - Migrate kei-crossdomain - Expose list/delete atoms in kei-task (engine supports, atoms not yet) - Fold kei-curator as engine::hygiene module (per P4 audit) - Fold kei-search-core entities, keep workflow as thin kei-search-pipeline Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
33 lines
787 B
TOML
33 lines
787 B
TOML
[package]
|
|
name = "kei-task"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
rust-version = "1.75"
|
|
description = "Task DAG with deps + milestones (SQLite). Port of LBM internal/task."
|
|
|
|
[package.metadata.keisei]
|
|
backend = "sqlite"
|
|
db_env = "KEI_TASK_DB"
|
|
db_default = "~/.claude/task/task.sqlite"
|
|
migrations_dir = "migrations/"
|
|
schema_version = 1
|
|
|
|
[[bin]]
|
|
name = "kei-task"
|
|
path = "src/main.rs"
|
|
|
|
[lib]
|
|
name = "kei_task"
|
|
path = "src/lib.rs"
|
|
|
|
[dependencies]
|
|
kei-entity-store = { path = "../kei-entity-store" }
|
|
rusqlite = { version = "0.31", features = ["bundled"] }
|
|
clap = { version = "4", features = ["derive"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
anyhow = "1"
|
|
chrono = { version = "0.4", default-features = false, features = ["clock"] }
|
|
|
|
[dev-dependencies]
|
|
tempfile = "3"
|