Commit Graph

51 Commits

Author SHA1 Message Date
Tom Boucher
c4b313c60f fix: stale hook detection checks wrong directory path
gsd-check-update.js looked for hooks in configDir/hooks/ (e.g.,
~/.claude/hooks/) but the installer writes hooks to
configDir/get-shit-done/hooks/. This mismatch caused false stale
hook warnings that persisted even after updating.

Also clears the update cache during install so the next session
re-evaluates hook versions with the correct path.

Closes #1249

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 16:24:06 -04:00
Tom Boucher
62db008570 security: add prompt injection guards, path traversal prevention, and input validation
Defense-in-depth security hardening for a codebase where markdown files become
LLM system prompts. Adds centralized security module, PreToolUse hook for
injection detection, and CI-ready codebase scan.

New files:
- security.cjs: path traversal prevention, prompt injection scanner/sanitizer,
  safe JSON parsing, field name validation, shell arg validation
- gsd-prompt-guard.js: PreToolUse hook scans .planning/ writes for injection
- security.test.cjs: 62 unit tests for all security functions
- prompt-injection-scan.test.cjs: CI scan of all agent/workflow/command files

Hardened code paths:
- readTextArgOrFile: path traversal guard (--prd, --text-file)
- cmdStateUpdate/Patch: field name validation prevents regex injection
- cmdCommit: sanitizeForPrompt strips invisible chars from commit messages
- gsd-tools --fields: safeJsonParse wraps unprotected JSON.parse
- cmdFrontmatterGet/Set: null byte rejection
- cmdVerifyPathExists: null byte rejection
- install.js: registers prompt guard hook, updates uninstaller

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 11:38:26 -04:00
Tom Boucher
66a639fe6f fix(hooks): add version header to gsd-workflow-guard.js (#1249)
gsd-workflow-guard.js was missing the // gsd-hook-version: {{GSD_VERSION}}
header that all other hook files have. The stale hook detection in
gsd-check-update.js scans all gsd-*.js files for this header and flags
any without it as stale (hookVersion: 'unknown'). This caused a
persistent '⚠ stale hooks — run /gsd:update' warning in the statusline
even on the latest version.

Added the version header to gsd-workflow-guard.js. Running /gsd:update
will reinstall the hook with the correct version stamp.
2026-03-20 10:43:51 -04:00
Tom Boucher
9ca03ec35e fix: filter stale hooks check to gsd-prefixed files only (#1200)
gsd-check-update.js scanned ALL .js files in the hooks directory and
flagged any without a gsd-hook-version header as stale. This incorrectly
flagged user-created hooks (e.g. guard-edits-outside-project.js),
producing a persistent 'stale hooks' warning that /gsd:update couldn't
resolve.

Fix: filter hookFiles to f.startsWith('gsd-') && f.endsWith('.js')
since all GSD hooks follow the gsd-* naming convention.

Includes regression test validating the filter excludes user hooks.

Closes #1200
2026-03-18 23:29:38 -04:00
Tom Boucher
a6ba3e268e feat: PreToolUse workflow guard hook for rogue edit prevention (#678) (#1197)
New opt-in PreToolUse hook that warns when Claude edits files outside
a GSD workflow context (no active /gsd: command or subagent).

Soft guard — advises, does not block. The edit proceeds but Claude
sees a reminder to use /gsd:fast or /gsd:quick for state tracking.

Enable: set hooks.workflow_guard: true in .planning/config.json
Default: disabled (false)

Allows without warning:
- .planning/ files (GSD state management)
- Config files (.gitignore, .env, CLAUDE.md, settings.json)
- Subagent contexts (executor, planner, etc.)

Includes 3s stdin timeout guard and silent fail-safe.

Closes #678
2026-03-18 17:36:07 -04:00
Tom Boucher
e7198f419f fix: hook version tracking, stale hook detection, stdin timeout, and session-report command (#1153, #1157, #1161, #1162) (#1163)
* fix: hook version tracking, stale hook detection, and stdin timeout increase

- Add gsd-hook-version header to all hook files for version tracking (#1153)
- Install.js now stamps current version into hooks during installation
- gsd-check-update.js detects stale hooks by comparing version headers
- gsd-statusline.js shows warning when stale hooks are detected
- Increase context monitor stdin timeout from 3s to 10s (#1162)
- Set +x permission on hook files during installation (#1162)

Fixes #1153, #1162, #1161

* feat: add /gsd:session-report command for post-session summary generation

Adds a new command that generates SESSION_REPORT.md with:
- Work performed summary (phases touched, commits, files changed)
- Key outcomes and decisions made
- Active blockers and open items
- Estimated resource usage metrics

Reports are written to .planning/reports/ with date-stamped filenames.

Closes #1157

* test: update expected skill count from 39 to 40 for new session-report command
2026-03-18 09:57:20 -06:00
Tom Boucher
2842f076ea fix: CRLF frontmatter parsing, duplicate cwd crash, STATE.md phase transitions (#1105)
- fix(frontmatter): handle CRLF line endings in extractFrontmatter,
  spliceFrontmatter, and parseMustHavesBlock — fixes wave parsing on
  Windows where all plans reported as wave 1 (#1085)

- fix(hooks): remove duplicate const cwd declaration in
  gsd-context-monitor.js that caused SyntaxError on every PostToolUse
  invocation (#1091, #1092, #1094)

- feat(state): add 'state begin-phase' command that updates STATUS,
  Last Activity, Current focus, Current Position, and plan counts
  when a new phase starts executing (#1102, #1103, #1104)

- docs(workflow): add state begin-phase call to execute-phase workflow
  validate_phase step so STATE.md is current from the start
2026-03-16 13:40:21 -06:00
Tom Boucher
406b998d45 feat(hooks): add config option to disable context window warnings (#1073)
Add hooks.context_warnings config option (default: true) that allows
users to disable the context monitor hook's advisory messages. When
set to false, the hook exits silently, allowing Claude Code to reach
auto-compact naturally without being interrupted.

This is useful for long unattended runs where users prefer Claude to
auto-compact and continue rather than stopping to warn about context.

Changes:
- hooks/gsd-context-monitor.js: Check config before emitting warnings
- get-shit-done/templates/config.json: Add hooks.context_warnings default
- get-shit-done/workflows/settings.md: Add UI for the new setting

Fixes #976
2026-03-16 08:51:04 -06:00
Tibsfox
07f44cc1c3 fix(hooks): make context monitor advisory instead of imperative
The context monitor uses imperative language ("STOP new work
immediately. Save state NOW") that overrides user preferences and
causes autonomous state saves in non-GSD sessions. Replace with
advisory messaging that informs the user and respects their control.

- Detect GSD-active sessions via .planning/STATE.md
- GSD sessions: warn user, reference /gsd:pause-work, but don't
  command autonomous saves (STATE.md already tracks state)
- Non-GSD sessions: inform user, explicitly say "Do NOT autonomously
  save state unless the user asks"
- Remove all imperative language (STOP, NOW, immediately)

Closes #884

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 08:01:54 -06:00
Tibsfox
90e7d30839 fix(hooks): respect CLAUDE_CONFIG_DIR for custom config directories
Hooks hardcode ~/.claude/ as the config directory, breaking setups
where Claude Code uses a custom config directory (e.g. multi-account
with CLAUDE_CONFIG_DIR=~/.claude-personal/). The update check hook
shows stale notifications and the statusline reads from wrong paths.

- gsd-check-update.js: check CLAUDE_CONFIG_DIR before filesystem scan
- gsd-statusline.js: use CLAUDE_CONFIG_DIR for todos and cache paths

Closes #870

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 08:01:54 -06:00
Tibsfox
7554503b42 fix(hooks): add stdin timeout guard to prevent hook errors
The context monitor and statusline hooks wait for stdin 'end' event
before processing. On some platforms (Windows/Git Bash), the stdin pipe
may not close cleanly, causing the script to hang until Claude Code's
hook timeout kills it — surfacing as "PostToolUse:Read hook error" after
every tool call. Add a 3-second timeout that exits silently if stdin
doesn't complete, preventing the noisy error messages.

Closes #775

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 08:01:54 -06:00
Tibsfox
59dfad9775 fix(hooks): correct statusline context scaling to match autocompact buffer
The statusline uses a hardcoded 80% scaling factor for context usage,
but Claude Code's actual autocompact buffer is 16.5% (usable context is
83.5%). This inflates the displayed percentage and causes the context
monitor's WARNING/CRITICAL thresholds to fire prematurely.

Replace the 80% scaling with proper normalization against the 16.5%
autocompact buffer. Adjust color thresholds to intuitive levels
(50/65/80% of usable context).

Closes #769

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 08:01:54 -06:00
TÂCHES
fa2fc9c4a3 Merge pull request #825 from Tibsfox/fix/opencode-hardcoded-paths
fix(opencode): detect runtime config directory instead of hardcoding .claude
2026-03-02 16:20:13 -06:00
Tibsfox
77dfd2e068 fix(opencode): detect runtime config directory instead of hardcoding .claude
Three files had hardcoded `.claude` paths that break OpenCode and
Gemini installations where the config directory is `.config/opencode`,
`.opencode`, or `.gemini` respectively.

Changes:
- hooks/gsd-check-update.js: add detectConfigDir() helper that checks
  all runtime directories for get-shit-done/VERSION, falling back to
  .claude. Used for cache dir, project VERSION, and global VERSION.
- commands/gsd/reapply-patches.md: detect runtime directory for both
  global and local patch directories instead of hardcoding ~/.claude/
  and ./.claude/
- workflows/update.md: detect runtime directory for local and global
  VERSION/marker files, and clear cache across all runtime directories

Closes #682

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 05:40:27 -08:00
Tibsfox
630a705bdc fix(gemini): use AfterTool instead of PostToolUse for Gemini CLI hooks
Gemini CLI uses AfterTool as the post-tool hook event name, not
PostToolUse (which is Claude Code's event name). The installer was
registering the context monitor under PostToolUse for all runtimes,
causing Gemini to print "Invalid hook event name" warnings on every
run and silently disabling the context monitor.

Changes:
- install.js: use runtime-aware event name (AfterTool for Gemini,
  PostToolUse for others) when registering context monitor hook
- install.js: uninstall cleans up both PostToolUse and AfterTool
  entries for backward compatibility with existing installs
- gsd-context-monitor.js: runtime-aware hookEventName in output
- docs/context-monitor.md: document both event names with Gemini
  example

Closes #750

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 05:38:11 -08:00
vinicius-tersi
7542d364b4 feat: context window monitor hook with agent-side WARNING/CRITICAL alerts
Adds PostToolUse hook that reads context metrics from statusline bridge file and injects alerts into agent conversation when context is low.

Features:
- Two-tier alerts: WARNING (<=35% remaining) and CRITICAL (<=25%)
- Smart debounce: 5 tool uses between warnings, severity escalation bypasses
- Silent fail: never blocks tool execution
- Security: session_id sanitized to prevent path traversal

Ref #212
2026-02-20 14:40:08 -06:00
Lex Christopherson
9d815d31db Revert 12 PRs merged without authorization
Reverts:
- #413 fix(install): build hooks/dist on the fly for dev installs
- #396 refactor(statusline): display git branch in status line
- #543 Add in-progress state for todos
- #532 feat: add git_tag config option
- #171 Add OpenCode installer package
- #519 feat: Add Mistral Vibe CLI Support
- #389 docs: use @latest for uninstall commands
- #288 fix(install): auto-migrate renamed statusline.js reference
- #502 fix(#501): verify-work defers diagnosis/planning
- #497 fix: move resolved debug sessions to resolved/ folder
- #512 fix: create feature branch before first commit
- #545 fix: add Write tool to gsd-verifier

These were merged without owner approval.
2026-02-14 14:25:26 -06:00
Or Yamin
1bc6d0062f refactor(statusline): display git branch in status line if inside repo (#396)
feat: Display git branch in statusline
2026-02-14 14:18:09 -06:00
Lex Christopherson
1344bd8f18 fix(#466): add detached: true to SessionStart hook spawn for Windows
On Windows, child.unref() alone is insufficient for proper process
detachment. The child process remains in the parent's process group,
causing Claude Code to wait for the hook process tree to exit before
accepting input.

Adding detached: true allows the child process to fully detach on
Windows while maintaining existing behavior on Unix.

Closes #466

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 09:55:21 -06:00
Justin Adams
9d7ea9c188 fix: statusline crash handling, color validation, git staging rules
Fixed three critical bugs and documented findings:

1. hooks/gsd-statusline.js - Added error handling for file system operations
   - Wrapped fs.readdirSync and fs.statSync in try-catch
   - Prevents crashes from permission errors or race conditions

2. bin/install.js - Added hex color validation
   - Validates hex color format (#RGB or #RRGGBB)
   - Prevents invalid colors from being written to config

3. commands/gsd/execute-phase.md - Fixed git staging violation
   - Replaced 'git add -u' with individual file staging
   - Maintains consistency with documented git commit rules

Documentation:
- BUG_REPORT.md - Comprehensive review findings (8 bugs total)
- FIXES_APPLIED.md - Details of fixes applied and testing recommendations

Known issues remaining:
- JSON config parsing uses fragile grep/sed (requires jq or refactor)
- Documented workarounds and recommendations for future fixes

https://claude.ai/code/session_01RAgU8GfJ2dwtBSmJDGzpWA

Co-authored-by: Claude <noreply@anthropic.com>
2026-02-03 11:10:53 -06:00
David Novák
87b2cd0e21 fix: scale context bar to show 100% at actual 80% limit
Claude Code enforces an 80% context window limit as a safety mechanism.
The statusline was showing the raw percentage, which meant the bar never
reached 100% before Claude ran out of context.

This change scales the percentage so that:
- 0% real usage = 0% displayed
- 80% real usage (the actual limit) = 100% displayed

Color thresholds are adjusted accordingly to maintain the same visual
progression (green -> yellow -> orange -> red with skull).

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 12:28:22 -06:00
Lex Christopherson
d1fda80c7f revert: remove codebase intelligence system
Rolled back the intel system due to overengineering concerns:
- 1200+ line hook with SQLite graph database
- 21MB sql.js dependency
- Entity generation spawning additional Claude calls
- Complex system with unclear value

Removed:
- /gsd:analyze-codebase command
- /gsd:query-intel command
- gsd-intel-index.js, gsd-intel-session.js, gsd-intel-prune.js hooks
- gsd-entity-generator, gsd-indexer agents
- entity.md template
- sql.js dependency

Preserved:
- Model profiles feature
- Statusline hook
- All other v1.9.x improvements

-3,065 lines removed

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 10:28:53 -06:00
Lex Christopherson
900fc95efc fix: rename statusline.js to gsd-statusline.js for consistent hook naming
All GSD hooks now use gsd- prefix. Installer updated to clean up old
statusline.js file and hook registration from previous installs.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 11:55:59 -06:00
Lex Christopherson
c1a86cadee fix(04): address tech debt from milestone audit
- Wrap intel content in <codebase-intel> tags in plan-phase.md
- Use ENTITY_DIR constant in isEntityFile() instead of hardcoded path

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 10:42:43 -06:00
Lex Christopherson
791265af29 docs(04-04): add CLI query interface documentation
- Document query interface in file header
- Include usage examples for dependents and hotspots queries
- List available options and output format
2026-01-20 10:13:35 -06:00
Lex Christopherson
f46327a4bf feat(04-04): add CLI query interface to graph database
- Add handleQuery() function to route query actions
- Support dependents and hotspots query types
- Route query actions via stdin handler before Write/Edit
- Return JSON results to stdout for Claude consumption
2026-01-20 10:13:15 -06:00
Lex Christopherson
101bc58795 feat(04-02): integrate graph summary into regeneration flow
- regenerateEntitySummary() now async, prefers graph when available
- Falls back to entity-file-based summary if no graph.db
- Stdin handler properly awaits async regeneration
- SessionStart hook injects graph-backed summary into context

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 09:59:01 -06:00
Lex Christopherson
3d8cf70643 feat(04-02): create graph-backed summary generator
- generateGraphSummary() queries SQLite graph for rich summary
- Includes dependency hotspots with accurate counts from edges
- Groups nodes by type for module overview
- Tracks total relationships
- Target < 500 tokens for context injection

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 09:57:37 -06:00
Lex Christopherson
5824196e4b feat(04-02): add graph query helpers for hotspots and dependents
- getHotspots() queries top N files by dependent count
- getNodesByType() groups nodes by type with counts
- getDependents() uses recursive CTE for transitive traversal

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 09:57:07 -06:00
Lex Christopherson
a39988e8f6 feat(04-01): sync entity files to SQLite graph database
- Add syncEntityToGraph() to upsert nodes and edges on entity write
- Entity id derived from filename, node body contains metadata as JSON
- Wiki-links [[target]] become edges with depends_on relationship
- Delete old edges before inserting new ones for clean updates
- Graph sync runs before summary regeneration
- Silent failures ensure Claude is never blocked

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 09:53:33 -06:00
Lex Christopherson
ec038e7240 feat(04-01): implement graph database helpers
- Add getSQL() for cached sql.js WASM initialization
- Add loadGraphDatabase() to create or load graph.db
- Add persistDatabase() to export in-memory DB to disk
- Singleton pattern avoids repeated WASM init overhead

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 09:52:24 -06:00
Lex Christopherson
11ab4a9218 feat(04-01): add sql.js dependency and graph schema
- Add sql.js ^1.12.0 dependency for WASM SQLite
- Add GRAPH_SCHEMA constant with nodes/edges tables
- Nodes use virtual id from JSON body for upserts
- Edges indexed by source and target for relationship queries

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 09:51:59 -06:00
Lex Christopherson
3a82930579 feat(intel): add self-evolving codebase intelligence
- Add entity.md template for documenting code understanding
- Add update_intel_entity step to executor workflow
- Modify gsd-intel-index.js to parse [[wiki-links]] from entities
- Hook regenerates summary.md with hotspots, modules, recent updates

Executor now creates/updates entity files after each task completion.
Summary automatically reflects accumulated semantic understanding.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 02:05:10 -06:00
Lex Christopherson
9099d48495 perf(intel): simplify SessionStart hook + gitignore intel/
- SessionStart now reads pre-generated summary.md directly
- No more JSON parsing of potentially large index.json
- Added guidance: .planning/intel/ should always be gitignored
  (changes constantly, can be regenerated with /gsd:analyze-codebase)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 01:01:16 -06:00
Lex Christopherson
39ea6f4457 refactor(hooks): rename intel hooks with gsd- prefix
- intel-index.js → gsd-intel-index.js
- intel-session.js → gsd-intel-session.js
- intel-prune.js → gsd-intel-prune.js

Consistent naming allows installer to manage GSD hooks easily.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 00:50:09 -06:00
Lex Christopherson
fa48a13c9c feat(intel): add Stop hook to prune deleted files
New intel-prune.js hook runs after each Claude response.
Checks if indexed files still exist, removes stale entries.

Fast (only fs.existsSync checks) and silent (never blocks).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 00:49:07 -06:00
Lex Christopherson
f0b8afe7cc fix(intel): make PostToolUse hook opt-in only
Hook now checks if .planning/intel/ exists before indexing.
This prevents polluting non-GSD projects with intel files.

Directory is created by:
- /gsd:new-project (during setup)
- /gsd:analyze-codebase (explicit user action)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 00:36:47 -06:00
Lex Christopherson
4b686d17f4 feat(03-01): add summary.md generation to intel-index hook
- Add generateSummary() function for context injection content
- Write summary.md alongside conventions.json on every update
- Target < 500 tokens (top 5 dirs, top 3 suffixes)
- Exclude 'default' from export count
2026-01-20 00:07:08 -06:00
Lex Christopherson
a3521161cd feat(02-02): create SessionStart context injection hook
- Read session metadata from stdin
- Check for startup/resume source
- Read index.json and conventions.json from .planning/intel/
- Silent exit if no intel files present
2026-01-19 23:44:07 -06:00
Lex Christopherson
d77141e985 feat(02-01): integrate convention detection into index update flow
- Call detectConventions() after every index.json write
- Write conventions.json alongside index.json
- No staleness check needed - detection is fast, always regenerated
2026-01-19 23:40:51 -06:00
Lex Christopherson
06ac420326 feat(02-01): add convention detection functions
- Add detectCase() to identify naming conventions (camelCase, PascalCase, snake_case, kebab-case, SCREAMING_SNAKE)
- Add detectConventions() to analyze index for patterns
- Add DIRECTORY_PURPOSES and SUFFIX_PURPOSES lookup tables
- Add MIN_SAMPLES (5) and MIN_MATCH_RATE (0.70) thresholds
2026-01-19 23:40:13 -06:00
Lex Christopherson
992040fa87 feat(01-02): create intel-index.js PostToolUse hook
- Indexes file exports/imports when Claude writes or edits JS/TS files
- Extracts ES6 imports, CommonJS require, side-effect imports
- Extracts named exports, default exports, declaration exports, TypeScript types
- Updates .planning/intel/index.json incrementally
- Silent failure on errors (always exits 0)
2026-01-19 23:13:52 -06:00
Santeri Helminen
c033a85e4a fix(hooks): update check now finds VERSION in local project installs (#166)
The update check script always looked for VERSION in ~/.claude/get-shit-done/,
but GSD can be installed locally in ./.claude/get-shit-done/. This caused
false "update available" notifications when using local installations.

Changes:
- Check project directory first, then fall back to global
- Remove unused execSync import
2026-01-19 14:52:36 -06:00
superresistant
3fb6bfbb50 fix(hooks): prevent console window flash on Windows (#167)
On Windows, the detached spawn option creates a visible console window.
Combined with npm (which is a .cmd batch file), this causes a brief
window flash that steals focus from the user's terminal.

- Remove detached: true (not needed, child.unref() handles non-blocking)
- Add windowsHide: true to both spawn() and inner execSync()
2026-01-19 14:50:30 -06:00
Joshua Shanks
99362f1e5f fix: clamp progress bar value to 0-100 range (#176)
Prevents visual glitches if context usage reports unexpected values
outside the expected 0-100 percentage range.
2026-01-19 14:47:49 -06:00
Lex Christopherson
967734df21 fix: Windows hook support via Node.js conversion
- Convert statusline.sh and gsd-check-update.sh to Node.js
- Remove gsd-notify.sh (blocking popups, not true toasts)
- Remove --force-notify and --no-notify flags from installer
- Use `node` command for cross-platform hook execution

Fixes #114

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 22:56:26 -06:00
Lex Christopherson
b0da21ba51 fix(hooks): remove stale STATE.md from notify hook
STATE.md reflects project state, not session state. It persists across
sessions and shows misleading info like "Phase complete" from previous
work. Now only uses session-scoped todo list.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 13:33:51 -06:00
Lex Christopherson
055cc24ec6 fix(hooks): match STATE.md field names in notify hook
The hook was grepping for `current_phase:` and `status:` but STATE.md
uses `Phase:` and `Status:`. Now shows actual phase info instead of
always falling back to "Ready for input".

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 13:29:51 -06:00
Lex Christopherson
35989f20d7 feat(hooks): add cross-platform completion notification hook
Alerts user when Claude stops (task complete, needs input, etc.)
with context about what completed. Works on Mac (osascript alert),
Linux (notify-send/zenity), and Windows (PowerShell MessageBox).

Follows same optional install pattern as statusline:
- Prompts in interactive mode if existing hook detected
- --force-notify to replace existing
- --no-notify to skip installation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 13:02:01 -06:00
Lex Christopherson
7a451e6410 feat(statusline): show update indicator when new GSD version available
Adds SessionStart hook that checks npm in background, caches result.
Statusline shows "⬆ /gsd:update │" when update available.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 12:53:45 -06:00