ctx-pilot 0.9.0

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 (136) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSE-COMMERCIAL +32 -0
  3. package/README.md +314 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +577 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config/index.d.ts +9 -0
  9. package/dist/config/index.d.ts.map +1 -0
  10. package/dist/config/index.js +67 -0
  11. package/dist/config/index.js.map +1 -0
  12. package/dist/config/schema.d.ts +22 -0
  13. package/dist/config/schema.d.ts.map +1 -0
  14. package/dist/config/schema.js +9 -0
  15. package/dist/config/schema.js.map +1 -0
  16. package/dist/indexer/file-scanner.d.ts +6 -0
  17. package/dist/indexer/file-scanner.d.ts.map +1 -0
  18. package/dist/indexer/file-scanner.js +37 -0
  19. package/dist/indexer/file-scanner.js.map +1 -0
  20. package/dist/indexer/index.d.ts +10 -0
  21. package/dist/indexer/index.d.ts.map +1 -0
  22. package/dist/indexer/index.js +123 -0
  23. package/dist/indexer/index.js.map +1 -0
  24. package/dist/indexer/parsers/asciidoc.d.ts +3 -0
  25. package/dist/indexer/parsers/asciidoc.d.ts.map +1 -0
  26. package/dist/indexer/parsers/asciidoc.js +55 -0
  27. package/dist/indexer/parsers/asciidoc.js.map +1 -0
  28. package/dist/indexer/parsers/c.d.ts +3 -0
  29. package/dist/indexer/parsers/c.d.ts.map +1 -0
  30. package/dist/indexer/parsers/c.js +93 -0
  31. package/dist/indexer/parsers/c.js.map +1 -0
  32. package/dist/indexer/parsers/csharp.d.ts +3 -0
  33. package/dist/indexer/parsers/csharp.d.ts.map +1 -0
  34. package/dist/indexer/parsers/csharp.js +79 -0
  35. package/dist/indexer/parsers/csharp.js.map +1 -0
  36. package/dist/indexer/parsers/dart.d.ts +3 -0
  37. package/dist/indexer/parsers/dart.d.ts.map +1 -0
  38. package/dist/indexer/parsers/dart.js +81 -0
  39. package/dist/indexer/parsers/dart.js.map +1 -0
  40. package/dist/indexer/parsers/go.d.ts +3 -0
  41. package/dist/indexer/parsers/go.d.ts.map +1 -0
  42. package/dist/indexer/parsers/go.js +64 -0
  43. package/dist/indexer/parsers/go.js.map +1 -0
  44. package/dist/indexer/parsers/index.d.ts +4 -0
  45. package/dist/indexer/parsers/index.d.ts.map +1 -0
  46. package/dist/indexer/parsers/index.js +109 -0
  47. package/dist/indexer/parsers/index.js.map +1 -0
  48. package/dist/indexer/parsers/java.d.ts +3 -0
  49. package/dist/indexer/parsers/java.d.ts.map +1 -0
  50. package/dist/indexer/parsers/java.js +84 -0
  51. package/dist/indexer/parsers/java.js.map +1 -0
  52. package/dist/indexer/parsers/javascript.d.ts +3 -0
  53. package/dist/indexer/parsers/javascript.d.ts.map +1 -0
  54. package/dist/indexer/parsers/javascript.js +78 -0
  55. package/dist/indexer/parsers/javascript.js.map +1 -0
  56. package/dist/indexer/parsers/markdown.d.ts +3 -0
  57. package/dist/indexer/parsers/markdown.d.ts.map +1 -0
  58. package/dist/indexer/parsers/markdown.js +67 -0
  59. package/dist/indexer/parsers/markdown.js.map +1 -0
  60. package/dist/indexer/parsers/php.d.ts +3 -0
  61. package/dist/indexer/parsers/php.d.ts.map +1 -0
  62. package/dist/indexer/parsers/php.js +78 -0
  63. package/dist/indexer/parsers/php.js.map +1 -0
  64. package/dist/indexer/parsers/plain.d.ts +3 -0
  65. package/dist/indexer/parsers/plain.d.ts.map +1 -0
  66. package/dist/indexer/parsers/plain.js +18 -0
  67. package/dist/indexer/parsers/plain.js.map +1 -0
  68. package/dist/indexer/parsers/python.d.ts +3 -0
  69. package/dist/indexer/parsers/python.d.ts.map +1 -0
  70. package/dist/indexer/parsers/python.js +64 -0
  71. package/dist/indexer/parsers/python.js.map +1 -0
  72. package/dist/indexer/parsers/rst.d.ts +3 -0
  73. package/dist/indexer/parsers/rst.d.ts.map +1 -0
  74. package/dist/indexer/parsers/rst.js +67 -0
  75. package/dist/indexer/parsers/rst.js.map +1 -0
  76. package/dist/indexer/parsers/ruby.d.ts +3 -0
  77. package/dist/indexer/parsers/ruby.d.ts.map +1 -0
  78. package/dist/indexer/parsers/ruby.js +77 -0
  79. package/dist/indexer/parsers/ruby.js.map +1 -0
  80. package/dist/indexer/parsers/rust.d.ts +3 -0
  81. package/dist/indexer/parsers/rust.d.ts.map +1 -0
  82. package/dist/indexer/parsers/rust.js +83 -0
  83. package/dist/indexer/parsers/rust.js.map +1 -0
  84. package/dist/indexer/parsers/shader.d.ts +3 -0
  85. package/dist/indexer/parsers/shader.d.ts.map +1 -0
  86. package/dist/indexer/parsers/shader.js +81 -0
  87. package/dist/indexer/parsers/shader.js.map +1 -0
  88. package/dist/indexer/parsers/shell.d.ts +3 -0
  89. package/dist/indexer/parsers/shell.d.ts.map +1 -0
  90. package/dist/indexer/parsers/shell.js +77 -0
  91. package/dist/indexer/parsers/shell.js.map +1 -0
  92. package/dist/indexer/parsers/structured.d.ts +3 -0
  93. package/dist/indexer/parsers/structured.d.ts.map +1 -0
  94. package/dist/indexer/parsers/structured.js +104 -0
  95. package/dist/indexer/parsers/structured.js.map +1 -0
  96. package/dist/indexer/parsers/swift.d.ts +3 -0
  97. package/dist/indexer/parsers/swift.d.ts.map +1 -0
  98. package/dist/indexer/parsers/swift.js +89 -0
  99. package/dist/indexer/parsers/swift.js.map +1 -0
  100. package/dist/indexer/parsers/toml.d.ts +3 -0
  101. package/dist/indexer/parsers/toml.d.ts.map +1 -0
  102. package/dist/indexer/parsers/toml.js +58 -0
  103. package/dist/indexer/parsers/toml.js.map +1 -0
  104. package/dist/indexer/parsers/xml.d.ts +3 -0
  105. package/dist/indexer/parsers/xml.d.ts.map +1 -0
  106. package/dist/indexer/parsers/xml.js +73 -0
  107. package/dist/indexer/parsers/xml.js.map +1 -0
  108. package/dist/search/index.d.ts +5 -0
  109. package/dist/search/index.d.ts.map +1 -0
  110. package/dist/search/index.js +84 -0
  111. package/dist/search/index.js.map +1 -0
  112. package/dist/search/keywords.d.ts +9 -0
  113. package/dist/search/keywords.d.ts.map +1 -0
  114. package/dist/search/keywords.js +79 -0
  115. package/dist/search/keywords.js.map +1 -0
  116. package/dist/types.d.ts +44 -0
  117. package/dist/types.d.ts.map +1 -0
  118. package/dist/types.js +2 -0
  119. package/dist/types.js.map +1 -0
  120. package/dist/utils/gitignore.d.ts +5 -0
  121. package/dist/utils/gitignore.d.ts.map +1 -0
  122. package/dist/utils/gitignore.js +31 -0
  123. package/dist/utils/gitignore.js.map +1 -0
  124. package/dist/utils/index.d.ts +3 -0
  125. package/dist/utils/index.d.ts.map +1 -0
  126. package/dist/utils/index.js +3 -0
  127. package/dist/utils/index.js.map +1 -0
  128. package/dist/utils/paths.d.ts +8 -0
  129. package/dist/utils/paths.d.ts.map +1 -0
  130. package/dist/utils/paths.js +23 -0
  131. package/dist/utils/paths.js.map +1 -0
  132. package/dist/utils/tokens.d.ts +3 -0
  133. package/dist/utils/tokens.d.ts.map +1 -0
  134. package/dist/utils/tokens.js +22 -0
  135. package/dist/utils/tokens.js.map +1 -0
  136. package/package.json +77 -0
