@nightowlsdev/agent-writer
Pre-built agentsContent + copy craft, tool-less by design: brief-first, on-voice, channel-native, and fabrication-free (a missing fact becomes a [placeholder: …] the human fills, never a plausible invention).
What it does
@nightowlsdev/agent-writer is the pure craft agent that pairs with the marketer (strategy → execution) and the designer (copy for approved layouts). Brief-first: audience, goal, channel, length, voice, it asks when the brief is silent instead of drafting generically. It matches an existing brand voice (and says what it matched) or proposes one in a sentence and holds it; it structures before it writes (one idea, one CTA, three options for the load-bearing lines); it edits as a separate pass; and it respects channel-native formats. The fabrication ban is absolute, no invented testimonials, statistics, names, or claims; strategy questions defer to the marketer. Six curated craft refs (pinned skills.sh snapshots) granted by default.
Install
pnpm add @nightowlsdev/agent-writerKey exports
- createWriter (voice/tone via personalityAppend; grants narrow via grantSkillNames)
- manifest / WRITER_CURATED_SKILLS (copywriting, copy-editing, content-strategy, emails, social, brand-voice, pinned)
Usage
import { createWriter, manifest } from "@nightowlsdev/agent-writer";
import { importCuratedSkills } from "@nightowlsdev/agent-kit";
import { materializeSkillStore, skillsShProvider } from "@nightowlsdev/skills";
import { defineSwarm } from "@nightowlsdev/core";
// Tool-less craft agent: brief-first, on-voice, fabrication-free ([placeholder: …] over invention).
const writer = createWriter({
personalityAppend: "Voice: dry, en-GB, no exclamation marks.", // your house style rides on top
grantSkillNames: ["copywriting", "copy-editing"], // narrow the curated grants if you like
});
// Its craft skills are stored grants, import once, inject at runtime (tier config still required).
await importCuratedSkills({ sets: manifest.curatedSkills, providers: { "skills.sh": skillsShProvider() }, storage, tenantId, actor });
const swarm = defineSwarm({
storage,
agents: [writer],
dynamicSkills: materializeSkillStore(storage.skills),
models: { allow: ["openai/gpt-5.5-mini"], tier: { tiers: { swift: "openai/gpt-5.5-mini" } } },
modelFactory,
cost: { maxSteps: 30, maxCostUsd: 0.5 },
});
// Pairs with the marketer (strategy) and designer (layouts), the full journey: /docs/adopt-prebuilt-agents