Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,42 @@

All notable changes to the Toolpath workspace are documented here.

## 0.2.0 — toolpath-github + toolpath-md

### toolpath-github 0.2.0

- Capture `diff_hunk` on review comments as `raw` for code context display
- Capture PR summary stats in path meta: state, merged, additions, deletions, changed_files, draft, number, author
- Capture `author_association` (MEMBER, COLLABORATOR, etc.) stored in `extra["github"]["actor_associations"]`
- Capture `html_url` on CI check runs in structural extra
- Set review body as `meta.intent` on review decision steps for renderer visibility
- Thread review comment replies via `in_reply_to_id` — replies branch off the step they reply to instead of trunk-chaining

### toolpath-md 0.2.0

- Render review comment bodies inline in both summary and full modes (no more opaque `review://` URIs)
- Render CI conclusions with emoji indicators (pass/fail/skip) in summary mode
- Show diff_hunk code context alongside review comments in full mode
- Add PR-level diffstat to context block (`**Changes:** +N −M across K files`)
- Add Review summary section collecting all decisions and inline comments
- Friendly date range display in context block (e.g. `Feb 26–27, 2026`)
- PR identity line when GitHub metadata present (`**PR #6** by author · status · dates`)
- Hide opaque head ID when PR identity is shown
- Strip `review://` and `ci://checks/` prefixes for natural display names

## 0.1.0 — toolpath-md

### toolpath-md 0.1.0

- New crate: render Toolpath documents as Markdown for LLM consumption
- Handles all three document variants: Step, Path, and Graph
- Two detail levels: `Summary` (file-level diffstats) and `Full` (inline diffs as fenced code blocks)
- Optional YAML front matter with machine-readable metadata (step count, actors, artifacts, dead end count)
- Dead ends are marked inline and summarized in a dedicated section with intent and parent references
- Topological sort ensures steps appear in causal order regardless of input ordering
- Actor definitions rendered when present in path/graph metadata
- CLI: `path render md [--input FILE] [--detail summary|full] [--front-matter]`

## 0.1.0 — toolpath-github

