From 5203d7bf7f5f27ea5ce20812a044bc521ae6f021 Mon Sep 17 00:00:00 2001 From: Sawyer Date: Sun, 4 Oct 2026 23:46:33 -0700 Subject: [PATCH 01/11] feat(designer): ship designer as a workspace agent package Extract src/agent/directors/designer/package.ts into the @corbits/agent-designer workspace package with a byte-identical system prompt and a self-contained tool allowlist. The registry imports the workspace copy; drift against the app build surface fails src/agent/directors/designer/package.test.ts. Fixes CL-9798. --- agents/designer/package.json | 13 +++++ .../designer/src/index.ts | 53 ++++++++++++++++--- package.json | 1 + src/agent/directors/designer/package.test.ts | 26 +++++++++ src/agent/directors/registry.ts | 2 +- 5 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 agents/designer/package.json rename src/agent/directors/designer/package.ts => agents/designer/src/index.ts (71%) create mode 100644 src/agent/directors/designer/package.test.ts diff --git a/agents/designer/package.json b/agents/designer/package.json new file mode 100644 index 000000000..1461a90cc --- /dev/null +++ b/agents/designer/package.json @@ -0,0 +1,13 @@ +{ + "name": "@corbits/agent-designer", + "version": "0.1.0", + "private": true, + "type": "module", + "license": "SEE LICENSE IN LICENSE.md", + "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + } + } +} diff --git a/src/agent/directors/designer/package.ts b/agents/designer/src/index.ts similarity index 71% rename from src/agent/directors/designer/package.ts rename to agents/designer/src/index.ts index a3f73f68e..59b19f2a5 100644 --- a/src/agent/directors/designer/package.ts +++ b/agents/designer/src/index.ts @@ -1,12 +1,49 @@ -import type { DirectorPackage } from "../types.js"; -import { BUILD_TOOLS } from "../tool-sets.js"; - /** * Designer worker: UI/UX design engineering specialist. * Owns DESIGN.md creation and updates, impeccable.style design laws, * design tokens, typography, spatial layout, and micro-interaction polish. + * + * Ships as the @corbits/agent-designer workspace package: the tool allowlist + * lives here so the package stays importable without the app. Drift against + * the app build surface fails src/agent/directors/designer/package.test.ts. */ -export const designerPackage: DirectorPackage = { +export type AgentPackage = { + readonly id: "designer"; + readonly primaryIntent: string; + readonly outOfLane: readonly string[]; + readonly description: string; + readonly systemPrompt: string; + /** Unset — designer never attaches skill bodies at spawn. */ + readonly attachedSkills?: readonly string[]; + /** Unset — designer declares no skill scope. */ + readonly optionalSkills?: readonly string[]; + readonly tools: { + readonly allow: readonly string[]; + }; + readonly spawn: { + readonly maySpawn: false; + }; + readonly modelRole: "implement"; + readonly tier: "leaf"; +}; + +const DESIGNER_TOOLS = [ + "read_file", + "grep", + "search_files", + "list_dir", + "lsp", + "run_shell", + "web_fetch", + "web_search", + "skill_search", + "use_skill", + "write_file", + "edit_file", + "delete_file", +] as const; + +export const designerPackage: AgentPackage = { id: "designer", primaryIntent: "Own DESIGN.md create/use, design tokens, UI styling, and impeccable.style design engineering", @@ -18,10 +55,6 @@ export const designerPackage: DirectorPackage = { ], description: "UI/UX designer — owns DESIGN.md, impeccable style design laws, tokens, and interface polish", - tools: { allow: BUILD_TOOLS }, - spawn: { maySpawn: false }, - tier: "leaf", - modelRole: "implement", systemPrompt: `You are DesignerDirector (Designer), a specialist in Corbits Code. PRIMARY INTENT: own interface design, design tokens, styling, and DESIGN.md. You bring design engineering excellence to UI surfaces — layout rhythm, typography, purposeful motion, responsive states, and cohesive design systems. @@ -45,4 +78,8 @@ Workflow: 4. Report changes with Summary / Findings / Blockers / Paths. OUT OF LANE: backend business logic or database migrations, general backend defect review, marketing content pipelines, fleet orchestration.`, + tools: { allow: [...DESIGNER_TOOLS] }, + spawn: { maySpawn: false }, + tier: "leaf", + modelRole: "implement", }; diff --git a/package.json b/package.json index c427a0851..ff5c554c8 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "tar": "^7.5.1" }, "dependencies": { + "@corbits/agent-designer": "workspace:*", "@corbits/codex-provider": "0.1.1", "@corbits/oauth-core": "0.2.0", "@corbits/openai-responses": "0.2.1", diff --git a/src/agent/directors/designer/package.test.ts b/src/agent/directors/designer/package.test.ts new file mode 100644 index 000000000..c0584884a --- /dev/null +++ b/src/agent/directors/designer/package.test.ts @@ -0,0 +1,26 @@ +import { describe, expect, test } from "bun:test"; + +import { designerPackage } from "@corbits/agent-designer"; +import { BUILD_TOOLS } from "../tool-sets.js"; +import { DIRECTOR_REGISTRY } from "../registry.js"; +import type { DirectorPackage } from "../types.js"; + +describe("designerPackage", () => { + test("workspace package satisfies the director contract and feeds the registry", () => { + const asDirector: DirectorPackage = designerPackage; + expect(asDirector.id).toBe("designer"); + expect(DIRECTOR_REGISTRY.designer).toBe(designerPackage); + expect([...designerPackage.tools.allow]).toEqual([...BUILD_TOOLS]); + }); + + test("extracted copy stays build-scoped and non-spawning", () => { + expect(designerPackage.tools.allow).toContain("write_file"); + expect(designerPackage.tools.allow).toContain("edit_file"); + expect(designerPackage.tools.allow).toContain("delete_file"); + expect(designerPackage.tools.allow).not.toContain("spawn_agent"); + expect(designerPackage.tools.allow).not.toContain("ask_operator"); + expect(designerPackage.spawn.maySpawn).toBe(false); + expect(designerPackage.tier).toBe("leaf"); + expect(designerPackage.modelRole).toBe("implement"); + }); +}); diff --git a/src/agent/directors/registry.ts b/src/agent/directors/registry.ts index ddf5fc0b3..7c9a8d927 100644 --- a/src/agent/directors/registry.ts +++ b/src/agent/directors/registry.ts @@ -5,7 +5,7 @@ import { director as wardenDirector } from "@corbits/code-agent-warden"; import type { AgentProfile, CapabilityFilter } from "../profile-types.js"; import { director as artistDirector } from "@corbits/code-agent-artist"; import { coderPackage } from "./coder/package.js"; -import { designerPackage } from "./designer/package.js"; +import { designerPackage } from "@corbits/agent-designer"; import { explorerPackage } from "./explorer/package.js"; import { plannerPackage } from "./planner/package.js"; import { qaLeadPackage } from "./qa-lead/package.js"; From c291d75bdc298806c5be340766fdba9c3b9ad083 Mon Sep 17 00:00:00 2001 From: Sawyer Cutler Date: Thu, 8 Oct 2026 14:00:07 -0700 Subject: [PATCH 02/11] chore(designer): rename package to @corbits/code-agent-designer --- agents/designer/package.json | 2 +- agents/designer/src/index.ts | 2 +- bun.lock | 5 +++++ package.json | 2 +- src/agent/directors/designer/package.test.ts | 2 +- tsconfig.json | 1 + 6 files changed, 10 insertions(+), 4 deletions(-) diff --git a/agents/designer/package.json b/agents/designer/package.json index 1461a90cc..2779dd051 100644 --- a/agents/designer/package.json +++ b/agents/designer/package.json @@ -1,5 +1,5 @@ { - "name": "@corbits/agent-designer", + "name": "@corbits/code-agent-designer", "version": "0.1.0", "private": true, "type": "module", diff --git a/agents/designer/src/index.ts b/agents/designer/src/index.ts index 59b19f2a5..ab7b283c4 100644 --- a/agents/designer/src/index.ts +++ b/agents/designer/src/index.ts @@ -3,7 +3,7 @@ * Owns DESIGN.md creation and updates, impeccable.style design laws, * design tokens, typography, spatial layout, and micro-interaction polish. * - * Ships as the @corbits/agent-designer workspace package: the tool allowlist + * Ships as the @corbits/code-agent-designer workspace package: the tool allowlist * lives here so the package stays importable without the app. Drift against * the app build surface fails src/agent/directors/designer/package.test.ts. */ diff --git a/bun.lock b/bun.lock index 46e1bed4f..20a8af9bd 100644 --- a/bun.lock +++ b/bun.lock @@ -68,6 +68,10 @@ "name": "@corbits/code-agent-warden", "version": "0.1.0", }, + "agents/designer": { + "name": "@corbits/agent-designer", + "version": "0.1.0", + }, "packages/first-class-providers": { "name": "@corbits/first-class-providers", "version": "0.1.0", @@ -264,6 +268,7 @@ "@corbits/code-agent-prober": ["@corbits/code-agent-prober@workspace:agents/prober"], "@corbits/code-agent-dispatch": ["@corbits/code-agent-dispatch@workspace:agents/dispatch"], "@corbits/code-agent-warden": ["@corbits/code-agent-warden@workspace:agents/warden"], + "@corbits/agent-designer": ["@corbits/agent-designer@workspace:agents/designer"], "@corbits/codex-provider": ["@corbits/codex-provider@0.1.1", "", { "dependencies": { "arktype": "^2.2.3" }, "peerDependencies": { "@corbits/oauth-core": "^0.2.0", "@corbits/openai-responses": "^0.2.0", "@intx/inference": "^0.4.0", "@intx/types": "^0.4.0" } }, "sha512-MiGA5djQNtRpHqLvJAGdFgHEbUl808AbveMPwt7krLjOH0i20DyElpitHPZF3ltCXkFMhcKIoyTAEpRDqeB/Rw=="], diff --git a/package.json b/package.json index ff5c554c8..a97795654 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "tar": "^7.5.1" }, "dependencies": { - "@corbits/agent-designer": "workspace:*", + "@corbits/code-agent-designer": "workspace:*", "@corbits/codex-provider": "0.1.1", "@corbits/oauth-core": "0.2.0", "@corbits/openai-responses": "0.2.1", diff --git a/src/agent/directors/designer/package.test.ts b/src/agent/directors/designer/package.test.ts index c0584884a..015569b03 100644 --- a/src/agent/directors/designer/package.test.ts +++ b/src/agent/directors/designer/package.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test"; -import { designerPackage } from "@corbits/agent-designer"; +import { designerPackage } from "@corbits/code-agent-designer"; import { BUILD_TOOLS } from "../tool-sets.js"; import { DIRECTOR_REGISTRY } from "../registry.js"; import type { DirectorPackage } from "../types.js"; diff --git a/tsconfig.json b/tsconfig.json index 10efbac6e..31455b6e4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,7 @@ "@corbits/code-agent-prober": ["./agents/prober/src/index.ts"], "@corbits/code-agent-dispatch": ["./agents/dispatch/src/index.ts"], "@corbits/code-agent-warden": ["./agents/warden/src/index.ts"], + "@corbits/agent-designer": ["./agents/designer/src/index.ts"], "@corbits/provider-opencode-go": ["./packages/opencode-go/src/index.ts"], "@corbits/first-class-providers": [ "./packages/first-class-providers/src/index.ts" From 0a85ebdffd172db0a413fb0c6198011bff7219d0 Mon Sep 17 00:00:00 2001 From: Sawyer Date: Thu, 8 Oct 2026 19:47:44 -0700 Subject: [PATCH 03/11] feat(agent-designer): adopt uniform reusable agent template shape --- agents/designer/README.md | 48 ++++++++++ agents/designer/src/agent.ts | 26 ++++++ agents/designer/src/config.ts | 14 +++ agents/designer/src/director.ts | 28 ++++++ agents/designer/src/index.ts | 94 ++------------------ agents/designer/src/prompt.ts | 35 ++++++++ agents/designer/src/toolset.ts | 23 +++++ agents/designer/tsconfig.json | 7 ++ package.json | 1 - src/agent/directors/designer/package.test.ts | 54 ++++++++--- src/agent/directors/registry.ts | 4 +- 11 files changed, 232 insertions(+), 102 deletions(-) create mode 100644 agents/designer/README.md create mode 100644 agents/designer/src/agent.ts create mode 100644 agents/designer/src/config.ts create mode 100644 agents/designer/src/director.ts create mode 100644 agents/designer/src/prompt.ts create mode 100644 agents/designer/src/toolset.ts create mode 100644 agents/designer/tsconfig.json diff --git a/agents/designer/README.md b/agents/designer/README.md new file mode 100644 index 000000000..1a1cf2244 --- /dev/null +++ b/agents/designer/README.md @@ -0,0 +1,48 @@ +# @corbits/code-agent-designer + +## What this is + +A ready-to-go Corbits agent for the **designer** role (`@corbits/code-agent-designer`) +plus its named component parts so a consumer can recreate or remix it. Designer is +the UI/UX design engineering specialist: it owns DESIGN.md creation and updates, +impeccable.style design laws, design tokens, typography, spatial layout, and +micro-interaction polish. + +## Consume (runLocal) + +```ts +import { agent } from "@corbits/code-agent-designer"; +const run = runLocal(defining(agent), env); +``` + +## Consume (deploy runWorkflow / hub / sidecar) + +Hand the same `AgentDefinition` (`agent`) to a workflow, hub, or sidecar. The +package never exports a workflow itself — a workflow _consumes_ `agent`. + +## Remix components + +```ts +import { + director, + tools, + systemPrompt, + config, + defineAgent, +} from "@corbits/code-agent-designer"; + +// Swap components at the consumer side. +defineAgent({ director, tools, systemPrompt, config }); // or spread overrides +``` + +Each of `agent`, `defineAgent`, `director`, `tools`, `systemPrompt`, `config` is a +named, independently importable part. + +## Byte-stability & single authority + +- `systemPrompt.build()` is pure and byte-stable — identical string every call. +- `tools` is content-equal to the app's `REVIEW_TOOLS` surface constant + (`src/agent/directors/tool-sets.ts`); the in-tree drift-guard + (`src/agent/directors/designer/package.test.ts`) enforces they match. +- This package is the single prompt authority for designer; the in-tree + `src/agent/directors/designer/package.ts` is deleted. diff --git a/agents/designer/src/agent.ts b/agents/designer/src/agent.ts new file mode 100644 index 000000000..1784a679f --- /dev/null +++ b/agents/designer/src/agent.ts @@ -0,0 +1,26 @@ +// Designer assembled agent — ready unit + package defineAgent wrapper. +// Calls `@intx/agent`'s `defineAgent` directly (no Corbits bridge/helper layer). +// Tool mounting is consumer/app-side: `tools` here is [] (the allowlist surface +// is exported from `./toolset.js` and wired by the app harness). + +import { + defineAgent as coreDefineAgent, + type AgentDefinition, +} from "@intx/agent"; + +import { systemPrompt } from "./prompt.js"; + +/** The assembled designer agent — ready to hand to `runLocal` / `runWorkflow`. */ +export const agent: AgentDefinition = defineAgent(); + +/** Package convenience wrapper → `AgentDefinition` for `runLocal` authoring. */ +export function defineAgent(): AgentDefinition { + return coreDefineAgent({ + id: "designer", + systemPrompt: systemPrompt.build(), + tools: [], + capabilities: [], + inference: { sources: [] }, + tags: { fleet: "0.3.36", lane: "designer" }, + }); +} diff --git a/agents/designer/src/config.ts b/agents/designer/src/config.ts new file mode 100644 index 000000000..78ef99a52 --- /dev/null +++ b/agents/designer/src/config.ts @@ -0,0 +1,14 @@ +// Designer config — uniform `{ spawn, tier, modelRole }` shape (§5). +// designer is a leaf worker: maySpawn false, no allowlist. +// modelRole is "implement" (matches the in-tree card). +export const config = { + spawn: { + maySpawn: false, + }, + tier: "leaf", + modelRole: "implement", +} as const satisfies { + spawn: { maySpawn: boolean; allowlist?: readonly string[] }; + tier: string; + modelRole: string; +}; diff --git a/agents/designer/src/director.ts b/agents/designer/src/director.ts new file mode 100644 index 000000000..4f3cfafd7 --- /dev/null +++ b/agents/designer/src/director.ts @@ -0,0 +1,28 @@ +// Designer director card — the `DirectorPackage` data, extracted byte-for-byte +// from the in-tree `src/agent/directors/designer/package.ts` (now deleted). +// Structurally satisfies the app's `DirectorPackage` (asserted in-tree by +// `src/agent/directors/designer/package.test.ts`); it imports @intx/* only. + +import { tools } from "./toolset.js"; +import { systemPrompt } from "./prompt.js"; +import { config } from "./config.js"; + +/** The assembled designer director card. */ +export const director = { + id: "designer", + primaryIntent: + "Own DESIGN.md create/use, design tokens, UI styling, and impeccable.style design engineering", + outOfLane: [ + "backend architecture and database schema design", + "general backend code defect review", + "marketing publish campaigns", + "orchestrating or spawning other agents", + ], + description: + "UI/UX designer — owns DESIGN.md, impeccable style design laws, tokens, and interface polish", + systemPrompt: systemPrompt.build(), + tools: { allow: tools }, + spawn: config.spawn, + modelRole: config.modelRole, + tier: config.tier, +} as const; diff --git a/agents/designer/src/index.ts b/agents/designer/src/index.ts index ab7b283c4..bd370bcbb 100644 --- a/agents/designer/src/index.ts +++ b/agents/designer/src/index.ts @@ -1,85 +1,9 @@ -/** - * Designer worker: UI/UX design engineering specialist. - * Owns DESIGN.md creation and updates, impeccable.style design laws, - * design tokens, typography, spatial layout, and micro-interaction polish. - * - * Ships as the @corbits/code-agent-designer workspace package: the tool allowlist - * lives here so the package stays importable without the app. Drift against - * the app build surface fails src/agent/directors/designer/package.test.ts. - */ -export type AgentPackage = { - readonly id: "designer"; - readonly primaryIntent: string; - readonly outOfLane: readonly string[]; - readonly description: string; - readonly systemPrompt: string; - /** Unset — designer never attaches skill bodies at spawn. */ - readonly attachedSkills?: readonly string[]; - /** Unset — designer declares no skill scope. */ - readonly optionalSkills?: readonly string[]; - readonly tools: { - readonly allow: readonly string[]; - }; - readonly spawn: { - readonly maySpawn: false; - }; - readonly modelRole: "implement"; - readonly tier: "leaf"; -}; - -const DESIGNER_TOOLS = [ - "read_file", - "grep", - "search_files", - "list_dir", - "lsp", - "run_shell", - "web_fetch", - "web_search", - "skill_search", - "use_skill", - "write_file", - "edit_file", - "delete_file", -] as const; - -export const designerPackage: AgentPackage = { - id: "designer", - primaryIntent: - "Own DESIGN.md create/use, design tokens, UI styling, and impeccable.style design engineering", - outOfLane: [ - "backend architecture and database schema design", - "general backend code defect review", - "marketing publish campaigns", - "orchestrating or spawning other agents", - ], - description: - "UI/UX designer — owns DESIGN.md, impeccable style design laws, tokens, and interface polish", - systemPrompt: `You are DesignerDirector (Designer), a specialist in Corbits Code. - -PRIMARY INTENT: own interface design, design tokens, styling, and DESIGN.md. You bring design engineering excellence to UI surfaces — layout rhythm, typography, purposeful motion, responsive states, and cohesive design systems. - -DESIGN.md ownership: -- Own the living design contract: DESIGN.md. Create it when missing, keep it up to date, and adhere to its token system. -- DESIGN.md specifies: color palettes and semantic tokens, typography scales, spacing and elevation systems, interaction states, motion curves, and UI voice guidelines. - -Impeccable style & design engineering laws: -1. Purposeful motion: animation must clarify spatial relationships, indicate state changes, or provide direct physical feedback. Never animate merely for decoration. -2. Frequency-aware motion: high-frequency interactions (command palettes, quick shortcuts, list navigation) must feel instant (<100ms) with zero sluggish transitions. -3. Spatial discipline & layout rhythm: establish consistent 4px/8px grid spacing, optical alignment, and balanced negative space. -4. Calm hierarchy: interfaces should visually direct attention to primary actions without competing noise, unnecessary borders, or clashing colors. -5. Accessible defaults: ensure strong contrast ratios, visible keyboard focus indicators, touch targets >= 44x44px, and semantic markup. Never rely on color alone to convey meaning. -6. Surface & token discipline: use centralized semantic tokens rather than magic hex colors or arbitrary pixel values. - -Workflow: -1. Load DESIGN.md and existing UI component tokens. If DESIGN.md is absent and in scope, draft a concise, actionable version. -2. Implement or update UI styling, design tokens, or component structure according to the brief and design principles. -3. Verify visual hierarchy, component responsiveness, and state handling (hover, focus, disabled, active, error). -4. Report changes with Summary / Findings / Blockers / Paths. - -OUT OF LANE: backend business logic or database migrations, general backend defect review, marketing content pipelines, fleet orchestration.`, - tools: { allow: [...DESIGNER_TOOLS] }, - spawn: { maySpawn: false }, - tier: "leaf", - modelRole: "implement", -}; +// Public surface — re-exports only (no logic). Exports exactly +// `agent, defineAgent, director, tools, systemPrompt, config`. No `workflow` +// export. No Corbits shared package is re-exported; the package's `director` +// structurally satisfies the app's `DirectorPackage` (app-side drift-guard). +export { agent, defineAgent } from "./agent.js"; +export { director } from "./director.js"; +export { tools } from "./toolset.js"; +export { systemPrompt } from "./prompt.js"; +export { config } from "./config.js"; diff --git a/agents/designer/src/prompt.ts b/agents/designer/src/prompt.ts new file mode 100644 index 000000000..c7f6529b5 --- /dev/null +++ b/agents/designer/src/prompt.ts @@ -0,0 +1,35 @@ +// Designer card — the single prompt authority, extracted byte-for-byte from the +// in-tree `src/agent/directors/designer/package.ts` (now deleted). `build()` is +// pure and byte-stable: it returns an identical string on every call. +const CARD = `You are DesignerDirector (Designer), a specialist in Corbits Code. + +PRIMARY INTENT: own interface design, design tokens, styling, and DESIGN.md. You bring design engineering excellence to UI surfaces — layout rhythm, typography, purposeful motion, responsive states, and cohesive design systems. + +DESIGN.md ownership: +- Own the living design contract: DESIGN.md. Create it when missing, keep it up to date, and adhere to its token system. +- DESIGN.md specifies: color palettes and semantic tokens, typography scales, spacing and elevation systems, interaction states, motion curves, and UI voice guidelines. + +Impeccable style & design engineering laws: +1. Purposeful motion: animation must clarify spatial relationships, indicate state changes, or provide direct physical feedback. Never animate merely for decoration. +2. Frequency-aware motion: high-frequency interactions (command palettes, quick shortcuts, list navigation) must feel instant (<100ms) with zero sluggish transitions. +3. Spatial discipline & layout rhythm: establish consistent 4px/8px grid spacing, optical alignment, and balanced negative space. +4. Calm hierarchy: interfaces should visually direct attention to primary actions without competing noise, unnecessary borders, or clashing colors. +5. Accessible defaults: ensure strong contrast ratios, visible keyboard focus indicators, touch targets >= 44x44px, and semantic markup. Never rely on color alone to convey meaning. +6. Surface & token discipline: use centralized semantic tokens rather than magic hex colors or arbitrary pixel values. + +Workflow: +1. Load DESIGN.md and existing UI component tokens. If DESIGN.md is absent and in scope, draft a concise, actionable version. +2. Implement or update UI styling, design tokens, or component structure according to the brief and design principles. +3. Verify visual hierarchy, component responsiveness, and state handling (hover, focus, disabled, active, error). +4. Report changes with Summary / Findings / Blockers / Paths. + +OUT OF LANE: backend business logic or database migrations, general backend defect review, marketing content pipelines, fleet orchestration.`; + +/** Stable identifier of the package's voice. */ +export const theme = "designer"; + +/** Byte-stable builder: returns the raw designer card, identical every call. */ +export const systemPrompt = { + theme, + build: (): string => CARD, +}; diff --git a/agents/designer/src/toolset.ts b/agents/designer/src/toolset.ts new file mode 100644 index 000000000..3ead1bd8c --- /dev/null +++ b/agents/designer/src/toolset.ts @@ -0,0 +1,23 @@ +// Designer UI/UX: build surface (read + product writes) — content-equal to the +// `REVIEW_TOOLS` constant in `src/agent/directors/tool-sets.ts` (the single +// tool authority; BUILD_TOOLS = REVIEW_TOOLS = READ_TOOLS + PRODUCT_WRITE_TOOLS). +// Drift is enforced by the in-tree `src/agent/directors/designer/package.test.ts` +// against `REVIEW_TOOLS`. +const BUILD_TOOLS = [ + "read_file", + "grep", + "search_files", + "list_dir", + "lsp", + "run_shell", + "web_fetch", + "web_search", + "skill_search", + "use_skill", + "write_file", + "edit_file", + "delete_file", +] as const; + +/** The designer tool allowlist — literal equal to the in-tree review/build surface. */ +export const tools: readonly string[] = [...BUILD_TOOLS]; diff --git a/agents/designer/tsconfig.json b/agents/designer/tsconfig.json new file mode 100644 index 000000000..0d7100cbc --- /dev/null +++ b/agents/designer/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "noEmit": true + }, + "include": ["src/**/*.ts"] +} diff --git a/package.json b/package.json index a97795654..c427a0851 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,6 @@ "tar": "^7.5.1" }, "dependencies": { - "@corbits/code-agent-designer": "workspace:*", "@corbits/codex-provider": "0.1.1", "@corbits/oauth-core": "0.2.0", "@corbits/openai-responses": "0.2.1", diff --git a/src/agent/directors/designer/package.test.ts b/src/agent/directors/designer/package.test.ts index 015569b03..6c3e44178 100644 --- a/src/agent/directors/designer/package.test.ts +++ b/src/agent/directors/designer/package.test.ts @@ -1,26 +1,52 @@ import { describe, expect, test } from "bun:test"; -import { designerPackage } from "@corbits/code-agent-designer"; -import { BUILD_TOOLS } from "../tool-sets.js"; +import { + director, + tools, + config, + systemPrompt, +} from "@corbits/code-agent-designer"; +import { REVIEW_TOOLS } from "../tool-sets.js"; import { DIRECTOR_REGISTRY } from "../registry.js"; import type { DirectorPackage } from "../types.js"; describe("designerPackage", () => { test("workspace package satisfies the director contract and feeds the registry", () => { - const asDirector: DirectorPackage = designerPackage; + const asDirector: DirectorPackage = director; expect(asDirector.id).toBe("designer"); - expect(DIRECTOR_REGISTRY.designer).toBe(designerPackage); - expect([...designerPackage.tools.allow]).toEqual([...BUILD_TOOLS]); + expect(DIRECTOR_REGISTRY.designer).toBe(director); + // In-tree card used BUILD_TOOLS; BUILD_TOOLS === REVIEW_TOOLS content, so + // the drift-guard asserts against REVIEW_TOOLS (the brief's surface rule). + expect([...director.tools.allow]).toEqual([...REVIEW_TOOLS]); + expect(new Set(director.tools.allow).size).toBe( + director.tools.allow.length, + ); }); - test("extracted copy stays build-scoped and non-spawning", () => { - expect(designerPackage.tools.allow).toContain("write_file"); - expect(designerPackage.tools.allow).toContain("edit_file"); - expect(designerPackage.tools.allow).toContain("delete_file"); - expect(designerPackage.tools.allow).not.toContain("spawn_agent"); - expect(designerPackage.tools.allow).not.toContain("ask_operator"); - expect(designerPackage.spawn.maySpawn).toBe(false); - expect(designerPackage.tier).toBe("leaf"); - expect(designerPackage.modelRole).toBe("implement"); + test("spawn/tier/modelRole match config", () => { + expect(director.spawn).toEqual(config.spawn); + expect(director.tier).toBe(config.tier); + expect(director.modelRole).toBe(config.modelRole); + expect(director.spawn.maySpawn).toBe(false); + expect(director.tier).toBe("leaf"); + // modelRole preserved from the in-tree card (implement, not §5 docs). + expect(director.modelRole).toBe("implement"); + }); + + test("prompt authority is byte-stable", () => { + expect(director.systemPrompt).toBe(systemPrompt.build()); + expect(systemPrompt.build()).toBe(systemPrompt.build()); + }); + + test("tools surface matches REVIEW_TOOLS and is leaf-scoped", () => { + expect([...tools]).toEqual([...REVIEW_TOOLS]); + expect(tools).not.toContain("spawn_agent"); + expect(tools).not.toContain("ask_operator"); + expect(tools).not.toContain("wait_agents"); + expect(tools).not.toContain("search_agents"); + }); + + test("tools allowlist has no duplicates", () => { + expect(new Set([...tools]).size).toBe(tools.length); }); }); diff --git a/src/agent/directors/registry.ts b/src/agent/directors/registry.ts index 7c9a8d927..f3e6adbdf 100644 --- a/src/agent/directors/registry.ts +++ b/src/agent/directors/registry.ts @@ -2,10 +2,10 @@ import { director as shakespeareDirector } from "@corbits/code-agent-shakespeare import { director as proberDirector } from "@corbits/code-agent-prober"; import { director as dispatchDirector } from "@corbits/code-agent-dispatch"; import { director as wardenDirector } from "@corbits/code-agent-warden"; +import { director as designerDirector } from "@corbits/code-agent-designer"; import type { AgentProfile, CapabilityFilter } from "../profile-types.js"; import { director as artistDirector } from "@corbits/code-agent-artist"; import { coderPackage } from "./coder/package.js"; -import { designerPackage } from "@corbits/agent-designer"; import { explorerPackage } from "./explorer/package.js"; import { plannerPackage } from "./planner/package.js"; import { qaLeadPackage } from "./qa-lead/package.js"; @@ -42,7 +42,7 @@ export const DIRECTOR_REGISTRY: Readonly> = planner: plannerPackage, coder: coderPackage, reviewer: reviewerPackage, - designer: designerPackage, + designer: designerDirector, artist: artistDirector, warden: wardenDirector, shakespeare: shakespeareDirector, From f408c645e520fb3f3a2942e065cdcd4bb1bc6289 Mon Sep 17 00:00:00 2001 From: Sawyer Date: Thu, 8 Oct 2026 20:22:43 -0700 Subject: [PATCH 04/11] style(agent-designer): strip redundant commentary from extracted package --- agents/designer/src/agent.ts | 7 ------- agents/designer/src/config.ts | 5 ++--- agents/designer/src/director.ts | 6 ------ agents/designer/src/index.ts | 4 ---- agents/designer/src/prompt.ts | 7 ++----- agents/designer/src/toolset.ts | 8 ++------ 6 files changed, 6 insertions(+), 31 deletions(-) diff --git a/agents/designer/src/agent.ts b/agents/designer/src/agent.ts index 1784a679f..9fb8348c7 100644 --- a/agents/designer/src/agent.ts +++ b/agents/designer/src/agent.ts @@ -1,8 +1,3 @@ -// Designer assembled agent — ready unit + package defineAgent wrapper. -// Calls `@intx/agent`'s `defineAgent` directly (no Corbits bridge/helper layer). -// Tool mounting is consumer/app-side: `tools` here is [] (the allowlist surface -// is exported from `./toolset.js` and wired by the app harness). - import { defineAgent as coreDefineAgent, type AgentDefinition, @@ -10,10 +5,8 @@ import { import { systemPrompt } from "./prompt.js"; -/** The assembled designer agent — ready to hand to `runLocal` / `runWorkflow`. */ export const agent: AgentDefinition = defineAgent(); -/** Package convenience wrapper → `AgentDefinition` for `runLocal` authoring. */ export function defineAgent(): AgentDefinition { return coreDefineAgent({ id: "designer", diff --git a/agents/designer/src/config.ts b/agents/designer/src/config.ts index 78ef99a52..89ef5dd70 100644 --- a/agents/designer/src/config.ts +++ b/agents/designer/src/config.ts @@ -1,6 +1,5 @@ -// Designer config — uniform `{ spawn, tier, modelRole }` shape (§5). -// designer is a leaf worker: maySpawn false, no allowlist. -// modelRole is "implement" (matches the in-tree card). +// Designer is a leaf worker: maySpawn false, no allowlist. modelRole is +// "implement" (matches the in-tree card). export const config = { spawn: { maySpawn: false, diff --git a/agents/designer/src/director.ts b/agents/designer/src/director.ts index 4f3cfafd7..47a5432a5 100644 --- a/agents/designer/src/director.ts +++ b/agents/designer/src/director.ts @@ -1,13 +1,7 @@ -// Designer director card — the `DirectorPackage` data, extracted byte-for-byte -// from the in-tree `src/agent/directors/designer/package.ts` (now deleted). -// Structurally satisfies the app's `DirectorPackage` (asserted in-tree by -// `src/agent/directors/designer/package.test.ts`); it imports @intx/* only. - import { tools } from "./toolset.js"; import { systemPrompt } from "./prompt.js"; import { config } from "./config.js"; -/** The assembled designer director card. */ export const director = { id: "designer", primaryIntent: diff --git a/agents/designer/src/index.ts b/agents/designer/src/index.ts index bd370bcbb..c2c15f6c6 100644 --- a/agents/designer/src/index.ts +++ b/agents/designer/src/index.ts @@ -1,7 +1,3 @@ -// Public surface — re-exports only (no logic). Exports exactly -// `agent, defineAgent, director, tools, systemPrompt, config`. No `workflow` -// export. No Corbits shared package is re-exported; the package's `director` -// structurally satisfies the app's `DirectorPackage` (app-side drift-guard). export { agent, defineAgent } from "./agent.js"; export { director } from "./director.js"; export { tools } from "./toolset.js"; diff --git a/agents/designer/src/prompt.ts b/agents/designer/src/prompt.ts index c7f6529b5..ede049929 100644 --- a/agents/designer/src/prompt.ts +++ b/agents/designer/src/prompt.ts @@ -1,6 +1,4 @@ -// Designer card — the single prompt authority, extracted byte-for-byte from the -// in-tree `src/agent/directors/designer/package.ts` (now deleted). `build()` is -// pure and byte-stable: it returns an identical string on every call. +// Designer card — the single prompt authority. `build()` is byte-stable. const CARD = `You are DesignerDirector (Designer), a specialist in Corbits Code. PRIMARY INTENT: own interface design, design tokens, styling, and DESIGN.md. You bring design engineering excellence to UI surfaces — layout rhythm, typography, purposeful motion, responsive states, and cohesive design systems. @@ -25,10 +23,9 @@ Workflow: OUT OF LANE: backend business logic or database migrations, general backend defect review, marketing content pipelines, fleet orchestration.`; -/** Stable identifier of the package's voice. */ export const theme = "designer"; -/** Byte-stable builder: returns the raw designer card, identical every call. */ +// Byte-stable (see prompt authority test). export const systemPrompt = { theme, build: (): string => CARD, diff --git a/agents/designer/src/toolset.ts b/agents/designer/src/toolset.ts index 3ead1bd8c..110d1e2ff 100644 --- a/agents/designer/src/toolset.ts +++ b/agents/designer/src/toolset.ts @@ -1,8 +1,5 @@ -// Designer UI/UX: build surface (read + product writes) — content-equal to the -// `REVIEW_TOOLS` constant in `src/agent/directors/tool-sets.ts` (the single -// tool authority; BUILD_TOOLS = REVIEW_TOOLS = READ_TOOLS + PRODUCT_WRITE_TOOLS). -// Drift is enforced by the in-tree `src/agent/directors/designer/package.test.ts` -// against `REVIEW_TOOLS`. +// BUILD_TOOLS literal (= REVIEW_TOOLS); drift-guarded against REVIEW_TOOLS in +// src/agent/directors/tool-sets.ts. const BUILD_TOOLS = [ "read_file", "grep", @@ -19,5 +16,4 @@ const BUILD_TOOLS = [ "delete_file", ] as const; -/** The designer tool allowlist — literal equal to the in-tree review/build surface. */ export const tools: readonly string[] = [...BUILD_TOOLS]; From f9db96dddb93131eca4ee444577629926c357447 Mon Sep 17 00:00:00 2001 From: Sawyer Date: Thu, 8 Oct 2026 20:26:49 -0700 Subject: [PATCH 05/11] style(agent-designer): strip redundant commentary from extracted package --- agents/designer/README.md | 39 +++++++------------- agents/designer/src/agent.ts | 3 +- agents/designer/src/config.ts | 8 +--- agents/designer/src/director.ts | 4 +- agents/designer/src/prompt.ts | 3 +- agents/designer/src/toolset.ts | 4 +- src/agent/directors/designer/package.test.ts | 3 -- 7 files changed, 21 insertions(+), 43 deletions(-) diff --git a/agents/designer/README.md b/agents/designer/README.md index 1a1cf2244..a51f804d0 100644 --- a/agents/designer/README.md +++ b/agents/designer/README.md @@ -2,11 +2,8 @@ ## What this is -A ready-to-go Corbits agent for the **designer** role (`@corbits/code-agent-designer`) -plus its named component parts so a consumer can recreate or remix it. Designer is -the UI/UX design engineering specialist: it owns DESIGN.md creation and updates, -impeccable.style design laws, design tokens, typography, spatial layout, and -micro-interaction polish. +Ready `@corbits/code-agent-designer` agent + independently importable components: +`agent`, `defineAgent`, `director`, `tools`, `systemPrompt`, `config`. ## Consume (runLocal) @@ -17,32 +14,22 @@ const run = runLocal(defining(agent), env); ## Consume (deploy runWorkflow / hub / sidecar) -Hand the same `AgentDefinition` (`agent`) to a workflow, hub, or sidecar. The -package never exports a workflow itself — a workflow _consumes_ `agent`. +Hand the same `AgentDefinition` to a workflow — the package never exports a +workflow itself. ## Remix components ```ts -import { - director, - tools, - systemPrompt, - config, - defineAgent, -} from "@corbits/code-agent-designer"; - -// Swap components at the consumer side. -defineAgent({ director, tools, systemPrompt, config }); // or spread overrides +import { director, tools, systemPrompt, config } from "@corbits/code-agent-designer"; +defineAgent({ director, ... }); // or swap tools / systemPrompt / config ``` -Each of `agent`, `defineAgent`, `director`, `tools`, `systemPrompt`, `config` is a -named, independently importable part. +Each of `director`, `tools`, `systemPrompt`, and `config` is a named, +independently importable part. -## Byte-stability & single authority +## Single authority -- `systemPrompt.build()` is pure and byte-stable — identical string every call. -- `tools` is content-equal to the app's `REVIEW_TOOLS` surface constant - (`src/agent/directors/tool-sets.ts`); the in-tree drift-guard - (`src/agent/directors/designer/package.test.ts`) enforces they match. -- This package is the single prompt authority for designer; the in-tree - `src/agent/directors/designer/package.ts` is deleted. +`prompt.ts` `systemPrompt.build()` is byte-stable (the raw card, no formatting). +`toolset.ts` `tools` literal equals the `REVIEW_TOOLS` surface constant in +`src/agent/directors/tool-sets.ts`; drift is enforced by the in-tree drift-guard +`src/agent/directors/designer/package.test.ts`. diff --git a/agents/designer/src/agent.ts b/agents/designer/src/agent.ts index 9fb8348c7..641b25357 100644 --- a/agents/designer/src/agent.ts +++ b/agents/designer/src/agent.ts @@ -2,7 +2,6 @@ import { defineAgent as coreDefineAgent, type AgentDefinition, } from "@intx/agent"; - import { systemPrompt } from "./prompt.js"; export const agent: AgentDefinition = defineAgent(); @@ -11,7 +10,7 @@ export function defineAgent(): AgentDefinition { return coreDefineAgent({ id: "designer", systemPrompt: systemPrompt.build(), - tools: [], + tools: [], // tool mounting is consumer/app-side; surface enforced by drift-guard capabilities: [], inference: { sources: [] }, tags: { fleet: "0.3.36", lane: "designer" }, diff --git a/agents/designer/src/config.ts b/agents/designer/src/config.ts index 89ef5dd70..7080c5b82 100644 --- a/agents/designer/src/config.ts +++ b/agents/designer/src/config.ts @@ -1,13 +1,9 @@ -// Designer is a leaf worker: maySpawn false, no allowlist. modelRole is -// "implement" (matches the in-tree card). export const config = { - spawn: { - maySpawn: false, - }, + spawn: { maySpawn: false }, tier: "leaf", modelRole: "implement", } as const satisfies { - spawn: { maySpawn: boolean; allowlist?: readonly string[] }; + spawn: { maySpawn: boolean }; tier: string; modelRole: string; }; diff --git a/agents/designer/src/director.ts b/agents/designer/src/director.ts index 47a5432a5..214116ace 100644 --- a/agents/designer/src/director.ts +++ b/agents/designer/src/director.ts @@ -15,8 +15,8 @@ export const director = { description: "UI/UX designer — owns DESIGN.md, impeccable style design laws, tokens, and interface polish", systemPrompt: systemPrompt.build(), - tools: { allow: tools }, + tools: { allow: [...tools] }, spawn: config.spawn, - modelRole: config.modelRole, tier: config.tier, + modelRole: config.modelRole, } as const; diff --git a/agents/designer/src/prompt.ts b/agents/designer/src/prompt.ts index ede049929..8b9dbe405 100644 --- a/agents/designer/src/prompt.ts +++ b/agents/designer/src/prompt.ts @@ -1,4 +1,4 @@ -// Designer card — the single prompt authority. `build()` is byte-stable. +// Designer card. Byte-stable build, single prompt authority. const CARD = `You are DesignerDirector (Designer), a specialist in Corbits Code. PRIMARY INTENT: own interface design, design tokens, styling, and DESIGN.md. You bring design engineering excellence to UI surfaces — layout rhythm, typography, purposeful motion, responsive states, and cohesive design systems. @@ -25,7 +25,6 @@ OUT OF LANE: backend business logic or database migrations, general backend defe export const theme = "designer"; -// Byte-stable (see prompt authority test). export const systemPrompt = { theme, build: (): string => CARD, diff --git a/agents/designer/src/toolset.ts b/agents/designer/src/toolset.ts index 110d1e2ff..2b1847af5 100644 --- a/agents/designer/src/toolset.ts +++ b/agents/designer/src/toolset.ts @@ -1,5 +1,5 @@ -// BUILD_TOOLS literal (= REVIEW_TOOLS); drift-guarded against REVIEW_TOOLS in -// src/agent/directors/tool-sets.ts. +// BUILD_TOOLS literal (= REVIEW_TOOLS); drift-guarded against REVIEW_TOOLS +// by src/agent/directors/designer/package.test.ts. const BUILD_TOOLS = [ "read_file", "grep", diff --git a/src/agent/directors/designer/package.test.ts b/src/agent/directors/designer/package.test.ts index 6c3e44178..9b3aaa94e 100644 --- a/src/agent/directors/designer/package.test.ts +++ b/src/agent/directors/designer/package.test.ts @@ -15,8 +15,6 @@ describe("designerPackage", () => { const asDirector: DirectorPackage = director; expect(asDirector.id).toBe("designer"); expect(DIRECTOR_REGISTRY.designer).toBe(director); - // In-tree card used BUILD_TOOLS; BUILD_TOOLS === REVIEW_TOOLS content, so - // the drift-guard asserts against REVIEW_TOOLS (the brief's surface rule). expect([...director.tools.allow]).toEqual([...REVIEW_TOOLS]); expect(new Set(director.tools.allow).size).toBe( director.tools.allow.length, @@ -29,7 +27,6 @@ describe("designerPackage", () => { expect(director.modelRole).toBe(config.modelRole); expect(director.spawn.maySpawn).toBe(false); expect(director.tier).toBe("leaf"); - // modelRole preserved from the in-tree card (implement, not §5 docs). expect(director.modelRole).toBe("implement"); }); From 08145deabf24a3fae54f8db879e2c62f27a9e0c3 Mon Sep 17 00:00:00 2001 From: "user.email" Date: Thu, 8 Oct 2026 22:21:34 -0700 Subject: [PATCH 06/11] chore(dead-exports): allowlist cl-9798 package public surface --- scripts/dead-export-allowlist.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/dead-export-allowlist.txt b/scripts/dead-export-allowlist.txt index 0c6bcaf8f..6256d7663 100644 --- a/scripts/dead-export-allowlist.txt +++ b/scripts/dead-export-allowlist.txt @@ -51,6 +51,10 @@ agents/warden/src/index.ts: agent agents/warden/src/index.ts: defineAgent agents/warden/src/config.ts: satisfies agents/warden/src/config.ts: boolean +agents/designer/src/index.ts: agent +agents/designer/src/index.ts: defineAgent +agents/designer/src/config.ts: satisfies +agents/designer/src/config.ts: boolean # Versioned prompt-variance package public surface (CL-8269 lane, # agent-owned). Family rows data re-exported through the package entry point; From a5972f87e54466263d1943caf262ca6882823774 Mon Sep 17 00:00:00 2001 From: "user.email" Date: Thu, 8 Oct 2026 23:52:09 -0700 Subject: [PATCH 07/11] fix(agent-designer): drop hardcoded inference source and release tag --- agents/designer/src/agent.ts | 1 - agents/designer/src/toolset.ts | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/agents/designer/src/agent.ts b/agents/designer/src/agent.ts index 641b25357..186d24e33 100644 --- a/agents/designer/src/agent.ts +++ b/agents/designer/src/agent.ts @@ -13,6 +13,5 @@ export function defineAgent(): AgentDefinition { tools: [], // tool mounting is consumer/app-side; surface enforced by drift-guard capabilities: [], inference: { sources: [] }, - tags: { fleet: "0.3.36", lane: "designer" }, }); } diff --git a/agents/designer/src/toolset.ts b/agents/designer/src/toolset.ts index 2b1847af5..03d33ce03 100644 --- a/agents/designer/src/toolset.ts +++ b/agents/designer/src/toolset.ts @@ -1,6 +1,6 @@ // BUILD_TOOLS literal (= REVIEW_TOOLS); drift-guarded against REVIEW_TOOLS // by src/agent/directors/designer/package.test.ts. -const BUILD_TOOLS = [ +export const tools = [ "read_file", "grep", "search_files", @@ -15,5 +15,3 @@ const BUILD_TOOLS = [ "edit_file", "delete_file", ] as const; - -export const tools: readonly string[] = [...BUILD_TOOLS]; From 84d6026a8d7f149d26695988e1312bad58d4049c Mon Sep 17 00:00:00 2001 From: "user.email" Date: Fri, 9 Oct 2026 00:14:51 -0700 Subject: [PATCH 08/11] chore(agent-designer): regenerate lockfile for frozen-lockfile consistency --- bun.lock | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/bun.lock b/bun.lock index 20a8af9bd..a9f79b3a1 100644 --- a/bun.lock +++ b/bun.lock @@ -52,26 +52,28 @@ }, "agents/artist": { "name": "@corbits/code-agent-artist", + "version": "0.1.0", }, - "agents/shakespeare": { - "name": "@corbits/code-agent-shakespeare", + "agents/designer": { + "name": "@corbits/code-agent-designer", + "version": "0.1.0", + }, + "agents/dispatch": { + "name": "@corbits/code-agent-dispatch", + "version": "0.1.0", }, "agents/prober": { "name": "@corbits/code-agent-prober", "version": "0.1.0", }, - "agents/dispatch": { - "name": "@corbits/code-agent-dispatch", + "agents/shakespeare": { + "name": "@corbits/code-agent-shakespeare", "version": "0.1.0", }, "agents/warden": { "name": "@corbits/code-agent-warden", "version": "0.1.0", }, - "agents/designer": { - "name": "@corbits/agent-designer", - "version": "0.1.0", - }, "packages/first-class-providers": { "name": "@corbits/first-class-providers", "version": "0.1.0", @@ -264,11 +266,16 @@ "@better-fetch/fetch": ["@better-fetch/fetch@1.3.2", "", {}, "sha512-Gs7n99b5tqUC6cQAPbV0uED3IraHB6xQbHLQ/C3l7ZFafHScOx9pQ+DYmP5blbLFShVWLqxNUlI9wi4xU/X+ow=="], "@corbits/code-agent-artist": ["@corbits/code-agent-artist@workspace:agents/artist"], - "@corbits/code-agent-shakespeare": ["@corbits/code-agent-shakespeare@workspace:agents/shakespeare"], - "@corbits/code-agent-prober": ["@corbits/code-agent-prober@workspace:agents/prober"], + + "@corbits/code-agent-designer": ["@corbits/code-agent-designer@workspace:agents/designer"], + "@corbits/code-agent-dispatch": ["@corbits/code-agent-dispatch@workspace:agents/dispatch"], + + "@corbits/code-agent-prober": ["@corbits/code-agent-prober@workspace:agents/prober"], + + "@corbits/code-agent-shakespeare": ["@corbits/code-agent-shakespeare@workspace:agents/shakespeare"], + "@corbits/code-agent-warden": ["@corbits/code-agent-warden@workspace:agents/warden"], - "@corbits/agent-designer": ["@corbits/agent-designer@workspace:agents/designer"], "@corbits/codex-provider": ["@corbits/codex-provider@0.1.1", "", { "dependencies": { "arktype": "^2.2.3" }, "peerDependencies": { "@corbits/oauth-core": "^0.2.0", "@corbits/openai-responses": "^0.2.0", "@intx/inference": "^0.4.0", "@intx/types": "^0.4.0" } }, "sha512-MiGA5djQNtRpHqLvJAGdFgHEbUl808AbveMPwt7krLjOH0i20DyElpitHPZF3ltCXkFMhcKIoyTAEpRDqeB/Rw=="], From 6a2c1e451b5373463518c98a5d5cd4b4c56aa2af Mon Sep 17 00:00:00 2001 From: "user.email" Date: Fri, 9 Oct 2026 00:26:33 -0700 Subject: [PATCH 09/11] chore(agent-designer): fix lockfile to canonical structure for workspace linkage --- bun.lock | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/bun.lock b/bun.lock index a9f79b3a1..48ffba2f1 100644 --- a/bun.lock +++ b/bun.lock @@ -52,28 +52,26 @@ }, "agents/artist": { "name": "@corbits/code-agent-artist", - "version": "0.1.0", - }, - "agents/designer": { - "name": "@corbits/code-agent-designer", - "version": "0.1.0", }, - "agents/dispatch": { - "name": "@corbits/code-agent-dispatch", - "version": "0.1.0", + "agents/shakespeare": { + "name": "@corbits/code-agent-shakespeare", }, "agents/prober": { "name": "@corbits/code-agent-prober", "version": "0.1.0", }, - "agents/shakespeare": { - "name": "@corbits/code-agent-shakespeare", + "agents/dispatch": { + "name": "@corbits/code-agent-dispatch", "version": "0.1.0", }, "agents/warden": { "name": "@corbits/code-agent-warden", "version": "0.1.0", }, + "agents/designer": { + "name": "@corbits/code-agent-designer", + "version": "0.1.0", + }, "packages/first-class-providers": { "name": "@corbits/first-class-providers", "version": "0.1.0", @@ -266,16 +264,11 @@ "@better-fetch/fetch": ["@better-fetch/fetch@1.3.2", "", {}, "sha512-Gs7n99b5tqUC6cQAPbV0uED3IraHB6xQbHLQ/C3l7ZFafHScOx9pQ+DYmP5blbLFShVWLqxNUlI9wi4xU/X+ow=="], "@corbits/code-agent-artist": ["@corbits/code-agent-artist@workspace:agents/artist"], - - "@corbits/code-agent-designer": ["@corbits/code-agent-designer@workspace:agents/designer"], - - "@corbits/code-agent-dispatch": ["@corbits/code-agent-dispatch@workspace:agents/dispatch"], - - "@corbits/code-agent-prober": ["@corbits/code-agent-prober@workspace:agents/prober"], - "@corbits/code-agent-shakespeare": ["@corbits/code-agent-shakespeare@workspace:agents/shakespeare"], - + "@corbits/code-agent-prober": ["@corbits/code-agent-prober@workspace:agents/prober"], + "@corbits/code-agent-dispatch": ["@corbits/code-agent-dispatch@workspace:agents/dispatch"], "@corbits/code-agent-warden": ["@corbits/code-agent-warden@workspace:agents/warden"], + "@corbits/code-agent-designer": ["@corbits/code-agent-designer@workspace:agents/designer"], "@corbits/codex-provider": ["@corbits/codex-provider@0.1.1", "", { "dependencies": { "arktype": "^2.2.3" }, "peerDependencies": { "@corbits/oauth-core": "^0.2.0", "@corbits/openai-responses": "^0.2.0", "@intx/inference": "^0.4.0", "@intx/types": "^0.4.0" } }, "sha512-MiGA5djQNtRpHqLvJAGdFgHEbUl808AbveMPwt7krLjOH0i20DyElpitHPZF3ltCXkFMhcKIoyTAEpRDqeB/Rw=="], From 7db3ea0133ad3b01302b1523a6a6a234d29d1b2c Mon Sep 17 00:00:00 2001 From: "user.email" Date: Fri, 9 Oct 2026 00:27:39 -0700 Subject: [PATCH 10/11] fix(agent-designer): declare workspace dependency so bun resolves the package --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c427a0851..51e2ff5d6 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,8 @@ "@modelcontextprotocol/sdk": "^1.29.0", "@opentui/core": "0.5.12", "arktype": "catalog:", - "isomorphic-git": "catalog:" + "isomorphic-git": "catalog:", + "@corbits/code-agent-designer": "workspace:*" }, "devDependencies": { "@intx/inference-testing": "0.3.0", From 118fc7bc8231f0a29fa14c1ee259a221dcde909c Mon Sep 17 00:00:00 2001 From: "user.email" Date: Fri, 9 Oct 2026 00:31:05 -0700 Subject: [PATCH 11/11] fix(agent-designer): allowlist full public surface for dead-export guard --- scripts/dead-export-allowlist.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/dead-export-allowlist.txt b/scripts/dead-export-allowlist.txt index 6256d7663..21d45e8b3 100644 --- a/scripts/dead-export-allowlist.txt +++ b/scripts/dead-export-allowlist.txt @@ -53,6 +53,10 @@ agents/warden/src/config.ts: satisfies agents/warden/src/config.ts: boolean agents/designer/src/index.ts: agent agents/designer/src/index.ts: defineAgent +agents/designer/src/index.ts: director +agents/designer/src/index.ts: tools +agents/designer/src/index.ts: systemPrompt +agents/designer/src/index.ts: config agents/designer/src/config.ts: satisfies agents/designer/src/config.ts: boolean