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>
This commit is contained in:
Lex Christopherson
2026-01-20 00:50:09 -06:00
parent fa48a13c9c
commit 39ea6f4457
6 changed files with 2163 additions and 9 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,360 @@
# Technical Research: Self-Evolving Codebase Intelligence for GSD
## Strategic Summary
The most mind-blowing approach combines **semantic code indexing** (tree-sitter AST + voyage-code-3 embeddings), **adaptive pattern learning** (conventions extracted and refined through feedback), and **self-improving compliance** (the system gets smarter about YOUR codebase over time). Instead of static indices that go stale, this creates a **living knowledge graph** that understands not just what code exists, but WHY it's structured that way—and enforces that understanding during execution.
**Recommendation:** Approach 3 (Self-Evolving Intelligence) - because "mindblowing" means the system should feel like it genuinely understands your codebase and gets better over time.
## Requirements
- Zero external services (local-first, works offline)
- Sub-second queries (can't slow down Claude's planning/execution)
- Adaptive learning (improves from corrections without manual intervention)
- Works across language ecosystems (not just TypeScript)
- Integrates seamlessly with existing GSD workflow
- Minimal storage overhead (< 50MB for typical project)
---
## Approach 1: Static JSON Indices with Stale Detection
**How it works:** Generate JSON indices during `map-codebase`, store commit hash in metadata, refresh lazily when HEAD moves.
**Libraries/tools:**
- tree-sitter (AST parsing) - `npm install tree-sitter tree-sitter-typescript tree-sitter-python`
- Node.js built-in fs for JSON persistence
- Git hooks via husky or manual `.git/hooks/post-commit`
**Pros:**
- Simple to implement (~500 lines)
- No external dependencies
- Fast queries (JSON parse + lookup)
- Familiar format (developers can hand-edit)
**Cons:**
- Indices go stale between sessions
- No semantic understanding (just structural data)
- Manual schema maintenance
- Doesn't learn from corrections
**Best when:** You want quick wins with minimal complexity
**Complexity:** S
---
## Approach 2: Semantic Search with Local Embeddings
**How it works:** Embed code chunks using voyage-code-3, store in sqlite-vec, enable semantic queries like "find authentication logic" or "code that validates user input."
**Libraries/tools:**
- `voyage-code-3` via API (200M tokens free, $0.06/1M after)
- `sqlite-vec` - pure C, runs anywhere SQLite runs
- `tree-sitter` for intelligent chunking (function-level, not file-level)
- `better-sqlite3` for Node.js bindings
**Architecture:**
```
Code Changes → Tree-sitter chunks → voyage-code-3 embeds → sqlite-vec stores
↓
Query ("auth logic") → embed query → sqlite-vec similarity → ranked results
```
**Pros:**
- Semantic understanding ("find error handling" works even with varied naming)
- Hybrid search possible (FTS5 keywords + vector similarity)
- Local-first with cloud embeddings (best of both)
- Works across languages (voyage-code-3 trained on 80+ languages)
**Cons:**
- Requires API calls for embedding (latency, cost at scale)
- More complex setup
- Still doesn't learn conventions automatically
- Embedding drift as model versions change
**Best when:** You need powerful search across large/unfamiliar codebases
**Complexity:** M
---
## Approach 3: Self-Evolving Codebase Intelligence (The Mind-Blowing One)
**How it works:** Three-layer system that builds understanding incrementally and learns from corrections.
### Layer 1: Structural Index (Tree-sitter AST)
Fast, deterministic extraction of code structure:
- Functions, classes, exports, imports
- File patterns and naming conventions
- Directory structure and module boundaries
### Layer 2: Semantic Memory (Embeddings + Patterns)
Understanding what code DOES, not just what it IS:
- Function-level embeddings via voyage-code-3
- Pattern clusters detected via embedding similarity
- Convention rules extracted from consistent patterns
### Layer 3: Adaptive Learning (The Magic)
The system improves from every interaction:
- When Claude deviates from conventions and you correct it → system learns
- When Claude asks "should this be a service or util?" and you answer → system remembers
- Confidence scores that increase with consistent patterns, decrease with exceptions
**Architecture:**
```
┌─────────────────────────────────────────────────────────────────┐
│ Codebase Intelligence │
├─────────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ STRUCTURE │ │ SEMANTICS │ │ LEARNED RULES │ │
│ │ (AST/JSON) │ │ (Embeddings)│ │ (Adaptive/Scored) │ │
│ ├─────────────┤ ├─────────────┤ ├─────────────────────────┤ │
│ │ symbols.json│ │ sqlite-vec │ │ conventions.json │ │
│ │ patterns.json │ + FTS5 │ │ ├─ rule: "services/*" │ │
│ │ structure.json │ │ │ │ confidence: 0.95 │ │
│ │ │ │ │ │ │ examples: [...] │ │
│ │ │ │ │ │ │ exceptions: [...] │ │
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ FEEDBACK LOOP │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────────────┐ │
│ │ Executor │ → │ Deviation │ → │ User Correction/Approval │ │
│ │ writes │ │ detected │ │ → Update confidence │ │
│ │ code │ │ │ │ → Add to examples │ │
│ └──────────┘ └──────────┘ └──────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
**Libraries/tools:**
```bash
# Core parsing
npm install tree-sitter tree-sitter-typescript tree-sitter-python tree-sitter-go tree-sitter-rust
# Vector storage (local)
npm install better-sqlite3
# sqlite-vec compiled extension (downloaded during install)
# Embeddings (API)
npm install voyageai # or call API directly
# Optional: Local embeddings fallback
# ollama pull nomic-embed-text (for offline mode)
```
**The "Mind-Blowing" Features:**
1. **Convention Inference Engine**
- Analyzes existing code to detect patterns automatically
- "I see 15 files matching `src/services/*.service.ts`, all exporting classes with `@Injectable()`"
- Confidence scores: 15 examples = high confidence, 2 examples = tentative
2. **Deviation Detection During Execution**
- Before Claude writes `src/utils/auth.ts`, check conventions
- "This looks like a service (has `@Injectable`, depends on repository). Convention suggests `src/services/auth.service.ts`"
- NOT blocking—advisory with reasoning
3. **Correction Learning**
- User says "no, utils is correct here because X"
- System adds exception: `{pattern: "auth*", location: "utils", reason: "X", confidence: 0.8}`
- Future similar cases consider this exception
4. **Semantic "Why" Queries**
- Claude can ask the index: "Why is UserRepository in `src/data` not `src/repositories`?"
- Index returns: historical context, similar patterns, any recorded exceptions
5. **Auto-Refresh with Minimal Recomputation**
- Git hook triggers on commit
- Only re-index changed files (incremental)
- Only re-embed functions that changed (hash comparison)
- Full re-scan weekly or on major refactors
**Pros:**
- Feels magical ("it knows my codebase")
- Gets smarter over time (adaptive)
- Handles edge cases gracefully (exceptions are learned, not errors)
- Works across languages
- Local-first with optional cloud embeddings
**Cons:**
- Most complex to implement (~2000 lines + iteration)
- Requires careful feedback loop design
- Cold start problem (needs usage to learn)
- More storage (embeddings + history)
**Best when:** You want GSD to feel like a senior engineer who truly knows the codebase
**Complexity:** L
---
## Approach 4: MCP Server Integration (Leverage Existing Tools)
**How it works:** Use existing code-index-mcp or claude-context MCP servers, integrate with GSD's planning/execution.
**Libraries/tools:**
- `code-index-mcp` or `claude-context` MCP server
- GSD adds MCP configuration to project setup
- Planner/executor query MCP tools instead of custom indices
**Pros:**
- Leverage battle-tested implementations
- Active community development
- Already handles tree-sitter, embeddings, incremental updates
- MCP is Claude Code native
**Cons:**
- Less control over index structure
- May not support adaptive learning
- Another dependency to manage
- May not align perfectly with GSD's workflow
**Best when:** You want proven tooling without building from scratch
**Complexity:** M
---
## Comparison
| Aspect | Static JSON | Semantic Search | Self-Evolving | MCP Server |
|--------|-------------|-----------------|---------------|------------|
| Complexity | S | M | L | M |
| Query Speed | Instant | ~100ms | ~150ms | Varies |
| Semantic Understanding | None | Good | Excellent | Good |
| Learns from Corrections | No | No | Yes | No |
| Offline Capable | Yes | Partial | Partial | Depends |
| Cross-language | Manual | Yes | Yes | Yes |
| Maintenance | Manual | Medium | Self-maintaining | External |
| "Wow Factor" | Low | Medium | High | Medium |
---
## Recommendation
**Go with Approach 3: Self-Evolving Intelligence**, implemented in phases:
**Phase 1 (MVP):** Static JSON indices with tree-sitter extraction
- Get basic pattern detection working
- Prove value before adding complexity
**Phase 2 (Semantic):** Add sqlite-vec + voyage-code-3
- Enable "find code that does X" queries
- Hybrid search for maximum flexibility
**Phase 3 (Adaptive):** Add feedback loop and confidence scoring
- Convention rules with confidence
- Learn from corrections
- The "magic" emerges here
**Phase 4 (Polish):** Auto-refresh, git hooks, exception handling
- Incremental updates
- Graceful degradation when offline
---
## Implementation Context
<claude_context>
<chosen_approach>
- name: Self-Evolving Codebase Intelligence (phased)
- libraries:
- tree-sitter + language grammars (parsing)
- better-sqlite3 + sqlite-vec extension (storage)
- voyageai SDK or direct API (embeddings)
- chokidar (file watching, optional)
- install: |
npm install tree-sitter tree-sitter-typescript tree-sitter-python tree-sitter-go
npm install better-sqlite3
# sqlite-vec: download prebuilt from https://github.com/asg017/sqlite-vec/releases
npm install voyageai
</chosen_approach>
<architecture>
- pattern: Three-layer knowledge graph (Structure → Semantics → Learned Rules)
- components:
- CodebaseIndexer: Orchestrates tree-sitter parsing, embedding generation, storage
- StructureExtractor: AST → JSON symbols, patterns, structure
- SemanticMemory: sqlite-vec for embeddings, FTS5 for keywords
- ConventionEngine: Pattern detection, rule inference, confidence scoring
- FeedbackCollector: Captures corrections, updates confidence, logs exceptions
- QueryInterface: Unified API for planner/executor to query knowledge
- data_flow: |
Init: codebase → tree-sitter → symbols.json + patterns.json
→ voyage-code-3 → sqlite-vec
→ ConventionEngine → conventions.json
Query: planner asks "where should auth service go?"
→ QueryInterface checks conventions.json (high confidence rules)
→ Falls back to semantic search if no rule
→ Returns recommendation with reasoning
Feedback: executor writes code → deviation detected → user corrects
→ FeedbackCollector updates rule confidence or adds exception
</architecture>
<files>
- create:
- `.planning/indices/symbols.json` - Extracted code symbols
- `.planning/indices/patterns.json` - Detected architectural patterns
- `.planning/indices/conventions.json` - Learned rules with confidence
- `.planning/indices/codebase.db` - sqlite-vec embeddings + FTS5
- `.planning/indices/meta.json` - Commit hash, last update, stats
- `get-shit-done/lib/indexer/` - Index generation code
- `get-shit-done/lib/query/` - Query interface for planner/executor
- structure: |
.planning/
indices/
symbols.json # {exports, imports, classes, functions}
patterns.json # {detected patterns with locations}
conventions.json # {rules with confidence, examples, exceptions}
codebase.db # sqlite-vec + FTS5 hybrid storage
meta.json # {lastCommit, lastUpdate, stats}
- reference:
- `.planning/codebase/ARCHITECTURE.md` - Use as input for initial pattern detection
- `.planning/codebase/CONVENTIONS.md` - Seed initial convention rules
- `commands/gsd/map-codebase.md` - Extend to also generate indices
</files>
<implementation>
- start_with: StructureExtractor using tree-sitter (symbols.json output)
- order:
1. Tree-sitter parsing → symbols.json (Phase 1)
2. Pattern detection → patterns.json (Phase 1)
3. sqlite-vec setup + embedding generation (Phase 2)
4. ConventionEngine + confidence scoring (Phase 3)
5. FeedbackCollector + correction learning (Phase 3)
6. Git hooks + incremental updates (Phase 4)
7. Query interface integration with planner/executor (Phase 4)
- gotchas:
- Tree-sitter grammars are separate packages per language
- sqlite-vec is a C extension, needs platform-specific binary
- voyage-code-3 has 32K context but 120K token batch limit
- Chunking strategy matters: function-level > file-level for embeddings
- Confidence scores need tuning (start conservative, adjust based on feedback)
- Don't over-index: only public exports, key patterns, not every variable
- testing:
- StructureExtractor: Parse known files, verify symbol extraction
- SemanticMemory: Embed test functions, verify similarity search
- ConventionEngine: Feed patterns, verify rule inference
- FeedbackCollector: Simulate corrections, verify confidence updates
- Integration: Full flow from code change → query → recommendation
</implementation>
</claude_context>
**Next Action:** Start with Phase 1 - build the tree-sitter StructureExtractor that outputs `symbols.json` for a test project. This proves the parsing pipeline works before adding embeddings.
---
## Sources
- [Semantic Code Indexing with AST and Tree-sitter](https://medium.com/@email2dineshkuppan/semantic-code-indexing-with-ast-and-tree-sitter-for-ai-agents-part-1-of-3-eb5237ba687a) - Tree-sitter fundamentals
- [mcp-server-tree-sitter](https://github.com/wrale/mcp-server-tree-sitter) - Reference implementation
- [code-index-mcp](https://github.com/johnhuang316/code-index-mcp) - 7-language tree-sitter integration
- [claude-context (Zilliz)](https://github.com/zilliztech/claude-context) - 40% token reduction with semantic search
- [voyage-code-3 announcement](https://blog.voyageai.com/2024/12/04/voyage-code-3/) - State-of-art code embeddings
- [sqlite-vec](https://github.com/asg017/sqlite-vec) - Local vector search for SQLite
- [Hybrid search with sqlite-vec](https://alexgarcia.xyz/blog/2024/sqlite-vec-hybrid-search/index.html) - FTS5 + vector combination
- [Codebases are uniquely hard to search semantically](https://www.greptile.com/blog/semantic-codebase-search) - Why chunking strategy matters
- [Self-Improving Coding Agent (arxiv)](https://arxiv.org/abs/2504.15228) - Research on adaptive code agents
- [Building Self-Improving AI Agents](https://yoheinakajima.com/better-ways-to-build-self-improving-ai-agents/) - Feedback loop architecture
- [State of AI code quality 2025](https://www.qodo.ai/reports/state-of-ai-code-quality/) - Context-aware AI expectations
- [Git Hooks Guide 2025](https://dev.to/arasosman/git-hooks-for-automated-code-quality-checks-guide-2025-372f) - Modern hook practices
- [pre-commit framework](https://pre-commit.com/) - Hook management

View File

@@ -415,12 +415,12 @@ function install(isGlobal) {
// Register intel hooks for codebase intelligence
const intelIndexCommand = isGlobal
? 'node "$HOME/.claude/hooks/intel-index.js"'
: 'node .claude/hooks/intel-index.js';
? 'node "$HOME/.claude/hooks/gsd-intel-index.js"'
: 'node .claude/hooks/gsd-intel-index.js';
const intelSessionCommand = isGlobal
? 'node "$HOME/.claude/hooks/intel-session.js"'
: 'node .claude/hooks/intel-session.js';
? 'node "$HOME/.claude/hooks/gsd-intel-session.js"'
: 'node .claude/hooks/gsd-intel-session.js';
// PostToolUse hook for indexing
if (!settings.hooks.PostToolUse) {
@@ -428,7 +428,7 @@ function install(isGlobal) {
}
const hasIntelIndexHook = settings.hooks.PostToolUse.some(entry =>
entry.hooks && entry.hooks.some(h => h.command && h.command.includes('intel-index'))
entry.hooks && entry.hooks.some(h => h.command && h.command.includes('gsd-intel-index'))
);
if (!hasIntelIndexHook) {
@@ -443,7 +443,7 @@ function install(isGlobal) {
// SessionStart hook for context injection
const hasIntelSessionHook = settings.hooks.SessionStart.some(entry =>
entry.hooks && entry.hooks.some(h => h.command && h.command.includes('intel-session'))
entry.hooks && entry.hooks.some(h => h.command && h.command.includes('gsd-intel-session'))
);
if (!hasIntelSessionHook) {
@@ -458,15 +458,15 @@ function install(isGlobal) {
// Stop hook for pruning deleted files
const intelPruneCommand = isGlobal
? 'node "$HOME/.claude/hooks/intel-prune.js"'
: 'node .claude/hooks/intel-prune.js';
? 'node "$HOME/.claude/hooks/gsd-intel-prune.js"'
: 'node .claude/hooks/gsd-intel-prune.js';
if (!settings.hooks.Stop) {
settings.hooks.Stop = [];
}
const hasIntelPruneHook = settings.hooks.Stop.some(entry =>
entry.hooks && entry.hooks.some(h => h.command && h.command.includes('intel-prune'))
entry.hooks && entry.hooks.some(h => h.command && h.command.includes('gsd-intel-prune'))
);
if (!hasIntelPruneHook) {