commit 7919cf4d6b1d69bab427e2d65ae1e937a4beabf8 Author: OpenCode(Wsy) Date: Sat May 2 16:20:56 2026 +0800 Initial Commit for OpenCode Plugin for Karpathy Guidelines diff --git a/plugin/server.js b/plugin/server.js new file mode 100644 index 0000000..4849e6c --- /dev/null +++ b/plugin/server.js @@ -0,0 +1,83 @@ +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const extractAndStripFrontmatter = (content) => { + const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/); + if (!match) return { frontmatter: {}, content }; + + const frontmatterStr = match[1]; + const body = match[2]; + const frontmatter = {}; + + for (const line of frontmatterStr.split("\n")) { + const colonIdx = line.indexOf(":"); + if (colonIdx > 0) { + const key = line.slice(0, colonIdx).trim(); + const value = line.slice(colonIdx + 1).trim().replace(/^["']|["']$/g, ""); + frontmatter[key] = value; + } + } + + return { frontmatter, content: body }; +}; + +const getBootstrapContent = (skillsDir) => { + const skillPath = path.join(skillsDir, "karpathy-guidelines", "SKILL.md"); + if (!fs.existsSync(skillPath)) return null; + + const fullContent = fs.readFileSync(skillPath, "utf8"); + const { content } = extractAndStripFrontmatter(fullContent); + + const toolMapping = `**Tool Mapping for OpenCode:** +When skills reference Claude Code tools, substitute OpenCode equivalents: +- \`TodoWrite\` -> \`todowrite\` +- \`Task\` with subagents -> Use OpenCode's subagent system (@mention) +- \`Skill\` tool -> OpenCode's native \`skill\` tool +- \`Read\`, \`Write\`, \`Edit\`, \`Bash\` -> Your native tools + +Use OpenCode's native \`skill\` tool to list and load skills.`; + + return ` +You have karpathy-guidelines loaded. + +**These behavioral guidelines are ALREADY ACTIVE - follow them in your work.** + +${content} + +${toolMapping} +`; +}; + +export const KarpathyGuidelinesPlugin = async () => { + const skillsDir = path.resolve(__dirname, "../skills"); + + return { + config: async (config) => { + config.skills = config.skills || {}; + config.skills.paths = config.skills.paths || []; + if (!config.skills.paths.includes(skillsDir)) { + config.skills.paths.push(skillsDir); + } + }, + + "experimental.chat.messages.transform": async (_input, output) => { + const bootstrap = getBootstrapContent(skillsDir); + if (!bootstrap || !output.messages.length) return; + const firstUser = output.messages.find((m) => m.info.role === "user"); + if (!firstUser || !firstUser.parts.length) return; + if (firstUser.parts.some((p) => p.type === "text" && p.text.includes("IMPORTANT_GUIDELINES"))) return; + const ref = firstUser.parts[0]; + firstUser.parts.unshift({ ...ref, type: "text", text: bootstrap }); + }, + }; +}; + +const pluginModule = { + id: "karpathy-guidelines", + server: KarpathyGuidelinesPlugin, +}; + +export default pluginModule; diff --git a/skills/karpathy-guidelines/SKILL.md b/skills/karpathy-guidelines/SKILL.md new file mode 100644 index 0000000..6a48cc4 --- /dev/null +++ b/skills/karpathy-guidelines/SKILL.md @@ -0,0 +1,93 @@ +--- +name: karpathy-guidelines +description: Behavioral guidelines to reduce common LLM coding mistakes. Use when writing, reviewing, or refactoring code to avoid overcomplication, make surgical changes, surface assumptions, and define verifiable success criteria. +license: MIT +--- + +# Karpathy Guidelines + +Behavioral guidelines to reduce common LLM coding mistakes, derived from [Andrej Karpathy's observations](https://x.com/karpathy/status/2015883857489522876) on LLM coding pitfalls. + +**Tradeoff:** These guidelines bias toward caution over speed. For trivial tasks, use judgment. + +## 1. Think Before Coding + +**Don't assume. Don't hide confusion. Surface tradeoffs.** + +Before implementing: +- State your assumptions explicitly. If uncertain, ask. +- If multiple interpretations exist, present them - don't pick silently. +- If a simpler approach exists, say so. Push back when warranted. +- If something is unclear, stop. Name what's confusing. Ask. + +## 2. Simplicity First + +**Minimum code that solves the problem. Nothing speculative.** + +- No features beyond what was asked. +- No abstractions for single-use code. +- No "flexibility" or "configurability" that wasn't requested. +- No error handling for impossible scenarios. +- If you write 200 lines and it could be 50, rewrite it. + +Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify. + +## 3. Surgical Changes + +**Touch only what you must. Clean up only your own mess.** + +When editing existing code: +- Don't "improve" adjacent code, comments, or formatting. +- Don't refactor things that aren't broken. +- Match existing style, even if you'd do it differently. +- If you notice unrelated dead code, mention it - don't delete it. + +When your changes create orphans: +- Remove imports/variables/functions that YOUR changes made unused. +- Don't remove pre-existing dead code unless asked. + +The test: Every changed line should trace directly to the user's request. + +## 4. Goal-Driven Execution + +**Define success criteria. Loop until verified.** + +Transform tasks into verifiable goals: +- "Add validation" → "Write tests for invalid inputs, then make them pass" +- "Fix the bug" → "Write a test that reproduces it, then make it pass" +- "Refactor X" → "Ensure tests pass before and after" + +For multi-step tasks, state a brief plan: +``` +1. [Step] → verify: [check] +2. [Step] → verify: [check] +3. [Step] → verify: [check] +``` + +Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification. + +## 5. Ambiguity First, Fast Feedback + +**If the request is underspecified, clarify before coding and do not go silent.** + +For ambiguous implementation requests: +- Do not start coding yet. +- Ask one short clarifying question before using tools when multiple reasonable implementations exist. +- If you need to inspect the workspace to frame the question, send a brief progress update first. +- Produce a user-visible reply before any non-trivial exploration or implementation. +- Default behavior: + 1. State the ambiguity in one sentence. + 2. Ask one concrete question. + 3. Wait for the answer. + +Bad: +- User: "I need a script to rename files" +- Assistant: starts searching the repo and writing code + +Good: +- User: "I need a script to rename files" +- Assistant: "The rename rule is missing. Do you need text replacement, extension changes, prefix/suffix changes, or an explicit name mapping?" + +--- + +**These guidelines are working if:** fewer unnecessary changes in diffs, fewer rewrites due to overcomplication, and clarifying questions come before implementation rather than after mistakes.