source/skills/init/SKILL.md
Scan the current codebase to identify and categorize every public-facing page (landing pages, product/feature pages, solutions, pricing, resources, blogs, case studies, about, legal) and produce a single authoritative inventory document. Use this skill whenever the user asks to "init overgrow", "set up overgrow", "scan the site", "inventory the pages", "categorize pages", "map the site", or whenever any other overgrow skill needs a baseline page map and none exists yet. Output is a structured markdown inventory at `.overgrow/inventory.md` that all other overgrow skills read from.
npx skillsauth add zhizdev/overgrow initInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill builds the foundation document that every other overgrow skill depends on: a complete, categorized inventory of the site's public-facing pages and the core product/value offering behind them.
If the user provided a path via $ARGUMENTS, treat that as the site root. Otherwise scan from the current working directory. Also check {{config_file}} for any project conventions. If product details cannot be inferred from the code, {{ask_instruction}}
Before scanning, read from the plugin's knowledge/ directory to calibrate what "good" looks like:
knowledge/geo.md — SEO + GEO master reference. Use it to frame what signals are worth inventorying.knowledge/pages.md — H-tag structure and AI-overview formatting rules. Informs the H1 / meta capture fields below.These files ship with the plugin. If not reachable, fall back to this SKILL.md and continue.
A single file at .overgrow/inventory.md with these sections:
.tsx, .astro, .svelte, .mdx, .md, or a CMS migration note.Other overgrow skills (audit, spawn-pages, spawn-blogs, spawn-internal-links, sitemap) read this file to avoid duplicating work.
Codebases differ. Work through this detection order and stop once you have reliable coverage:
next.config.*, astro.config.*, nuxt.config.*, svelte.config.*, gatsby-config.*, _config.yml (Jekyll), hugo.toml, package.json dependencies.app/**/page.{tsx,jsx,ts,js,md,mdx}pages/**/*.{tsx,jsx,ts,js,md,mdx} excluding _*, api/**src/pages/**, src/routes/**/+page.*pages/**content/**/*.md(x), posts/**/*.md, blog/**/*.md, _posts/**public/sitemap.xml, static/sitemap.xml, sitemap.xml.ts, sitemap.config.* often list canonical URLs.title, description, date, tags, category, draft.For each page discovered, extract:
/)<title>, current meta descriptionClassify every page into exactly one primary category:
homepage — the root landing pageproduct — product overview or main product landingfeature — feature detail page (one feature per page)solution — use-case or industry pagepricing — pricing / planscomparison — vs-competitor pages, alternatives pagesresource-hub — blog index, resource center, guides indexblog-post — individual blog articlecase-study — customer storyguide — long-form tutorial or pillar guidedocs — technical documentationabout — about / team / companylegal — privacy, terms, security, complianceutility — 404, search, sitemap page, login, signup (note but exclude from SEO scope)Derive the product summary from, in order of authority:
<title> and meta description of the homepage.README.md, package.json description.If two of these conflict, prefer the homepage hero (it's the one the site is actually shipping). Flag the conflict in the inventory.
Pillars are the 3-7 topic clusters the site should rank for. Derive them by clustering existing pages and blog posts by topic, then naming the cluster. A healthy pillar has:
If the site has <3 blog posts per pillar, flag it under "Content gaps" — spawn-blogs will use this to plan query-fanout expansion.
Write (or overwrite) .overgrow/inventory.md using exactly this structure:
# Overgrow Inventory
_Generated: <YYYY-MM-DD>_
_Site root: <absolute path>_
_Framework: <detected framework + version>_
## Product
- **Name:** <product name>
- **One-liner:** <value prop in one sentence>
- **Primary audience:** <who>
- **Secondary audiences:** <who, if any>
- **Verticals / industries:** <list>
- **Key differentiators:** <3-5 bullets>
- **Source of truth:** <homepage hero | README | about page | mix — note conflicts>
## Routing
- **Framework:** <name>
- **Page roots:** <paths>
- **Content roots:** <paths for MDX/markdown if any>
- **Sitemap location:** <path or "none found">
- **i18n:** <none | locales list>
- **CMS:** <none | name — how content is fetched>
## Authoring conventions
Read 2-3 representative existing pages (one landing page and one blog post if both exist) and record:
- **Landing / product pages**
- **File extension:** <.tsx | .jsx | .astro | .svelte | .vue | .mdx | .md>
- **Layout wrapper:** <import path, or "none" — e.g. `import Layout from '@/components/Layout'` | `<Layout>` in Astro | `+layout.svelte` | root layout in Next.js App Router>
- **Metadata pattern:** <Next.js `export const metadata` | Next.js `<Head>` | SvelteKit `<svelte:head>` | Astro frontmatter + `<SEO>` | markdown frontmatter | CMS field>
- **Styling:** <Tailwind | CSS modules | styled-components | vanilla CSS | UnoCSS | etc.>
- **Reusable section components found:** <e.g. `<Hero />`, `<FeatureGrid />`, `<CTA />`, `<FAQ />` — with source paths, or "none">
- **Example page to mirror:** <source path of a good representative page>
- **Blog posts**
- **File extension:** <.md | .mdx | .tsx | CMS>
- **Frontmatter shape:** <exact keys and order from an existing post, e.g. `title, description, date, author, tags, draft`>
- **Content source:** <filesystem | Contentful | Sanity | Payload | WordPress | Strapi | etc.>
- **Example post to mirror:** <source path>
- **Placeholder idiom to use in new files:** <`{/* placeholder: ... */}` for JSX | `<!-- placeholder: ... -->` for markdown/Astro/Svelte template regions>
If the site has no existing blog posts or no existing landing pages, mark that sub-block as "none yet — spawn skills should match the other authoring branch."
## Page inventory
### Homepage
| Route | Source | H1 | Title | Meta description | Purpose |
|---|---|---|---|---|---|
### Product / Features
### Solutions
### Pricing
### Comparison
### Resource hub
### Blog posts
### Case studies
### Guides
### Docs
### About
### Legal
### Utility (excluded from SEO scope)
(Include only the categories that have at least one page. Within each table, one row per page. Use `—` for missing data.)
## Semantic pillars
1. **<Pillar name>** — <one-line scope>. Hub: <route or "missing">. Supporting: <count> pages/posts.
2. ...
## Content gaps
- <Missing page type or thin pillar — one bullet each>
## Notes
<Anything surprising: duplicate routes, pages with no meta description, mismatched H1s, stale dates, broken internal links noticed during scan, CMS-driven content not fully enumerated, etc.>
.overgrow/inventory.md if it exists — ask the user whether to refresh or append before overwriting._* helper files.Authoring conventions section. Create the .overgrow/ directory if missing.spawn-pages / spawn-blogs / humanize).audit).spawn-internal-links).tools
Pull the open Bonemeal action queue (landing pages and blog posts the user has not built yet) via the bonemeal MCP server, let the user pick which ones to build, dispatch each to the spawn-pages or spawn-blogs skill with the action's brief, and mark each completed in Bonemeal once the file is written. Use this whenever the user says "grow", "/grow", "build my Bonemeal queue", "what's in my Bonemeal queue", "build the suggested pages", or wants to act on Bonemeal's content suggestions. Stop and ask the user before marking actions complete the first time, then remember their preference.
development
Given the product offering and existing page inventory, create new core landing and resource pages (homepage refresh, features, solutions, pricing, comparison, resource hubs, about) that capture core product intent using the query-fanout pattern. Use this skill whenever the user asks to "spawn pages", "generate landing pages", "create marketing pages", "build a pricing page", "add a solutions page", "build out the site", "fill in missing pages", or wants new top-level marketing/product pages. Output is one new page per route in the project's native file format (component or markdown), matching the existing page style and framework idiom.
development
Examine every existing page on the site, build a semantic map across pillars, and add missing internal links so the site becomes a semantic graph anchored on clear topical pillars. Use this skill whenever the user asks to "add internal links", "build internal linking", "build a semantic graph", "link related pages", "strengthen topical authority", "fix orphan pages", "add pillar linking", or wants hub-and-spoke linking between pillars, hubs, and supporting content. Output is an edit list (proposed link insertions) plus optionally direct edits to page source files.
development
Given the product and the existing page inventory, identify missing blog topics and generate new blog posts that capture search/AI intent using the query-fanout pattern. Use this skill whenever the user asks to "spawn blogs", "generate blog posts", "expand the blog", "build out a content cluster", "write blog ideas", "cover more search intents", "query fanout for blogs", or wants new long-form content that supports existing pillars. Output is one new post per topic in the project's existing post format (markdown, MDX, component, or CMS migration note), with frontmatter shape mirrored from an existing post.