v0.11.0 — time triggers + serve an existing repo as a coding agent
Two feature waves since 0.10.3: time triggers (schedules + self-scheduling) and serving an existing repo as a coding agent (persona/agentDir/scaffold/deploy). One breaking change, called out below.
⏰ Time triggers
schedules/— dropdefineSchedule({ cron, prompt })files in your agent dir;dev/startfire the agent on each cron with a stable per-schedule session.fastagent fire <name>runs one immediately (the authoring loop);fastagent schedule listshows everything that will fire,schedule historythe run audit (runs.jsonl).- Self-scheduling (opt-in) —
selfSchedule: truemounts the built-inwaketool so the agent can schedule its own follow-up turns (one-shot or recurring), plusunwakeand operatorschedule list/cancel. Off by default: autonomy is opt-in. - Deploy-aware — time triggers keep one machine running in generated fly.toml (no scale-to-zero dropping a cron), and
--rungates on a kept config that would.
🤖 Serve an existing repo as a coding agent
The scenario: your product repo gains a resident agent that reviews, fixes, and answers — without the agent's files colliding with yours.
persona.mdis the agent's identity (prompt segment ①), replacing AGENTS.md in scaffolds. Your repo'sAGENTS.mdstays untouched and is read as project context (②) — the two roles no longer share a file.config.agentDir— point the config at./agentand the agent's own surface (persona/skills/tools/channels/schedules) lives there while the config directory stays the run root (cwd). All commands (dev/start/info/chat/tool/fire/add/deploy) resolve the same split.initdetects jurisdiction — a toolchain config, deploy manifest, or occupiedtools//channels//skills/means an existing system claims the tree, so the kit defaults into./agent(reason printed;--flat/--agent-dir <name>override). The kit self-contains itspackage.json; a non-empty kit target is refused with the way out.deploy fly|railwaylearns the layout (experimental) — generates a kit-namespaced recipe (agent/Dockerfile,agent/fly.toml/agent/railway.json) that bakes the whole repo as the agent's cwd and installs only the kit's deps. Write-back mechanics ship in the image (git +deploy.secrets); the policy (push vs PR) belongs topersona.md. A host's root.dockerignoreis never overwritten — even with--force. Not yet verified end-to-end on a real host; the runbook is the supported path (--runis gated).
⚠️ Breaking
- A symlinked
agentDirnow refuses to load (including a symlink in an intermediate segment). Previously it "worked" whiledev's watch silently never saw edits — the link target can escape the config directory. Migration: pointagentDirat the real path. Also new: a declaredagentDirthat doesn't exist is refused at load (a typo used to silently serve an empty agent).
Fixes & hardening
firediscovers schedules fromagentDir(was: run root) — the same set dev/start serve.devwatch includesschedules/; editing a schedule no longer keeps the old cron firing silently.- Telegram: a user turn colliding with an external lease holder (wake) busy-waits instead of failing.
- HTTP host: no request path can crash the server via unhandled rejection.
.envloading unified (env.ts); tunnel's best-effort.envread fixed.- Docs: deployment guide (
docs/deploy.md), time-trigger guide,llms.txtraw links.
Full log: v0.10.3...v0.11.0