logicstamp-context 0.1.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 (89) hide show
  1. package/LICENSE +21 -0
  2. package/LLM_CONTEXT.md +260 -0
  3. package/README.md +949 -0
  4. package/dist/cli/commands/clean.d.ts +15 -0
  5. package/dist/cli/commands/clean.d.ts.map +1 -0
  6. package/dist/cli/commands/clean.js +142 -0
  7. package/dist/cli/commands/clean.js.map +1 -0
  8. package/dist/cli/commands/compare.d.ts +88 -0
  9. package/dist/cli/commands/compare.d.ts.map +1 -0
  10. package/dist/cli/commands/compare.js +519 -0
  11. package/dist/cli/commands/compare.js.map +1 -0
  12. package/dist/cli/commands/context.d.ts +24 -0
  13. package/dist/cli/commands/context.d.ts.map +1 -0
  14. package/dist/cli/commands/context.js +576 -0
  15. package/dist/cli/commands/context.js.map +1 -0
  16. package/dist/cli/commands/init.d.ts +14 -0
  17. package/dist/cli/commands/init.d.ts.map +1 -0
  18. package/dist/cli/commands/init.js +71 -0
  19. package/dist/cli/commands/init.js.map +1 -0
  20. package/dist/cli/commands/validate.d.ts +52 -0
  21. package/dist/cli/commands/validate.d.ts.map +1 -0
  22. package/dist/cli/commands/validate.js +368 -0
  23. package/dist/cli/commands/validate.js.map +1 -0
  24. package/dist/cli/index.d.ts +7 -0
  25. package/dist/cli/index.d.ts.map +1 -0
  26. package/dist/cli/index.js +223 -0
  27. package/dist/cli/index.js.map +1 -0
  28. package/dist/cli/stamp.d.ts +7 -0
  29. package/dist/cli/stamp.d.ts.map +1 -0
  30. package/dist/cli/stamp.js +961 -0
  31. package/dist/cli/stamp.js.map +1 -0
  32. package/dist/cli/validate-index.d.ts +7 -0
  33. package/dist/cli/validate-index.d.ts.map +1 -0
  34. package/dist/cli/validate-index.js +55 -0
  35. package/dist/cli/validate-index.js.map +1 -0
  36. package/dist/core/astParser.d.ts +47 -0
  37. package/dist/core/astParser.d.ts.map +1 -0
  38. package/dist/core/astParser.js +417 -0
  39. package/dist/core/astParser.js.map +1 -0
  40. package/dist/core/contractBuilder.d.ts +48 -0
  41. package/dist/core/contractBuilder.d.ts.map +1 -0
  42. package/dist/core/contractBuilder.js +120 -0
  43. package/dist/core/contractBuilder.js.map +1 -0
  44. package/dist/core/manifest.d.ts +75 -0
  45. package/dist/core/manifest.d.ts.map +1 -0
  46. package/dist/core/manifest.js +173 -0
  47. package/dist/core/manifest.js.map +1 -0
  48. package/dist/core/pack.d.ts +190 -0
  49. package/dist/core/pack.d.ts.map +1 -0
  50. package/dist/core/pack.js +438 -0
  51. package/dist/core/pack.js.map +1 -0
  52. package/dist/core/signature.d.ts +47 -0
  53. package/dist/core/signature.d.ts.map +1 -0
  54. package/dist/core/signature.js +208 -0
  55. package/dist/core/signature.js.map +1 -0
  56. package/dist/index.d.ts +27 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +23 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/types/UIFContract.d.ts +112 -0
  61. package/dist/types/UIFContract.d.ts.map +1 -0
  62. package/dist/types/UIFContract.js +36 -0
  63. package/dist/types/UIFContract.js.map +1 -0
  64. package/dist/utils/config.d.ts +34 -0
  65. package/dist/utils/config.d.ts.map +1 -0
  66. package/dist/utils/config.js +62 -0
  67. package/dist/utils/config.js.map +1 -0
  68. package/dist/utils/fsx.d.ts +85 -0
  69. package/dist/utils/fsx.d.ts.map +1 -0
  70. package/dist/utils/fsx.js +181 -0
  71. package/dist/utils/fsx.js.map +1 -0
  72. package/dist/utils/gitignore.d.ts +62 -0
  73. package/dist/utils/gitignore.d.ts.map +1 -0
  74. package/dist/utils/gitignore.js +183 -0
  75. package/dist/utils/gitignore.js.map +1 -0
  76. package/dist/utils/hash.d.ts +73 -0
  77. package/dist/utils/hash.d.ts.map +1 -0
  78. package/dist/utils/hash.js +159 -0
  79. package/dist/utils/hash.js.map +1 -0
  80. package/dist/utils/llmContext.d.ts +34 -0
  81. package/dist/utils/llmContext.d.ts.map +1 -0
  82. package/dist/utils/llmContext.js +136 -0
  83. package/dist/utils/llmContext.js.map +1 -0
  84. package/dist/utils/tokens.d.ts +23 -0
  85. package/dist/utils/tokens.d.ts.map +1 -0
  86. package/dist/utils/tokens.js +29 -0
  87. package/dist/utils/tokens.js.map +1 -0
  88. package/package.json +69 -0
  89. package/schema/logicstamp.context.schema.json +430 -0
