save-progress
Writes a timestamped JSON checkpoint (plus a readable .md copy) to progress/, and
updates progress/latest.json so resuming never requires a hand-copied filename.
How to call it
The two fields are long multi-line prose, so they go through a JSON file rather than command-line arguments (which would be a quoting minefield on Windows).
Step 1 -- write the payload to progress-payload.json:
{
"task": "One-line description of what the overall task is",
"progress": "Everything accomplished so far: files changed, decisions made, intermediate results, anything already verified.",
"resumePlan": "The concrete next steps, remaining work, and any dependencies or prerequisites.",
"notes": "Optional. Anything else the next session needs."
}
Step 2 -- run:
node .claude/skills/save-progress/save-progress.js --payload progress-payload.json --consume
--consume deletes the payload file after a successful save.
progress and resumePlan are required and must be non-empty.
To pipe the JSON on standard input instead, pass --stdin explicitly:
... | node .claude/skills/save-progress/save-progress.js --stdin
--stdin is opt-in on purpose: without it, a harness that leaves stdin open would block
this script forever, and it runs precisely when the budget is nearly gone.
Response
{ "saved": true, "path": "...", "markdownPath": "...", "latestPointer": "...", "savedAt": "..." }
On failure: { "saved": false, "error": "..." } with a non-zero exit code. A failed save
leaves no partial checkpoint behind.
Writing a good checkpoint
The resume plan is read by a session with no memory of this one. Name files by full path, state decisions rather than implying them, and make the first next-step something concrete enough to start on immediately. Assume nothing carries over.
Tell the user the checkpoint path after saving.