@nightowlsdev/agent-designer
Pre-built agentsDesign directions you choose from: proposes 2-3 named approaches via the ask tool, then applies the chosen one from an 18-skill curated design library read on demand, impeccable, ui-ux-pro-max, the taste-skill family.
What it does
@nightowlsdev/agent-designer solves 'give the design agent ALL the skills' without prompt explosion: a small taste core (design-taste-frontend, Vercel web-design-guidelines) is always granted, and the full curated library, Anthropic frontend-design/canvas-design/brand-guidelines, ui-ux-pro-max, the taste-skill family (high-end, minimalist, brutalist, brandkit, redesign), the impeccable family (impeccable, critique, audit, typeset, layout), extract-design-system, design-an-interface, rides the kit's skill_library_list/read tools: held at ~zero prompt cost, read on demand as fenced third-party reference, scoped to the curated names (never whole-tenant). The flow is human-in-the-loop by design: interrogate the project's goal, survey the library, propose 2-3 NAMED approaches with trade-offs via the built-in ask tool, and only after the human picks, read that approach's skills and deliver a complete design direction, typography, color, spacing, per-section wireframes, component inventory, and the five don'ts that would break it. Structured text out; no image generation, no code emission.
Install
pnpm add @nightowlsdev/agent-designerKey exports
- createDesigner ({ skillLibrary?: SkillRepo, libraryNames? })
- manifest / DESIGNER_CURATED_SKILLS (18 pinned refs: taste core + approach library)
- DESIGNER_PERSONA (interrogate → propose via ask → read on demand → layout spec)
Usage
import { createDesigner, manifest } from "@nightowlsdev/agent-designer";
import { importCuratedSkills, PREBUILT_READONLY_TOOL_NAMES } from "@nightowlsdev/agent-kit";
import { materializeSkillStore, skillsShProvider } from "@nightowlsdev/skills";
import { defineSwarm, DEFAULT_READ_ONLY_TOOLS } from "@nightowlsdev/core";
// 1. Import the 18-skill design library once per tenant (impeccable, ui-ux-pro-max, taste-skill…).
await importCuratedSkills({ sets: manifest.curatedSkills, providers: { "skills.sh": skillsShProvider() }, storage, tenantId, actor });
// 2. The designer holds the library at ~zero prompt cost (skill_library_list/read, fenced,
// curated-scoped), proposes 2-3 named approaches via the ask tool, and applies the pick.
const designer = createDesigner({ skillLibrary: storage.skills });
const swarm = defineSwarm({
storage,
agents: [designer],
dynamicSkills: materializeSkillStore(storage.skills), // the always-on taste core injects via grants
models: { allow: ["openai/gpt-5.5-mini"], tier: { tiers: { swift: "openai/gpt-5.5-mini" } } },
modelFactory,
cost: { maxSteps: 30, maxCostUsd: 0.5 },
// strict hosts: allowlist the read-only library tools so reads don't suspend
toolApproval: { mode: "all-side-effecting", readOnly: [...DEFAULT_READ_ONLY_TOOLS, ...PREBUILT_READONLY_TOOL_NAMES] },
});
// The full journey: /docs/adopt-prebuilt-agents