gstack/context-restore/SKILL.md.tmpl

194 lines
6.7 KiB
Cheetah
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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.