Purpose
Manage local JSON configuration files validated by ReportProfileSchema. A report profile records campaign
preferences, but only a documented subset is automatically mapped into RunCampaignInput; this skill
must not imply that every accepted field is currently executed.
Prerequisites
- Read access for
./profiles/and, when requested,~/.intent-outreach/profiles/. - Write access only when the user explicitly requests
newor approves replacing a specific file. - Read references/profile-contract.md before creating a profile.
Instructions
- Parse the operation as
list,show NAME, ornew NAME. Default tolistonly when the user omitted an operation. - For
list, Glob./profiles/*.jsonand~/.intent-outreach/profiles/*.json. Return each file's basename and full location; do not expose unrelated files. - For
show, resolve an exact JSON filename from those two roots, Read it, and summarize its fields. Label every field as runtime-mapped, renderer-consumed, or schema-only according to the profile contract. - For
new, normalize the requested name to a.jsonfilename, reject traversal and absolute paths, then use AskUserQuestion for the required fields and desired optional knobs. Default to./profiles/NAME.json; use the user-global root only when requested. - Before writing, Glob or Read the exact destination. If it exists, stop and obtain explicit overwrite
approval. Otherwise Write one valid JSON object with
name,description, non-emptyoutput.formats, and non-emptydelivery.targets. - Read the completed file back, verify its JSON shape against the contract, and report its path plus the runtime status of every selected knob.
File and execution boundaries
- Write only beneath
./profiles/or~/.intent-outreach/profiles/. - Never overwrite a starter or user profile silently.
- Never include API keys, tokens, contact records, or message bodies in a profile.
- Profile loading validates structure. It does not itself run connectors, render files, deliver output, or send messages.
Output
list: profile names and locations.show: a field summary with runtime-mapped/renderer-consumed/schema-only labels.new: the written path, selected knobs, and a warning for any schema-only setting.
Error handling
- No profiles found: return an empty result and offer
new; do not create a file automatically. - Ambiguous name: show all matches and require the user to select one.
- Invalid JSON or missing required field: report the exact field and leave the file unchanged.
- Existing destination: stop before Write until the user explicitly approves replacement.
- Unsafe name/path: reject it and request a simple filename.
Examples
User:
/outreach-profile new founder-email
Ask for a description, output formats, delivery targets, channel, threshold, and drafting constraints;
write profiles/founder-email.json only if absent; then report which settings the runtime currently maps.
- Example: list profiles. Search only the project and user-global profile roots, then report distinct locations for duplicate basenames.
- Example: inspect a starter. Read its JSON and label connector-selection and delivery fields schema-only rather than promising execution.
- Example: existing destination. Stop before Write, show the exact path, and wait for explicit replacement approval.
For troubleshooting invalid JSON, identify the parse location or missing required field and recommend a minimal correction. Do not rewrite an existing file unless the user authorized that exact destination.
Resources
- Read Profile schema and runtime mapping before writing or describing any profile field.
- Use
intent-outreachonly after the user selects a profile and confirms the campaign scope.