### toolpath-github 0.1.0
Expand Down
7 changes: 5 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ crates/
toolpath-github/ # derive from GitHub pull requests (REST API)
toolpath-claude/ # derive from Claude conversation logs
toolpath-dot/ # Graphviz DOT rendering
toolpath-md/ # Markdown rendering for LLM consumption
toolpath-cli/ # unified CLI (binary: path)
schema/toolpath.schema.json # JSON Schema for the format
examples/*.json # 12 example documents (step, path, graph)
Expand All @@ -33,7 +34,8 @@ toolpath-cli (binary: path)
├── toolpath-git → toolpath
├── toolpath-github → toolpath
├── toolpath-claude → toolpath, toolpath-convo
└── toolpath-dot → toolpath
├── toolpath-dot → toolpath
└── toolpath-md → toolpath
```

No cross-dependencies between satellite crates except `toolpath-claude → toolpath-convo`.
Expand All @@ -57,6 +59,7 @@ cargo run -p toolpath-cli -- derive git --repo . --branch main --pretty
cargo run -p toolpath-cli -- derive github --repo owner/repo --pr 42 --pretty
cargo run -p toolpath-cli -- derive claude --project /path/to/project
cargo run -p toolpath-cli -- render dot --input doc.json
cargo run -p toolpath-cli -- render md --input doc.json --detail full
cargo run -p toolpath-cli -- query dead-ends --input doc.json
cargo run -p toolpath-cli -- query ancestors --input doc.json --step-id step-003
cargo run -p toolpath-cli -- query filter --input doc.json --actor "agent:"
Expand Down Expand Up @@ -85,7 +88,7 @@ Tests live alongside the code (`#[cfg(test)] mod tests`), plus `toolpath-cli` ha
- `toolpath-github`: 28 unit + 2 doc tests (mapping, DAG construction, fixtures)
- `toolpath-claude`: 216 unit + 5 doc tests (path resolution, conversation reading, query, chaining, watcher, derive)
- `toolpath-dot`: 30 unit + 2 doc tests (render, visual conventions, escaping)
- `toolpath-cli`: 120 unit + 8 integration tests (all commands, track sessions, merge, validate, roundtrip)
- `toolpath-cli`: 126 unit + 24 integration tests (all commands, track sessions, merge, validate, roundtrip, render-md snapshots)

Validate example documents: `for f in examples/*.json; do cargo run -p toolpath-cli -- validate --input "$f"; done`

Expand Down
51 changes: 50 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ members = [
"crates/toolpath-github",
"crates/toolpath-claude",
"crates/toolpath-dot",
"crates/toolpath-md",
"crates/toolpath-cli",
]
resolver = "2"
Expand All @@ -19,8 +20,9 @@ toolpath = { version = "0.1.5", path = "crates/toolpath" }
toolpath-convo = { version = "0.5.0", path = "crates/toolpath-convo" }
toolpath-git = { version = "0.1.3", path = "crates/toolpath-git" }
toolpath-claude = { version = "0.6.2", path = "crates/toolpath-claude", default-features = false }
toolpath-github = { version = "0.1.0", path = "crates/toolpath-github" }
toolpath-github = { version = "0.2.0", path = "crates/toolpath-github" }
toolpath-dot = { version = "0.1.2", path = "crates/toolpath-dot" }
toolpath-md = { version = "0.2.0", path = "crates/toolpath-md" }

reqwest = { version = "0.12", features = ["blocking", "json"] }
serde = { version = "1.0", features = ["derive"] }
Expand All @@ -34,6 +36,7 @@ tokio = { version = "1.40", features = ["full"] }
notify = { version = "7", features = ["macos_kqueue"] }
similar = "2"
tempfile = "3.15"
insta = "1"

[profile.wasm]
inherits = "release"
Expand Down
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ crates/
toolpath-github/ Derive from GitHub pull requests
toolpath-claude/ Derive from Claude conversation logs
toolpath-dot/ Graphviz DOT visualization
toolpath-md/ Markdown rendering for LLM consumption
toolpath-cli/ Unified CLI (binary: path)
```

Expand All @@ -63,6 +64,9 @@ path derive git --repo . --branch main --pretty
# Visualize it
path derive git --repo . --branch main | path render dot | dot -Tpng -o graph.png

# Render as Markdown for an LLM
path derive git --repo . --branch main | path render md

# Derive from a GitHub pull request
path derive github --repo owner/repo --pr 42 --pretty

Expand Down Expand Up @@ -103,6 +107,7 @@ path
filter --input FILE [--actor PREFIX] [--artifact PATH] [--after TIME] [--before TIME]
render
dot [--input FILE] [--output FILE] [--show-files] [--show-timestamps]
md [--input FILE] [--output FILE] [--detail summary|full] [--front-matter]
merge FILE... [--title TEXT]
track
init --file PATH --actor ACTOR [--title TEXT] [--base-uri URI] [--base-ref REF]
Expand Down Expand Up @@ -166,6 +171,14 @@ use toolpath_dot::{render, RenderOptions};
let dot_string = render(&doc, &RenderOptions::default());
```

### Markdown rendering

```rust
use toolpath_md::{render, RenderOptions};

let md_string = render(&doc, &RenderOptions::default());
```

## Documentation

- [RFC.md](RFC.md) -- Full format specification
Expand Down
2 changes: 2 additions & 0 deletions crates/toolpath-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ path = "src/main.rs"
toolpath = { workspace = true }
toolpath-git = { workspace = true }
toolpath-dot = { workspace = true }
toolpath-md = { workspace = true }
clap = { workspace = true }
anyhow = { workspace = true }
serde = { workspace = true }
Expand All @@ -36,3 +37,4 @@ toolpath-claude = { workspace = true }
[dev-dependencies]
assert_cmd = "2"
predicates = "3"
insta = { workspace = true }
Loading