purecontext-mcp 1.2.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/AGENT_INSTRUCTIONS.md +110 -784
  2. package/AGENT_REFERENCE.md +561 -0
  3. package/BENCHMARKS.md +153 -0
  4. package/CHANGELOG.md +177 -6
  5. package/FRAMEWORK-ADAPTERS.md +351 -0
  6. package/FULL-INSTALLATION-GUIDE.md +341 -0
  7. package/LANGUAGE-SUPPORT.md +144 -0
  8. package/README.md +154 -16
  9. package/USER-GUIDE.md +29 -21
  10. package/dist/cli/hooks.d.ts +28 -0
  11. package/dist/cli/hooks.d.ts.map +1 -0
  12. package/dist/cli/hooks.js +570 -0
  13. package/dist/cli/hooks.js.map +1 -0
  14. package/dist/cli/install-detect.d.ts +16 -0
  15. package/dist/cli/install-detect.d.ts.map +1 -0
  16. package/dist/cli/install-detect.js +70 -0
  17. package/dist/cli/install-detect.js.map +1 -0
  18. package/dist/cli/install-writers.d.ts +59 -0
  19. package/dist/cli/install-writers.d.ts.map +1 -0
  20. package/dist/cli/install-writers.js +292 -0
  21. package/dist/cli/install-writers.js.map +1 -0
  22. package/dist/cli/install.d.ts +14 -0
  23. package/dist/cli/install.d.ts.map +1 -0
  24. package/dist/cli/install.js +150 -0
  25. package/dist/cli/install.js.map +1 -0
  26. package/dist/config/config-loader.js +3 -0
  27. package/dist/config/config-loader.js.map +1 -1
  28. package/dist/config/config-schema.d.ts +11 -0
  29. package/dist/config/config-schema.d.ts.map +1 -1
  30. package/dist/config/config-schema.js +15 -0
  31. package/dist/config/config-schema.js.map +1 -1
  32. package/dist/core/db/symbol-store.d.ts +1 -0
  33. package/dist/core/db/symbol-store.d.ts.map +1 -1
  34. package/dist/core/db/symbol-store.js +120 -6
  35. package/dist/core/db/symbol-store.js.map +1 -1
  36. package/dist/core/file-discovery.d.ts +6 -0
  37. package/dist/core/file-discovery.d.ts.map +1 -1
  38. package/dist/core/file-discovery.js +20 -13
  39. package/dist/core/file-discovery.js.map +1 -1
  40. package/dist/core/file-processor.d.ts.map +1 -1
  41. package/dist/core/file-processor.js +26 -1
  42. package/dist/core/file-processor.js.map +1 -1
  43. package/dist/core/git-log-reader.d.ts.map +1 -1
  44. package/dist/core/git-log-reader.js +21 -0
  45. package/dist/core/git-log-reader.js.map +1 -1
  46. package/dist/core/index-manager.d.ts.map +1 -1
  47. package/dist/core/index-manager.js +21 -7
  48. package/dist/core/index-manager.js.map +1 -1
  49. package/dist/core/indexing-worker.d.ts.map +1 -1
  50. package/dist/core/indexing-worker.js +14 -0
  51. package/dist/core/indexing-worker.js.map +1 -1
  52. package/dist/core/parse-dispatcher.d.ts.map +1 -1
  53. package/dist/core/parse-dispatcher.js +20 -5
  54. package/dist/core/parse-dispatcher.js.map +1 -1
  55. package/dist/core/search/query-preprocessor.d.ts +69 -3
  56. package/dist/core/search/query-preprocessor.d.ts.map +1 -1
  57. package/dist/core/search/query-preprocessor.js +450 -17
  58. package/dist/core/search/query-preprocessor.js.map +1 -1
  59. package/dist/core/search/relevance-ranker.d.ts +60 -5
  60. package/dist/core/search/relevance-ranker.d.ts.map +1 -1
  61. package/dist/core/search/relevance-ranker.js +931 -33
  62. package/dist/core/search/relevance-ranker.js.map +1 -1
  63. package/dist/core/test-mapper.d.ts.map +1 -1
  64. package/dist/core/test-mapper.js +7 -1
  65. package/dist/core/test-mapper.js.map +1 -1
  66. package/dist/core/types.d.ts +28 -1
  67. package/dist/core/types.d.ts.map +1 -1
  68. package/dist/handlers/angular-html.d.ts +3 -0
  69. package/dist/handlers/angular-html.d.ts.map +1 -0
  70. package/dist/handlers/angular-html.js +215 -0
  71. package/dist/handlers/angular-html.js.map +1 -0
  72. package/dist/handlers/c.d.ts.map +1 -1
  73. package/dist/handlers/c.js +19 -0
  74. package/dist/handlers/c.js.map +1 -1
  75. package/dist/handlers/cpp-macro-registry.d.ts +21 -0
  76. package/dist/handlers/cpp-macro-registry.d.ts.map +1 -0
  77. package/dist/handlers/cpp-macro-registry.js +44 -0
  78. package/dist/handlers/cpp-macro-registry.js.map +1 -0
  79. package/dist/handlers/cpp.d.ts.map +1 -1
  80. package/dist/handlers/cpp.js +579 -10
  81. package/dist/handlers/cpp.js.map +1 -1
  82. package/dist/handlers/csharp.d.ts.map +1 -1
  83. package/dist/handlers/csharp.js +39 -2
  84. package/dist/handlers/csharp.js.map +1 -1
  85. package/dist/handlers/css.d.ts +3 -0
  86. package/dist/handlers/css.d.ts.map +1 -0
  87. package/dist/handlers/css.js +154 -0
  88. package/dist/handlers/css.js.map +1 -0
  89. package/dist/handlers/erlang.d.ts.map +1 -1
  90. package/dist/handlers/erlang.js +8 -1
  91. package/dist/handlers/erlang.js.map +1 -1
  92. package/dist/handlers/fortran.js +1 -1
  93. package/dist/handlers/fortran.js.map +1 -1
  94. package/dist/handlers/go.d.ts.map +1 -1
  95. package/dist/handlers/go.js +87 -2
  96. package/dist/handlers/go.js.map +1 -1
  97. package/dist/handlers/handler-registry.d.ts.map +1 -1
  98. package/dist/handlers/handler-registry.js +4 -0
  99. package/dist/handlers/handler-registry.js.map +1 -1
  100. package/dist/handlers/hcl.d.ts +3 -0
  101. package/dist/handlers/hcl.d.ts.map +1 -0
  102. package/dist/handlers/hcl.js +193 -0
  103. package/dist/handlers/hcl.js.map +1 -0
  104. package/dist/handlers/java.d.ts.map +1 -1
  105. package/dist/handlers/java.js +33 -16
  106. package/dist/handlers/java.js.map +1 -1
  107. package/dist/handlers/kotlin.d.ts.map +1 -1
  108. package/dist/handlers/kotlin.js +48 -3
  109. package/dist/handlers/kotlin.js.map +1 -1
  110. package/dist/handlers/less.d.ts +3 -0
  111. package/dist/handlers/less.d.ts.map +1 -0
  112. package/dist/handlers/less.js +255 -0
  113. package/dist/handlers/less.js.map +1 -0
  114. package/dist/handlers/objective-c.d.ts.map +1 -1
  115. package/dist/handlers/objective-c.js +122 -64
  116. package/dist/handlers/objective-c.js.map +1 -1
  117. package/dist/handlers/openapi.d.ts.map +1 -1
  118. package/dist/handlers/openapi.js +30 -5
  119. package/dist/handlers/openapi.js.map +1 -1
  120. package/dist/handlers/php.d.ts.map +1 -1
  121. package/dist/handlers/php.js +287 -41
  122. package/dist/handlers/php.js.map +1 -1
  123. package/dist/handlers/protobuf.d.ts.map +1 -1
  124. package/dist/handlers/protobuf.js +1 -0
  125. package/dist/handlers/protobuf.js.map +1 -1
  126. package/dist/handlers/python.d.ts.map +1 -1
  127. package/dist/handlers/python.js +1 -3
  128. package/dist/handlers/python.js.map +1 -1
  129. package/dist/handlers/ruby-dsl.d.ts +23 -0
  130. package/dist/handlers/ruby-dsl.d.ts.map +1 -0
  131. package/dist/handlers/ruby-dsl.js +251 -0
  132. package/dist/handlers/ruby-dsl.js.map +1 -0
  133. package/dist/handlers/ruby.d.ts.map +1 -1
  134. package/dist/handlers/ruby.js +29 -4
  135. package/dist/handlers/ruby.js.map +1 -1
  136. package/dist/handlers/rust.d.ts.map +1 -1
  137. package/dist/handlers/rust.js +98 -2
  138. package/dist/handlers/rust.js.map +1 -1
  139. package/dist/handlers/scss.d.ts +3 -0
  140. package/dist/handlers/scss.d.ts.map +1 -0
  141. package/dist/handlers/scss.js +290 -0
  142. package/dist/handlers/scss.js.map +1 -0
  143. package/dist/handlers/sql.d.ts.map +1 -1
  144. package/dist/handlers/sql.js +37 -18
  145. package/dist/handlers/sql.js.map +1 -1
  146. package/dist/handlers/typescript.d.ts.map +1 -1
  147. package/dist/handlers/typescript.js +65 -17
  148. package/dist/handlers/typescript.js.map +1 -1
  149. package/dist/handlers/xml.d.ts.map +1 -1
  150. package/dist/handlers/xml.js +35 -2
  151. package/dist/handlers/xml.js.map +1 -1
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +91 -0
  154. package/dist/index.js.map +1 -1
  155. package/dist/server/mcp-server.d.ts.map +1 -1
  156. package/dist/server/mcp-server.js +10 -0
  157. package/dist/server/mcp-server.js.map +1 -1
  158. package/dist/server/tools/detect-antipatterns.d.ts +1 -1
  159. package/dist/server/tools/get-architecture-snapshot.d.ts +1 -1
  160. package/dist/server/tools/get-entry-points.d.ts +1 -1
  161. package/dist/server/tools/get-lexical-scope-matches.d.ts +54 -0
  162. package/dist/server/tools/get-lexical-scope-matches.d.ts.map +1 -0
  163. package/dist/server/tools/get-lexical-scope-matches.js +470 -0
  164. package/dist/server/tools/get-lexical-scope-matches.js.map +1 -0
  165. package/dist/server/tools/search-symbols.d.ts +10 -0
  166. package/dist/server/tools/search-symbols.d.ts.map +1 -1
  167. package/dist/server/tools/search-symbols.js +353 -8
  168. package/dist/server/tools/search-symbols.js.map +1 -1
  169. package/dist/server/tools/trace-invocation-chain.d.ts +53 -0
  170. package/dist/server/tools/trace-invocation-chain.d.ts.map +1 -0
  171. package/dist/server/tools/trace-invocation-chain.js +280 -0
  172. package/dist/server/tools/trace-invocation-chain.js.map +1 -0
  173. package/dist/version.d.ts +1 -1
  174. package/dist/version.js +1 -1
  175. package/docs/02-installation.md +43 -245
  176. package/docs/05-cli-reference.md +89 -0
  177. package/docs/07-language-support.md +73 -50
  178. package/docs/08-framework-adapters.md +7 -2
  179. package/docs/15-team-setup.md +70 -200
  180. package/docs/17-web-ui.md +73 -93
  181. package/docs/README.md +60 -39
  182. package/docs/dev/benchmark-findings-eu-za-tebe.md +210 -0
  183. package/docs/dev/phase-35-coverage-audit.md +469 -0
  184. package/package.json +6 -3
  185. package/user-manual.md +0 -2466
