prelude-context 1.5.0 → 1.7.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 +63 -4
- package/dist/bin/prelude.js +2 -0
- package/dist/bin/prelude.js.map +1 -1
- package/dist/src/commands/export.d.ts.map +1 -1
- package/dist/src/commands/export.js +5 -3
- package/dist/src/commands/export.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +151 -0
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/validate.d.ts +3 -0
- package/dist/src/commands/validate.d.ts.map +1 -0
- package/dist/src/commands/validate.js +203 -0
- package/dist/src/commands/validate.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 +11 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/core/claude-md-parser.d.ts +33 -0
- package/dist/src/core/claude-md-parser.d.ts.map +1 -0
- package/dist/src/core/claude-md-parser.js +410 -0
- package/dist/src/core/claude-md-parser.js.map +1 -0
- package/dist/src/core/exporter.d.ts +2 -1
- package/dist/src/core/exporter.d.ts.map +1 -1
- package/dist/src/core/exporter.js +159 -1
- package/dist/src/core/exporter.js.map +1 -1
- package/dist/src/core/infer.d.ts.map +1 -1
- package/dist/src/core/infer.js +936 -52
- 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 +152 -8
- package/dist/src/core/source-scanner.js.map +1 -1
- 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/utils/fs.d.ts.map +1 -1
- package/dist/src/utils/fs.js +4 -1
- package/dist/src/utils/fs.js.map +1 -1
- package/package.json +11 -10
- package/schemas/stack.schema.json +1 -1
package/README.md
CHANGED
|
@@ -111,12 +111,44 @@ Analyzes your codebase and creates a `.context/` directory with:
|
|
|
111
111
|
|
|
112
112
|
All files follow the [Prelude specification](https://github.com/adjective-rob/prelude/blob/main/spec.md) and include JSON Schema validation.
|
|
113
113
|
|
|
114
|
+
**Bootstrap from an existing CLAUDE.md:**
|
|
115
|
+
```bash
|
|
116
|
+
prelude init --from-claude-md # Uses ./CLAUDE.md
|
|
117
|
+
prelude init --from-claude-md docs/AI.md # Custom path
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Prelude parses your CLAUDE.md to extract project info, stack details, architecture, and constraints — then merges that with inference results. Your manual context gets preserved and structured.
|
|
121
|
+
|
|
114
122
|
### `prelude export`
|
|
115
123
|
Generates a markdown document optimized for LLMs:
|
|
116
124
|
- Combines all context into a single, focused document
|
|
117
125
|
- Automatically copied to clipboard
|
|
118
126
|
- Perfect for starting new AI conversations
|
|
119
127
|
|
|
128
|
+
**Export formats:**
|
|
129
|
+
```bash
|
|
130
|
+
prelude export # Default markdown export
|
|
131
|
+
prelude export --format claude-md # Generate a CLAUDE.md file
|
|
132
|
+
prelude export --format cursorrules # Generate a .cursorrules file
|
|
133
|
+
prelude export --format json # Structured JSON export
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The `claude-md` format generates a clean CLAUDE.md from your `.context/` data — Prelude becomes the source of truth that outputs to whatever format your AI tool expects.
|
|
137
|
+
|
|
138
|
+
### `prelude validate`
|
|
139
|
+
Validates all `.context/` files against their JSON schemas:
|
|
140
|
+
```bash
|
|
141
|
+
prelude validate
|
|
142
|
+
# project.json — valid
|
|
143
|
+
# stack.json — valid
|
|
144
|
+
# architecture.json — valid
|
|
145
|
+
# constraints.json — valid
|
|
146
|
+
# decisions.json — valid
|
|
147
|
+
# All 5 file(s) passed validation.
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Useful for CI pipelines to catch schema drift after manual edits. Exits with code 1 if any file fails.
|
|
151
|
+
|
|
120
152
|
### `prelude update`
|
|
121
153
|
Re-analyzes your codebase and intelligently updates context:
|
|
122
154
|
```bash
|
|
@@ -247,6 +279,30 @@ prelude mcp-config --root /path/to/project # Specify project root
|
|
|
247
279
|
|
|
248
280
|
---
|
|
249
281
|
|
|
282
|
+
## GitHub Action
|
|
283
|
+
|
|
284
|
+
Prelude ships with a GitHub Action to automatically keep `.context/` files up to date:
|
|
285
|
+
|
|
286
|
+
```yaml
|
|
287
|
+
# .github/workflows/prelude.yml
|
|
288
|
+
name: Update Context
|
|
289
|
+
on:
|
|
290
|
+
push:
|
|
291
|
+
branches: [main]
|
|
292
|
+
paths: [package.json, pyproject.toml, Cargo.toml, go.mod, "src/**"]
|
|
293
|
+
|
|
294
|
+
jobs:
|
|
295
|
+
update:
|
|
296
|
+
runs-on: ubuntu-latest
|
|
297
|
+
steps:
|
|
298
|
+
- uses: actions/checkout@v4
|
|
299
|
+
- uses: adjective-rob/prelude@main
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
The action runs `prelude update` and opens a PR if `.context/` files changed. See [action.yml](./action.yml) for configuration options.
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
250
306
|
## Use Cases
|
|
251
307
|
|
|
252
308
|
### 🎯 Starting New Conversations
|
|
@@ -429,7 +485,7 @@ Yes! The export format is optimized for Claude, ChatGPT, Gemini, and any text-ba
|
|
|
429
485
|
Prelude's inference is smart but not perfect. Just edit the `.context/` files directly - they're human-readable JSON.
|
|
430
486
|
|
|
431
487
|
### Does this work with non-JavaScript projects?
|
|
432
|
-
Yes!
|
|
488
|
+
Yes! Prelude has full inference support for **JavaScript/TypeScript**, **Python**, **Rust**, and **Go** — including dependency parsing, framework detection, testing tools, and conventions. The format itself is language-agnostic.
|
|
433
489
|
|
|
434
490
|
---
|
|
435
491
|
|
|
@@ -438,11 +494,14 @@ Yes! While the CLI is built with Node.js, the Prelude format works with any lang
|
|
|
438
494
|
- [x] Smart context updates with manual edit preservation
|
|
439
495
|
- [x] Scoped context query engine (`prelude query`)
|
|
440
496
|
- [x] MCP server for AI tool integration (`prelude serve`)
|
|
441
|
-
- [
|
|
497
|
+
- [x] Full inference for Python (pyproject.toml, requirements.txt)
|
|
498
|
+
- [x] Full inference for Rust (Cargo.toml) and Go (go.mod)
|
|
499
|
+
- [x] CLAUDE.md / .cursorrules export (`prelude export --format claude-md`)
|
|
500
|
+
- [x] Bootstrap from CLAUDE.md (`prelude init --from-claude-md`)
|
|
501
|
+
- [x] Schema validation command (`prelude validate`)
|
|
502
|
+
- [x] GitHub Action for automated updates
|
|
442
503
|
- [ ] VS Code extension for inline context
|
|
443
|
-
- [ ] GitHub Action for automated updates
|
|
444
504
|
- [ ] Plugin system for custom inference
|
|
445
|
-
- [ ] CLI validation command
|
|
446
505
|
- [ ] Context diff tool
|
|
447
506
|
- [ ] Temporal brain layer (learned heuristics from AI tool usage)
|
|
448
507
|
|
package/dist/bin/prelude.js
CHANGED
|
@@ -28,6 +28,7 @@ import { registerQueryCommand } from '../src/commands/query.js';
|
|
|
28
28
|
import { registerCompactCommand } from '../src/commands/compact.js';
|
|
29
29
|
import { registerServeCommand } from '../src/commands/serve.js';
|
|
30
30
|
import { registerMcpConfigCommand } from '../src/commands/mcp-config.js';
|
|
31
|
+
import { registerValidateCommand } from '../src/commands/validate.js';
|
|
31
32
|
import { update } from '../src/commands/update.js';
|
|
32
33
|
// Register all commands
|
|
33
34
|
registerInitCommand(cli);
|
|
@@ -39,6 +40,7 @@ registerQueryCommand(cli);
|
|
|
39
40
|
registerCompactCommand(cli);
|
|
40
41
|
registerServeCommand(cli);
|
|
41
42
|
registerMcpConfigCommand(cli);
|
|
43
|
+
registerValidateCommand(cli);
|
|
42
44
|
// Register update command
|
|
43
45
|
cli
|
|
44
46
|
.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,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;
|
|
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,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,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;AAC9B,uBAAuB,CAAC,GAAG,CAAC,CAAC;AAE7B,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AA0E/B,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AA0E/B,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,QAkF7C"}
|
|
@@ -72,7 +72,7 @@ async function copyToClipboard(text) {
|
|
|
72
72
|
export function registerExportCommand(cli) {
|
|
73
73
|
cli
|
|
74
74
|
.command('export [dir]', 'Generate LLM-optimized export')
|
|
75
|
-
.option('--format <format>', 'Output format
|
|
75
|
+
.option('--format <format>', 'Output format: md, json, claude-md, cursorrules', { default: 'md' })
|
|
76
76
|
.option('--no-copy', 'Skip copying to clipboard')
|
|
77
77
|
.option('--print', 'Print to stdout after export')
|
|
78
78
|
.action(async (dir = process.cwd(), options) => {
|
|
@@ -87,8 +87,10 @@ export function registerExportCommand(cli) {
|
|
|
87
87
|
process.exit(1);
|
|
88
88
|
}
|
|
89
89
|
logger.export('Exporting context...');
|
|
90
|
-
const
|
|
91
|
-
const
|
|
90
|
+
const validFormats = ['md', 'json', 'claude-md', 'cursorrules'];
|
|
91
|
+
const format = validFormats.includes(options.format) ? options.format : 'md';
|
|
92
|
+
const formatLabel = format === 'claude-md' ? 'CLAUDE.md' : format === 'cursorrules' ? '.cursorrules' : format.toUpperCase();
|
|
93
|
+
const spin = spinner(`Generating ${formatLabel} export...`);
|
|
92
94
|
try {
|
|
93
95
|
const exportPath = await saveExport(rootDir, format);
|
|
94
96
|
spin.stop();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/commands/export.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/commands/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAe/B,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,QA6H3C"}
|
|
@@ -3,10 +3,12 @@ import { ensureDir, writeJSON, writeMarkdown, fileExists } from '../utils/fs.js'
|
|
|
3
3
|
import { logger, spinner } from '../utils/log.js';
|
|
4
4
|
import { CONTEXT_DIR, CONTEXT_FILES } from '../constants.js';
|
|
5
5
|
import { inferProjectMetadata, inferStack, inferArchitecture, inferConstraints } from '../core/infer.js';
|
|
6
|
+
import { parseClaudeMd } from '../core/claude-md-parser.js';
|
|
6
7
|
export function registerInitCommand(cli) {
|
|
7
8
|
cli
|
|
8
9
|
.command('init [dir]', 'Initialize .context/ directory with inferred metadata')
|
|
9
10
|
.option('--force', 'Overwrite existing .context/ directory')
|
|
11
|
+
.option('--from-claude-md [path]', 'Bootstrap from a CLAUDE.md file')
|
|
10
12
|
.action(async (dir = process.cwd(), options) => {
|
|
11
13
|
const rootDir = dir;
|
|
12
14
|
// If PRELUDE_ROOT is set, use it as base for context storage.
|
|
@@ -27,10 +29,34 @@ export function registerInitCommand(cli) {
|
|
|
27
29
|
const spin = spinner('Creating .context/ directory...');
|
|
28
30
|
await ensureDir(contextDir);
|
|
29
31
|
spin.stop('✓ Created .context/ directory');
|
|
32
|
+
// Parse CLAUDE.md if requested
|
|
33
|
+
let claudeData;
|
|
34
|
+
if (options.fromClaudeMd !== undefined) {
|
|
35
|
+
const claudeMdPath = typeof options.fromClaudeMd === 'string'
|
|
36
|
+
? join(rootDir, options.fromClaudeMd)
|
|
37
|
+
: join(rootDir, 'CLAUDE.md');
|
|
38
|
+
if (await fileExists(claudeMdPath)) {
|
|
39
|
+
const claudeSpin = spinner(`Parsing ${typeof options.fromClaudeMd === 'string' ? options.fromClaudeMd : 'CLAUDE.md'}...`);
|
|
40
|
+
try {
|
|
41
|
+
claudeData = await parseClaudeMd(claudeMdPath);
|
|
42
|
+
claudeSpin.stop('✓ Parsed CLAUDE.md');
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
claudeSpin.stop();
|
|
46
|
+
logger.error(`Failed to parse CLAUDE.md: ${error}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
logger.error(`CLAUDE.md not found at ${claudeMdPath}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
30
53
|
// Infer and write project metadata
|
|
31
54
|
const projectSpin = spinner('Analyzing project metadata...');
|
|
32
55
|
try {
|
|
33
56
|
const project = await inferProjectMetadata(rootDir);
|
|
57
|
+
if (claudeData) {
|
|
58
|
+
mergeProjectData(project, claudeData);
|
|
59
|
+
}
|
|
34
60
|
await writeJSON(join(contextDir, CONTEXT_FILES.PROJECT), project);
|
|
35
61
|
projectSpin.stop('✓ Generated project.json');
|
|
36
62
|
}
|
|
@@ -42,6 +68,9 @@ export function registerInitCommand(cli) {
|
|
|
42
68
|
const stackSpin = spinner('Detecting technology stack...');
|
|
43
69
|
try {
|
|
44
70
|
const stack = await inferStack(rootDir);
|
|
71
|
+
if (claudeData) {
|
|
72
|
+
mergeStackData(stack, claudeData);
|
|
73
|
+
}
|
|
45
74
|
await writeJSON(join(contextDir, CONTEXT_FILES.STACK), stack);
|
|
46
75
|
stackSpin.stop('✓ Generated stack.json');
|
|
47
76
|
}
|
|
@@ -53,6 +82,9 @@ export function registerInitCommand(cli) {
|
|
|
53
82
|
const archSpin = spinner('Mapping architecture...');
|
|
54
83
|
try {
|
|
55
84
|
const architecture = await inferArchitecture(rootDir);
|
|
85
|
+
if (claudeData) {
|
|
86
|
+
mergeArchitectureData(architecture, claudeData);
|
|
87
|
+
}
|
|
56
88
|
await writeJSON(join(contextDir, CONTEXT_FILES.ARCHITECTURE), architecture);
|
|
57
89
|
archSpin.stop('✓ Generated architecture.json');
|
|
58
90
|
}
|
|
@@ -64,6 +96,9 @@ export function registerInitCommand(cli) {
|
|
|
64
96
|
const constraintsSpin = spinner('Inferring constraints...');
|
|
65
97
|
try {
|
|
66
98
|
const constraints = await inferConstraints(rootDir);
|
|
99
|
+
if (claudeData) {
|
|
100
|
+
mergeConstraintsData(constraints, claudeData);
|
|
101
|
+
}
|
|
67
102
|
await writeJSON(join(contextDir, CONTEXT_FILES.CONSTRAINTS), constraints);
|
|
68
103
|
constraintsSpin.stop('✓ Generated constraints.json');
|
|
69
104
|
}
|
|
@@ -78,10 +113,126 @@ export function registerInitCommand(cli) {
|
|
|
78
113
|
await writeMarkdown(join(contextDir, CONTEXT_FILES.CHANGELOG), '# Changelog\n\n');
|
|
79
114
|
logger.success('✓ Created changelog.md');
|
|
80
115
|
logger.success('🎉 Prelude context initialized successfully!');
|
|
116
|
+
if (claudeData) {
|
|
117
|
+
logger.info(' (enriched with CLAUDE.md data)');
|
|
118
|
+
}
|
|
81
119
|
logger.info('\nNext steps:');
|
|
82
120
|
logger.info(' • Run `prelude export` to generate LLM-optimized context');
|
|
83
121
|
logger.info(' • Run `prelude watch` to track changes');
|
|
84
122
|
logger.info(' • Run `prelude decision "Title"` to log a decision');
|
|
85
123
|
});
|
|
86
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Merge CLAUDE.md data into inferred project metadata.
|
|
127
|
+
* CLAUDE.md values take priority for non-empty fields.
|
|
128
|
+
*/
|
|
129
|
+
function mergeProjectData(project, claudeData) {
|
|
130
|
+
if (claudeData.projectName) {
|
|
131
|
+
project.name = claudeData.projectName;
|
|
132
|
+
}
|
|
133
|
+
if (claudeData.description) {
|
|
134
|
+
project.description = claudeData.description;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function mergeStackData(stack, claudeData) {
|
|
138
|
+
if (!claudeData.stack)
|
|
139
|
+
return;
|
|
140
|
+
if (claudeData.stack.language) {
|
|
141
|
+
stack.language = claudeData.stack.language;
|
|
142
|
+
}
|
|
143
|
+
if (claudeData.stack.frameworks?.length) {
|
|
144
|
+
// Use CLAUDE.md frameworks if inference found none, otherwise merge
|
|
145
|
+
if (!stack.frameworks?.length) {
|
|
146
|
+
stack.frameworks = claudeData.stack.frameworks;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const existing = new Set(stack.frameworks.map(f => f.toLowerCase()));
|
|
150
|
+
for (const fw of claudeData.stack.frameworks) {
|
|
151
|
+
if (!existing.has(fw.toLowerCase())) {
|
|
152
|
+
stack.frameworks.push(fw);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (claudeData.stack.database && !stack.database) {
|
|
158
|
+
stack.database = claudeData.stack.database;
|
|
159
|
+
}
|
|
160
|
+
if (claudeData.stack.testing) {
|
|
161
|
+
if (!stack.testingFrameworks?.length) {
|
|
162
|
+
stack.testingFrameworks = [claudeData.stack.testing];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function mergeArchitectureData(architecture, claudeData) {
|
|
167
|
+
if (!claudeData.architecture)
|
|
168
|
+
return;
|
|
169
|
+
if (claudeData.architecture.type) {
|
|
170
|
+
const validTypes = ['monolith', 'monorepo', 'microservices', 'library', 'cli', 'fullstack', 'backend', 'frontend'];
|
|
171
|
+
const normalized = claudeData.architecture.type.toLowerCase();
|
|
172
|
+
if (validTypes.includes(normalized)) {
|
|
173
|
+
architecture.type = normalized;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (claudeData.architecture.patterns?.length) {
|
|
177
|
+
if (!architecture.patterns?.length) {
|
|
178
|
+
architecture.patterns = claudeData.architecture.patterns;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const existing = new Set(architecture.patterns.map(p => p.toLowerCase()));
|
|
182
|
+
for (const p of claudeData.architecture.patterns) {
|
|
183
|
+
if (!existing.has(p.toLowerCase())) {
|
|
184
|
+
architecture.patterns.push(p);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (claudeData.architecture.directories?.length) {
|
|
190
|
+
// Merge directories: CLAUDE.md directories get their purpose filled in
|
|
191
|
+
const existingPaths = new Set(architecture.directories.map(d => d.path));
|
|
192
|
+
for (const dir of claudeData.architecture.directories) {
|
|
193
|
+
const existing = architecture.directories.find(d => d.path === dir.path || d.path.endsWith('/' + dir.path) || dir.path.endsWith('/' + d.path));
|
|
194
|
+
if (existing && dir.purpose && !existing.purpose) {
|
|
195
|
+
existing.purpose = dir.purpose;
|
|
196
|
+
}
|
|
197
|
+
else if (!existingPaths.has(dir.path)) {
|
|
198
|
+
architecture.directories.push(dir);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (claudeData.conventions?.length) {
|
|
203
|
+
if (!architecture.conventions?.length) {
|
|
204
|
+
architecture.conventions = claudeData.conventions;
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
architecture.conventions = [...architecture.conventions, ...claudeData.conventions];
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (claudeData.commands?.length) {
|
|
211
|
+
// Store commands as entry points if none detected
|
|
212
|
+
if (!architecture.entryPoints?.length) {
|
|
213
|
+
architecture.entryPoints = claudeData.commands
|
|
214
|
+
.filter(c => c.description)
|
|
215
|
+
.slice(0, 10)
|
|
216
|
+
.map(c => ({ file: c.name, purpose: c.description }));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function mergeConstraintsData(constraints, claudeData) {
|
|
221
|
+
if (claudeData.constraints?.mustUse?.length) {
|
|
222
|
+
if (!constraints.mustUse?.length) {
|
|
223
|
+
constraints.mustUse = claudeData.constraints.mustUse;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
constraints.mustUse = [...constraints.mustUse, ...claudeData.constraints.mustUse];
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (claudeData.constraints?.mustNotUse?.length) {
|
|
230
|
+
if (!constraints.mustNotUse?.length) {
|
|
231
|
+
constraints.mustNotUse = claudeData.constraints.mustNotUse;
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
constraints.mustNotUse = [...constraints.mustNotUse, ...claudeData.constraints.mustNotUse];
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
87
238
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EACL,oBAAoB,EACpB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAmJ/B,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,GAAG,QA2F/C"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { join, dirname } from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { readJSON, fileExists } from '../utils/fs.js';
|
|
4
|
+
import { logger } from '../utils/log.js';
|
|
5
|
+
import { CONTEXT_DIR, CONTEXT_FILES } from '../constants.js';
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = dirname(__filename);
|
|
8
|
+
// Map context files to their schema files
|
|
9
|
+
const FILE_SCHEMA_MAP = {
|
|
10
|
+
[CONTEXT_FILES.PROJECT]: 'project.schema.json',
|
|
11
|
+
[CONTEXT_FILES.STACK]: 'stack.schema.json',
|
|
12
|
+
[CONTEXT_FILES.ARCHITECTURE]: 'architecture.schema.json',
|
|
13
|
+
[CONTEXT_FILES.CONSTRAINTS]: 'constraints.schema.json',
|
|
14
|
+
[CONTEXT_FILES.DECISIONS]: 'decisions.schema.json',
|
|
15
|
+
};
|
|
16
|
+
// Simple JSON Schema validator — no external dependencies
|
|
17
|
+
function validateValue(value, schema, path) {
|
|
18
|
+
const errors = [];
|
|
19
|
+
if (schema.type) {
|
|
20
|
+
const schemaType = schema.type;
|
|
21
|
+
if (schemaType === 'object') {
|
|
22
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
23
|
+
errors.push({ path, message: `Expected object, got ${Array.isArray(value) ? 'array' : typeof value}` });
|
|
24
|
+
return errors;
|
|
25
|
+
}
|
|
26
|
+
const obj = value;
|
|
27
|
+
// Check required fields
|
|
28
|
+
if (Array.isArray(schema.required)) {
|
|
29
|
+
for (const field of schema.required) {
|
|
30
|
+
if (!(field in obj)) {
|
|
31
|
+
errors.push({ path: path ? `${path}.${field}` : field, message: 'Required field missing' });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Validate each property against its schema
|
|
36
|
+
const properties = schema.properties;
|
|
37
|
+
if (properties) {
|
|
38
|
+
for (const [key, propSchema] of Object.entries(properties)) {
|
|
39
|
+
if (key in obj) {
|
|
40
|
+
errors.push(...validateValue(obj[key], propSchema, path ? `${path}.${key}` : key));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Validate additionalProperties when it's a schema (e.g., { "additionalProperties": { "type": "string" } })
|
|
45
|
+
const additionalProps = schema.additionalProperties;
|
|
46
|
+
if (additionalProps && typeof additionalProps === 'object') {
|
|
47
|
+
const knownKeys = properties ? Object.keys(properties) : [];
|
|
48
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
49
|
+
if (!knownKeys.includes(key)) {
|
|
50
|
+
errors.push(...validateValue(val, additionalProps, path ? `${path}.${key}` : key));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else if (schemaType === 'array') {
|
|
56
|
+
if (!Array.isArray(value)) {
|
|
57
|
+
errors.push({ path, message: `Expected array, got ${typeof value}` });
|
|
58
|
+
return errors;
|
|
59
|
+
}
|
|
60
|
+
// Validate items
|
|
61
|
+
const itemSchema = schema.items;
|
|
62
|
+
if (itemSchema) {
|
|
63
|
+
for (let i = 0; i < value.length; i++) {
|
|
64
|
+
errors.push(...validateValue(value[i], itemSchema, `${path}[${i}]`));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (schemaType === 'string') {
|
|
69
|
+
if (typeof value !== 'string') {
|
|
70
|
+
errors.push({ path, message: `Expected string, got ${typeof value}` });
|
|
71
|
+
return errors;
|
|
72
|
+
}
|
|
73
|
+
// Check enum
|
|
74
|
+
if (Array.isArray(schema.enum)) {
|
|
75
|
+
if (!schema.enum.includes(value)) {
|
|
76
|
+
errors.push({ path, message: `Value "${value}" not in enum [${schema.enum.join(', ')}]` });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Check minLength
|
|
80
|
+
if (typeof schema.minLength === 'number' && value.length < schema.minLength) {
|
|
81
|
+
errors.push({ path, message: `String length ${value.length} is less than minimum ${schema.minLength}` });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else if (schemaType === 'number' || schemaType === 'integer') {
|
|
85
|
+
if (typeof value !== 'number') {
|
|
86
|
+
errors.push({ path, message: `Expected ${schemaType}, got ${typeof value}` });
|
|
87
|
+
return errors;
|
|
88
|
+
}
|
|
89
|
+
if (schemaType === 'integer' && !Number.isInteger(value)) {
|
|
90
|
+
errors.push({ path, message: `Expected integer, got float` });
|
|
91
|
+
}
|
|
92
|
+
if (typeof schema.minimum === 'number' && value < schema.minimum) {
|
|
93
|
+
errors.push({ path, message: `Value ${value} is less than minimum ${schema.minimum}` });
|
|
94
|
+
}
|
|
95
|
+
if (typeof schema.maximum === 'number' && value > schema.maximum) {
|
|
96
|
+
errors.push({ path, message: `Value ${value} is greater than maximum ${schema.maximum}` });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (schemaType === 'boolean') {
|
|
100
|
+
if (typeof value !== 'boolean') {
|
|
101
|
+
errors.push({ path, message: `Expected boolean, got ${typeof value}` });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return errors;
|
|
106
|
+
}
|
|
107
|
+
function validateAgainstSchema(data, schema) {
|
|
108
|
+
return validateValue(data, schema, '');
|
|
109
|
+
}
|
|
110
|
+
// Resolve schemas dir — works from both src/ (dev via tsx) and dist/ (built)
|
|
111
|
+
// Dev: src/commands/validate.ts → __dirname = .../src/commands → ../../schemas
|
|
112
|
+
// Built: dist/src/commands/validate.js → __dirname = .../dist/src/commands → ../../../schemas
|
|
113
|
+
async function getSchemasDir() {
|
|
114
|
+
const devPath = join(__dirname, '..', '..', 'schemas');
|
|
115
|
+
if (await fileExists(devPath))
|
|
116
|
+
return devPath;
|
|
117
|
+
return join(__dirname, '..', '..', '..', 'schemas');
|
|
118
|
+
}
|
|
119
|
+
export function registerValidateCommand(cli) {
|
|
120
|
+
cli
|
|
121
|
+
.command('validate [dir]', 'Validate .context/ files against JSON schemas')
|
|
122
|
+
.action(async (dir = process.cwd()) => {
|
|
123
|
+
const rootDir = dir;
|
|
124
|
+
const externalRoot = process.env.PRELUDE_ROOT;
|
|
125
|
+
const contextDir = externalRoot
|
|
126
|
+
? join(externalRoot, rootDir.split('/').pop())
|
|
127
|
+
: join(rootDir, CONTEXT_DIR);
|
|
128
|
+
// Check if .context exists
|
|
129
|
+
if (!(await fileExists(contextDir))) {
|
|
130
|
+
logger.error('.context/ directory not found. Run `prelude init` first.');
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
const schemasDir = await getSchemasDir();
|
|
134
|
+
let totalFiles = 0;
|
|
135
|
+
let passedFiles = 0;
|
|
136
|
+
let failedFiles = 0;
|
|
137
|
+
let skippedFiles = 0;
|
|
138
|
+
for (const [contextFile, schemaFile] of Object.entries(FILE_SCHEMA_MAP)) {
|
|
139
|
+
const filePath = join(contextDir, contextFile);
|
|
140
|
+
const schemaPath = join(schemasDir, schemaFile);
|
|
141
|
+
// Skip files that don't exist
|
|
142
|
+
if (!(await fileExists(filePath))) {
|
|
143
|
+
skippedFiles++;
|
|
144
|
+
logger.warn(`Skipped ${contextFile} (file not found)`);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
totalFiles++;
|
|
148
|
+
// Load schema
|
|
149
|
+
let schema;
|
|
150
|
+
try {
|
|
151
|
+
schema = await readJSON(schemaPath);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
failedFiles++;
|
|
155
|
+
logger.error(`Failed to load schema: ${schemaFile}`);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
// Load and parse context file
|
|
159
|
+
let data;
|
|
160
|
+
try {
|
|
161
|
+
data = await readJSON(filePath);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
failedFiles++;
|
|
165
|
+
logger.error(`${contextFile}: Invalid JSON — ${error}`);
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
// Validate
|
|
169
|
+
const errors = validateAgainstSchema(data, schema);
|
|
170
|
+
if (errors.length === 0) {
|
|
171
|
+
passedFiles++;
|
|
172
|
+
logger.success(`${contextFile} — valid`);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
failedFiles++;
|
|
176
|
+
logger.error(`${contextFile} — ${errors.length} error(s):`);
|
|
177
|
+
for (const err of errors) {
|
|
178
|
+
logger.info(` ${err.path || '(root)'}: ${err.message}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Summary
|
|
183
|
+
console.log();
|
|
184
|
+
if (failedFiles === 0 && totalFiles > 0) {
|
|
185
|
+
logger.success(`All ${totalFiles} file(s) passed validation.`);
|
|
186
|
+
if (skippedFiles > 0) {
|
|
187
|
+
logger.info(`${skippedFiles} file(s) skipped (not found).`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else if (totalFiles === 0) {
|
|
191
|
+
logger.warn('No .context/ files found to validate.');
|
|
192
|
+
process.exit(1);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
logger.error(`${failedFiles} of ${totalFiles} file(s) failed validation.`);
|
|
196
|
+
if (skippedFiles > 0) {
|
|
197
|
+
logger.info(`${skippedFiles} file(s) skipped (not found).`);
|
|
198
|
+
}
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|