Skip to main content

Documentation Oriented Grammar (DOG) CLI Tool

Project description

DOG

DOG

Documentation Oriented Grammar — A Markdown-native format for system documentation that serves humans and AI agents alike.

Available on: pypi


Quick Start

Installation

pip install dog-cli
# or with uv
uv add dog-cli

Basic Usage

# Validate your docs
dog lint docs/

# Format files
dog format docs/

# Generate project index
dog index docs/ --name "My Project"

# Search for concepts
dog search "login" --path docs/

# Get a specific document
dog get "@User" --path docs/

# List all documents
dog list --path docs/

# Find what references a primitive
dog refs "#AuthService" --path docs/

# Generate dependency graph
dog graph --path docs/ | dot -Tpng -o graph.png

# Export all docs as JSON
dog export --path docs/ > context.json

# Serve documentation in browser
dog serve docs/

Agent System Prompt

This is an example system prompt (agent definition) in Claude Code. Use something similar to this in your LLM agent's system prompt to enable DOG-driven development:

---
name: dog-developer
description: >
  PRIMARY DEVELOPMENT AGENT for this codebase. Use for ALL development tasks:
  implementing features, fixing bugs, refactoring, code reviews, and architectural decisions.

  This agent enforces DOG (Documentation-Oriented Grammar)—a documentation-first methodology
  where .dog.md behavioral specifications are the source of truth. Code fulfills documentation,
  not the other way around.
model: opus
---

You are the primary development agent for this codebase, combining expert software engineering with DOG methodology.

## Documentation Structure

```
docs/
├── *.md              # Prose docs
├── index.dog.md      # DOG index (auto-generated)
├── actors/           # @Actor specs
├── behaviors/        # !Behavior specs
├── components/       # #Component specs
└── data/             # &Data specs
```

## DOG Primitives

| Sigil | Type      | Purpose               | Required Sections                      |
| ----- | --------- | --------------------- | -------------------------------------- |
| `@`   | Actor     | Who initiates actions | Description, Notes                     |
| `!`   | Behavior  | What the system does  | Condition, Description, Outcome, Notes |
| `#`   | Component | How it's built        | Description, State, Events, Notes      |
| `&`   | Data      | What's stored         | Description, Fields, Notes             |

## CLI Reference

| Command  | Usage                                  | Purpose                                   |
| -------- | -------------------------------------- | ----------------------------------------- |
| `get`    | `uv run dog get <name> -p docs`        | Read a primitive with resolved refs       |
| `search` | `uv run dog search <query> -p docs`    | Find primitives with hybrid local search  |
| `list`   | `uv run dog list [sigil] -p docs`      | List all primitives (filter: `@!#&`)      |
| `refs`   | `uv run dog refs <name> -p docs`       | **Reverse lookup**: what references this? |
| `export` | `uv run dog export -p docs`            | Bulk export all docs as JSON              |
| `graph`  | `uv run dog graph [root] -p docs`      | DOT output for dependency visualization   |
| `lint`   | `uv run dog lint docs`                 | Validate structure/refs (positional path) |
| `format` | `uv run dog format docs`               | Normalize whitespace (positional path)    |

**Tips:**
- `get`, `search`, `list`, and `refs` return JSON by default; use `-o text` for human-readable output
- Use `dog get <name> --depth 1` to include directly referenced primitives
- Use `dog search <query> --all` or `--min-score 0` to include low-confidence search matches
- Use sigil prefix to filter: `#WorkspaceStore`, `!SaveChat`, `@User`, `&Folder`
- `refs` is essential for impact analysis before changes

## Workflow

### Implementation
1. **Understand**: `dog get` + `dog refs` to see dependencies
2. **Design**: Document new behaviors before coding
3. **Implement**: Code fulfills documented behavior
4. **Validate**: `uv run dog lint docs` passes

