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.
Files changed (39) hide show
  1. package/README.md +63 -4
  2. package/dist/bin/prelude.js +2 -0
  3. package/dist/bin/prelude.js.map +1 -1
  4. package/dist/src/commands/export.d.ts.map +1 -1
  5. package/dist/src/commands/export.js +5 -3
  6. package/dist/src/commands/export.js.map +1 -1
  7. package/dist/src/commands/init.d.ts.map +1 -1
  8. package/dist/src/commands/init.js +151 -0
  9. package/dist/src/commands/init.js.map +1 -1
  10. package/dist/src/commands/validate.d.ts +3 -0
  11. package/dist/src/commands/validate.d.ts.map +1 -0
  12. package/dist/src/commands/validate.js +203 -0
  13. package/dist/src/commands/validate.js.map +1 -0
  14. package/dist/src/constants.d.ts +1 -1
  15. package/dist/src/constants.d.ts.map +1 -1
  16. package/dist/src/constants.js +11 -1
  17. package/dist/src/constants.js.map +1 -1
  18. package/dist/src/core/claude-md-parser.d.ts +33 -0
  19. package/dist/src/core/claude-md-parser.d.ts.map +1 -0
  20. package/dist/src/core/claude-md-parser.js +410 -0
  21. package/dist/src/core/claude-md-parser.js.map +1 -0
  22. package/dist/src/core/exporter.d.ts +2 -1
  23. package/dist/src/core/exporter.d.ts.map +1 -1
  24. package/dist/src/core/exporter.js +159 -1
  25. package/dist/src/core/exporter.js.map +1 -1
  26. package/dist/src/core/infer.d.ts.map +1 -1
  27. package/dist/src/core/infer.js +936 -52
  28. package/dist/src/core/infer.js.map +1 -1
  29. package/dist/src/core/source-scanner.d.ts.map +1 -1
  30. package/dist/src/core/source-scanner.js +152 -8
  31. package/dist/src/core/source-scanner.js.map +1 -1
  32. package/dist/src/schema/stack.d.ts +3 -3
  33. package/dist/src/schema/stack.js +1 -1
  34. package/dist/src/schema/stack.js.map +1 -1
  35. package/dist/src/utils/fs.d.ts.map +1 -1
  36. package/dist/src/utils/fs.js +4 -1
  37. package/dist/src/utils/fs.js.map +1 -1
  38. package/package.json +11 -10
  39. 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! While the CLI is built with Node.js, the Prelude format works with any language. The inference currently focuses on JavaScript/TypeScript but the format is universal.
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
- - [ ] Improved inference for Python, Rust, Go
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
 
@@ -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')
@@ -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;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"}
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,QAgF7C"}
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 (md or json)', { default: 'md' })
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 format = options.format === 'json' ? 'json' : 'md';
91
- const spin = spinner(`Generating ${format.toUpperCase()} export...`);
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;AAY/B,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,QAwF3C"}
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":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CAC } from 'cac';
2
+ export declare function registerValidateCommand(cli: CAC): void;
3
+ //# sourceMappingURL=validate.d.ts.map
@@ -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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"}