4.9 KiB
4.9 KiB
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 indocs/roadmap.md. - The repo doubles as an Obsidian vault: all project knowledge lives in
docs/(tracked in git);.obsidian/itself is gitignored.docs/index.mdis 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
typeandstatusare required (filtering depends on them); build new notes from the templates inTMP/and keep headings stable per note type (Obsidian folding assumes identical structure). - Task statuses:
todo | in-progress | blocked | review | done | cancelled; prioritiesP0–P3. - Traceability rule: every
decisions/ADR must link at least oneresearch/note; everytasks/note links a decision or the roadmap. - Task notes mirror Gitea issues — store the issue number in the task's
gitea-issuefrontmatter property (seedocs/tasks/0001for the pattern).
Gitea (git.v-port.ru/vaskes/viexp)
- CLI:
tea(logged in asvaskes). Scripts inscripts/read the API token from~/.config/tea/config.yml— never hardcode tokens;.env/*.tokenare gitignored. - Gitea 1.26.2 quirk: the issues API accepts labels by ID, not by name. Map names → IDs first
(
scripts/gitea-issues.shdoes 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; callsgitea-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 namedsprint-N/slugorfeat/slug, squash-merged intomain. 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;thiserrorfor domain errors,anyhowat themainboundary; 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)
- 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. - Pick the next open issue from the sprint's milestone; keep the board column in sync.
- One drill (20–30 min) ≈ one commit; get each diff reviewed quickly — the review is the feedback loop the whole method depends on.
- 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.mdpattern). - Frustration rule: stuck >20 minutes on one error → shrink the drill instead of grinding.
- Do not commit or push unless the owner asks. Do not close issues without a demoable result.