install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/adarshvmore/marketing-orchestrator-adarsh" ~/.claude/skills/openclaw-skills-marketing-orchestrator-adarsh && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/adarshvmore/marketing-orchestrator-adarsh" ~/.openclaw/skills/openclaw-skills-marketing-orchestrator-adarsh && rm -rf "$T"
manifest:
skills/adarshvmore/marketing-orchestrator-adarsh/SKILL.mdsource content
Marketing Orchestrator Skill
Purpose
Orchestrates the marketing audit pipeline by sequentially running the following collector agents:
- Instagram Collector
- Meta Ads Collector
- SEO / Keyword Collector
- Competitor Finder
- Website Audit Collector
Aggregates the individual results and invokes the Report Generator skill to produce the final comprehensive marketing audit report.
Input Schema
interface MarketingInput { instagramHandle?: string; websiteDomain?: string; }
Output Schema
interface MarketingAuditReport { reportMarkdown: string; rawData: any; error?: string; }
Implementation Pattern
- Validate input: either
orinstagramHandle
is requiredwebsiteDomain - Sequentially call each collector skill, passing relevant input
- Collect results in a composite data object
- Call report-generator skill with the aggregated data
- Return the final report markdown and raw data
Example Usage
const input = { instagramHandle: 'gymshark', websiteDomain: 'gymshark.com' }; const report = await marketingOrchestrator(input); console.log(report.reportMarkdown);
Orchestration Logic (Pseudocode)
async function marketingOrchestrator(input: MarketingInput): Promise<MarketingAuditReport> { if (!input.instagramHandle && !input.websiteDomain) { throw new Error("Either instagramHandle or websiteDomain is required"); } const auditData: any = { input, collectedAt: new Date().toISOString(), }; if (input.instagramHandle) { auditData.instagram = await runSkill('instagram-collector', { handle: input.instagramHandle }); } if (input.websiteDomain) { auditData.metaAds = await runSkill('meta-ads-collector', { brandName: input.websiteDomain, domain: input.websiteDomain }); auditData.keywords = await runSkill('seo-collector', { domain: input.websiteDomain }); auditData.competitors = await runSkill('competitor-finder', { brandName: input.websiteDomain, domain: input.websiteDomain }); auditData.websiteAudit = await runSkill('website-audit', { domain: input.websiteDomain }); } const report = await runSkill('report-generator', auditData); return { reportMarkdown: report.reportMarkdown, rawData: auditData, }; }
Notes
- Each runSkill call corresponds to invoking another skill as a sub-agent or subprocess.
- The calling framework should handle API keys, env vars for external services.
- Errors in individual collectors should not block the overall orchestration.
- Extend as needed for additional collectors or data sources.