Skip to main content

lightweight, file-based issue tracking for AI agents (and humans)

Project description

Dogcat - lightweight, file-based issue tracking and memory upgrade for AI agents (and humans!)

dogcat is a memory upgrade for AI agents. No more tracking issues and progress in Markdown files and burning your context window on them. With a simple command line utility (and some TUI niceties!) you can create, edit, manage and display issues.

Installation

Homebrew (macOS)

brew install oroddlokken/tap/dogcat

This installs dcat/dogcat and handles Python and dependencies automatically via uv.

pip / pipx / uv (all platforms)

# With uv (recommended for CLI tools)
uv tool install dogcat

# With pipx
pipx install dogcat

# With pip
pip install dogcat

From source

Install uv, then run ./dcat.py.

Usage

Run dcat init to initialize the program. Then you can run dcat prime to see the information an AI agent should use.
For a guide more suited for humans, run dcat guide.

Alternatively, you can run dcat init --use-existing-folder /home/me/project/.dogcats to use a shared dogcat database.

If you don't want to store issues in git, use dcat init --no-git.

Telling your agent to use dogcat

In your AGENTS.md/CLAUDE.md file, add something like the following:

# Agent Instructions

## Issue tracking

This project uses **dcat** for issue tracking. You MUST run `dcat prime --opinionated` for instructions.
Then run `dcat list --agent-only` to see the list of issues. Generally we work on bugs first, and always on high priority issues first.

When running multiple `dcat` commands, make separate parallel Bash tool calls instead of chaining them with `&&` and `echo` separators.

Mark each issue `in_progress` right when you start working on it — not before. Set `in_review` when work on that issue is done before moving on. The status should reflect what you are *actually* working on right now.

It is okay to work on multiple related issues at the same time, but do NOT batch-mark an entire backlog as `in_progress` upfront. If there is a priority conflict, ask the user which to focus on first.

If the user brings up a new bug, feature or anything else that warrants changes to the code, ALWAYS ask if we should create an issue for it before you start working on the code. When creating issues, set appropriate labels using `--labels` based on the issue content (e.g. `cli`, `tui`, `api`, `docs`, `testing`, `refactor`, `ux`, `performance`, etc.).

When research or discussion produces findings relevant to an existing issue, ask these as **separate questions in order**:

1. First ask: "Should I update issue [id] with these findings?"
2. Only after that, separately ask: "Should I start working on the implementation?"
Do NOT combine these into one question. The user may want to update the issue without starting work.

### Closing Issues - IMPORTANT

NEVER close issues without explicit user approval. When work is complete:

1. Set status to `in_review`: `dcat update --status in_review $issueId`
2. Ask the user to test
3. Ask if we can close it: "Can I close issue [id] '[title]'?"
4. Only run `dcat close` after user confirms
5. Ask: "Should I add this to CHANGELOG.md?" — update if yes

This is only a starting point - it's up to you to decide how dogcat fits best in your workflow!
You can always run dcat example-md to get an example of what to put in your AGENTS.md/CLAUDE.md file.

dcat prime mainly concerns itself on how to use the dcat CLI, not how your workflow should be.
dcat prime --opinionated is a more opinionated version of the guide for agents, with stricter guidelines.

You can run diff <(dcat prime) <(dcat prime --opinionated) to see the differences.

Command cheat sheet

Command Action
Creating
dcat create "My first bug" -t bug -p 0 Create a bug issue, with priority 0
dcat c b 0 "My first bug" Same as above, using dcat c shorthands for type and priority
dcat create "Turn off the lights" --manual Create a manual issue (not for agents)
Viewing
dcat list List all open issues
dcat list --tree List issues as a parent-child tree
dcat show $id Show full details about an issue
dcat show $id1 $id2 Show several issues, separated by a rule (NDJSON with --json)
dcat search "login" Search issues across all fields
dcat search "bug" --type bug Search with type filter
dcat labels List all labels with counts
Visualizing
dcat graph Show the full dependency graph as ASCII
dcat graph $id Show the subgraph reachable from an issue
Filtering
dcat ready List issues not blocked by other issues
dcat blocked List all blocked issues
dcat in-progress List issues currently in progress
dcat in-review List issues currently in review
dcat pr List issues in progress and in review
dcat manual List issues marked as manual
dcat recently-added List recently added issues
dcat recently-closed List recently closed issues
Updating
dcat update $id --status in_progress Update an issue's status
dcat close $id --reason "Fixed the bug" Close an issue with reason
dcat reopen $id Reopen a closed issue
dcat delete $id Delete an issue (soft delete)
TUI
dcat tui Launch the interactive TUI dashboard
dcat new Interactive TUI for creating a new issue
dcat edit [$id] Interactive TUI for editing an issue
Git & maintenance
dcat git setup Install the JSONL merge driver for git
dcat history Show change history timeline
dcat diff Show uncommitted issue changes
dcat doctor Run health checks on issue data
dcat archive Archive closed issues to reduce startup load
dcat prune Permanently remove deleted issues
dcat config Manage dogcat configuration
dcat stream Stream issue changes in real-time (JSONL)

