mirror of https://github.com/garrytan/gstack.git
194 lines
6.7 KiB
Cheetah
194 lines
6.7 KiB
Cheetah
---
|
||
name: context-restore
|
||
preamble-tier: 2
|
||
version: 1.0.0
|
||
description: |
|
||
Restore working context saved earlier by /save or legacy /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 /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` → display the same cross-branch candidate list from
|
||
Step 1 and exit without loading a file.
|
||
|
||
---
|
||
|
||
## Restore flow
|
||
|
||
### Step 1: Find saved contexts
|
||
|
||
```bash
|
||
{{SLUG_SETUP}}
|
||
eval "$(~/.claude/skills/gstack/bin/gstack-paths)"
|
||
CHECKPOINT_DIR="$GSTACK_STATE_ROOT/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.
|
||
# Cap at 20 most recent: a user with 10k saved files shouldn't blow the
|
||
# context window just listing them. /context-save list handles pagination.
|
||
FILES=$(find "$CHECKPOINT_DIR" -maxdepth 1 -name "*.md" -type f 2>/dev/null | sort -r | head -20)
|
||
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:
|
||
|
||
Then inspect the sibling Universal Save receipt without writing anything:
|
||
|
||
```bash
|
||
# Set CHOSEN_FILE to the exact checkpoint selected above.
|
||
RECEIPT_FILE="${CHOSEN_FILE%.md}.receipt.json"
|
||
if [ -f "$RECEIPT_FILE" ]; then
|
||
echo "RECEIPT_FILE=$RECEIPT_FILE"
|
||
else
|
||
echo "LEGACY_CHECKPOINT_NO_RECEIPT"
|
||
fi
|
||
```
|
||
|
||
If `RECEIPT_FILE` exists, read it and include:
|
||
|
||
- `receipt_schema_version` (`missing` means supported legacy v0; versions above
|
||
`1` are unsupported and must produce a warning rather than a green claim);
|
||
- `verification.layers` statuses for working checkpoint, Codex Brain, Obsidian
|
||
bridge and QMD;
|
||
- exact `receipt_path` and `restore.command`;
|
||
- the first item under `### Что осталось` / `### Remaining Work` as the next
|
||
action.
|
||
|
||
If any layer is absent or not `ok`, start the result with
|
||
`ВОССТАНОВЛЕНИЕ С ПРЕДУПРЕЖДЕНИЕМ` and name the exact layer. Do not run save,
|
||
resume, QMD update/embed or any write from this read-only skill. A legacy
|
||
checkpoint without a receipt remains restorable, but label its four-layer status
|
||
as `не подтверждён`.
|
||
|
||
Present the human-facing result in Russian:
|
||
|
||
```
|
||
ВОССТАНОВЛЕНИЕ КОНТЕКСТА
|
||
════════════════════════════════════════
|
||
Название: {title}
|
||
Ветка: {branch from frontmatter}
|
||
Сохранено: {timestamp, human-readable}
|
||
Длительность:{formatted duration, if available}
|
||
Статус: {status}
|
||
Квитанция: {receipt path or legacy}
|
||
════════════════════════════════════════
|
||
|
||
### Кратко
|
||
{summary from saved file}
|
||
|
||
### Состояние четырёх слоёв
|
||
Checkpoint: {status}
|
||
Codex Brain: {status}
|
||
Obsidian: {status}
|
||
QMD: {status}
|
||
|
||
### Что осталось
|
||
{remaining work items}
|
||
|
||
### Примечания
|
||
{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:
|
||
|
||
"Сохранённых контекстов пока нет. Запустите `/save`, затем
|
||
`/context-restore` найдёт сохранение."
|
||
|
||
---
|
||
|
||
## Important Rules
|
||
|
||
- **Never modify code.** This skill only reads saved files and presents them.
|
||
- **Never mutate a receipt.** Receipt inspection and four-layer verification
|
||
display are read-only; repair belongs to `/save` resume flow.
|
||
- **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.
|