### Investigation
1. **Explore**: `dog search` + `dog refs` to map the concept
2. **Verify**: Check consistency across all mentions
3. **Fix**: Update docs OR code (whichever is wrong)

### Decision Guide
- **Bug in code** → Fix code to match spec
- **Bug in spec** → Fix spec, then code
- **Missing docs** → Document first, ask if unclear
- **Cross-cutting change** → Use `dog refs` to find all affected docs

## Quality Gate

Before completing any task:
- [ ] `uv run dog lint docs` passes
- [ ] Code matches documented Behaviors
- [ ] Terminology consistent (use `dog refs` to verify)

You advocate for documentation-first development. If specs are unclear, clarify or document before implementing.

Example

See the docs/ folder for a complete example of DOG documentation for this project.


What is DOG?

.dog.md is a Markdown-native specification format. Each file defines exactly one primitive type — Project, Actor, Behavior, Component, or Data — using light structural conventions.

DOG serves as:

  • Human-readable system documentation
  • A structured knowledge base for LLM agents
  • A behavioral reference for AI-assisted testing

Primitive Types

Type Purpose Example
Project Root index of a documentation set # Project: MyApp
Actor User or service that initiates actions # Actor: User
Behavior System response or state transition # Behavior: Login Flow
Component Subsystem or UI element # Component: AuthService
Data Domain entity with fields # Data: Credentials

Cross-References

Use sigils inside backticks to reference other concepts:

Syntax Meaning
`@User` Actor reference
`!Login` Behavior reference
`#AuthService` Component reference
`&Credentials` Data reference

CLI Commands

dog lint <path>

Validate .dog.md files for structure and reference errors.

dog lint docs/
dog lint my-behavior.dog.md

dog format <path>

Format .dog.md files (normalize whitespace).

dog format docs/
dog format --check docs/  # Check without modifying

dog index <path> --name <name>

Generate or update a Project index file (index.dog.md).

dog index docs/ --name "My Project"

dog search <query>

Search documents using local hybrid retrieval. Returns JSON by default with results sorted by relevance.

dog search "login"
dog search "#auth"              # Filter by Component type
dog search "user" --limit 5
dog search "anything" --all --output text
Option Description
--path, -p Directory to search (default: .)
--limit, -l Max results (default: 10)
--output, -o json or text
--min-score Minimum relevance score
--all Include low-confidence matches

Use sigil prefixes to filter by type: @ (Actor), ! (Behavior), # (Component), & (Data).

dog get <name>

Get a document by name with resolved references.

dog get "Login Flow"
dog get "@User"                 # Get Actor named User
dog get "#AuthService"
dog get "!Login" --depth 1
Option Description
--path, -p Directory to search (default: .)
--output, -o json or text
--depth Expand referenced docs N hops

Use sigil prefixes to filter by type: @ (Actor), ! (Behavior), # (Component), & (Data).

dog list

List all documents.

dog list
dog list !                      # List only Behaviors
dog list --output json
Option Description
--path, -p Directory to search (default: .)
--output, -o json or text

Use sigil prefixes to filter by type: @ (Actor), ! (Behavior), # (Component), & (Data).

dog refs <name>

Find all documents that reference a given primitive (reverse lookup).

dog refs "#AuthService"         # What references AuthService?
dog refs "@User" --output json  # JSON output
Option Description
--path, -p Directory to search (default: .)
--output, -o json or text

Use sigil prefixes to filter by type: @ (Actor), ! (Behavior), # (Component), & (Data).

dog graph [root]

Generate a DOT format dependency graph for visualization.

dog graph                              # Full graph
dog graph "!Login"                     # Subgraph from Login behavior
dog graph -p docs/ | dot -Tpng -o graph.png  # Render with graphviz
Option Description
--path, -p Directory to search (default: .)

Output is DOT format, pipe to graphviz (dot, neato, etc.) for rendering.

dog export

Export all DOG documents as JSON for AI agent consumption.

