Skip to main content

Module issues

Module issues 

Source
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 StateStore port? Issues are documents that humans open in $EDITOR, commit to git, and diff. StateStore is an opaque KV/append blob. Different workload, different storage shape.
  • Optimistic concurrency (content-hash CAS). Mutations take an optional content_hash captured at the last read. The write is rejected if the on-disk content has changed since. This is the exact pattern used by the edit tool (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> (see liveness). When the owning process exits — including kill -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.