@@ -0,0 +1,570 @@
1
+ /**
2
+ * `purecontext-mcp hooks --install` / `hooks --list`
3
+ * `purecontext-mcp hook-pretooluse|hook-posttooluse|hook-precompact|hook-worktree-create|hook-worktree-remove`
4
+ *
5
+ * Merges hook entries into ~/.claude/settings.json using CLI-style commands
6
+ * (npx purecontext-mcp hook-*) so no scripts need to be copied to ~/.claude/hooks/.
7
+ * Also injects PureContext agent instructions into ~/.claude/CLAUDE.md.
8
+ */
9
+ import { spawnSync } from 'child_process';
10
+ import { createRequire } from 'module';
11
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync, } from 'fs';
12
+ import { join, dirname } from 'path';
13
+ import { homedir } from 'os';
14
+ import { fileURLToPath } from 'url';
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = dirname(__filename);
17
+ // ─── Paths ────────────────────────────────────────────────────────────────────
18
+ const CLAUDE_DIR = join(homedir(), '.claude');
19
+ const SETTINGS_PATH = join(CLAUDE_DIR, 'settings.json');
20
+ const CLAUDE_MD_PATH = join(CLAUDE_DIR, 'CLAUDE.md');
21
+ // ─── Settings entries ─────────────────────────────────────────────────────────
22
+ const POST_TOOL_USE_ENTRY = {
23
+ matcher: 'Edit|Write|MultiEdit',
24
+ hooks: [{ type: 'command', command: 'npx purecontext-mcp hook-posttooluse' }],
25
+ };
26
+ const PRE_COMPACT_ENTRY = {
27
+ matcher: '',
28
+ hooks: [{ type: 'command', command: 'npx purecontext-mcp hook-precompact' }],
29
+ };
30
+ const PRE_TOOL_USE_ENTRY = {
31
+ matcher: 'Edit|Write|MultiEdit',
32
+ hooks: [{ type: 'command', command: 'npx purecontext-mcp hook-pretooluse' }],
33
+ };
34
+ const WORKTREE_CREATE_ENTRY = {
35
+ matcher: '',
36
+ hooks: [{ type: 'command', command: 'npx purecontext-mcp hook-worktree-create' }],
37
+ };
38
+ const WORKTREE_REMOVE_ENTRY = {
39
+ matcher: '',
40
+ hooks: [{ type: 'command', command: 'npx purecontext-mcp hook-worktree-remove' }],
41
+ };
42
+ const TASK_COMPLETED_ENTRY = {
43
+ matcher: '',
44
+ hooks: [{ type: 'command', command: 'npx purecontext-mcp hook-taskcompleted' }],
45
+ };
46
+ const SUBAGENT_START_ENTRY = {
47
+ matcher: '',
48
+ hooks: [{ type: 'command', command: 'npx purecontext-mcp hook-subagentstart' }],
49
+ };
50
+ // ─── CLAUDE.md block ──────────────────────────────────────────────────────────
51
+ const CLAUDE_MD_BLOCK = `<!-- purecontext-mcp-start -->
52
+ # PureContext MCP — AI Agent Instructions
53
+
54
+ Full tool reference, navigation patterns, and known limitations: \`AGENT_REFERENCE.md\` in the project root (added by \`npx purecontext-mcp hooks --install\`).
55
+
56
+ ## Mandatory workflow — always follow this order
57
+
58
+ **Step 1 — Check if the project is indexed**
59
+
60
+ \`\`\`
61
+ list_repos()
62
+ \`\`\`
63
+
64
+ If the project is missing: \`index_folder({ path: "/absolute/path/to/project" })\`. All other tools require a \`repoId\` — never skip this step.
65
+
66
+ **Step 2 — Navigate by symbol, not by file**
67
+
68
+ Do not read entire files to find code.
69
+
70
+ | Goal | Tool |
71
+ |------|------|
72
+ | Find a function/class/method by name | \`search_symbols\` |
73
+ | Find code by what it does | \`search_semantic\` |
74
+ | Find a literal string, comment, or config value | \`search_text\` |
75
+ | See all symbols in one file | \`get_file_outline\` |
76
+ | See the whole project structure | \`get_repo_outline\` |
77
+ | Understand a function's dependencies | \`get_context_bundle\` |
78
+ | Know what breaks if I change a symbol | \`get_blast_radius\` |
79
+ | Find all call sites for a symbol | \`find_references\` |
80
+ | Survey a file before editing | \`get_file_outline\` |
81
+ | Non-symbol file content (imports, config blocks) | \`get_file_content\` with startLine/endLine |
82
+ | All implementations of an interface | \`find_implementations\` |
83
+ | Callers/callees tree | \`get_call_hierarchy\` |
84
+ | Class inheritance structure | \`get_class_hierarchy\` |
85
+ | Circular dependencies | \`find_cycles\` |
86
+ | Rename / delete / move safety check | \`check_rename_safe\` / \`check_delete_safe\` / \`check_move_safe\` |
87
+ | Codebase health score | \`health_radar\` |
88
+ | Detailed debt report | \`get_debt_report\` |
89
+ | All TODOs and FIXMEs | \`get_todos\` |
90
+ | Untested exported symbols | \`find_untested_symbols\` |
91
+ | AST node type occurrences | \`search_ast\` |
92
+ | Symbols by decorator | \`search_by_decorator\` |
93
+ | Most complex functions | \`get_complexity_hotspots\` |
94
+
95
+ **Step 3 — Read summaries before fetching source**
96
+
97
+ \`search_symbols\` returns signatures and summaries — no source code. Read the \`summary\` field first. Fetch source only for symbols you will actually work with:
98
+
99
+ \`\`\`
100
+ get_symbol_source({ repoId, symbolId })
101
+ \`\`\`
102
+
103
+ Summaries describe intent, not contract. For modification tasks, always read the source after using the summary to navigate.
104
+
105
+ ## Anti-patterns — what NOT to do
106
+
107
+ Do not read whole files to find a function. Use \`search_symbols\` + \`get_symbol_source\`.
108
+
109
+ Do not call \`get_symbol_source\` for every search result. Read \`signature\` and \`summary\` first. Fetch source only for symbols you will work with.
110
+
111
+ Do not skip \`list_repos\` at the start of a session. You need a \`repoId\` for every tool call.
112
+
113
+ Do not use \`search_text\` for symbol lookups. It greps raw file content — slower and less precise than \`search_symbols\` for named code entities.
114
+
115
+ Do not use \`get_file_content\` as a fallback for reading whole files. If a symbol exists in the index, use \`get_symbol_source\`.
116
+
117
+ Do not ignore \`_tokenEstimate\` fields. Use them to decide whether to fetch more context or stop.
118
+
119
+ Do not re-search when \`search_symbols\` returns \`negative_evidence\`. If the response includes \`verdict: "no_match"\`, the symbol does not exist — report the gap rather than trying five more query variants.
120
+ <!-- purecontext-mcp-end -->`;
121
+ // ─── Public install/list commands ─────────────────────────────────────────────
122
+ export function cmdHooksInstall() {
123
+ mkdirSync(CLAUDE_DIR, { recursive: true });
124
+ mergeSettings();
125
+ injectClaudeMd();
126
+ console.log('\nHooks installed. Reopen Claude Code to activate them.\n');
127
+ console.log('Hooks registered (via npx purecontext-mcp hook-*):');
128
+ console.log(' PostToolUse (hook-posttooluse): re-indexes edited files automatically');
129
+ console.log(' PreCompact (hook-precompact): injects repo state before context compaction');
130
+ console.log(' PreToolUse (hook-pretooluse): suggests PureContext read tools before editing');
131
+ console.log(' WorktreeCreate (hook-worktree-create): auto-indexes new agent worktrees');
132
+ console.log(' WorktreeRemove (hook-worktree-remove): fires when an agent worktree is removed');
133
+ console.log(' TaskCompleted (hook-taskcompleted): post-task diagnostics and repo summary');
134
+ console.log(' SubagentStart (hook-subagentstart): injects repo orientation for spawned agents');
135
+ }
136
+ export function cmdHooksList() {
137
+ console.log('\nPureContext Claude Code hooks:\n');
138
+ const settingsStatus = areSettingsMerged() ? 'registered' : 'not configured';
139
+ console.log(` settings.json hooks: ${settingsStatus}`);
140
+ console.log(` CLAUDE.md block: ${isClaudeMdInjected() ? 'present' : 'not present'}\n`);
141
+ if (areSettingsMerged()) {
142
+ console.log(' Active hooks:');
143
+ console.log(' PostToolUse → npx purecontext-mcp hook-posttooluse');
144
+ console.log(' PreCompact → npx purecontext-mcp hook-precompact');
145
+ console.log(' PreToolUse → npx purecontext-mcp hook-pretooluse');
146
+ console.log(' WorktreeCreate → npx purecontext-mcp hook-worktree-create');
147
+ console.log(' WorktreeRemove → npx purecontext-mcp hook-worktree-remove');
148
+ }
149
+ }
150
+ // ─── Settings merge ───────────────────────────────────────────────────────────
151
+ export function mergeSettings() {
152
+ let settings = {};
153
+ if (existsSync(SETTINGS_PATH)) {
154
+ try {
155
+ settings = JSON.parse(readFileSync(SETTINGS_PATH, 'utf-8'));
156
+ }
157
+ catch {
158
+ settings = {};
159
+ }
160
+ }
161
+ const hooks = (settings.hooks ?? {});
162
+ hooks.PostToolUse = mergeHookEntry(hooks.PostToolUse ?? [], POST_TOOL_USE_ENTRY, ['purecontext-index-hook.mjs', 'hook-posttooluse']);
163
+ hooks.PreCompact = mergeHookEntry(hooks.PreCompact ?? [], PRE_COMPACT_ENTRY, ['purecontext-precompact-hook.mjs', 'hook-precompact']);
164
+ hooks.PreToolUse = mergeHookEntry(hooks.PreToolUse ?? [], PRE_TOOL_USE_ENTRY, ['purecontext-edit-guard.mjs', 'hook-pretooluse']);
165
+ hooks.WorktreeCreate = mergeHookEntry((hooks.WorktreeCreate ?? []), WORKTREE_CREATE_ENTRY, ['hook-worktree-create']);
166
+ hooks.WorktreeRemove = mergeHookEntry((hooks.WorktreeRemove ?? []), WORKTREE_REMOVE_ENTRY, ['hook-worktree-remove']);
167
+ hooks.TaskCompleted = mergeHookEntry((hooks.TaskCompleted ?? []), TASK_COMPLETED_ENTRY, ['hook-taskcompleted']);
168
+ hooks.SubagentStart = mergeHookEntry((hooks.SubagentStart ?? []), SUBAGENT_START_ENTRY, ['hook-subagentstart']);
169
+ settings.hooks = hooks;
170
+ mkdirSync(dirname(SETTINGS_PATH), { recursive: true });
171
+ writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2) + '\n');
172
+ console.log(` Updated: ${SETTINGS_PATH}`);
173
+ }
174
+ function mergeHookEntry(existing, entry, matchStrings) {
175
+ // Remove any existing purecontext entry for this hook type (idempotent).
176
+ // Matches both old .mjs script paths and current CLI command forms.
177
+ const filtered = existing.filter((e) => {
178
+ const hooks = e.hooks ?? [];
179
+ return !hooks.some((h) => {
180
+ const cmd = h.command ?? '';
181
+ return matchStrings.some((s) => cmd.includes(s));
182
+ });
183
+ });
184
+ return [...filtered, entry];
185
+ }
186
+ function areSettingsMerged() {
187
+ if (!existsSync(SETTINGS_PATH))
188
+ return false;
189
+ try {
190
+ const text = readFileSync(SETTINGS_PATH, 'utf-8');
191
+ return text.includes('hook-posttooluse') || text.includes('purecontext-index-hook.mjs');
192
+ }
193
+ catch {
194
+ return false;
195
+ }
196
+ }
197
+ // ─── CLAUDE.md injection ──────────────────────────────────────────────────────
198
+ export function injectClaudeMd() {
199
+ const START_MARKER = '<!-- purecontext-mcp-start -->';
200
+ const END_MARKER = '<!-- purecontext-mcp-end -->';
201
+ if (!existsSync(CLAUDE_MD_PATH)) {
202
+ writeFileSync(CLAUDE_MD_PATH, CLAUDE_MD_BLOCK + '\n');
203
+ console.log(` Created: ${CLAUDE_MD_PATH}`);
204
+ return;
205
+ }
206
+ let content = readFileSync(CLAUDE_MD_PATH, 'utf-8');
207
+ const startIdx = content.indexOf(START_MARKER);
208
+ const endIdx = content.indexOf(END_MARKER);
209
+ if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
210
+ content = content.slice(0, startIdx) + CLAUDE_MD_BLOCK + content.slice(endIdx + END_MARKER.length);
211
+ }
212
+ else {
213
+ if (!content.endsWith('\n'))
214
+ content += '\n';
215
+ content += '\n' + CLAUDE_MD_BLOCK + '\n';
216
+ }
217
+ writeFileSync(CLAUDE_MD_PATH, content);
218
+ console.log(` Updated: ${CLAUDE_MD_PATH}`);
219
+ }
220
+ function isClaudeMdInjected() {
221
+ if (!existsSync(CLAUDE_MD_PATH))
222
+ return false;
223
+ try {
224
+ return readFileSync(CLAUDE_MD_PATH, 'utf-8').includes('<!-- purecontext-mcp-start -->');
225
+ }
226
+ catch {
227
+ return false;
228
+ }
229
+ }
230
+ // ─── Hook command implementations ─────────────────────────────────────────────
231
+ const ROOT_MARKERS = ['.git', 'package.json', 'Cargo.toml', 'go.mod', 'pom.xml'];
232
+ function findRepoRoot(filePath) {
233
+ let dir = dirname(filePath);
234
+ while (true) {
235
+ for (const marker of ROOT_MARKERS) {
236
+ if (existsSync(join(dir, marker)))
237
+ return dir;
238
+ }
239
+ const parent = dirname(dir);
240
+ if (parent === dir)
241
+ return null;
242
+ dir = parent;
243
+ }
244
+ }
245
+ function reindexRepo(repoRoot) {
246
+ spawnSync('npx', ['purecontext-mcp', 'index-folder', '--path', repoRoot], {
247
+ stdio: 'ignore',
248
+ timeout: 60_000,
249
+ shell: process.platform === 'win32',
250
+ });
251
+ }
252
+ async function readStdin() {
253
+ const chunks = [];
254
+ for await (const chunk of process.stdin)
255
+ chunks.push(chunk);
256
+ return JSON.parse(Buffer.concat(chunks).toString('utf-8'));
257
+ }
258
+ /** PreToolUse: warn before Edit/Write/MultiEdit. */
259
+ export async function cmdHookPreToolUse() {
260
+ if (process.env.PURECONTEXT_ALLOW_RAW_WRITE === '1')
261
+ process.exit(0);
262
+ try {
263
+ const input = await readStdin();
264
+ const toolName = (input.tool_name ?? '');
265
+ if (!['Edit', 'Write', 'MultiEdit'].includes(toolName))
266
+ process.exit(0);
267
+ const filePath = (input.tool_input?.file_path ?? '');
268
+ const target = filePath ? ` ${filePath}` : '';
269
+ process.stderr.write(`PureContext: before editing${target}, consider:\n` +
270
+ ' get_symbol_source → confirm you are editing the right implementation\n' +
271
+ ' get_blast_radius → understand what breaks if you change this\n' +
272
+ ' find_references → find all call sites that may need updating\n');
273
+ }
274
+ catch { /* never block */ }
275
+ process.exit(0);
276
+ }
277
+ /** PostToolUse: re-index the repo after Edit/Write/MultiEdit. */
278
+ export async function cmdHookPostToolUse() {
279
+ try {
280
+ const input = await readStdin();
281
+ const toolName = (input.tool_name ?? '');
282
+ const toolInput = (input.tool_input ?? {});
283
+ if (!['Edit', 'Write', 'MultiEdit'].includes(toolName))
284
+ process.exit(0);
285
+ const paths = [];
286
+ if (toolName === 'Edit' || toolName === 'Write') {
287
+ const fp = toolInput.file_path;
288
+ if (fp)
289
+ paths.push(fp);
290
+ }
291
+ else {
292
+ const edits = (toolInput.edits ?? []);
293
+ for (const edit of edits) {
294
+ const fp = edit.file_path;
295
+ if (fp)
296
+ paths.push(fp);
297
+ }
298
+ }
299
+ const roots = new Set();
300
+ for (const fp of paths) {
301
+ const root = findRepoRoot(fp);
302
+ if (root)
303
+ roots.add(root);
304
+ }
305
+ for (const root of roots)
306
+ reindexRepo(root);
307
+ }
308
+ catch { /* never block the edit */ }
309
+ process.exit(0);
310
+ }
311
+ function readIndexedRepos() {
312
+ const base = process.env.PCTX_DATA_DIR ?? join(homedir(), '.purecontext');
313
+ const indexDir = join(base, 'indexes');
314
+ if (!existsSync(indexDir))
315
+ return [];
316
+ const _require = createRequire(import.meta.url);
317
+ let Database = null;
318
+ try {
319
+ Database = _require('better-sqlite3');
320
+ }
321
+ catch {
322
+ return [];
323
+ }
324
+ if (!Database)
325
+ return [];
326
+ const repos = [];
327
+ let files;
328
+ try {
329
+ files = readdirSync(indexDir).filter((f) => f.endsWith('.db'));
330
+ }
331
+ catch {
332
+ return [];
333
+ }
334
+ for (const file of files) {
335
+ let db;
336
+ try {
337
+ db = new Database(join(indexDir, file), { readonly: true });
338
+ const rows = db.prepare('SELECT id, root_path, file_count, indexed_at FROM repos LIMIT 50').all();
339
+ repos.push(...rows);
340
+ }
341
+ catch { /* skip unreadable db */ }
342
+ finally {
343
+ try {
344
+ db?.close();
345
+ }
346
+ catch { /* ignore */ }
347
+ }
348
+ }
349
+ return repos;
350
+ }
351
+ function buildSessionSnapshot(repos) {
352
+ if (repos.length === 0) {
353
+ return [
354
+ 'PureContext session snapshot:',
355
+ '- No repos currently indexed.',
356
+ '- Run index_folder({ path: "/absolute/path/to/project" }) to index a repo.',
357
+ '- Use list_repos() to check status after indexing.',
358
+ ].join('\n');
359
+ }
360
+ const lines = ['PureContext session snapshot:'];
361
+ for (const r of repos) {
362
+ const indexed = r.indexed_at
363
+ ? new Date(r.indexed_at).toISOString().slice(0, 19).replace('T', ' ')
364
+ : 'unknown';
365
+ lines.push(`- ${r.id} at ${r.root_path} (${r.file_count ?? '?'} files, last indexed ${indexed})`);
366
+ }
367
+ lines.push('- Use list_repos() to re-orient if needed.');
368
+ return lines.join('\n');
369
+ }
370
+ /** PreCompact: inject session snapshot before context compaction. */
371
+ export async function cmdHookPreCompact() {
372
+ try {
373
+ await readStdin(); // consume stdin even if unused
374
+ }
375
+ catch { /* ignore */ }
376
+ try {
377
+ const repos = readIndexedRepos();
378
+ const message = buildSessionSnapshot(repos);
379
+ process.stdout.write(JSON.stringify({ systemMessage: message }) + '\n');
380
+ }
381
+ catch {
382
+ process.stdout.write(JSON.stringify({
383
+ systemMessage: 'PureContext session snapshot unavailable. Use list_repos() to check indexed repos.',
384
+ }) + '\n');
385
+ }
386
+ process.exit(0);
387
+ }
388
+ /** WorktreeCreate: auto-index a new agent worktree. */
389
+ export async function cmdHookWorktreeCreate() {
390
+ try {
391
+ const input = await readStdin();
392
+ const worktreePath = (input.worktreePath ?? input.worktree_path);
393
+ const cwd = (input.cwd ?? '');
394
+ const name = (input.name ?? '');
395
+ const targetPath = worktreePath ?? (cwd && name ? join(cwd, '.claude', 'worktrees', name) : null);
396
+ if (!targetPath)
397
+ process.exit(0);
398
+ spawnSync('npx', ['purecontext-mcp', 'index-folder', '--path', targetPath], {
399
+ stdio: 'ignore',
400
+ timeout: 120_000,
401
+ shell: process.platform === 'win32',
402
+ });
403
+ }
404
+ catch { /* never block */ }
405
+ process.exit(0);
406
+ }
407
+ /** WorktreeRemove: fires when an agent worktree is removed. No-op for now. */
408
+ export async function cmdHookWorktreeRemove() {
409
+ try {
410
+ await readStdin();
411
+ }
412
+ catch { /* ignore */ }
413
+ process.exit(0);
414
+ }
415
+ function readRepoStats() {
416
+ const base = process.env.PCTX_DATA_DIR ?? join(homedir(), '.purecontext');
417
+ const indexDir = join(base, 'indexes');
418
+ if (!existsSync(indexDir))
419
+ return [];
420
+ const _require = createRequire(import.meta.url);
421
+ let Database = null;
422
+ try {
423
+ Database = _require('better-sqlite3');
424
+ }
425
+ catch {
426
+ return [];
427
+ }
428
+ if (!Database)
429
+ return [];
430
+ let files;
431
+ try {
432
+ files = readdirSync(indexDir).filter((f) => f.endsWith('.db'));
433
+ }
434
+ catch {
435
+ return [];
436
+ }
437
+ const stats = [];
438
+ for (const file of files) {
439
+ let db;
440
+ try {
441
+ db = new Database(join(indexDir, file), { readonly: true });
442
+ const repo = db.prepare('SELECT id, root_path, file_count, indexed_at FROM repos LIMIT 1').get();
443
+ if (!repo)
444
+ continue;
445
+ const symRow = db.prepare('SELECT COUNT(*) AS cnt FROM symbols WHERE repo_id = ?').get(repo.id);
446
+ const highRow = db.prepare('SELECT COUNT(*) AS cnt FROM symbols WHERE repo_id = ? AND cyclomatic_complexity > 5').get(repo.id);
447
+ // Count TODO/FIXME occurrences across all file summaries stored in symbols
448
+ const todoRow = db.prepare("SELECT COUNT(*) AS cnt FROM symbols WHERE repo_id = ? AND (UPPER(summary) LIKE '%TODO%' OR UPPER(summary) LIKE '%FIXME%' OR UPPER(summary) LIKE '%HACK%')").get(repo.id);
449
+ stats.push({
450
+ repoId: repo.id,
451
+ rootPath: repo.root_path,
452
+ fileCount: repo.file_count,
453
+ symbolCount: symRow.cnt,
454
+ indexedAt: repo.indexed_at,
455
+ highComplexityCount: highRow.cnt,
456
+ todoCount: todoRow.cnt,
457
+ });
458
+ }
459
+ catch { /* skip unreadable db */ }
460
+ finally {
461
+ try {
462
+ db?.close();
463
+ }
464
+ catch { /* ignore */ }
465
+ }
466
+ }
467
+ return stats;
468
+ }
469
+ /** TaskCompleted: surface post-task diagnostics and remind about available tools. */
470
+ export async function cmdHookTaskCompleted() {
471
+ try {
472
+ await readStdin();
473
+ }
474
+ catch { /* ignore */ }
475
+ try {
476
+ const repos = readRepoStats();
477
+ if (repos.length === 0) {
478
+ process.exit(0);
479
+ }
480
+ const lines = ['## PureContext Post-Task Summary\n'];
481
+ lines.push('**Indexed repos:**');
482
+ for (const r of repos) {
483
+ const indexed = r.indexedAt
484
+ ? new Date(r.indexedAt).toISOString().slice(0, 19).replace('T', ' ')
485
+ : 'unknown';
486
+ lines.push(`- \`${r.repoId}\` → \`${r.rootPath}\``);
487
+ lines.push(` ${r.fileCount ?? '?'} files · ${r.symbolCount ?? '?'} symbols · indexed ${indexed}`);
488
+ if (r.highComplexityCount > 0) {
489
+ lines.push(` ⚠ ${r.highComplexityCount} high-complexity symbols (cyclomatic > 5)`);
490
+ }
491
+ if (r.todoCount > 0) {
492
+ lines.push(` 📝 ${r.todoCount} symbols with TODO/FIXME/HACK in their summary`);
493
+ }
494
+ }
495
+ lines.push('');
496
+ lines.push('**Post-task diagnostic tools:**');
497
+ lines.push('- `find_dead_code` → orphaned exports with no importers');
498
+ lines.push('- `find_untested_symbols` → exported symbols with no test coverage');
499
+ lines.push('- `get_todos` → all TODO/FIXME/HACK comments in the codebase');
500
+ lines.push('- `get_complexity_hotspots` → most complex functions to review');
501
+ lines.push('- `health_radar` → overall codebase health score');
502
+ process.stdout.write(JSON.stringify({ systemMessage: lines.join('\n') }) + '\n');
503
+ }
504
+ catch {
505
+ // Never block task completion
506
+ }
507
+ process.exit(0);
508
+ }
509
+ /** SubagentStart: inject condensed repo orientation for spawned subagents. */
510
+ export async function cmdHookSubagentStart() {
511
+ try {
512
+ await readStdin();
513
+ }
514
+ catch { /* ignore */ }
515
+ try {
516
+ const repos = readRepoStats();
517
+ const lines = ['## PureContext Repo Orientation\n'];
518
+ if (repos.length === 0) {
519
+ lines.push('No repos indexed yet.');
520
+ lines.push('Run `index_folder({ path: "/absolute/path" })` before navigating code.');
521
+ }
522
+ else {
523
+ lines.push('**Indexed repos (use these repoIds with all tools):**');
524
+ for (const r of repos) {
525
+ const indexed = r.indexedAt
526
+ ? new Date(r.indexedAt).toISOString().slice(0, 19).replace('T', ' ')
527
+ : 'unknown';
528
+ lines.push(`- repoId \`${r.repoId}\` → \`${r.rootPath}\``);
529
+ lines.push(` ${r.fileCount ?? '?'} files · ${r.symbolCount ?? '?'} symbols · indexed ${indexed}`);
530
+ }
531
+ }
532
+ lines.push('');
533
+ lines.push('**Mandatory workflow — follow this order:**');
534
+ lines.push('1. `list_repos()` — always run first to confirm repoId');
535
+ lines.push('2. Navigate by symbol, not by file:');
536
+ lines.push(' | Goal | Tool |');
537
+ lines.push(' |------|------|');
538
+ lines.push(' | Find function/class by name | `search_symbols` |');
539
+ lines.push(' | Find code by what it does | `search_semantic` |');
540
+ lines.push(' | See all symbols in a file | `get_file_outline` |');
541
+ lines.push(' | Read a specific symbol | `get_symbol_source` |');
542
+ lines.push(' | Understand dependencies | `get_context_bundle` |');
543
+ lines.push(' | Know what breaks if I change X | `get_blast_radius` |');
544
+ lines.push(' | Find all call sites | `find_references` |');
545
+ lines.push(' | Non-symbol content (imports, config) | `get_file_content` with startLine/endLine |');
546
+ lines.push('3. Read `summary` and `signature` before fetching source — only fetch what you will edit.');
547
+ lines.push('');
548
+ lines.push('**Never:** read whole files · use `search_text` for symbol lookups · skip `list_repos()`');
549
+ process.stdout.write(JSON.stringify({ systemMessage: lines.join('\n') }) + '\n');
550
+ }
551
+ catch {
552
+ // Never block the subagent from starting
553
+ }
554
+ process.exit(0);
555
+ }
556
+ // ─── CLI dispatcher ───────────────────────────────────────────────────────────
557
+ export function runHooksCommand(args) {
558
+ const flag = args[0];
559
+ if (flag === '--install') {
560
+ cmdHooksInstall();
561
+ }
562
+ else if (flag === '--list') {
563
+ cmdHooksList();
564
+ }
565
+ else {
566
+ process.stderr.write('Usage: purecontext-mcp hooks --install | --list\n');
567
+ process.exit(1);
568
+ }
569
+ }
570
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/cli/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * IDE/agent detection for `purecontext-mcp install all`.
3
+ *
4
+ * Each tool is detected by the presence of a characteristic directory or
5
+ * config file in the project root or the user's home directory.
6
+ */
7
+ export declare function getClaudeDesktopConfigPath(): string | null;
8
+ /**
9
+ * Return the list of AI coding tools detected in `projectRoot` or the user's
10
+ * home directory. Detection is based on characteristic directory/file signals.
11
+ *
12
+ * `cline` and `vscode` both trigger on `.vscode/` — intentional; they write
13
+ * to different output files so there is no conflict.
14
+ */
15
+ export declare function detectInstalledIDEs(projectRoot: string): Promise<string[]>;
16
+ //# sourceMappingURL=install-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-detect.d.ts","sourceRoot":"","sources":["../../src/cli/install-detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,wBAAgB,0BAA0B,IAAI,MAAM,GAAG,IAAI,CAY1D;AAID;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6ChF"}