What works today
cratis init is a genuinely good design for this problem, and most of it needs no change:
cratis llm-context emits a ~57 KB machine-readable descriptor of every command group, option, argument and output-format hint (181 named entries), plus connectionInfo, tips and per-command output guidance.
cratis init writes a small always-loaded primer (CHRONICLE.md, ~3.7 KB) and a large on-demand skill carrying the full catalog (~60 KB). That split is the right call — the primer is cheap enough to always sit in context, and the expensive catalog is only pulled in when an agent is actually writing cratis commands.
- Detection is genuinely automatic: project files (
.claude/, CLAUDE.md, .github/copilot-instructions.md, .cursor*, .windsurfrules) and runtime environment (CLAUDECODE, CLAUDE_CODE_ENTRYPOINT, VSCODE_PID, TERM_PROGRAM, CURSOR_TRACE_DIR, WINDSURF_SESSION_ID). So running cratis init from inside an agent's terminal configures that agent even on a first-time project.
The gap
AiTool covers claude, copilot, cursor, windsurf only. Pi (@earendil-works/pi-coding-agent) is not among them, and it is what a lot of this work is actually driven with.
Pi discovers skills from .pi/skills/<name>/SKILL.md and .agents/skills/<name>/SKILL.md, with YAML frontmatter carrying name and description — exactly the shape ChronicleSkillGenerator already emits. No format change is needed.
Verified end to end rather than assumed:
cratis init --tool claude --yes
mkdir -p .pi/skills/chronicle-cli
cp .claude/commands/chronicle-cli.md .pi/skills/chronicle-cli/SKILL.md
then asking Pi to list its skills returns chronicle-cli first. The generated file is byte-identical and needs no transformation — it is purely a matter of which path it is written to.
Suggested change
- Add
AiTool.Pi, writing .pi/skills/chronicle-cli/SKILL.md (and the diagnose command as .pi/prompts/chronicle-diagnose.md, matching Pi's prompt convention).
- Detect it: project-side
.pi/ directory, and environment-side the PI_* variables Pi sets in spawned terminals.
- Include
pi in --tool's accepted values and its description.
Since Pi also reads AGENTS.md walking up from cwd, the @CHRONICLE.md reference could equally be appended there rather than to CLAUDE.md — worth deciding deliberately rather than by default, since AGENTS.md is shared with other tools.
Second, smaller point: the catalog is a pinned snapshot
The embedded descriptor carries "version": "2.8.2.0" — it is a snapshot taken at init time, not resolved live. After a CLI upgrade the skill still describes the old surface, and nothing detects the drift. cratis init --refresh exists and fixes it, but nothing prompts anyone to run it.
Cheap options, roughly in order of effort: have cratis update run the refresh automatically; or have any command warn when the descriptor's recorded version differs from the running CLI's; or have the skill state the version it was generated from prominently enough that an agent notices the mismatch itself.
What works today
cratis initis a genuinely good design for this problem, and most of it needs no change:cratis llm-contextemits a ~57 KB machine-readable descriptor of every command group, option, argument and output-format hint (181 named entries), plusconnectionInfo,tipsand per-command output guidance.cratis initwrites a small always-loaded primer (CHRONICLE.md, ~3.7 KB) and a large on-demand skill carrying the full catalog (~60 KB). That split is the right call — the primer is cheap enough to always sit in context, and the expensive catalog is only pulled in when an agent is actually writingcratiscommands..claude/,CLAUDE.md,.github/copilot-instructions.md,.cursor*,.windsurfrules) and runtime environment (CLAUDECODE,CLAUDE_CODE_ENTRYPOINT,VSCODE_PID,TERM_PROGRAM,CURSOR_TRACE_DIR,WINDSURF_SESSION_ID). So runningcratis initfrom inside an agent's terminal configures that agent even on a first-time project.The gap
AiToolcovers claude, copilot, cursor, windsurf only. Pi (@earendil-works/pi-coding-agent) is not among them, and it is what a lot of this work is actually driven with.Pi discovers skills from
.pi/skills/<name>/SKILL.mdand.agents/skills/<name>/SKILL.md, with YAML frontmatter carryingnameanddescription— exactly the shapeChronicleSkillGeneratoralready emits. No format change is needed.Verified end to end rather than assumed:
then asking Pi to list its skills returns
chronicle-clifirst. The generated file is byte-identical and needs no transformation — it is purely a matter of which path it is written to.Suggested change
AiTool.Pi, writing.pi/skills/chronicle-cli/SKILL.md(and the diagnose command as.pi/prompts/chronicle-diagnose.md, matching Pi's prompt convention)..pi/directory, and environment-side thePI_*variables Pi sets in spawned terminals.piin--tool's accepted values and its description.Since Pi also reads
AGENTS.mdwalking up from cwd, the@CHRONICLE.mdreference could equally be appended there rather than toCLAUDE.md— worth deciding deliberately rather than by default, sinceAGENTS.mdis shared with other tools.Second, smaller point: the catalog is a pinned snapshot
The embedded descriptor carries
"version": "2.8.2.0"— it is a snapshot taken atinittime, not resolved live. After a CLI upgrade the skill still describes the old surface, and nothing detects the drift.cratis init --refreshexists and fixes it, but nothing prompts anyone to run it.Cheap options, roughly in order of effort: have
cratis updaterun the refresh automatically; or have any command warn when the descriptor's recorded version differs from the running CLI's; or have the skill state the version it was generated from prominently enough that an agent notices the mismatch itself.