skills/generate/SKILL.md
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.
npx skillsauth add octavehq/lfgtm generateInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.
Follow these standards during generation. Read each before producing output.
Content and language:
Presentation:
Octave data:
Review:
/octave:generate <type> [options] [--mode agent|octave|claude]
/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"
/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
/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"
/octave:generate content --type "<content-type>" --about "<topic>" [--persona "<persona>"]
Example:
/octave:generate content --type "objection handling" --about "pricing concerns" --persona "CFO"
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 |
Skip the mode question when intent is obvious:
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.
When the user runs /octave:generate:
Identify:
--mode flag or clear intent)Apply smart inference rules from the request wording:
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.
Map the content type to an agent type and find matching agents:
| Content Type | Agent Type | |---|---| | email | EMAIL | | linkedin | 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:
Gather context, then call Octave's generation tools directly.
Gather Context:
find_person to get detailsfind_company to get company infosearch_knowledge_base to get relevant messagingFor 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>"
})
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:
Label the output:
[Content here]
---
Generated by Claude (with Octave context)
Sources: [persona name], [Motion name + Motion ICP cell], [proof points used], [brand voice]
Format the output clearly with:
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:
/octave:research first if you need more info about the recipient--mode agent for repeatable, team-standard sequences--mode claude when you want maximum control over the output/octave:generate email --to "engineering leader" --about "reducing CI/CD pipeline time"
/octave:generate email --to "[email protected]" --mode agent
/octave:generate email --to "Sarah Chen, CTO at TechCorp" --about "DevOps automation" --mode claude
/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"
/octave:generate call-prep --for "Discovery call with Acme Corp" --focus "security compliance, scalability"
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 agentfind_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 consistencygenerate_email - Email sequence generation (Octave Default mode)generate_content - General content generation (Octave Default mode)generate_call_prep - Call preparation generation (Octave Default mode)list_agents / run_agent MCP 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 outreachdevelopment
Turn one or more Octave GTM Explorer / Beats reports into a branded, shareable digest with selectable insight scope, evidence depth, and output format. Use when the user asks for a report digest, weekly or monthly insight recap, executive intelligence brief, magazine-style insight story, report deck, or a recurring published summary of Octave insights.
content-media
Product and feature launch planning with full content kit generation across channels and audiences. Use when user says "launch plan", "product launch", "feature announcement", "GTM plan for launch", "launch content kit", or mentions launching something new.
development
A dense internal deal room a rep hands to a champion so they can run the buying-committee sell without you in the room. Quantified business case, stakeholder map with per-seat ammo, objection handling, and a path to yes, rendered as self-contained HTML. Use when user says "champion deal room", "arm my champion", "help my champion sell internally", "internal business case for [deal]", or wants a champion enablement doc. For a customer-facing top-of-funnel page use /octave:microsite; for the formal closing proposal use /octave:proposal.
data-ai
Analyze email threads, call transcripts, and conversations for resonance, adherence to messaging, and competitive differentiation. Use when user says "analyze this call", "how did the email land", "score this thread", "conversation analysis", or pastes conversation content to evaluate.