用 90 行 TOML 构建 Standup Bot
一个无需你盯着也能运行的 autonomous agent,只使用 shell + git,并能跨 sessions 记忆。
问题
Standup 很烦。你会忘记昨天做了什么。git history 知道,但你每天早上没时间回顾。即使写 standup notes,也常常泛泛而谈、没什么帮助。
如果 agent 能每天在同一时间自动替你完成这些,会怎样?
Config
整个 agent 定义在 standup_bot.toml 中 - 90 行 TOML。没有 Python。没有 JavaScript。除 QueryMT 本身外没有 runtime dependencies。
Agent definition
[agent] provider = "anthropic" model = "claude-sonnet-4-5-20250929" assume_mutating = false # No mutating tools — this agent is strictly read-only mutating_tools = []
assume_mutating = false and an empty mutating_tools list means this agent can never write to disk or execute mutating commands. It reads git history and writes to its knowledge store - nothing else.
Tool selection
[agent] tools = [ # Git & codebase analysis (read-only) "read_tool", "index", "glob", "search_text", "ls", "shell", # Knowledge lifecycle — the magic "knowledge_ingest", # Store findings "knowledge_query", # Recall past standups "knowledge_consolidate", # Merge daily → weekly "knowledge_list_unconsolidated", "knowledge_stats", # Task tracking "create_task", "todowrite", "todoread", ]
Three tools handle persistent memory: knowledge_ingest stores structured findings, knowledge_query retrieves them, and knowledge_consolidate merges related entries into higher-level summaries. The agent remembers across sessions automatically.
Three-layer context compaction
# Layer 1: Tool output truncation [agent.execution.tool_output] max_lines = 1000 max_bytes = 25600 # Layer 2: Pruning after every turn [agent.execution.pruning] protect_tokens = 20000 # Layer 3: AI summary on context overflow [agent.execution.compaction] auto = true
Git log output can be huge. These three layers keep the context window manageable: truncate tool output at 1000 lines, prune old messages while protecting recent ones, and automatically summarize the conversation when it grows too large.
Middleware: execution limits
[[middleware]] type = "limits" max_steps = 30 # Max tool calls per cycle max_turns = 15 # Max conversation turns [[middleware]] type = "context" warn_at_percent = 80 # Warn when 80% of context used compact_at_percent = 90 # Auto-compact at 90% fallback_max_tokens = 128000
With max_steps = 30 and max_turns = 15 each scheduled cycle has a hard ceiling on cost. The agent can't run away. Context management ensures it never hits token limits unexpectedly.
设置 Schedule
启动 dashboard 后,通过 UI 创建 schedule:
- Open Session -> Schedules -> Create Schedule
- Prompt: "Run a standup cycle: analyze recent git activity, ingest findings, and report."
- Trigger: Interval,
86400seconds (every 24 hours) - Max runs: 30 (one month of daily standups)
- Max steps: 20
After 30 runs (one month), the schedule expires automatically. No orphaned processes. No cleanup needed.
会发生什么
每天同一时间,agent 会 autonomously 运行这个 cycle:
git log for the last 24 hours. Reads changed files, commit messages, and diff patterns. Over time, the agent builds a knowledge graph of your project's history. Weekly consolidation merges daily standups into weekly summaries. Query past standups anytime:
# Ask the agent in the dashboard:
"What were the main themes from last week's standups?" 关键功能
- Interval scheduling — runs on a fixed cadence, no user interaction needed
- Knowledge lifecycle — ingest daily, consolidate weekly, query anytime
- Autonomous execution — the bot does its job without you watching
- Cost-bounded —
max_stepsandmax_turnsprevent runaway costs - Three-layer compaction — handles large git outputs gracefully
- Automatic schedule expiry — no orphaned processes after the trial period
自己试试
# Clone and run git clone https://github.com/querymt/querymt.git && cd querymt cargo run --example qmtcode --features dashboard -- \ confs/standup_bot.toml --dashboard # In the dashboard, create a schedule: # Session -> Schedules -> Create Schedule # Prompt: "Run a standup cycle: analyze recent git activity, ingest findings, and report." # Trigger: Interval, 86400s (daily) # Max runs: 30