# Outreach Profile

> 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".

- Skill: `jeremylongshore/outreach-profile` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add jeremylongshore/outreach-profile`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jeremylongshore/outreach-profile/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- License: SEE LICENSE IN LICENSE
- Author: jeremylongshore (https://skillmd.com/u/jeremylongshore)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/jeremylongshore/outreach-profile

---


# 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](references/profile-contract.md) before creating a profile.

## Instructions

1. Parse the operation as `list`, `show NAME`, or `new NAME`. Default to `list` only when the user
   omitted an operation.
2. For `list`, Glob `./profiles/*.json` and `~/.intent-outreach/profiles/*.json`. Return each file's
   basename and full location; do not expose unrelated files.
3. 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.
4. 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.
5. 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`.
6. 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](references/profile-contract.md) before writing or describing
  any profile field.
- Use `intent-outreach` only after the user selects a profile and confirms the campaign scope.

