feat(graceful-handoff): 2.0 — migrate to skills/ with disable-model-invocation [skip-docs]

Step 1 of v2.0 plan. Hard cut from commands/ to skills/ per Anthropic
recommendation for new plugins. Frontmatter sets disable-model-invocation:
true and pins model: claude-sonnet-4-6. Docs (README, CLAUDE.md, root
README) deferred to Step 9 per plan.
This commit is contained in:
Kjell Tore Guttormsen 2026-05-01 05:45:26 +02:00
commit 1a65d8e4d5
12 changed files with 331 additions and 355 deletions

View file

@ -0,0 +1,98 @@
---
name: graceful-handoff
description: Produser handoff-artefakt, commit+push, og copy-paste-prompt for neste sesjon. Bruk når du nærmer deg 60-70% kontekst og må fortsette arbeidet i en ny sesjon uten tap.
argument-hint: "[topic-slug] [--no-commit] [--dry-run]"
disable-model-invocation: true
model: claude-sonnet-4-6
allowed-tools: Bash(git:*) Bash(jq:*) Bash(node:*) Bash(find:*) Bash(pwd:*) Read Write Glob
---
# Graceful Handoff — sesjonsoverlevering v2.0
Orkestrerer JSON-pipeline-skriptet og fyller copy-paste-template-en for neste sesjon. Selve pipelinen (state-deteksjon, classification, fil-skriving, commit, push) er deterministisk og lever i `scripts/handoff-pipeline.mjs`. Denne skill-en er en tynn wrapper.
**Tidsbudsjett:** Hele kjøringen skal ligge under 60 sekunder reell tid. Bruker er typisk på 60-70% kontekst når de trigger dette — ingen Agent-delegering, ingen WebSearch.
## Hvordan kjøres
1. **Parse `$ARGUMENTS`** (kombinert streng). Støtt flag i vilkårlig rekkefølge.
- `[topic-slug]` — kebab-case, styrer filnavnet
- `--no-commit` — hopp over commit/push, bruker håndterer manuelt
- `--dry-run` — print hva som ville skjedd, ingen filer/git
- `--no-push` — commit OK men ikke push (Stop hook bruker dette i auto-eksekvering)
- `--auto` — non-interactive, auto-Y på commit-bekreftelse (kun for hooks)
- `--non-interactive` — uten `--auto`: feil; med `--auto`: kjør uten prompts
2. **Kjør pipeline-skriptet:**
```bash
node ${CLAUDE_PLUGIN_ROOT}/scripts/handoff-pipeline.mjs <args>
```
3. **Parse JSON-output** fra stdout. Forventet schema:
```json
{
"handoff_type": "multi-sesjon | plugin-arbeid | enkelt-oppgave",
"write_dir": "/abs/path",
"artifact_path": "/abs/path/NEXT-SESSION-...",
"next_steps": ["..."],
"git_status": { "branch": "...", "dirty": true, "ahead": 2 },
"commit_message": "...",
"actions_taken": ["wrote artifact", "committed", "pushed"],
"errors": []
}
```
4. **Hvis `errors[]` non-empty:** rapporter feilene til bruker, ikke fortsett. Foreslå manuelle skritt fra `next_steps`.
5. **Hvis interaktiv (default):** Skriptet skriver commit-bekreftelses-prompten til stderr. Modellen leser stderr-output og presenterer Y/n-valget til bruker via AskUserQuestion. Send svaret tilbake til skriptet via stdin. (NB: I denne skill-konteksten kan modellen også vise commit-meldingen direkte og spørre — fleksibelt.)
6. **Når ferdig:** Print copy-paste-prompt fra `next_steps` JSON til bruker:
```
════════════════════════════════════════════════════════════
NESTE SESJON — copy-paste til ny Claude:
════════════════════════════════════════════════════════════
cd <absolute-WRITE_DIR>
cat <NEXT-SESSION-filnavn>
git log --oneline -5
git status
Fortsett fra <konkret neste handling — én setning>.
════════════════════════════════════════════════════════════
Artefakt: <full sti til NEXT-SESSION-filen>
Commit: <siste SHA eller "ingen endringer">
Push: <"pushet til Forgejo" eller "skippet (flag / ingenting)">
════════════════════════════════════════════════════════════
```
## Når brukes den
- **Manuelt:** kjør `/graceful-handoff` selv ved 60-70% kontekst
- **Automatisk:** Stop hook kaller `handoff-pipeline.mjs --auto --no-push` ved estimert ≥70%. Skill-en invokeres IKKE i auto-modus — hook-en kaller skriptet direkte for å bevare `disable-model-invocation: true`.
## Hva blir skrevet
- `NEXT-SESSION-PROMPT.local.md` (eller `NEXT-SESSION-<slug>.local.md`) i riktig WRITE_DIR
- `REMEMBER.md` oppdatert hvis den finnes
- `TODO.md` oppdatert hvis den finnes
- Git commit + push (med mindre `--no-commit` eller `--no-push`)
## Push-policy
- Direkte push til `main` på Forgejo er pre-autorisert
- Aldri GitHub — kun Forgejo (`git.fromaitochitta.com`)
- Pre-commit hooks respekteres uten `--no-verify`
## Begrensninger (v2.0)
- Auto-eksekvering ved kontekst-terskel er approksimasjon basert på transcript-størrelse, ikke Claude's reelle kontekst-måling. Estimat kan avvike ±10% — terskel satt konservativt til 70%.
- statusLine-plassering i `hooks/hooks.json` er antakelse; smoke-test før release.
- `disable-model-invocation: true` har en åpen issue (#26251) som potensielt kan blokkere user-invocation. Verifiser med smoke-test.
## Feilsøking
- Pipeline-skriptet feiler: kjør med `--dry-run` for å se hva det ville gjort
- Git-state uvanlig (detached HEAD, ingen remote): pipeline returnerer `errors[]`, ikke crash
- Stop hook trigger for tidlig/sent: terskel kan justeres i `hooks/scripts/stop-context-monitor.mjs` (look for `0.70`)