schedule-ads
${var} selects the flow. Empty/unset = schedule (launch ads into existing ad sets).
create= create-campaign (provision Meta campaigns + ad sets). Both are config-driven, PAUSED-by-default, and make the AdManage API calls in-run via./secretcurl(the{ADMANAGE_API_KEY}placeholder keeps the key off the command line), behind fail-closed spend guardrails.
Reads a declarative config, computes what to do, and makes the AdManage.ai API calls in-run via ./secretcurl. The calls are an irreversible outbound side-effect (real ad spend), so they are each branch's final actions and run only behind the guardrails below (PAUSED-by-default, dailySpendCap circuit-breaker, dry-run). ADMANAGE_API_KEY is injected in-run via this skill's requires: — always write it as the {ADMANAGE_API_KEY} placeholder, never a bare $ADMANAGE_API_KEY (the Bash permission layer refuses that).
Preamble (both branches)
- Read
memory/MEMORY.mdfor context. Read the last ~3 days ofmemory/logs/for recent launch / provisioning activity — don't re-report a signal already logged. - Parse
${var}:- empty / unset → run the Schedule branch below.
create→ run the Create branch below.- anything else → log
SCHEDULE_ADS_UNKNOWN_SELECTOR: <value>and exit cleanly (no notify).
- Both branches spend real money on ad platforms. The shared safety posture (see each branch) is: PAUSED by default, config-only (never invent campaigns/creative/targeting), dry-run available, and exit silently when there's nothing to do.
Schedule branch (default — empty ${var})
Reads skills/schedule-ads/config.yaml, picks schedule entries matching today, and launches those ads in-run via AdManage.ai (POST /v1/launch through ./secretcurl), behind the spend guardrails below.