logicstamp-context 0.1.1 → 0.2.1

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 (159) hide show
  1. package/LLM_CONTEXT.md +4 -3
  2. package/README.md +116 -19
  3. package/dist/cli/commands/compare.d.ts.map +1 -1
  4. package/dist/cli/commands/compare.js +17 -8
  5. package/dist/cli/commands/compare.js.map +1 -1
  6. package/dist/cli/commands/context/bundleFormatter.d.ts +20 -0
  7. package/dist/cli/commands/context/bundleFormatter.d.ts.map +1 -0
  8. package/dist/cli/commands/context/bundleFormatter.js +55 -0
  9. package/dist/cli/commands/context/bundleFormatter.js.map +1 -0
  10. package/dist/cli/commands/context/configManager.d.ts +23 -0
  11. package/dist/cli/commands/context/configManager.d.ts.map +1 -0
  12. package/dist/cli/commands/context/configManager.js +69 -0
  13. package/dist/cli/commands/context/configManager.js.map +1 -0
  14. package/dist/cli/commands/context/contractBuilder.d.ts +18 -0
  15. package/dist/cli/commands/context/contractBuilder.d.ts.map +1 -0
  16. package/dist/cli/commands/context/contractBuilder.js +72 -0
  17. package/dist/cli/commands/context/contractBuilder.js.map +1 -0
  18. package/dist/cli/commands/context/fileWriter.d.ts +38 -0
  19. package/dist/cli/commands/context/fileWriter.d.ts.map +1 -0
  20. package/dist/cli/commands/context/fileWriter.js +170 -0
  21. package/dist/cli/commands/context/fileWriter.js.map +1 -0
  22. package/dist/cli/commands/context/statsCalculator.d.ts +44 -0
  23. package/dist/cli/commands/context/statsCalculator.d.ts.map +1 -0
  24. package/dist/cli/commands/context/statsCalculator.js +150 -0
  25. package/dist/cli/commands/context/statsCalculator.js.map +1 -0
  26. package/dist/cli/commands/context/tokenEstimator.d.ts +76 -0
  27. package/dist/cli/commands/context/tokenEstimator.d.ts.map +1 -0
  28. package/dist/cli/commands/context/tokenEstimator.js +258 -0
  29. package/dist/cli/commands/context/tokenEstimator.js.map +1 -0
  30. package/dist/cli/commands/context.d.ts +1 -0
  31. package/dist/cli/commands/context.d.ts.map +1 -1
  32. package/dist/cli/commands/context.js +72 -399
  33. package/dist/cli/commands/context.js.map +1 -1
  34. package/dist/cli/commands/style.d.ts +11 -0
  35. package/dist/cli/commands/style.d.ts.map +1 -0
  36. package/dist/cli/commands/style.js +15 -0
  37. package/dist/cli/commands/style.js.map +1 -0
  38. package/dist/cli/handlers/cleanHandler.d.ts +5 -0
  39. package/dist/cli/handlers/cleanHandler.d.ts.map +1 -0
  40. package/dist/cli/handlers/cleanHandler.js +28 -0
  41. package/dist/cli/handlers/cleanHandler.js.map +1 -0
  42. package/dist/cli/handlers/compareHandler.d.ts +5 -0
  43. package/dist/cli/handlers/compareHandler.d.ts.map +1 -0
  44. package/dist/cli/handlers/compareHandler.js +332 -0
  45. package/dist/cli/handlers/compareHandler.js.map +1 -0
  46. package/dist/cli/handlers/contextHandler.d.ts +5 -0
  47. package/dist/cli/handlers/contextHandler.d.ts.map +1 -0
  48. package/dist/cli/handlers/contextHandler.js +24 -0
  49. package/dist/cli/handlers/contextHandler.js.map +1 -0
  50. package/dist/cli/handlers/initHandler.d.ts +6 -0
  51. package/dist/cli/handlers/initHandler.d.ts.map +1 -0
  52. package/dist/cli/handlers/initHandler.js +30 -0
  53. package/dist/cli/handlers/initHandler.js.map +1 -0
  54. package/dist/cli/handlers/styleHandler.d.ts +5 -0
  55. package/dist/cli/handlers/styleHandler.d.ts.map +1 -0
  56. package/dist/cli/handlers/styleHandler.js +30 -0
  57. package/dist/cli/handlers/styleHandler.js.map +1 -0
  58. package/dist/cli/handlers/validateHandler.d.ts +5 -0
  59. package/dist/cli/handlers/validateHandler.d.ts.map +1 -0
  60. package/dist/cli/handlers/validateHandler.js +23 -0
  61. package/dist/cli/handlers/validateHandler.js.map +1 -0
  62. package/dist/cli/parser/argumentParser.d.ts +44 -0
  63. package/dist/cli/parser/argumentParser.d.ts.map +1 -0
  64. package/dist/cli/parser/argumentParser.js +194 -0
  65. package/dist/cli/parser/argumentParser.js.map +1 -0
  66. package/dist/cli/parser/helpText.d.ts +11 -0
  67. package/dist/cli/parser/helpText.d.ts.map +1 -0
  68. package/dist/cli/parser/helpText.js +373 -0
  69. package/dist/cli/parser/helpText.js.map +1 -0
  70. package/dist/cli/stamp.js +14 -821
  71. package/dist/cli/stamp.js.map +1 -1
  72. package/dist/core/astParser/detectors.d.ts +24 -0
  73. package/dist/core/astParser/detectors.d.ts.map +1 -0
  74. package/dist/core/astParser/detectors.js +102 -0
  75. package/dist/core/astParser/detectors.js.map +1 -0
  76. package/dist/core/astParser/extractors/componentExtractor.d.ts +13 -0
  77. package/dist/core/astParser/extractors/componentExtractor.d.ts.map +1 -0
  78. package/dist/core/astParser/extractors/componentExtractor.js +41 -0
  79. package/dist/core/astParser/extractors/componentExtractor.js.map +1 -0
  80. package/dist/core/astParser/extractors/eventExtractor.d.ts +14 -0
  81. package/dist/core/astParser/extractors/eventExtractor.d.ts.map +1 -0
  82. package/dist/core/astParser/extractors/eventExtractor.js +49 -0
  83. package/dist/core/astParser/extractors/eventExtractor.js.map +1 -0
  84. package/dist/core/astParser/extractors/propExtractor.d.ts +14 -0
  85. package/dist/core/astParser/extractors/propExtractor.d.ts.map +1 -0
  86. package/dist/core/astParser/extractors/propExtractor.js +73 -0
  87. package/dist/core/astParser/extractors/propExtractor.js.map +1 -0
  88. package/dist/core/astParser/extractors/stateExtractor.d.ts +13 -0
  89. package/dist/core/astParser/extractors/stateExtractor.d.ts.map +1 -0
  90. package/dist/core/astParser/extractors/stateExtractor.js +66 -0
  91. package/dist/core/astParser/extractors/stateExtractor.js.map +1 -0
  92. package/dist/core/astParser.d.ts.map +1 -1
  93. package/dist/core/astParser.js +5 -307
  94. package/dist/core/astParser.js.map +1 -1
  95. package/dist/core/contractBuilder.d.ts +1 -0
  96. package/dist/core/contractBuilder.d.ts.map +1 -1
  97. package/dist/core/contractBuilder.js +1 -0
  98. package/dist/core/contractBuilder.js.map +1 -1
  99. package/dist/core/pack/builder.d.ts +35 -0
  100. package/dist/core/pack/builder.d.ts.map +1 -0
  101. package/dist/core/pack/builder.js +76 -0
  102. package/dist/core/pack/builder.js.map +1 -0
  103. package/dist/core/pack/collector.d.ts +20 -0
  104. package/dist/core/pack/collector.d.ts.map +1 -0
  105. package/dist/core/pack/collector.js +71 -0
  106. package/dist/core/pack/collector.js.map +1 -0
  107. package/dist/core/pack/loader.d.ts +23 -0
  108. package/dist/core/pack/loader.d.ts.map +1 -0
  109. package/dist/core/pack/loader.js +66 -0
  110. package/dist/core/pack/loader.js.map +1 -0
  111. package/dist/core/pack/resolver.d.ts +21 -0
  112. package/dist/core/pack/resolver.d.ts.map +1 -0
  113. package/dist/core/pack/resolver.js +79 -0
  114. package/dist/core/pack/resolver.js.map +1 -0
  115. package/dist/core/pack.d.ts +17 -27
  116. package/dist/core/pack.d.ts.map +1 -1
  117. package/dist/core/pack.js +18 -225
  118. package/dist/core/pack.js.map +1 -1
  119. package/dist/core/styleExtractor/index.d.ts +11 -0
  120. package/dist/core/styleExtractor/index.d.ts.map +1 -0
  121. package/dist/core/styleExtractor/index.js +11 -0
  122. package/dist/core/styleExtractor/index.js.map +1 -0
  123. package/dist/core/styleExtractor/layout.d.ts +14 -0
  124. package/dist/core/styleExtractor/layout.d.ts.map +1 -0
  125. package/dist/core/styleExtractor/layout.js +86 -0
  126. package/dist/core/styleExtractor/layout.js.map +1 -0
  127. package/dist/core/styleExtractor/motion.d.ts +20 -0
  128. package/dist/core/styleExtractor/motion.d.ts.map +1 -0
  129. package/dist/core/styleExtractor/motion.js +74 -0
  130. package/dist/core/styleExtractor/motion.js.map +1 -0
  131. package/dist/core/styleExtractor/scss.d.ts +30 -0
  132. package/dist/core/styleExtractor/scss.d.ts.map +1 -0
  133. package/dist/core/styleExtractor/scss.js +80 -0
  134. package/dist/core/styleExtractor/scss.js.map +1 -0
  135. package/dist/core/styleExtractor/styleExtractor.d.ts +11 -0
  136. package/dist/core/styleExtractor/styleExtractor.d.ts.map +1 -0
  137. package/dist/core/styleExtractor/styleExtractor.js +115 -0
  138. package/dist/core/styleExtractor/styleExtractor.js.map +1 -0
  139. package/dist/core/styleExtractor/styled.d.ts +13 -0
  140. package/dist/core/styleExtractor/styled.d.ts.map +1 -0
  141. package/dist/core/styleExtractor/styled.js +31 -0
  142. package/dist/core/styleExtractor/styled.js.map +1 -0
  143. package/dist/core/styleExtractor/tailwind.d.ts +16 -0
  144. package/dist/core/styleExtractor/tailwind.d.ts.map +1 -0
  145. package/dist/core/styleExtractor/tailwind.js +85 -0
  146. package/dist/core/styleExtractor/tailwind.js.map +1 -0
  147. package/dist/core/styleExtractor.d.ts +8 -0
  148. package/dist/core/styleExtractor.d.ts.map +1 -0
  149. package/dist/core/styleExtractor.js +8 -0
  150. package/dist/core/styleExtractor.js.map +1 -0
  151. package/dist/types/UIFContract.d.ts +71 -0
  152. package/dist/types/UIFContract.d.ts.map +1 -1
  153. package/dist/types/UIFContract.js.map +1 -1
  154. package/dist/utils/tokens.d.ts +18 -10
  155. package/dist/utils/tokens.d.ts.map +1 -1
  156. package/dist/utils/tokens.js +100 -10
  157. package/dist/utils/tokens.js.map +1 -1
  158. package/package.json +5 -1
  159. package/schema/logicstamp.context.schema.json +288 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanHandler.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/cleanHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB/D"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Handler for clean command