dog export -p docs/                    # Export all docs
dog export -t ! -p docs/               # Export only Behaviors
dog export --no-raw -p docs/           # Exclude raw markdown
Option Description
--path, -p Directory to search (default: .)
--type, -t Type filter: @ (Actor), ! (Behavior), #, &
--no-raw Exclude raw markdown content from output

dog serve <path>

Serve DOG documentation as HTML in the browser with hot-reload.

dog serve docs/
dog serve --host 0.0.0.0 --port 3000
dog serve docs/ --no-reload
Option Description
--host, -h Host to bind (default: 127.0.0.1)
--port, -P Port to bind (default: 8000)
--no-reload Disable hot-reload on file changes

Features:

  • Color-coded reference links (red=Actor, blue=Behavior, purple=Component, green=Data)
  • Renders index.dog.md as homepage when present
  • Automatic favicon discovery (favicon.png or dog.png)
  • Hot-reload on file changes

File Format Reference

Project

# Project: <Name>

## Description
<freeform text>

## Actors
- <actor name>

## Behaviors
- <behavior name>

## Components
- <component name>

## Data
- <data name>

## Notes
- <annotation>

Actor

# Actor: <Name>

## Description
<free text>

## Notes
- <annotation>

Behavior

# Behavior: <Name>

## Condition
- <prerequisite>

## Description
<free text with `@actor`, `!behavior`, `#component`, `&data` references>

## Outcome
- <expected effect>

## Notes
- <annotation>

Component

# Component: <Name>

## Description
<free text>

## State
- <state field>

## Events
- <event name>

## Notes
- <annotation>

Data

# Data: <Name>

## Description
<free text>

## Fields
- field_name: <description>

## Notes
- <annotation>

Why DOG?

Approach Trade-offs
RAG/Vector Search Requires embeddings, chunking strategy, retrieval tuning. Context can be fragmented or miss cross-references.
Traditional Docs Great for humans, but unstructured prose is hard for LLMs to reliably extract structured knowledge from.
OpenAPI/JSON Schema Excellent for API contracts, but doesn't capture behavioral flows, actors, or domain concepts.
DOG Markdown-native, no infra needed. Structured enough for LLM parsing, readable enough for humans. Single source of truth.

DOG fills the gap between unstructured documentation and rigid schemas. It's lightweight enough to write by hand, structured enough to parse programmatically, and readable enough to serve as your actual documentation.


License

MIT

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

dog_cli-2026.4.30.tar.gz (161.1 kB view details)

Uploaded Source

Built Distribution

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

dog_cli-2026.4.30-py3-none-any.whl (34.2 kB view details)

Uploaded Python 3

File details

Details for the file dog_cli-2026.4.30.tar.gz.

File metadata

  • Download URL: dog_cli-2026.4.30.tar.gz
  • Upload date:
  • Size: 161.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for dog_cli-2026.4.30.tar.gz
Algorithm Hash digest
SHA256 678d9dc263125ca4bf24facf8e9ee0631d9dfa5f72caa13218d700f9091e17fa
MD5 7cd38e75e9c1617a4e3729bd0fe6289b
BLAKE2b-256 cdee656bba8b032123978732f995ec83945f65ae3acb7aca1a853c58d60d40c2

See more details on using hashes here.

File details

Details for the file dog_cli-2026.4.30-py3-none-any.whl.

File metadata

  • Download URL: dog_cli-2026.4.30-py3-none-any.whl
  • Upload date:
  • Size: 34.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for dog_cli-2026.4.30-py3-none-any.whl
Algorithm Hash digest
SHA256 53cb1041822bd3b0c8884695ea10b3a2bf4c4a23f8e7264b018a506d8cc2e109
MD5 b1a988c4c1026e57b641f5f8bb0e6f3d
BLAKE2b-256 e7dea898d5bbd2fa0868aaf25d9b8d69e9e68bfde0221b2e5d763d2540ee2892

See more details on using hashes here.

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