prelude-context 1.0.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 (94) hide show
  1. package/README.md +354 -0
  2. package/dist/bin/prelude.d.ts +3 -0
  3. package/dist/bin/prelude.d.ts.map +1 -0
  4. package/dist/bin/prelude.js +35 -0
  5. package/dist/bin/prelude.js.map +1 -0
  6. package/dist/src/commands/decision.d.ts +3 -0
  7. package/dist/src/commands/decision.d.ts.map +1 -0
  8. package/dist/src/commands/decision.js +74 -0
  9. package/dist/src/commands/decision.js.map +1 -0
  10. package/dist/src/commands/export.d.ts +3 -0
  11. package/dist/src/commands/export.d.ts.map +1 -0
  12. package/dist/src/commands/export.js +132 -0
  13. package/dist/src/commands/export.js.map +1 -0
  14. package/dist/src/commands/init.d.ts +3 -0
  15. package/dist/src/commands/init.d.ts.map +1 -0
  16. package/dist/src/commands/init.js +80 -0
  17. package/dist/src/commands/init.js.map +1 -0
  18. package/dist/src/commands/share.d.ts +3 -0
  19. package/dist/src/commands/share.d.ts.map +1 -0
  20. package/dist/src/commands/share.js +133 -0
  21. package/dist/src/commands/share.js.map +1 -0
  22. package/dist/src/commands/watch.d.ts +3 -0
  23. package/dist/src/commands/watch.d.ts.map +1 -0
  24. package/dist/src/commands/watch.js +58 -0
  25. package/dist/src/commands/watch.js.map +1 -0
  26. package/dist/src/constants.d.ts +16 -0
  27. package/dist/src/constants.d.ts.map +1 -0
  28. package/dist/src/constants.js +49 -0
  29. package/dist/src/constants.js.map +1 -0
  30. package/dist/src/core/exporter.d.ts +4 -0
  31. package/dist/src/core/exporter.d.ts.map +1 -0
  32. package/dist/src/core/exporter.js +196 -0
  33. package/dist/src/core/exporter.js.map +1 -0
  34. package/dist/src/core/infer.d.ts +6 -0
  35. package/dist/src/core/infer.d.ts.map +1 -0
  36. package/dist/src/core/infer.js +900 -0
  37. package/dist/src/core/infer.js.map +1 -0
  38. package/dist/src/core/updater.d.ts +8 -0
  39. package/dist/src/core/updater.d.ts.map +1 -0
  40. package/dist/src/core/updater.js +120 -0
  41. package/dist/src/core/updater.js.map +1 -0
  42. package/dist/src/core/watcher.d.ts +15 -0
  43. package/dist/src/core/watcher.d.ts.map +1 -0
  44. package/dist/src/core/watcher.js +119 -0
  45. package/dist/src/core/watcher.js.map +1 -0
  46. package/dist/src/schema/architecture.d.ts +75 -0
  47. package/dist/src/schema/architecture.d.ts.map +1 -0
  48. package/dist/src/schema/architecture.js +24 -0
  49. package/dist/src/schema/architecture.js.map +1 -0
  50. package/dist/src/schema/constraints.d.ts +146 -0
  51. package/dist/src/schema/constraints.d.ts.map +1 -0
  52. package/dist/src/schema/constraints.js +39 -0
  53. package/dist/src/schema/constraints.js.map +1 -0
  54. package/dist/src/schema/decisions.d.ts +122 -0
  55. package/dist/src/schema/decisions.d.ts.map +1 -0
  56. package/dist/src/schema/decisions.js +23 -0
  57. package/dist/src/schema/decisions.js.map +1 -0
  58. package/dist/src/schema/index.d.ts +7 -0
  59. package/dist/src/schema/index.d.ts.map +1 -0
  60. package/dist/src/schema/index.js +7 -0
  61. package/dist/src/schema/index.js.map +1 -0
  62. package/dist/src/schema/project.d.ts +69 -0
  63. package/dist/src/schema/project.d.ts.map +1 -0
  64. package/dist/src/schema/project.js +24 -0
  65. package/dist/src/schema/project.js.map +1 -0
  66. package/dist/src/schema/session.d.ts +210 -0
  67. package/dist/src/schema/session.d.ts.map +1 -0
  68. package/dist/src/schema/session.js +26 -0
  69. package/dist/src/schema/session.js.map +1 -0
  70. package/dist/src/schema/stack.d.ts +58 -0
  71. package/dist/src/schema/stack.d.ts.map +1 -0
  72. package/dist/src/schema/stack.js +23 -0
  73. package/dist/src/schema/stack.js.map +1 -0
  74. package/dist/src/utils/fs.d.ts +10 -0
  75. package/dist/src/utils/fs.d.ts.map +1 -0
  76. package/dist/src/utils/fs.js +63 -0
  77. package/dist/src/utils/fs.js.map +1 -0
  78. package/dist/src/utils/log.d.ts +20 -0
  79. package/dist/src/utils/log.d.ts.map +1 -0
  80. package/dist/src/utils/log.js +45 -0
  81. package/dist/src/utils/log.js.map +1 -0
  82. package/dist/src/utils/time.d.ts +5 -0
  83. package/dist/src/utils/time.d.ts.map +1 -0
  84. package/dist/src/utils/time.js +33 -0
  85. package/dist/src/utils/time.js.map +1 -0
  86. package/package.json +64 -0
  87. package/schemas/architecture.schema.json +98 -0
  88. package/schemas/constraints.schema.json +161 -0
  89. package/schemas/decisions.schema.json +95 -0
  90. package/schemas/export.schema.json +46 -0
  91. package/schemas/project.schema.json +102 -0
  92. package/schemas/session.schema.json +101 -0
  93. package/schemas/stack.schema.json +103 -0
  94. package/spec.md +717 -0