3
+ */
4
+ import { cleanCommand } from '../commands/clean.js';
5
+ import { parseCleanArgs } from '../parser/argumentParser.js';
6
+ import { getCleanHelp } from '../parser/helpText.js';
7
+ import { printFoxIcon } from './initHandler.js';
8
+ export async function handleClean(args) {
9
+ if (args.includes('--help') || args.includes('-h')) {
10
+ printFoxIcon();
11
+ console.log(getCleanHelp());
12
+ process.exit(0);
13
+ }
14
+ // Explicitly reject --compare-modes (only available in stamp context, not stamp context clean)
15
+ if (args.includes('--compare-modes')) {
16
+ console.error('❌ --compare-modes is not available for "stamp context clean". Use "stamp context --compare-modes" instead.');
17
+ process.exit(1);
18
+ }
19
+ const options = parseCleanArgs(args);
20
+ try {
21
+ await cleanCommand(options);
22
+ }
23
+ catch (error) {
24
+ console.error('❌ Clean failed:', error.message);
25
+ process.exit(1);
26
+ }
27
+ }
28
+ //# sourceMappingURL=cleanHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanHandler.js","sourceRoot":"","sources":["../../../src/cli/handlers/cleanHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAqB,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+FAA+F;IAC/F,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,4GAA4G,CAAC,CAAC;QAC5H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Handler for compare command
3
+ */
4
+ export declare function handleCompare(args: string[]): Promise<void>;
5
+ //# sourceMappingURL=compareHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compareHandler.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/compareHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwCH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCjE"}
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Handler for compare command
3
+ */
4
+ import { contextCommand } from '../commands/context.js';
5
+ import { compareCommand, multiFileCompare, displayMultiFileCompareResult, cleanOrphanedFiles, } from '../commands/compare.js';
6
+ import { parseCompareArgs } from '../parser/argumentParser.js';
7
+ import { getCompareHelp } from '../parser/helpText.js';
8
+ import { printFoxIcon } from './initHandler.js';
9
+ /**
10
+ * Prompt user for Y/N input (only in TTY mode)
11
+ */
12
+ async function promptYesNo(question) {
13
+ const { createInterface } = await import('node:readline');
14
+ const readline = createInterface({
15
+ input: process.stdin,
16
+ output: process.stdout,
17
+ });
18
+ return new Promise((resolve) => {
19
+ readline.question(question, (answer) => {
20
+ readline.close();
21
+ resolve(answer.toLowerCase() === 'y');
22
+ });
23
+ });
24
+ }
25
+ /**
26
+ * Check if running in interactive TTY
27
+ */
28
+ function isTTY() {
29
+ return process.stdout.isTTY === true && process.stdin.isTTY === true;
30
+ }
31
+ export async function handleCompare(args) {
32
+ if (args[0] === '--help' || args[0] === '-h') {
33
+ printFoxIcon();
34
+ console.log(getCompareHelp());
35
+ process.exit(0);
36
+ }
37
+ // Explicitly reject --compare-modes (only available in stamp context, not stamp context compare)
38
+ if (args.includes('--compare-modes')) {
39
+ console.error('❌ --compare-modes is not available for "stamp context compare". Use "stamp context --compare-modes" instead.');
40
+ process.exit(1);
41
+ }
42
+ const { stats, approve, cleanOrphaned, quiet, skipGitignore, positionalArgs } = parseCompareArgs(args);
43
+ // Auto-mode: no files specified - use multi-file comparison with context_main.json
44
+ if (positionalArgs.length === 0) {
45
+ await handleAutoCompareMode({ stats, approve, cleanOrphaned, quiet, skipGitignore });
46
+ return;
47
+ }
48
+ // Manual mode: explicit files provided
49
+ if (positionalArgs.length < 2) {
50
+ printFoxIcon();
51
+ console.log(getCompareHelp());
52
+ process.exit(1);
53
+ }
54
+ const oldFile = positionalArgs[0];
55
+ const newFile = positionalArgs[1];
56
+ // Detect if we're comparing context_main.json files (multi-file mode)
57
+ const isMultiFileMode = oldFile.endsWith('context_main.json') || newFile.endsWith('context_main.json');
58
+ if (isMultiFileMode) {
59
+ await handleMultiFileCompareMode({ oldFile, newFile, stats, approve, cleanOrphaned, quiet });
60
+ }
61
+ else {
62
+ await handleSingleFileCompareMode({ oldFile, newFile, stats, approve, quiet });
63
+ }
64
+ }
65
+ async function handleAutoCompareMode(options) {
66
+ const { stats, approve, cleanOrphaned, quiet, skipGitignore } = options;
67
+ const { tmpdir } = await import('node:os');
68
+ const { join, dirname } = await import('node:path');
69
+ const { copyFile, rm, mkdir } = await import('node:fs/promises');
70
+ const { existsSync } = await import('node:fs');
71
+ // Check if context_main.json exists
72
+ if (!existsSync('context_main.json')) {
73
+ console.error('❌ context_main.json not found. Run "stamp context" first to generate context files.');
74
+ process.exit(1);
75
+ }
76
+ if (!quiet) {
77
+ console.log('Auto-compare mode');
78
+ }
79
+ // Create temp directory for new context generation
80
+ const tempDir = join(tmpdir(), `context-compare-${Date.now()}`);
81
+ await mkdir(tempDir, { recursive: true });
82
+ if (!quiet) {
83
+ console.log('🔄 Generating fresh context...');
84
+ }
85
+ // Generate fresh context to temp directory
86
+ const contextOptions = {
87
+ depth: 1,
88
+ includeCode: 'header',
89
+ format: 'json',
90
+ out: tempDir,
91
+ hashLock: false,
92
+ strict: false,
93
+ allowMissing: true,
94
+ maxNodes: 100,
95
+ profile: 'llm-chat',
96
+ predictBehavior: false,
97
+ dryRun: false,
98
+ stats: false,
99
+ strictMissing: false,
100
+ compareModes: false,
101
+ skipGitignore,
102
+ quiet,
103
+ suppressSuccessIndicator: true, // Suppress ✓ when called internally from compare
104
+ };
105
+ try {
106
+ await contextCommand(contextOptions);
107
+ // Multi-file compare using context_main.json indices
108
+ if (!quiet) {
109
+ console.log('🔍 Comparing all context files...\n');
110
+ }
111
+ const multiCompareOptions = {
112
+ oldIndexFile: 'context_main.json',
113
+ newIndexFile: join(tempDir, 'context_main.json'),
114
+ stats,
115
+ approve,
116
+ autoCleanOrphaned: cleanOrphaned,
117
+ quiet,
118
+ };
119
+ const result = await multiFileCompare(multiCompareOptions);
120
+ displayMultiFileCompareResult(result, stats, quiet);
121
+ // Handle drift approval
122
+ if (result.status === 'DRIFT') {
123
+ let shouldUpdate = false;
124
+ if (approve) {
125
+ // --approve flag: non-interactive, deterministic
126
+ shouldUpdate = true;
127
+ console.log('🔄 --approve flag set, updating all context files...');
128
+ }
129
+ else if (isTTY()) {
130
+ // Interactive prompt (local dev convenience)
131
+ shouldUpdate = await promptYesNo('Update all context files? (y/N) ');
132
+ }
133
+ if (shouldUpdate) {
134
+ // Copy all new context files to current directory
135
+ const { readFile } = await import('node:fs/promises');
136
+ const newIndexContent = await readFile(join(tempDir, 'context_main.json'), 'utf8');
137
+ const newIndex = JSON.parse(newIndexContent);
138
+ let copiedFiles = 0;
139
+ for (const folder of newIndex.folders) {
140
+ const srcPath = join(tempDir, folder.contextFile);
141
+ const destPath = folder.contextFile;
142
+ // Create parent directory if needed
143
+ await mkdir(dirname(destPath), { recursive: true });
144
+ await copyFile(srcPath, destPath);
145
+ copiedFiles++;
146
+ if (!quiet) {
147
+ console.log(` ✓ Updated ${destPath}`);
148
+ }
149
+ }
150
+ // Copy context_main.json
151
+ await copyFile(join(tempDir, 'context_main.json'), 'context_main.json');
152
+ if (!quiet) {
153
+ console.log(` ✓ Updated context_main.json`);
154
+ }
155
+ // Clean up orphaned files if requested
156
+ if (cleanOrphaned && result.orphanedFiles && result.orphanedFiles.length > 0) {
157
+ if (!quiet) {
158
+ console.log('\n🗑️ Cleaning up orphaned files...');
159
+ }
160
+ const deletedCount = await cleanOrphanedFiles(result.orphanedFiles, '.', quiet);
161
+ if (!quiet) {
162
+ console.log(` ✓ Deleted ${deletedCount} orphaned file(s)`);
163
+ }
164
+ }
165
+ if (!quiet) {
166
+ console.log(`\n✅ ${copiedFiles + 1} context files updated successfully`);
167
+ }
168
+ // Clean up temp directory
169
+ await rm(tempDir, { recursive: true, force: true });
170
+ process.exit(0); // Success: drift approved and updated
171
+ }
172
+ else {
173
+ // Clean up temp directory
174
+ await rm(tempDir, { recursive: true, force: true });
175
+ if (isTTY() && !approve) {
176
+ console.log('❌ Update declined\n');
177
+ }
178
+ process.exit(1); // Drift detected but not approved
179
+ }
180
+ }
181
+ else {
182
+ // No drift - clean up and exit success
183
+ await rm(tempDir, { recursive: true, force: true });
184
+ process.exit(0);
185
+ }
186
+ }
187
+ catch (error) {
188
+ // Try to clean up temp directory even on error
189
+ try {
190
+ await rm(tempDir, { recursive: true, force: true });
191
+ }
192
+ catch { }
193
+ console.error('❌ Compare failed:', error.message);
194
+ process.exit(1);
195
+ }
196
+ }
197
+ async function handleMultiFileCompareMode(options) {
198
+ const { oldFile, newFile, stats, approve, cleanOrphaned, quiet } = options;
199
+ // Multi-file comparison mode
200
+ const multiCompareOptions = {
201
+ oldIndexFile: oldFile,
202
+ newIndexFile: newFile,
203
+ stats,
204
+ approve,
205
+ autoCleanOrphaned: cleanOrphaned,
206
+ quiet,
207
+ };
208
+ try {
209
+ const result = await multiFileCompare(multiCompareOptions);
210
+ displayMultiFileCompareResult(result, stats, quiet);
211
+ // Handle drift approval in manual mode
212
+ if (result.status === 'DRIFT') {
213
+ let shouldUpdate = false;
214
+ if (approve) {
215
+ // --approve flag: non-interactive, deterministic
216
+ shouldUpdate = true;
217
+ if (!quiet) {
218
+ console.log('🔄 --approve flag set, updating all context files...');
219
+ }
220
+ }
221
+ else if (isTTY()) {
222
+ // Interactive prompt (local dev convenience)
223
+ shouldUpdate = await promptYesNo('Update all context files? (y/N) ');
224
+ }
225
+ if (shouldUpdate) {
226
+ // Copy all new context files
227
+ const { readFile, copyFile, mkdir } = await import('node:fs/promises');
228
+ const { dirname, join } = await import('node:path');
229
+ const newIndexContent = await readFile(newFile, 'utf8');
230
+ const newIndex = JSON.parse(newIndexContent);
231
+ const baseDir = dirname(oldFile);
232
+ let copiedFiles = 0;
233
+ for (const folder of newIndex.folders) {
234
+ const srcPath = join(dirname(newFile), folder.contextFile);
235
+ const destPath = join(baseDir, folder.contextFile);
236
+ // Create parent directory if needed
237
+ await mkdir(dirname(destPath), { recursive: true });
238
+ await copyFile(srcPath, destPath);
239
+ copiedFiles++;
240
+ if (!quiet) {
241
+ console.log(` ✓ Updated ${folder.contextFile}`);
242
+ }
243
+ }
244
+ // Copy context_main.json
245
+ await copyFile(newFile, oldFile);
246
+ if (!quiet) {
247
+ console.log(` ✓ Updated ${oldFile}`);
248
+ }
249
+ // Clean up orphaned files if requested
250
+ if (cleanOrphaned && result.orphanedFiles && result.orphanedFiles.length > 0) {
251
+ if (!quiet) {
252
+ console.log('\n🗑️ Cleaning up orphaned files...');
253
+ }
254
+ const deletedCount = await cleanOrphanedFiles(result.orphanedFiles, baseDir, quiet);
255
+ if (!quiet) {
256
+ console.log(` ✓ Deleted ${deletedCount} orphaned file(s)`);
257
+ }
258
+ }
259
+ if (!quiet) {
260
+ console.log(`\n✅ ${copiedFiles + 1} context files updated successfully`);
261
+ }
262
+ process.exit(0); // Success: drift approved and updated
263
+ }
264
+ else {
265
+ if (isTTY() && !approve) {
266
+ console.log('❌ Update declined\n');
267
+ }
268
+ process.exit(1); // Drift detected but not approved
269
+ }
270
+ }
271
+ else {
272
+ // No drift
273
+ process.exit(0);
274
+ }
275
+ }
276
+ catch (error) {
277
+ console.error('❌ Compare failed:', error.message);
278
+ process.exit(1);
279
+ }
280
+ }
281
+ async function handleSingleFileCompareMode(options) {
282
+ const { oldFile, newFile, stats, approve, quiet } = options;
283
+ // Single-file comparison mode (backward compatible)
284
+ const compareOptions = {
285
+ oldFile,
286
+ newFile,
287
+ stats,
288
+ approve,
289
+ quiet,
290
+ };
291
+ try {
292
+ const result = await compareCommand(compareOptions);
293
+ // Handle drift approval in manual mode
294
+ if (result.status === 'DRIFT') {
295
+ let shouldUpdate = false;
296
+ if (approve) {
297
+ // --approve flag: non-interactive, deterministic
298
+ shouldUpdate = true;
299
+ if (!quiet) {
300
+ console.log(`🔄 --approve flag set, updating ${oldFile}...`);
301
+ }
302
+ }
303
+ else if (isTTY()) {
304
+ // Interactive prompt (local dev convenience)
305
+ shouldUpdate = await promptYesNo(`Update ${oldFile} with ${newFile}? (y/N) `);
306
+ }
307
+ if (shouldUpdate) {
308
+ const { copyFile } = await import('node:fs/promises');
309
+ await copyFile(newFile, oldFile);
310
+ if (!quiet) {
311
+ console.log(`✅ ${oldFile} updated successfully\n`);
312
+ }
313
+ process.exit(0); // Success: drift approved and updated
314
+ }
315
+ else {
316
+ if (isTTY() && !approve) {
317
+ console.log('❌ Update declined\n');
318
+ }
319
+ process.exit(1); // Drift detected but not approved
320
+ }
321
+ }
322
+ else {
323
+ // No drift
324
+ process.exit(0);
325
+ }
326
+ }
327
+ catch (error) {
328
+ console.error('❌ Compare failed:', error.message);
329
+ process.exit(1);
330
+ }
331
+ }
332
+ //# sourceMappingURL=compareHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compareHandler.js","sourceRoot":"","sources":["../../../src/cli/handlers/compareHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Handler for context/generate command
3
+ */
4
+ export declare function handleGenerate(args: string[]): Promise<void>;
5
+ //# sourceMappingURL=contextHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextHandler.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/contextHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBlE"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Handler for context/generate command
3
+ */
4
+ import { contextCommand } from '../commands/context.js';
5
+ import { parseContextArgs } from '../parser/argumentParser.js';
6
+ import { getGenerateHelp } from '../parser/helpText.js';
7
+ import { printFoxIcon } from './initHandler.js';
8
+ export async function handleGenerate(args) {
9
+ if (args.includes('--help') || args.includes('-h')) {
10
+ printFoxIcon();
11
+ console.log(getGenerateHelp());
12
+ process.exit(0);
13
+ }
14
+ const options = parseContextArgs(args);
15
+ try {
16
+ await contextCommand(options);
17
+ }
18
+ catch (error) {
19
+ console.error('❌ Context generation failed:', error.message);
20
+ console.error(error.stack);
21
+ process.exit(1);
22
+ }
23
+ }
24
+ //# sourceMappingURL=contextHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextHandler.js","sourceRoot":"","sources":["../../../src/cli/handlers/contextHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAuB,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QACxE,OAAO,CAAC,KAAK,CAAE,KAAe,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Handler for init command
3
+ */
4
+ export declare function printFoxIcon(): void;
5
+ export declare function handleInit(args: string[]): Promise<void>;
6
+ //# sourceMappingURL=initHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initHandler.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/initHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,YAAY,SAO3B;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB9D"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Handler for init command
3
+ */
4
+ import { init } from '../commands/init.js';
5
+ import { parseInitArgs } from '../parser/argumentParser.js';
6
+ import { getInitHelp } from '../parser/helpText.js';
7
+ export function printFoxIcon() {
8
+ console.log(`
9
+ /\\_/\\
10
+ ( o.o )
11
+ > ^ <
12
+ 🦊 Meet the Logic Fox
13
+ `);
14
+ }
15
+ export async function handleInit(args) {
16
+ printFoxIcon();
17
+ if (args.includes('--help') || args.includes('-h')) {
18
+ console.log(getInitHelp());
19
+ process.exit(0);
20
+ }
21
+ const options = parseInitArgs(args);
22
+ try {
23
+ await init(options);
24
+ }
25
+ catch (error) {
26
+ console.error('❌ Initialization failed:', error.message);
27
+ process.exit(1);
28
+ }
29
+ }
30
+ //# sourceMappingURL=initHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initHandler.js","sourceRoot":"","sources":["../../../src/cli/handlers/initHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAoB,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,CAAC;;;;;CAKb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,YAAY,EAAE,CAAC;IAEf,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Handler for style command
3
+ */
4
+ export declare function handleStyle(args: string[]): Promise<void>;
5
+ //# sourceMappingURL=styleHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styleHandler.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/styleHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB/D"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Handler for style command
3
+ */
4
+ import { styleCommand } from '../commands/style.js';
5
+ import { parseStyleArgs } from '../parser/argumentParser.js';
6
+ import { getStyleHelp } from '../parser/helpText.js';
7
+ import { printFoxIcon } from './initHandler.js';
8
+ export async function handleStyle(args) {
9
+ if (args.includes('--help') || args.includes('-h')) {
10
+ printFoxIcon();
11
+ console.log(getStyleHelp());
12
+ process.exit(0);
13
+ }
14
+ // Explicitly reject --compare-modes (only available in stamp context, not stamp context style)
15
+ if (args.includes('--compare-modes')) {
16
+ console.error('❌ --compare-modes is not available for "stamp context style". Use "stamp context --compare-modes" instead.');
17
+ process.exit(1);
18
+ }
19
+ const options = parseStyleArgs(args);
20
+ // Note: styleCommand internally sets includeStyle: true
21
+ try {
22
+ await styleCommand(options);
23
+ }
24
+ catch (error) {
25
+ console.error('❌ Style context generation failed:', error.message);
26
+ console.error(error.stack);
27
+ process.exit(1);
28
+ }
29
+ }
30
+ //# sourceMappingURL=styleHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styleHandler.js","sourceRoot":"","sources":["../../../src/cli/handlers/styleHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAqB,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+FAA+F;IAC/F,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,4GAA4G,CAAC,CAAC;QAC5H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,wDAAwD;IAExD,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAC9E,OAAO,CAAC,KAAK,CAAE,KAAe,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Handler for validate command
3
+ */
4
+ export declare function handleValidate(args: string[]): Promise<void>;
5
+ //# sourceMappingURL=validateHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateHandler.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/validateHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAelE"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Handler for validate command
3
+ */
4
+ import { validateCommand } from '../commands/validate.js';
5
+ import { parseValidateArgs } from '../parser/argumentParser.js';
6
+ import { getValidateHelp } from '../parser/helpText.js';
7
+ import { printFoxIcon } from './initHandler.js';
8
+ export async function handleValidate(args) {
9
+ if (args.includes('--help') || args.includes('-h')) {
10
+ printFoxIcon();
11
+ console.log(getValidateHelp());
12
+ process.exit(0);
13
+ }
14
+ const { quiet, filePath } = parseValidateArgs(args);
15
+ try {
16
+ await validateCommand(filePath, quiet);
17
+ }
18
+ catch (error) {
19
+ console.error('❌ Validation failed:', error.message);
20
+ process.exit(1);
21
+ }
22
+ }
23
+ //# sourceMappingURL=validateHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateHandler.js","sourceRoot":"","sources":["../../../src/cli/handlers/validateHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Argument parsing utilities for CLI commands
3
+ */
4
+ import type { ContextOptions } from '../commands/context.js';
5
+ import type { InitOptions } from '../commands/init.js';
6
+ import type { CleanOptions } from '../commands/clean.js';
7
+ import type { StyleOptions } from '../commands/style.js';
8
+ export interface CompareArgs {
9
+ stats: boolean;
10
+ approve: boolean;
11
+ cleanOrphaned: boolean;
12
+ quiet: boolean;
13
+ skipGitignore: boolean;
14
+ positionalArgs: string[];
15
+ }
16
+ export interface ValidateArgs {
17
+ quiet: boolean;
18
+ filePath?: string;
19
+ }
20
+ /**
21
+ * Parse context command arguments (for generate command)
22
+ */
23
+ export declare function parseContextArgs(args: string[]): ContextOptions;
24
+ /**
25
+ * Parse compare command arguments
26
+ */
27
+ export declare function parseCompareArgs(args: string[]): CompareArgs;
28
+ /**
29
+ * Parse validate command arguments
30
+ */
31
+ export declare function parseValidateArgs(args: string[]): ValidateArgs;
32
+ /**
33
+ * Parse init command arguments
34
+ */
35
+ export declare function parseInitArgs(args: string[]): InitOptions;
36
+ /**
37
+ * Parse clean command arguments
38
+ */
39
+ export declare function parseCleanArgs(args: string[]): CleanOptions;
40
+ /**
41
+ * Parse style command arguments (same as context args but exclude includeStyle)
42
+ */
43
+ export declare function parseStyleArgs(args: string[]): StyleOptions;
44
+ //# sourceMappingURL=argumentParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argumentParser.d.ts","sourceRoot":"","sources":["../../../src/cli/parser/argumentParser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAoG/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAkB5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAQ9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CA6BzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAgB3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAQ3D"}