Kotlin/Compose Desktop application under desktop/ with: - Gradle build: Kotlin 2.1, Compose 1.8, gRPC/Protobuf codegen, detekt - ExoClient: gRPC client for both ArtifactService and KnowledgeGraphService - Obsidian-style layout: collapsible tree sidebar, contextual main panel - Five view modes: artifact detail, note editor, search results, catalog, graph (stub) - Unified search bar with selector prefix support - Command palette (Ctrl+Shift+A) for quick actions - Menu bar with keyboard shortcuts (Ctrl+I/L/F/Q) - Dark Material 3 theme - Detekt lint config with Compose/test naming exceptions - Unit tests for AppState and model types Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
6.4 KiB
6.4 KiB
Progress
Tracks implementation progress against the phases in PROJECT_PLAN.md.
Phase 1: Foundation — COMPLETE
Deliverables:
- Go module (
go.mod) atgit.wntrmute.dev/kyle/exo corepackage:Header,Metadata,Value,ObjectType,NewUUID,MapFromList/ListFromMap- SQLite migration framework with embedded SQL files (
db/migrations/) - Initial schema migration (
001_initial.sql): 13 tables covering shared infrastructure, bibliographic, and artifact repository - Database access layer:
Open(with WAL, foreign keys, busy timeout),StartTX/EndTX,ToDBTime/FromDBTime configpackage:Configstruct with paths for database, blob store, Minio endpoint, gRPC listen address.golangci.yaml— strict linting (errcheck, govet, gosec, staticcheck, revive, errorlint)Makefile— vet, lint, test, build targets- Full test coverage for all packages (core, db, config)
Files created:
go.mod,go.sumcore/core.go,core/core_test.godb/db.go,db/db_test.go,db/migrations/001_initial.sqlconfig/config.go,config/config_test.go.golangci.yaml,Makefile
Phase 2: Artifact Repository — COMPLETE
Deliverables:
artifactspackage:Artifact,Snapshot,BlobRef,Citation,Publishertypes withGet/StoremethodsMIMEtype alias for clarity- Tag and category management:
CreateTag/GetTag/GetAllTags,CreateCategory/GetCategory/GetAllCategories,GetArtifactIDsForTag - Metadata store/retrieve operations (
StoreMetadata/GetMetadata) blobpackage: Content-addressable blob store (SHA256 hashing, hierarchical directory layout, read/write/exists)- YAML import:
ArtifactYAML,SnapshotYAML,CitationYAMLwithToStd()conversions andLoadArtifactFromYAML - Protobuf message definitions for all artifact types (
proto/exo/v1/common.proto,proto/exo/v1/artifacts.proto) - gRPC service:
ArtifactServicewith create/get artifacts, store/retrieve blobs, manage tags/categories, search by tag serverpackage: Full gRPC service implementation with proto-domain conversion helpers- buf.yaml for proto linting, buf.gen.yaml for code generation
- Full test coverage for all packages (artifacts, blob, server)
Files created:
blob/blob.go,blob/blob_test.goartifacts/artifact.go,artifacts/citation.go,artifacts/publisher.go,artifacts/snapshot.goartifacts/metadata.go,artifacts/tagcat.go,artifacts/yaml.go,artifacts/artifacts_test.goproto/exo/v1/common.proto,proto/exo/v1/artifacts.protoproto/buf.yaml,proto/buf.gen.yamlproto/exo/v1/*.pb.go(generated)server/server.go,server/server_test.go
Phase 3: CLI Tools — COMPLETE
Deliverables:
exodserver binary: gRPC daemon with startup, graceful shutdown (SIGINT/SIGTERM), auto-migration, flag-based configuration (-listen,-base,-version)exoCLI binary:import(YAML artifacts),tag add/list,cat add/list,search tag- YAML import parser in CLI (converts to proto messages for gRPC transport)
- Environment variable support (
EXO_ADDRfor server address) - Makefile
buildtarget produces both binaries inbin/ - Version injection via
-ldflags
Files created:
cmd/exod/main.gocmd/exo/main.go,cmd/exo/yaml.go
Phase 4: Knowledge Graph — COMPLETE
Deliverables:
kgpackage:Node,Cell,Fact,Edgetypes withStore/Getmethods- Database schema migration (
002_knowledge_graph.sql): nodes, cells, facts, edges, node_tags, node_categories tables - Node hierarchy (parent/children), C2 wiki-style naming, lookup by name
- Cell content types (markdown, code, plain) with ordinal ordering
- EAV fact storage with transaction timestamps and retraction support
GetCurrentFactsForEntityapplies retraction logic to return only active facts- Edge types: child, parent, related, artifact_link (cross-pillar references)
- Protobuf definitions (
proto/exo/v1/kg.proto): Node, Cell, Fact, Edge messages and KnowledgeGraphService - gRPC service: CreateNode, GetNode, AddCell, RecordFact, GetFacts, AddEdge, GetEdges
- CLI commands:
exo node create <name>,exo node get <id> - KG service registered in exod
- Shared tag/category pool: nodes use the same tags/categories tables as artifacts
- Full test coverage (kg package: 10 tests covering nodes, cells, facts, edges, hierarchy, retractions)
Files created:
kg/node.go,kg/cell.go,kg/fact.go,kg/edge.go,kg/kg_test.godb/migrations/002_knowledge_graph.sqlproto/exo/v1/kg.proto,proto/exo/v1/kg.pb.go,proto/exo/v1/kg_grpc.pb.goserver/kg_server.go
Phase 5: Desktop Application — COMPLETE
Deliverables:
- Kotlin/Compose Multiplatform desktop application (
desktop/) - Gradle build with Kotlin 2.1, Compose 1.8, gRPC, Protobuf code generation
- gRPC client (
ExoClient) connecting to exod for both ArtifactService and KnowledgeGraphService - Observable
AppStatemodel driving reactive Compose UI - Tree/outline sidebar (Obsidian-style) showing KG hierarchy and unlinked artifacts section
- Contextual main panel: Artifact detail view, Note editor view, Search results view, Catalog view, Graph view stub
- Unified search bar with selector prefix support (
artifact:,note:,tag:,doi:,author:) - Command palette (Ctrl+Shift+A, IntelliJ-style): create note, import artifact, search, switch views
- Menu bar with keyboard shortcuts: Ctrl+I (import), Ctrl+L (new note), Ctrl+F (search), Ctrl+Q (quit)
- Dark theme (Material 3 dark color scheme)
- Detekt static analysis (
detekt.yml): strict config, Compose naming exceptions, test naming exceptions - Unit tests for AppState and model types (9 tests)
- Proto files copied and generated for Kotlin (artifacts, kg, common)
Files created:
desktop/build.gradle.kts,desktop/settings.gradle.kts,desktop/detekt.ymldesktop/src/main/proto/exo/v1/{common,artifacts,kg}.protodesktop/src/main/kotlin/dev/wntrmute/exo/Main.ktdesktop/src/main/kotlin/dev/wntrmute/exo/client/ExoClient.ktdesktop/src/main/kotlin/dev/wntrmute/exo/model/AppState.ktdesktop/src/main/kotlin/dev/wntrmute/exo/ui/{App,Sidebar,MainPanel,SearchBar,CommandPalette}.ktdesktop/src/test/kotlin/dev/wntrmute/exo/model/{AppStateTest,SearchResultTest}.kt