source/skills/grow/SKILL.md
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.
npx skillsauth add zhizdev/overgrow growInstall 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 is the integration point between the Bonemeal MCP server and the rest of overgrow. It surfaces the open action queue from the user's Bonemeal project, lets them pick what to build, dispatches each item to the existing spawn-pages or spawn-blogs skill with the action's brief as input, then marks each one completed back on Bonemeal — attributing the completion to "Overgrow" in the Bonemeal UI.
mcp__overgrow__list_projects is unavailable, tell them to run /mcp and authenticate the overgrow server, then re-invoke this skill.State is split into project-scoped (committed to git, shared across collaborators) and developer-scoped (per-machine).
.overgrow/bonemeal.json (in repo root, committed)
{
"project_id": "<uuid>",
"project_name": "<for log lines>"
}
Identifies which Bonemeal project this repo represents. Same answer for every developer who clones the repo, so it belongs in version control.
~/.config/overgrow/preferences.json (per-developer, never committed)
{
"auto_complete": true | false | null
}
Each developer's personal answer to "should /grow auto-mark actions complete in Bonemeal?". null until they answer, then true ("always") or false ("ask each time").
If $XDG_CONFIG_HOME is set, prefer $XDG_CONFIG_HOME/overgrow/preferences.json over ~/.config/.... If running on a system without ~/.config/ (e.g. some Windows setups), fall back to a sensible per-user location and tell the user where you wrote it.
Create either file (and parent directories) on first read if missing. Treat unreadable / malformed JSON as "uninitialized" — re-prompt the user for what's needed and rewrite cleanly.
Read .overgrow/bonemeal.json. If project_id is null/missing:
mcp__overgrow__list_projects (no arguments).name, workspace.name, id, and call AskUserQuestion to ask which one this repo represents.project_id and project_name to .overgrow/bonemeal.json.If project_id is set, skip the resolve step. (User can edit the file by hand to relink.)
Call mcp__overgrow__get_project_actions with:
project: <state.project_id>status: "proposed" (default — the open queue)action_type: filter based on $ARGUMENTS:
"landing" → landing_page"blogs" → blog_postlanding_page, once with blog_post, merge results.limit: 50 (generous; the daily generator caps lower than this anyway).If the queue is empty, tell the user "Your Bonemeal queue is clear — no proposed landing pages or blog posts." and stop.
Render a numbered list grouped by action_type. Each row: [N] [type icon] {title} — {opportunity_overview}.
opportunity_overview is markdown with bold on the hook; render as-is.
Then call AskUserQuestion asking which to build. Accept these reply forms:
all — build everything in the list.1, 3, 5 — comma-separated numbers (or ranges like 1-3).landing / blogs — only that type from the list.skip / cancel — exit without building.Process the selected actions in order. For each:
action_type === "landing_page")The action's metadata is shaped:
{
"target_keywords": ["..."],
"gap_prompts": ["..."],
"competing_domains": ["..."]
}
Invoke the spawn-pages skill with a brief built from:
title (the action title; this is the page intent)description and opportunity_overview (rationale and 1-line hook)metadata.target_keywords (primary + secondary keywords)metadata.gap_prompts (the AI-search prompts the page must answer; pass these into spawn-pages's query-fanout step instead of generating new ones)metadata.competing_domains (sites currently winning the keyword; reference for differentiation)Phrase the dispatch as a natural-language sub-task to spawn-pages so it triggers the existing skill machinery — don't try to call it as a tool.
action_type === "blog_post")The action's metadata is shaped:
{
"topic": "...",
"target_keywords": ["..."],
"gap_prompts": ["..."],
"competing_content_urls": ["..."]
}
Invoke the spawn-blogs skill with a brief built from:
title (post title)description and opportunity_overviewmetadata.topic (the pillar / cluster anchor)metadata.target_keywordsmetadata.gap_prompts (sub-intents to cover)metadata.competing_content_urls (for the "what to do differently" pass)Same dispatch style as 4a.
After each successful build (file written and saved):
Compute the relative URL of the created page. Examples:
app/foo/page.tsx → /fooapp/blog/(post)/foo/page.mdx → /blog/foocontent/blog/foo.md → /blog/fooIf the routing convention is ambiguous (custom framework), use the file path the user can git diff to find it; better than no URL.
Determine whether to confirm. Read auto_complete from the per-developer
preferences file (~/.config/overgrow/preferences.json or $XDG_CONFIG_HOME/overgrow/preferences.json):
auto_complete === true, skip the prompt.auto_complete === false, prompt once per action: "Mark {title} complete in Bonemeal? [y/n]".auto_complete is null/missing, prompt once with three options via AskUserQuestion: Yes, No, Always (don't ask again).
Always, write auto_complete: true to the preferences file before calling.Yes, leave auto_complete unset for this run, but ask again next run (current-run yeses don't change the persistent setting).No, leave auto_complete unset and skip the call for this action.If confirmed, call mcp__overgrow__mark_action_complete:
action_id: <action.id>output_url: <relative URL from step 1> (omit if the URL really can't be derived)If the call returns isError, log the message but continue to the next action — Bonemeal-side failures shouldn't block the local build queue.
Print:
Built X / Y selected actions.✓ {title} → {output_url} (and · marked complete in Bonemeal if applicable)✗ {title} — {short reason}Z proposed actions still in your queue. Re-run /grow to refresh./mcp. Don't try to skip and rebuild blindly.proposed state so it shows up next run.isError: true; treat as a benign skip.preferences.json doesn't invalidate the project link, and vice versa.$ARGUMENTS is landing or blogs, pass through to the action_type filter and skip the other type entirely.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.
development
Audit an existing sitemap.xml / robots.txt or generate new ones following sitemaps.org protocol and Google Search Central guidance, with a growth-first default that allows every crawler including AI search and AI training bots. Use this skill whenever the user asks to "build a sitemap", "generate sitemap.xml", "audit the sitemap", "refresh sitemap", "write robots.txt", "check robots", "allow AI crawlers", "block AI crawlers", "fix crawl budget", "submit to Google", or any other discovery / indexing configuration task. Output is a valid sitemap.xml (or sitemap index) and/or robots.txt, plus a written audit when auditing.