package/dist/cli.js ADDED
@@ -0,0 +1,577 @@
1
+ #!/usr/bin/env node
2
+ import { readFile, writeFile, mkdir, access } from 'fs/promises';
3
+ import { join, dirname } from 'path';
4
+ import { watch } from 'chokidar';
5
+ import { loadConfig, configExists, saveConfig, getDefaultConfig, getContextDir } from './config/index.js';
6
+ import { loadIndex, buildIndex, getIndexStats } from './indexer/index.js';
7
+ import { searchSections } from './search/index.js';
8
+ import { extractTopics } from './search/keywords.js';
9
+ const ENVIRONMENTS = {
10
+ claude: {
11
+ name: 'Claude Code',
12
+ settingsDir: '.claude',
13
+ settingsFile: 'settings.json',
14
+ hookEvent: 'UserPromptSubmit',
15
+ restartMessage: 'Restart Claude Code to activate the hook.',
16
+ },
17
+ gemini: {
18
+ name: 'Gemini CLI',
19
+ settingsDir: '.gemini',
20
+ settingsFile: 'settings.json',
21
+ hookEvent: 'BeforeAgent',
22
+ restartMessage: 'Restart Gemini CLI to activate the hook.',
23
+ },
24
+ };
25
+ // Format pinned files content for static exports
26
+ async function formatPinnedContent(config, projectRoot, maxChars) {
27
+ const sections = [];
28
+ let totalChars = 0;
29
+ for (const pinnedPath of config.pinned) {
30
+ try {
31
+ const absolutePath = join(projectRoot, pinnedPath);
32
+ let content = await readFile(absolutePath, 'utf-8');
33
+ // Truncate if needed
34
+ if (maxChars && totalChars + content.length > maxChars) {
35
+ const remaining = maxChars - totalChars - 100; // Leave room for header
36
+ if (remaining > 200) {
37
+ content = content.slice(0, remaining) + '\n\n... (truncated)';
38
+ }
39
+ else {
40
+ break;
41
+ }
42
+ }
43
+ sections.push(`## ${pinnedPath}\n\n${content}`);
44
+ totalChars += content.length;
45
+ if (maxChars && totalChars >= maxChars)
46
+ break;
47
+ }
48
+ catch {
49
+ // Skip missing files
50
+ }
51
+ }
52
+ return sections.join('\n\n---\n\n');
53
+ }
54
+ // Format index summary for static exports
55
+ function formatIndexSummary(index) {
56
+ const lines = ['## Codebase Structure\n'];
57
+ for (const file of index.files.slice(0, 50)) { // Limit to 50 files
58
+ lines.push(`### ${file.path}`);
59
+ for (const section of file.sections.slice(0, 10)) { // Limit sections per file
60
+ lines.push(`- ${section.title} (lines ${section.lineStart}-${section.lineEnd})`);
61
+ }
62
+ lines.push('');
63
+ }
64
+ return lines.join('\n');
65
+ }
66
+ const EXPORT_CONFIGS = {
67
+ cursor: {
68
+ name: 'Cursor',
69
+ outputPath: '.cursorrules',
70
+ format: async (config, index, projectRoot) => {
71
+ const pinned = await formatPinnedContent(config, projectRoot);
72
+ const summary = formatIndexSummary(index);
73
+ return `# Project Context (generated by ctx-pilot)
74
+ # Regenerate with: npx ctx-pilot export --cursor
75
+
76
+ ${pinned}
77
+
78
+ ---
79
+
80
+ ${summary}
81
+ `;
82
+ },
83
+ },
84
+ windsurf: {
85
+ name: 'Windsurf',
86
+ outputPath: '.windsurfrules',
87
+ maxChars: 6000,
88
+ format: async (config, index, projectRoot) => {
89
+ const pinned = await formatPinnedContent(config, projectRoot, 4000);
90
+ const stats = getIndexStats(index);
91
+ return `# Project Context (generated by ctx-pilot)
92
+ # Regenerate with: npx ctx-pilot export --windsurf
93
+
94
+ ${pinned}
95
+
96
+ ---
97
+
98
+ ## Project Stats
99
+ - Indexed files: ${stats.files}
100
+ - Indexed sections: ${stats.sections}
101
+ - Pinned files: ${config.pinned.join(', ') || 'none'}
102
+ `;
103
+ },
104
+ },
105
+ aider: {
106
+ name: 'Aider',
107
+ outputPath: '.aider.context.md',
108
+ format: async (config, index, projectRoot) => {
109
+ const pinned = await formatPinnedContent(config, projectRoot);
110
+ const summary = formatIndexSummary(index);
111
+ return `# Project Context for Aider
112
+ # Use with: aider --read .aider.context.md
113
+ # Regenerate with: npx ctx-pilot export --aider
114
+
115
+ ${pinned}
116
+
117
+ ---
118
+
119
+ ${summary}
120
+ `;
121
+ },
122
+ },
123
+ mdc: {
124
+ name: 'Cursor MDC',
125
+ outputPath: '.cursor/rules/ctx-pilot.mdc',
126
+ format: async (config, index, projectRoot) => {
127
+ const pinned = await formatPinnedContent(config, projectRoot);
128
+ return `---
129
+ description: Project context from ctx-pilot
130
+ globs: ["**/*"]
131
+ alwaysApply: true
132
+ ---
133
+
134
+ # Project Context
135
+
136
+ ${pinned}
137
+
138
+ ## Key Files
139
+
140
+ ${config.pinned.map(f => `- ${f}`).join('\n')}
141
+ `;
142
+ },
143
+ },
144
+ };
145
+ const SETUP_INSTRUCTIONS = `## ctx-pilot Setup Required
146
+
147
+ Create a config file at \`.context/config.json\`:
148
+
149
+ \`\`\`json
150
+ {
151
+ "pinned": [],
152
+ "include": ["**/*.md"],
153
+ "exclude": [],
154
+ "tokenBudget": 32000,
155
+ "maxContextPercentage": 50
156
+ }
157
+ \`\`\`
158
+
159
+ Or run \`npx ctx-pilot init\` to create a default config.
160
+ `;
161
+ async function readStdin() {
162
+ const chunks = [];
163
+ for await (const chunk of process.stdin) {
164
+ chunks.push(chunk);
165
+ }
166
+ return Buffer.concat(chunks).toString('utf-8');
167
+ }
168
+ async function pathExists(path) {
169
+ try {
170
+ await access(path);
171
+ return true;
172
+ }
173
+ catch {
174
+ return false;
175
+ }
176
+ }
177
+ async function detectEnvironment(projectRoot) {
178
+ const claudeExists = await pathExists(join(projectRoot, '.claude'));
179
+ const geminiExists = await pathExists(join(projectRoot, '.gemini'));
180
+ if (claudeExists && geminiExists) {
181
+ const claudeSettings = await pathExists(join(projectRoot, '.claude', 'settings.json'));
182
+ const geminiSettings = await pathExists(join(projectRoot, '.gemini', 'settings.json'));
183
+ if (claudeSettings && !geminiSettings)
184
+ return 'claude';
185
+ if (geminiSettings && !claudeSettings)
186
+ return 'gemini';
187
+ return 'claude';
188
+ }
189
+ if (claudeExists)
190
+ return 'claude';
191
+ if (geminiExists)
192
+ return 'gemini';
193
+ if (process.env.CLAUDE_CODE || process.env.ANTHROPIC_API_KEY)
194
+ return 'claude';
195
+ if (process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY)
196
+ return 'gemini';
197
+ return 'claude';
198
+ }
199
+ async function installHook(projectRoot, forceEnv) {
200
+ const env = forceEnv || await detectEnvironment(projectRoot);
201
+ if (env === 'unknown') {
202
+ console.log('Could not detect AI CLI environment.');
203
+ console.log('Use --claude or --gemini flag to specify.');
204
+ return;
205
+ }
206
+ const config = ENVIRONMENTS[env];
207
+ const settingsDir = join(projectRoot, config.settingsDir);
208
+ const settingsPath = join(settingsDir, config.settingsFile);
209
+ await mkdir(settingsDir, { recursive: true });
210
+ let settings = {};
211
+ try {
212
+ const content = await readFile(settingsPath, 'utf-8');
213
+ settings = JSON.parse(content);
214
+ }
215
+ catch {
216
+ // File doesn't exist
217
+ }
218
+ if (!settings.hooks)
219
+ settings.hooks = {};
220
+ const hooks = settings.hooks;
221
+ if (!hooks[config.hookEvent])
222
+ hooks[config.hookEvent] = [];
223
+ const eventHooks = hooks[config.hookEvent];
224
+ const hasHook = eventHooks.some((h) => {
225
+ const hHooks = h.hooks;
226
+ return hHooks?.some((hh) => String(hh.command || '').includes('ctx-pilot'));
227
+ });
228
+ if (hasHook) {
229
+ console.log(`Hook already installed for ${config.name}.`);
230
+ return;
231
+ }
232
+ eventHooks.push({
233
+ matcher: '',
234
+ hooks: [{ type: 'command', command: 'npx ctx-pilot' }],
235
+ });
236
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
237
+ console.log(`Hook installed for ${config.name} at ${config.settingsDir}/${config.settingsFile}`);
238
+ }
239
+ async function runExport(projectRoot, target) {
240
+ if (!(await configExists(projectRoot))) {
241
+ console.error('Not configured. Run `npx ctx-pilot init` first.');
242
+ process.exit(1);
243
+ }
244
+ const config = await loadConfig(projectRoot);
245
+ let index = await loadIndex(projectRoot);
246
+ if (!index) {
247
+ console.log('Building index...');
248
+ index = await buildIndex(projectRoot, config, { force: true });
249
+ }
250
+ const exportConfig = EXPORT_CONFIGS[target];
251
+ const outputPath = join(projectRoot, exportConfig.outputPath);
252
+ // Ensure directory exists for MDC
253
+ await mkdir(dirname(outputPath), { recursive: true });
254
+ const content = await exportConfig.format(config, index, projectRoot);
255
+ await writeFile(outputPath, content, 'utf-8');
256
+ console.log(`Exported to ${exportConfig.outputPath} for ${exportConfig.name}`);
257
+ }
258
+ async function runWatch(projectRoot, targets) {
259
+ if (!(await configExists(projectRoot))) {
260
+ console.error('Not configured. Run `npx ctx-pilot init` first.');
261
+ process.exit(1);
262
+ }
263
+ const config = await loadConfig(projectRoot);
264
+ const contextDir = getContextDir(projectRoot);
265
+ console.log(`Watching for changes...`);
266
+ console.log(`Targets: ${targets.map(t => EXPORT_CONFIGS[t].name).join(', ')}`);
267
+ console.log(`Patterns: ${config.include.join(', ')}`);
268
+ console.log('Press Ctrl+C to stop.\n');
269
+ // Initial export
270
+ for (const target of targets) {
271
+ await runExport(projectRoot, target);
272
+ }
273
+ // Set up watcher
274
+ const watcher = watch(config.include, {
275
+ cwd: projectRoot,
276
+ ignored: [
277
+ ...config.exclude,
278
+ '**/node_modules/**',
279
+ '**/.git/**',
280
+ '.context/**',
281
+ '.cursor/**',
282
+ '.cursorrules',
283
+ '.windsurfrules',
284
+ '.aider.context.md',
285
+ ],
286
+ ignoreInitial: true,
287
+ persistent: true,
288
+ });
289
+ let debounceTimer = null;
290
+ const regenerate = async () => {
291
+ console.log(`\n[${new Date().toLocaleTimeString()}] Change detected, regenerating...`);
292
+ try {
293
+ // Rebuild index
294
+ const newIndex = await buildIndex(projectRoot, config, { force: true });
295
+ const stats = getIndexStats(newIndex);
296
+ console.log(` Index: ${stats.files} files, ${stats.sections} sections`);
297
+ // Re-export all targets
298
+ for (const target of targets) {
299
+ const exportConfig = EXPORT_CONFIGS[target];
300
+ const outputPath = join(projectRoot, exportConfig.outputPath);
301
+ await mkdir(dirname(outputPath), { recursive: true });
302
+ const content = await exportConfig.format(config, newIndex, projectRoot);
303
+ await writeFile(outputPath, content, 'utf-8');
304
+ console.log(` Updated ${exportConfig.outputPath}`);
305
+ }
306
+ }
307
+ catch (error) {
308
+ console.error(' Error:', error);
309
+ }
310
+ };
311
+ watcher.on('all', (event, path) => {
312
+ // Debounce rapid changes
313
+ if (debounceTimer)
314
+ clearTimeout(debounceTimer);
315
+ debounceTimer = setTimeout(regenerate, 500);
316
+ });
317
+ // Keep process alive
318
+ process.on('SIGINT', () => {
319
+ console.log('\nStopping watch...');
320
+ watcher.close();
321
+ process.exit(0);
322
+ });
323
+ }
324
+ async function runInit(projectRoot, forceEnv) {
325
+ const env = forceEnv || await detectEnvironment(projectRoot);
326
+ const envConfig = env !== 'unknown' ? ENVIRONMENTS[env] : null;
327
+ if (await configExists(projectRoot)) {
328
+ console.log('Already configured. See .context/config.json');
329
+ return;
330
+ }
331
+ const config = getDefaultConfig();
332
+ await saveConfig(projectRoot, config);
333
+ console.log('Created .context/config.json with defaults:');
334
+ console.log(JSON.stringify(config, null, 2));
335
+ console.log('\nBuilding index...');
336
+ const index = await buildIndex(projectRoot, config, { force: true });
337
+ const stats = getIndexStats(index);
338
+ console.log(`Indexed ${stats.files} files with ${stats.sections} sections.`);
339
+ if (envConfig) {
340
+ console.log(`\nDetected ${envConfig.name}. Installing hook...`);
341
+ await installHook(projectRoot, env);
342
+ console.log(`\nSetup complete! ${envConfig.restartMessage}`);
343
+ }
344
+ else {
345
+ console.log('\nCould not detect AI CLI environment.');
346
+ console.log('Run `npx ctx-pilot hook --claude` or `npx ctx-pilot hook --gemini` to install.');
347
+ }
348
+ }
349
+ async function runIndex(projectRoot, force) {
350
+ if (!(await configExists(projectRoot))) {
351
+ console.error('Not configured. Run `npx ctx-pilot init` first.');
352
+ process.exit(1);
353
+ }
354
+ const config = await loadConfig(projectRoot);
355
+ console.log('Building index...');
356
+ const index = await buildIndex(projectRoot, config, { force });
357
+ const stats = getIndexStats(index);
358
+ console.log(`Indexed ${stats.files} files with ${stats.sections} sections.`);
359
+ }
360
+ async function runStatus(projectRoot) {
361
+ if (!(await configExists(projectRoot))) {
362
+ console.log('Status: Not configured');
363
+ console.log('Run `npx ctx-pilot init` to set up.');
364
+ return;
365
+ }
366
+ const config = await loadConfig(projectRoot);
367
+ const index = await loadIndex(projectRoot);
368
+ const env = await detectEnvironment(projectRoot);
369
+ console.log('Status: Configured');
370
+ console.log(`Environment: ${env !== 'unknown' ? ENVIRONMENTS[env].name : 'Unknown'}`);
371
+ console.log(`\nConfig (.context/config.json):`);
372
+ console.log(` Pinned: ${config.pinned.length > 0 ? config.pinned.join(', ') : '(none)'}`);
373
+ console.log(` Include: ${config.include.join(', ')}`);
374
+ console.log(` Exclude: ${config.exclude.length > 0 ? config.exclude.join(', ') : '(none)'}`);
375
+ if (index) {
376
+ const stats = getIndexStats(index);
377
+ console.log(`\nIndex (.context/index.json):`);
378
+ console.log(` Files: ${stats.files}`);
379
+ console.log(` Sections: ${stats.sections}`);
380
+ console.log(` Last updated: ${index.lastUpdated}`);
381
+ }
382
+ else {
383
+ console.log(`\nIndex: Not built yet.`);
384
+ }
385
+ // Check hooks
386
+ console.log(`\nHooks:`);
387
+ for (const [, envConfig] of Object.entries(ENVIRONMENTS)) {
388
+ const settingsPath = join(projectRoot, envConfig.settingsDir, envConfig.settingsFile);
389
+ if (await pathExists(settingsPath)) {
390
+ try {
391
+ const content = await readFile(settingsPath, 'utf-8');
392
+ const settings = JSON.parse(content);
393
+ const hooks = settings.hooks?.[envConfig.hookEvent] || [];
394
+ const hasHook = hooks.some((h) => {
395
+ const hHooks = h.hooks;
396
+ return hHooks?.some((hh) => String(hh.command || '').includes('ctx-pilot'));
397
+ });
398
+ console.log(` ${envConfig.name}: ${hasHook ? 'Installed' : 'Not installed'}`);
399
+ }
400
+ catch {
401
+ console.log(` ${envConfig.name}: Error reading settings`);
402
+ }
403
+ }
404
+ }
405
+ // Check exports
406
+ console.log(`\nExports:`);
407
+ for (const [, exportConfig] of Object.entries(EXPORT_CONFIGS)) {
408
+ const exists = await pathExists(join(projectRoot, exportConfig.outputPath));
409
+ if (exists) {
410
+ console.log(` ${exportConfig.name}: ${exportConfig.outputPath}`);
411
+ }
412
+ }
413
+ }
414
+ function formatSuggestions(pinnedFiles, results, maxSuggestions = 5) {
415
+ const lines = [];
416
+ if (pinnedFiles.length > 0) {
417
+ lines.push('**Pinned (always relevant):**');
418
+ for (const file of pinnedFiles) {
419
+ lines.push(`- ${file}`);
420
+ }
421
+ lines.push('');
422
+ }
423
+ if (results.length > 0) {
424
+ lines.push('**Relevant to your task:**');
425
+ const top = results.slice(0, maxSuggestions);
426
+ for (const r of top) {
427
+ const lineRange = `lines ${r.section.lineStart}-${r.section.lineEnd}`;
428
+ lines.push(`- ${r.file} (${lineRange}) - ${r.section.title}`);
429
+ }
430
+ }
431
+ return lines.join('\n');
432
+ }
433
+ async function runHook() {
434
+ const projectRoot = process.cwd();
435
+ try {
436
+ const input = await readStdin();
437
+ if (!input.trim())
438
+ process.exit(0);
439
+ let data;
440
+ try {
441
+ data = JSON.parse(input);
442
+ }
443
+ catch {
444
+ process.exit(0);
445
+ }
446
+ if (!(await configExists(projectRoot))) {
447
+ console.log(SETUP_INSTRUCTIONS);
448
+ process.exit(0);
449
+ }
450
+ const config = await loadConfig(projectRoot);
451
+ let index = await loadIndex(projectRoot);
452
+ if (!index)
453
+ index = await buildIndex(projectRoot, config);
454
+ const topics = extractTopics(data.prompt);
455
+ const query = topics.join(' ');
456
+ const results = query ? searchSections(index, query, { maxResults: 10 }) : [];
457
+ const suggestions = formatSuggestions(config.pinned, results);
458
+ if (suggestions) {
459
+ console.log(`<ctx-pilot>
460
+ Look into these files for context:
461
+
462
+ ${suggestions}
463
+ </ctx-pilot>`);
464
+ }
465
+ process.exit(0);
466
+ }
467
+ catch (error) {
468
+ console.error('ctx-pilot error:', error);
469
+ process.exit(0);
470
+ }
471
+ }
472
+ function printHelp() {
473
+ console.log(`ctx-pilot - Intelligent context management for AI coding assistants
474
+
475
+ Supported:
476
+ Dynamic hooks: Claude Code, Gemini CLI
477
+ Static exports: Cursor, Windsurf, Aider
478
+
479
+ Usage:
480
+ npx ctx-pilot Run as hook (reads from stdin)
481
+ npx ctx-pilot init Create config and install hook
482
+ npx ctx-pilot index Rebuild the index
483
+ npx ctx-pilot status Show config, index, and hook status
484
+
485
+ Hooks (dynamic, per-prompt):
486
+ npx ctx-pilot hook Install hook (auto-detects Claude/Gemini)
487
+ npx ctx-pilot hook --claude Install for Claude Code
488
+ npx ctx-pilot hook --gemini Install for Gemini CLI
489
+
490
+ Exports (static files):
491
+ npx ctx-pilot export --cursor Generate .cursorrules
492
+ npx ctx-pilot export --windsurf Generate .windsurfrules
493
+ npx ctx-pilot export --aider Generate .aider.context.md
494
+ npx ctx-pilot export --mdc Generate .cursor/rules/ctx-pilot.mdc
495
+
496
+ Watch (auto-regenerate on file changes):
497
+ npx ctx-pilot watch --cursor Watch and update .cursorrules
498
+ npx ctx-pilot watch --windsurf Watch and update .windsurfrules
499
+ npx ctx-pilot watch --aider Watch and update .aider.context.md
500
+ npx ctx-pilot watch --all Watch and update all exports
501
+
502
+ Config file: .context/config.json
503
+ Index file: .context/index.json
504
+ `);
505
+ }
506
+ function parseEnvFlag(args) {
507
+ if (args.includes('--claude'))
508
+ return 'claude';
509
+ if (args.includes('--gemini'))
510
+ return 'gemini';
511
+ return undefined;
512
+ }
513
+ function parseExportTargets(args) {
514
+ const targets = [];
515
+ if (args.includes('--cursor'))
516
+ targets.push('cursor');
517
+ if (args.includes('--windsurf'))
518
+ targets.push('windsurf');
519
+ if (args.includes('--aider'))
520
+ targets.push('aider');
521
+ if (args.includes('--mdc'))
522
+ targets.push('mdc');
523
+ if (args.includes('--all')) {
524
+ return ['cursor', 'windsurf', 'aider', 'mdc'];
525
+ }
526
+ return targets;
527
+ }
528
+ async function main() {
529
+ const args = process.argv.slice(2);
530
+ const projectRoot = process.cwd();
531
+ const forceEnv = parseEnvFlag(args);
532
+ const exportTargets = parseExportTargets(args);
533
+ switch (args[0]) {
534
+ case 'init':
535
+ await runInit(projectRoot, forceEnv);
536
+ break;
537
+ case 'index':
538
+ await runIndex(projectRoot, args.includes('--force'));
539
+ break;
540
+ case 'status':
541
+ await runStatus(projectRoot);
542
+ break;
543
+ case 'hook':
544
+ case 'install':
545
+ case 'install-hook':
546
+ await installHook(projectRoot, forceEnv);
547
+ break;
548
+ case 'export':
549
+ if (exportTargets.length === 0) {
550
+ console.error('Specify export target: --cursor, --windsurf, --aider, --mdc, or --all');
551
+ process.exit(1);
552
+ }
553
+ for (const target of exportTargets) {
554
+ await runExport(projectRoot, target);
555
+ }
556
+ break;
557
+ case 'watch':
558
+ if (exportTargets.length === 0) {
559
+ console.error('Specify watch target: --cursor, --windsurf, --aider, --mdc, or --all');
560
+ process.exit(1);
561
+ }
562
+ await runWatch(projectRoot, exportTargets);
563
+ break;
564
+ case 'help':
565
+ case '--help':
566
+ case '-h':
567
+ printHelp();
568
+ break;
569
+ default:
570
+ await runHook();
571
+ }
572
+ }
573
+ main().catch((error) => {
574
+ console.error('Error:', error.message);
575
+ process.exit(1);
576
+ });
577
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { CtxPilotConfig } from '../types.js';
2
+ export declare function getConfigPath(projectRoot: string): string;
3
+ export declare function getContextDir(projectRoot: string): string;
4
+ export declare function configExists(projectRoot: string): Promise<boolean>;
5
+ export declare function loadConfig(projectRoot: string): Promise<CtxPilotConfig>;
6
+ export declare function validateConfig(config: unknown): CtxPilotConfig;
7
+ export declare function saveConfig(projectRoot: string, config: CtxPilotConfig): Promise<void>;
8
+ export declare function getDefaultConfig(): CtxPilotConfig;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxE;AAED,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoB7E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CAW9D;AAED,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAgB,gBAAgB,IAAI,cAAc,CAQjD"}