Files

82 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.