Skill573 repo starsupdated 14d ago
agent-builder
**agent-builder** creates new draft agents with optional scheduled automations attached to them. Use this skill when asked to build a specialized agent, wire a schedule or webhook trigger to it, or attach skills and MCP servers to agents you own. All outputs remain in draft state until manually published through the UI, and child agents cannot spawn further descendants.
Install in Claude Code
Copygit clone --depth 1 https://github.com/TesslateAI/OpenSail /tmp/agent-builder && cp -r /tmp/agent-builder/orchestrator/app/agent/skills/agent-builder ~/.claude/skills/agent-builderThen start a new Claude Code session; the skill loads automatically.
Definition
SKILL.md
## When to use
Invoke this skill when the user asks you to:
- Create a new specialised agent (e.g., "build me a daily standup digester").
- Wire a schedule, webhook, or app event to an agent so it fires
autonomously.
- Attach a skill or MCP server to an agent you (or the user) own.
- Request a missing capability before performing a gated action.
Do NOT invoke this skill for:
- Editing the system prompt of an already-published agent — that
requires forking; the UI handles it.
- Publishing an agent to the marketplace. Publishing is a UI-only
action that flips `is_published=True` after a human review. There is
no `publish_agent` tool.
## Hard rules — read before any tool call
1. **Depth-1 cap.** You can create child agents and attach schedules
to them, but those children cannot themselves spawn grandchildren.
The `attach_schedule` tool rejects depth-2 attempts with code
`depth_exceeded`. The DB also enforces `depth IN (0, 1)` as a
second line of defence.
2. **Drafts only.** Every agent and automation you create starts in
DRAFT state:
- `MarketplaceAgent.is_published=False` — invisible in the public
marketplace.
- `AutomationDefinition.is_active=False` — never fires.
The user must enable both in the UI before anything goes live.
3. **Positive-list inheritance.** A child automation's contract MAY
only carry scopes from this list:
`tools.execute`, `read_file`, `write_file`, `bash_exec`,
`web_fetch`, `web_search`, `send_message`, `app.invoke`, plus any
`mcp.*` prefix. The non-inheritable scopes you can NOT propagate
include `marketplace.author` and `automations.write` — `attach_schedule`
rejects child contracts that contain them.
4. **Budget rollup.** A child automation's `max_spend_per_run_usd`
must be `<=` the parent's. Daily spend is debited from BOTH the
child's daily counter AND every ancestor in the parent chain — if
any counter would go negative the run is paused with
`paused_reason='parent_budget_exhausted'`. You cannot use a child
to escape a parent's daily cap.
## The six tools
### `create_agent(name, description, system_prompt, model?, tool_allowlist?)`
Draft a new `MarketplaceAgent` row. Returns `{agent_id, slug, draft_url, is_published: false}`.
The row is owned by the calling user and stamped with
`created_by_automation_id` pointing back to your automation, so the
dispatcher can walk the provenance chain later.
Required scope: `marketplace.author`.
### `update_agent(agent_id, patch)`
Patch whitelisted draft fields. Rejects:
- Published rows (`is_published=True`) — fork via the UI instead.
- Built-in or system rows.
- Any agent the calling user doesn't own.
- The `is_published`, `is_builtin`, `is_system`, `id`, `slug`,
`pricing_type`, `created_by_*` fields — these are server-managed.
### `assign_skill(agent_id, skill_id)`
Insert an `AgentSkillAssignment` row linking a skill to your agent.
Idempotent on the `(agent_id, skill_id, user_id)` unique constraint —
re-running with the same pair is a no-op.
### `assign_mcp(agent_id, mcp_config_id, scopes?)`
Insert an `AgentMcpAssignment` row linking a user-installed MCP server
to your agent. The `scopes` arg is recorded for audit; the actual
`mcp.*` scope enforcement happens at call time via the automation
contract.
### `attach_schedule(agent_id, trigger, prompt_template, contract, delivery_targets?, workspace_scope?, max_compute_tier?)`
Create a child `AutomationDefinition` that runs the agent on a trigger.
- `trigger` is `{kind, config}` where `kind` ∈
`{cron, webhook, app_invocation, manual}`.
- `prompt_template` is the body sent to the agent on each run. It can
reference event payload fields with `{key}` interpolation.
- `contract` is the runtime contract — see "positive-list inheritance"
and "budget rollup" above. The tool runs the inheritance validator
before insert; failures surface as
`contract inheritance violation: <code>: <reason>`.
- `delivery_targets` (optional) is a list of
`CommunicationDestination` UUIDs. Each must be owned by the calling
user.
- `workspace_scope` defaults to `user_automation_workspace`. The
per-user `~automations~` workspace project is lazy-created the first
time a `user_automation_workspace` automation actually fires — there
is nothing for you to provision.
- `max_compute_tier` defaults to `0` (no pod). Bump to `1` for
ephemeral pods or `2` for persistent environments — but only if the
parent automation's contract allows.
The new automation is created with `is_active=False`. The user must
flip it on in the UI before it starts firing. Required scope:
`automations.write`.
### `request_grant(resource, capability)`
Register an approval card asking the user to grant a capability the
run doesn't currently have. Returns `{approval_id}` immediately. Do
NOT block on the response inside the tool — the agent loop must
checkpoint on the approval id and let the dispatcher resume the run
after the user responds (non-blocking HITL pattern).
`resource` is `{kind, id}`; `capability` is a dotted scope string
(e.g., `mcp.linear.read`).
## Recommended flow
1. `create_agent` to draft the agent row.
2. `assign_skill` / `assign_mcp` to attach the dependencies the agent
will need at runtime.
3. `update_agent` to refine the system prompt, tool allowlist, or
metadata as you learn more about what the user wants.
4. `attach_schedule` to wire a trigger + contract + delivery targets.
5. Tell the user where to find the draft (`draft_url` from
`create_agent`) and remind them they need to publish the agent +
enable the automation from the UI before it goes live.
## Common failure modes
- **`depth_exceeded`** — you're already running inside a child
automation. Refactor the parent automation to spawn what you need
directly.
- **`scope_not_inheritable`** — the child contract carries
`marketplace.author`, `automations.write`, or another
non-positive-list scope. Drop i