@@ -0,0 +1,576 @@
1
+ /**
2
+ * Context command - Generates context bundles from React/TypeScript codebases
3
+ */
4
+ import { writeFile, mkdir } from 'node:fs/promises';
5
+ import { resolve, dirname, join } from 'node:path';
6
+ import { globFiles, readFileWithText, getFolderPath, normalizeEntryId } from '../../utils/fsx.js';
7
+ import { buildContract } from '../../core/contractBuilder.js';
8
+ import { extractFromFile } from '../../core/astParser.js';
9
+ import { buildDependencyGraph } from '../../core/manifest.js';
10
+ import { pack, } from '../../core/pack.js';
11
+ import { estimateGPT4Tokens, estimateClaudeTokens, formatTokenCount } from '../../utils/tokens.js';
12
+ import { validateBundles } from './validate.js';
13
+ import { smartGitignoreSetup } from '../../utils/gitignore.js';
14
+ import { smartLLMContextSetup } from '../../utils/llmContext.js';
15
+ /**
16
+ * Normalize path for display (convert backslashes to forward slashes)
17
+ */
18
+ function displayPath(path) {
19
+ return path.replace(/\\/g, '/');
20
+ }
21
+ /**
22
+ * Detect if a folder is a root (application entry point) and assign a label
23
+ */
24
+ function detectRootFolder(relativePath, components) {
25
+ // Project root is always a root
26
+ if (relativePath === '.') {
27
+ return { isRoot: true, rootLabel: 'Project Root' };
28
+ }
29
+ // Detect common application entry points
30
+ const pathLower = relativePath.toLowerCase();
31
+ // Next.js app router
32
+ if (pathLower.includes('/app') && components.some(c => c === 'page.tsx' || c === 'layout.tsx')) {
33
+ return { isRoot: true, rootLabel: 'Next.js App' };
34
+ }
35
+ // Examples folder
36
+ if (pathLower.startsWith('examples/') && pathLower.endsWith('/src')) {
37
+ const exampleName = relativePath.split('/')[1];
38
+ return { isRoot: true, rootLabel: `Example: ${exampleName}` };
39
+ }
40
+ // Test fixtures
41
+ if (pathLower.includes('tests/fixtures/') && pathLower.endsWith('/src')) {
42
+ return { isRoot: true, rootLabel: 'Test Fixture' };
43
+ }
44
+ // Root src folder
45
+ if (relativePath === 'src') {
46
+ return { isRoot: true, rootLabel: 'Main Source' };
47
+ }
48
+ // Apps folder (monorepo pattern)
49
+ if (pathLower.startsWith('apps/')) {
50
+ const appName = relativePath.split('/')[1];
51
+ return { isRoot: true, rootLabel: `App: ${appName}` };
52
+ }
53
+ // Default: not a root
54
+ return { isRoot: false };
55
+ }
56
+ export async function contextCommand(options) {
57
+ const startTime = Date.now();
58
+ // Determine the target directory
59
+ const targetPath = options.entry || '.';
60
+ const projectRoot = resolve(targetPath);
61
+ if (!options.quiet) {
62
+ console.log(`šŸ” Scanning ${displayPath(projectRoot)}...`);
63
+ }
64
+ // Step 1: Find all React/TS files
65
+ const files = await globFiles(projectRoot);
66
+ if (files.length === 0) {
67
+ console.error(`āŒ No React/TypeScript modules found under ${displayPath(projectRoot)}`);
68
+ console.error(` Try: logicstamp-context ./src or --depth 0 to scan all directories`);
69
+ process.exit(1);
70
+ }
71
+ if (!options.quiet) {
72
+ console.log(` Found ${files.length} files`);
73
+ }
74
+ // Step 2: Build contracts for all files
75
+ if (!options.quiet) {
76
+ console.log(`šŸ”Ø Analyzing components...`);
77
+ }
78
+ const contracts = [];
79
+ let analyzed = 0;
80
+ let totalSourceSize = 0; // Track total source code size for savings calculation
81
+ for (const file of files) {
82
+ try {
83
+ // Extract AST from file
84
+ const ast = await extractFromFile(file);
85
+ // Build contract from AST
86
+ const { text } = await readFileWithText(file);
87
+ totalSourceSize += text.length; // Accumulate source size
88
+ const result = buildContract(file, ast, {
89
+ preset: 'none',
90
+ sourceText: text,
91
+ enablePredictions: options.predictBehavior,
92
+ });
93
+ if (result.contract) {
94
+ contracts.push(result.contract);
95
+ analyzed++;
96
+ }
97
+ }
98
+ catch (error) {
99
+ // Skip files that can't be analyzed
100
+ if (!options.quiet) {
101
+ console.warn(` āš ļø Skipped ${file}: ${error.message}`);
102
+ }
103
+ }
104
+ }
105
+ if (!options.quiet) {
106
+ console.log(` Analyzed ${analyzed} components`);
107
+ }
108
+ if (contracts.length === 0) {
109
+ console.error('āŒ No components found to analyze');
110
+ console.error(` Files were found but could not be analyzed as React/TypeScript components`);
111
+ console.error(` Ensure your files contain valid React components or TypeScript modules`);
112
+ process.exit(1);
113
+ }
114
+ // Step 3: Build dependency graph (manifest)
115
+ if (!options.quiet) {
116
+ console.log(`šŸ“Š Building dependency graph...`);
117
+ }
118
+ const manifest = buildDependencyGraph(contracts);
119
+ // Step 3.5: Create contracts map for pack function
120
+ const contractsMap = new Map();
121
+ for (const contract of contracts) {
122
+ contractsMap.set(contract.entryId, contract);
123
+ }
124
+ // Apply profile settings
125
+ let depth = options.depth;
126
+ let includeCode = options.includeCode;
127
+ let hashLock = options.hashLock;
128
+ let strict = options.strict;
129
+ if (options.profile === 'llm-safe') {
130
+ depth = 1;
131
+ includeCode = 'header';
132
+ hashLock = false;
133
+ options.maxNodes = 30;
134
+ options.allowMissing = true;
135
+ if (!options.quiet) {
136
+ console.log('šŸ“‹ Using profile: llm-safe (depth=1, header only, max 30 nodes)');
137
+ }
138
+ }
139
+ else if (options.profile === 'llm-chat') {
140
+ depth = 1;
141
+ includeCode = 'header';
142
+ hashLock = false;
143
+ if (!options.quiet) {
144
+ console.log('šŸ“‹ Using profile: llm-chat (depth=1, header only, max 100 nodes)');
145
+ }
146
+ }
147
+ else if (options.profile === 'ci-strict') {
148
+ includeCode = 'none';
149
+ hashLock = false;
150
+ strict = true;
151
+ if (!options.quiet) {
152
+ console.log('šŸ“‹ Using profile: ci-strict (no code, strict dependencies)');
153
+ }
154
+ }
155
+ // Step 4: Pack context bundles
156
+ const packOptions = {
157
+ depth,
158
+ includeCode,
159
+ format: options.format,
160
+ hashLock,
161
+ strict,
162
+ allowMissing: options.allowMissing,
163
+ maxNodes: options.maxNodes,
164
+ contractsMap, // Pass in-memory contracts
165
+ };
166
+ let bundles;
167
+ let output;
168
+ // Generate context for all root components
169
+ if (!options.quiet) {
170
+ console.log(`šŸ“¦ Generating context for ${manifest.graph.roots.length} root components (depth=${depth})...`);
171
+ }
172
+ bundles = [];
173
+ for (const rootId of manifest.graph.roots) {
174
+ try {
175
+ const bundle = await pack(rootId, manifest, packOptions, projectRoot);
176
+ bundles.push(bundle);
177
+ }
178
+ catch (error) {
179
+ if (!options.quiet) {
180
+ console.warn(` āš ļø Failed to pack ${rootId}: ${error.message}`);
181
+ }
182
+ }
183
+ }
184
+ if (bundles.length === 0) {
185
+ console.error('āŒ No bundles could be generated');
186
+ process.exit(1);
187
+ }
188
+ // Sort bundles by entryId for deterministic output
189
+ bundles.sort((a, b) => a.entryId.localeCompare(b.entryId));
190
+ // Combine all bundles into output
191
+ if (options.format === 'ndjson') {
192
+ output = bundles.map((b, idx) => {
193
+ const bundleWithSchema = {
194
+ $schema: 'https://logicstamp.dev/schemas/context/v0.1.json',
195
+ position: `${idx + 1}/${bundles.length}`,
196
+ ...b,
197
+ };
198
+ return JSON.stringify(bundleWithSchema);
199
+ }).join('\n');
200
+ }
201
+ else if (options.format === 'json') {
202
+ const bundlesWithPosition = bundles.map((b, idx) => ({
203
+ $schema: 'https://logicstamp.dev/schemas/context/v0.1.json',
204
+ position: `${idx + 1}/${bundles.length}`,
205
+ ...b,
206
+ }));
207
+ output = JSON.stringify(bundlesWithPosition, null, 2);
208
+ }
209
+ else {
210
+ // pretty format
211
+ output = bundles.map((b, idx) => {
212
+ const bundleWithSchema = {
213
+ $schema: 'https://logicstamp.dev/schemas/context/v0.1.json',
214
+ position: `${idx + 1}/${bundles.length}`,
215
+ ...b,
216
+ };
217
+ const header = `\n# Bundle ${idx + 1}/${bundles.length}: ${b.entryId}`;
218
+ return header + '\n' + JSON.stringify(bundleWithSchema, null, 2);
219
+ }).join('\n\n');
220
+ }
221
+ const elapsed = Date.now() - startTime;
222
+ // Calculate stats
223
+ const totalNodes = bundles.reduce((sum, b) => sum + b.graph.nodes.length, 0);
224
+ const totalEdges = bundles.reduce((sum, b) => sum + b.graph.edges.length, 0);
225
+ const totalMissing = bundles.reduce((sum, b) => sum + b.meta.missing.length, 0);
226
+ // Calculate token counts for actual output (current mode)
227
+ const currentGPT4 = estimateGPT4Tokens(output);
228
+ const currentClaude = estimateClaudeTokens(output);
229
+ // Estimate tokens for all three modes
230
+ // Mode comparison helps users understand cost tradeoffs
231
+ const sourceTokensGPT4 = Math.ceil(totalSourceSize / 4);
232
+ const sourceTokensClaude = Math.ceil(totalSourceSize / 4.5);
233
+ // Estimate based on typical ratios observed in practice:
234
+ // - none mode: ~60% of header mode (contracts only, no code snippets)
235
+ // - header mode: baseline (contracts + JSDoc headers)
236
+ // - full mode: header mode + all source code
237
+ const modeEstimates = {
238
+ none: {
239
+ gpt4: Math.ceil(currentGPT4 * 0.6),
240
+ claude: Math.ceil(currentClaude * 0.6),
241
+ },
242
+ header: {
243
+ gpt4: currentGPT4,
244
+ claude: currentClaude,
245
+ },
246
+ full: {
247
+ gpt4: currentGPT4 + sourceTokensGPT4,
248
+ claude: currentClaude + sourceTokensClaude,
249
+ },
250
+ };
251
+ // Calculate savings percentage for current mode vs full
252
+ const savingsGPT4 = modeEstimates.full.gpt4 > 0
253
+ ? ((modeEstimates.full.gpt4 - currentGPT4) / modeEstimates.full.gpt4 * 100).toFixed(0)
254
+ : '0';
255
+ const savingsClaude = modeEstimates.full.claude > 0
256
+ ? ((modeEstimates.full.claude - currentClaude) / modeEstimates.full.claude * 100).toFixed(0)
257
+ : '0';
258
+ // If --compare-modes flag is set, output detailed mode comparison and exit
259
+ if (options.compareModes) {
260
+ console.log('\nšŸ“Š Mode Comparison\n');
261
+ console.log('Mode | Tokens GPT-4o | Tokens Claude | Savings vs Full');
262
+ console.log('---------|---------------|---------------|------------------');
263
+ const modes = [
264
+ { name: 'none', gpt4: modeEstimates.none.gpt4, claude: modeEstimates.none.claude },
265
+ { name: 'header', gpt4: modeEstimates.header.gpt4, claude: modeEstimates.header.claude },
266
+ { name: 'full', gpt4: modeEstimates.full.gpt4, claude: modeEstimates.full.claude },
267
+ ];
268
+ modes.forEach(mode => {
269
+ const savings = modeEstimates.full.gpt4 > 0
270
+ ? ((modeEstimates.full.gpt4 - mode.gpt4) / modeEstimates.full.gpt4 * 100).toFixed(0)
271
+ : '0';
272
+ console.log(`${mode.name.padEnd(8)} | ${formatTokenCount(mode.gpt4).padStart(13)} | ${formatTokenCount(mode.claude).padStart(13)} | ${savings}%`);
273
+ });
274
+ console.log(`\nā± Completed in ${elapsed}ms`);
275
+ return;
276
+ }
277
+ // If --stats flag is set, output one-line JSON and exit
278
+ // Stats Output Contract (for CI parsing):
279
+ // {
280
+ // totalComponents: number, // Total .ts/.tsx files analyzed
281
+ // rootComponents: number, // Components with no dependencies (entry points)
282
+ // leafComponents: number, // Components that are only dependencies (no imports)
283
+ // bundlesGenerated: number, // Number of bundles created (one per root)
284
+ // totalNodes: number, // Sum of all nodes across all bundles
285
+ // totalEdges: number, // Sum of all edges across all bundles
286
+ // missingDependencies: number, // Count of unresolved dependencies (third-party/external)
287
+ // tokensGPT4: number, // Estimated GPT-4 tokens (current mode)
288
+ // tokensClaude: number, // Estimated Claude tokens (current mode)
289
+ // modeEstimates: object, // Token estimates for all modes (none/header/full)
290
+ // savingsGPT4: string, // Savings percentage for GPT-4 (current vs full)
291
+ // savingsClaude: string, // Savings percentage for Claude (current vs full)
292
+ // elapsedMs: number // Time taken in milliseconds
293
+ // }
294
+ if (options.stats) {
295
+ const stats = {
296
+ totalComponents: contracts.length,
297
+ rootComponents: manifest.graph.roots.length,
298
+ leafComponents: manifest.graph.leaves.length,
299
+ bundlesGenerated: bundles.length,
300
+ totalNodes,
301
+ totalEdges,
302
+ missingDependencies: totalMissing,
303
+ tokensGPT4: currentGPT4,
304
+ tokensClaude: currentClaude,
305
+ modeEstimates: {
306
+ none: { gpt4: modeEstimates.none.gpt4, claude: modeEstimates.none.claude },
307
+ header: { gpt4: modeEstimates.header.gpt4, claude: modeEstimates.header.claude },
308
+ full: { gpt4: modeEstimates.full.gpt4, claude: modeEstimates.full.claude },
309
+ },
310
+ savingsGPT4,
311
+ savingsClaude,
312
+ elapsedMs: elapsed,
313
+ };
314
+ console.log(JSON.stringify(stats));
315
+ return;
316
+ }
317
+ // Validate bundles before writing
318
+ if (!options.quiet) {
319
+ console.log(`šŸ” Validating generated context...`);
320
+ }
321
+ const bundlesWithSchema = bundles.map((b, idx) => ({
322
+ $schema: 'https://logicstamp.dev/schemas/context/v0.1.json',
323
+ position: `${idx + 1}/${bundles.length}`,
324
+ ...b,
325
+ }));
326
+ const validation = validateBundles(bundlesWithSchema);
327
+ if (!validation.valid) {
328
+ console.error(`\nāŒ Validation failed: ${validation.errors} error(s)`);
329
+ validation.messages.forEach(msg => console.error(` ${msg}`));
330
+ process.exit(1);
331
+ }
332
+ if (!options.quiet) {
333
+ if (validation.warnings > 0) {
334
+ console.log(`āš ļø ${validation.warnings} warning(s) during validation`);
335
+ validation.messages.filter(msg => !msg.includes('error')).forEach(msg => console.log(` ${msg}`));
336
+ }
337
+ else {
338
+ console.log(`āœ… Validation passed`);
339
+ }
340
+ }
341
+ // Write output unless --dry-run
342
+ if (!options.dryRun) {
343
+ // Determine output directory from --out option
344
+ // If --out points to a .json file, use its directory; otherwise use it as the directory
345
+ const outPath = resolve(options.out);
346
+ const outputDir = outPath.endsWith('.json') ? dirname(outPath) : outPath;
347
+ // Group bundles by folder
348
+ const bundlesByFolder = new Map();
349
+ for (const bundle of bundles) {
350
+ const folderPath = getFolderPath(bundle.entryId);
351
+ if (!bundlesByFolder.has(folderPath)) {
352
+ bundlesByFolder.set(folderPath, []);
353
+ }
354
+ bundlesByFolder.get(folderPath).push(bundle);
355
+ }
356
+ // Prepare folder metadata and write files
357
+ if (!options.quiet) {
358
+ console.log(`šŸ“ Writing context files for ${bundlesByFolder.size} folders...`);
359
+ }
360
+ let filesWritten = 0;
361
+ const normalizedRoot = normalizeEntryId(projectRoot);
362
+ const folderInfos = [];
363
+ let totalTokenEstimate = 0;
364
+ for (const [folderPath, folderBundles] of bundlesByFolder) {
365
+ // Sort bundles for deterministic output
366
+ folderBundles.sort((a, b) => a.entryId.localeCompare(b.entryId));
367
+ // Calculate relative path from project root
368
+ let relativePath;
369
+ if (folderPath === normalizedRoot) {
370
+ relativePath = '.';
371
+ }
372
+ else if (folderPath.startsWith(normalizedRoot + '/')) {
373
+ relativePath = folderPath.substring(normalizedRoot.length + 1);
374
+ }
375
+ else {
376
+ relativePath = folderPath;
377
+ }
378
+ // Extract component file names from bundle entryIds
379
+ const components = folderBundles.map(b => {
380
+ const normalized = normalizeEntryId(b.entryId);
381
+ const lastSlash = normalized.lastIndexOf('/');
382
+ return lastSlash !== -1 ? normalized.substring(lastSlash + 1) : normalized;
383
+ });
384
+ // Detect if this is a root folder
385
+ const { isRoot, rootLabel } = detectRootFolder(relativePath, components);
386
+ // Format bundles for this folder
387
+ let folderOutput;
388
+ if (options.format === 'ndjson') {
389
+ folderOutput = folderBundles.map((b, idx) => {
390
+ const bundleWithSchema = {
391
+ $schema: 'https://logicstamp.dev/schemas/context/v0.1.json',
392
+ position: `${idx + 1}/${folderBundles.length}`,
393
+ ...b,
394
+ };
395
+ return JSON.stringify(bundleWithSchema);
396
+ }).join('\n');
397
+ }
398
+ else if (options.format === 'json') {
399
+ const bundlesWithPosition = folderBundles.map((b, idx) => ({
400
+ $schema: 'https://logicstamp.dev/schemas/context/v0.1.json',
401
+ position: `${idx + 1}/${folderBundles.length}`,
402
+ ...b,
403
+ }));
404
+ folderOutput = JSON.stringify(bundlesWithPosition, null, 2);
405
+ }
406
+ else {
407
+ // pretty format
408
+ folderOutput = folderBundles.map((b, idx) => {
409
+ const bundleWithSchema = {
410
+ $schema: 'https://logicstamp.dev/schemas/context/v0.1.json',
411
+ position: `${idx + 1}/${folderBundles.length}`,
412
+ ...b,
413
+ };
414
+ const header = `\n# Bundle ${idx + 1}/${folderBundles.length}: ${b.entryId}`;
415
+ return header + '\n' + JSON.stringify(bundleWithSchema, null, 2);
416
+ }).join('\n\n');
417
+ }
418
+ // Estimate tokens for this folder's context file
419
+ const folderTokenEstimate = estimateGPT4Tokens(folderOutput);
420
+ totalTokenEstimate += folderTokenEstimate;
421
+ // Write folder's context.json to output directory maintaining relative structure
422
+ const contextFileName = relativePath === '.' ? 'context.json' : join(relativePath, 'context.json');
423
+ const contextFilePath = relativePath === '.' ? 'context.json' : `${relativePath}/context.json`;
424
+ const folderContextPath = join(outputDir, contextFileName);
425
+ await mkdir(dirname(folderContextPath), { recursive: true });
426
+ await writeFile(folderContextPath, folderOutput, 'utf8');
427
+ filesWritten++;
428
+ if (!options.quiet) {
429
+ console.log(` āœ“ ${displayPath(folderContextPath)} (${folderBundles.length} bundles)`);
430
+ }
431
+ // Add to folder info array
432
+ folderInfos.push({
433
+ path: relativePath === '.' ? '.' : relativePath,
434
+ contextFile: contextFilePath,
435
+ bundles: folderBundles.length,
436
+ components: components.sort(),
437
+ isRoot,
438
+ rootLabel,
439
+ tokenEstimate: folderTokenEstimate,
440
+ });
441
+ }
442
+ // Write context_main.json as metadata index
443
+ const mainContextPath = join(outputDir, 'context_main.json');
444
+ if (!options.quiet) {
445
+ console.log(`šŸ“ Writing main context index...`);
446
+ }
447
+ // Sort folders by path for deterministic output
448
+ folderInfos.sort((a, b) => a.path.localeCompare(b.path));
449
+ // Create index structure
450
+ const index = {
451
+ type: 'LogicStampIndex',
452
+ schemaVersion: '0.1',
453
+ projectRoot: '.',
454
+ projectRootResolved: normalizedRoot,
455
+ createdAt: new Date().toISOString(),
456
+ summary: {
457
+ totalComponents: contracts.length,
458
+ totalBundles: bundles.length,
459
+ totalFolders: bundlesByFolder.size,
460
+ totalTokenEstimate,
461
+ },
462
+ folders: folderInfos,
463
+ meta: {
464
+ source: 'logicstamp-context@0.1.0',
465
+ },
466
+ };
467
+ const indexOutput = JSON.stringify(index, null, 2);
468
+ await writeFile(mainContextPath, indexOutput, 'utf8');
469
+ if (options.quiet) {
470
+ // Minimal output in quiet mode
471
+ process.stdout.write('āœ“\n');
472
+ }
473
+ else {
474
+ console.log(` āœ“ ${displayPath(mainContextPath)} (index of ${bundlesByFolder.size} folders)`);
475
+ console.log(`āœ… ${filesWritten + 1} context files written successfully`);
476
+ }
477
+ // Smart .gitignore setup with prompt and config persistence
478
+ try {
479
+ const { added, created, prompted, skipped } = await smartGitignoreSetup(projectRoot, {
480
+ skipGitignore: options.skipGitignore,
481
+ });
482
+ // Show results if prompted (first-time config) even in quiet mode, or if not quiet
483
+ if (prompted || !options.quiet) {
484
+ if (prompted) {
485
+ if (added) {
486
+ if (created) {
487
+ console.log('\nāœ… Created .gitignore with LogicStamp patterns');
488
+ }
489
+ else {
490
+ console.log('\nāœ… Added LogicStamp patterns to .gitignore');
491
+ }
492
+ }
493
+ else if (skipped) {
494
+ console.log('\nšŸ“ Skipping .gitignore setup (you can run `stamp init` later if needed)');
495
+ }
496
+ }
497
+ else if (!prompted && added) {
498
+ // Auto-added based on saved preference
499
+ if (created) {
500
+ console.log('\nšŸ“ Created .gitignore with LogicStamp patterns');
501
+ }
502
+ else {
503
+ console.log('\nšŸ“ Added LogicStamp patterns to .gitignore');
504
+ }
505
+ }
506
+ }
507
+ }
508
+ catch (error) {
509
+ // Silently ignore gitignore errors - not critical to context generation
510
+ // Users can run `stamp init` manually if needed
511
+ }
512
+ // Smart LLM_CONTEXT.md setup with prompt and config persistence
513
+ try {
514
+ const { added, prompted, skipped } = await smartLLMContextSetup(projectRoot);
515
+ // Show results if prompted (first-time config) even in quiet mode, or if not quiet
516
+ if (prompted || !options.quiet) {
517
+ if (prompted) {
518
+ if (added) {
519
+ console.log('\nāœ… Created LLM_CONTEXT.md');
520
+ }
521
+ else if (skipped) {
522
+ console.log('\nšŸ“ Skipping LLM_CONTEXT.md generation (you can run `stamp init` later if needed)');
523
+ }
524
+ }
525
+ else if (!prompted && added) {
526
+ // Auto-added based on saved preference
527
+ console.log('\nšŸ“ Created LLM_CONTEXT.md');
528
+ }
529
+ }
530
+ }
531
+ catch (error) {
532
+ // Silently ignore LLM_CONTEXT.md errors - not critical to context generation
533
+ }
534
+ }
535
+ else {
536
+ if (!options.quiet) {
537
+ console.log('šŸ” Dry run - no file written');
538
+ }
539
+ }
540
+ // Print summary (skip in quiet mode)
541
+ if (!options.quiet) {
542
+ console.log('\nšŸ“Š Summary:');
543
+ console.log(` Total components: ${contracts.length}`);
544
+ console.log(` Root components: ${manifest.graph.roots.length}`);
545
+ console.log(` Leaf components: ${manifest.graph.leaves.length}`);
546
+ console.log(` Bundles generated: ${bundles.length}`);
547
+ console.log(` Total nodes in context: ${totalNodes}`);
548
+ console.log(` Total edges: ${totalEdges}`);
549
+ console.log(` Missing dependencies: ${totalMissing}`);
550
+ console.log(`\nšŸ“ Token Estimates (${options.includeCode} mode):`);
551
+ console.log(` GPT-4o-mini: ${formatTokenCount(currentGPT4)} | Full code: ~${formatTokenCount(modeEstimates.full.gpt4)} (~${savingsGPT4}% savings)`);
552
+ console.log(` Claude: ${formatTokenCount(currentClaude)} | Full code: ~${formatTokenCount(modeEstimates.full.claude)} (~${savingsClaude}% savings)`);
553
+ console.log(`\nšŸ“Š Mode Comparison:`);
554
+ console.log(` none: ~${formatTokenCount(modeEstimates.none.gpt4)} tokens`);
555
+ console.log(` header: ~${formatTokenCount(modeEstimates.header.gpt4)} tokens`);
556
+ console.log(` full: ~${formatTokenCount(modeEstimates.full.gpt4)} tokens`);
557
+ if (totalMissing > 0) {
558
+ console.log('\nāš ļø Missing dependencies (external/third-party):');
559
+ const allMissing = new Set();
560
+ bundles.forEach(b => {
561
+ b.meta.missing.forEach(dep => allMissing.add(dep.name));
562
+ });
563
+ Array.from(allMissing).slice(0, 10).forEach(name => console.log(` - ${name}`));
564
+ if (allMissing.size > 10) {
565
+ console.log(` ... and ${allMissing.size - 10} more`);
566
+ }
567
+ }
568
+ console.log(`\nā± Completed in ${elapsed}ms`);
569
+ }
570
+ // Exit with non-zero code if --strict-missing is enabled and there are missing dependencies
571
+ if (options.strictMissing && totalMissing > 0) {
572
+ console.error(`\nāŒ Strict missing mode: ${totalMissing} missing dependencies found`);
573
+ process.exit(1);
574
+ }
575
+ }
576
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Init command - Sets up LogicStamp in a project
3
+ */
4
+ export interface InitOptions {
5
+ /** Target directory to initialize (default: current directory) */
6
+ targetDir?: string;
7
+ /** Skip gitignore setup */
8
+ skipGitignore?: boolean;
9
+ }
10
+ /**
11
+ * Initialize LogicStamp in a project directory
12
+ */
13
+ export declare function init(options?: InitOptions): Promise<void>;
14
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DnE"}