[{"data":1,"prerenderedAt":367},["ShallowReactive",2],{"post-\u002Fblog\u002F2026\u002Fteaching-the-ai-mole-github-copilot-skills":3},{"id":4,"title":5,"body":6,"categories":354,"date":357,"description":358,"extension":359,"image":360,"meta":361,"navigation":362,"path":363,"seo":364,"stem":365,"__hash__":366},"blog\u002Fblog\u002F2026\u002Fteaching-the-ai-mole-github-copilot-skills.md","Teaching the AI Mole – GitHub Copilot Skills for Nuxt Blogs",{"type":7,"value":8,"toc":339},"minimark",[9,13,21,29,34,53,56,67,71,80,95,174,181,188,242,246,264,267,271,278,281,292,296,299,302,305,310,313],[10,11,12],"p",{},"Or: How a Mole Stopped Repeating Itself and Started Teaching Its AI Assistant Instead.",[10,14,15,16,20],{},"Moles are creatures of habit. We dig the same tunnels, follow the same paths, and every now and then we bump into the same rock ",[17,18,19],"em",{},"again"," – wondering how we forgot it was there.",[10,22,23,24,28],{},"After migrating this blog from WordPress to Nuxt 4 and spending a few sessions fixing the same class of bugs (hydration mismatches, ",[25,26,27],"code",{},"@nuxt\u002Fcontent"," v3 API changes, a rogue tailwindcss v4 update sneaking in via Renovate), I decided enough was enough. The Mole needed to write things down. Not just for himself – but for his AI assistant, too.",[30,31,33],"h2",{"id":32},"what-are-copilot-skills","What Are Copilot Skills?",[10,35,36,43,44,48,49,52],{},[37,38,42],"a",{"href":39,"rel":40},"https:\u002F\u002Fgithub.com\u002Ffeatures\u002Fcopilot",[41],"nofollow","GitHub Copilot"," supports a concept called ",[45,46,47],"strong",{},"Skills",": small knowledge packages that live in your repo (or in your user profile) as a ",[25,50,51],{},"SKILL.md"," file. When you start a conversation, Copilot reads the skill description and decides whether the knowledge is relevant. If it is, the full skill gets loaded automatically.",[10,54,55],{},"Think of it as a sticky note on the tunnel wall – but one that an AI can actually read.",[10,57,58,59,62,63,66],{},"A skill lives in ",[25,60,61],{},".github\u002Fskills\u002F\u003Cname>\u002FSKILL.md"," for project-scoped knowledge, or in ",[25,64,65],{},"~\u002F.copilot\u002Fskills\u002F\u003Cname>\u002FSKILL.md"," for personal knowledge that travels with you across all projects.",[30,68,70],{"id":69},"what-i-documented","What I Documented",[72,73,75,76,79],"h3",{"id":74},"repo-level-the-repo-maintenance-skill","Repo-Level: the ",[25,77,78],{},"repo-maintenance"," Skill",[10,81,82,83,90,91,94],{},"The project-level skill ",[37,84,87],{"href":85,"rel":86},"https:\u002F\u002Fgithub.com\u002Fthe78mole-blog\u002Fthe78mole-blog.github.io\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Frepo-maintenance\u002FSKILL.md",[41],[25,88,89],{},".github\u002Fskills\u002Frepo-maintenance\u002FSKILL.md"," captures everything a freshly-summoned AI needs to know about ",[17,92,93],{},"this specific blog",":",[96,97,98,109,119,125,131,137,154,168],"ul",{},[99,100,101,104,105,108],"li",{},[45,102,103],{},"Directory structure",": where content lives, what each ",[25,106,107],{},"pages\u002F"," file does",[99,110,111,114,115,118],{},[45,112,113],{},"Environment variables",": which GitHub Vars and Secrets drive the build, and why the StaticForms key is injected by ",[25,116,117],{},"sed"," in CI rather than stored in the repo",[99,120,121,124],{},[45,122,123],{},"CI\u002FCD-Workflow",": trigger conditions, Node version, the PR-preview artifact trick",[99,126,127,130],{},[45,128,129],{},"AdSense-Slot-IDs",": all four slots named and mapped to their positions",[99,132,133,136],{},[45,134,135],{},"Content-Frontmatter-Templates",": copy-paste ready snippets for new blog posts and pages",[99,138,139,142,143,146,147,146,150,153],{},[45,140,141],{},"WordPress-Redirects",": why both ",[25,144,145],{},"routeRules: '\u002Fslug'"," ",[17,148,149],{},"and",[25,151,152],{},"'\u002Fslug\u002F'"," are needed (spoiler: GitHub Pages has no server to normalize trailing slashes)",[99,155,156,159,160,163,164,167],{},[45,157,158],{},"Common errors",": a quick-lookup table of ",[25,161,162],{},"no such column",", ",[25,165,166],{},"queryContent is not defined",", hydration mismatches and their fixes",[99,169,170,173],{},[45,171,172],{},"Pre-commit checklist",": seven things to verify before every push",[72,175,177,178,79],{"id":176},"user-level-the-nuxt-gh-pages-skill","User-Level: the ",[25,179,180],{},"nuxt-gh-pages",[10,182,183,184,187],{},"The personal skill at ",[25,185,186],{},"~\u002F.copilot\u002Fskills\u002Fnuxt-gh-pages\u002FSKILL.md"," distills the broader Nuxt-on-GitHub-Pages experience, independent of any single repo:",[96,189,190,210,217,228,231],{},[99,191,192,193,195,196,199,200,163,203,199,206,209],{},"The full ",[25,194,27],{}," v2 → v3 migration table (",[25,197,198],{},".find()"," → ",[25,201,202],{},".all()",[25,204,205],{},"_path",[25,207,208],{},"path",", etc.)",[99,211,212,213,216],{},"The tailwindcss v3\u002Fv4 conflict trap with ",[25,214,215],{},"@nuxtjs\u002Ftailwindcss"," – and the one-liner to check if it's finally safe to upgrade",[99,218,219,220,223,224,227],{},"The three hydration-mismatch patterns (cookie-based components, dynamic dates, ad slots) and their ",[25,221,222],{},"\u003CClientOnly>"," \u002F ",[25,225,226],{},"isMounted"," fixes",[99,229,230],{},"A GitHub Actions workflow template for new Nuxt SSG projects",[99,232,233,234,237,238,241],{},"A ",[25,235,236],{},"content.config.ts"," template with Zod schemas (the thing that prevents ",[25,239,240],{},"no such column: \"date\""," forever)",[30,243,245],{"id":244},"why-bother","Why Bother?",[10,247,248,249,252,253,256,257,260,261,263],{},"Because the alternative is explaining the same context from scratch in every new chat session. With skills loaded, the AI already knows that ",[25,250,251],{},"tailwindcss"," must stay on ",[25,254,255],{},"^3.x",", that ",[25,258,259],{},"ConsentBanner"," belongs inside ",[25,262,222],{},", and that new Frontmatter fields need a Zod entry before they become queryable.",[10,265,266],{},"Less digging in circles. More actual tunneling.",[30,268,270],{"id":269},"a-note-on-limits","A Note on Limits",[10,272,273,274,277],{},"Skills are not magic. They don't run code, they don't watch your repository for changes, and they don't update themselves. They are ",[17,275,276],{},"documentation"," – the kind that gets read by a language model instead of a human.",[10,279,280],{},"That means: keep them honest. When something changes (a new package version, a new CI step, a fixed bug), update the skill too. A stale skill is just a misleading comment with extra ceremony.",[10,282,283,284,287,288,291],{},"Also: the ",[25,285,286],{},"description"," field is the discovery surface. If the trigger phrases aren't in the description, the skill won't be loaded. Use the ",[17,289,290],{},"\"Use for: ...\""," pattern and be specific.",[30,293,295],{"id":294},"the-bigger-picture","The Bigger Picture",[10,297,298],{},"We tend to think of AI assistants as tools that know everything. In practice, they know a lot in general and very little about your specific project. Skills are the bridge. They let you invest a small amount of upfront writing to avoid a large amount of repeated explaining.",[10,300,301],{},"The Mole has learned: the best tunnel system isn't the one you dig the fastest. It's the one you can navigate in the dark without bumping into the same rock twice.",[303,304],"hr",{},[10,306,307],{},[17,308,309],{},"Both skills are available in this or the skill repository and will be picked up automatically by GitHub Copilot in VS Code when working on this project.",[10,311,312],{},"Links:",[96,314,315,323,332],{},[99,316,317],{},[37,318,320,321],{"href":85,"rel":319},[41],"Repo-Level Skill ",[25,322,78],{},[99,324,325],{},[37,326,329,330],{"href":327,"rel":328},"https:\u002F\u002Fgithub.com\u002Fthe78mole\u002Fskills\u002Ftree\u002Fmain\u002Fskills\u002Fnuxt-gh-pages",[41],"User-Level Skill ",[25,331,180],{},[99,333,334],{},[37,335,338],{"href":336,"rel":337},"https:\u002F\u002Fgithub.com\u002Fthe78mole\u002Fskills",[41],"All my user level Skills",{"title":340,"searchDepth":341,"depth":341,"links":342},"",2,[343,344,351,352,353],{"id":32,"depth":341,"text":33},{"id":69,"depth":341,"text":70,"children":345},[346,349],{"id":74,"depth":347,"text":348},3,"Repo-Level: the repo-maintenance Skill",{"id":176,"depth":347,"text":350},"User-Level: the nuxt-gh-pages Skill",{"id":244,"depth":341,"text":245},{"id":269,"depth":341,"text":270},{"id":294,"depth":341,"text":295},[355,356],"Dev","AI","2026-04-27","How I taught GitHub Copilot everything it needs to know about managing a Nuxt-based GitHub Pages blog – using Copilot Skills.","md","\u002Fimages\u002Fblog\u002F2026\u002F04\u002Fmole-skill.jpeg",{},true,"\u002Fblog\u002F2026\u002Fteaching-the-ai-mole-github-copilot-skills",{"title":5,"description":358},"blog\u002F2026\u002Fteaching-the-ai-mole-github-copilot-skills","qf4sjpgV7t2Sf-aiVmCGtU6OjtegqTuhVTtsqrD2zPM",1777305254088]