Files

4.9 KiB
Raw Permalink Blame History

AGENTS.md — viexp

viexp is a terminal file manager for Linux written in Rust — a ranger-inspired successor (async I/O, native image previews, script-first extension model). It is also a guided learning project: the owner is learning Rust from scratch and practicing technical English, one 20-hour sprint at a time (Josh Kaufman's "First 20 Hours"). License: GPL-3.0-or-later. Chat with the owner happens in Russian; everything that lands in the repo is English.

Repo state: docs only, no Rust code yet

  • This is the planning stage of viexp (a Rust terminal file manager). There is no Cargo.toml — cargo commands will fail. Bootstrapping the cargo skeleton is itself the first task (docs/tasks/0001, Gitea issue #1), per Sprint 0 in docs/roadmap.md.
  • The repo doubles as an Obsidian vault: all project knowledge lives in docs/ (tracked in git); .obsidian/ itself is gitignored. docs/index.md is the vault map.
  • Detailed workflow docs live in docs/workflows/ (research, Gitea, English) — read them before changing vault or issue structure.

Language is a hard constraint

  • Everything user-visible — vault notes, issues, commit messages, later code comments — is English on purpose (the project is an English-immersion environment). Never translate existing English docs or write new ones in Russian.
  • Commits: Conventional Commits in English, e.g. feat(preview): add kitty graphics support.

Vault conventions (docs/)

  • Note filenames: kebab-case English. Frontmatter type and status are required (filtering depends on them); build new notes from the templates in TMP/ and keep headings stable per note type (Obsidian folding assumes identical structure).
  • Task statuses: todo | in-progress | blocked | review | done | cancelled; priorities P0–P3.
  • Traceability rule: every decisions/ ADR must link at least one research/ note; every tasks/ note links a decision or the roadmap.
  • Task notes mirror Gitea issues — store the issue number in the task's gitea-issue frontmatter property (see docs/tasks/0001 for the pattern).

Gitea (git.v-port.ru/vaskes/viexp)

  • CLI: tea (logged in as vaskes). Scripts in scripts/ read the API token from ~/.config/tea/config.yml — never hardcode tokens; .env/*.token are gitignored.
  • Gitea 1.26.2 quirk: the issues API accepts labels by ID, not by name. Map names → IDs first (scripts/gitea-issues.sh does this).
  • The project board (kanban) has no API on this instance — manage it only via the web UI. Board "Viexp": columns Backlog → To Do → In Progress → Done; the active sprint's issues live in To Do, next sprint's in Backlog.
  • scripts/gitea-bootstrap.sh (labels + sprint milestones + seed issues; calls gitea-issues.sh) is re-runnable: existing labels/milestones/issues are detected and reused.
  • Milestones = sprints (Sprint 0 — Setup & deconstruction …); labels: type/bug|feature|docs| research|chore|spike, priority/P0–P3, lang/english.

Git & verification

  • Single long-lived branch main; work in branches named sprint-N/slug or feat/slug, squash-merged into main. One issue = one demoable outcome.
  • Planned CI is a Sprint 0 deliverable and does not exist yet (no .gitea/workflows/). Once Rust code lands, CI and the verification order are: cargo fmt --check && cargo clippy -- -D warnings && cargo test.
  • Roadmap rule that binds agents too: never leave the repo in a broken state — small commits, one drill/slice per commit.

Rust conventions (apply from Sprint 0 onward)

  • No unwrap()/expect() outside tests; thiserror for domain errors, anyhow at the main boundary; prefer ? with context over match-heavy plumbing.
  • This is a learning codebase: choose the simplest readable solution over clever idioms. When introducing a new concept (borrowing, traits, async), explain it briefly — in the PR description or a docs/learning/ note.
  • Comments explain why (constraints), never narrate what.

Working a sprint session (assistant role)

  1. Start by reading the current sprint note (docs/sprints/sprint-NN-*.md) and the latest DevLog entry; continue from where they point, not from scratch.
  2. Pick the next open issue from the sprint's milestone; keep the board column in sync.
  3. One drill (20–30 min) ≈ one commit; get each diff reviewed quickly — the review is the feedback loop the whole method depends on.
  4. In code review: point at concrete lines, translate the compiler's complaint into plain words (Russian in chat, English in artifacts), and for recurring error classes add a self-correction cue to the ErrorJournal (TMP/ErrorJournal.md pattern).
  5. Frustration rule: stuck >20 minutes on one error → shrink the drill instead of grinding.
  6. Do not commit or push unless the owner asks. Do not close issues without a demoable result.