prelude-context 1.6.0 → 1.8.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 (40) 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/update.js +70 -8
  11. package/dist/src/commands/update.js.map +1 -1
  12. package/dist/src/commands/validate.d.ts +3 -0
  13. package/dist/src/commands/validate.d.ts.map +1 -0
  14. package/dist/src/commands/validate.js +203 -0
  15. package/dist/src/commands/validate.js.map +1 -0
  16. package/dist/src/constants.d.ts +1 -1
  17. package/dist/src/constants.d.ts.map +1 -1
  18. package/dist/src/constants.js +4 -1
  19. package/dist/src/constants.js.map +1 -1
  20. package/dist/src/core/claude-md-parser.d.ts +33 -0
  21. package/dist/src/core/claude-md-parser.d.ts.map +1 -0
  22. package/dist/src/core/claude-md-parser.js +410 -0
  23. package/dist/src/core/claude-md-parser.js.map +1 -0
  24. package/dist/src/core/exporter.d.ts +2 -1
  25. package/dist/src/core/exporter.d.ts.map +1 -1
  26. package/dist/src/core/exporter.js +159 -1
  27. package/dist/src/core/exporter.js.map +1 -1
  28. package/dist/src/core/infer.d.ts.map +1 -1
  29. package/dist/src/core/infer.js +403 -21
  30. package/dist/src/core/infer.js.map +1 -1
  31. package/dist/src/core/merger.d.ts.map +1 -1
  32. package/dist/src/core/merger.js +76 -9
  33. package/dist/src/core/merger.js.map +1 -1
  34. package/dist/src/core/source-scanner.d.ts.map +1 -1
  35. package/dist/src/core/source-scanner.js +58 -1
  36. package/dist/src/core/source-scanner.js.map +1 -1
  37. package/dist/src/utils/fs.d.ts.map +1 -1
  38. package/dist/src/utils/fs.js +2 -1
  39. package/dist/src/utils/fs.js.map +1 -1
  40. package/package.json +1 -1
@@ -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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"}
@@ -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.*", "**/__pycache__/**", "**/*.egg-info/**", "**/.venv/**", "**/venv/**", "**/.mypy_cache/**", "**/.ruff_cache/**", "**/.pytest_cache/**"];
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/**", "**/target/debug/**", "**/target/release/**", "**/vendor/**"];
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,kRAgBlB,CAAC"}
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,gVAmBlB,CAAC"}
@@ -51,6 +51,9 @@ export const IGNORE_PATTERNS = [
51
51
  '**/venv/**',
52
52
  '**/.mypy_cache/**',
53
53
  '**/.ruff_cache/**',
54
- '**/.pytest_cache/**'
54
+ '**/.pytest_cache/**',
55
+ '**/target/debug/**',
56
+ '**/target/release/**',
57
+ '**/vendor/**'
55
58
  ];
56
59
  //# 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;IACb,mBAAmB;IACnB,kBAAkB;IAClB,aAAa;IACb,YAAY;IACZ,mBAAmB;IACnB,mBAAmB;IACnB,qBAAqB;CACb,CAAC"}
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;IACrB,oBAAoB;IACpB,sBAAsB;IACtB,cAAc;CACN,CAAC"}
@@ -0,0 +1,33 @@
1
+ export interface ClaudeMdData {
2
+ projectName?: string;
3
+ description?: string;
4
+ commands?: {
5
+ name: string;
6
+ description: string;
7
+ }[];
8
+ architecture?: {
9
+ type?: string;
10
+ patterns?: string[];
11
+ directories?: {
12
+ path: string;
13
+ purpose?: string;
14
+ }[];
15
+ };
16
+ constraints?: {
17
+ mustUse?: string[];
18
+ mustNotUse?: string[];
19
+ };
20
+ conventions?: string[];
21
+ stack?: {
22
+ language?: string;
23
+ frameworks?: string[];
24
+ database?: string;
25
+ testing?: string;
26
+ };
27
+ }
28
+ /**
29
+ * Parse a CLAUDE.md file and extract structured data.
30
+ * Best-effort — never throws on malformed input.
31
+ */
32
+ export declare function parseClaudeMd(filePath: string): Promise<ClaudeMdData>;
33
+ //# sourceMappingURL=claude-md-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md-parser.d.ts","sourceRoot":"","sources":["../../../src/core/claude-md-parser.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnD,YAAY,CAAC,EAAE;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,WAAW,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACpD,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAQD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA8F3E"}