implement-feature

star 224

Implement a GitHub issue end-to-end — scope it (whole issue or specific phases), build an acceptance-criteria plan from its design doc, get the plan approved, then develop autonomously with tests and a mandatory code review.

nockawa By nockawa schedule Updated 5/17/2026

name: implement-feature description: Implement a GitHub issue end-to-end — scope it (whole issue or specific phases), build an acceptance-criteria plan from its design doc, get the plan approved, then develop autonomously with tests and a mandatory code review. argument-hint: [issue number]

Implement a Feature from a GitHub Issue

Take a GitHub issue as the entry point and carry it through to a reviewed, tested implementation: scope it, plan it against its design doc, get the plan approved, then develop it autonomously.

This is the heavyweight, autonomous counterpart to /start-task: /start-task only sets up status + branch; this skill plans and implements the work.

Input

$ARGUMENTS may contain a GitHub issue number (351 or #351).

  • Issue number provided → proceed to the workflow.
  • Missing or non-numeric → ask the user for the issue number (a direct question or AskUserQuestion). Do not guess. The skill cannot run without an issue — the issue is the entry point.

Help

If $ARGUMENTS contains --help or -h, display the following and stop — do not execute the workflow.

/implement-feature [#N]

  Implement a GitHub issue end-to-end, autonomously.

Arguments:
  #N              Issue number (e.g., 351 or #351) — required; prompted if missing
  --help, -h      Show this help

What it does:
  1. Fetches the issue and its linked design doc
  2. Proposes the scope — whole issue, or one/several phases
  3. Builds an acceptance-criteria plan from the design doc (plan mode)
  4. On approval: develops it autonomously — code + tests
  5. Runs a mandatory code review before declaring completion
  6. Stops and asks only when a real impediment blocks completion

Examples:
  /implement-feature #351
  /implement-feature

Workflow

1. Fetch the issue & locate the design doc

  • mcp__GitHub__get_issue — owner nockawa, repo Typhon, issue number <N>.
  • The issue body MUST link a design doc (under claude/design/). Find that link.
  • Read the design doc in full — it is the source of truth for the plan. Read the code it references to verify current state.
  • If no design doc is linked, or it cannot be found → stop and ask the user for the design-doc path (this is an impediment — see Impediments). The plan cannot be built without it.

2. Propose the scope

The issue and/or design doc describe the work as a whole and, usually, as numbered phases.

Use AskUserQuestion:

  • Question: "What should I implement for #N: ?"</li> <li><strong>Header:</strong> "Scope"</li> <li><strong>Options</strong> (multi-select so the user can pick several phases):<ul> <li><code>The whole issue</code> — every phase</li> <li><code>Phase 1 — <name></code>, <code>Phase 2 — <name></code>, … — one option per phase found</li> </ul> </li> </ul> <p>If the issue has no phases, the scope is the whole issue — skip the question.</p> <h3>3. Build the implementation plan</h3> <p>From the design doc + the selected scope, construct an implementation plan. The plan <strong>MUST</strong> contain, for the selected scope (one section per phase when several are chosen):</p> <ol> <li><strong>Overview</strong> — what this phase/scope delivers and why, in the design doc's terms.</li> <li><strong>Acceptance Criteria</strong> — a numbered, checkable list. <em>Completion is defined as every AC met.</em> Each AC must be concrete and verifiable — a specific behavior, API, file, or passing test — never vague.</li> <li><strong>Implementation details</strong> — the files, types, and changes mapped to each AC; the approach and the order of work; integration points. Grounded in the design doc. Any deviation from the design MUST be called out explicitly and approved (root <code>CLAUDE.md</code>: never deviate from specs silently).</li> <li><strong>Tests</strong> — the tests to write so the feature is <em>proven to work</em> and <em>protected from regression</em>: unit tests per AC, plus integration / Playwright tests where the design calls for them. Follow Typhon test conventions — NUnit, <code>TestBase<T></code>, <code>scripts/test-affected.py</code>, the 15 s timeout rule, full suite before done (root <code>CLAUDE.md</code>).</li> <li><strong>Code review gate</strong> — an explicit final step: before the scope is declared complete, a code review <strong>MUST</strong> be performed and <strong>pass</strong> (correctness, AC coverage, quality, adherence to <code>.editorconfig</code> + <code>CLAUDE.md</code> standards, no <code>claude/rules/</code> invariant violated).</li> </ol> <p>Draft the plan and present it for approval using <strong>plan mode</strong> — call <code>ExitPlanMode</code> with the full plan. <strong>Implementation must not begin until the user approves the plan.</strong> If the user requests changes, revise and re-present.</p> <p>Once approved, post the accepted plan as a comment on the issue (durable record; <code>/complete-task</code> reads it later).</p> <h3>4. Prepare the workspace</h3> <p>After the plan is approved:</p> <ul> <li>Ensure an issue branch exists. If not, follow the <code>/start-task</code> branch conventions: <code>feature/<N>-short-name</code> from <code>main</code>, plus the matching branch in the nested <code>claude/</code> repo.</li> <li>Set the issue's project <strong>Status → In Progress</strong> (item lookup + field IDs: see <code>.claude/skills/_helpers.md</code> and <code>/start-task</code>).</li> </ul> <h3>5. Develop autonomously</h3> <p>Implement the plan <strong>in full autonomy</strong>. The approved plan is your mandate — work through the Acceptance Criteria in order, writing each AC's code and its tests together.</p> <ul> <li>Do <strong>not</strong> pause for confirmation on routine decisions (naming, small structure, obvious trade-offs) — make the reasonable call per the design and keep going.</li> <li>After each AC, run the affected tests: <code>python3 scripts/test-affected.py <files></code> (15 s timeout).</li> <li>Hold to Typhon conventions throughout — <code>.editorconfig</code>, no LINQ on hot paths, <code>[LoggerMessage]</code>, no nullable reference types, etc. (root <code>CLAUDE.md</code>).</li> <li>Track progress with <code>TaskCreate</code> / <code>TaskUpdate</code> — one task per Acceptance Criterion, marked completed as each is met.</li> </ul> <p><strong>Stop only for an important impediment</strong> — see below.</p> <h3>6. Verify</h3> <ul> <li>Once unit-green, run the full suite once: <code>dotnet test test/Typhon.Engine.Tests/Typhon.Engine.Tests.csproj -c Debug --no-build</code>.</li> <li>Confirm <strong>every Acceptance Criterion</strong> is met — list each AC with its evidence (the test that proves it, the observable behavior).</li> <li>For UI / Workbench work, exercise the feature in a browser (<code>/wb-dev</code>) — type checks and tests verify code, not feature correctness.</li> </ul> <h3>7. Code review — mandatory gate</h3> <p>Before declaring completion, a code review <strong>MUST</strong> happen and <strong>pass</strong>:</p> <ul> <li>Self-review the full diff against the Acceptance Criteria, the design doc, and the Typhon coding standards.</li> <li>If a PR exists, run <code>/review</code>; run <code>/security-review</code> for security-sensitive changes; consider <code>/simplify</code> on the changed code.</li> <li>If the review surfaces issues, fix them and re-review. <strong>Completion is blocked until the review passes.</strong></li> </ul> <h3>8. Complete</h3> <ul> <li>Report: each Acceptance Criterion + its evidence, the tests added, the code-review outcome. Explicitly list <strong>any AC not met</strong> and why (root <code>CLAUDE.md</code> plan discipline).</li> <li>Update artifacts: check the implemented phase checkbox(es) on the issue; update the design doc status.</li> <li>Close out via <code>/complete-subtask</code> (per phase) or <code>/complete-task</code> (whole issue) — these update the project board and parent checkboxes.</li> <li><strong>Never commit</strong> — per project convention the user owns all git commits. Announce "ready for review + commit" and hand off; do not block on it.</li> </ul> <h2>Impediments — when to stop</h2> <p>Develop autonomously, but <strong>STOP and talk to the user</strong> the moment an <em>important impediment</em> arises that compromises completion. Examples:</p> <ul> <li>The design doc is missing, contradicts the issue, or is silent on something load-bearing.</li> <li>An Acceptance Criterion cannot be met as specified.</li> <li>A required dependency, API, or a prior phase the work depends on is missing or broken.</li> <li>Implementation reveals the design itself is wrong or infeasible.</li> <li>The only way forward would violate a <code>claude/rules/</code> correctness invariant or a coding standard, with no clean path.</li> </ul> <p>When this happens: <strong>stop. Do not hack around it.</strong> Clearly state the impediment, the options you see, and your recommendation — then engage the user in conversation to find a solution together. Resume autonomous development once it is resolved.</p> <p>Routine ambiguity (naming, minor structure, small trade-offs) is <strong>not</strong> an impediment — make the reasonable call and continue.</p> </article> </div> <!-- Right: Metadata & Command Sidebar --> <div class="w-full lg:w-80 shrink-0 flex flex-col gap-6" data-astro-cid-7zzsworf> <!-- Install Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-4 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-mono" data-astro-cid-7zzsworf>Install via CLI</span> <div class="flex flex-col gap-2" data-astro-cid-7zzsworf> <div id="detail-install-cmd" class="font-mono text-[11px] p-3 rounded-lg bg-black/40 border border-border select-all break-all text-primary font-bold leading-relaxed" data-astro-cid-7zzsworf> npx skills add https://github.com/nockawa/Typhon --skill implement-feature </div> <button id="detail-copy-btn" class="w-full py-2.5 rounded-lg bg-primary hover:bg-primary-hover text-on-primary font-sans font-bold text-sm shadow transition-all active:scale-95 flex items-center justify-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px]" data-astro-cid-7zzsworf>content_copy</span> <span data-astro-cid-7zzsworf>Copy Command</span> </button> </div> </div> <!-- Details & Stats Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-4 shadow-sm text-on-surface" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>Repository Details</span> <div class="flex flex-col gap-3.5" data-astro-cid-7zzsworf> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>star</span> Stars </span> <span class="font-mono font-bold text-on-surface" data-astro-cid-7zzsworf>224</span> </div> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>call_split</span> Forks </span> <span class="font-mono font-bold text-on-surface" data-astro-cid-7zzsworf>13</span> </div> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>navigation</span> Branch </span> <span class="font-mono bg-surface border border-border px-2 py-0.5 rounded text-[11px] text-on-surface-variant" data-astro-cid-7zzsworf>main</span> </div> <div class="flex justify-between items-start text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5 mt-0.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>article</span> Path </span> <span class="font-mono bg-surface border border-border px-2 py-0.5 rounded text-[11px] text-on-surface-variant truncate max-w-[150px]" title="SKILL.md" data-astro-cid-7zzsworf>SKILL.md</span> </div> </div> </div> <!-- Occupations Tag Card --> <!-- Related Creators Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-3 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>More from Creator</span> <div class="flex items-center gap-2" data-astro-cid-7zzsworf> <img class="w-8 h-8 rounded-full border border-border" src="https://avatars.githubusercontent.com/u/48723305?u=bfe407b62757a154e8b1baa41115ccbf09e15103&v=4" alt="nockawa" onerror="this.src='https://avatars.githubusercontent.com/u/9919?v=4'" data-astro-cid-7zzsworf> <div class="flex flex-col min-w-0" data-astro-cid-7zzsworf> <span class="font-bold text-sm truncate text-on-surface" data-astro-cid-7zzsworf>nockawa</span> <a href="/?creator=nockawa" class="text-xs text-primary hover:underline font-semibold transition-all" data-astro-cid-7zzsworf>Explore all skills →</a> </div> </div> </div> </div> </div> </div> </div> <script> const copyBtn = document.getElementById("detail-copy-btn"); const installCmd = document.getElementById("detail-install-cmd"); if (copyBtn && installCmd) { copyBtn.addEventListener("click", () => { const cmd = installCmd.textContent.trim(); navigator.clipboard.writeText(cmd).then(() => { const originalText = copyBtn.innerHTML; copyBtn.innerHTML = ` <span class="material-symbols-outlined text-[16px]">check</span> <span>Copied!</span> `; copyBtn.style.background = "#10b981"; copyBtn.style.borderColor = "#10b981"; setTimeout(() => { copyBtn.innerHTML = originalText; copyBtn.style.background = ""; copyBtn.style.borderColor = ""; }, 1500); }); }); } </script> </div> <!-- Footer --> <footer class="border-t border-border bg-surface-container-low text-on-surface-variant py-8 px-gutter mt-16 rounded-xl"> <div class="max-w-container-max mx-auto flex flex-col md:flex-row justify-between items-center gap-6"> <div class="flex items-center gap-2"> <div class="w-6 h-6 rounded bg-primary bg-opacity-20 flex items-center justify-center"> <span class="material-symbols-outlined text-primary text-sm">code_blocks</span> </div> <span class="font-bold text-on-surface text-sm">SkillMD</span> </div> <div class="flex flex-wrap justify-center gap-6 text-sm"> <a href="/about" class="hover:text-primary transition-colors">About Us</a> <a href="/contact" class="hover:text-primary transition-colors">Contact Us</a> <a href="/privacy" class="hover:text-primary transition-colors">Privacy Policy</a> <a href="/terms" class="hover:text-primary transition-colors">Terms of Service</a> <a href="/support" class="hover:text-primary transition-colors">Support</a> </div> <div class="text-xs text-on-surface-variant/80"> © 2026 SkillMD. All rights reserved. </div> </div> </footer> </main> <!-- Script for Theme Toggle, Mobile Menu, and Sidebar Filter Redirection --> <script> // Theme setup const savedTheme = localStorage.getItem("theme") || "dark"; function applyTheme(theme) { document.documentElement.classList.remove("dark", "green", "dracula", "nord"); if (theme === "dark") { document.documentElement.classList.add("dark"); } else if (theme === "green") { document.documentElement.classList.add("dark", "green"); } else if (theme === "dracula") { document.documentElement.classList.add("dark", "dracula"); } else if (theme === "nord") { document.documentElement.classList.add("dark", "nord"); } document.documentElement.setAttribute("data-theme", theme); const themeMoon = document.getElementById("theme-moon"); const themeSun = document.getElementById("theme-sun"); const themeLeaf = document.getElementById("theme-leaf"); const themeDracula = document.getElementById("theme-dracula"); const themeNord = document.getElementById("theme-nord"); if (themeMoon && themeSun && themeLeaf && themeDracula && themeNord) { themeMoon.style.display = theme === "dark" ? "inline" : "none"; themeSun.style.display = theme === "light" ? "inline" : "none"; themeLeaf.style.display = theme === "green" ? "inline" : "none"; themeDracula.style.display = theme === "dracula" ? "inline" : "none"; themeNord.style.display = theme === "nord" ? "inline" : "none"; } } applyTheme(savedTheme); const themeToggleBtn = document.getElementById("theme-toggle-btn"); if (themeToggleBtn) { themeToggleBtn.addEventListener("click", () => { const currentTheme = document.documentElement.getAttribute("data-theme") || "dark"; let newTheme = "dark"; if (currentTheme === "dark") { newTheme = "light"; } else if (currentTheme === "light") { newTheme = "green"; } else if (currentTheme === "green") { newTheme = "dracula"; } else if (currentTheme === "dracula") { newTheme = "nord"; } else { newTheme = "dark"; } applyTheme(newTheme); localStorage.setItem("theme", newTheme); }); } // Mobile menu toggle and sidebar logic const mobileMenuToggle = document.getElementById("mobile-menu-toggle"); const sidebarMenu = document.getElementById("sidebar-menu"); const sidebarOverlay = document.getElementById("sidebar-overlay"); function isMobile() { return window.innerWidth < 768; // 768px is the 'md' breakpoint in Tailwind } function openSidebar() { if (sidebarMenu) { sidebarMenu.classList.remove("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.remove("hidden"); } } function closeSidebar() { if (sidebarMenu && isMobile()) { sidebarMenu.classList.add("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } if (mobileMenuToggle && sidebarMenu) { mobileMenuToggle.addEventListener("click", (e) => { e.stopPropagation(); if (isMobile()) { const isClosed = sidebarMenu.classList.contains("-translate-x-full"); if (isClosed) { openSidebar(); } else { closeSidebar(); } } }); document.addEventListener("click", (e) => { if (isMobile()) { if (!sidebarMenu.contains(e.target) && !mobileMenuToggle.contains(e.target)) { closeSidebar(); } } }); if (sidebarOverlay) { sidebarOverlay.addEventListener("click", () => { if (isMobile()) { closeSidebar(); } }); } // Collapse sidebar when clicking a filter button, creator button, or nav item inside it sidebarMenu.addEventListener("click", (e) => { if (isMobile()) { const clickTarget = e.target.closest("button, a"); if (clickTarget) { closeSidebar(); } } }); // Sync sidebar state on window resize window.addEventListener("resize", () => { if (!isMobile()) { // Desktop: sidebar should be visible, no overlay if (sidebarMenu) { sidebarMenu.classList.remove("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } else { // Mobile: start collapsed if (sidebarMenu) { sidebarMenu.classList.add("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } }); } // If not on homepage, redirect on sidebar filter click const isHomepage = window.location.pathname === "/"; document.querySelectorAll("#occupation-filters .filter-btn").forEach(btn => { btn.addEventListener("click", (e) => { const occ = e.currentTarget.getAttribute("data-occupation"); if (!isHomepage) { window.location.href = occ ? `/?occupation=${encodeURIComponent(occ)}` : "/"; } }); }); document.querySelectorAll("#creator-filters .creator-btn").forEach(btn => { btn.addEventListener("click", (e) => { const creator = e.currentTarget.getAttribute("data-creator"); if (!isHomepage) { window.location.href = `/?creator=${encodeURIComponent(creator)}`; } }); }); </script> </body> </html>