Agent skill
generate
Generate GTM content (emails, LinkedIn messages, call prep) using saved agents, Octave AI, or Claude direct — your choice.
Filed under Outbound email.
From octavehq/lfgtm · 27 skills · 11 · pushed 2026-08-21
What it does when it runs
Generate GTM content (emails, LinkedIn messages, call prep) using saved agents, Octave AI, or Claude direct — your choice. Use when user says "generate an email", "write a LinkedIn message", "prep for a call", "create outreach", or asks for single-asset content generation with mode selection.
Read from the skill and the 0 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.
- Keys and connectors you must supply
- None found.
- Hosts it reaches
- No third-party host appears in the skill or its bundled files.
- Tool permissions it declares
- No
allowed-toolsin the frontmatter. It only issues instructions, so there is nothing to bound. - Actions present in the files
- None. Instructions only.
Install it
View source on GitHub ↗git clone --depth 1 --filter=blob:none --sparse https://github.com/octavehq/lfgtm.git /tmp/lfgtm git -C /tmp/lfgtm sparse-checkout set "skills/generate" mkdir -p ~/.claude/skills/generate cp -R "/tmp/lfgtm/skills/generate/." ~/.claude/skills/generate/
Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗
Or take the whole library
This repo ships a .claude-plugin manifest, so Claude Code can install all 27 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.
/plugin marketplace add octavehq/lfgtm /plugin
The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.
The skill
Source on GitHub ↗Reproduced in full from octavehq/lfgtm/blob/88c5cdb1899aec05dc17e9fabd61e6e376598cd6/skills/generate/SKILL.md, which is licensed MIT (repository). 1,830 words, 39 headings.
/octave:generate - GTM Content Generator
Generate GTM content using your Octave library context. Choose how to generate: run a saved agent for consistency, use Octave's built-in AI, or have Claude draft it directly with Octave context.
Principles
Follow these standards during generation. Read each before producing output.
Content and language:
- Editorial rules — no AI-isms, banned vocabulary, honest analyst tone
- Information principles — lead with conclusions, evidence-backed claims, narrative arc
Presentation:
- Presentation principles — use for any visual output (HTML, dashboards, tables); text follows the editorial rules above
Octave data:
- Octave value — prioritize grounded workspace data over generic AI content
- Octave research toolkit — tool selection (list vs. search) and standard error handling when gathering context for Mode B/C
- Entity model — canonical entity types and oId prefixes referenced throughout (persona, product, Motion, Motion ICP, etc.)
Review:
- For Mode C (Claude Direct), the content is Claude's own draft: run the review from protocol.md before presenting it — for HTML output the protocol is a mandatory gate; for text output run the preflight and the editorial checks. Modes A and B hand generation to a saved agent or Octave's own generation tools, so the protocol's reviewer pass doesn't apply — those outputs still get the Step 4/5 present-and-refine loop below.
Usage
/octave:generate <type> [options] [--mode agent|octave|claude]
Content Types
Email Sequences
/octave:generate email --to "<person>" --about "<topic>" [--persona "<persona>"] [--motion "<motion>"]
Example:
/octave:generate email --to "John Smith, VP Engineering at Acme" --about "reducing deployment time"
LinkedIn Messages
/octave:generate linkedin --to "<person>" --about "<topic>" [--type connection|inmail|follow-up]
Example:
/octave:generate linkedin --to "Sarah Chen, CTO" --about "DevOps automation" --type connection
Call Prep
/octave:generate call-prep --for "<person/company>" [--motion "<motion>"] [--focus "<topics>"]
Example:
/octave:generate call-prep --for "Meeting with Acme Corp engineering team" --focus "security, scalability"
General Content
/octave:generate content --type "<content-type>" --about "<topic>" [--persona "<persona>"]
Example:
/octave:generate content --type "objection handling" --about "pricing concerns" --persona "CFO"
Generation Modes
Three ways to generate content, each with different trade-offs:
| Mode | Best For | How |
|---|---|---|
| Saved Agent | Consistency, team standards, repeatable sequences | list_agents → run_*_agent |
| Octave Default | Balanced quality + library grounding | generate_email / generate_content / generate_call_prep |
| Claude Direct | Maximum control, rapid iteration, custom formats | Fetch Octave context, Claude generates directly |
Smart Inference Rules
Skip the mode question when intent is obvious:
- "Run my cold outreach agent" / "use the enterprise agent" → Saved Agent
- "Generate an email for..." / "create a sequence" → Octave Default
- "Write me an email using our Motion narrative" / "draft this yourself" / "I want more control" → Claude Direct
When Ambiguous, Ask (via AskUserQuestion tool)
When the mode is not obvious from the request, always use the AskUserQuestion tool to present the three options as a UI selector. Never silently default to one mode — let the user choose.
Instructions
When the user runs /octave:generate:
Step 1: Parse the Request
Identify:
- Content type (email, linkedin, call-prep, content)
- Target person/company if specified
- Topic or context
- Optional constraints (persona, Motion, etc.)
- Generation mode (if
--modeflag or clear intent)
Step 2: Determine Generation Mode
Apply smart inference rules from the request wording:
- "Run my cold outreach agent" / "use the enterprise agent" → Saved Agent (skip the question)
- "Draft this yourself" / "I want more control" / "write it yourself" → Claude Direct (skip the question)
If mode is not obvious from the request, use the AskUserQuestion tool to ask — do NOT default silently:
AskUserQuestion({
questions: [{
question: "How should I generate this?",
header: "Gen mode",
options: [
{ label: "Use a saved agent", description: "I'll find matching agents from your library for consistency and team standards" },
{ label: "Generate with Octave (Recommended)", description: "Octave AI generates using your library context — balanced quality" },
{ label: "I'll draft it directly", description: "I'll pull Octave context, then write it myself — maximum control" }
],
multiSelect: false
}]
})
IMPORTANT: Do not skip this question by defaulting to Octave. If the user didn't explicitly indicate a mode, you MUST ask using AskUserQuestion.
Step 3: Generate (branch by mode)
Mode A: Saved Agent
Map the content type to an agent type and find matching agents:
| Content Type | Agent Type |
|---|---|
| CONTENT | |
| call-prep | CALL_PREP |
| content | CONTENT |
# Find matching agents
list_agents({ type: "<mapped_type>" })
If agents found, present them:
MATCHING AGENTS
===============
1. [Agent Name] — [Description]
Run: Select this agent
2. [Agent Name] — [Description]
Run: Select this agent
Which agent? (or switch to Octave default / Claude direct):
Run the selected agent:
For Email Agents:
run_email_agent({
agent: "<agent name or oId>",
person: {
firstName: "<first name>",
lastName: "<last name>",
email: "<email>",
linkedInProfile: "<linkedin url>",
companyName: "<company>",
companyDomain: "<domain>",
jobTitle: "<title>"
},
allEmailsContext: "<additional context>",
allEmailsInstructions: "<instructions>"
})
For Content Agents:
run_content_agent({
agent: "<agent name or oId>",
person: { ... },
company: { ... },
runtimeContext: "<additional context>"
})
For Call Prep Agents:
run_call_prep_agent({
agent: "<agent name or oId>",
person: { ... },
meetingContext: "<meeting details>"
})
If no agents found:
No [type] agents found in your library.
Options:
1. Generate with Octave (default AI)
2. I'll draft it directly (Claude + Octave context)
3. Browse all agents with the `list_agents` tool
Your choice:
Mode B: Octave Default
Gather context, then call Octave's generation tools directly.
Gather Context:
- If person specified, use
find_personto get details - If company specified, use
find_companyto get company info - Use
search_knowledge_baseto get relevant messaging - Match to appropriate persona and Motion ICP cell
- See octave-research-toolkit.md for the full list/search tool tables and standard error-handling responses (Octave connection failed, person/company not found, no matching Motion ICP cell, no proof points, no findings)
For Email Sequences:
generate_email({
person: {
firstName: "<first name>",
lastName: "<last name>",
email: "<email>",
linkedInProfile: "<linkedin url>",
companyName: "<company>",
title: "<job title>"
},
allEmailsContext: "<context for all emails>",
allEmailsInstructions: "<instructions for all emails>",
numEmails: 4
})
For General Content (including LinkedIn):
generate_content({
instructions: "<detailed instructions for content generation>",
customContext: "<additional context>",
person: { /* optional person details */ },
company: { /* optional company details */ }
})
For Call Prep:
generate_call_prep({
person: {
firstName: "<first name>",
lastName: "<last name>",
email: "<email>",
linkedInProfile: "<linkedin url>",
companyName: "<company>",
jobTitle: "<job title>"
},
meetingContext: "<meeting details and focus areas>"
})
Mode C: Claude Direct
Gather the same Octave context, but Claude generates the content itself — no generate_* MCP calls.
See entity-model.md for the canonical entityType values and oId prefixes used below (persona pe_, product px_, service sc_, competitor cp_, proof point pp_, Motion mot_, Motion ICP micp_).
Gather Context (same as Octave Default):
# Get persona details
search_knowledge_base({ query: "<topic> <persona>", entityTypes: ["persona"] })
get_entity({ oId: "<persona_oId>" })
# Get product details
list_entities({ entityType: "product" })
get_entity({ oId: "<product_oId>" })
# Find the matching Motion + Motion ICP cell for this topic and persona
list_motions()
list_motion_icps({ motionOId: "<motion_oId>" })
find_motion_icp({ motionIcpOId: "<motion_icp_oId>", includeLearnings: true })
# Get proof points
search_knowledge_base({ query: "<topic>", entityTypes: ["proof_point", "reference"] })
# Get brand voice
list_entities(entityType: "brand_voice")
# Get competitive positioning if relevant
search_knowledge_base({ query: "<topic>", entityTypes: ["competitor"] })
Generate directly:
- Apply brand voice guidelines to tone and style
- Use value props as messaging anchors
- Incorporate proof points as evidence
- Structure based on content type (email format, LinkedIn format, call prep format, etc.)
- Claude has full control over structure, length, and approach
Label the output:
[Content here]
---
Generated by Claude (with Octave context)
Sources: [persona name], [Motion name + Motion ICP cell], [proof points used], [brand voice]
Step 4: Present Generated Content
Format the output clearly with:
- The generated content
- Context used (persona, Motion ICP cell, brand voice, etc.)
- Generation mode used
- Suggestions for customization
Step 5: Offer Refinement
What would you like to do?
1. Adjust tone or messaging
2. Add more proof points
3. Create version for a different persona
4. Try a different generation mode
5. Done
Your choice:
Tips
- Provide as much context as possible for better results
- Specify the persona if you know who you're targeting
- Use
/octave:researchfirst if you need more info about the recipient - Use
--mode agentfor repeatable, team-standard sequences - Use
--mode claudewhen you want maximum control over the output
Examples
Quick Email
/octave:generate email --to "engineering leader" --about "reducing CI/CD pipeline time"
Using a Saved Agent
/octave:generate email --to "[email protected]" --mode agent
Claude Direct with Full Control
/octave:generate email --to "Sarah Chen, CTO at TechCorp" --about "DevOps automation" --mode claude
Detailed Email with Context
/octave:generate email --to "Mike Johnson, VP Eng at TechCorp (500 employees, Series B)" --about "improving developer productivity" --persona "Engineering Leader" --motion "Enterprise DevOps Outbound"
Call Prep
/octave:generate call-prep --for "Discovery call with Acme Corp" --focus "security compliance, scalability"
MCP Tools Used
Agent Discovery & Execution
list_agents- Find matching saved agents by typerun_email_agent- Run a saved email sequence agentrun_content_agent- Run a saved content generation agentrun_call_prep_agent- Run a saved call prep agent
Context Gathering
find_person/find_company- Research recipientssearch_knowledge_base- Find relevant messaging, proof points, personasget_entity- Get full entity details (persona, product, competitor)list_motions- List all Motions in the workspacelist_motion_icps- List Motion ICP cells (persona × segment intersections) for a Motionfind_motion_icp- Get full Motion ICP cell narrative (Target ICP overview, Strategic narrative, Pains and consequences, Benefits and impacts, Methodology, References) plus Learning Loop learningslist_motion_playbooks- List Default + Custom Motion Playbooks under a Motion (when a Thematic / Milestone / Account / Competitive angle applies)get_motion_playbook- Full details for a Motion Playbooklist_entities(entityType: "brand_voice") - Get brand voice for consistency
Octave Generation
generate_email- Email sequence generation (Octave Default mode)generate_content- General content generation (Octave Default mode)generate_call_prep- Call preparation generation (Octave Default mode)
Related Skills
- Browse and run saved agents with the
list_agents/run_agentMCP tools /octave:research- Research recipients before generating/octave:library- Save successful messaging patterns back to library/octave:ads- Ad campaign creative grounded in the library/octave:one-pager//octave:deck- Deep-dive collateral/octave:positioning- Build messaging frameworks to inform outreach
Need help setting it up?
This page tells you what generate does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.
Book a call →The directory stays free. There is nothing gated behind this.