SKILL.md carries on its own, merged across all three so you can see the whole surface at once. UNIT, TASK and SECTION are placeholders — the agent fills them from what you actually said (a unit’s name or code, a task abbreviation), never from a guessed format. See The command model for why no code format is assumed.
Reading
Writing — always plan first
Every write below follows the same two-step pattern: run it once with--dry-run to show the plan, confirm with the person, then run it again with --yes. An agent should never skip straight to --yes on a first attempt, even when the request sounds unambiguous.
Rules an agent should follow
- Ask before a mutation runs for real. A
--dry-runplan is safe to show without asking; running the same command with--yeschanges something on the platform and should follow an explicit yes from the person, not an inferred one. - Dry-run first, every time. Even when the request is unambiguous, show the plan before applying it — it’s the only chance to catch a wrong
UNIT/TASKbefore it’s sent. - Never print or echo a token or session cookie.
MOODLE_TOKEN/MOODLE_SESSION,EDSTEM_TOKEN,ONTRACK_TOKEN/ONTRACK_AUTH_TOKEN, and any file under a CLI’s config or cache directory hold live credentials. Don’t include their values in a message back to the person, a log, or a committed file. - Prefer
--fieldsto cut a response down to what’s actually needed, instead of parsing a full table or object and discarding most of it —edstem threads list UNIT --fields id,title,unreadis cheaper to read than the full row for every thread. - Page instead of pulling everything.
--limit(moodle’stodo, for example) and--max/-n(edstem’s list commands) cap how much comes back in one call; ask for another page rather than requesting an unbounded list up front.
Choose a surface
Whether an agent should run the CLI directly or go through MCP (Model Context Protocol) for a given situation.