Skip to content
Night Owls.dev
Jump to a page

@nightowlsdev/agent-designer

Pre-built agents

Design 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-designer

Key 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

agent-designer.ts
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