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.
- package/LICENSE +21 -0
- package/LLM_CONTEXT.md +260 -0
- package/README.md +949 -0
- package/dist/cli/commands/clean.d.ts +15 -0
- package/dist/cli/commands/clean.d.ts.map +1 -0
- package/dist/cli/commands/clean.js +142 -0
- package/dist/cli/commands/clean.js.map +1 -0
- package/dist/cli/commands/compare.d.ts +88 -0
- package/dist/cli/commands/compare.d.ts.map +1 -0
- package/dist/cli/commands/compare.js +519 -0
- package/dist/cli/commands/compare.js.map +1 -0
- package/dist/cli/commands/context.d.ts +24 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +576 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/init.d.ts +14 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +71 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +52 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +368 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +223 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/stamp.d.ts +7 -0
- package/dist/cli/stamp.d.ts.map +1 -0
- package/dist/cli/stamp.js +961 -0
- package/dist/cli/stamp.js.map +1 -0
- package/dist/cli/validate-index.d.ts +7 -0
- package/dist/cli/validate-index.d.ts.map +1 -0
- package/dist/cli/validate-index.js +55 -0
- package/dist/cli/validate-index.js.map +1 -0
- package/dist/core/astParser.d.ts +47 -0
- package/dist/core/astParser.d.ts.map +1 -0
- package/dist/core/astParser.js +417 -0
- package/dist/core/astParser.js.map +1 -0
- package/dist/core/contractBuilder.d.ts +48 -0
- package/dist/core/contractBuilder.d.ts.map +1 -0
- package/dist/core/contractBuilder.js +120 -0
- package/dist/core/contractBuilder.js.map +1 -0
- package/dist/core/manifest.d.ts +75 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +173 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/pack.d.ts +190 -0
- package/dist/core/pack.d.ts.map +1 -0
- package/dist/core/pack.js +438 -0
- package/dist/core/pack.js.map +1 -0
- package/dist/core/signature.d.ts +47 -0
- package/dist/core/signature.d.ts.map +1 -0
- package/dist/core/signature.js +208 -0
- package/dist/core/signature.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/types/UIFContract.d.ts +112 -0
- package/dist/types/UIFContract.d.ts.map +1 -0
- package/dist/types/UIFContract.js +36 -0
- package/dist/types/UIFContract.js.map +1 -0
- package/dist/utils/config.d.ts +34 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +62 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fsx.d.ts +85 -0
- package/dist/utils/fsx.d.ts.map +1 -0
- package/dist/utils/fsx.js +181 -0
- package/dist/utils/fsx.js.map +1 -0
- package/dist/utils/gitignore.d.ts +62 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +183 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/hash.d.ts +73 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +159 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/llmContext.d.ts +34 -0
- package/dist/utils/llmContext.d.ts.map +1 -0
- package/dist/utils/llmContext.js +136 -0
- package/dist/utils/llmContext.js.map +1 -0
- package/dist/utils/tokens.d.ts +23 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +29 -0
- package/dist/utils/tokens.js.map +1 -0
- package/package.json +69 -0
- 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"}
|