@@ -0,0 +1,80 @@
1
+ import { join } from 'path';
2
+ import { ensureDir, writeJSON, writeMarkdown, fileExists } from '../utils/fs.js';
3
+ import { logger, spinner } from '../utils/log.js';
4
+ import { CONTEXT_DIR, CONTEXT_FILES } from '../constants.js';
5
+ import { inferProjectMetadata, inferStack, inferArchitecture, inferConstraints } from '../core/infer.js';
6
+ export function registerInitCommand(cli) {
7
+ cli
8
+ .command('init [dir]', 'Initialize .context/ directory with inferred metadata')
9
+ .option('--force', 'Overwrite existing .context/ directory')
10
+ .action(async (dir = process.cwd(), options) => {
11
+ const rootDir = dir;
12
+ const contextDir = join(rootDir, CONTEXT_DIR);
13
+ logger.init('Initializing Prelude context...');
14
+ // Check if .context already exists
15
+ if (await fileExists(contextDir) && !options.force) {
16
+ logger.error('.context/ directory already exists. Use --force to overwrite.');
17
+ process.exit(1);
18
+ }
19
+ // Create .context directory
20
+ const spin = spinner('Creating .context/ directory...');
21
+ await ensureDir(contextDir);
22
+ spin.stop('✓ Created .context/ directory');
23
+ // Infer and write project metadata
24
+ const projectSpin = spinner('Analyzing project metadata...');
25
+ try {
26
+ const project = await inferProjectMetadata(rootDir);
27
+ await writeJSON(join(contextDir, CONTEXT_FILES.PROJECT), project);
28
+ projectSpin.stop('✓ Generated project.json');
29
+ }
30
+ catch (error) {
31
+ projectSpin.stop();
32
+ logger.error(`Failed to generate project.json: ${error}`);
33
+ }
34
+ // Infer and write stack
35
+ const stackSpin = spinner('Detecting technology stack...');
36
+ try {
37
+ const stack = await inferStack(rootDir);
38
+ await writeJSON(join(contextDir, CONTEXT_FILES.STACK), stack);
39
+ stackSpin.stop('✓ Generated stack.json');
40
+ }
41
+ catch (error) {
42
+ stackSpin.stop();
43
+ logger.error(`Failed to generate stack.json: ${error}`);
44
+ }
45
+ // Infer and write architecture
46
+ const archSpin = spinner('Mapping architecture...');
47
+ try {
48
+ const architecture = await inferArchitecture(rootDir);
49
+ await writeJSON(join(contextDir, CONTEXT_FILES.ARCHITECTURE), architecture);
50
+ archSpin.stop('✓ Generated architecture.json');
51
+ }
52
+ catch (error) {
53
+ archSpin.stop();
54
+ logger.error(`Failed to generate architecture.json: ${error}`);
55
+ }
56
+ // Infer and write constraints
57
+ const constraintsSpin = spinner('Inferring constraints...');
58
+ try {
59
+ const constraints = await inferConstraints(rootDir);
60
+ await writeJSON(join(contextDir, CONTEXT_FILES.CONSTRAINTS), constraints);
61
+ constraintsSpin.stop('✓ Generated constraints.json');
62
+ }
63
+ catch (error) {
64
+ constraintsSpin.stop();
65
+ logger.error(`Failed to generate constraints.json: ${error}`);
66
+ }
67
+ // Create empty decisions.json
68
+ await writeJSON(join(contextDir, CONTEXT_FILES.DECISIONS), { decisions: [] });
69
+ logger.success('✓ Created decisions.json');
70
+ // Create empty changelog.md
71
+ await writeMarkdown(join(contextDir, CONTEXT_FILES.CHANGELOG), '# Changelog\n\n');
72
+ logger.success('✓ Created changelog.md');
73
+ logger.success('🎉 Prelude context initialized successfully!');
74
+ logger.info('\nNext steps:');
75
+ logger.info(' • Run `prelude export` to generate LLM-optimized context');
76
+ logger.info(' • Run `prelude watch` to track changes');
77
+ logger.info(' • Run `prelude decision "Title"` to log a decision');
78
+ });
79
+ }
80
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
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 registerShareCommand(cli: CAC): void;
3
+ //# sourceMappingURL=share.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../../src/commands/share.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAyE/B,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,QAuE5C"}
@@ -0,0 +1,133 @@
1
+ import { join } from 'path';
2
+ import { readFile } from 'fs/promises';
3
+ import { spawn, execSync } from 'child_process';
4
+ import { platform } from 'os';
5
+ import { fileExists } from '../utils/fs.js';
6
+ import { logger, spinner } from '../utils/log.js';
7
+ import { CONTEXT_DIR, CONTEXT_FILES } from '../constants.js';
8
+ // Check if a command exists
9
+ function commandExists(command) {
10
+ try {
11
+ execSync(`which ${command}`, { stdio: 'ignore' });
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ // Native clipboard using shell commands (no dependencies!)
19
+ async function copyToClipboard(text) {
20
+ return new Promise((resolve) => {
21
+ try {
22
+ const os = platform();
23
+ let command;
24
+ let args = [];
25
+ if (os === 'darwin') {
26
+ command = 'pbcopy';
27
+ }
28
+ else if (os === 'linux') {
29
+ // Check which clipboard tool is available
30
+ if (commandExists('xclip')) {
31
+ command = 'xclip';
32
+ args = ['-selection', 'clipboard'];
33
+ }
34
+ else if (commandExists('xsel')) {
35
+ command = 'xsel';
36
+ args = ['--clipboard', '--input'];
37
+ }
38
+ else {
39
+ resolve(false);
40
+ return;
41
+ }
42
+ }
43
+ else if (os === 'win32') {
44
+ command = 'clip.exe';
45
+ }
46
+ else {
47
+ resolve(false);
48
+ return;
49
+ }
50
+ const proc = spawn(command, args);
51
+ let errorOccurred = false;
52
+ proc.on('error', () => {
53
+ errorOccurred = true;
54
+ resolve(false);
55
+ });
56
+ // For clipboard commands, if stdin closes without error, assume success
57
+ proc.stdin.on('finish', () => {
58
+ if (!errorOccurred) {
59
+ // Give it a tiny moment to process, then assume success
60
+ setTimeout(() => resolve(true), 100);
61
+ }
62
+ });
63
+ proc.stdin.write(text);
64
+ proc.stdin.end();
65
+ }
66
+ catch {
67
+ resolve(false);
68
+ }
69
+ });
70
+ }
71
+ export function registerShareCommand(cli) {
72
+ cli
73
+ .command('share [dir]', 'Quick copy context to clipboard (with preview)')
74
+ .option('--format <format>', 'Output format (md or json)', { default: 'md' })
75
+ .action(async (dir = process.cwd(), options) => {
76
+ const rootDir = dir;
77
+ const contextDir = join(rootDir, CONTEXT_DIR);
78
+ // Check if .context exists
79
+ if (!(await fileExists(contextDir))) {
80
+ logger.error('.context/ directory not found. Run `prelude init` first.');
81
+ process.exit(1);
82
+ }
83
+ // Determine which file to read
84
+ const format = options.format === 'json' ? 'json' : 'md';
85
+ const filename = format === 'json' ? CONTEXT_FILES.EXPORT_JSON : CONTEXT_FILES.EXPORT_MD;
86
+ const exportPath = join(contextDir, filename);
87
+ // Check if export exists, if not generate it
88
+ if (!(await fileExists(exportPath))) {
89
+ logger.info('Generating export...');
90
+ const { saveExport } = await import('../core/exporter.js');
91
+ await saveExport(rootDir, format);
92
+ }
93
+ try {
94
+ const content = await readFile(exportPath, 'utf-8');
95
+ // Copy to clipboard
96
+ const spin = spinner('Copying to clipboard...');
97
+ const copied = await copyToClipboard(content);
98
+ spin.stop();
99
+ if (copied) {
100
+ logger.success('✓ Context copied to clipboard!');
101
+ logger.info('📋 Ready to paste into your AI chat\n');
102
+ // Show preview
103
+ const lines = content.split('\n');
104
+ const preview = lines.slice(0, 5).join('\n');
105
+ console.log('Preview:');
106
+ console.log('─'.repeat(50));
107
+ console.log(preview);
108
+ if (lines.length > 5) {
109
+ console.log('...');
110
+ }
111
+ console.log('─'.repeat(50));
112
+ console.log(`\n${lines.length} lines | ${content.length} characters`);
113
+ }
114
+ else {
115
+ const os = platform();
116
+ logger.warn('⚠ Clipboard tool not found');
117
+ if (os === 'linux') {
118
+ logger.info('\nInstall xclip or xsel:');
119
+ logger.info(' sudo apt install xclip');
120
+ logger.info(' # or');
121
+ logger.info(' sudo apt install xsel');
122
+ }
123
+ logger.info('\nManual copy:');
124
+ logger.info(` cat ${exportPath}`);
125
+ }
126
+ }
127
+ catch (error) {
128
+ logger.error(`Failed to read export: ${error}`);
129
+ process.exit(1);
130
+ }
131
+ });
132
+ }
133
+ //# sourceMappingURL=share.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share.js","sourceRoot":"","sources":["../../../src/commands/share.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CAC } from 'cac';
2
+ export declare function registerWatchCommand(cli: CAC): void;
3
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAO/B,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,QA8D5C"}
@@ -0,0 +1,58 @@
1
+ import { join } from 'path';
2
+ import { fileExists } from '../utils/fs.js';
3
+ import { logger } from '../utils/log.js';
4
+ import { CONTEXT_DIR } from '../constants.js';
5
+ import { createWatcher, watchOnce } from '../core/watcher.js';
6
+ export function registerWatchCommand(cli) {
7
+ cli
8
+ .command('watch [dir]', 'Watch for changes and update context')
9
+ .option('--once', 'Update once and exit')
10
+ .option('--verbose', 'Show detailed logging')
11
+ .action(async (dir = process.cwd(), options) => {
12
+ const rootDir = dir;
13
+ const contextDir = join(rootDir, CONTEXT_DIR);
14
+ // Check if .context exists
15
+ if (!(await fileExists(contextDir))) {
16
+ logger.error('.context/ directory not found. Run `prelude init` first.');
17
+ process.exit(1);
18
+ }
19
+ if (options.once) {
20
+ logger.watch('Watching for changes (will exit after first update)...');
21
+ await watchOnce(rootDir);
22
+ logger.success('✓ Context updated');
23
+ process.exit(0);
24
+ }
25
+ logger.watch('Watching for changes... (press Ctrl+C to stop)');
26
+ logger.info('Monitoring: package.json, tsconfig.json, src/, lib/, app/\n');
27
+ const watcher = createWatcher(rootDir, (files, events) => {
28
+ logger.info(`\n📝 Detected ${files.length} change(s):`);
29
+ if (options.verbose) {
30
+ events.forEach(event => {
31
+ logger.debug(` ${event.type} → ${event.path}`);
32
+ if (event.contextUpdated.length > 0) {
33
+ logger.debug(` Updated: ${event.contextUpdated.join(', ')}`);
34
+ }
35
+ });
36
+ }
37
+ // Get unique list of updated context files
38
+ const updatedFiles = new Set();
39
+ events.forEach(event => {
40
+ event.contextUpdated.forEach(file => updatedFiles.add(file));
41
+ });
42
+ if (updatedFiles.size > 0) {
43
+ logger.success(`✓ Updated: ${Array.from(updatedFiles).join(', ')}`);
44
+ }
45
+ else {
46
+ logger.info('No context updates needed');
47
+ }
48
+ }, { verbose: options.verbose });
49
+ // Handle graceful shutdown
50
+ process.on('SIGINT', async () => {
51
+ logger.info('\n\nStopping watcher...');
52
+ await watcher.close();
53
+ logger.success('✓ Watcher stopped');
54
+ process.exit(0);
55
+ });
56
+ });
57
+ }
58
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/commands/watch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,UAAU,oBAAoB,CAAC,GAAQ;IAC3C,GAAG;SACA,OAAO,CAAC,aAAa,EAAE,sCAAsC,CAAC;SAC9D,MAAM,CAAC,QAAQ,EAAE,sBAAsB,CAAC;SACxC,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE,EAAE,OAA8C,EAAE,EAAE;QAC5F,MAAM,OAAO,GAAG,GAAG,CAAC;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAE9C,2BAA2B;QAC3B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACvE,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAE3E,MAAM,OAAO,GAAG,aAAa,CAC3B,OAAO,EACP,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAChB,MAAM,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,MAAM,aAAa,CAAC,CAAC;YAExD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBACrB,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;oBAChD,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACpC,MAAM,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAClE,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAED,2CAA2C;YAC3C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;YACvC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACrB,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YAEH,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,OAAO,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,EACD,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAC7B,CAAC;QAEF,2BAA2B;QAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAC9B,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACvC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,16 @@
1
+ export declare const CONTEXT_DIR = ".context";
2
+ export declare const CONTEXT_FILES: {
3
+ readonly PROJECT: "project.json";
4
+ readonly STACK: "stack.json";
5
+ readonly ARCHITECTURE: "architecture.json";
6
+ readonly CONSTRAINTS: "constraints.json";
7
+ readonly DECISIONS: "decisions.json";
8
+ readonly SESSION: "session.json";
9
+ readonly CHANGELOG: "changelog.md";
10
+ readonly EXPORT_MD: "export.md";
11
+ readonly EXPORT_JSON: "export.json";
12
+ readonly WATCHLOG: ".watchlog.json";
13
+ };
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.*"];
16
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +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,2IASlB,CAAC"}
@@ -0,0 +1,49 @@
1
+ export const CONTEXT_DIR = '.context';
2
+ export const CONTEXT_FILES = {
3
+ PROJECT: 'project.json',
4
+ STACK: 'stack.json',
5
+ ARCHITECTURE: 'architecture.json',
6
+ CONSTRAINTS: 'constraints.json',
7
+ DECISIONS: 'decisions.json',
8
+ SESSION: 'session.json',
9
+ CHANGELOG: 'changelog.md',
10
+ EXPORT_MD: 'export.md',
11
+ EXPORT_JSON: 'export.json',
12
+ WATCHLOG: '.watchlog.json'
13
+ };
14
+ export const WATCH_PATTERNS = [
15
+ 'package.json',
16
+ 'package-lock.json',
17
+ 'pnpm-lock.yaml',
18
+ 'yarn.lock',
19
+ 'bun.lockb',
20
+ 'tsconfig.json',
21
+ 'tailwind.config.js',
22
+ 'tailwind.config.ts',
23
+ '.eslintrc.json',
24
+ '.eslintrc.js',
25
+ 'eslint.config.js',
26
+ '.prettierrc',
27
+ '.prettierrc.json',
28
+ 'prettier.config.js',
29
+ 'src/**/*',
30
+ 'lib/**/*',
31
+ 'app/**/*',
32
+ 'pages/**/*',
33
+ 'components/**/*',
34
+ 'requirements.txt',
35
+ 'pyproject.toml',
36
+ 'Cargo.toml',
37
+ 'go.mod'
38
+ ];
39
+ export const IGNORE_PATTERNS = [
40
+ '**/node_modules/**',
41
+ '**/.git/**',
42
+ '**/dist/**',
43
+ '**/build/**',
44
+ '**/.next/**',
45
+ '**/.context/**',
46
+ '**/*.test.*',
47
+ '**/*.spec.*'
48
+ ];
49
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +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;CACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function exportToMarkdown(rootDir: string): Promise<string>;
2
+ export declare function exportToJSON(rootDir: string): Promise<object>;
3
+ export declare function saveExport(rootDir: string, format?: 'md' | 'json'): Promise<string>;
4
+ //# sourceMappingURL=exporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../../src/core/exporter.ts"],"names":[],"mappings":"AAKA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwKvE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBnE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,IAAI,GAAG,MAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAc/F"}
@@ -0,0 +1,196 @@
1
+ import { join } from 'path';
2
+ import { readJSON, writeMarkdown, writeJSON, fileExists } from '../utils/fs.js';
3
+ import { CONTEXT_DIR, CONTEXT_FILES } from '../constants.js';
4
+ export async function exportToMarkdown(rootDir) {
5
+ const contextDir = join(rootDir, CONTEXT_DIR);
6
+ let markdown = '# Project Context\n\n';
7
+ markdown += '> Generated by Prelude\n\n';
8
+ markdown += '---\n\n';
9
+ // Project metadata
10
+ const projectPath = join(contextDir, CONTEXT_FILES.PROJECT);
11
+ if (await fileExists(projectPath)) {
12
+ const project = await readJSON(projectPath);
13
+ markdown += '## 📋 Project Overview\n\n';
14
+ markdown += `**Name:** ${project.name}\n\n`;
15
+ markdown += `**Description:** ${project.description}\n\n`;
16
+ if (project.version)
17
+ markdown += `**Version:** ${project.version}\n\n`;
18
+ if (project.repository)
19
+ markdown += `**Repository:** ${project.repository}\n\n`;
20
+ if (project.license)
21
+ markdown += `**License:** ${project.license}\n\n`;
22
+ if (project.goals && project.goals.length > 0) {
23
+ markdown += '**Goals:**\n';
24
+ project.goals.forEach(goal => {
25
+ markdown += `- ${goal}\n`;
26
+ });
27
+ markdown += '\n';
28
+ }
29
+ markdown += '---\n\n';
30
+ }
31
+ // Stack information
32
+ const stackPath = join(contextDir, CONTEXT_FILES.STACK);
33
+ if (await fileExists(stackPath)) {
34
+ const stack = await readJSON(stackPath);
35
+ markdown += '## 🔧 Technology Stack\n\n';
36
+ markdown += `**Language:** ${stack.language}\n\n`;
37
+ if (stack.runtime)
38
+ markdown += `**Runtime:** ${stack.runtime}\n\n`;
39
+ if (stack.packageManager)
40
+ markdown += `**Package Manager:** ${stack.packageManager}\n\n`;
41
+ if (stack.frameworks && stack.frameworks.length > 0) {
42
+ markdown += '**Frameworks:**\n';
43
+ stack.frameworks.forEach(fw => {
44
+ markdown += `- ${fw}\n`;
45
+ });
46
+ markdown += '\n';
47
+ }
48
+ if (stack.testingFrameworks && stack.testingFrameworks.length > 0) {
49
+ markdown += '**Testing:**\n';
50
+ stack.testingFrameworks.forEach(tf => {
51
+ markdown += `- ${tf}\n`;
52
+ });
53
+ markdown += '\n';
54
+ }
55
+ if (stack.styling && stack.styling.length > 0) {
56
+ markdown += '**Styling:**\n';
57
+ stack.styling.forEach(s => {
58
+ markdown += `- ${s}\n`;
59
+ });
60
+ markdown += '\n';
61
+ }
62
+ if (stack.database)
63
+ markdown += `**Database:** ${stack.database}\n\n`;
64
+ if (stack.orm)
65
+ markdown += `**ORM:** ${stack.orm}\n\n`;
66
+ markdown += '---\n\n';
67
+ }
68
+ // Architecture
69
+ const archPath = join(contextDir, CONTEXT_FILES.ARCHITECTURE);
70
+ if (await fileExists(archPath)) {
71
+ const arch = await readJSON(archPath);
72
+ markdown += '## 🏗️ Architecture\n\n';
73
+ if (arch.type)
74
+ markdown += `**Type:** ${arch.type}\n\n`;
75
+ if (arch.routing)
76
+ markdown += `**Routing:** ${arch.routing}\n\n`;
77
+ if (arch.apiStyle)
78
+ markdown += `**API Style:** ${arch.apiStyle}\n\n`;
79
+ if (arch.patterns && arch.patterns.length > 0) {
80
+ markdown += '**Patterns:**\n';
81
+ arch.patterns.forEach(p => {
82
+ markdown += `- ${p}\n`;
83
+ });
84
+ markdown += '\n';
85
+ }
86
+ if (arch.directories && arch.directories.length > 0) {
87
+ markdown += '**Key Directories:**\n';
88
+ arch.directories.slice(0, 10).forEach(dir => {
89
+ markdown += `- \`${dir.path}\``;
90
+ if (dir.purpose)
91
+ markdown += ` - ${dir.purpose}`;
92
+ markdown += '\n';
93
+ });
94
+ markdown += '\n';
95
+ }
96
+ markdown += '---\n\n';
97
+ }
98
+ // Constraints
99
+ const constraintsPath = join(contextDir, CONTEXT_FILES.CONSTRAINTS);
100
+ if (await fileExists(constraintsPath)) {
101
+ const constraints = await readJSON(constraintsPath);
102
+ markdown += '## ⚠️ Constraints & Preferences\n\n';
103
+ if (constraints.mustUse && constraints.mustUse.length > 0) {
104
+ markdown += '**Must Use:**\n';
105
+ constraints.mustUse.forEach(item => {
106
+ markdown += `- ${item}\n`;
107
+ });
108
+ markdown += '\n';
109
+ }
110
+ if (constraints.mustNotUse && constraints.mustNotUse.length > 0) {
111
+ markdown += '**Must Not Use:**\n';
112
+ constraints.mustNotUse.forEach(item => {
113
+ markdown += `- ${item}\n`;
114
+ });
115
+ markdown += '\n';
116
+ }
117
+ if (constraints.codeStyle) {
118
+ markdown += '**Code Style:**\n';
119
+ if (constraints.codeStyle.formatter)
120
+ markdown += `- Formatter: ${constraints.codeStyle.formatter}\n`;
121
+ if (constraints.codeStyle.linter)
122
+ markdown += `- Linter: ${constraints.codeStyle.linter}\n`;
123
+ markdown += '\n';
124
+ }
125
+ if (constraints.testing) {
126
+ markdown += '**Testing Requirements:**\n';
127
+ markdown += `- Required: ${constraints.testing.required ? 'Yes' : 'No'}\n`;
128
+ if (constraints.testing.strategy)
129
+ markdown += `- Strategy: ${constraints.testing.strategy}\n`;
130
+ markdown += '\n';
131
+ }
132
+ markdown += '---\n\n';
133
+ }
134
+ // Decisions
135
+ const decisionsPath = join(contextDir, CONTEXT_FILES.DECISIONS);
136
+ if (await fileExists(decisionsPath)) {
137
+ const decisions = await readJSON(decisionsPath);
138
+ if (decisions.decisions && decisions.decisions.length > 0) {
139
+ markdown += '## 🧠 Key Decisions\n\n';
140
+ // Show most recent 5 decisions
141
+ const recentDecisions = decisions.decisions.slice(-5).reverse();
142
+ recentDecisions.forEach(decision => {
143
+ markdown += `### ${decision.title}\n\n`;
144
+ markdown += `**Status:** ${decision.status}\n\n`;
145
+ markdown += `**Rationale:** ${decision.rationale}\n\n`;
146
+ if (decision.alternatives && decision.alternatives.length > 0) {
147
+ markdown += '**Alternatives Considered:**\n';
148
+ decision.alternatives.forEach(alt => {
149
+ markdown += `- ${alt}\n`;
150
+ });
151
+ markdown += '\n';
152
+ }
153
+ if (decision.impact)
154
+ markdown += `**Impact:** ${decision.impact}\n\n`;
155
+ markdown += '---\n\n';
156
+ });
157
+ }
158
+ }
159
+ markdown += '\n*End of context export*\n';
160
+ return markdown;
161
+ }
162
+ export async function exportToJSON(rootDir) {
163
+ const contextDir = join(rootDir, CONTEXT_DIR);
164
+ const exportData = {};
165
+ // Read all context files
166
+ const files = [
167
+ { key: 'project', file: CONTEXT_FILES.PROJECT },
168
+ { key: 'stack', file: CONTEXT_FILES.STACK },
169
+ { key: 'architecture', file: CONTEXT_FILES.ARCHITECTURE },
170
+ { key: 'constraints', file: CONTEXT_FILES.CONSTRAINTS },
171
+ { key: 'decisions', file: CONTEXT_FILES.DECISIONS }
172
+ ];
173
+ for (const { key, file } of files) {
174
+ const filePath = join(contextDir, file);
175
+ if (await fileExists(filePath)) {
176
+ exportData[key] = await readJSON(filePath);
177
+ }
178
+ }
179
+ return exportData;
180
+ }
181
+ export async function saveExport(rootDir, format = 'md') {
182
+ const contextDir = join(rootDir, CONTEXT_DIR);
183
+ if (format === 'md') {
184
+ const markdown = await exportToMarkdown(rootDir);
185
+ const exportPath = join(contextDir, CONTEXT_FILES.EXPORT_MD);
186
+ await writeMarkdown(exportPath, markdown);
187
+ return exportPath;
188
+ }
189
+ else {
190
+ const json = await exportToJSON(rootDir);
191
+ const exportPath = join(contextDir, CONTEXT_FILES.EXPORT_JSON);
192
+ await writeJSON(exportPath, json);
193
+ return exportPath;
194
+ }
195
+ }
196
+ //# sourceMappingURL=exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../../src/core/exporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Project, Stack, Architecture, Constraints } from '../schema/index.js';
2
+ export declare function inferProjectMetadata(rootDir: string): Promise<Project>;
3
+ export declare function inferStack(rootDir: string): Promise<Stack>;
4
+ export declare function inferArchitecture(rootDir: string): Promise<Architecture>;
5
+ export declare function inferConstraints(rootDir: string): Promise<Constraints>;
6
+ //# sourceMappingURL=infer.d.ts.map
@@ -0,0 +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;AAmHpF,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyD5E;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAsShE;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAsK9E;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAkL5E"}