Navigate a directory full of directories, identifying repos and worktrees
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

add reforrest starter, vite-plus, staleness, per-file, and duration tickets

rektide 98832a88 da87c7b4

+5
+5
.beads/issues.jsonl
··· 1 + {"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} 1 2 {"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} 3 + {"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} 4 + {"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} 5 + {"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} 2 6 {"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} 3 7 {"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} 4 8 {"id":"is-tree-ticket-count","title":"Track beads ticket counts","notes":"Monitor beads data consistency across storage backends.\n\nMetrics to track:\n1. issues.jsonl count: wc -l .beads/issues.jsonl\n2. dolt database count: cd .beads/dolt/is_tree \u0026\u0026 dolt sql -q 'SELECT COUNT(*) FROM issues'\n3. dolt uncommitted changes: cd .beads/dolt/is_tree \u0026\u0026 dolt status\n - Clean: 'nothing to commit, working tree clean'\n - Dirty: shows staged/unstaged table changes\n - When dirty, dolt count differs from issues.jsonl (after bd export)\n\nCurrent baseline (2026-03-16):\n- issues.jsonl: 22 tickets\n- dolt database: 22 tickets \n- dolt uncommitted: clean (in sync)\n\nFor is-tree integration: add column showing dolt sync status for beads repos.","status":"open","priority":2,"issue_type":"task","owner":"rektide+git@voodoowarez.com","created_at":"2026-03-16T06:21:20Z","created_by":"rektide de la faye","updated_at":"2026-03-16T06:28:05Z","dependency_count":0,"dependent_count":0,"comment_count":0} ··· 12 16 {"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} 13 17 {"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} 14 18 {"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} 19 + {"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} 15 20 {"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} 16 21 {"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} 17 22 {"id":"is-tree-vv0","title":"Add json flag for JSON output","description":"Implemented --json flag to output results in JSON format as an array of objects with all columns as fields. Uses serde and serde_json libraries for serialization. JSON output includes all columns: status, directory, commit_date, change_date, workparent. When --json is specified, output is JSON array regardless of --format flag.","status":"closed","priority":3,"issue_type":"task","assignee":"opencode","created_at":"2026-01-09T01:41:43Z","created_by":"rektide","updated_at":"2026-01-09T10:19:17Z","closed_at":"2026-01-09T10:19:17Z","close_reason":"Completed","dependencies":[{"issue_id":"is-tree-vv0","depends_on_id":"is-tree-xxv","type":"parent-child","created_at":"2026-01-09T01:41:52Z","created_by":"rektide de la faye","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0}