@anysiteio/agent-skills 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +61 -1
- package/.claude-plugin/plugin.json +5 -1
- package/README.md +27 -33
- package/bin/install.js +186 -135
- package/bundles.json +19 -0
- package/package.json +3 -2
- package/skills/anysite-audience-analysis/SKILL.md +110 -38
- package/skills/anysite-audience-analysis/references/PLATFORM_COVERAGE.md +38 -19
- package/skills/anysite-audience-analysis/references/TOOL_MAPPING.md +16 -11
- package/skills/anysite-brand-reputation/SKILL.md +105 -43
- package/skills/anysite-competitor-analyzer/SKILL.md +170 -111
- package/skills/anysite-competitor-intelligence/SKILL.md +201 -116
- package/skills/anysite-competitor-intelligence/references/ANALYSIS_PATTERNS.md +17 -13
- package/skills/anysite-content-analytics/SKILL.md +101 -33
- package/skills/anysite-crm-account-brief/SKILL.md +71 -0
- package/skills/anysite-crm-audit/SKILL.md +59 -0
- package/skills/anysite-crm-champions/SKILL.md +76 -0
- package/skills/anysite-crm-competitor-intel/SKILL.md +74 -0
- package/skills/anysite-crm-enrich/SKILL.md +84 -0
- package/skills/anysite-crm-lookalikes/SKILL.md +64 -0
- package/skills/anysite-crm-prospect/SKILL.md +90 -0
- package/skills/anysite-crm-score/SKILL.md +72 -0
- package/skills/anysite-crm-setup/SKILL.md +147 -0
- package/skills/anysite-crm-signals/SKILL.md +96 -0
- package/skills/anysite-influencer-discovery/SKILL.md +123 -71
- package/skills/anysite-lead-generation/SKILL.md +288 -256
- package/skills/anysite-lead-generation/references/LINKEDIN_STRATEGIES.md +79 -71
- package/skills/anysite-lead-generation/references/WEB_SCRAPING.md +121 -87
- package/skills/anysite-market-research/SKILL.md +117 -68
- package/skills/anysite-mcp/SKILL.md +128 -0
- package/skills/anysite-mcp-migration/SKILL.md +290 -0
- package/skills/anysite-person-analyzer/SKILL.md +86 -53
- package/skills/anysite-trend-analysis/SKILL.md +119 -55
- package/skills/anysite-vc-analyst/SKILL.md +12 -2
- package/skills/competitor-discovery/SKILL.md +350 -0
- package/skills/customer-pain-mining/SKILL.md +318 -0
- package/skills/positioning-map/SKILL.md +314 -0
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"plugins": [
|
|
11
11
|
{
|
|
12
12
|
"name": "anysite-skills",
|
|
13
|
-
"description": "Complete suite of
|
|
13
|
+
"description": "Complete suite of 18 professional skills for social media analysis, lead generation, CRM enrichment setup, market research, competitive intelligence, competitor discovery, customer pain mining, positioning mapping, person intelligence, VC analysis, competitor research, security auditing, and CLI automation using anysite MCP server. Supports LinkedIn, Instagram, Twitter/X, Reddit, YouTube, Y Combinator, SEC, GitHub, and web scraping. Zero configuration required - no API tokens or external tools needed.",
|
|
14
14
|
"version": "1.1.0",
|
|
15
15
|
"author": {
|
|
16
16
|
"name": "Anysite Skills Contributors",
|
|
@@ -132,6 +132,66 @@
|
|
|
132
132
|
"source": "./",
|
|
133
133
|
"category": "productivity",
|
|
134
134
|
"skills": ["./skills/anysite-cli"]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"name": "anysite-mcp-migration",
|
|
138
|
+
"description": "Migration assistant for updating anysite MCP skills, prompts, and agent instructions from v1 (individual tools) to v2 (universal meta-tools: execute, discover, get_page, query_cache, export_data). Automatically rewrites tool references, adds pagination/filtering/export capabilities, and validates migrated output.",
|
|
139
|
+
"version": "1.0.0",
|
|
140
|
+
"author": {
|
|
141
|
+
"name": "Anysite Skills Contributors",
|
|
142
|
+
"email": "support@anysite.io"
|
|
143
|
+
},
|
|
144
|
+
"source": "./",
|
|
145
|
+
"category": "productivity",
|
|
146
|
+
"skills": ["./skills/anysite-mcp-migration"]
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"name": "competitor-discovery",
|
|
150
|
+
"description": "Find a startup's real competitors — the alternatives customers actually compare them to, not just the names on the pitch deck. Maps direct competitors, substitutes, \"doing nothing\" workarounds, and convergence threats using Anysite MCP (LinkedIn, Reddit, YouTube, Twitter, YC, SEC) and Exa MCP semantic web search. Supports top5 and landscape modes. Run before customer-pain-mining or positioning-map.",
|
|
151
|
+
"version": "1.0.0",
|
|
152
|
+
"author": {
|
|
153
|
+
"name": "Anysite Skills Contributors",
|
|
154
|
+
"email": "support@anysite.io"
|
|
155
|
+
},
|
|
156
|
+
"source": "./",
|
|
157
|
+
"category": "productivity",
|
|
158
|
+
"skills": ["./skills/competitor-discovery"]
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"name": "customer-pain-mining",
|
|
162
|
+
"description": "Extract verbatim customer complaints about competitors — the exact wording a founder's product copy should steal, in customers' own words. Combines Anysite MCP (Reddit, LinkedIn, YouTube comments, Twitter) with Exa MCP semantic search for review posts and comparison articles. Returns 3–5 pain clusters with verbatim quotes plus a white-space section of unmet feature requests.",
|
|
163
|
+
"version": "1.0.0",
|
|
164
|
+
"author": {
|
|
165
|
+
"name": "Anysite Skills Contributors",
|
|
166
|
+
"email": "support@anysite.io"
|
|
167
|
+
},
|
|
168
|
+
"source": "./",
|
|
169
|
+
"category": "productivity",
|
|
170
|
+
"skills": ["./skills/customer-pain-mining"]
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"name": "positioning-map",
|
|
174
|
+
"description": "Build a positioning map for 3–5 competitors and identify the empty quadrant a founder could own. Maps competitors across 5 signal axes (hero, pricing, specialities, recent shipping, hiring) using Anysite MCP (LinkedIn, SEC) and Exa MCP. Returns a comparison table, 3 candidate positioning moves with choice criteria, and a one-sentence positioning statement.",
|
|
175
|
+
"version": "1.0.0",
|
|
176
|
+
"author": {
|
|
177
|
+
"name": "Anysite Skills Contributors",
|
|
178
|
+
"email": "support@anysite.io"
|
|
179
|
+
},
|
|
180
|
+
"source": "./",
|
|
181
|
+
"category": "productivity",
|
|
182
|
+
"skills": ["./skills/positioning-map"]
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
"name": "anysite-crm-setup",
|
|
186
|
+
"description": "Connect and configure the user's CRM (HubSpot) for safe AI-driven enrichment via anysite MCP crm_* tools: guided discovery, deterministic field mapping saved as a local profile, and mandatory writing rules (dry-run previews, fill-blank policy, undo).",
|
|
187
|
+
"version": "1.0.0",
|
|
188
|
+
"author": {
|
|
189
|
+
"name": "Anysite Skills Contributors",
|
|
190
|
+
"email": "support@anysite.io"
|
|
191
|
+
},
|
|
192
|
+
"source": "./",
|
|
193
|
+
"category": "productivity",
|
|
194
|
+
"skills": ["./skills/anysite-crm-setup"]
|
|
135
195
|
}
|
|
136
196
|
]
|
|
137
197
|
}
|
|
@@ -42,6 +42,10 @@
|
|
|
42
42
|
"./skills/anysite-vc-analyst",
|
|
43
43
|
"./skills/anysite-competitor-analyzer",
|
|
44
44
|
"./skills/skill-audit",
|
|
45
|
-
"./skills/anysite-cli"
|
|
45
|
+
"./skills/anysite-cli",
|
|
46
|
+
"./skills/competitor-discovery",
|
|
47
|
+
"./skills/customer-pain-mining",
|
|
48
|
+
"./skills/positioning-map",
|
|
49
|
+
"./skills/anysite-crm-setup"
|
|
46
50
|
]
|
|
47
51
|
}
|
package/README.md
CHANGED
|
@@ -28,55 +28,49 @@ Get unlimited requests through Remote MCP Server with no request limits. Ideal f
|
|
|
28
28
|
| `anysite-competitor-analyzer` | Comprehensive competitive intelligence combining web scraping, LinkedIn analysis, social media monitoring, leadership profiling, GitHub review, and community sentiment tracking. | [SKILL.md](skills/anysite-competitor-analyzer/SKILL.md) |
|
|
29
29
|
| `skill-audit` | Static security auditor for Claude Code skills. Detects hooks, prompt injection, and dangerous permissions. | [SKILL.md](skills/skill-audit/SKILL.md) |
|
|
30
30
|
| `anysite-cli` | Command-line tool operator for anysite CLI. Execute data extraction, batch processing, dataset pipelines, scheduling, and database operations. | [SKILL.md](skills/anysite-cli/SKILL.md) |
|
|
31
|
+
| `competitor-discovery` | Find a startup's real competitors — the alternatives customers actually compare them to. Maps direct competitors, substitutes, workarounds, and convergence threats across LinkedIn, Reddit, YouTube, Twitter, YC, and SEC. | [SKILL.md](skills/competitor-discovery/SKILL.md) |
|
|
32
|
+
| `customer-pain-mining` | Extract verbatim customer complaints about competitors for landing-page copy, custdev prep, and product strategy. Returns pain clusters with exact quotes plus a white-space section of unmet feature requests. | [SKILL.md](skills/customer-pain-mining/SKILL.md) |
|
|
33
|
+
| `positioning-map` | Build a positioning map for 3–5 competitors and identify the empty quadrant to own. Maps 5 signal axes and returns a comparison table, candidate positioning moves, and a one-sentence positioning statement. | [SKILL.md](skills/positioning-map/SKILL.md) |
|
|
34
|
+
| `anysite-crm-setup` | Connect the user's CRM (HubSpot) and configure safe AI enrichment: guided discovery, deterministic local field mapping, dry-run previews, fill-blank policy and undo. | [SKILL.md](skills/anysite-crm-setup/SKILL.md) |
|
|
35
|
+
| `anysite-mcp` | Usage guide for the anysite MCP: meta-tools, GTM source map (funding, hiring, tech stack, reviews, news), email cascades, and cost-aware calling patterns. | [SKILL.md](skills/anysite-mcp/SKILL.md) |
|
|
36
|
+
| `anysite-crm-enrich` | Enrich existing CRM records with fresh data - titles, LinkedIn profiles, firmographics, emails. Fill-blank policy, dry-run previews, undo. | [SKILL.md](skills/anysite-crm-enrich/SKILL.md) |
|
|
37
|
+
| `anysite-crm-signals` | Sweep CRM target accounts for buying signals - funding, exec hires, hiring surges, news, mentions - and prioritize who to reach out to today. | [SKILL.md](skills/anysite-crm-signals/SKILL.md) |
|
|
38
|
+
| `anysite-crm-champions` | Detect job changes among CRM contacts, flag past champions at new accounts, propose re-engagement plays. | [SKILL.md](skills/anysite-crm-champions/SKILL.md) |
|
|
39
|
+
| `anysite-crm-prospect` | Find net-new leads and push them into the CRM deduplicated - companies first, then contacts with associations. | [SKILL.md](skills/anysite-crm-prospect/SKILL.md) |
|
|
40
|
+
| `anysite-crm-audit` | Read-only CRM data quality audit: field completeness, duplicate candidates, stale records, enrichability estimate. | [SKILL.md](skills/anysite-crm-audit/SKILL.md) |
|
|
41
|
+
| `anysite-crm-score` | Score CRM companies against your ICP with an explicit rubric and write the score into the mapped field. | [SKILL.md](skills/anysite-crm-score/SKILL.md) |
|
|
42
|
+
| `anysite-crm-competitor-intel` | Displacement hunting: who uses a competitor (technographics), what their users complain about (review mining), tagged into the CRM. | [SKILL.md](skills/anysite-crm-competitor-intel/SKILL.md) |
|
|
43
|
+
| `anysite-crm-account-brief` | Pre-meeting one-pager for a CRM account: CRM context + funding, exec changes, news, key people's recent activity. | [SKILL.md](skills/anysite-crm-account-brief/SKILL.md) |
|
|
44
|
+
| `anysite-crm-lookalikes` | Derive your real ICP from closed-won customers and find lookalike companies across 70M+ company records. | [SKILL.md](skills/anysite-crm-lookalikes/SKILL.md) |
|
|
31
45
|
<!-- END_SKILLS_TABLE -->
|
|
32
46
|
|
|
33
47
|
## Installation
|
|
34
48
|
|
|
35
|
-
|
|
49
|
+
One line — installs skills into Claude Code / Codex and registers the anysite remote MCP server (sign-in happens in your browser on first use):
|
|
36
50
|
|
|
37
51
|
```bash
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
This will display installation instructions and list all available skills.
|
|
42
|
-
|
|
43
|
-
### Step 1: Install anysite MCP Server
|
|
44
|
-
|
|
45
|
-
First, install the anysite MCP server following the instructions at [docs.anysite.io/mcp-server](https://docs.anysite.io/mcp-server).
|
|
46
|
-
|
|
47
|
-
### Step 2: Add Skills Marketplace
|
|
48
|
-
|
|
49
|
-
#### Option 1: Using npx (Recommended)
|
|
52
|
+
# GTM package (recommended for sales/growth teams): CRM workflows + MCP
|
|
53
|
+
npx @anysiteio/agent-skills gtm
|
|
50
54
|
|
|
51
|
-
|
|
55
|
+
# Everything: all skills + MCP
|
|
52
56
|
npx @anysiteio/agent-skills
|
|
53
57
|
```
|
|
54
58
|
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
/plugin marketplace add https://github.com/anysiteio/agent-skills
|
|
58
|
-
```
|
|
59
|
+
You can also just send this line to your agent (Claude Code / Codex) — it will run it for you.
|
|
59
60
|
|
|
60
|
-
|
|
61
|
+
Other commands:
|
|
61
62
|
|
|
62
|
-
In Claude Code:
|
|
63
63
|
```bash
|
|
64
|
-
#
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
#
|
|
68
|
-
|
|
64
|
+
npx @anysiteio/agent-skills --list # list bundles and skills
|
|
65
|
+
npx @anysiteio/agent-skills --status # what is installed
|
|
66
|
+
npx @anysiteio/agent-skills --skill NAME # install specific skill(s)
|
|
67
|
+
npx @anysiteio/agent-skills --uninstall # remove anysite skills
|
|
68
|
+
npx @anysiteio/agent-skills --no-mcp # skills only, skip MCP registration
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
Add to your project's `.cursor/settings.json` or use the same Claude Code plugin format.
|
|
74
|
-
|
|
75
|
-
#### Other AI Tools
|
|
71
|
+
After installing the GTM package, restart your agent session and say `/anysite-crm-setup` — it connects your HubSpot and configures safe field mapping.
|
|
76
72
|
|
|
77
|
-
|
|
78
|
-
- `skills/*/SKILL.md` - Individual skill documentation
|
|
79
|
-
- `.claude-plugin/marketplace.json` - Skill metadata
|
|
73
|
+
To update, re-run the same command: `npx` always fetches the latest published version.
|
|
80
74
|
|
|
81
75
|
## Prerequisites
|
|
82
76
|
|
package/bin/install.js
CHANGED
|
@@ -1,43 +1,63 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Anysite
|
|
4
|
+
* Anysite agent setup: installs skills into Claude Code / Codex and registers
|
|
5
|
+
* the anysite remote MCP server (https://mcp.anysite.io/mcp, OAuth on first use).
|
|
5
6
|
*
|
|
6
7
|
* Usage:
|
|
7
|
-
* npx @anysiteio/agent-skills
|
|
8
|
-
* npx @anysiteio/agent-skills
|
|
9
|
-
* npx @anysiteio/agent-skills --
|
|
10
|
-
* npx @anysiteio/agent-skills --
|
|
8
|
+
* npx @anysiteio/agent-skills Install ALL skills + register MCP
|
|
9
|
+
* npx @anysiteio/agent-skills gtm Install the GTM bundle + register MCP
|
|
10
|
+
* npx @anysiteio/agent-skills --list List skills and bundles
|
|
11
|
+
* npx @anysiteio/agent-skills --status Show what is installed
|
|
12
|
+
* npx @anysiteio/agent-skills --skill N Install specific skill(s), no MCP
|
|
13
|
+
* npx @anysiteio/agent-skills --uninstall Remove anysite skills (MCP entry is kept)
|
|
14
|
+
*
|
|
15
|
+
* Flags: --no-mcp | --target claude|codex | --help
|
|
11
16
|
*/
|
|
12
17
|
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
import { execFileSync } from "node:child_process";
|
|
19
|
+
import {
|
|
20
|
+
cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync,
|
|
21
|
+
} from "node:fs";
|
|
22
|
+
import { homedir } from "node:os";
|
|
23
|
+
import { dirname, join, resolve } from "node:path";
|
|
24
|
+
import { fileURLToPath } from "node:url";
|
|
17
25
|
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
26
|
+
const PKG_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
27
|
+
const SKILLS_SRC = join(PKG_ROOT, "skills");
|
|
28
|
+
const BUNDLES = JSON.parse(readFileSync(join(PKG_ROOT, "bundles.json"), "utf8"));
|
|
29
|
+
const PKG_VERSION = JSON.parse(readFileSync(join(PKG_ROOT, "package.json"), "utf8")).version;
|
|
22
30
|
|
|
23
|
-
|
|
31
|
+
const HOME = process.env.HOME || homedir();
|
|
32
|
+
const CLAUDE_DIR = join(HOME, ".claude");
|
|
33
|
+
const CLAUDE_SKILLS_DIR = join(CLAUDE_DIR, "skills");
|
|
34
|
+
const CODEX_DIR = join(HOME, ".codex");
|
|
35
|
+
const CODEX_CONFIG = join(CODEX_DIR, "config.toml");
|
|
36
|
+
const MANIFEST_PATH = join(CLAUDE_SKILLS_DIR, ".anysite-skills.json");
|
|
24
37
|
|
|
25
|
-
const
|
|
26
|
-
const
|
|
38
|
+
const MCP_NAME = "anysite";
|
|
39
|
+
const MCP_URL = "https://mcp.anysite.io/mcp";
|
|
40
|
+
|
|
41
|
+
// ── args ────────────────────────────────────────────────────────────────────
|
|
27
42
|
|
|
43
|
+
const args = process.argv.slice(2);
|
|
44
|
+
const flags = { bundle: null, list: false, status: false, uninstall: false, help: false, mcp: true, skills: [], targets: [] };
|
|
28
45
|
for (let i = 0; i < args.length; i++) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
else if (
|
|
32
|
-
else if (
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
46
|
+
const a = args[i];
|
|
47
|
+
if (a === "--list" || a === "-l") flags.list = true;
|
|
48
|
+
else if (a === "--status") flags.status = true;
|
|
49
|
+
else if (a === "--uninstall" || a === "--remove") flags.uninstall = true;
|
|
50
|
+
else if (a === "--help" || a === "-h") flags.help = true;
|
|
51
|
+
else if (a === "--no-mcp") flags.mcp = false;
|
|
52
|
+
else if (a === "--skill" || a === "-s") { if (args[++i]) flags.skills.push(args[i]); }
|
|
53
|
+
else if (a === "--target") { if (args[++i]) flags.targets.push(args[i]); }
|
|
54
|
+
else if (!a.startsWith("-") && BUNDLES[a]) flags.bundle = a;
|
|
55
|
+
else { console.error(`Unknown argument: ${a} (see --help)`); process.exit(1); }
|
|
36
56
|
}
|
|
37
57
|
|
|
38
|
-
// ──
|
|
58
|
+
// ── helpers ─────────────────────────────────────────────────────────────────
|
|
39
59
|
|
|
40
|
-
function
|
|
60
|
+
function availableSkills() {
|
|
41
61
|
if (!existsSync(SKILLS_SRC)) return [];
|
|
42
62
|
return readdirSync(SKILLS_SRC, { withFileTypes: true })
|
|
43
63
|
.filter((d) => d.isDirectory() && existsSync(join(SKILLS_SRC, d.name, "SKILL.md")))
|
|
@@ -45,142 +65,173 @@ function getAvailableSkills() {
|
|
|
45
65
|
.sort();
|
|
46
66
|
}
|
|
47
67
|
|
|
48
|
-
function
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
68
|
+
function skillDescription(name) {
|
|
69
|
+
try {
|
|
70
|
+
const m = readFileSync(join(SKILLS_SRC, name, "SKILL.md"), "utf8")
|
|
71
|
+
.match(/^description:\s*(.+)$/m);
|
|
72
|
+
return m ? m[1].trim().replace(/\s+/g, " ").slice(0, 96) : "";
|
|
73
|
+
} catch { return ""; }
|
|
54
74
|
}
|
|
55
75
|
|
|
56
|
-
function
|
|
57
|
-
|
|
58
|
-
return readdirSync(CLAUDE_SKILLS_DIR, { withFileTypes: true })
|
|
59
|
-
.filter(
|
|
60
|
-
(d) =>
|
|
61
|
-
d.isDirectory() &&
|
|
62
|
-
d.name.startsWith("anysite-") &&
|
|
63
|
-
existsSync(join(CLAUDE_SKILLS_DIR, d.name, "SKILL.md"))
|
|
64
|
-
)
|
|
65
|
-
.map((d) => d.name)
|
|
66
|
-
.sort();
|
|
76
|
+
function readManifest() {
|
|
77
|
+
try { return JSON.parse(readFileSync(MANIFEST_PATH, "utf8")); } catch { return null; }
|
|
67
78
|
}
|
|
68
79
|
|
|
69
|
-
|
|
80
|
+
function detectTargets() {
|
|
81
|
+
if (flags.targets.length) return flags.targets;
|
|
82
|
+
const t = [];
|
|
83
|
+
if (existsSync(CLAUDE_DIR)) t.push("claude");
|
|
84
|
+
if (existsSync(CODEX_DIR)) t.push("codex");
|
|
85
|
+
return t;
|
|
86
|
+
}
|
|
70
87
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
Anysite Agent Skills — install skills for Claude Code
|
|
74
|
-
|
|
75
|
-
Usage:
|
|
76
|
-
npx @anysiteio/agent-skills Install all skills
|
|
77
|
-
npx @anysiteio/agent-skills --list List available skills
|
|
78
|
-
npx @anysiteio/agent-skills --skill NAME Install specific skill(s)
|
|
79
|
-
npx @anysiteio/agent-skills --uninstall Remove all anysite skills
|
|
80
|
-
|
|
81
|
-
Options:
|
|
82
|
-
--skill, -s NAME Install specific skill (repeatable)
|
|
83
|
-
--list, -l List available skills
|
|
84
|
-
--uninstall Remove installed anysite skills
|
|
85
|
-
--help, -h Show this help
|
|
86
|
-
`);
|
|
87
|
-
process.exit(0);
|
|
88
|
+
function hasClaudeCli() {
|
|
89
|
+
try { execFileSync("claude", ["--version"], { stdio: "ignore" }); return true; } catch { return false; }
|
|
88
90
|
}
|
|
89
91
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (
|
|
92
|
+
// ── skills install / uninstall ──────────────────────────────────────────────
|
|
93
|
+
|
|
94
|
+
function installSkills(names) {
|
|
95
|
+
mkdirSync(CLAUDE_SKILLS_DIR, { recursive: true });
|
|
96
|
+
const installed = [];
|
|
97
|
+
const missing = [];
|
|
98
|
+
for (const name of names) {
|
|
99
|
+
const src = join(SKILLS_SRC, name);
|
|
100
|
+
if (!existsSync(join(src, "SKILL.md"))) { missing.push(name); continue; }
|
|
101
|
+
const dst = join(CLAUDE_SKILLS_DIR, name);
|
|
102
|
+
rmSync(dst, { recursive: true, force: true });
|
|
103
|
+
cpSync(src, dst, { recursive: true });
|
|
104
|
+
installed.push(name);
|
|
99
105
|
}
|
|
100
|
-
|
|
101
|
-
|
|
106
|
+
const prev = readManifest();
|
|
107
|
+
const all = [...new Set([...(prev?.skills ?? []), ...installed])].sort();
|
|
108
|
+
writeFileSync(MANIFEST_PATH, JSON.stringify({
|
|
109
|
+
version: PKG_VERSION,
|
|
110
|
+
bundle: flags.bundle ?? prev?.bundle ?? null,
|
|
111
|
+
installedAt: new Date().toISOString(),
|
|
112
|
+
skills: all,
|
|
113
|
+
}, null, 2));
|
|
114
|
+
return { installed, missing };
|
|
102
115
|
}
|
|
103
116
|
|
|
104
|
-
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
+
function uninstallSkills() {
|
|
118
|
+
const manifest = readManifest();
|
|
119
|
+
const tracked = new Set(manifest?.skills ?? []);
|
|
120
|
+
const removed = [];
|
|
121
|
+
if (existsSync(CLAUDE_SKILLS_DIR)) {
|
|
122
|
+
for (const d of readdirSync(CLAUDE_SKILLS_DIR, { withFileTypes: true })) {
|
|
123
|
+
if (!d.isDirectory()) continue;
|
|
124
|
+
// remove tracked skills plus legacy anysite-* installs; never touch anything else
|
|
125
|
+
if (tracked.has(d.name) || d.name.startsWith("anysite-")) {
|
|
126
|
+
rmSync(join(CLAUDE_SKILLS_DIR, d.name), { recursive: true, force: true });
|
|
127
|
+
removed.push(d.name);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
117
130
|
}
|
|
131
|
+
rmSync(MANIFEST_PATH, { force: true });
|
|
132
|
+
return removed;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// ── MCP registration ────────────────────────────────────────────────────────
|
|
118
136
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
137
|
+
function registerMcpClaude() {
|
|
138
|
+
if (!hasClaudeCli()) {
|
|
139
|
+
return { ok: false, note: `claude CLI not found — run manually:\n claude mcp add --scope user --transport http ${MCP_NAME} ${MCP_URL}` };
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
execFileSync("claude", ["mcp", "get", MCP_NAME], { stdio: "ignore" });
|
|
143
|
+
return { ok: true, note: `MCP "${MCP_NAME}" already registered in Claude Code — kept as is.` };
|
|
144
|
+
} catch { /* not registered yet */ }
|
|
145
|
+
try {
|
|
146
|
+
execFileSync("claude", ["mcp", "add", "--scope", "user", "--transport", "http", MCP_NAME, MCP_URL], { stdio: "ignore" });
|
|
147
|
+
return { ok: true, note: `MCP "${MCP_NAME}" registered in Claude Code (user scope). Sign-in happens in the browser on first use.` };
|
|
148
|
+
} catch (e) {
|
|
149
|
+
return { ok: false, note: `Could not register MCP automatically (${e.message}). Run manually:\n claude mcp add --scope user --transport http ${MCP_NAME} ${MCP_URL}` };
|
|
123
150
|
}
|
|
124
|
-
console.log(`\nUninstalled ${allInstalled.length} skill(s).\n`);
|
|
125
|
-
process.exit(0);
|
|
126
151
|
}
|
|
127
152
|
|
|
128
|
-
|
|
153
|
+
function registerMcpCodex() {
|
|
154
|
+
mkdirSync(CODEX_DIR, { recursive: true });
|
|
155
|
+
let cfg = "";
|
|
156
|
+
try { cfg = readFileSync(CODEX_CONFIG, "utf8"); } catch { /* new file */ }
|
|
157
|
+
if (cfg.includes(`[mcp_servers.${MCP_NAME}]`)) {
|
|
158
|
+
return { ok: true, note: `MCP "${MCP_NAME}" already present in Codex config — kept as is.` };
|
|
159
|
+
}
|
|
160
|
+
const block = `\n[mcp_servers.${MCP_NAME}]\ncommand = "npx"\nargs = ["-y", "mcp-remote", "${MCP_URL}"]\n`;
|
|
161
|
+
writeFileSync(CODEX_CONFIG, cfg + block);
|
|
162
|
+
return { ok: true, note: `MCP "${MCP_NAME}" added to ${CODEX_CONFIG} (via mcp-remote, OAuth in browser on first use).` };
|
|
163
|
+
}
|
|
129
164
|
|
|
130
|
-
|
|
165
|
+
// ── commands ────────────────────────────────────────────────────────────────
|
|
131
166
|
|
|
132
|
-
if (
|
|
133
|
-
console.
|
|
134
|
-
process.exit(
|
|
167
|
+
if (flags.help) {
|
|
168
|
+
console.log(readFileSync(fileURLToPath(import.meta.url), "utf8").match(/\/\*\*([\s\S]*?)\*\//)[1].replace(/^ \* ?/gm, ""));
|
|
169
|
+
process.exit(0);
|
|
135
170
|
}
|
|
136
171
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
} else {
|
|
149
|
-
console.error(`Unknown skill: ${input}`);
|
|
150
|
-
console.error(`Available: ${available.join(", ")}`);
|
|
151
|
-
process.exit(1);
|
|
152
|
-
}
|
|
172
|
+
if (flags.list) {
|
|
173
|
+
const manifest = readManifest();
|
|
174
|
+
const installed = new Set(manifest?.skills ?? []);
|
|
175
|
+
console.log("\nBundles:");
|
|
176
|
+
for (const [name, b] of Object.entries(BUNDLES)) {
|
|
177
|
+
console.log(` ${name} (${b.skills.length} skills) — ${b.description}`);
|
|
178
|
+
}
|
|
179
|
+
const skills = availableSkills();
|
|
180
|
+
console.log(`\nSkills (${skills.length}):`);
|
|
181
|
+
for (const name of skills) {
|
|
182
|
+
console.log(` ${installed.has(name) ? "✓" : " "} ${name.padEnd(34)} ${skillDescription(name)}`);
|
|
153
183
|
}
|
|
184
|
+
console.log("");
|
|
185
|
+
process.exit(0);
|
|
154
186
|
}
|
|
155
187
|
|
|
156
|
-
|
|
188
|
+
if (flags.status) {
|
|
189
|
+
const manifest = readManifest();
|
|
190
|
+
if (!manifest) { console.log("\nNo anysite skills installed (no manifest found).\n"); process.exit(0); }
|
|
191
|
+
console.log(`\nInstalled: ${manifest.skills.length} skills (package v${manifest.version}, ${manifest.installedAt})`);
|
|
192
|
+
if (manifest.bundle) console.log(`Bundle: ${manifest.bundle}`);
|
|
193
|
+
for (const s of manifest.skills) console.log(` ✓ ${s}`);
|
|
194
|
+
console.log(`\nUpdate: npx @anysiteio/agent-skills@latest ${manifest.bundle ?? ""}\n`);
|
|
195
|
+
process.exit(0);
|
|
196
|
+
}
|
|
157
197
|
|
|
158
|
-
|
|
159
|
-
|
|
198
|
+
if (flags.uninstall) {
|
|
199
|
+
const removed = uninstallSkills();
|
|
200
|
+
console.log(removed.length
|
|
201
|
+
? `\nRemoved ${removed.length} skills from ${CLAUDE_SKILLS_DIR}:\n ${removed.join("\n ")}\n`
|
|
202
|
+
: "\nNothing to remove.\n");
|
|
203
|
+
console.log(`The MCP entry is kept. To remove it: claude mcp remove ${MCP_NAME}\n`);
|
|
204
|
+
process.exit(0);
|
|
205
|
+
}
|
|
160
206
|
|
|
161
|
-
|
|
162
|
-
|
|
207
|
+
// install (default: all skills; `gtm`: bundle; --skill: explicit list)
|
|
208
|
+
const names = flags.skills.length ? flags.skills
|
|
209
|
+
: flags.bundle ? BUNDLES[flags.bundle].skills
|
|
210
|
+
: availableSkills();
|
|
211
|
+
const withMcp = flags.mcp && !flags.skills.length;
|
|
212
|
+
const targets = detectTargets();
|
|
213
|
+
|
|
214
|
+
console.log(`\nanysite setup v${PKG_VERSION} — ${flags.bundle ? `bundle "${flags.bundle}"` : flags.skills.length ? "selected skills" : "all skills"}`);
|
|
215
|
+
if (!targets.length) {
|
|
216
|
+
console.log("\nNo supported agents detected (~/.claude or ~/.codex not found).");
|
|
217
|
+
console.log("Install Claude Code or Codex first, then re-run this command.\n");
|
|
218
|
+
process.exit(1);
|
|
219
|
+
}
|
|
163
220
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
221
|
+
const { installed, missing } = installSkills(names);
|
|
222
|
+
console.log(`\nSkills → ${CLAUDE_SKILLS_DIR}: ${installed.length} installed${missing.length ? `, unknown: ${missing.join(", ")}` : ""}`);
|
|
223
|
+
if (!installed.length) {
|
|
224
|
+
console.error("Nothing was installed — check skill names with --list.");
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
168
227
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
installed++;
|
|
228
|
+
if (withMcp) {
|
|
229
|
+
for (const t of targets) {
|
|
230
|
+
const res = t === "claude" ? registerMcpClaude() : registerMcpCodex();
|
|
231
|
+
console.log(`MCP [${t}]: ${res.note}`);
|
|
174
232
|
}
|
|
175
|
-
|
|
176
|
-
cpSync(src, dest, { recursive: true });
|
|
177
|
-
console.log(` ${exists ? "↻" : "+"} ${name}`);
|
|
178
233
|
}
|
|
179
234
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
console.log(` Location: ${CLAUDE_SKILLS_DIR}`);
|
|
184
|
-
console.log();
|
|
185
|
-
console.log("Skills are now available in Claude Code.");
|
|
186
|
-
console.log("Use /skill-name to invoke, or Claude will use them automatically.\n");
|
|
235
|
+
const next = flags.bundle ? BUNDLES[flags.bundle].next_step
|
|
236
|
+
: "Restart your agent session to pick up the new skills.";
|
|
237
|
+
console.log(`\nDone. Next step: ${next}\n`);
|
package/bundles.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"gtm": {
|
|
3
|
+
"description": "GTM package: CRM enrichment, signals, prospecting and account intelligence workflows for the anysite MCP + CRM integration",
|
|
4
|
+
"next_step": "Restart your agent session, then say: /anysite-crm-setup — it connects your CRM and configures field mapping.",
|
|
5
|
+
"skills": [
|
|
6
|
+
"anysite-mcp",
|
|
7
|
+
"anysite-crm-setup",
|
|
8
|
+
"anysite-crm-enrich",
|
|
9
|
+
"anysite-crm-signals",
|
|
10
|
+
"anysite-crm-champions",
|
|
11
|
+
"anysite-crm-prospect",
|
|
12
|
+
"anysite-crm-audit",
|
|
13
|
+
"anysite-crm-score",
|
|
14
|
+
"anysite-crm-competitor-intel",
|
|
15
|
+
"anysite-crm-account-brief",
|
|
16
|
+
"anysite-crm-lookalikes"
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anysiteio/agent-skills",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Official anysite agent skills
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Official anysite agent skills + one-line setup: installs skills into Claude Code / Codex and registers the anysite remote MCP server. Includes the GTM bundle (CRM enrichment, signals, prospecting).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
7
7
|
"claude-code",
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"skills/",
|
|
33
33
|
".claude-plugin/",
|
|
34
34
|
"bin/",
|
|
35
|
+
"bundles.json",
|
|
35
36
|
"README.md",
|
|
36
37
|
"LICENSE"
|
|
37
38
|
],
|