Closes #3347 Config: - Add graphify.auto_update (default false) to manifests: sdk/shared/config-defaults.manifest.json, config-schema.manifest.json Hook: - hooks/gsd-graphify-update.sh — PostToolUse Bash matcher - Gates: tool_name=Bash, HEAD-advancing git op, CI=unset, in git repo, current branch == default branch (git.base_branch override or main/ master/trunk fallback), graphify.enabled && graphify.auto_update both true, graphify on PATH, no live PID lock - Writes .planning/graphs/.last-build-status.json with status=running synchronously, then detaches hooks/lib/gsd-graphify-rebuild.sh - hooks/lib/gsd-graphify-rebuild.sh — detached rebuild runner - PID-lock acquire + trap-on-exit cleanup - graphify update . then cp graphify-out/* → .planning/graphs/ - Status file rewritten to status=ok|failed with exit_code, duration_ms, head_at_build - Portable detach (subshell + disown, no setsid dependency) Installer: - bin/install.js: register hook as PostToolUse Bash matcher (5s timeout) - Add to gsdHooks uninstall list and expectedShHooks warning list Planner / researcher status surface (issue #3347 reviewer must-have AC): - agents/gsd-planner.md and agents/gsd-phase-researcher.md load_graph_context steps now read .last-build-status.json and surface: running → "rebuild in flight"; failed → "auto-rebuild FAILED at {ts}, context is from prior build"; ok with stale head_at_build → "HEAD has advanced since last build" Settings: - get-shit-done/workflows/settings.md adds "Graph auto-update" question with No-Recommended default; bullets and update_config block updated Inventory: - docs/INVENTORY.md hook count 12 → 13 with new row - docs/INVENTORY-MANIFEST.json regenerated Tests: - tests/feat-3347-graphify-auto-update-config.test.cjs (8 tests): isValidConfigKey accepts graphify.auto_update, CANONICAL_CONFIG_DEFAULTS default false, config-set round-trip, sibling key preservation - tests/feat-3347-graphify-auto-update-hook.test.cjs (18 tests): all bail paths (non-Bash, non-HEAD-advancing, enabled=false, auto_update=false, CI=true, non-default-branch, missing graphify bin, live-PID lock), dispatch path with mock graphify bin (sync running status + detached transition to ok/failed), stale-PID lock, all five HEAD-advancing command matchers, git.base_branch override Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1.4 KiB
type, pr
| type | pr |
|---|---|
| Added | 0 |
Opt-in: auto-rebuild knowledge graph after main HEAD advances — new config key graphify.auto_update (default false) and bundled PostToolUse hook hooks/gsd-graphify-update.sh keep the .planning/graphs/graph.json consumed by gsd-planner and gsd-phase-researcher current without manual /gsd:graphify build runs. When both graphify.enabled and graphify.auto_update are true, the hook fires after Bash tool calls matching HEAD-advancing git ops (commit, merge, pull, rebase --continue, cherry-pick) on the default branch, writes a synchronous running status to .planning/graphs/.last-build-status.json, then dispatches graphify update . in a detached subprocess that updates the status file to ok (with duration_ms + head_at_build) or failed (with exit_code). The planner and researcher's load_graph_context steps now surface the auto-build state alongside the existing staleness annotation — including the must-have failure-surface case from the issue review ("auto-rebuild FAILED at {ts}; context is from the prior build"). PID-locked against concurrent rebuilds (stale-PID tolerant via kill -0), CI-aware ($CI env suppresses), and bails silently if graphify is not on PATH or the current branch is not the default. /gsd:settings adds a "Graph auto-update" question gated on Graphify being enabled. Closes #3347.