Thanks for your interest in contributing! Here's how to get involved.
Open a GitHub Issue with:
- Your OS and Python version
- The full error output (copy from terminal)
- The command or step that failed
- The ad platform and account context (if applicable)
Use GitHub Discussions for feature ideas and questions.
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Make your changes
- Test with a sample ad account before submitting
- Submit a PR with a clear description of what changed and why
git clone https://github.com/YOUR_USERNAME/claude-ads.git
cd claude-ads
bash install.sh- All Python scripts should output JSON for Claude Code to parse
- Shell scripts should use
set -euo pipefailfor safety - SKILL.md files must stay under 500 lines / 5000 tokens
- Reference files (
ads/references/*.md) should be focused and under 200 lines - Follow kebab-case naming for all directories and files
- Keep dependencies minimal — prefer stdlib over third-party where possible
Sub-skills live under skills/ads-<name>/ and follow a strict structure. To add one:
- Pick a name. Kebab-case, prefixed with
ads-. Example:ads-amazon,ads-attribution. - Mirror an existing sub-skill as a template —
skills/ads-microsoft/is a clean, simple example;skills/ads-google/is the densest. - Required frontmatter in
skills/ads-<name>/SKILL.md:The--- name: ads-<name> description: "<Functional summary of what the skill does>. Use when user says <trigger1>, <trigger2>, ..., or <triggerN>." user-invokable: false tested_date: YYYY-MM-DD tested_with: claude-code v2.x ---
user-invokable: falseflag means the skill is dispatched by theadsorchestrator, not invoked directly via/ads-<name>. - Trigger discipline. The
description:field is what the LLM uses to route. Include 6–12 trigger synonyms (platform name, colloquial phrasings, abbreviations, feature names). - Update the orchestrator. Add a row to the routing table in
ads/SKILL.mdand update the routing logic if needed. - Add a reference file if your skill needs domain knowledge — see "Adding a Reference File" below.
- Test it by invoking the orchestrator with one of your trigger phrases — confirm your sub-skill loads.
Reference files in ads/references/ are loaded on-demand by sub-skills (progressive disclosure). Use them for:
- Audit checklists (e.g.,
google-audit.md) - Creative specs per platform (e.g.,
meta-creative-specs.md) - Decision trees, benchmarks, compliance tables
Guidelines:
- Keep each file under 200 lines so it fits in the dispatching agent's context.
- Add a dated header comment:
<!-- Updated: YYYY-MM-DD | v<x.y> -->. - Cite sources inline where possible (
<!-- Sources: WordStream 2025 (annual report), Triple Whale 2025 e-commerce -->). - For audit checklists, follow the existing ID convention: platform-letter + number (G01, M01, L01, T01, B01, A01).
Until the Wave 2 eval harness lands, regression testing is manual:
- The
evals/creative-evals.jsonfile contains routing snapshots (which trigger phrase loads which sub-skill). - Validate your sub-skill loads correctly on its triggers by running the orchestrator and checking the dispatched skill name.
- For new audit checks, add a synthetic example account export (anonymized) to a fixture directory and verify the check fires correctly with
pass/warning/failoutputs. - When the
tests/directory lands in Wave 2, all new checks will be expected to have a corresponding fixture + golden output. Plan ahead by structuring checks with deterministic pass/warn/fail conditions.
Open a GitHub Issue using the bug-report template. Include OS + Python version, the full error output, the command that failed, and the platform context.
Use GitHub Discussions for feature ideas. For larger proposals (new platforms, new sub-skills), open a feature-request issue first to align on scope.
For security issues, do not open a public issue. Use the private GitHub Security Advisory channel. See SECURITY.md.