Git Workflows: Merges and Field-Level Conflicts

Dogcat uses a custom merge driver (dcat git setup installs it) to automatically resolve JSONL conflicts. The driver implements a state-based merge algebra:

  • Issues: Last-Writer-Wins (LWW) by updated_at timestamp. When both branches edit the same issue, the one with the later timestamp wins entirely — this means concurrent edits to different fields on the same issue may result in data loss. For example, if branch A edits the title and branch B edits the priority (with a later timestamp), B's entire record wins and A's title edit is lost.

  • Proposals: LWW by status finality (open < closed < tombstone), then by updated_at. Once a proposal is closed or tombstoned, it cannot be reverted.

  • Dependencies & Links: Three-way merge with add/remove semantics. Deletes on one side win over silent no-ops on the other.

  • Events: Append-only, deduplicated by identity.

Detecting field-level conflicts: After a merge, run dcat doctor --post-merge to detect concurrent edits. The output shows which fields were affected and their values on each branch. This helps identify unintended data loss from LWW resolution. If you detect unexpected conflicts, coordinate edits across branches or use dcat update to manually restore lost changes.

Screenshots

Compact table view showing tasks with ID, Parent, Type, Priority, and Title columns:
Table View

Hierarchical tree view displaying parent-child issue relationships:
Tree View

Detailed list view with status indicators and full issue information:
List View

Ready view showing unblocked issues available for work:
Ready issues

Detailed issue view with description, acceptance criteria, and metadata:
Issue Details

TUI for creating new issues (dcat new):
New issue

TUI for editing issues, select the one you want to edit (dcat edit):
Select issue to edit

TUI for editing issues (dcat edit $id):
Edit issue

List issues in progress:
Issues in progress

List issues in review:
Issues in review

Tips & tricks

Personally, I use these aliases:

alias dcl="dcat list --tree"
alias dct="dcat list --table"

alias dcn="dcat new"
alias dce="dcat edit"

FAQ

What's a dogcat?
¯_(ツ)_/¯ Some cats are dog-like, and some dogs are cat-like.

Why Python?
I wanted to use Textual, which is awesome for making TUIs with. It's also the language I am the most familiar with.

Development

dogcat is now in a state where it can be dogfooded. Included is the issues.jsonl file containing the current issues.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dogcat-0.12.2.tar.gz (4.3 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dogcat-0.12.2-py3-none-any.whl (250.6 kB view details)

Uploaded Python 3

File details

Details for the file dogcat-0.12.2.tar.gz.

File metadata

  • Download URL: dogcat-0.12.2.tar.gz
  • Upload date:
  • Size: 4.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dogcat-0.12.2.tar.gz
Algorithm Hash digest
SHA256 c9ae1363d2209e0bb408b6ce919c31c6dc257d001ed6ce0ea19a20f9ad617e32
MD5 617d5113329e16e929b2b795a827486d
BLAKE2b-256 a536e7ed2bcecef845d272176053af14fde16bd19116e1b12cd5a3bb7eaac31c

See more details on using hashes here.

Provenance

The following attestation bundles were made for dogcat-0.12.2.tar.gz:

Publisher: publish.yml on oroddlokken/dogcat

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dogcat-0.12.2-py3-none-any.whl.

File metadata

  • Download URL: dogcat-0.12.2-py3-none-any.whl
  • Upload date:
  • Size: 250.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dogcat-0.12.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e859264a6adee4de4c0e75644ed84aa2173fd2a05cbedf0588b4338c2a0fc954
MD5 680bc176856545aebf28d79c620d66d0
BLAKE2b-256 6e73186eb9e54b10571502ad34aabe27ef58a64c288dca1058e2a40dd6344dca

See more details on using hashes here.

Provenance

The following attestation bundles were made for dogcat-0.12.2-py3-none-any.whl:

Publisher: publish.yml on oroddlokken/dogcat

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page