@nightowlsdev/agent-marketer
Pre-built agentsProduct-in-market analysis, positioning + ICP, evidence-based competitor profiling, channels as prioritized bets, that asks for what it lacks instead of inventing it.
What it does
@nightowlsdev/agent-marketer ships the marketing specialist: positioning before tactics ('instead of what?'), ICPs that name who it is NOT for, competitor profiles that distinguish 'their site claims X' from 'users report X' from 'I infer X', and launch strategy as prioritized bets with a cheap first test each. Its evidence boundary is stated every time: webSearch is OPTIONAL, without it the persona works strictly from the materials you provide and says so up front; fabricated numbers are banned. `createMarketingCrew` composes the marketer with a researcher delegate as a closure-validated bundle (`requires` + `requiresSkills` declarations ride the bundle store). Curated skills.sh refs (pinned): the most-installed marketing corpus on skills.sh, a default-granted core (product-marketing, competitor-profiling, customer-research, marketing-psychology, content-strategy, marketing-plan, Lenny positioning-messaging, Anthropic brand-voice-enforcement) and a manifest-only growth set (seo-audit, ai-seo, programmatic-seo, ad-creative, cold-email, launch).
Install
pnpm add @nightowlsdev/agent-marketerKey exports
- createMarketer ({ tools?: { webSearch? } }, optional, degrades honestly)
- createMarketingCrew (BundleDef: marketer + a declared researcher delegate)
- manifest / MARKETER_CURATED_SKILLS (the Corey Haines corpus, core + growth sets, pinned)
Usage
import { createMarketer, createMarketingCrew } from "@nightowlsdev/agent-marketer";
import { createResearcher } from "@nightowlsdev/agent-researcher";
import { mergeBundle } from "@nightowlsdev/core";
// Solo: webSearch OPTIONAL, without it the persona works strictly from supplied materials and says so.
const marketer = createMarketer();
// Or the composed crew: the bundle DECLARES a researcher dependency; the host provides the agent.
const researcher = createResearcher({ tools: { webSearch: myWebSearchTool } });
const crew = createMarketingCrew({ researcherSlug: "researcher" });
const config = mergeBundle({ ...baseConfig, agents: [...baseConfig.agents, researcher] }, crew);
// baseConfig needs dynamicSkills + a tier config, the full journey: /docs/adopt-prebuilt-agentsWhat it provides
agent-marketer is a pre-built marketing specialist: positioning before tactics ('instead of what?'), ICPs that name who it is NOT for, evidence-based competitor profiles, and launch strategy as prioritized bets with a cheap first test each. Its evidence boundary is stated every time and fabricated numbers are banned — it distinguishes 'their site claims X' from 'users report X' from 'I infer X', and asks for the product context it lacks instead of inventing it. webSearch is optional; without it it works strictly from your supplied materials and says so up front.
When to use it
- You want product-in-market analysis: positioning, ICP + exclusions, competitor profiling, channel/launch strategy, pricing/offer framing.
- You want an agent that refuses to fabricate market numbers and keeps 'claims' vs 'reports' vs 'inference' distinct.
- You want to compose marketing analysis with deep research — createMarketingCrew declares a researcher delegate for source-gathering.
When not to
- You want the copy/content itself — that's agent-writer (strategy → execution).
- You want cited primary-source gathering — that's agent-researcher; the marketer analyzes, it isn't a research harness.
- You expect live competitor data without wiring search — solo-with-no-web degrades to your supplied materials on purpose.
Alternatives
- agent-writerYou already have the strategy and need on-voice copy/content produced — the writer executes what the marketer decides.
- agent-researcherYou need cited primary-source gathering rather than positioning/ICP analysis — or wire it as the marketer's delegate via createMarketingCrew.
Strengths
- Evidence boundary stated every time: fabricated numbers are banned and the three-way distinction (claims / reports / inference) is enforced in the persona.
- Honest degraded mode: without webSearch it works strictly from supplied materials and says so up front, rather than pretending to have market data.
- createMarketingCrew composes the marketer with a researcher delegate as a closure-validated BundleDef — requires (the external researcher, with a minVersion floor) + requiresSkills (the stored grants) ride the bundle; slug/title are overridable for multi-instance hosts.
- Curated Corey Haines marketing corpus: a default-granted CORE set (product-marketing, competitor-profiling, customer-research, marketing-psychology, content-strategy, marketing-plan + Lenny positioning-messaging + Anthropic brand-voice) plus a manifest-only GROWTH set you grant per engagement via grantSkillNames.
Limits & trade-offs
- It analyzes; it doesn't execute — no copy, no images, no code. Pair it with agent-writer / agent-designer.
- Live competitor sweeps need search wired (solo webSearch, or the researcher delegate) — solo-with-no-web is deliberately limited to your materials.
- createMarketingCrew DECLARES a researcher dependency but doesn't ship it — the researcher (from @nightowlsdev/agent-researcher) must exist in the swarm at runtime or the bundle dependency is unmet.
- Analysis quality tracks the context you give it — a thin brief yields questions before answers.
How it works
createMarketer({ tools? }) merges the marketing persona with your options; webSearch is optional and, when absent, the persona commits to your supplied materials. createMarketingCrew adds a declared researcher delegate: it calls createMarketer with the researcher slug added to delegates and returns a defineBundle whose requires names the external researcher (minVersion) and whose requiresSkills is derived from the grant source of truth — a closure-validated BundleDef you mergeBundle into your base config. The researcher itself ships in @nightowlsdev/agent-researcher and must be published in the same swarm.
Examples
Solo marketer — honest degraded mode
Without webSearch it works strictly from supplied materials and says so.
import { createMarketer } from "@nightowlsdev/agent-marketer";
const marketer = createMarketer();
const marketerWithWeb = createMarketer({ tools: { webSearch: myWebSearchTool } });The composed crew: marketer + declared researcher delegate
The crew declares the dependency; the host provides the researcher agent in the same swarm.
import { createMarketingCrew } from "@nightowlsdev/agent-marketer";
import { createResearcher } from "@nightowlsdev/agent-researcher";
import { mergeBundle } from "@nightowlsdev/core";
const researcher = createResearcher({ tools: { webSearch: myWebSearchTool } });
const crew = createMarketingCrew({ researcherSlug: "researcher" });
const config = mergeBundle(
{ ...baseConfig, agents: [...baseConfig.agents, researcher] },
crew,
);Grant the manifest-only GROWTH set for a specific engagement
grantSkillNames overrides the default CORE grants.
import { createMarketer } from "@nightowlsdev/agent-marketer";
const launchMarketer = createMarketer({
grantSkillNames: ["product-marketing", "launch", "ad-creative"],
});Doing the parts it doesn't support
- Writing the actual copyThe marketer sets strategy; hand execution to @nightowlsdev/agent-writer — the two are designed to pair (strategy → execution).
- Live competitor researchPass tools.webSearch for a solo sweep, or use createMarketingCrew to delegate deep, cited source-gathering to a researcher.
- Running multiple marketer instancesPass slug/title (and marketer.slug) to createMarketingCrew so each crew instance is distinct in the bundle store.
Related
- agent-researcher — The delegate createMarketingCrew declares for deep source-gathering.
- agent-writer — Executes the marketer's strategy as on-voice copy.
- capability-bundles — createMarketingCrew returns a closure-validated BundleDef — the bundle mechanics.
- agent-kit — The curated-skill import + grant helpers behind the Corey Haines corpus.
- adopt-prebuilt-agents — The four-step host-wiring journey.