This is the skill you reach for when you need to build something from scratch, whether it's a scheduled task, a dashboard, or a web app. It enforces a three-phase workflow: design with explicit user confirmation before writing any code, incremental building with verification at every step, and systematic debugging. Projects are scaffolded in a standard layout under output/projects/ from day one, making them immediately shareable via community-publish without later migration. The methodology emphasizes cost transparency for API calls through sc-proxy, especially LLM usage where high-end models can run 100x more expensive than budget ones. It's opinionated about verification, requiring you to run and check output after each piece rather than writing hundreds of lines blind.
npx -y skills add starchild-ai-agent/official-skills --skill project-builder --agent claude-codeInstalls into .claude/skills of the current project.
⚠️ CRITICAL — UI Design Quality Gate: If the project produces ANY visual HTML output (dashboard, web app, landing page, portfolio, any page the user will see), you MUST read_file the ui-design skill's SKILL.md and follow it BEFORE writing any HTML/CSS. This is not optional. project-builder handles engineering; ui-design handles visual quality (and tells you when to reach for a component library like shadcn/ui, HeroUI, or coss ui instead of hand-writing). Skipping ui-design produces generic AI slop.
A. Pick the skills. Gather every data source the project needs. For each one, prefer a skill: check <available_skills>, and if nothing fits, try search_skills(query) for official + marketplace coverage. Skills are the most reliable layer — they ship tested clients, auth, and rate-limit handling. Web search is a last resort. Only write raw HTTP / SDK code when no skill can cover the source.
B. Read the platform rules for what the project touches. These rules live in references (not in your system prompt) so you must read_file them before writing code. Skipping this is the #1 cause of 401s, broken paths, and "worked locally, fails in preview" bugs.
| If the project includes... | read_file before Phase 2 |
|---|---|
| Any external API call | config/context/references/sc-proxy.md |
| Preview / dashboard / web app | config/context/references/preview-guide.md |
| Scheduled task | config/context/references/scheduled-tasks-guide.md |
| Long-running background job | config/context/references/background-tasks.md |
| File writing >300 lines | config/context/references/tool-writing-guide.md |
| Any visual HTML output (dashboard, web app, landing page, portfolio) | ui-design skill SKILL.md — load it and follow it for all visual decisions (track choice, color, typography, layout, animation, and when to use a component library). This skill is the UI quality gate; skipping it produces generic AI slop. |
Translate vague requests into concrete specs. If intent is ambiguous, ask ONE question.
Architecture decision tree:
Periodic alerts/reports? → Scheduled Task
Live visual interface? → Preview Server (dashboard)
One-time analysis? → Inline (no build needed)
Reusable tool? → Script in workspace
For medium+ projects, present to user BEFORE writing code:
UI Design Gate (required, blocking — for visual projects): If the architecture choice is Preview Server or any project that outputs HTML the user will see:
read_file the ui-design skill's SKILL.md now (if you haven't already in this session) and pick a track (hand-built vs component library).references/design-process.md) to determine Surface, Accent, Typography, and Aesthetic Family.Design Gate (required, blocking): After Phase 1, STOP and present a short phase plan (milestones for DESIGN/BUILD/DEBUG). Ask explicitly: "Approve this plan and proceed to Phase 2 BUILD?" Match the user's language when phrasing the question — never inject a hardcoded non-English string.
After design is confirmed, before writing any code, scaffold the project under the standard layout. This makes the project shareable via community-publish skill from day one — no migration later.
Standard project location: output/projects/{slug}/
output/projects/{slug}/
├── project.yaml # name, version (start 0.1.0), type, description, license, entry, env_required
├── PROJECT.md # 4 required sections: What / Required env / How to start / Outputs / Troubleshooting
├── .env.example # every env var the code reads, with placeholder values
├── .gitignore # at minimum: .env, *.key, *.pem, __pycache__, node_modules
└── src/ # all code lives here, NOT scattered
├── run.py # type=task — first line MUST be: # -*- task-system: v3 -*-
├── server.py # type=service
├── main.py # type=script
└── index.html / app.py + frontend # type=preview
Project type → entry mapping:
| Architecture choice | type | entry path |
|---|---|---|
| Scheduled Task | task | src/run.py |
| Preview Server | preview | src/index.html (static) or src/app.py |
| Background daemon | service | src/server.py |
| One-shot tool | script | src/main.py |
Skip scaffold only when:
output/projects/... project (keep its layout)During Phase 2 BUILD, maintain the scaffold:
.env.example in same editsrc/ (configs, fixtures: project root or src/data/)Why this matters: Projects already in standard layout publish in one command. Projects scattered across tasks/, output/scripts/, dashboards/, etc. need tidy_project() migration before they can be shared, and the user often doesn't want to rebuild PROJECT.md from memory.
For existing scattered code: call community-publish skill → tidy_project(any_dir) to reorganize before publishing.
API cost & rate limits:
All external API calls go through sc-proxy, which bills per request and enforces rate limits.
Before designing, read config/context/references/sc-proxy.md for pricing table and limits.
credits_per_request × requests_per_run × runs_per_day × 30coin_price with multiple ids vs N separate calls)model_price_per_call × expected_calls_per_run × runs_per_day × 30) instead of using a single generic number.SC-CALLER-ID (e.g. job:{JOB_ID}, preview:{preview_id}, chat:{thread_id}) so usage can be traced and capped. Details in config/context/references/sc-proxy.md § Caller Credit LimitData reliability: Native tools > proxied APIs > direct requests > web scraping > LLM numbers (never). Iron rule: Scripts fetch data. LLMs analyze text. Final output = script variables + LLM prose.
Task scripts can import skill functions directly:
from core.skill_tools import coingecko, coinglass # auto-discovers skills/*/exports.py
prices = coingecko.coin_price(coin_ids=["bitcoin"], timestamps=["now"])
Tool names = SKILL.md frontmatter tools: list. See build-patterns.md § Using Skill Functions.
Every piece follows this cycle:
Build one small piece → Run it → Verify output → ✅ Next piece / ❌ Fix first
| Built | Verify how | Pass |
|---|---|---|
| Data fetcher | Run, print raw response | Non-empty, recent, plausible |
| API endpoint | curl localhost:{port}/api/... | Correct JSON |
| HTML page | preview_serve + preview_check | ok = true |
| Task script | python3 tasks/{id}/run.py | Numbers match source |
| LLM analysis | Numbers from script vars, not LLM text | Template pattern used |
Verification layering:
Anti-patterns:
→ Detailed patterns: read references/build-patterns.md
read_file before edit_file — understand what's thereedit_file > write_file for modificationsls before write_file — avoid duplicating existing filesos.environ["KEY"], persist installs to setup.shtype=preview)Decide sensible defaults yourself and render real data on first load. Treat filters as optional refinements users can adjust later — never as prerequisites that gate the initial view. Auto-refresh on a sensible interval. No "Click to load" / "Enter address" / "Select symbol" before anything appears.
Visual design quality (MANDATORY for all HTML output): If the ui-design skill is installed, you MUST read_file its SKILL.md and follow it before writing any HTML/CSS. project-builder owns the engineering workflow; ui-design owns the visual quality. Using project-builder alone produces functional but visually generic output.
./path not /path)8765), write it directly into the app, and pass the same number to preview(action="serve", port=...). The two must match exactly.dir, the newer one auto-kills the older one (same-dir replacement rule). When iterating, reuse the same id rather than inventing variants, or use distinct dirs.config/context/references/preview-guide.mdconfig/context/references/localhost-api.md
references/build-patterns.md):
config/context/references/sc-proxy.mdCHECK LOGS → REPRODUCE → ISOLATE → DIAGNOSE → FIX → VERIFY → REGRESS
Three-Strike Rule: Same approach fails twice → STOP → rethink → explain to user → different approach.
→ Full debug procedures: read references/debug-handbook.md
Kickoff: ☐ Clarified intent ☐ Proposed architecture ☐ Estimated cost ☐ User confirmed (required before Phase 2)
Build: ☐ Each component tested ☐ Numbers match source ☐ Errors handled ☐ Preview healthy (web)
Debug: ☐ Logs checked ☐ Reproduced (or skipped — logs sufficient) ☐ Isolated layer ☐ Root cause found ☐ Fix verified ☐ Regressions checked
sickn33/antigravity-awesome-skills
moizibnyousaf/ai-agent-skills
github/awesome-copilot