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.
/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: /octave:explore-agents
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.
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_all_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_all_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_all_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)/octave:explore-agents - Browse and manage all saved agents/octave:research - Research recipients before generating/octave:library - Save successful messaging patterns back to library/octave:campaign - Multi-channel campaign content (emails, social, ads, blog)/octave:pmm - Deep-dive collateral (case studies, one-pagers, decks)/octave:messaging - Build messaging frameworks to inform outreachtools
Capture a brand's visual design system from its website and build a reusable component kit. Walks key pages on a domain (screenshots + HTML via the Octave scrape tool), derives design tokens (colors, type, spacing, radius, shadow), and produces a minimal component library (buttons, cards, headers, stats, tables, badges, hero, footer) as a self-contained HTML reference plus CSS tokens. Use when the user says "get brand components", "capture the brand", "build a component kit for <domain>", "make outputs look like <company>", or wants other skills to generate on-brand HTML for a target company.
tools
Define, run, and manage multi-step GTM workflows with human-in-the-loop execution. Use when user says "run a workflow", "show workflows", "create a workflow", "automate this process", or references workflow-based tasks.
development
Analyze won and lost deals for patterns, insights, and actionable learnings. Use when user says "win/loss analysis", "why did we lose", "deal patterns", "win themes", or asks about deal outcome trends. Do NOT use for visual HTML reports — use /octave:win-loss-report instead.
development
Generate visual win/loss analysis reports as self-contained HTML with CSS-based charts and data visualizations. Use when user says "win/loss report", "deal report", "visual analysis", or wants a formatted HTML version of deal outcome analysis. Do NOT use for text-based deal analysis — use /octave:wins-losses instead.