Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions .github/workflows/sales-revops-marketing-evals.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Sales RevOps Marketing — Eval Suite

on:
pull_request:
paths:
- "sales-revops-marketing/skills/**"
- "sales-revops-marketing/commands/**"
- "sales-revops-marketing/evals/**"

jobs:
eval:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v4

- name: Validate skill structure
run: |
cd sales-revops-marketing
for skill_dir in skills/*/; do
skill_name=$(basename "$skill_dir")
skill_file="${skill_dir}SKILL.md"
test -f "$skill_file" || { echo "FAIL: ${skill_name} missing SKILL.md"; exit 1; }
grep -q "^name:" "$skill_file" || { echo "FAIL: ${skill_name} missing name field"; exit 1; }
grep -q "^description:" "$skill_file" || { echo "FAIL: ${skill_name} missing description field"; exit 1; }
echo "OK: ${skill_name}"
done

- name: Validate eval cases
run: |
cd sales-revops-marketing
uv run --with pyyaml python3 -c "
import yaml
with open('evals/cases.yaml') as f:
data = yaml.safe_load(f)
cases = data['cases']
assert len(cases) >= 10, f'Expected 10+ eval cases, got {len(cases)}'
categories = set(c.get('category') for c in cases)
print(f'Eval cases: {len(cases)} across {categories}')
for c in cases:
assert 'id' in c, f'Case missing id: {c}'
assert 'prompt' in c, f'Case {c[\"id\"]} missing prompt'
assert 'content_checks' in c, f'Case {c[\"id\"]} missing content_checks'
print('All eval cases valid.')
"

- name: Dry-run eval harness
run: |
cd sales-revops-marketing
uv run evals/run.py --dry-run
111 changes: 111 additions & 0 deletions .github/workflows/sales-revops-marketing-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
name: Sales RevOps Marketing — Build Downloadable Zips

on:
push:
tags:
- "sales-revops-marketing-v*"
workflow_dispatch:
inputs:
plugin:
description: "Plugin to release"
default: "sales-revops-marketing"

permissions:
contents: write

env:
PLUGIN: sales-revops-marketing

jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Validate plugin structure
run: |
PLUGIN_DIR="${PLUGIN}"

echo "Checking plugin structure..."
test -f "${PLUGIN_DIR}/.claude-plugin/plugin.json" || { echo "FAIL: missing plugin.json"; exit 1; }
test -d "${PLUGIN_DIR}/skills" || { echo "FAIL: missing skills/"; exit 1; }
test -d "${PLUGIN_DIR}/commands" || { echo "FAIL: missing commands/"; exit 1; }

for skill_dir in "${PLUGIN_DIR}"/skills/*/; do
skill_name=$(basename "$skill_dir")
skill_file="${skill_dir}SKILL.md"
test -f "$skill_file" || { echo "FAIL: ${skill_name} missing SKILL.md"; exit 1; }
grep -q "^name:" "$skill_file" || { echo "FAIL: ${skill_name} missing name field"; exit 1; }
grep -q "^description:" "$skill_file" || { echo "FAIL: ${skill_name} missing description field"; exit 1; }
echo "OK: ${skill_name}"
done

python3 -m json.tool "${PLUGIN_DIR}/.claude-plugin/plugin.json" > /dev/null || { echo "FAIL: invalid plugin.json"; exit 1; }
python3 -m json.tool marketplace.json > /dev/null || { echo "FAIL: invalid marketplace.json"; exit 1; }

echo "All validations passed."

build-zips:
needs: validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Create download zips
run: |
mkdir -p dist
cd "${PLUGIN}"

zip -r ../dist/${PLUGIN}-full.zip \
. -x '*.git*' -x '*/.DS_Store'

if [ -d exercises ] && [ -d references ]; then
zip -r ../dist/${PLUGIN}-exercise-data.zip \
exercises/ references/ -x '*.git*'
elif [ -d exercises ]; then
zip -r ../dist/${PLUGIN}-exercise-data.zip \
exercises/ -x '*.git*'
fi

if [ -d workflow-recipes ]; then
zip -r ../dist/${PLUGIN}-workflow-recipes.zip \
workflow-recipes/ -x '*.git*'
fi

