AEO Init
Source: github.com/psyduckler/aeo-skills Part of: AEO Skills Suite Output schema: aeo-config-v1
The workspace bootstrapper. One command, one config file, then aeo-baseline knows what to measure.
Requirements
- Python 3.9+
- No API keys (this skill never calls a provider)
- Optional:
pip install jsonschemafor full schema validation at write time
Usage
# Interactive — walks through every field
python3 scripts/init.py
# Flag-driven — best for agent use
python3 scripts/init.py \
--brand Tabiji --domain tabiji.ai \
--alias tabiji \
--competitor tripadvisor.com --competitor lonelyplanet.com \
--prompt "best travel planning tools" \
--prompt "AI travel apps for itineraries" \
--prompt-intent commercial --prompt-intent commercial
# Print the would-be config without writing
python3 scripts/init.py --brand X --domain x.com --prompt "best X" --dry-run
# Overwrite an existing config (safety: refuses unless --force)
python3 scripts/init.py --brand NewName --domain new.com --force
# Custom output path
python3 scripts/init.py --output /path/to/aeo.config.json ...
Interactive mode triggers automatically when neither --brand nor a useful flag combination is provided. Pass --interactive to force it even with flags.
Options
| Option | Description |
|---|---|
--brand |
Brand/company name to track (required for non-interactive mode) |
--domain |
Brand's primary domain (e.g. example.com) |
--alias (repeatable) |
Alternate spellings/abbreviations |
--competitor (repeatable) |
Competitor domains to track |
--prompt (repeatable) |
Prompts to track for visibility |
--prompt-intent (repeatable) |
Intent for each --prompt, paired by position |
--locale |
BCP-47 locale (default: en-US) |
--persona |
Optional persona prefix used by some downstream skills |
--output PATH |
Where to write the config (default: ./aeo.config.json) |
--data-dir PATH |
Where baselines should write evidence files |
--force |
Overwrite an existing config without prompting |
--interactive |
Force interactive prompts even when flags are set |
--dry-run |
Print the config to stdout instead of writing |
What gets written
A JSON file conforming to aeo-config-v1.json. The default skeleton includes:
- One Gemini provider (model
gemini-3-flash-preview, env varGEMINI_API_KEY, grounding enabled) - Sampling: 20 runs default, 5 concurrency, 3 retries per sample
- Limits: $25/day cap, $5 confirm-over threshold, 100 runs per campaign
- Scoring:
aeo-v1methodology - Empty prompts list if none were provided (add later with
--forceor edit the file)
Domain normalization
Competitor and brand domains are normalized before writing:
- Lowercased
https:///http://prefixes stripped- Literal
www.prefix stripped (usingstartswith, not thelstrip('www.')footgun that would corruptworld.com) - Trailing
/stripped
So https://WWW.TripAdvisor.com/ becomes tripadvisor.com.
Prompt IDs
When you pass --prompt "Best CRM for small business", the prompt is auto-assigned prompt_id = "best_crm_for_small_business". IDs are snake_case, deduplicated by truncation to 64 chars. Override by editing the JSON post-hoc.
Validation
After building the config, two validation layers run:
- Built-in: required fields,
api_key_envshape (^[A-Z][A-Z0-9_]*$),prompt_idshape (^[a-z0-9_]+$), intent enum membership. - JSON Schema (if
jsonschemais importable): full structural validation againstaeo-config-v1.json.
If validation fails, the script prints the errors and exits with a non-zero code without writing.
Pairs With
- aeo-baseline — reads the config this skill writes
- aeo-track — schedules
aeo-baselineruns from this config - Future prompt packs (e.g.
aeo-pack-b2b-saas) will populate the prompts array
Notes
- This skill never calls a provider API and never reads secrets.
- The output is editable JSON — re-running with
--forceregenerates; editing in place is also fine. - For a starter prompt list, run the (future)
aeo-prompt-research-freeskill first and feed its suggestions back intoinitvia--promptflags.