Skip to content

v0.11.0 — time triggers + serve an existing repo as a coding agent

Choose a tag to compare

@kid7st kid7st released this 09 Jul 06:52

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/ — drop defineSchedule({ cron, prompt }) files in your agent dir; dev/start fire the agent on each cron with a stable per-schedule session. fastagent fire <name> runs one immediately (the authoring loop); fastagent schedule list shows everything that will fire, schedule history the run audit (runs.jsonl).
  • Self-scheduling (opt-in)selfSchedule: true mounts the built-in wake tool so the agent can schedule its own follow-up turns (one-shot or recurring), plus unwake and operator schedule 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 --run gates 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.md is the agent's identity (prompt segment ①), replacing AGENTS.md in scaffolds. Your repo's AGENTS.md stays untouched and is read as project context (②) — the two roles no longer share a file.
  • config.agentDir — point the config at ./agent and 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.
  • init detects jurisdiction — a toolchain config, deploy manifest, or occupied tools//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 its package.json; a non-empty kit target is refused with the way out.
  • deploy fly|railway learns 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 to persona.md. A host's root .dockerignore is never overwritten — even with --force. Not yet verified end-to-end on a real host; the runbook is the supported path (--run is gated).

⚠️ Breaking

  • A symlinked agentDir now refuses to load (including a symlink in an intermediate segment). Previously it "worked" while dev's watch silently never saw edits — the link target can escape the config directory. Migration: point agentDir at the real path. Also new: a declared agentDir that doesn't exist is refused at load (a typo used to silently serve an empty agent).

Fixes & hardening

  • fire discovers schedules from agentDir (was: run root) — the same set dev/start serve.
  • dev watch includes schedules/; 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.
  • .env loading unified (env.ts); tunnel's best-effort .env read fixed.
  • Docs: deployment guide (docs/deploy.md), time-trigger guide, llms.txt raw links.

Full log: v0.10.3...v0.11.0