Outreach Profile
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
new or approves replacing a specific file.
- Read references/profile-contract.md before creating a profile.
Instructions
- Parse the operation as
list, show NAME, or new NAME. Default to list only when the user
omitted an operation.
- For
list, Glob ./profiles/*.json and ~/.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 .json filename, 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-empty
output.formats, and non-empty delivery.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-outreach only after the user selects a profile and confirms the campaign scope.
1---2name: outreach-profile3description: List, inspect, or scaffold a local Intent Outreach Report Profile JSON file. Use when a user wants to manage repeatable campaign settings while preserving existing files. Trigger with "/outreach-profile", "show my outreach profile", or "create an outreach profile".4license: SEE LICENSE IN LICENSE5---67# Outreach Profile89## Purpose1011Manage local JSON configuration files validated by `ReportProfileSchema`. A report profile records campaign12preferences, but only a documented subset is automatically mapped into `RunCampaignInput`; this skill13must not imply that every accepted field is currently executed.1415## Prerequisites1617- Read access for `./profiles/` and, when requested, `~/.intent-outreach/profiles/`.18- Write access only when the user explicitly requests `new` or approves replacing a specific file.19- Read [references/profile-contract.md](references/profile-contract.md) before creating a profile.2021## Instructions22231. Parse the operation as `list`, `show NAME`, or `new NAME`. Default to `list` only when the user24 omitted an operation.252. For `list`, Glob `./profiles/*.json` and `~/.intent-outreach/profiles/*.json`. Return each file's26 basename and full location; do not expose unrelated files.273. For `show`, resolve an exact JSON filename from those two roots, Read it, and summarize its fields.28 Label every field as **runtime-mapped**, **renderer-consumed**, or **schema-only** according to the29 profile contract.304. For `new`, normalize the requested name to a `.json` filename, reject traversal and absolute paths,31 then use AskUserQuestion for the required fields and desired optional knobs. Default to32 `./profiles/NAME.json`; use the user-global root only when requested.335. Before writing, Glob or Read the exact destination. If it exists, stop and obtain explicit overwrite34 approval. Otherwise Write one valid JSON object with `name`, `description`, non-empty35 `output.formats`, and non-empty `delivery.targets`.366. Read the completed file back, verify its JSON shape against the contract, and report its path plus37 the runtime status of every selected knob.3839## File and execution boundaries4041- Write only beneath `./profiles/` or `~/.intent-outreach/profiles/`.42- Never overwrite a starter or user profile silently.43- Never include API keys, tokens, contact records, or message bodies in a profile.44- Profile loading validates structure. It does not itself run connectors, render files, deliver output,45 or send messages.4647## Output4849- `list`: profile names and locations.50- `show`: a field summary with runtime-mapped/renderer-consumed/schema-only labels.51- `new`: the written path, selected knobs, and a warning for any schema-only setting.5253## Error handling5455- **No profiles found:** return an empty result and offer `new`; do not create a file automatically.56- **Ambiguous name:** show all matches and require the user to select one.57- **Invalid JSON or missing required field:** report the exact field and leave the file unchanged.58- **Existing destination:** stop before Write until the user explicitly approves replacement.59- **Unsafe name/path:** reject it and request a simple filename.6061## Examples6263> **User:** `/outreach-profile new founder-email`6465Ask for a description, output formats, delivery targets, channel, threshold, and drafting constraints;66write `profiles/founder-email.json` only if absent; then report which settings the runtime currently maps.6768- **Example: list profiles.** Search only the project and user-global profile roots, then report distinct69 locations for duplicate basenames.70- **Example: inspect a starter.** Read its JSON and label connector-selection and delivery fields71 schema-only rather than promising execution.72- **Example: existing destination.** Stop before Write, show the exact path, and wait for explicit73 replacement approval.7475For troubleshooting invalid JSON, identify the parse location or missing required field and recommend a76minimal correction. Do not rewrite an existing file unless the user authorized that exact destination.7778## Resources7980- Read [Profile schema and runtime mapping](references/profile-contract.md) before writing or describing81 any profile field.82- Use `intent-outreach` only after the user selects a profile and confirms the campaign scope.