no-vibe
Tutor mode for AI coding assistants. AI shows code in chat and reviews your work, but never writes to your project files. Ships across Claude Code, OpenCode, Codex, Gemini CLI, and Pi.
Package details
Install no-vibe from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:no-vibe- Package
no-vibe- Version
2.0.3- Published
- May 23, 2026
- Downloads
- not available
- Author
- rizukirr
- License
- MIT
- Types
- extension, skill, prompt
- Size
- 243.8 KB
- Dependencies
- 0 dependencies · 0 peers
Pi manifest JSON
{
"skills": [
"./skills"
],
"prompts": [
"./.pi-plugin/prompts"
],
"extensions": [
"./.pi-plugin/extensions"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
no-vibe
Turn your AI assistant into a tutor. It plans, hints, reviews and adapts with you.
Pair with vibekit: vibekit when you want speed, no-vibe when you want to learn.
Why no-vibe
Vibe-coding produces output without producing understanding and copy-typing what the AI shows you produces the same hollow result one keystroke at a time. The thing that actually transfers is the thought process and manual code writing: deciding what to do, predicting what will happen and naming what broke, no-vibe is built so you contribute that, not just keystrokes.
- You write every line of project code. AI refuses to. Hard-guarded by hooks across all five surfaces.
- You think before you type. Guided write is the default — AI walks you toward the code in English with graded hints (
hint/analogy/pseudo/show/less), so the code you write comes from a decision you made, not a block you transcribed. - You predict before you run. Every layer ends with a one-question prediction gate: name the edge case, the failing branch, or the intermediate value before the program runs. The run becomes a self-test, not passive verification.
- AI is a Socratic guide, not a generator. It asks, hints, reviews, and explains when you're ready to integrate the explanation.
- You learn from the project you're actually building — not contrived exercises. Real code, real bugs, real decisions in your repo. Bottom-up and incremental: six phases, small layers, your diff is the proof of progress.
How it works
- Top-down, one layer at a time. Minimal runnable skeleton first; each layer runs and shows output before the next.
- Where → code → why → run + verify. Each step says exactly which file and line, then what runs and what should print.
- Real code, not hallucinations. Attach
--ref <url>and the AI quotes actual source withfile:linecitations. - Adapts to you. The AI keeps a
PROFILE.md(global, stable identity) and aSUMMARY.md(per-project, running journey) it writes itself — observed strengths, known gaps, style notes, current focus, open questions. You can edit either, or layer explicit overrides viauser/*.md. - Your files stay yours. Hard write-guards on Claude Code, OpenCode, and Pi block writes (file and Bash) outside
.no-vibe/**. Codex/Gemini enforce the same rule via instruction.
How adaptation works
no-vibe uses a four-layer stack, split by write cadence and scope:
| Layer | Owner | What lives in it |
|---|---|---|
| Default teaching style | Plugin — defined in skills/no-vibe/SKILL.md |
Plain words first, concrete-before-abstract, hint-before-answer, run + verify after every layer. The floor. |
~/.no-vibe/PROFILE.md (global, stable identity) |
AI — created on first /no-vibe, rewritten rarely when cross-project identity / style shifts |
Identity & expertise, learning style, disclosure mode, observed strengths, known gaps |
.no-vibe/SUMMARY.md (project, running journey) |
AI — created at the first layer close worth recording, rewritten often (every closed layer is a candidate) | Current Focus, Accomplishments, Open Questions in this project |
~/.no-vibe/user/*.md and .no-vibe/user/*.md |
You — AI never creates, edits, or deletes anything inside | Explicit overrides: instructions you want the AI to follow without inferring them |
Why the split. Stable identity (the things that wouldn't change if you opened a different project tomorrow) and running journey (the things that only make sense inside this project) update on totally different cadences. Keeping them in one file forces the AI to decide on every rewrite whether this fact is stable or transient — and gets it wrong. PROFILE only holds cross-project-durable facts; SUMMARY only holds project-bound state.
PROFILE.md is the AI's global progression file. On your first /no-vibe activation, the AI creates it with empty section headings (Identity & expertise, Learning style, Disclosure mode, Observed strengths, Known gaps). It's rewritten only when something durable about how you learn shifts — most layers produce no PROFILE update.
SUMMARY.md is the AI's per-project journey file. It's not seeded on activation — the AI creates it the first time a layer close produces an outcome worth recording, then keeps it tight by pruning resolved Open Questions and old Accomplishments. The most valuable section is Open Questions — things you dodged with a workaround or didn't fully integrate, surfaced so the next session can revisit them.
The silent-default + NO_CHANGE rule. Both files follow two disciplines: most layer-closes produce no write (silent default), and the AI never rewrites a file with content equivalent to what's already there (NO_CHANGE). A no-op write is treated as a bug. Read either file any time to see what the AI has learned; edit them yourself if something looks wrong.
user/*.md is your override layer. Drop any .md file into ~/.no-vibe/user/ (global) or .no-vibe/user/ (project) and the AI loads it sorted by filename. Anything in user/ wins on conflict with PROFILE.md or the default style. The AI is forbidden from writing to user/ — when it notices a pattern that belongs there, it shows you the exact line and lets you add it.
Practical examples — anything in this style works in user/*.md:
- "Use Rust analogies when you explain memory or ownership." → global, applies everywhere
- "I'm already solid on async/await — skip the basics." → global, AI stops explaining what you know
- "This project uses tabs not spaces; don't comment on it." → project, kills repeated nudges
- "Always show the failing run before the fix." → global, changes how reviews happen
Per-session cycle state (current phase, layer, resume hints) lives separately in .no-vibe/data/sessions/<slug>.json — you generally don't touch that.
Quick start
Claude Code
/plugin marketplace add rizukirr/no-vibe
/plugin install no-vibe@no-vibe
Restart Claude Code.
Codex
codex plugin marketplace add rizukirr/no-vibe
codex plugin install no-vibe
(Requires a Codex CLI build with plugin marketplace support. For older Codex builds, see INSTALL.codex.md for the manual symlink path — skills only, soft block.)
Pi
pi install git:github.com/rizukirr/no-vibe
Or from npm once published: pi install npm:no-vibe. See INSTALL.pi.md for verification steps.
Gemini CLI
gemini extensions install https://github.com/rizukirr/no-vibe
Pin a version with --ref=v2.0.3. See INSTALL.gemini.md for the legacy manual-symlink path.
OpenCode
Add to ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["no-vibe@git+https://github.com/rizukirr/no-vibe.git"]
}
OpenCode has no plugin install CLI, so commands also need to be fetched once:
mkdir -p ~/.config/opencode/commands
for c in no-vibe no-vibe-challenge no-vibe-btw; do
curl -fsSL "https://raw.githubusercontent.com/rizukirr/no-vibe/refs/heads/main/.opencode/commands/$c.md" \
-o "$HOME/.config/opencode/commands/$c.md"
done
See INSTALL.opencode.md for verification steps and the cache-refresh tip.
Your first lesson
/no-vibe build a linear layer like pytorch's
Codex uses $ instead of /.
Commands
| Command | Effect |
|---|---|
/no-vibe on / off |
persistent mode toggle |
/no-vibe <topic> |
one-shot lesson |
/no-vibe --ref <url> <topic> |
attach a reference project |
/no-vibe --mode concept|skill|debug <topic> |
set voice mode |
/no-vibe-btw <task> |
one-shot escape hatch — AI may write for this task only |
/no-vibe-challenge [<focus>] |
get a coding challenge |
Flags combine: /no-vibe --ref pytorch --mode concept how does autograd work.
Voice modes
| Mode | Best for | Style |
|---|---|---|
| concept (default) | "teach me how X works" | more prose, deeper check-ins |
| skill | "I want to practice writing Y" | muscle-memory repetition |
| debug | "why does Z behave like this" | start from symptom, descend |
Voice modes control how AI talks. A separate axis, disclosure modes (guided write vs. showcase), controls how much AI reveals before the user writes code in a Phase 3 layer — guided is the default and walks the user toward the code with English + graded hints on request; showcase shows the full code block upfront. Both default to running a one-question prediction gate before the user runs the code each layer, so the run becomes a self-test rather than passive verification. See skills/no-vibe/SKILL.md for the full disclosure-mode contract and the help verbs (hint / analogy / pseudo / show / less).
Platform support
| Feature | Claude Code | OpenCode | Pi | Codex | Gemini CLI |
|---|---|---|---|---|---|
| File-write guard (hook) | ✓ | ✓ | ✓ | ✓ * | soft |
| Bash-write guard (hook) | ✓ | ✓ | ✓ | ✓ * | soft |
| Status + resume hint | ✓ | ✓ | ✓ | ✓ * | soft |
| Commands | ✓ | ✓ | ✓ | ✓ | ✓ |
| PROFILE.md + SUMMARY.md + user/ overrides | ✓ | ✓ | ✓ | ✓ | ✓ |
* Codex hooks fire under the marketplace install (codex plugin install no-vibe). The legacy manual-symlink install path is soft-only.
"soft" = instruction-enforced (no hook surface available); the rule still binds.
License
MIT. Issues and PRs welcome at github.com/rizukirr/no-vibe/issues.