mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-02 03:35:09 +02:00
b805aa0113
* feat: add Confusion Protocol to preamble resolver Injects a high-stakes ambiguity gate at preamble tier >= 2 so all workflow skills get it. Fires when Claude encounters architectural decisions, data model changes, destructive operations, or contradictory requirements. Does NOT fire on routine coding. Addresses Karpathy failure mode #1 (wrong assumptions) with an inline STOP gate instead of relying on workflow skill invocation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add Hermes and GBrain host configs Hermes: tool rewrites for terminal/read_file/patch/delegate_task, paths to ~/.hermes/skills/gstack, AGENTS.md config file. GBrain: coding skills become brain-aware when GBrain mod is installed. Same tool rewrites as OpenClaw (agents spawn Claude Code via ACP). GBRAIN_CONTEXT_LOAD and GBRAIN_SAVE_RESULTS NOT suppressed on gbrain host, enabling brain-first lookup and save-to-brain behavior. Both registered in hosts/index.ts with setup script redirect messages. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: GBrain resolver — brain-first lookup and save-to-brain New scripts/resolvers/gbrain.ts with two resolver functions: - GBRAIN_CONTEXT_LOAD: search brain for context before skill starts - GBRAIN_SAVE_RESULTS: save skill output to brain after completion Placeholders added to 4 thinking skill templates (office-hours, investigate, plan-ceo-review, retro). Resolves to empty string on all hosts except gbrain via suppressedResolvers. GBRAIN suppression added to all 9 non-gbrain host configs. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: wire slop:diff into /review as advisory diagnostic Adds Step 3.5 to the review template: runs bun run slop:diff against the base branch to catch AI code quality issues (empty catches, redundant return await, overcomplicated abstractions). Advisory only, never blocking. Skips silently if slop-scan is not installed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add Karpathy compatibility note to README Positions gstack as the workflow enforcement layer for Karpathy-style CLAUDE.md rules (17K stars). Links to forrestchang/andrej-karpathy-skills. Maps each Karpathy failure mode to the gstack skill that addresses it. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: improve native OpenClaw thinking skills office-hours: add design doc path visibility message after writing ceo-review: add HARD GATE reminder at review section transitions retro: add non-git context support (check memory for meeting notes) Mirrors template improvements to hand-crafted native skills. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: update tests and golden fixtures for new hosts - Host count: 8 → 10 (hermes, gbrain) - OpenClaw adapter test: expects undefined (dead code removed) - Golden ship fixtures: updated with Confusion Protocol + vendoring Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: regenerate all SKILL.md files Regenerated from templates after Confusion Protocol, GBrain resolver placeholders, slop:diff in review, HARD GATE reminders, investigation learnings, design doc visibility, and retro non-git context changes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: update project documentation for v0.18.0.0 - CHANGELOG: add v0.18.0.0 entry (Confusion Protocol, Hermes, GBrain, slop in review, Karpathy note, skill improvements) - CLAUDE.md: add hermes.ts and gbrain.ts to hosts listing - README.md: update agent count 8→10, add Hermes + GBrain to table - VERSION: bump to 0.18.0.0 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: sync package.json version to 0.18.0.0 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: extract Step 0 from review SKILL.md in E2E test The review-base-branch E2E test was copying the full 1493-line review/SKILL.md into the test fixture. The agent spent 8+ turns reading it in chunks, leaving only 7 turns for actual work, causing error_max_turns on every attempt. Now extracts only Step 0 (base branch detection, ~50 lines) which is all the test actually needs. Follows the CLAUDE.md rule: "NEVER copy a full SKILL.md file into an E2E test fixture." Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: update GBrain and Hermes host configs for v0.10.0 integration GBrain: add 'triggers' to keepFields so generated skills pass checkResolvable() validation. Add version compat comment. Hermes: un-suppress GBRAIN_CONTEXT_LOAD and GBRAIN_SAVE_RESULTS. The resolvers handle GBrain-not-installed gracefully, so Hermes agents with GBrain as a mod get brain features automatically. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: GBrain resolver DX improvements and preamble health check Resolver changes: - gbrain query → gbrain search (fast keyword search, not expensive hybrid) - Add keyword extraction guidance for agents - Show explicit gbrain put_page syntax with --title, --tags, heredoc - Add entity enrichment with false-positive filter - Name throttle error patterns (exit code 1, stderr keywords) - Add data-research routing for investigate skill - Expand skillSaveMap from 4 to 8 entries - Add brain operation telemetry summary Preamble changes: - Add gbrain doctor --fast --json health check for gbrain/hermes hosts - Parse check failures/warnings count - Show failing check details when score < 50 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: preserve keepFields in allowlist frontmatter mode The allowlist mode hard-coded name + description reconstruction but never iterated keepFields for additional fields. Adding 'triggers' to keepFields was a no-op because the field was silently stripped. Now iterates keepFields and preserves any field beyond name/description from the source template frontmatter, including YAML arrays. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: add triggers to all 38 skill templates Multi-word, skill-specific trigger keywords for GBrain's RESOLVER.md router. Each skill gets 3-6 triggers derived from its "Use when asked to..." description text. Avoids single generic words that would collide across skills (e.g., "debug this" not "debug"). These are distinct from voice-triggers (speech-to-text aliases) and serve GBrain's checkResolvable() validation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: regenerate all SKILL.md files and update golden fixtures Regenerated from updated templates (triggers, brain placeholders, resolver DX improvements, preamble health check). Golden fixtures updated to match. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: settings-hook remove exits 1 when nothing to remove gstack-settings-hook remove was exiting 0 when settings.json didn't exist, causing gstack-uninstall to report "SessionStart hook" as removed on clean systems where nothing was installed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: update project documentation for GBrain v0.10.0 integration ARCHITECTURE.md: added GBRAIN_CONTEXT_LOAD and GBRAIN_SAVE_RESULTS to resolver table. CHANGELOG.md: expanded v0.18.0.0 entry with GBrain v0.10.0 integration details (triggers, expanded brain-awareness, DX improvements, Hermes brain support), updated date. CLAUDE.md: added gbrain to resolvers/ directory comment. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: routing E2E stops writing to user's ~/.claude/skills/ installSkills() was copying SKILL.md files to both project-level (.claude/skills/ in tmpDir) and user-level (~/.claude/skills/). Writing to the user's real install fails when symlinks point to different worktrees or dangling targets (ENOENT on copyFileSync). Now installs to project-level only. The test already sets cwd to the tmpDir, so project-level discovery works. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: scale Gemini E2E back to smoke test Gemini CLI gets lost in worktrees on complex tasks (review times out at 600s, discover-skill hits exit 124). Nobody uses Gemini for gstack skill execution. Replace the two failing tests (gemini-discover-skill and gemini-review-findings) with a single smoke test that verifies Gemini can start and read the README. 90s timeout, no skill invocation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
304 lines
9.3 KiB
Cheetah
304 lines
9.3 KiB
Cheetah
---
|
|
name: checkpoint
|
|
preamble-tier: 2
|
|
version: 1.0.0
|
|
description: |
|
|
Save and resume working state checkpoints. Captures git state, decisions made,
|
|
and remaining work so you can pick up exactly where you left off — even across
|
|
Conductor workspace handoffs between branches.
|
|
Use when asked to "checkpoint", "save progress", "where was I", "resume",
|
|
"what was I working on", or "pick up where I left off".
|
|
Proactively suggest when a session is ending, the user is switching context,
|
|
or before a long break. (gstack)
|
|
allowed-tools:
|
|
- Bash
|
|
- Read
|
|
- Write
|
|
- Glob
|
|
- Grep
|
|
- AskUserQuestion
|
|
triggers:
|
|
- save progress
|
|
- checkpoint this
|
|
- resume where i left off
|
|
---
|
|
|
|
{{PREAMBLE}}
|
|
|
|
# /checkpoint — Save and Resume Working State
|
|
|
|
You are a **Staff Engineer who keeps meticulous session notes**. Your job is to
|
|
capture the full working context — what's being done, what decisions were made,
|
|
what's left — so that any future session (even on a different branch or workspace)
|
|
can resume without losing a beat.
|
|
|
|
**HARD GATE:** Do NOT implement code changes. This skill captures and restores
|
|
context only.
|
|
|
|
---
|
|
|
|
## Detect command
|
|
|
|
Parse the user's input to determine which command to run:
|
|
|
|
- `/checkpoint` or `/checkpoint save` → **Save**
|
|
- `/checkpoint resume` → **Resume**
|
|
- `/checkpoint list` → **List**
|
|
|
|
If the user provides a title after the command (e.g., `/checkpoint auth refactor`),
|
|
use it as the checkpoint title. Otherwise, infer a title from the current work.
|
|
|
|
---
|
|
|
|
## Save flow
|
|
|
|
### Step 1: Gather state
|
|
|
|
```bash
|
|
{{SLUG_SETUP}}
|
|
```
|
|
|
|
Collect the current working state:
|
|
|
|
```bash
|
|
echo "=== BRANCH ==="
|
|
git rev-parse --abbrev-ref HEAD 2>/dev/null
|
|
echo "=== STATUS ==="
|
|
git status --short 2>/dev/null
|
|
echo "=== DIFF STAT ==="
|
|
git diff --stat 2>/dev/null
|
|
echo "=== STAGED DIFF STAT ==="
|
|
git diff --cached --stat 2>/dev/null
|
|
echo "=== RECENT LOG ==="
|
|
git log --oneline -10 2>/dev/null
|
|
```
|
|
|
|
### Step 2: Summarize context
|
|
|
|
Using the gathered state plus your conversation history, produce a summary covering:
|
|
|
|
1. **What's being worked on** — the high-level goal or feature
|
|
2. **Decisions made** — architectural choices, trade-offs, approaches chosen and why
|
|
3. **Remaining work** — concrete next steps, in priority order
|
|
4. **Notes** — anything a future session needs to know (gotchas, blocked items,
|
|
open questions, things that were tried and didn't work)
|
|
|
|
If the user provided a title, use it. Otherwise, infer a concise title (3-6 words)
|
|
from the work being done.
|
|
|
|
### Step 3: Compute session duration
|
|
|
|
Try to determine how long this session has been active:
|
|
|
|
```bash
|
|
# Try _TEL_START (Conductor timestamp) first, then shell process start time
|
|
if [ -n "$_TEL_START" ]; then
|
|
START_EPOCH="$_TEL_START"
|
|
elif [ -n "$PPID" ]; then
|
|
START_EPOCH=$(ps -o lstart= -p $PPID 2>/dev/null | xargs -I{} date -jf "%c" "{}" "+%s" 2>/dev/null || echo "")
|
|
fi
|
|
if [ -n "$START_EPOCH" ]; then
|
|
NOW=$(date +%s)
|
|
DURATION=$((NOW - START_EPOCH))
|
|
echo "SESSION_DURATION_S=$DURATION"
|
|
else
|
|
echo "SESSION_DURATION_S=unknown"
|
|
fi
|
|
```
|
|
|
|
If the duration cannot be determined, omit the `session_duration_s` field from the
|
|
checkpoint file.
|
|
|
|
### Step 4: Write checkpoint file
|
|
|
|
```bash
|
|
{{SLUG_SETUP}}
|
|
CHECKPOINT_DIR="$HOME/.gstack/projects/$SLUG/checkpoints"
|
|
mkdir -p "$CHECKPOINT_DIR"
|
|
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
|
|
echo "CHECKPOINT_DIR=$CHECKPOINT_DIR"
|
|
echo "TIMESTAMP=$TIMESTAMP"
|
|
```
|
|
|
|
Write the checkpoint file to `{CHECKPOINT_DIR}/{TIMESTAMP}-{title-slug}.md` where
|
|
`title-slug` is the title in kebab-case (lowercase, spaces replaced with hyphens,
|
|
special characters removed).
|
|
|
|
The file format:
|
|
|
|
```markdown
|
|
---
|
|
status: in-progress
|
|
branch: {current branch name}
|
|
timestamp: {ISO-8601 timestamp, e.g. 2026-03-31T14:30:00-07:00}
|
|
session_duration_s: {computed duration, omit if unknown}
|
|
files_modified:
|
|
- path/to/file1
|
|
- path/to/file2
|
|
---
|
|
|
|
## Working on: {title}
|
|
|
|
### Summary
|
|
|
|
{1-3 sentences describing the high-level goal and current progress}
|
|
|
|
### Decisions Made
|
|
|
|
{Bulleted list of architectural choices, trade-offs, and reasoning}
|
|
|
|
### Remaining Work
|
|
|
|
{Numbered list of concrete next steps, in priority order}
|
|
|
|
### Notes
|
|
|
|
{Gotchas, blocked items, open questions, things tried that didn't work}
|
|
```
|
|
|
|
The `files_modified` list comes from `git status --short` (both staged and unstaged
|
|
modified files). Use relative paths from the repo root.
|
|
|
|
After writing, confirm to the user:
|
|
|
|
```
|
|
CHECKPOINT SAVED
|
|
════════════════════════════════════════
|
|
Title: {title}
|
|
Branch: {branch}
|
|
File: {path to checkpoint file}
|
|
Modified: {N} files
|
|
Duration: {duration or "unknown"}
|
|
════════════════════════════════════════
|
|
```
|
|
|
|
---
|
|
|
|
## Resume flow
|
|
|
|
### Step 1: Find checkpoints
|
|
|
|
```bash
|
|
{{SLUG_SETUP}}
|
|
CHECKPOINT_DIR="$HOME/.gstack/projects/$SLUG/checkpoints"
|
|
if [ -d "$CHECKPOINT_DIR" ]; then
|
|
find "$CHECKPOINT_DIR" -maxdepth 1 -name "*.md" -type f 2>/dev/null | xargs ls -1t 2>/dev/null | head -20
|
|
else
|
|
echo "NO_CHECKPOINTS"
|
|
fi
|
|
```
|
|
|
|
List checkpoints from **all branches** (checkpoint files contain the branch name
|
|
in their frontmatter, so all files in the directory are candidates). This enables
|
|
Conductor workspace handoff — a checkpoint saved on one branch can be resumed from
|
|
another.
|
|
|
|
### Step 2: Load checkpoint
|
|
|
|
If the user specified a checkpoint (by number, title fragment, or date), find the
|
|
matching file. Otherwise, load the **most recent** checkpoint.
|
|
|
|
Read the checkpoint file and present a summary:
|
|
|
|
```
|
|
RESUMING CHECKPOINT
|
|
════════════════════════════════════════
|
|
Title: {title}
|
|
Branch: {branch from checkpoint}
|
|
Saved: {timestamp, human-readable}
|
|
Duration: Last session was {formatted duration} (if available)
|
|
Status: {status}
|
|
════════════════════════════════════════
|
|
|
|
### Summary
|
|
{summary from checkpoint}
|
|
|
|
### Remaining Work
|
|
{remaining work items from checkpoint}
|
|
|
|
### Notes
|
|
{notes from checkpoint}
|
|
```
|
|
|
|
If the current branch differs from the checkpoint's branch, note this:
|
|
"This checkpoint 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 the checkpoint, ask via AskUserQuestion:
|
|
|
|
- A) Continue working on the remaining items
|
|
- B) Show the full checkpoint file
|
|
- C) Just needed the context, thanks
|
|
|
|
If A, summarize the first remaining work item and suggest starting there.
|
|
|
|
---
|
|
|
|
## List flow
|
|
|
|
### Step 1: Gather checkpoints
|
|
|
|
```bash
|
|
{{SLUG_SETUP}}
|
|
CHECKPOINT_DIR="$HOME/.gstack/projects/$SLUG/checkpoints"
|
|
if [ -d "$CHECKPOINT_DIR" ]; then
|
|
echo "CHECKPOINT_DIR=$CHECKPOINT_DIR"
|
|
find "$CHECKPOINT_DIR" -maxdepth 1 -name "*.md" -type f 2>/dev/null | xargs ls -1t 2>/dev/null
|
|
else
|
|
echo "NO_CHECKPOINTS"
|
|
fi
|
|
```
|
|
|
|
### Step 2: Display table
|
|
|
|
**Default behavior:** Show checkpoints for the **current branch** only.
|
|
|
|
If the user passes `--all` (e.g., `/checkpoint list --all`), show checkpoints
|
|
from **all branches**.
|
|
|
|
Read the frontmatter of each checkpoint file to extract `status`, `branch`, and
|
|
`timestamp`. Parse the title from the filename (the part after the timestamp).
|
|
|
|
Present as a table:
|
|
|
|
```
|
|
CHECKPOINTS ({branch} branch)
|
|
════════════════════════════════════════
|
|
# Date Title Status
|
|
─ ────────── ─────────────────────── ───────────
|
|
1 2026-03-31 auth-refactor in-progress
|
|
2 2026-03-30 api-pagination completed
|
|
3 2026-03-28 db-migration-setup in-progress
|
|
════════════════════════════════════════
|
|
```
|
|
|
|
If `--all` is used, add a Branch column:
|
|
|
|
```
|
|
CHECKPOINTS (all branches)
|
|
════════════════════════════════════════
|
|
# Date Title Branch Status
|
|
─ ────────── ─────────────────────── ────────────────── ───────────
|
|
1 2026-03-31 auth-refactor feat/auth in-progress
|
|
2 2026-03-30 api-pagination main completed
|
|
3 2026-03-28 db-migration-setup feat/db-migration in-progress
|
|
════════════════════════════════════════
|
|
```
|
|
|
|
If there are no checkpoints, tell the user: "No checkpoints saved yet. Run
|
|
`/checkpoint` to save your current working state."
|
|
|
|
---
|
|
|
|
## Important Rules
|
|
|
|
- **Never modify code.** This skill only reads state and writes checkpoint files.
|
|
- **Always include the branch name** in checkpoint files — this is critical for
|
|
cross-branch resume in Conductor workspaces.
|
|
- **Checkpoint files are append-only.** Never overwrite or delete existing checkpoint
|
|
files. Each save creates a new file.
|
|
- **Infer, don't interrogate.** Use git state and conversation context to fill in
|
|
the checkpoint. Only use AskUserQuestion if the title genuinely cannot be inferred.
|