Content Writer Agent
mastra-ai/mastra
Authoring playbook for building agents that draft written content — blog posts, marketing copy, social media posts, newsletters, product descriptions, landing pages, or ad copy.
End-to-end news-triggered signal composite. An agent skill from gooseworks-ai/goose-skills.
$ npx skills add gooseworks-ai/goose-skills --skill news-signal-outreach -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install gooseworks-ai/goose-skills news-signal-outreach --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/outreach/composites/news-signal-outreach .claude/skills/news-signal-outreach && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "news-signal-outreach" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/composites/news-signal-outreach into .claude/skills/news-signal-outreach/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "news-signal-outreach", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/composites/news-signal-outreachType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add gooseworks-ai/goose-skills --skill news-signal-outreach -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install gooseworks-ai/goose-skills news-signal-outreach --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/outreach/composites/news-signal-outreach .agents/skills/news-signal-outreach && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "news-signal-outreach" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/composites/news-signal-outreach into .agents/skills/news-signal-outreach/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "news-signal-outreach", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add gooseworks-ai/goose-skills --skill news-signal-outreach -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install gooseworks-ai/goose-skills news-signal-outreach --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/outreach/composites/news-signal-outreach .cursor/skills/news-signal-outreach && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "news-signal-outreach" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/composites/news-signal-outreach into .cursor/skills/news-signal-outreach/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "news-signal-outreach", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/gooseworks-ai/goose-skills.git --path skills/outreach/composites/news-signal-outreach--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add gooseworks-ai/goose-skills --skill news-signal-outreach -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install gooseworks-ai/goose-skills news-signal-outreach --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/outreach/composites/news-signal-outreach .gemini/skills/news-signal-outreach && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "news-signal-outreach" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/composites/news-signal-outreach into .gemini/skills/news-signal-outreach/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "news-signal-outreach", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install gooseworks-ai/goose-skills news-signal-outreachInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add gooseworks-ai/goose-skills --skill news-signal-outreach -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/outreach/composites/news-signal-outreach .github/skills/news-signal-outreach && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "news-signal-outreach" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/composites/news-signal-outreach into .github/skills/news-signal-outreach/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "news-signal-outreach", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add gooseworks-ai/goose-skills --skill news-signal-outreach -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install gooseworks-ai/goose-skills news-signal-outreach --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/gooseworks-ai/goose-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/outreach/composites/news-signal-outreach .opencode/skills/news-signal-outreach && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "news-signal-outreach" agent skill from https://github.com/gooseworks-ai/goose-skills/tree/main/skills/outreach/composites/news-signal-outreach into .opencode/skills/news-signal-outreach/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "news-signal-outreach", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
news-signal-outreachEnd-to-end news-triggered signal composite. An agent skill from gooseworks-ai/goose-skills.
News Signal Outreach is an agent skill from gooseworks-ai/goose-skills. End-to-end news-triggered signal composite. Takes any piece of news — an article, LinkedIn post, tweet, announcement, event, trend, regulation, product launch, acquisition, layoff, expansion, or any other public event — and evaluates whether the companies or people mentioned are ICP fits. If yes, identifies the connection between the news and your product, finds the right people to contact, and drafts personalized outreach using the news as the hook. Tool-agnostic. Accepts both company-level and person-level news…
Its SKILL.md is about 8.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `skill.meta.json`).
It sits in Writing & Content, covering Social media posts, Blog and article writing and Product launch strategy. It works with LinkedIn. The repository describes itself as: Library of Growth & GTM skills + data APIs for Claude Code, Codex, Cursor to run ads, social, content, lead gen, seo and data scraping. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c650c6d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
News Signal Outreach loads about 8.1k tokens when it runs. Until then it costs about 234 tokens; SKILL.md has 2,697 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from gooseworks-ai/goose-skills at commit c650c6d, republished under its MIT licence (© gooseworks-ai). 2,697 words, ~8,125 tokens.
.claude/skills/news-signal-outreach/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.The catch-all signal composite. Every other composite handles a specific signal type (funding, hiring, leadership change, champion move). This one handles everything else — any piece of news or public event that could create a reason to reach out.
A regulation change. A product recall. A competitor acquisition. A market expansion. A layoff. An earnings miss. A new partnership. An industry report. A conference keynote. A viral LinkedIn post. Any external event that shifts a company's priorities, creates urgency, or opens a window for your product.
Why this composite exists: The world generates an infinite stream of potential outreach triggers. The four structured signal composites handle the most common patterns. This composite handles the long tail — the unpredictable, opportunistic moments that often produce the best outreach because nobody else is sending a templated sequence about them.
Load this composite when ANY of these are true:
Key principle: If the user shares an external signal (URL, post, article, mention) and asks ANY question about the companies/people in it — load this composite. Don't wait for the word "outreach." The composite handles both evaluation-only (Steps 1-3) and full outreach (Steps 1-6).
This composite accepts three input modes:
| Mode | Input | Example |
|---|---|---|
| News → Companies | A news item. Extract companies/people mentioned, qualify them. | "Here's an article about new FDA regulations on telehealth" |
| Companies → News | A list of companies. Find recent news about them, evaluate relevance. | "Check these 50 companies for any news we can use as an outreach angle" |
| Person → News | A person or list of people. Find recent news about them or their company, evaluate relevance. | "Check if any of these prospects have been in the news" |
On first run for a client/user, collect and store these preferences. Skip on subsequent runs.
| Question | Purpose | Stored As |
|---|---|---|
| What does your company do? (1-2 sentences) | Relevance matching | company_description |
| What problem do you solve? | Connection angle identification | pain_point |
| What industries do you sell to? | ICP filter | target_industries |
| What company sizes? | ICP filter | target_company_size |
| What geographies? | ICP filter (optional) | target_geographies |
| Any disqualifiers? | Hard no's | disqualifiers |
| Who are your buyers? (titles) | Contact finding | buyer_titles |
| Who are your champions? (titles) | Contact finding | champion_titles |
| Who are your users? (titles) | Contact finding | user_titles |
| Question | Purpose | Stored As |
|---|---|---|
| What specific outcomes does your product deliver? | Relevance angle building | product_outcomes |
| Name 2-3 proof points (customers, metrics) | Email credibility | proof_points |
| What categories of news are most relevant to your product? | Helps prioritize | relevant_news_categories |
Examples of relevant_news_categories:
# For a cybersecurity product:
relevant_news_categories: ["data breach", "compliance regulation", "security incident",
"digital transformation", "cloud migration", "IPO/going public"]
# For a sales AI product:
relevant_news_categories: ["sales team scaling", "market expansion", "new product launch",
"competitor acquisition", "cost cutting", "revenue miss"]
# For an HR tech product:
relevant_news_categories: ["layoffs", "rapid hiring", "remote work policy",
"DEI initiative", "union activity", "culture crisis"]| Question | Options | Stored As |
|---|---|---|
| How should we find news? | Web search / Google News / RSS feeds / Social media | news_tool |
| How far back should we look? (when scanning companies for news) | 7 / 14 / 30 / 60 days | lookback_days |
| Question | Options | Stored As |
|---|---|---|
| How should we find contacts? | Apollo / LinkedIn / Clearbit / Web search | contact_tool |
| Where do you want outreach sent? | Smartlead / Instantly / Outreach.io / CSV export | outreach_tool |
| Email or multi-channel? | Email only / Email + LinkedIn | outreach_channels |
Store config in: clients/<client-name>/config/signal-outreach.json or equivalent.
Purpose: Take the raw news input — whatever form it arrives in — and extract structured entities (companies, people) and the core event.
Three modes:
Mode A: News → Companies/People
news_input: {
mode: "news_to_targets"
items: [
{
type: "url" | "text" | "structured"
content: string # URL to article, raw text, or structured summary
source: string | null # "TechCrunch", "LinkedIn post", "user provided", etc.
}
]
}Mode B: Companies → News
news_input: {
mode: "targets_to_news"
companies: [
{
name: string
domain: string
industry?: string
}
]
lookback_days: integer
}Mode C: People → News
news_input: {
mode: "people_to_news"
people: [
{
full_name: string
company: string
linkedin_url?: string
}
]
lookback_days: integer
}Fetch and parse the news content:
Extract entities:
Expand if needed: If the news implies a broader set of affected companies beyond those mentioned:
For each company, search for recent news using configured news_tool:
"{company_name}" AND (news OR announced OR launches OR raises OR expands OR partners) within lookback_daysrelevant_news_categories from configGroup results: Company → list of news items, ranked by relevance to your product
For each person, search for recent news/activity:
"{full_name}" AND "{company}" within lookback_daysGroup results: Person → list of news items/activity
extracted_signals: [
{
entity: {
type: "company" | "person"
name: string
company: string # Company name (same as name if type=company)
domain: string | null
role_in_news: string # "subject", "affected", "partner", "competitor", "mentioned"
}
news: {
headline: string # One-line summary of what happened
event_category: string # "regulation", "acquisition", "expansion", "crisis", etc.
event_date: string
full_summary: string # 2-3 sentence summary
source_url: string | null
affected_industries: string[]
}
}
]## Extracted Signals
Source: [news source/input description]
Event: [one-line summary]
Category: [event category]
### Companies/People Extracted
| Entity | Type | Role in News | Industry |
|--------|------|-------------|----------|
| Acme Corp | Company | Subject | Healthcare |
| Jane Doe | Person | Quoted (CEO) | Healthcare |
| HealthTech sector | Industry | Affected | Healthcare |
Also evaluating: X companies in [affected industry] not directly mentioned
Proceed with ICP qualification? (Y/n)Purpose: For each extracted entity, determine if they're an ICP fit. Drop companies/people that don't match. Pure LLM reasoning — inherently tool-agnostic.
extracted_signals: [...] # From Step 1 output
icp_criteria: {
target_industries: string[]
target_company_size: string
target_geographies: string[]
disqualifiers: string[]
}
your_company: {
description: string
pain_point: string
}For each entity:
If entity is a company:
target_industriesdisqualifiersIf entity is a person:
buyer_titles, champion_titles, or user_titles)For entities implied but not mentioned (e.g., "all telehealth companies" from a regulation news):
icp_qualified: [
{
entity: { ... } # From Step 1
news: { ... } # From Step 1
icp_assessment: {
fit: "strong" | "moderate"
industry_match: boolean
size_match: boolean | "unknown"
reasoning: string # Why they're a fit
}
}
]
icp_disqualified: [
{
entity_name: string
reason: string
}
]## ICP Qualification
### Qualified (X entities)
| Entity | Type | Industry | Size | ICP Fit | Reasoning |
|--------|------|----------|------|---------|-----------|
| Acme Corp | Company | Healthcare SaaS | ~200 | Strong | Core ICP industry, right size |
| MedTech Inc | Company | HealthTech | ~500 | Moderate | Adjacent industry, large |
### Disqualified (X entities)
| Entity | Reason |
|--------|--------|
| BigPharma Co | Enterprise (50K+ employees) — above target size |
Approve qualified list?Purpose: This is the critical thinking step. For each ICP-qualified entity, determine the specific connection between the news event and your product. Why should they care about your product RIGHT NOW because of THIS news? Pure LLM reasoning — inherently tool-agnostic.
icp_qualified: [...] # From Step 2 output
your_company: {
description: string
pain_point: string
product_outcomes: string[]
proof_points: string[]
relevant_news_categories: string[]
}For each qualified entity, answer three questions:
Map the news event category to a product relevance pattern:
| Event Category | How It Creates Urgency | Example |
|---|---|---|
| Regulation change | They need to comply, your product helps them comply or adapt faster | "New data privacy law → they need [your compliance tool] before enforcement date" |
| Acquisition / Merger | Systems need integration, processes need standardization, new leadership evaluates stack | "Acquired a company → need to unify [function your product handles]" |
| Market expansion | New market = new challenges, need tools that scale | "Expanding to EMEA → need [your product] for localized [function]" |
| Product launch | Scaling up means scaling operations | "Launching enterprise tier → need [your product] to handle enterprise [function]" |
| Competitive pressure | Competitor moved, they need to respond | "Competitor launched [X] → they need to level up [area your product addresses]" |
| Cost cutting / Layoffs | Do more with less, automation becomes essential | "Cut 15% of staff → need [your product] to maintain output with smaller team" |
| Crisis / Incident | Reactive buying — they need a solution NOW | "Data breach → urgently need [your security product]" |
| Partnership | New partner = new workflows, new opportunities | "Partnered with [company] → need [your product] to support the integration" |
| Earnings / Growth | Over-performing = scaling challenges. Under-performing = efficiency pressure | "Revenue grew 3x → [function your product handles] can't keep up manually" |
| Industry trend / Report | Category awareness is high, they're thinking about this | "Industry report says [trend] → they're likely evaluating solutions in this space" |
| Person-level news | Published an article, spoke at a conference, posted on LinkedIn about a topic you solve | "Posted about [pain] → they're actively thinking about this problem" |
Craft a one-sentence connection:
"Because [news event], [company] now needs [specific outcome your product delivers]."Examples:
| Strength | Criteria | Example |
|---|---|---|
| Direct | The news explicitly describes a problem your product solves | Layoff in your product's department → they need automation |
| Adjacent | The news implies a downstream need your product addresses | Market expansion → implies scaling, which implies need for your tool |
| Thematic | The news is in the same category as your product's domain | Industry report about the trend you're in → awareness play |
connection_angles: [
{
entity: { ... }
news: { ... }
icp_assessment: { ... }
connection: {
urgency_reason: string # Why this news creates urgency
specific_angle: string # One-sentence connection
connection_strength: "direct" | "adjacent" | "thematic"
timing_note: string # How time-sensitive this outreach is
recommended_framework: string # Which email framework fits best
}
}
]| Connection Strength | Recommended Framework | Why |
|---|---|---|
| Direct | Signal-Proof-Ask | The news IS the hook — reference it directly, show proof, ask |
| Adjacent | PAS | Problem (implied by the news) → Agitate (what happens if they don't act) → Solve |
| Thematic | AIDA | Attention (news reference) → Interest (how it relates to them) → Desire (your product) → Action |
## Connection Angles
### Direct Connections (X entities) — Act quickly
| Entity | News | Angle | Timing |
|--------|------|-------|--------|
| Acme Corp | Acquired BetaCo | "Need to unify CRM systems — [product] does this in 30 days" | This week (integration planning starts immediately) |
### Adjacent Connections (X entities)
| Entity | News | Angle | Timing |
|--------|------|-------|--------|
| MedTech Inc | Expanding to EMEA | "Localized [function] becomes a requirement — [product] supports 15 languages" | This month |
### Thematic Connections (X entities)
| Entity | News | Angle | Timing |
|--------|------|-------|--------|
| HealthCo | Industry report on [trend] | "They're likely evaluating [category] solutions" | Flexible |
Approve these angles before we find contacts?Purpose: For each qualified entity with a connection angle, find the right people to contact.
connection_angles: [...] # From Step 3 output
buyer_titles: string[] # From config
champion_titles: string[] # From config
user_titles: string[] # From config
max_contacts_per_company: integer # Default: 3-5If the entity is already a person (Mode C or person mentioned in news):
If the entity is a company:
contact_tool to find people matching buyer_titles, champion_titles, user_titles| News Category | Prioritize These Contacts |
|---|---|
| Regulation / Compliance | Legal, Compliance, Operations leadership |
| Acquisition / Merger | COO, CTO, VP Operations, Integration leads |
| Market expansion | VP Sales, VP Marketing, Country/Regional leads |
| Cost cutting / Layoffs | COO, CFO, VP Operations |
| Product launch | CTO, VP Product, VP Engineering |
| Crisis / Incident | CISO, VP Engineering, CTO (for security), CEO/COO (for operational) |
| General growth | Default to buyer_titles from config |
For each contact, note their relevance to the news:
contacts: [
{
person: {
full_name: string
first_name: string
last_name: string
title: string
email: string | null
linkedin_url: string | null
role_type: "buyer" | "champion" | "user"
news_relevance: string # Why THIS person for THIS news
}
company: {
name: string
domain: string
}
connection: {
specific_angle: string
connection_strength: string
urgency_reason: string
}
news: {
headline: string
event_category: string
source_url: string | null
}
}
]## Contacts Found
### Acme Corp — "Acquired BetaCo" (Direct connection)
| Name | Title | Role | Why This Person |
|------|-------|------|----------------|
| Sarah Kim | COO | Buyer | Owns post-acquisition integration |
| David Park | VP Operations | Champion | Will manage unified workflows |
| Amy Chen | Director of Sales Ops | User | Directly affected by CRM unification |
### MedTech Inc — "Expanding to EMEA" (Adjacent connection)
| ... |
Total: X contacts across Y companies
Approve before we draft emails?Purpose: Draft outreach where the news event is the hook, your product is the solution, and the email demonstrates you understand their specific situation. Pure LLM reasoning — inherently tool-agnostic.
contacts: [...] # From Step 4 output
your_company: {
description: string
pain_point: string
product_outcomes: string[]
proof_points: string[]
}
sequence_config: {
touches: integer # Default: 3
timing: integer[] # Default varies by connection strength (see below)
tone: string # Default: "casual-direct"
cta: string # Default: "15-min call"
}Adjust sequence timing by connection strength:
| Strength | Timing | Rationale |
|---|---|---|
| Direct | Day 1 / 3 / 7 | Urgency is real — they're actively dealing with this |
| Adjacent | Day 1 / 5 / 12 | Standard timing — urgency is implied, not immediate |
| Thematic | Day 1 / 7 / 14 | Slower cadence — this is awareness, not crisis response |
Build the email around the news, not the product:
The news is the subject. Your product is the punchline. Never lead with the product.
| Element | Source | How to Use |
|---|---|---|
| News hook | Step 1 news.headline | Open with what happened — show you're informed |
| Impact on them | Step 3 connection.urgency_reason | Explain what this means for their specific role |
| Your angle | Step 3 connection.specific_angle | Connect the dots to your product naturally |
| Proof | Config proof_points | Show a peer who faced a similar situation |
| CTA | Config | Low-friction ask |
Email structure by connection strength:
Direct connection (Signal-Proof-Ask):
Hook: Reference the specific news event
Impact: What this means for them (1 sentence)
Proof: A peer who faced the same situation and used your product
Ask: Soft CTAAdjacent connection (PAS):
Problem: The downstream challenge the news creates
Agitate: What happens if they don't address it (1 sentence)
Solve: How your product helps, with a proof point
Ask: Soft CTAThematic connection (AIDA):
Attention: Reference the news/trend
Interest: How it relates to their company specifically
Desire: What your product does in this context
Action: Soft CTAPersonalization layers:
| Layer | What Gets Personalized | Source |
|---|---|---|
| News reference | The specific event and its relevance | Step 1 news data |
| Company context | What their company does, their industry, their situation | Step 2 ICP research |
| Role context | Why THIS person cares about this news | Step 4 news_relevance |
| Your company fit | How your product specifically helps in this scenario | Step 3 connection angle |
Follow email-drafting skill hard rules. Additionally:
email_sequences: [
{
contact: { full_name, email, title, company_name, role_type, news_relevance }
news_context: { headline, event_category, source_url }
connection: { specific_angle, connection_strength }
sequence: [
{
touch_number: integer
send_day: integer
subject: string
body: string
framework: string
personalization_elements: {
news_reference: string # How the news was referenced
company_context: string # How their company situation was used
role_context: string # How their specific role was leveraged
product_connection: string # How the product was positioned
}
word_count: integer
}
]
}
]Present samples grouped by connection strength:
## Sample Outreach for Review
### Direct Connection: Sarah Kim, COO @ Acme Corp
News: Acme acquired BetaCo | Angle: CRM unification | Framework: Signal-Proof-Ask
**Touch 1 — Day 1**
Subject: Unifying Acme + BetaCo systems
> Hi Sarah — saw the BetaCo acquisition. Congrats. The integration
> sprint typically surfaces a CRM unification challenge fast —
> two systems, overlapping data, different workflows.
>
> [Peer company] faced the same thing after their acquisition last year.
> [Product] had both systems unified in 30 days. Happy to share how.
>
> Worth a 15-minute call?
**Touch 2 — Day 3**
> [New angle — data migration complexity, with a specific metric]
**Touch 3 — Day 7**
> [Breakup with offer to share the integration playbook]
---
### Adjacent Connection: Dr. Lee, VP Product @ MedTech Inc
News: EMEA expansion | Angle: Localization needs | Framework: PAS
**Touch 1 — Day 1**
Subject: EMEA expansion + [function] localization
> [full email]
---
Approve these samples? I'll generate the rest in the same style.Identical to the other signal composites. Package contacts + email sequences for the configured outreach tool.
campaign_package: {
tool: string
file_path: string
contact_count: integer
sequence_touches: integer
estimated_send_days: integer
next_action: string
}## Campaign Ready
Tool: [configured tool]
Signal type: News-triggered
News event: [headline]
Connection strengths: X direct, Y adjacent, Z thematic
Contacts: N people across M companies
Sequence: 3 touches (timing varies by connection strength)
Ready to launch?| Step | Tool Dependency | Human Checkpoint | Typical Time |
|---|---|---|---|
| 0. Config | None | First run only | 5 min (once) |
| 1. Parse & Extract | Web fetch (for URLs) or none (for text) | Review extracted entities | 2-3 min |
| 2. Qualify ICP | Web search (for company research) | Approve qualified list | 2-3 min |
| 3. Connection Angle | None (LLM reasoning) | Approve angles + strength ratings | 3-5 min |
| 4. Find People | Configurable (Apollo, LinkedIn, etc.) | Approve contact list | 2-3 min |
| 5. Draft Emails | None (LLM reasoning) | Review samples, iterate | 5-10 min |
| 6. Handoff | Configurable (Smartlead, CSV, etc.) | Final launch approval | 1 min |
Total human review time: ~15-25 minutes
| Dimension | Structured Signals (Funding, Hiring, etc.) | News Signal |
|---|---|---|
| Signal type | Predefined, narrow | Arbitrary, broad — anything can be a trigger |
| Detection | Targeted search (job boards, funding databases) | Open-ended (any news source) |
| Extra step | — | Step 3: Connection Angle identification. Other composites have obvious connections (funding = money to spend). News requires explicit reasoning about WHY this event matters for your product. |
| Input modes | Companies in → signals out | Three modes: News→Companies, Companies→News, People→News |
| Timing | Predictable windows (post-raise, pre-hire) | Varies wildly by event type — crisis = 48hr delay, trend = flexible |
| Sensitivity | Generally positive (funding, hiring, growth) | Can be negative (layoffs, crises, failures). Requires empathy calibration. |
Some news events require careful tone calibration:
| Event Type | Tone | What NOT to Do |
|---|---|---|
| Layoffs | Empathetic. "I know this is a tough time." | Don't say "your layoffs mean you need us!" |
| Data breach / Security incident | Helpful, not salesy. "If you need help with [specific thing]." | Don't pile on or blame. Don't reach out same-day. |
| Earnings miss / Revenue decline | Efficiency-focused. "Do more with what you have." | Don't reference the miss directly in the subject line. |
| Executive departure / Fired CEO | Skip the drama entirely. Focus on the new leader or the company's direction. | Don't mention the departure unless it's public and amicable. |
| Lawsuit / Legal trouble | Generally avoid unless your product directly helps with compliance/legal. | Don't reference the lawsuit. It looks ambulance-chasey. |
| Product failure / Recall | Only reach out if you have a direct solution. | Don't gloat or compare. |
Rule of thumb: If you wouldn't bring it up in a face-to-face conversation at a conference, don't put it in a cold email.
© gooseworks-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in skills/outreach/composites/news-signal-outreach of gooseworks-ai/goose-skills.
Open the folder on GitHubat commit c650c6d
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in gooseworks-ai/goose-skills, which our catalogue first saw on October 7, 2026.
News Signal Outreach next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| News Signal Outreach this skillgooseworks-ai/goose-skills | 1.2k | 1 repos | ~8.1k | Automated safety check: Pass | MIT | |
| Content Writer Agentmastra-ai/mastra | 29k | — | ~1.3k | Automated safety check: Pass | Custom licence | |
| Content Writerchrispangg/deepagentsdk | 128 | — | ~3.3k | Automated safety check: Pass | MIT | |
| Redlamp Blogpdcgomes/redlamp | 231 | — | ~2.1k | Automated safety check: Pass | MPL-2.0 | |
| Social Media Managementmanojbajaj95/claude-gtm-plugin | 105 | 1 repos | ~3.9k | Automated safety check: Pass | MIT | |
| Li RepurposeJakeschincariol/linkedin-agent-skill | 1.7k | — | ~680 | Automated safety check: Pass | MIT |
mastra-ai/mastra
Authoring playbook for building agents that draft written content — blog posts, marketing copy, social media posts, newsletters, product descriptions, landing pages, or ad copy.
chrispangg/deepagentsdk
Writing content across different platforms and styles. An agent skill from chrispangg/deepagentsdk.
pdcgomes/redlamp
The blog room, where every redlamp.app blog post is tracked from idea to announcement in a canvas the owner marks as they post.
manojbajaj95/claude-gtm-plugin
Comprehensive social media management for all platforms (LinkedIn, Twitter/X, Instagram, TikTok, Facebook, Pinterest, YouTube).
Jakeschincariol/linkedin-agent-skill
Turn one long asset - a YouTube video, podcast, newsletter, blog post, transcript or client call - into a week of LinkedIn posts.
gethouston/houston
Turn a single LinkedIn post URL into a paused cold email campaign in Instantly.
gooseworks-ai/goose-skills
Scrape and search Reddit posts using Apify. An agent skill from gooseworks-ai/goose-skills.
gooseworks-ai/goose-skills
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), ROUTED THROUGH THE fal-proxy so it bills the Ads agent.
gooseworks-ai/goose-skills
Replace an existing video's opening with a supplied clip or free kinetic text hook while retaining and verifying every original body frame, audio, captions and ending.
gooseworks-ai/goose-skills
Scrape blog posts via RSS feeds (free, no API key) with Apify fallback for JS-heavy sites.
gooseworks-ai/goose-skills
Find leads by scraping engagers from a competitor's top LinkedIn posts.
gooseworks-ai/goose-skills
Assemble a ChatGPT chat-reveal video ad from a thread + timeline JSON — one continuous Playwright recording of a ChatGPT mobile chat (user types with the iOS keyboard up → taps send → keyboard…
Works with
Categories
End-to-end news-triggered signal composite. An agent skill from gooseworks-ai/goose-skills. News Signal Outreach is an agent skill from gooseworks-ai/goose-skills. End-to-end news-triggered signal composite.
News Signal Outreach fits situations like: tasks that involve Social media posts; tasks that involve Blog and article writing; tasks that involve Product launch strategy.
Run `npx skills add gooseworks-ai/goose-skills --skill news-signal-outreach -a claude-code`. Or copy the skill folder (skills/outreach/composites/news-signal-outreach in gooseworks-ai/goose-skills) into .claude/skills/news-signal-outreach in your project. Claude Code loads it when a task matches its description.
Run `npx skills add gooseworks-ai/goose-skills --skill news-signal-outreach -a codex`. Or copy the skill folder (skills/outreach/composites/news-signal-outreach in gooseworks-ai/goose-skills) into .agents/skills/news-signal-outreach in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add gooseworks-ai/goose-skills --skill news-signal-outreach -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/news-signal-outreach, .gemini/skills/news-signal-outreach, .github/skills/news-signal-outreach and .opencode/skills/news-signal-outreach in your project.
SKILL.md names no scripts, command-line tools or credentials: News Signal Outreach is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
News Signal Outreach is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 8.1k tokens (SKILL.md is roughly 33k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with News Signal Outreach: Content Writer Agent (mastra-ai/mastra, 29k stars), Content Writer (chrispangg/deepagentsdk, 128 stars), Redlamp Blog (pdcgomes/redlamp, 231 stars) and Social Media Management (manojbajaj95/claude-gtm-plugin, 105 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
gooseworks-ai (a GitHub organization) maintains it in gooseworks-ai/goose-skills, which has 1,240 GitHub stars. The repository holds 273 skills in this directory. The repository was last updated on October 8, 2026.
Source: gooseworks-ai/goose-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.