mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-08 06:26:45 +02:00
dd01897b4d
Claude Code ships /checkpoint as a native alias for /rewind (Esc+Esc), which was shadowing the gstack skill. Training-data bleed meant agents saw /checkpoint and sometimes described it as a built-in instead of invoking the Skill tool, so nothing got saved. Fix: rename the skill and split save from restore so each skill has one job. Restore now loads the most recent saved context across ALL branches by default (the previous flow was ambiguous between mode="restore" and mode="list" and agents applied list-flow filtering to restore). New commands: - /context-save → save current state - /context-save list → list saved contexts (current branch default) - /context-restore → load newest saved context across all branches - /context-restore X → load specific saved context by title fragment Storage directory unchanged at ~/.gstack/projects/$SLUG/checkpoints/ so existing saved files remain loadable. Canonical ordering is now the filename YYYYMMDD-HHMMSS prefix, not filesystem mtime — filenames are stable across copies/rsync, mtime is not. Empty-set handling in both restore and list flows uses find+sort instead of ls -1t, which on macOS falls back to listing cwd when the input is empty. Sources for the collision: - https://code.claude.com/docs/en/checkpointing - https://claudelog.com/mechanics/rewind/
152 lines
4.9 KiB
Cheetah
152 lines
4.9 KiB
Cheetah
---
|
|
name: context-restore
|
|
preamble-tier: 2
|
|
version: 1.0.0
|
|
description: |
|
|
Restore working context saved earlier by /context-save. Loads the most recent
|
|
saved state (across all branches by default) so you can pick up where you
|
|
left off — even across Conductor workspace handoffs.
|
|
Use when asked to "resume", "restore context", "where was I", or
|
|
"pick up where I left off". Pair with /context-save.
|
|
Formerly /checkpoint resume — renamed because Claude Code treats /checkpoint
|
|
as a native rewind alias in current environments. (gstack)
|
|
allowed-tools:
|
|
- Bash
|
|
- Read
|
|
- Glob
|
|
- Grep
|
|
- AskUserQuestion
|
|
triggers:
|
|
- resume where i left off
|
|
- restore context
|
|
- where was i
|
|
- pick up where i left off
|
|
- context restore
|
|
---
|
|
|
|
{{PREAMBLE}}
|
|
|
|
# /context-restore — Restore Saved Working Context
|
|
|
|
You are a **Staff Engineer reading a colleague's meticulous session notes** to
|
|
pick up exactly where they left off. Your job is to load the most recent saved
|
|
context and present it clearly so the user can resume work without losing a beat.
|
|
|
|
**HARD GATE:** Do NOT implement code changes. This skill only reads saved
|
|
context files and presents the summary.
|
|
|
|
**Default: load the most recent saved context across ALL branches.** This is
|
|
intentionally different from `/context-save list`, which defaults to the current
|
|
branch. `/context-restore` is for Conductor workspace handoff — a context saved
|
|
on one branch can be resumed from another.
|
|
|
|
**Do NOT filter the candidate set by current branch.** The `list` flow does
|
|
that; `/context-restore` does not.
|
|
|
|
---
|
|
|
|
## Detect command
|
|
|
|
Parse the user's input:
|
|
|
|
- `/context-restore` → load the most recent saved context (any branch)
|
|
- `/context-restore <title-fragment-or-number>` → load a specific saved context
|
|
- `/context-restore list` → tell the user "Use `/context-save list` — listing
|
|
lives on the save side" and exit. No mode detection here.
|
|
|
|
---
|
|
|
|
## Restore flow
|
|
|
|
### Step 1: Find saved contexts
|
|
|
|
```bash
|
|
{{SLUG_SETUP}}
|
|
CHECKPOINT_DIR="$HOME/.gstack/projects/$SLUG/checkpoints"
|
|
if [ ! -d "$CHECKPOINT_DIR" ]; then
|
|
echo "NO_CHECKPOINTS"
|
|
else
|
|
# Use find + sort instead of ls -1t. Two reasons:
|
|
# 1. Canonical order is the filename YYYYMMDD-HHMMSS prefix (stable across
|
|
# copies/rsync). Filesystem mtime drifts and is not authoritative.
|
|
# 2. On macOS, `find ... | xargs ls -1t` with zero results falls back to
|
|
# listing cwd. `sort -r` on empty input cleanly returns nothing.
|
|
FILES=$(find "$CHECKPOINT_DIR" -maxdepth 1 -name "*.md" -type f 2>/dev/null | sort -r)
|
|
if [ -z "$FILES" ]; then
|
|
echo "NO_CHECKPOINTS"
|
|
else
|
|
echo "$FILES"
|
|
fi
|
|
fi
|
|
```
|
|
|
|
**Candidates include every `.md` file in the directory, regardless of branch**
|
|
(the branch is recorded in frontmatter, not used for filtering here). This
|
|
enables Conductor workspace handoff.
|
|
|
|
### Step 2: Load the right file
|
|
|
|
- If the user specified a title fragment or number: find the matching file among
|
|
the candidates.
|
|
- Otherwise: load the **first file returned by the `sort -r` above** — that is
|
|
the newest `YYYYMMDD-HHMMSS` prefix, which is the canonical "most recent."
|
|
|
|
Read the chosen file and present a summary:
|
|
|
|
```
|
|
RESUMING CONTEXT
|
|
════════════════════════════════════════
|
|
Title: {title}
|
|
Branch: {branch from frontmatter}
|
|
Saved: {timestamp, human-readable}
|
|
Duration: Last session was {formatted duration} (if available)
|
|
Status: {status}
|
|
════════════════════════════════════════
|
|
|
|
### Summary
|
|
{summary from saved file}
|
|
|
|
### Remaining Work
|
|
{remaining work items}
|
|
|
|
### Notes
|
|
{notes}
|
|
```
|
|
|
|
If the current branch differs from the saved context's branch, note this:
|
|
"This context was saved on branch `{branch}`. You are currently on
|
|
`{current branch}`. You may want to switch branches before continuing."
|
|
|
|
### Step 3: Offer next steps
|
|
|
|
After presenting, ask via AskUserQuestion:
|
|
|
|
- A) Continue working on the remaining items
|
|
- B) Show the full saved file
|
|
- C) Just needed the context, thanks
|
|
|
|
If A, summarize the first remaining work item and suggest starting there.
|
|
|
|
---
|
|
|
|
## If no saved contexts exist
|
|
|
|
If Step 1 printed `NO_CHECKPOINTS`, tell the user:
|
|
|
|
"No saved contexts yet. Run `/context-save` first to save your current working
|
|
state, then `/context-restore` will find it."
|
|
|
|
---
|
|
|
|
## Important Rules
|
|
|
|
- **Never modify code.** This skill only reads saved files and presents them.
|
|
- **Always search across all branches by default.** Cross-branch resume is the
|
|
whole point. Only filter by branch if the user explicitly asks via a
|
|
title-fragment match that happens to be branch-specific.
|
|
- **"Most recent" means the filename `YYYYMMDD-HHMMSS` prefix**, not
|
|
`ls -1t` (filesystem mtime). Filenames are stable across file-system
|
|
operations; mtime is not.
|
|
- **This is a gstack skill, not a Claude Code built-in.** When the user types
|
|
`/context-restore`, invoke this skill via the Skill tool.
|