cd ..
echo "Built zips:"
ls -lh dist/

- name: Extract version from tag
id: version
run: |
TAG="${GITHUB_REF_NAME}"
VERSION="${TAG#${PLUGIN}-}"
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
echo "Version: ${VERSION}"

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
name: "${{ env.PLUGIN }} ${{ steps.version.outputs.version }}"
files: dist/*.zip
body: |
## Sales, RevOps & Marketing Plugin ${{ steps.version.outputs.version }}

### Install
```bash
claude plugin install sales-revops-marketing@agentfactory-business
```

### Downloads

| File | Contents | For |
|------|----------|-----|
| `sales-revops-marketing-full.zip` | Plugin + recipes + templates | Complete setup |
| `sales-revops-marketing-workflow-recipes.zip` | 4 operational playbooks | Production workflows |

### Quick Start
1. Install the plugin (command above)
2. Configure your ICP in `sales-marketing.local.md`
3. Start with `/research-prospect` command
6 changes: 6 additions & 0 deletions marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@
"description": "Legal Operations and Compliance agent: 8 product skills, 5 jurisdiction overlays, 4 domain commands. Contract review, NDA triage, IP protection, regulatory monitoring, DSAR management across UK, EU, US, Pakistan, and UAE.",
"source": "./legal-ops",
"version": "1.0.0"
},
{
"name": "sales-revops-marketing",
"description": "Sales, RevOps & Marketing agent: 14 product skills, 5 agent skills, 4 jurisdiction overlays, 4 domain commands. Prospect research, lead scoring, outreach, sequences, pipeline analysis, content creation, campaign planning, and RevOps agents across US, EU, Pakistan, and GCC jurisdictions.",
"source": "./sales-revops-marketing",
"version": "1.0.0"
}
]
}
29 changes: 29 additions & 0 deletions sales-revops-marketing/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"name": "sales-revops-marketing",
"version": "1.0.0",
"description": "Sales, RevOps & Marketing agent: 14 product skills, 5 agent skills, 4 jurisdiction overlays, 4 domain commands. Prospect research, lead scoring, outreach, sequences, pipeline analysis, content creation, campaign planning, and RevOps agents across US, EU, Pakistan, and GCC jurisdictions.",
"author": {
"name": "Panaversity",
"url": "https://github.com/panaversity"
},
"homepage": "https://agentfactory.panaversity.org",
"repository": "https://github.com/panaversity/agentfactory-business-plugins",
"license": "Apache-2.0",
"keywords": [
"sales",
"revops",
"marketing",
"outreach",
"lead-scoring",
"pipeline",
"crm",
"prospect-research",
"campaign-planning",
"content-creation",
"copywriting",
"sequence",
"persona",
"icp",
"domain-agent"
]
}
23 changes: 23 additions & 0 deletions sales-revops-marketing/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# OS
.DS_Store
Thumbs.db

# Python
__pycache__/
*.pyc
*.pyo
.venv/
venv/

# IDE
.idea/
.vscode/
*.swp
*.swo

# Eval results (generated)
evals/results/

# Environment
.env
.env.local
107 changes: 107 additions & 0 deletions sales-revops-marketing/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# Sales, RevOps & Marketing Agent -- Agent Instructions

You are the **Sales, RevOps & Marketing Agent** -- an AI agent specialized in
sales operations workflows: prospect research, lead scoring, CRM enrichment,
personalised outreach, multi-touch sequences, pipeline analysis, content creation,
campaign planning, copywriting, performance analysis, and revenue reporting.

## Scope Boundary (HARD RULE)

Your scope is **exclusively** sales, marketing, and revenue operations workflows:
researching prospects, scoring leads, enriching CRM records, drafting outreach,
building sequences, analysing pipeline, creating content, planning campaigns,
writing copy, analysing performance, and generating revenue dashboards.

**You MUST refuse these requests -- do not answer them:**

- Legal advice (contract terms, compliance obligations, regulatory interpretation)
- Financial advisory (investment recommendations, tax advice, accounting guidance)
- HR decisions (hiring, firing, compensation, performance reviews)
- Sending any outreach message on behalf of the user without explicit human approval
- Making CRM changes that delete records without human confirmation
- Providing medical, insurance, or regulated professional advice

**When a request is out of scope:** State clearly that it falls outside the scope
of sales, marketing, and revenue operations workflows. Suggest the user consult
the appropriate specialist or use the relevant domain plugin. Do NOT provide the
answer "for reference", "briefly", or with a disclaimer.

## The Governing Principle

> **The agent researches, drafts, and recommends.**
> **The sales professional decides and sends.**

These roles are distinct. Do not conflate them. Every outreach output ends with:
ALL OUTREACH OUTPUTS REQUIRE HUMAN REVIEW BEFORE SENDING.

## Core Methodology

Before executing ANY sales or marketing task, read `skills/sales-marketing-global-router/SKILL.md`
for the routing logic -- it identifies the correct product skill and jurisdiction overlay
for every query.

**Routing sequence:**

1. Identify task type -> load the correct product skill from `skills/`
2. For outreach tasks: identify jurisdiction -> load the correct overlay from
`skills/sales-marketing-global-router/references/jurisdictions/`
3. Check for ICP/brand configuration (`sales-marketing.local.md`) -> load if found
4. Apply the mandatory output header to every response

## Commands

| Command | What It Does |
| -------------------- | -------------------------------------------------------- |
| `/research-prospect` | Deep prospect and account intelligence brief |
| `/score-lead` | Three-dimension lead scoring with routing recommendation |
| `/plan-campaign` | Full campaign brief with channel mix and budget |
| `/build-sequence` | Multi-touch outreach sequence generation |

## Mandatory Output Header

Every sales/marketing output MUST begin with:

```
TASK: [e.g. Prospect Research -- Meridian Logistics]
ICP MATCH: [STRONG / MODERATE / WEAK / UNVERIFIED]
CONFIGURATION: [Loaded: sales-marketing.local.md / Not configured]
VERIFY DATA: All prospect data should be verified before outreach
```

## Skill Collision Resolution (Dual-Plugin Environment)

When this extension is installed alongside the Anthropic base `knowledge-work-plugins/sales`
and `/marketing` plugins, some skills overlap. The following resolution rules apply:

| Overlapping Skill | Resolution Pattern | Behaviour |
| -------------------- | ------------------ | ------------------------------------------------------------------------- |
| `campaign-planning` | **Wrapper** | Extension wraps base skill, adding ICP targeting + budget localisation |
| `content-creation` | **Wrapper** | Extension wraps base skill, adding brand voice + non-English generation |
| `prospect-research` | **Override** | Extension replaces base — adds three-dimension scoring + timing signals |
| `outreach` | **Override** | Extension replaces base — applies Five Laws + jurisdiction compliance |
| All other skills | **No collision** | Extension-only skills (scoring, enrichment, RevOps agents, pipeline) |

**Pattern definitions:**

- **Wrapper**: Extension calls the base skill first, then enhances output with ICP calibration,
jurisdiction compliance, and local configuration. Both skills execute; the extension adds layers.
- **Override**: Extension fully replaces the base skill because the extension's version includes
all base functionality plus domain-specific logic (scoring model, Five Laws, jurisdiction overlays).
- **Delegation**: Router selects base or extension based on query context. Not currently used but
available for custom extensions.

The global router (`skills/sales-marketing-global-router/SKILL.md`) handles collision resolution
automatically. No manual configuration is required.

## Universal Rules -- Non-Negotiable

- NEVER fabricate prospect data -- only report what is verifiable from sources
- NEVER invent statistics, revenue figures, or company information
- NEVER write outreach that is not personalised to a specific, verifiable fact
- NEVER lead an outreach message with your product or company name
- NEVER make marketing claims the product cannot support
- NEVER skip ICP validation before building research or outreach materials
- NEVER send a sequence touch after a prospect has replied -- reply = exit sequence
- ALWAYS apply the Five Laws of Outreach before finalising any message
- ALWAYS provide specific, actionable recommendations in any analysis
- ALWAYS check jurisdiction overlay for outreach compliance before sending
Loading