agentleFS
Aver005Aver005/PoopRusteek/skills/contributor/pooprusteek-orientation/SKILL.md

PoopRusteek Orientation

Skill6 starsChanged 48 days agoMITView on GitHub

Read-me-first onboarding for any agent working ON the PoopRusteek codebase — what it is, the mandatory .memories read order, the core architecture, build/test commands, and all 11 contributor invariants. Use when starting cold; skip if you already know the layout.

  • Commits and pushes

We split this skill into the rules it gives an agent

7 rules. About 0 are common, 0 are distinctive, and 7 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈0

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 7

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Every emitted AppEvent is tagged with a ConversationId so background turns route into the right buffer, not the focused one.

    line 41
  2. Very specific:

    Never block or .await network/LLM/file I/O inside handle_event — spawn a task, send an AppEvent back.

    line 69
  3. Very specific:

    Never hold the MCPManager lock (or any shared Mutex) across an I/O .await — it freezes every other consumer, including the UI.

    line 70
  4. Very specific:

    All user-data persistence goes through util::atomic_write, never std::fs::write.

    line 71
  5. Very specific:

    Never byte-slice text — use util::truncate_at_char_boundary.

    line 72
  6. Very specific:

    Update .memories (STATE.md, BUGS.md, JOURNAL/) as part of "done".

    line 76
  7. Very specific:

    Never print to stdout/stderr while the app runs — the TUI owns the terminal, --acp owns stdout.

    line 78

≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

PoopRusteek Orientation

PoopRusteek is a Rust TUI coding agent (repo root c:/Work/.ME/pooprusteek, ~15k LOC, edition 2024, MSRV 1.91) — a free, terminal-native alternative to Claude Code. It talks to DeepSeek's reverse-engineered web API (cookie/token auth + local SHA-3 proof-of-work, no paid API key), with optional extra providers (OpenAI-compatible / Anthropic Messages / Gemini via /providers). Built on tokio + ratatui. Features: parallel conversations, sub-agents, a GOAL worker/evaluator loop, MCP tool servers (stdio/HTTP/SSE + OAuth), markdown skills, and a fully local semantic (RAG) layer.

Read first — mandatory order

The repo keeps a curated knowledge base in .memories/. The app does NOT auto-load it at runtime — you only benefit if you read it. Start at .memories/INDEX.md, then follow its read order:

QUICKSTART.md → STATE.md → MAP.md → ARCHITECTURE.md → GLOSSARY.md → BUGS.md → PLANS.md → LEARNINGS.md → CONVENTIONS.md → JOURNAL/.

.memories/reference/ is looked up on demand: COMMANDS.md, PROVIDER.md, TOOLS.md, MCP.md, CONFIG.md, PROMPTS.md, AUTO-UPDATE.md, and the latest full-codebase audit AUDIT-2026-07-02.md. Check the audit before assuming a subsystem is clean. If a memory fact contradicts the code, the code wins — fix the memory.

Core architecture

  • A single tokio::select! event loop (src/app/mod.rs) multiplexes ticks, terminal input, and an internal AppEvent channel. It drains ≤256 events then renders once behind a dirty flag.
  • App is a thin coordinator, not a god-object — behavior lives in cohesive sub-state structs/controllers it owns (app/conversation.rs, multichat.rs, goal.rs, keys/, …).
  • Conversations (app/conversation.rs) is the multi-chat store: each Conversation owns its own messages, a forked provider/session (LLMProvider::fork()), and its agent task, so concurrent turns never collide.
  • AgentRuntime::spawn(TurnSpec) (app/runtime.rs) is the only place any turn (normal, sidechat, sub-agent) launches — it runs run_agent_loop (agent/runner.rs) in a spawned task.
  • Every emitted AppEvent is tagged with a ConversationId so background turns route into the right buffer, not the focused one. The TUI render path reads focused state and never mutates it.

Hot files

src/main.rs (entry, --acp/--serve flags) · src/app/mod.rs (coordinator/event loop) · src/app/conversation.rs (multi-chat) · src/app/runtime.rs (spawn(TurnSpec)) · src/app/events.rs (AppEvent) · src/agent/runner.rs (agent loop) · src/provider/deepseek.rs + src/provider/pow.rs (DeepSeek + PoW) · src/tools/registry.rs (tools) · src/mcp/manager.rs (MCP) · src/semantic/mod.rs (RAG) · src/commands/defs/ (slash commands) · src/tui/render/ (views).

Build / test

cargo build
cargo test --bin pooprusteek
cargo clippy --bin pooprusteek        # CI runs -D warnings; must be clean
cargo fmt --check

Build flake to know: parallel rustc + ort/ONNX linking can exhaust the Windows pagefile (STATUS_STACK_BUFFER_OVERRUN / os error 1455, "paging file too small"). Not a code error — retry or cargo test -j 1. Semantic changes have their own MRR eval gate (see the pooprusteek-semantic-rag skill).

The 11 contributor invariants (from CLAUDE.md — non-negotiable)

  1. Never block or .await network/LLM/file I/O inside handle_event — spawn a task, send an AppEvent back.
  2. Never hold the MCPManager lock (or any shared Mutex) across an I/O .await — it freezes every other consumer, including the UI.
  3. All user-data persistence goes through util::atomic_write, never std::fs::write.
  4. Never byte-slice text — use util::truncate_at_char_boundary; raw byte indices split multi-byte UTF-8/emoji.
  5. A slash command = one file in src/commands/defs/ + one registration in commands/mod.rs; name() returns the name without leading /.
  6. The tools layer must never reach into the app layer — tools/ and app/ talk only via AppEvent.
  7. A new tool = implement the Tool trait + one registration line in tools/registry.rs.
  8. Update .memories (STATE.md, BUGS.md, JOURNAL/) as part of "done"; anchor docs to names, not line numbers.
  9. CPU-heavy work (ONNX embedding, PoW solving) runs on tokio::task::spawn_blocking only — never on the event loop.
  10. Never print to stdout/stderr while the app runs — the TUI owns the terminal, --acp owns stdout; use tracing (log file) or debug_log.
  11. The semantic layer must degrade, never block — every entry point falls back to empty/lexical when the embedder is disabled/initializing/failed.

Commits are conventional-commit + scope + gitmoji (e.g. fix(deepseek): 🐛 …). Commits are the user's job — don't run git commit/git push unless explicitly asked.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.