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.
- package/LICENSE +21 -0
- package/LICENSE-COMMERCIAL +32 -0
- package/README.md +314 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +577 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +67 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +22 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +9 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/indexer/file-scanner.d.ts +6 -0
- package/dist/indexer/file-scanner.d.ts.map +1 -0
- package/dist/indexer/file-scanner.js +37 -0
- package/dist/indexer/file-scanner.js.map +1 -0
- package/dist/indexer/index.d.ts +10 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +123 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/parsers/asciidoc.d.ts +3 -0
- package/dist/indexer/parsers/asciidoc.d.ts.map +1 -0
- package/dist/indexer/parsers/asciidoc.js +55 -0
- package/dist/indexer/parsers/asciidoc.js.map +1 -0
- package/dist/indexer/parsers/c.d.ts +3 -0
- package/dist/indexer/parsers/c.d.ts.map +1 -0
- package/dist/indexer/parsers/c.js +93 -0
- package/dist/indexer/parsers/c.js.map +1 -0
- package/dist/indexer/parsers/csharp.d.ts +3 -0
- package/dist/indexer/parsers/csharp.d.ts.map +1 -0
- package/dist/indexer/parsers/csharp.js +79 -0
- package/dist/indexer/parsers/csharp.js.map +1 -0
- package/dist/indexer/parsers/dart.d.ts +3 -0
- package/dist/indexer/parsers/dart.d.ts.map +1 -0
- package/dist/indexer/parsers/dart.js +81 -0
- package/dist/indexer/parsers/dart.js.map +1 -0
- package/dist/indexer/parsers/go.d.ts +3 -0
- package/dist/indexer/parsers/go.d.ts.map +1 -0
- package/dist/indexer/parsers/go.js +64 -0
- package/dist/indexer/parsers/go.js.map +1 -0
- package/dist/indexer/parsers/index.d.ts +4 -0
- package/dist/indexer/parsers/index.d.ts.map +1 -0
- package/dist/indexer/parsers/index.js +109 -0
- package/dist/indexer/parsers/index.js.map +1 -0
- package/dist/indexer/parsers/java.d.ts +3 -0
- package/dist/indexer/parsers/java.d.ts.map +1 -0
- package/dist/indexer/parsers/java.js +84 -0
- package/dist/indexer/parsers/java.js.map +1 -0
- package/dist/indexer/parsers/javascript.d.ts +3 -0
- package/dist/indexer/parsers/javascript.d.ts.map +1 -0
- package/dist/indexer/parsers/javascript.js +78 -0
- package/dist/indexer/parsers/javascript.js.map +1 -0
- package/dist/indexer/parsers/markdown.d.ts +3 -0
- package/dist/indexer/parsers/markdown.d.ts.map +1 -0
- package/dist/indexer/parsers/markdown.js +67 -0
- package/dist/indexer/parsers/markdown.js.map +1 -0
- package/dist/indexer/parsers/php.d.ts +3 -0
- package/dist/indexer/parsers/php.d.ts.map +1 -0
- package/dist/indexer/parsers/php.js +78 -0
- package/dist/indexer/parsers/php.js.map +1 -0
- package/dist/indexer/parsers/plain.d.ts +3 -0
- package/dist/indexer/parsers/plain.d.ts.map +1 -0
- package/dist/indexer/parsers/plain.js +18 -0
- package/dist/indexer/parsers/plain.js.map +1 -0
- package/dist/indexer/parsers/python.d.ts +3 -0
- package/dist/indexer/parsers/python.d.ts.map +1 -0
- package/dist/indexer/parsers/python.js +64 -0
- package/dist/indexer/parsers/python.js.map +1 -0
- package/dist/indexer/parsers/rst.d.ts +3 -0
- package/dist/indexer/parsers/rst.d.ts.map +1 -0
- package/dist/indexer/parsers/rst.js +67 -0
- package/dist/indexer/parsers/rst.js.map +1 -0
- package/dist/indexer/parsers/ruby.d.ts +3 -0
- package/dist/indexer/parsers/ruby.d.ts.map +1 -0
- package/dist/indexer/parsers/ruby.js +77 -0
- package/dist/indexer/parsers/ruby.js.map +1 -0
- package/dist/indexer/parsers/rust.d.ts +3 -0
- package/dist/indexer/parsers/rust.d.ts.map +1 -0
- package/dist/indexer/parsers/rust.js +83 -0
- package/dist/indexer/parsers/rust.js.map +1 -0
- package/dist/indexer/parsers/shader.d.ts +3 -0
- package/dist/indexer/parsers/shader.d.ts.map +1 -0
- package/dist/indexer/parsers/shader.js +81 -0
- package/dist/indexer/parsers/shader.js.map +1 -0
- package/dist/indexer/parsers/shell.d.ts +3 -0
- package/dist/indexer/parsers/shell.d.ts.map +1 -0
- package/dist/indexer/parsers/shell.js +77 -0
- package/dist/indexer/parsers/shell.js.map +1 -0
- package/dist/indexer/parsers/structured.d.ts +3 -0
- package/dist/indexer/parsers/structured.d.ts.map +1 -0
- package/dist/indexer/parsers/structured.js +104 -0
- package/dist/indexer/parsers/structured.js.map +1 -0
- package/dist/indexer/parsers/swift.d.ts +3 -0
- package/dist/indexer/parsers/swift.d.ts.map +1 -0
- package/dist/indexer/parsers/swift.js +89 -0
- package/dist/indexer/parsers/swift.js.map +1 -0
- package/dist/indexer/parsers/toml.d.ts +3 -0
- package/dist/indexer/parsers/toml.d.ts.map +1 -0
- package/dist/indexer/parsers/toml.js +58 -0
- package/dist/indexer/parsers/toml.js.map +1 -0
- package/dist/indexer/parsers/xml.d.ts +3 -0
- package/dist/indexer/parsers/xml.d.ts.map +1 -0
- package/dist/indexer/parsers/xml.js +73 -0
- package/dist/indexer/parsers/xml.js.map +1 -0
- package/dist/search/index.d.ts +5 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +84 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/keywords.d.ts +9 -0
- package/dist/search/keywords.d.ts.map +1 -0
- package/dist/search/keywords.js +79 -0
- package/dist/search/keywords.js.map +1 -0
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/gitignore.d.ts +5 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +31 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/paths.d.ts +8 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +23 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/tokens.d.ts +3 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +22 -0
- package/dist/utils/tokens.js.map +1 -0
- 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
|
package/dist/cli.js.map
ADDED
|
@@ -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"}
|