3697809c11
- Session: 23 -> 24 (add legacyPluginToast) - Tool Guard: 12 -> 14 (add bashFileReadGuard, readImageResizer, todoDescriptionOverride, webfetchRedirectGuard) - Transform: 4 -> 5 (add toolPairValidator) - Remove deleted dirs: anthropic-image-context, beast-mode-system - Add new dirs: legacy-plugin-toast, todo-description-override, tool-pair-validator, webfetch-redirect-guard
54 lines
2.2 KiB
Markdown
54 lines
2.2 KiB
Markdown
# src/hooks/rules-injector/ — Conditional Rules Injection
|
|
|
|
**Generated:** 2026-04-05
|
|
|
|
## OVERVIEW
|
|
|
|
19 files (~1604 LOC). The `rulesInjectorHook` — Tool Guard Tier hook that auto-injects AGENTS.md (and similar rule files) into context when a file in a directory is read, written, or edited. Proximity-based: closest rule file to the target path wins.
|
|
|
|
## HOW IT WORKS
|
|
|
|
```
|
|
tool.execute.after (read/write/edit/multiedit)
|
|
→ Extract file path from tool output
|
|
→ Find rule files near that path (finder.ts)
|
|
→ Already injected this session? (cache.ts)
|
|
→ Inject rule content into tool output (injector.ts)
|
|
```
|
|
|
|
## TRACKED TOOLS
|
|
|
|
`["read", "write", "edit", "multiedit"]` — triggers only on file manipulation tools.
|
|
|
|
## KEY FILES
|
|
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `hook.ts` | `createRulesInjectorHook()` — wires cache + injector, handles tool events |
|
|
| `injector.ts` | `createRuleInjectionProcessor()` — orchestrates find → cache → inject |
|
|
| `finder.ts` | `findRuleFiles()` + `calculateDistance()` — locate AGENTS.md near target path |
|
|
| `rule-file-finder.ts` | Walk directory tree to find AGENTS.md / .rules files |
|
|
| `rule-file-scanner.ts` | Scan for rule files in a directory |
|
|
| `matcher.ts` | Match file paths against rule file scope |
|
|
| `rule-distance.ts` | Calculate path distance between file and rule file |
|
|
| `project-root-finder.ts` | Find project root (stops at .git, package.json) |
|
|
| `output-path.ts` | Extract file paths from tool output text |
|
|
| `cache.ts` | `createSessionCacheStore()` — per-session injection dedup |
|
|
| `storage.ts` | Persist injected paths across tool calls |
|
|
| `parser.ts` | Parse rule file content |
|
|
| `constants.ts` | Rule file names: `AGENTS.md`, `.rules`, `CLAUDE.md` |
|
|
| `types.ts` | `RuleFile`, `InjectionResult`, `RuleFileScope` |
|
|
|
|
## RULE FILE DISCOVERY
|
|
|
|
Priority (closest → farthest from target file):
|
|
1. Same directory as target file
|
|
2. Parent directories up to project root
|
|
3. Project root itself
|
|
|
|
Same-distance tie: all injected. Per-session dedup prevents re-injection.
|
|
|
|
## TRUNCATION
|
|
|
|
Uses `DynamicTruncator` — adapts injection size based on model context window (1M context models get full content, smaller models get truncated summaries).
|