prelude-context 1.4.3 → 1.6.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/README.md +76 -0
- package/dist/bin/prelude.js +4 -0
- package/dist/bin/prelude.js.map +1 -1
- package/dist/src/commands/mcp-config.d.ts +3 -0
- package/dist/src/commands/mcp-config.d.ts.map +1 -0
- package/dist/src/commands/mcp-config.js +72 -0
- package/dist/src/commands/mcp-config.js.map +1 -0
- package/dist/src/commands/serve.d.ts +3 -0
- package/dist/src/commands/serve.d.ts.map +1 -0
- package/dist/src/commands/serve.js +29 -0
- package/dist/src/commands/serve.js.map +1 -0
- package/dist/src/constants.d.ts +1 -1
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +8 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/core/infer.d.ts.map +1 -1
- package/dist/src/core/infer.js +541 -39
- package/dist/src/core/infer.js.map +1 -1
- package/dist/src/core/source-scanner.d.ts.map +1 -1
- package/dist/src/core/source-scanner.js +95 -8
- package/dist/src/core/source-scanner.js.map +1 -1
- package/dist/src/mcp/server.d.ts +3 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +162 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/schema/stack.d.ts +3 -3
- package/dist/src/schema/stack.js +1 -1
- package/dist/src/schema/stack.js.map +1 -1
- package/dist/src/schema/state.d.ts +12 -12
- package/dist/src/utils/fs.d.ts.map +1 -1
- package/dist/src/utils/fs.js +3 -1
- package/dist/src/utils/fs.js.map +1 -1
- package/package.json +12 -10
- package/schemas/stack.schema.json +1 -1
package/README.md
CHANGED
|
@@ -171,6 +171,80 @@ prelude watch
|
|
|
171
171
|
# Press Ctrl+C when done to save the session
|
|
172
172
|
```
|
|
173
173
|
|
|
174
|
+
### `prelude serve`
|
|
175
|
+
Starts Prelude as an MCP server over stdio transport:
|
|
176
|
+
```bash
|
|
177
|
+
prelude serve # Serve context for current directory
|
|
178
|
+
prelude serve --root ~/my-project # Serve context for a specific project
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
AI tools connect to this server to query your project context programmatically — no clipboard needed.
|
|
182
|
+
|
|
183
|
+
### `prelude mcp-config`
|
|
184
|
+
Prints the configuration snippet to connect Prelude to your AI tool:
|
|
185
|
+
```bash
|
|
186
|
+
prelude mcp-config --client claude-code # Default
|
|
187
|
+
prelude mcp-config --client claude-desktop
|
|
188
|
+
prelude mcp-config --client cursor
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## MCP Server Integration
|
|
194
|
+
|
|
195
|
+
Prelude can run as an [MCP](https://modelcontextprotocol.io/) (Model Context Protocol) server, making your project context directly available to AI tools like Claude Code, Claude Desktop, and Cursor — no copy-paste required.
|
|
196
|
+
|
|
197
|
+
### Quick Setup (Claude Code)
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
# From your project directory (must have .context/ — run prelude init first)
|
|
201
|
+
prelude mcp-config --client claude-code
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
This prints the command to register Prelude as an MCP server. Once connected, your AI tools have access to three tools:
|
|
205
|
+
|
|
206
|
+
| Tool | Description |
|
|
207
|
+
|------|-------------|
|
|
208
|
+
| `prelude_query` | Full-power context queries with topic, scope, and type filtering |
|
|
209
|
+
| `prelude_compact` | Token-efficient context for prompt injection (~800 tokens) |
|
|
210
|
+
| `prelude_status` | Check which context files are available |
|
|
211
|
+
|
|
212
|
+
And three resources for passive context discovery:
|
|
213
|
+
|
|
214
|
+
| Resource URI | Description |
|
|
215
|
+
|-------------|-------------|
|
|
216
|
+
| `prelude://context/full` | Complete project context as markdown |
|
|
217
|
+
| `prelude://context/compact` | Token-efficient summary |
|
|
218
|
+
| `prelude://context/{type}` | Individual context files (project, stack, architecture, constraints, decisions) |
|
|
219
|
+
|
|
220
|
+
### Other Clients
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
prelude mcp-config --client claude-desktop
|
|
224
|
+
prelude mcp-config --client cursor
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Manual Setup
|
|
228
|
+
|
|
229
|
+
Start the server directly:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
prelude serve --root /path/to/your/project
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
The server uses stdio transport. Configure your MCP client to run this command.
|
|
236
|
+
|
|
237
|
+
### `prelude mcp-config [options]`
|
|
238
|
+
|
|
239
|
+
Prints the configuration snippet for connecting Prelude to your AI tool:
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
prelude mcp-config # Claude Code (default)
|
|
243
|
+
prelude mcp-config --client claude-desktop # Claude Desktop
|
|
244
|
+
prelude mcp-config --client cursor # Cursor
|
|
245
|
+
prelude mcp-config --root /path/to/project # Specify project root
|
|
246
|
+
```
|
|
247
|
+
|
|
174
248
|
---
|
|
175
249
|
|
|
176
250
|
## Use Cases
|
|
@@ -363,12 +437,14 @@ Yes! While the CLI is built with Node.js, the Prelude format works with any lang
|
|
|
363
437
|
|
|
364
438
|
- [x] Smart context updates with manual edit preservation
|
|
365
439
|
- [x] Scoped context query engine (`prelude query`)
|
|
440
|
+
- [x] MCP server for AI tool integration (`prelude serve`)
|
|
366
441
|
- [ ] Improved inference for Python, Rust, Go
|
|
367
442
|
- [ ] VS Code extension for inline context
|
|
368
443
|
- [ ] GitHub Action for automated updates
|
|
369
444
|
- [ ] Plugin system for custom inference
|
|
370
445
|
- [ ] CLI validation command
|
|
371
446
|
- [ ] Context diff tool
|
|
447
|
+
- [ ] Temporal brain layer (learned heuristics from AI tool usage)
|
|
372
448
|
|
|
373
449
|
---
|
|
374
450
|
|
package/dist/bin/prelude.js
CHANGED
|
@@ -26,6 +26,8 @@ import { registerDecisionCommand } from '../src/commands/decision.js';
|
|
|
26
26
|
import { registerWatchCommand } from '../src/commands/watch.js';
|
|
27
27
|
import { registerQueryCommand } from '../src/commands/query.js';
|
|
28
28
|
import { registerCompactCommand } from '../src/commands/compact.js';
|
|
29
|
+
import { registerServeCommand } from '../src/commands/serve.js';
|
|
30
|
+
import { registerMcpConfigCommand } from '../src/commands/mcp-config.js';
|
|
29
31
|
import { update } from '../src/commands/update.js';
|
|
30
32
|
// Register all commands
|
|
31
33
|
registerInitCommand(cli);
|
|
@@ -35,6 +37,8 @@ registerDecisionCommand(cli);
|
|
|
35
37
|
registerWatchCommand(cli);
|
|
36
38
|
registerQueryCommand(cli);
|
|
37
39
|
registerCompactCommand(cli);
|
|
40
|
+
registerServeCommand(cli);
|
|
41
|
+
registerMcpConfigCommand(cli);
|
|
38
42
|
// Register update command
|
|
39
43
|
cli
|
|
40
44
|
.command('update', 'Update context by re-analyzing the codebase')
|
package/dist/bin/prelude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prelude.js","sourceRoot":"","sources":["../../bin/prelude.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,0DAA0D;AAC1D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,+DAA+D;AAC/D,IAAI,WAAgB,CAAC;AACrB,IAAI,CAAC;IACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACzF,CAAC;AAAC,MAAM,CAAC;IACP,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;AAE3B,GAAG;KACA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,IAAI,EAAE,CAAC;AAEV,kBAAkB;AAClB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,wBAAwB;AACxB,mBAAmB,CAAC,GAAG,CAAC,CAAC;AACzB,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAC3B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,uBAAuB,CAAC,GAAG,CAAC,CAAC;AAC7B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,sBAAsB,CAAC,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"prelude.js","sourceRoot":"","sources":["../../bin/prelude.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,0DAA0D;AAC1D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,+DAA+D;AAC/D,IAAI,WAAgB,CAAC;AACrB,IAAI,CAAC;IACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACzF,CAAC;AAAC,MAAM,CAAC;IACP,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;AAE3B,GAAG;KACA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,IAAI,EAAE,CAAC;AAEV,kBAAkB;AAClB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,wBAAwB;AACxB,mBAAmB,CAAC,GAAG,CAAC,CAAC;AACzB,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAC3B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,uBAAuB,CAAC,GAAG,CAAC,CAAC;AAC7B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,sBAAsB,CAAC,GAAG,CAAC,CAAC;AAC5B,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,wBAAwB,CAAC,GAAG,CAAC,CAAC;AAE9B,0BAA0B;AAC1B,GAAG;KACA,OAAO,CAAC,QAAQ,EAAE,6CAA6C,CAAC;KAChE,MAAM,CAAC,SAAS,EAAE,+BAA+B,CAAC;KAClD,MAAM,CAAC,WAAW,EAAE,yCAAyC,CAAC;KAC9D,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC;KACjD,MAAM,CAAC,UAAU,EAAE,gBAAgB,CAAC;KACpC,MAAM,CAAC,MAAM,CAAC,CAAC;AAElB,gBAAgB;AAChB,GAAG,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../../src/commands/mcp-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI/B,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,GAAG,QAsEhD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { resolve } from 'path';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
export function registerMcpConfigCommand(cli) {
|
|
4
|
+
cli
|
|
5
|
+
.command('mcp-config', 'Print MCP server configuration for AI tool integration')
|
|
6
|
+
.option('--root <path>', 'Project root directory (default: cwd)')
|
|
7
|
+
.option('--client <name>', 'Target client: claude-desktop, claude-code, cursor', { default: 'claude-code' })
|
|
8
|
+
.action(async (options) => {
|
|
9
|
+
const rootDir = resolve(options.root || process.cwd());
|
|
10
|
+
// Find the prelude binary path
|
|
11
|
+
let preludePath;
|
|
12
|
+
try {
|
|
13
|
+
preludePath = execSync('which prelude', { encoding: 'utf-8' }).trim();
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Fallback: assume npx
|
|
17
|
+
preludePath = 'npx';
|
|
18
|
+
}
|
|
19
|
+
const isNpx = preludePath === 'npx';
|
|
20
|
+
const command = isNpx ? 'npx' : preludePath;
|
|
21
|
+
const args = isNpx
|
|
22
|
+
? ['prelude-context', 'serve', '--root', rootDir]
|
|
23
|
+
: ['serve', '--root', rootDir];
|
|
24
|
+
const serverConfig = {
|
|
25
|
+
command,
|
|
26
|
+
args,
|
|
27
|
+
};
|
|
28
|
+
const client = options.client || 'claude-code';
|
|
29
|
+
if (client === 'claude-code') {
|
|
30
|
+
// Claude Code uses: claude mcp add <name> -- <command> <args...>
|
|
31
|
+
const addCommand = isNpx
|
|
32
|
+
? `claude mcp add prelude-context -- npx prelude-context serve --root ${rootDir}`
|
|
33
|
+
: `claude mcp add prelude-context -- ${preludePath} serve --root ${rootDir}`;
|
|
34
|
+
console.log('# Claude Code\n');
|
|
35
|
+
console.log('Run this command:\n');
|
|
36
|
+
console.log(` ${addCommand}\n`);
|
|
37
|
+
console.log('Or add to .mcp.json in your project root:\n');
|
|
38
|
+
console.log(JSON.stringify({
|
|
39
|
+
mcpServers: {
|
|
40
|
+
'prelude-context': serverConfig
|
|
41
|
+
}
|
|
42
|
+
}, null, 2));
|
|
43
|
+
}
|
|
44
|
+
else if (client === 'claude-desktop') {
|
|
45
|
+
// Claude Desktop uses claude_desktop_config.json
|
|
46
|
+
console.log('# Claude Desktop\n');
|
|
47
|
+
console.log('Add to ~/Library/Application Support/Claude/claude_desktop_config.json:\n');
|
|
48
|
+
console.log(JSON.stringify({
|
|
49
|
+
mcpServers: {
|
|
50
|
+
'prelude-context': serverConfig
|
|
51
|
+
}
|
|
52
|
+
}, null, 2));
|
|
53
|
+
}
|
|
54
|
+
else if (client === 'cursor') {
|
|
55
|
+
console.log('# Cursor\n');
|
|
56
|
+
console.log('Add to .cursor/mcp.json in your project root:\n');
|
|
57
|
+
console.log(JSON.stringify({
|
|
58
|
+
mcpServers: {
|
|
59
|
+
'prelude-context': serverConfig
|
|
60
|
+
}
|
|
61
|
+
}, null, 2));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// Generic MCP config
|
|
65
|
+
console.log('# MCP Server Configuration\n');
|
|
66
|
+
console.log(JSON.stringify({
|
|
67
|
+
'prelude-context': serverConfig
|
|
68
|
+
}, null, 2));
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../src/commands/mcp-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAO/B,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,QA4B5C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
2
|
+
import { createPreludeServer } from '../mcp/server.js';
|
|
3
|
+
import { CONTEXT_DIR } from '../constants.js';
|
|
4
|
+
import { fileExists } from '../utils/fs.js';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
export function registerServeCommand(cli) {
|
|
7
|
+
cli
|
|
8
|
+
.command('serve', 'Start Prelude as an MCP server (stdio transport)')
|
|
9
|
+
.option('--root <path>', 'Root directory of the project (default: cwd)')
|
|
10
|
+
.action(async (options) => {
|
|
11
|
+
const rootDir = options.root || process.cwd();
|
|
12
|
+
// Validate .context/ exists
|
|
13
|
+
const externalRoot = process.env.PRELUDE_ROOT;
|
|
14
|
+
const contextDir = externalRoot
|
|
15
|
+
? join(externalRoot, rootDir.split('/').pop())
|
|
16
|
+
: join(rootDir, CONTEXT_DIR);
|
|
17
|
+
if (!(await fileExists(contextDir))) {
|
|
18
|
+
// Write to stderr since stdout is the MCP transport
|
|
19
|
+
process.stderr.write('Error: .context/ directory not found. Run `prelude init` first.\n');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
const server = createPreludeServer(rootDir);
|
|
23
|
+
const transport = new StdioServerTransport();
|
|
24
|
+
await server.connect(transport);
|
|
25
|
+
// Log to stderr (stdout is MCP transport)
|
|
26
|
+
process.stderr.write(`Prelude MCP server started for: ${rootDir}\n`);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/serve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,UAAU,oBAAoB,CAAC,GAAQ;IAC3C,GAAG;SACA,OAAO,CAAC,OAAO,EAAE,kDAAkD,CAAC;SACpE,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAE9C,4BAA4B;QAC5B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAC9C,MAAM,UAAU,GAAG,YAAY;YAC7B,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAY,CAAC;YACxD,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAE/B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACpC,oDAAoD;YACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mEAAmE,CACpE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,0CAA0C;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,OAAO,IAAI,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/src/constants.d.ts
CHANGED
|
@@ -12,5 +12,5 @@ export declare const CONTEXT_FILES: {
|
|
|
12
12
|
readonly WATCHLOG: ".watchlog.json";
|
|
13
13
|
};
|
|
14
14
|
export declare const WATCH_PATTERNS: readonly ["package.json", "package-lock.json", "pnpm-lock.yaml", "yarn.lock", "bun.lockb", "tsconfig.json", "tailwind.config.js", "tailwind.config.ts", ".eslintrc.json", ".eslintrc.js", "eslint.config.js", ".prettierrc", ".prettierrc.json", "prettier.config.js", "src/**/*", "lib/**/*", "app/**/*", "pages/**/*", "components/**/*", "requirements.txt", "pyproject.toml", "Cargo.toml", "go.mod"];
|
|
15
|
-
export declare const IGNORE_PATTERNS: readonly ["**/node_modules/**", "**/.git/**", "**/dist/**", "**/build/**", "**/.next/**", "**/.context/**", "**/*.test.*", "**/*.spec.*"];
|
|
15
|
+
export declare const IGNORE_PATTERNS: readonly ["**/node_modules/**", "**/.git/**", "**/dist/**", "**/build/**", "**/.next/**", "**/.context/**", "**/*.test.*", "**/*.spec.*", "**/__pycache__/**", "**/*.egg-info/**", "**/.venv/**", "**/venv/**", "**/.mypy_cache/**", "**/.ruff_cache/**", "**/.pytest_cache/**"];
|
|
16
16
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,aAAa,CAAC;AAEtC,eAAO,MAAM,aAAa;;;;;;;;;;;CAWhB,CAAC;AAEX,eAAO,MAAM,cAAc,2YAwBjB,CAAC;AAEX,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,aAAa,CAAC;AAEtC,eAAO,MAAM,aAAa;;;;;;;;;;;CAWhB,CAAC;AAEX,eAAO,MAAM,cAAc,2YAwBjB,CAAC;AAEX,eAAO,MAAM,eAAe,kRAgBlB,CAAC"}
|
package/dist/src/constants.js
CHANGED
|
@@ -44,6 +44,13 @@ export const IGNORE_PATTERNS = [
|
|
|
44
44
|
'**/.next/**',
|
|
45
45
|
'**/.context/**',
|
|
46
46
|
'**/*.test.*',
|
|
47
|
-
'**/*.spec.*'
|
|
47
|
+
'**/*.spec.*',
|
|
48
|
+
'**/__pycache__/**',
|
|
49
|
+
'**/*.egg-info/**',
|
|
50
|
+
'**/.venv/**',
|
|
51
|
+
'**/venv/**',
|
|
52
|
+
'**/.mypy_cache/**',
|
|
53
|
+
'**/.ruff_cache/**',
|
|
54
|
+
'**/.pytest_cache/**'
|
|
48
55
|
];
|
|
49
56
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,YAAY;IACnB,YAAY,EAAE,mBAAmB;IACjC,WAAW,EAAE,kBAAkB;IAC/B,SAAS,EAAE,gBAAgB;IAC3B,OAAO,EAAE,cAAc;IACvB,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,gBAAgB;CAClB,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc;IACd,mBAAmB;IACnB,gBAAgB;IAChB,WAAW;IACX,WAAW;IACX,eAAe;IACf,oBAAoB;IACpB,oBAAoB;IACpB,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,oBAAoB;IACpB,UAAU;IACV,UAAU;IACV,UAAU;IACV,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,gBAAgB;IAChB,YAAY;IACZ,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,oBAAoB;IACpB,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,aAAa;IACb,aAAa;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,YAAY;IACnB,YAAY,EAAE,mBAAmB;IACjC,WAAW,EAAE,kBAAkB;IAC/B,SAAS,EAAE,gBAAgB;IAC3B,OAAO,EAAE,cAAc;IACvB,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,WAAW;IACtB,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,gBAAgB;CAClB,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc;IACd,mBAAmB;IACnB,gBAAgB;IAChB,WAAW;IACX,WAAW;IACX,eAAe;IACf,oBAAoB;IACpB,oBAAoB;IACpB,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,oBAAoB;IACpB,UAAU;IACV,UAAU;IACV,UAAU;IACV,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,gBAAgB;IAChB,YAAY;IACZ,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,oBAAoB;IACpB,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,aAAa;IACb,aAAa;IACb,mBAAmB;IACnB,kBAAkB;IAClB,aAAa;IACb,YAAY;IACZ,mBAAmB;IACnB,mBAAmB;IACnB,qBAAqB;CACb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"infer.d.ts","sourceRoot":"","sources":["../../../src/core/infer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"infer.d.ts","sourceRoot":"","sources":["../../../src/core/infer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAwPpF,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiG5E;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAwchE;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAwS9E;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAyP5E"}
|