···11+{"id":"is-tree-scan-priority","title":"Prioritized directory scanning: stream recently-changed projects first","description":"Currently is-tree processes directories in filesystem order and sorts after all results are collected. For large directory trees, this means waiting for the full scan before seeing the most relevant results.\n\nThis ticket tracks adding **scan priority** — deciding which directories to process first based on cheap heuristics, so the most interesting projects stream to screen immediately.\n\nKey aspects:\n\n1. **Pre-scan heuristics** — Use cheap filesystem metadata (mtime of the directory itself, presence of recent changes) to order the work queue before the heavier detection/formatting runs. `change-date` (file mtime) is essentially free from `stat` and correlates well with \"what am I working on.\"\n\n2. **Streaming output** — Emit results as each directory is processed, in priority order, rather than buffering everything. Combined with pre-scan ordering, the user sees their most-recently-worked-on projects first.\n\n3. **Atuin session priority** — Integrate with atuin session data (see is-tree-atuin-session-tracking) to boost directories associated with active sessions to the top of the scan queue.\n\n4. **Pre-filtering** — Allow filtering the scan set before processing (e.g. only scan directories modified in the last N days, or only directories with active sessions). This reduces total work for large trees.\n\n5. **New sort columns** — Add any additional sortable columns needed to support priority-aware output (e.g. session recency, directory mtime as a first-class column).","acceptance_criteria":"- Add `--scan` mode that performs lightweight discovery/classification only (`git`, `jj`, `worktree-git`, `worktree-jj`) without resolving expensive inspection columns.\n- `--scan` output streams line-by-line as candidates are found; users see early results before the full scan completes.\n- Default `--scan` output is one directory path per line (pipeline-safe), suitable for pickers and downstream commands.\n- Scan priority ordering still applies (recently changed first by default), and pre-filtering can reduce scan set.\n- Selected paths can flow back into deep inspection through stdin (`is-tree --scan | ... | is-tree --stdin --format all`, or equivalent auto-detected piped stdin behavior).\n- Existing non-scan behavior and explicit `--sort` post-processing remain compatible.","status":"open","priority":1,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T22:51:14Z","created_by":"rektide de la faye","updated_at":"2026-04-06T23:06:31Z","labels":["performance","streaming"],"dependency_count":0,"dependent_count":0,"comment_count":0}
12{"id":"is-tree-reforrest-starter","title":"scaffold reforrest project with gunshi-style CLI","description":"## Overview\n\nScaffold a new Rust project for `reforrest` as a separate crate, using `gunshi`-style CLI conventions. This is a prerequisite workspace setup ticket before implementing the actual push logic.\n\n## What it does\n\n- Create a new crate (e.g. `reforrest/` directory or workspace member) in the is-tree workspace.\n- Wire up `clap` derive CLI with initial subcommand structure:\n - `reforrest push [path]` — discover and push trees\n - `reforrest status [path]` — show what would be pushed (dry-run default)\n - `reforrest ensure-remote [path]` — create missing remotes via forge CLIs\n- Depend on `is-tree` as a library crate for tree detection/classification.\n- Basic `--dry-run`, `--json`, `--verbose` flags wired but not yet functional.\n- Skeleton `main.rs` with subcommand dispatch.\n\n## Key considerations\n\n- May require splitting is-tree into a lib+bin crate so reforrest can import detection logic.\n- Follow existing workspace conventions (Cargo.toml workspace, clap derive, tokio async).\n\n## Dependencies\n\n- This is a dependency of is-tree-reforrest-cli (the epic).","status":"open","priority":1,"issue_type":"task","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:21:33Z","created_by":"rektide de la faye","updated_at":"2026-04-06T21:21:33Z","labels":["cli","gunshi","scaffold"],"dependency_count":0,"dependent_count":0,"comment_count":0}
23{"id":"is-tree-reforrest-cli","title":"reforrest: replicate local git and jj states to remotes","description":"## Overview\n\nCreate a `reforrest` CLI tool (Rust binary in this workspace) that discovers all local git/jj trees using is-tree's detection logic and pushes their local state up to tracked remotes — effectively \"making the trees flow out to far places.\"\n\n## What it does\n\nGiven a root directory (e.g. `~/src`), `reforrest`:\n\n1. **Discovers** all git and jj repositories/worktrees beneath the given path (leveraging is-tree's existing classification logic for `git`, `jj`, `worktree-git`, `worktree-jj`).\n2. **Inspects** each tree's local state relative to its tracked remote(s):\n - For jj repos: local bookmarks ahead of remote bookmarks, unpushed changes.\n - For git repos: local branches ahead of remote tracking branches.\n3. **Replicates** (pushes) local state up to remotes:\n - `jj git push --all` for jj trees.\n - `git push --all` for git trees.\n4. **Reports** a summary of what was pushed, what was skipped (up-to-date), and what failed (e.g. no remote configured, auth issues).\n\n## Architecture\n\n- New binary target `reforrest` in the existing `is-tree` Cargo workspace.\n- Reuse is-tree's detection/classification module as a library dependency.\n- Async push operations across discovered trees using tokio (already a dep).\n\n## Key considerations\n\n- Should be idempotent — safe to run repeatedly, no-ops when already synced.\n- Must handle mixed trees (some jj, some git, some worktrees) gracefully.\n- Worktrees: push from the main tree location, skip worktrees to avoid duplicate pushes.\n- Error handling: collect per-tree results, don't let one failure stop the rest. Report aggregate at end.\n- Respect `.gitignore`-style exclusions or a config for paths to skip.\n\n## Acceptance criteria\n\n- [ ] `reforrest ~/src` discovers all trees, classifies them, and pushes ahead state to remotes\n- [ ] Summary output shows pushed / up-to-date / failed / skipped counts per tree\n- [ ] Handles jj repos, git repos, and worktrees correctly\n- [ ] Worktrees are deduplicated (push happens from main tree only)\n- [ ] Individual tree failures don't abort the batch; errors are collected and reported\n- [ ] `--dry-run` flag shows what would be pushed without actually pushing\n- [ ] `--json` flag for machine-readable output","status":"open","priority":1,"issue_type":"epic","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:11:32Z","created_by":"rektide de la faye","updated_at":"2026-04-06T21:11:32Z","labels":["cli","push","replication"],"dependency_count":0,"dependent_count":0,"comment_count":0}
33-{"id":"is-tree-interactive-picker","title":"interactive TUI picker for selecting trees","description":"## Overview\n\nAdd an interactive picker mode to is-tree that lets users select one or more trees from a searchable, navigable TUI list — then execute an action on the selection(s). This makes is-tree a launcher/hub for working with discovered trees.\n\n## What it does\n\n- New flag: `--pick` or `--interactive` launches a terminal UI picker.\n- Displays all discovered trees with key columns (status, directory, age, ahead).\n- Fuzzy search/filter to narrow the list by directory name or path.\n- Multi-select support (e.g. space to toggle, enter to confirm).\n- On selection, either:\n - Print the selected path(s) to stdout (pipe-friendly).\n - Execute a configurable command against each selection (e.g. `cd`, `jj status`, `git log`).\n- Keyboard navigation: up/down, page up/down, tab, enter, escape to cancel.\n\n## Key considerations\n\n- Should work as a composable Unix tool: `is-tree --all --pick | xargs -I{} ...`\n- Consider using a Rust TUI picker library (e.g. `gaggle`, `skim`, `dialoguer`, or custom with `crossterm`).\n- Falls back gracefully if no interactive terminal is detected (error or just print list).\n- Should respect existing `--filter`, `--sort` flags to pre-filter before picking.\n- Natural integration point for `reforrest`: `is-tree --all --pick | reforrest push`","status":"open","priority":2,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:32:54Z","created_by":"rektide de la faye","updated_at":"2026-04-06T21:32:54Z","labels":["interactive","picker","tui"],"dependency_count":0,"dependent_count":0,"comment_count":0}
44-{"id":"is-tree-staleness-views","title":"improve staleness views across all projects","description":"## Overview\n\nCreate a cohesive \"staleness view\" for is-tree that helps answer the question: \"which of my projects are gathering dust?\" This combines and builds on the duration column and per-file stats features into a unified staleness reporting experience.\n\n## What it does\n\n- A `--stale` or `stale` subcommand that produces a staleness-oriented view of all trees.\n- Tree-level staleness: overall age since last change/commit, with color coding or indicators (e.g. `●` fresh, `◐` aging, `○` stale).\n- Configurable thresholds: `--stale-threshold 30d` marks trees older than 30 days as stale.\n- Summary statistics: count of fresh/aging/stale trees, median age, oldest tree.\n- Integration with per-file stats: `is-tree --stale --files` to drill into stale trees.\n- Sort defaults to age descending (stalest first).\n\n## Key considerations\n\n- Should work well with existing `--filter`, `--sort`, `--format`, `--json` flags.\n- Color/styling should be optional (respects `--no-color` or `TERM=dumb`).\n- Depends on is-tree-duration-column for age data.\n- Optionally depends on is-tree-per-file-stats for drill-down.\n\n## Dependencies\n\n- is-tree-duration-column\n- is-tree-per-file-stats (optional, for file-level drill-down)","status":"open","priority":2,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:22:01Z","created_by":"rektide de la faye","updated_at":"2026-04-06T21:22:01Z","labels":["reporting","staleness","ux"],"dependencies":[{"issue_id":"is-tree-staleness-views","depends_on_id":"is-tree-duration-column","type":"blocks","created_at":"2026-04-06T17:22:00Z","created_by":"rektide de la faye","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0}
55-{"id":"is-tree-per-file-stats","title":"recurse into trees and report per-file stats (age, modified, size)","description":"## Overview\n\nAdd a recursive per-file stats mode to is-tree that descends into each tree and reports modification metadata for individual files — enabling granular staleness views like \"which files haven't been touched in 6 months.\"\n\n## What it does\n\n- New flag: `--files` or `--per-file` that makes is-tree recurse into each discovered tree.\n- Per-file output columns:\n - `file` — relative path within the tree\n - `modified` — last modification timestamp\n - `age` — duration since last modification (relative time)\n - `size` — file size in bytes\n- Respect `.gitignore` / `.jjignore` by default (skip ignored files).\n- Option to filter/sort by age threshold: `--older-than 30d`, `--newer-than 1w`.\n- Output formats: table (default), JSON (`--json`).\n\n## Key considerations\n\n- Could be expensive on large repos — should stream or batch results.\n- May want to limit recursion depth with `--depth`.\n- `.git` / `.jj` internal directories should be excluded.\n- Useful for identifying dead code, stale configs, abandoned files.\n- Feeds into the staleness views ticket (is-tree-staleness-views).","status":"open","priority":2,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:21:52Z","created_by":"rektide de la faye","updated_at":"2026-04-06T21:21:52Z","labels":["per-file","recursion","staleness"],"dependency_count":0,"dependent_count":0,"comment_count":0}
44+{"id":"is-tree-atuin-session-tracking","title":"Atuin session tracking: find which sessions last cd'ed into each directory","description":"Track which atuin sessions last cd'ed into each directory, leveraging ATUIN_SESSION to correlate shell sessions with directory changes. This enables answering \"which session am I in that project from?\" and \"which session was last working here?\" across the is-tree project listing.\n\nThree integration layers:\n\n1. **Query atuin DB directly** — Read the atuin SQLite DB (~/.local/share/atuin/history.db or equivalent) to find `cd` commands grouped by session (ATUIN_SESSION). Map session IDs to the directories they last visited. This is the data foundation.\n\n2. **Shell hook / env integration** — Use ATUIN_SESSION env var at runtime to associate the current shell session with the working directory. Could be a hook that records session→directory mappings, or reads them on-demand from atuin history keyed by session.\n\n3. **New CLI subcommand** — Add an is-tree subcommand (e.g. `is-tree sessions` or integrated into `--all` output) that reports per-directory session info from atuin history. Show which session last cd'ed into each tree, when, and potentially the session's current/last-known directory.","acceptance_criteria":"- Can query atuin history DB for cd commands grouped by ATUIN_SESSION\n- Shell hook or integration surface exists to resolve current session's directory from ATUIN_SESSION\n- New subcommand or column shows session info alongside is-tree directory listings\n- Works with both git and jj trees","status":"open","priority":2,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T22:29:20Z","created_by":"rektide de la faye","updated_at":"2026-04-06T22:29:20Z","labels":["atuin","session-tracking"],"dependency_count":0,"dependent_count":0,"comment_count":0}
55+{"id":"is-tree-interactive-picker","title":"interactive TUI picker for selecting trees","description":"## Overview\n\nAdd an interactive picker mode to is-tree that lets users select one or more trees from a searchable, navigable TUI list — then execute an action on the selection(s). This makes is-tree a launcher/hub for working with discovered trees.\n\n## What it does\n\n- New flag: `--pick` or `--interactive` launches a terminal UI picker.\n- Displays all discovered trees with key columns (status, directory, age, ahead).\n- Fuzzy search/filter to narrow the list by directory name or path.\n- Multi-select support (e.g. space to toggle, enter to confirm).\n- On selection, either:\n - Print the selected path(s) to stdout (pipe-friendly).\n - Execute a configurable command against each selection (e.g. `cd`, `jj status`, `git log`).\n- Keyboard navigation: up/down, page up/down, tab, enter, escape to cancel.\n\n## Key considerations\n\n- Should work as a composable Unix tool: `is-tree --all --pick | xargs -I{} ...`\n- Consider using a Rust TUI picker library (e.g. `gaggle`, `skim`, `dialoguer`, or custom with `crossterm`).\n- Falls back gracefully if no interactive terminal is detected (error or just print list).\n- Should respect existing `--filter`, `--sort` flags to pre-filter before picking.\n- Natural integration point for `reforrest`: `is-tree --all --pick | reforrest push`","acceptance_criteria":"- `--pick` / `--interactive` provides fuzzy-searchable multi-select over discovered trees.\n- Candidate population is responsive and compatible with fast discovery mode expectations (quick initial list, incremental updates acceptable).\n- Confirmed selections emit newline-delimited directory paths to stdout by default, so output can be piped into `is-tree` or `reforrest`.\n- Optional action-execution mode remains available, but plain stdout emission is the default composable path.\n- Works with existing pre-scoping flags (`--filter`, root path input) and does not regress non-interactive CLI behavior.","status":"open","priority":2,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:32:54Z","created_by":"rektide de la faye","updated_at":"2026-04-06T23:06:31Z","labels":["interactive","picker","tui"],"dependency_count":0,"dependent_count":0,"comment_count":0}
66+{"id":"is-tree-staleness-views","title":"improve staleness views across all projects","description":"## Overview\n\nCreate a cohesive \"staleness view\" for is-tree that helps answer the question: \"which of my projects are gathering dust?\" This combines and builds on the duration column and per-file stats features into a unified staleness reporting experience.\n\n## What it does\n\n- A `--stale` or `stale` subcommand that produces a staleness-oriented view of all trees.\n- Tree-level staleness: overall age since last change/commit, with color coding or indicators (e.g. `●` fresh, `◐` aging, `○` stale).\n- Configurable thresholds: `--stale-threshold 30d` marks trees older than 30 days as stale.\n- Summary statistics: count of fresh/aging/stale trees, median age, oldest tree.\n- Integration with per-file stats: `is-tree --stale --files` to drill into stale trees.\n- Sort defaults to age descending (stalest first).\n\n## Key considerations\n\n- Should work well with existing `--filter`, `--sort`, `--format`, `--json` flags.\n- Color/styling should be optional (respects `--no-color` or `TERM=dumb`).\n- Depends on is-tree-duration-column for age data.\n- Optionally depends on is-tree-per-file-stats for drill-down.\n\n## Dependencies\n\n- is-tree-duration-column\n- is-tree-per-file-stats (optional, for file-level drill-down)","acceptance_criteria":"- Provide a staleness-oriented view (`--stale` or equivalent) with fresh/aging/stale indicators and configurable thresholds.\n- Include summary stats (fresh/aging/stale counts, median age, oldest tree) and default sort by stalest first.\n- Staleness view can operate on all discovered trees and on a selected subset fed via stdin from a picker pipeline.\n- Compose with per-file drill-down when available (`--stale --files` over selected trees).\n- Maintain compatibility with existing output controls (`--filter`, `--sort`, `--format`, `--json`) and optional color output.","status":"open","priority":2,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:22:01Z","created_by":"rektide de la faye","updated_at":"2026-04-06T23:06:31Z","labels":["reporting","staleness","ux"],"dependencies":[{"issue_id":"is-tree-staleness-views","depends_on_id":"is-tree-duration-column","type":"blocks","created_at":"2026-04-06T17:22:00Z","created_by":"rektide de la faye","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0}
77+{"id":"is-tree-per-file-stats","title":"recurse into trees and report per-file stats (age, modified, size)","description":"## Overview\n\nAdd a recursive per-file stats mode to is-tree that descends into each tree and reports modification metadata for individual files — enabling granular staleness views like \"which files haven't been touched in 6 months.\"\n\n## What it does\n\n- New flag: `--files` or `--per-file` that makes is-tree recurse into each discovered tree.\n- Per-file output columns:\n - `file` — relative path within the tree\n - `modified` — last modification timestamp\n - `age` — duration since last modification (relative time)\n - `size` — file size in bytes\n- Respect `.gitignore` / `.jjignore` by default (skip ignored files).\n- Option to filter/sort by age threshold: `--older-than 30d`, `--newer-than 1w`.\n- Output formats: table (default), JSON (`--json`).\n\n## Key considerations\n\n- Could be expensive on large repos — should stream or batch results.\n- May want to limit recursion depth with `--depth`.\n- `.git` / `.jj` internal directories should be excluded.\n- Useful for identifying dead code, stale configs, abandoned files.\n- Feeds into the staleness views ticket (is-tree-staleness-views).","acceptance_criteria":"- Implement `--files` / `--per-file` with per-file columns: `file`, `modified`, `age`, `size`.\n- Per-file mode works with positional tree paths and with newline-delimited tree paths supplied from stdin (when piped and no positional args, or via `--stdin`).\n- Pipeline flow works end-to-end: `is-tree --scan | \u003cpicker\u003e --multi | is-tree --stdin --files ...`.\n- Ignore VCS internals (`.git`, `.jj`) and respect ignore rules by default.\n- Provide age-based filtering (`--older-than`, `--newer-than`) and stable JSON output in `--json` mode.","status":"open","priority":2,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:21:52Z","created_by":"rektide de la faye","updated_at":"2026-04-06T23:06:31Z","labels":["per-file","recursion","staleness"],"dependency_count":0,"dependent_count":0,"comment_count":0}
68{"id":"is-tree-duration-column","title":"add duration/age column showing time since last change","description":"## Overview\n\nAdd a `duration` or `age` column to is-tree output that shows how long since each tree's last change — e.g. `2h`, `3d`, `6w`. This gives an at-a-glance view of staleness across all trees.\n\n## What it does\n\n- New column: `age` or `duration` — human-readable relative time since `change-date`.\n- Uses the existing `change-date` data already collected per tree.\n- Format: compact relative time (`2h`, `3d`, `6w`, `1y`) with configurable granularity.\n- Available in `--format` string interpolation: `{age}`, `{duration}`.\n- Available in `--json` output.\n\n## Key considerations\n\n- Should default to time since `change-date` but could optionally show time since `commit-date`.\n- Relative time formatting should match familiar conventions (like `jj log` relative dates).\n- Useful for the staleness views (see is-tree-staleness-views).","status":"open","priority":2,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:21:45Z","created_by":"rektide de la faye","updated_at":"2026-04-06T21:21:45Z","labels":["column","output","staleness"],"dependency_count":0,"dependent_count":1,"comment_count":0}
79{"id":"is-tree-reforrest-tangled","title":"reforrest: auto-create remotes via tangled.org tn CLI","description":"## Overview\n\nBefore `reforrest` can push local state to remotes, the remote repositories need to exist. Add support for invoking the [tangled.org](https://tangled.org) CLI tool (`tn`) to create repositories on the tangled forge when a local tree has no configured remote (or no remote matching a configured preferred forge).\n\n## What it does\n\n- Detects when a discovered tree has no remote pointing to tangled.org (or no remote at all).\n- Invokes the `tn` CLI to create the repository on tangled.org.\n- Configures the new remote URL in the local tree (e.g. `git remote add origin \u003curl\u003e` or jj equivalent).\n- Optionally supports other forges in the future via a pluggable \"forge provider\" interface.\n\n## Key considerations\n\n- `tn` must be available on PATH; graceful error if missing.\n- Should support a `--forge tangled` flag or config default to opt in.\n- Idempotent — skip if remote already exists for the target forge.\n- May need to handle org/user namespace mapping.\n- Should integrate into the `reforrest` pipeline: discover → ensure remotes exist → push.\n\n## Dependencies\n\n- Part of the broader `reforrest` epic (is-tree-reforrest-cli).","status":"open","priority":2,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:13:10Z","created_by":"rektide de la faye","updated_at":"2026-04-06T21:13:10Z","labels":["forge","repo-creation","tangled"],"dependency_count":0,"dependent_count":0,"comment_count":0}
810{"id":"is-tree-semantic-search","title":"Add semantic search via opencode run / ACP","description":"Add a semantic search mode to is-tree that lets users describe what they're looking for in natural language and gets back ranked candidate repositories.\n\n## Two-phase approach\n\n**Phase 1 — Candidate discovery:** is-tree enumerates repos as it does today (via `--all`), then feeds the list (directory name + any quick metadata is-tree already has) to an LLM via `opencode run` or ACP. The LLM returns a shortlist of likely matches.\n\n**Phase 2 — Deep context dump:** For each candidate, is-tree gathers the \"notable files\" (package.json, README.md, Cargo.toml, pyproject.toml, etc.) in a single oneshot — concatenating them into one big payload. This avoids N round-trips per candidate. The combined dump goes back to the LLM for final ranking/reasoning.\n\nis-tree already classifies repos and knows their VCS state; it can trivially locate these notable files per candidate and return them all at once, which is the key enabler for phase 2.\n\n## Open questions\n\n- `opencode run` (one-shot subprocess) vs ACP (persistent connection with conversation context) — run is simpler to start with, ACP may be better for interactive refinement.\n- How to structure the prompt for phase 1 (just dir names + metadata?) vs phase 2 (full notable-file dump).\n- Whether to stream results or wait for full response.\n- Configurable notable-files list (per-language heuristics vs user-supplied glob list).","status":"open","priority":2,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-03-31T00:37:49Z","created_by":"rektide de la faye","updated_at":"2026-03-31T00:37:49Z","dependency_count":0,"dependent_count":0,"comment_count":0}
···1719{"id":"is-tree-all-default-output","title":"--all should affect default output format","notes":"Currently --all processes all subdirectories but the default output remains minimal (status + directory). When scanning many repos, the default should likely include more useful columns like ahead/commit-date.","status":"open","priority":2,"issue_type":"task","owner":"rektide+git@voodoowarez.com","created_at":"2026-03-15T22:43:14Z","created_by":"rektide de la faye","updated_at":"2026-03-15T22:43:14Z","dependency_count":0,"dependent_count":0,"comment_count":0}
1820{"id":"is-tree-uh7","title":"Implement basic Git and Jujutsu detection","description":"Implemented basic detection logic in src/detect.rs using .jj and .git metadata. Jujutsu worktrees detected by checking if .jj/repo is a file (pointer) vs directory (main). Git worktrees detected by checking if .git is a file (pointer) vs directory (main). Priority: Jujutsu takes precedence over Git. Verified against example directories: compfuzor (git), compfuzor-x (worktree-git), niri-mcp (jj), niri-mcp-x (worktree-jj).","status":"closed","priority":2,"issue_type":"task","assignee":"opencode","created_at":"2026-01-09T01:41:12Z","created_by":"rektide","updated_at":"2026-01-09T03:35:17Z","closed_at":"2026-01-09T03:35:17Z","close_reason":"Completed","dependencies":[{"issue_id":"is-tree-uh7","depends_on_id":"is-tree-xxv","type":"parent-child","created_at":"2026-01-09T01:41:48Z","created_by":"rektide de la faye","metadata":"{}"}],"comments":[{"id":"dcfc6637-7594-457d-8e2f-bc268e1e0b2f","issue_id":"is-tree-uh7","author":"rektide","text":"Reopened","created_at":"2026-01-09T03:35:12Z"}],"dependency_count":0,"dependent_count":0,"comment_count":1}
1921{"id":"is-tree-xxv","title":"Command Options Epic","description":"Implement all CLI command options for is-tree including sorting, filtering, formatting, and output options.","status":"closed","priority":2,"issue_type":"epic","created_at":"2026-01-09T01:40:57Z","created_by":"rektide","updated_at":"2026-01-09T10:20:39Z","closed_at":"2026-01-09T10:20:39Z","close_reason":"Completed","dependency_count":0,"dependent_count":0,"comment_count":0}
2020-{"id":"is-tree-fuzzel-pipeline","title":"document fuzzel --multi pipeline example for tree selection","description":"## Overview\n\nDocument an example pipeline using [fuzzel](https://codeberg.org/dnkl/fuzzel) (Wayland launcher) in `--multi` mode as an external interactive picker for is-tree output. This gives users a GUI-driven tree selection workflow without needing a built-in TUI.\n\n## What it does\n\n- Add an example in README or doc/ showing:\n ```\n is-tree --all --format \"{directory}\" | fuzzel --dmenu --multi\n ```\n- Show how to pipe selections into actions:\n ```\n is-tree --all --format \"{directory}\" | fuzzel --dmenu --multi | xargs -I{} reforrest push {}\n ```\n- Document useful flags: `--dmenu` for stdin mode, `--multi` for multi-select, `--prompt` for labeling.\n- Show integration with `--filter` to pre-scope (e.g. only jj trees, only stale trees).\n\n## Key considerations\n\n- Fuzzel is Wayland-native; could also mention rofi/wofi equivalents for X11 users.\n- This is a documentation/example ticket, no code changes required.\n- Complements the built-in interactive picker (is-tree-interactive-picker) as a lighter-weight alternative.","status":"open","priority":3,"issue_type":"task","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:34:32Z","created_by":"rektide de la faye","updated_at":"2026-04-06T21:34:32Z","labels":["docs","example","fuzzel","pipeline"],"dependency_count":0,"dependent_count":0,"comment_count":0}
2222+{"id":"is-tree-fuzzel-pipeline","title":"document fuzzel --multi pipeline example for tree selection","description":"## Overview\n\nDocument an example pipeline using [fuzzel](https://codeberg.org/dnkl/fuzzel) (Wayland launcher) in `--multi` mode as an external interactive picker for is-tree output. This gives users a GUI-driven tree selection workflow without needing a built-in TUI.\n\n## What it does\n\n- Add an example in README or doc/ showing:\n ```\n is-tree --all --format \"{directory}\" | fuzzel --dmenu --multi\n ```\n- Show how to pipe selections into actions:\n ```\n is-tree --all --format \"{directory}\" | fuzzel --dmenu --multi | xargs -I{} reforrest push {}\n ```\n- Document useful flags: `--dmenu` for stdin mode, `--multi` for multi-select, `--prompt` for labeling.\n- Show integration with `--filter` to pre-scope (e.g. only jj trees, only stale trees).\n\n## Key considerations\n\n- Fuzzel is Wayland-native; could also mention rofi/wofi equivalents for X11 users.\n- This is a documentation/example ticket, no code changes required.\n- Complements the built-in interactive picker (is-tree-interactive-picker) as a lighter-weight alternative.","acceptance_criteria":"- Document the canonical fast-pick pipeline: `is-tree --scan | fuzzel --dmenu --multi | is-tree --stdin --format all` (or auto-stdin equivalent).\n- Document a compatibility fallback using `xargs` for environments without stdin ingestion support.\n- Include a per-file drill-down example: `is-tree --scan | fuzzel --dmenu --multi | is-tree --stdin --files --older-than 30d`.\n- Include at least one example that sends selections to `reforrest push`.\n- Include picker-agnostic alternatives (`fzf --multi`, `sk --multi`) and mention fuzzel-specific flags (`--dmenu`, `--multi`, optional `--prompt`).","status":"open","priority":3,"issue_type":"task","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:34:32Z","created_by":"rektide de la faye","updated_at":"2026-04-06T23:06:31Z","labels":["docs","example","fuzzel","pipeline"],"dependency_count":0,"dependent_count":0,"comment_count":0}
2123{"id":"is-tree-vite-plus-toolchain","title":"evaluate and adopt vite-plus toolchain from ~/src/vite-plus","description":"## Overview\n\nAdopt the vite-plus (`vp`) toolchain from the `~/src/vite-plus` project for is-tree's JS/TS-adjacent tooling needs (formatting via `oxfmt`, linting via `oxlint`, etc.). This is relevant if reforrest or is-tree grows any JS tooling, config files, or if we want consistent formatting across the project ecosystem.\n\n## What it does\n\n- Survey `~/src/vite-plus` to understand the `vp` CLI, its capabilities (fmt, lint), and configuration.\n- Determine what makes sense to adopt for this project (is-tree/reforrest are Rust, but may have adjacent JS needs).\n- Document or configure accordingly.\n\n## Key considerations\n\n- is-tree is primarily Rust — only adopt if there's a concrete JS/TS surface area.\n- May become more relevant if reforrest grows plugin/scripting support.","status":"open","priority":3,"issue_type":"task","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:21:39Z","created_by":"rektide de la faye","updated_at":"2026-04-06T21:21:39Z","labels":["toolchain","vite-plus"],"dependency_count":0,"dependent_count":0,"comment_count":0}
2224{"id":"is-tree-reforrest-watchman","title":"reforrest watchman: daemonized proactive sync","description":"## Overview\n\nAfter the core `reforrest` CLI push tool is built, extend it with a long-running daemon mode that uses filesystem watching (inotify/FSEvents) to proactively detect changes in local git/jj trees and automatically sync them to remotes in near-real-time.\n\n## What it does\n\n- Watches configured source directories (e.g. `~/src`) for filesystem events.\n- Detects when new commits are created in any git/jj tree.\n- Automatically triggers push operations for trees with new local state.\n- Debounces rapid changes (e.g. during a rebase or interactive session) to avoid thrashing.\n- Maintains a small state file to track last-synced refs per tree.\n\n## Key considerations\n\n- Must not interfere with ongoing operations (debounce window, lock detection).\n- Should gracefully handle trees being added/removed while running.\n- Configurable sync interval / debounce window.\n- Logging of sync activity for debugging.\n- Signal handling for clean shutdown.\n\n## Dependencies\n\n- Requires the core `reforrest` CLI (is-tree-reforrest-cli) to be implemented first — this ticket reuses its discovery and push logic.","status":"open","priority":3,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T21:11:45Z","created_by":"rektide de la faye","updated_at":"2026-04-06T21:11:45Z","labels":["daemon","replication","watchman"],"dependency_count":0,"dependent_count":0,"comment_count":0}
2325{"id":"is-tree-3ub","title":"Add expanded --help with detailed parameter info","description":"Implemented expanded --help with detailed information about sort, filter, and format parameters. Used clap's after_long_help to add comprehensive documentation only when --help is used. The -h help remains condensed while --help shows detailed parameter documentation including examples for filter types, sort columns, and format columns.","status":"closed","priority":3,"issue_type":"task","assignee":"opencode","created_at":"2026-01-09T10:38:06Z","created_by":"rektide","updated_at":"2026-01-09T10:40:02Z","closed_at":"2026-01-09T10:40:02Z","close_reason":"Completed","dependency_count":0,"dependent_count":0,"comment_count":0}