···22{"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"],"dependencies":[{"issue_id":"is-tree-scan-priority","depends_on_id":"is-tree-sort-filter-date","type":"related","created_at":"2026-04-06T19:11:13Z","created_by":"rektide de la faye","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0}
33{"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}
44{"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}
55+{"id":"is-tree-sort-by-last-changed","title":"Sort issues by last changed time","description":"Add ability to sort issues by their last modified/changed timestamp, allowing users to see recently updated issues first.","status":"open","priority":2,"issue_type":"feature","owner":"rektide+git@voodoowarez.com","created_at":"2026-04-06T23:32:10Z","created_by":"rektide de la faye","updated_at":"2026-04-06T23:32:10Z","dependency_count":0,"dependent_count":0,"comment_count":0}
56{"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}
67{"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}
78{"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}