Expand description
Local issue tracking system — GitHub-style issues stored as markdown files.
Issues live in .oxicode/issues/ at the project root (discovered by walking
up from the current directory until .oxicode/ is found, mirroring
Settings::find_project_settings). Each issue is a single markdown file
with a YAML frontmatter block holding structured metadata, followed by a
free-form markdown body:
---
id: 12
title: "Fix login bug"
status: open
priority: high
labels: [bug, auth]
assignee: null
created_at: 2026-06-17T10:30:00Z
updated_at: 2026-06-17T14:20:00Z
closed_at: null
sessions: [abc123, def456]
assigned_to: null
github: null
---
Free-form markdown body...§Design decisions
- Why not a
StateStoreport? Issues are documents that humans open in$EDITOR, commit to git, and diff.StateStoreis an opaque KV/append blob. Different workload, different storage shape. - Optimistic concurrency (content-hash CAS). Mutations take an optional
content_hashcaptured at the last read. The write is rejected if the on-disk content has changed since. This is the exact pattern used by theedittool (oxicode-agent/src/tools/edit.rs), so external edits (e.g. someone editing the file in vim) are detected without any locking. - Atomic writes via temp+rename.
- Assignment is process-liveness based, not time based. An assigned
issue records the owning session id. Whether that session is still alive
is determined by an OS-held advisory lock on
.oxicode/issues/.alive/<session_id>(seeliveness). When the owning process exits — includingkill -9, crash, or terminal close — the OS releases the lock and the assignment becomes stale and reclaimable.
Re-exports§
pub use error::IssueError;pub use filter::IssueFilter;pub use serialize::content_hash;pub use serialize::issue_filename;pub use serialize::issues_dir;pub use serialize::parse_issue;pub use serialize::serialize_issue;pub use store::FileIssueStore;pub use store::IssueSummary;pub use types::Assignment;pub use types::GithubRef;pub use types::Issue;pub use types::IssueMeta;pub use types::IssuePatch;pub use types::Priority;pub use types::Status;
Modules§
- error
- Errors returned by issue operations.
- filter
- Filter predicates for
crate::issues::FileIssueStore::list. - liveness
- Process-liveness tracking via OS advisory locks.
- serialize
- Markdown + YAML frontmatter serialization for issues.
- store
- File-backed issue store + cached summary view.
- types
- Issue domain types: status, priority, assignment, metadata, body.