mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-02 23:14:33 +01:00
The Step 7.5 gate is rewritten as a consent question (manual merge of s09 H5, with H1b and H6): it checks gstack-config has, asks once with A) recent, B) all history, E) never, names Claude Code and Codex sessions from every repo-policy-allowed project and the destination brain, stores the mode value (never the letter), asks yes/no when no transcripts exist, never asks spawned or headless sessions, and drops the silent no-question bulk paths and the false skill-start-hook claim (s09 H5c). Path 4 no longer stores off on the user's behalf. /sync-gbrain gains Step 1.6 (ask when the key is absent or holds a legacy value). Step 10 and the sync verdict show the mode. setup-gbrain/memory.md gains #transcripts (values, sources, destination, override precedence, one-time restage, held staged pages, already-ingested pages stay). W7a: setup-gbrain-bin-invocation-paths drops the silent-bulk and preamble-hook pins (that prose is gone) for negative checks (no pre-answer --bulk, no skill-start claim), loosens the gstack-config pin (t06 #18) to the command without <choice>, and adds the DX 'gated on has' order check for both skills.
91 lines
3.9 KiB
Cheetah
91 lines
3.9 KiB
Cheetah
After memory sync is wired (Step 7) but before persisting the CLAUDE.md
|
|
config (Step 8), ask whether this machine's coding-agent session
|
|
transcripts may go into gbrain. Curated `~/.gstack/` artifacts (learnings,
|
|
timeline, plans, designs, retros) sync whatever the answer; this question
|
|
covers transcripts only. Transcripts are ingested only after the user picks
|
|
`recent` or `all`.
|
|
|
|
Check whether the user already chose. The gate keys on `has`, because `get`
|
|
prints the `off` default for a key that was never set:
|
|
```bash
|
|
_TIM=$(~/.claude/skills/gstack/bin/gstack-config get transcript_ingest_mode 2>/dev/null || true)
|
|
if ~/.claude/skills/gstack/bin/gstack-config has transcript_ingest_mode; then
|
|
case "$(printf '%s' "$_TIM" | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]')" in
|
|
recent|all|off) echo "TRANSCRIPT_MODE: $_TIM" ;;
|
|
*) echo "TRANSCRIPT_MODE: ask (stored value '$_TIM' is from an older version)" ;;
|
|
esac
|
|
else
|
|
echo "TRANSCRIPT_MODE: ask (not set)"
|
|
fi
|
|
```
|
|
|
|
- `TRANSCRIPT_MODE: recent`, `all` or `off`: the user already chose. Do not
|
|
ask again; continue to Step 8.
|
|
- `TRANSCRIPT_MODE: ask`: ask once, below. With `SESSION_KIND: spawned` or
|
|
`headless`, do not ask and do not store a value. Consent is never
|
|
auto-chosen; leave the key unset (transcripts stay skipped) and report
|
|
that the next interactive `/sync-gbrain` will ask.
|
|
|
|
Size the question with two probes. `--sources transcript` makes the probe
|
|
count transcripts even though none are consented yet:
|
|
```bash
|
|
bun run ~/.claude/skills/gstack/bin/gstack-memory-ingest.ts --probe --sources transcript
|
|
bun run ~/.claude/skills/gstack/bin/gstack-memory-ingest.ts --probe --sources transcript --all-history
|
|
```
|
|
Read `Total files in window`, `Total bytes` and the estimate from each.
|
|
|
|
**No transcripts found** (both probes report 0): ask yes/no instead:
|
|
|
|
> "Ingest coding-agent sessions as they appear?"
|
|
|
|
Yes stores `recent`; No stores `off`.
|
|
|
|
**Otherwise**, AskUserQuestion with the counts. Name both session sources
|
|
and the destination brain from Step 4: the user's Supabase brain (Paths 1,
|
|
2a, 2b) or the local PGLite brain on this machine (Path 3).
|
|
|
|
> "Found <N_recent> Claude Code and Codex sessions from the last 90 days
|
|
> (<N_all> in all history, <bytes>) across the projects on this machine
|
|
> that your repo policy allows. Ingest them into your <Supabase | local
|
|
> PGLite> brain?
|
|
>
|
|
> What you get: gstack skills load recent context from your past sessions,
|
|
> so the agent finds your prior work without you describing it, and you
|
|
> can ask 'what was I doing on day X'. Per-session pages are searchable,
|
|
> taggable and deletable. Secret scanning runs before any push.
|
|
>
|
|
> What stays the same: nothing leaves this machine unless brain sync is
|
|
> enabled (Step 7). Per-repo trust policies still apply. The first full
|
|
> sync can take a while on a large history (estimate: <est>); skills stay
|
|
> usable while it runs.
|
|
>
|
|
> Multi-machine note: with brain sync enabled, transcript pages sync across
|
|
> your machines. Deleting a page later removes it from gbrain, but git
|
|
> history keeps it in earlier commits. Use `gstack-transcript-prune` to
|
|
> delete in bulk, and `git filter-repo` on the brain remote to remove it
|
|
> from history."
|
|
|
|
Options:
|
|
- A) Yes, last 90 days (`recent`)
|
|
- B) Yes, all history (`all`)
|
|
- E) No, never ingest transcripts (`off`)
|
|
|
|
Store the mode value, never the letter:
|
|
```bash
|
|
~/.claude/skills/gstack/bin/gstack-config set transcript_ingest_mode <recent|all|off>
|
|
```
|
|
|
|
For `recent` or `all`, run the first sync now:
|
|
```bash
|
|
bun run ~/.claude/skills/gstack/bin/gstack-gbrain-sync.ts --full --no-brain-sync
|
|
```
|
|
(`--no-brain-sync` because Step 7 already wired that path; this runs the
|
|
code import and memory ingest stages, and `all` walks the full history.)
|
|
For `off`, run nothing here; other memory still syncs on the next
|
|
`/sync-gbrain`.
|
|
|
|
New transcripts are ingested on the next `/sync-gbrain` run. Nothing at
|
|
skill start ingests them.
|
|
|
|
Reference doc for users: `setup-gbrain/memory.md#transcripts`.
|