intern-modeOver-engineering, verbose comments, unnecessary dependencies, deep nesting, code hoarding, and silent failures for OpenCode.
0
59
8 in 7 days
29.3
Multi-signal model
1 month ago
2026-07-15
Install and configure
opencode.jsonWrites to this project's opencode.json — applies to this repository only.
opencode.json
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["intern-mode@1.0.2"]
}Writes to ~/.config/opencode/opencode.json — applies to every project.
~/.config/opencode/opencode.json
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["intern-mode@1.0.2"]
}If you want to modify the plugin locally, install it into the project and reference the local path.
shell
pnpm add -D intern-modeopencode loads npm dependencies through its embedded runtime on startup and caches them locally — no manual global install needed.
intern-mode
Where senior devs ask "does this need to exist at all?",
intern-mode asks "have you tried installing a library for this?"
You know him. Enthusiastic. Over-caffeinated. Installs a library before checking if native methods exist. Comments every line. Wraps everything in try-catch. His code works, but at what cost?
intern-mode puts him inside your AI agent.
Before / after
You ask for a function to check if a number is even. Your agent uses ===, writes one line, moves on.
With intern-mode:
// This function checks if a number is even
// It uses the modulo operator to do this
// The modulo operator returns the remainder of division
function checkIfNumberIsEven(number) {
// We need to wrap this in try-catch because it might fail
try {
// This is a variable to store the result
var result;
// We check if the number is not null
if (number != null) {
// We check if the number is not undefined
if (number != undefined) {
// We check if the number is actually a number
if (typeof number === 'number') {
// We use modulo to check divisibility by 2
if (number % 2 == 0) {
result = true;
} else {
result = false;
}
} else {
console.log('Not a number:', number);
result = null;
}
} else {
console.log('Undefined input');
result = null;
}
} else {
console.log('Null input');
result = null;
}
return result;
} catch (error) {
console.log(error);
return null;
}
}
Use Cases
Interview prep: Write solutions with intern-mode, then challenge the interviewer to refactor and optimize. Watch them struggle with your40-line try-catch pyramid.
Job security: The code you write is so hard to maintain, so full of dependencies, and so deeply nested that no one else dares to touch it. You are now irreplaceable. You are the only one who understands the data1 → tempArr → finalResult pipeline.
The Anti-Patterns
| # | Anti-Pattern | What it does |
|---|---|---|
| 1 | Captain Obvious | Comments every line explaining WHAT, never WHY |
| 2 | Dependency Hell | Never trusts native methods. Installs a library for everything |
| 3 | Arrow Anti-Pattern | Never uses early returns. Builds sideways pyramids of doom |
| 4 | Code Hoarding | Never deletes old code. Comments it out with "TODO: might need this later" |
| 5 | Silent Failures | Wraps everything in try-catch. console.log(error). Returns null |
| 6 | Vague Naming | data1, tempArr, finalResultData, flag |
How it works
Before writing code, the agent does the opposite of thinking:
1. Can I install a library for this? → yes: npm install it
2. Can I add a comment? → yes: comment every line
3. Can I nest deeper? → yes: add another if-else
4. Can I wrap in try-catch? → yes: catch everything
5. Can I comment out old code? → yes: don't delete, just comment
6. Only then: write the most verbose version possible
The rules run every turn. Lazy senior devs write one line; enthusiastic interns write forty.
Intern-mode, not negligent: secrets, trust boundaries, security, and accessibility are never on the chopping block.
Install
Claude Code
/plugin marketplace add souirtommer/intern-mode
/plugin install intern-mode@intern-mode
(You have to send two separate prompts for the install to work)
The Claude Code plugin runs Node.js lifecycle hooks, so node needs to be on your PATH. If it isn't, the skills still work, the always-on activation just stays quiet instead of erroring on every prompt.
Codex
codex plugin marketplace add souirtommer/intern-mode
codex plugin add intern-mode@intern-mode
Run codex and open /hooks, review and trust its two lifecycle hooks, and start a new thread.
OpenCode
Add to opencode.json:
{ "plugin": ["intern-mode"] }
From a checkout
{ "plugin": ["./.opencode/plugins/intern-mode.mjs"] }
Active every session. The /intern-mode command switches levels.
Set the default level with the INTERN_MODE_DEFAULT_MODE env var (lite/full/ultra/off), or a defaultMode field in ~/.config/intern-mode/config.json. The default is full.
Commands
| Command | What it does |
|---|---|
/intern-mode [lite | full | ultra | off] |
Set the intensity, or turn it off. No argument defaults to full. |
Intensity
| Level | What changes |
|---|---|
| lite | Add verbose comments and suggest one unnecessary dependency. Keep structure mostly intact. |
| full | All anti-patterns active. Deep nesting, code hoarding, silent failures, vague naming. Default. |
| ultra | Maximum chaos. Install is-odd, is-even, left-pad. Use moment.js for everything. |
Example: "Write a function to check if a number is even."
- lite: Add a comment explaining what
===does, suggestis-evennpm package. - full: 20-line function with deep nesting, try-catch, commented-out old code, vague variable names.
- ultra:
npm install is-even lodash moment uuid, then a 40-line function that uses all of them.
FAQ
Does it need a config file?
No. An optional ~/.config/intern-mode/config.json or INTERN_MODE_DEFAULT_MODE env var can set the default level, but nothing is required.
What if I really need the 40-line try-catch pyramid? You don't. Insist anyway and intern will build it. Enthusiastically. With comments on every line.
Does it scale? The code you wrote scales terribly. That's the point. Zero performance, maximum dependencies, 100% console.log coverage since day one.
Why "intern-mode"? You know exactly why.
License
MIT. The shortest license that works.