logicstamp-context 0.1.1 â 0.2.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/LLM_CONTEXT.md +4 -3
- package/README.md +116 -19
- package/dist/cli/commands/compare.d.ts.map +1 -1
- package/dist/cli/commands/compare.js +17 -8
- package/dist/cli/commands/compare.js.map +1 -1
- package/dist/cli/commands/context/bundleFormatter.d.ts +20 -0
- package/dist/cli/commands/context/bundleFormatter.d.ts.map +1 -0
- package/dist/cli/commands/context/bundleFormatter.js +55 -0
- package/dist/cli/commands/context/bundleFormatter.js.map +1 -0
- package/dist/cli/commands/context/configManager.d.ts +23 -0
- package/dist/cli/commands/context/configManager.d.ts.map +1 -0
- package/dist/cli/commands/context/configManager.js +69 -0
- package/dist/cli/commands/context/configManager.js.map +1 -0
- package/dist/cli/commands/context/contractBuilder.d.ts +18 -0
- package/dist/cli/commands/context/contractBuilder.d.ts.map +1 -0
- package/dist/cli/commands/context/contractBuilder.js +72 -0
- package/dist/cli/commands/context/contractBuilder.js.map +1 -0
- package/dist/cli/commands/context/fileWriter.d.ts +38 -0
- package/dist/cli/commands/context/fileWriter.d.ts.map +1 -0
- package/dist/cli/commands/context/fileWriter.js +165 -0
- package/dist/cli/commands/context/fileWriter.js.map +1 -0
- package/dist/cli/commands/context/statsCalculator.d.ts +44 -0
- package/dist/cli/commands/context/statsCalculator.d.ts.map +1 -0
- package/dist/cli/commands/context/statsCalculator.js +150 -0
- package/dist/cli/commands/context/statsCalculator.js.map +1 -0
- package/dist/cli/commands/context/tokenEstimator.d.ts +76 -0
- package/dist/cli/commands/context/tokenEstimator.d.ts.map +1 -0
- package/dist/cli/commands/context/tokenEstimator.js +258 -0
- package/dist/cli/commands/context/tokenEstimator.js.map +1 -0
- package/dist/cli/commands/context.d.ts +1 -0
- package/dist/cli/commands/context.d.ts.map +1 -1
- package/dist/cli/commands/context.js +72 -399
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/style.d.ts +11 -0
- package/dist/cli/commands/style.d.ts.map +1 -0
- package/dist/cli/commands/style.js +15 -0
- package/dist/cli/commands/style.js.map +1 -0
- package/dist/cli/handlers/cleanHandler.d.ts +5 -0
- package/dist/cli/handlers/cleanHandler.d.ts.map +1 -0
- package/dist/cli/handlers/cleanHandler.js +28 -0
- package/dist/cli/handlers/cleanHandler.js.map +1 -0
- package/dist/cli/handlers/compareHandler.d.ts +5 -0
- package/dist/cli/handlers/compareHandler.d.ts.map +1 -0
- package/dist/cli/handlers/compareHandler.js +332 -0
- package/dist/cli/handlers/compareHandler.js.map +1 -0
- package/dist/cli/handlers/contextHandler.d.ts +5 -0
- package/dist/cli/handlers/contextHandler.d.ts.map +1 -0
- package/dist/cli/handlers/contextHandler.js +24 -0
- package/dist/cli/handlers/contextHandler.js.map +1 -0
- package/dist/cli/handlers/initHandler.d.ts +6 -0
- package/dist/cli/handlers/initHandler.d.ts.map +1 -0
- package/dist/cli/handlers/initHandler.js +30 -0
- package/dist/cli/handlers/initHandler.js.map +1 -0
- package/dist/cli/handlers/styleHandler.d.ts +5 -0
- package/dist/cli/handlers/styleHandler.d.ts.map +1 -0
- package/dist/cli/handlers/styleHandler.js +30 -0
- package/dist/cli/handlers/styleHandler.js.map +1 -0
- package/dist/cli/handlers/validateHandler.d.ts +5 -0
- package/dist/cli/handlers/validateHandler.d.ts.map +1 -0
- package/dist/cli/handlers/validateHandler.js +23 -0
- package/dist/cli/handlers/validateHandler.js.map +1 -0
- package/dist/cli/parser/argumentParser.d.ts +44 -0
- package/dist/cli/parser/argumentParser.d.ts.map +1 -0
- package/dist/cli/parser/argumentParser.js +194 -0
- package/dist/cli/parser/argumentParser.js.map +1 -0
- package/dist/cli/parser/helpText.d.ts +11 -0
- package/dist/cli/parser/helpText.d.ts.map +1 -0
- package/dist/cli/parser/helpText.js +373 -0
- package/dist/cli/parser/helpText.js.map +1 -0
- package/dist/cli/stamp.js +14 -821
- package/dist/cli/stamp.js.map +1 -1
- package/dist/core/astParser/detectors.d.ts +24 -0
- package/dist/core/astParser/detectors.d.ts.map +1 -0
- package/dist/core/astParser/detectors.js +102 -0
- package/dist/core/astParser/detectors.js.map +1 -0
- package/dist/core/astParser/extractors/componentExtractor.d.ts +13 -0
- package/dist/core/astParser/extractors/componentExtractor.d.ts.map +1 -0
- package/dist/core/astParser/extractors/componentExtractor.js +41 -0
- package/dist/core/astParser/extractors/componentExtractor.js.map +1 -0
- package/dist/core/astParser/extractors/eventExtractor.d.ts +14 -0
- package/dist/core/astParser/extractors/eventExtractor.d.ts.map +1 -0
- package/dist/core/astParser/extractors/eventExtractor.js +49 -0
- package/dist/core/astParser/extractors/eventExtractor.js.map +1 -0
- package/dist/core/astParser/extractors/propExtractor.d.ts +14 -0
- package/dist/core/astParser/extractors/propExtractor.d.ts.map +1 -0
- package/dist/core/astParser/extractors/propExtractor.js +73 -0
- package/dist/core/astParser/extractors/propExtractor.js.map +1 -0
- package/dist/core/astParser/extractors/stateExtractor.d.ts +13 -0
- package/dist/core/astParser/extractors/stateExtractor.d.ts.map +1 -0
- package/dist/core/astParser/extractors/stateExtractor.js +66 -0
- package/dist/core/astParser/extractors/stateExtractor.js.map +1 -0
- package/dist/core/astParser.d.ts.map +1 -1
- package/dist/core/astParser.js +5 -307
- package/dist/core/astParser.js.map +1 -1
- package/dist/core/contractBuilder.d.ts +1 -0
- package/dist/core/contractBuilder.d.ts.map +1 -1
- package/dist/core/contractBuilder.js +1 -0
- package/dist/core/contractBuilder.js.map +1 -1
- package/dist/core/pack/builder.d.ts +35 -0
- package/dist/core/pack/builder.d.ts.map +1 -0
- package/dist/core/pack/builder.js +76 -0
- package/dist/core/pack/builder.js.map +1 -0
- package/dist/core/pack/collector.d.ts +20 -0
- package/dist/core/pack/collector.d.ts.map +1 -0
- package/dist/core/pack/collector.js +71 -0
- package/dist/core/pack/collector.js.map +1 -0
- package/dist/core/pack/loader.d.ts +23 -0
- package/dist/core/pack/loader.d.ts.map +1 -0
- package/dist/core/pack/loader.js +66 -0
- package/dist/core/pack/loader.js.map +1 -0
- package/dist/core/pack/resolver.d.ts +21 -0
- package/dist/core/pack/resolver.d.ts.map +1 -0
- package/dist/core/pack/resolver.js +79 -0
- package/dist/core/pack/resolver.js.map +1 -0
- package/dist/core/pack.d.ts +17 -27
- package/dist/core/pack.d.ts.map +1 -1
- package/dist/core/pack.js +18 -225
- package/dist/core/pack.js.map +1 -1
- package/dist/core/styleExtractor/index.d.ts +11 -0
- package/dist/core/styleExtractor/index.d.ts.map +1 -0
- package/dist/core/styleExtractor/index.js +11 -0
- package/dist/core/styleExtractor/index.js.map +1 -0
- package/dist/core/styleExtractor/layout.d.ts +14 -0
- package/dist/core/styleExtractor/layout.d.ts.map +1 -0
- package/dist/core/styleExtractor/layout.js +86 -0
- package/dist/core/styleExtractor/layout.js.map +1 -0
- package/dist/core/styleExtractor/motion.d.ts +20 -0
- package/dist/core/styleExtractor/motion.d.ts.map +1 -0
- package/dist/core/styleExtractor/motion.js +74 -0
- package/dist/core/styleExtractor/motion.js.map +1 -0
- package/dist/core/styleExtractor/scss.d.ts +30 -0
- package/dist/core/styleExtractor/scss.d.ts.map +1 -0
- package/dist/core/styleExtractor/scss.js +80 -0
- package/dist/core/styleExtractor/scss.js.map +1 -0
- package/dist/core/styleExtractor/styleExtractor.d.ts +11 -0
- package/dist/core/styleExtractor/styleExtractor.d.ts.map +1 -0
- package/dist/core/styleExtractor/styleExtractor.js +115 -0
- package/dist/core/styleExtractor/styleExtractor.js.map +1 -0
- package/dist/core/styleExtractor/styled.d.ts +13 -0
- package/dist/core/styleExtractor/styled.d.ts.map +1 -0
- package/dist/core/styleExtractor/styled.js +31 -0
- package/dist/core/styleExtractor/styled.js.map +1 -0
- package/dist/core/styleExtractor/tailwind.d.ts +16 -0
- package/dist/core/styleExtractor/tailwind.d.ts.map +1 -0
- package/dist/core/styleExtractor/tailwind.js +85 -0
- package/dist/core/styleExtractor/tailwind.js.map +1 -0
- package/dist/core/styleExtractor.d.ts +8 -0
- package/dist/core/styleExtractor.d.ts.map +1 -0
- package/dist/core/styleExtractor.js +8 -0
- package/dist/core/styleExtractor.js.map +1 -0
- package/dist/types/UIFContract.d.ts +71 -0
- package/dist/types/UIFContract.d.ts.map +1 -1
- package/dist/types/UIFContract.js.map +1 -1
- package/dist/utils/tokens.d.ts +18 -10
- package/dist/utils/tokens.d.ts.map +1 -1
- package/dist/utils/tokens.js +112 -10
- package/dist/utils/tokens.js.map +1 -1
- package/package.json +3 -1
- package/schema/logicstamp.context.schema.json +288 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract Builder Helper - Builds contracts from files
|
|
3
|
+
*/
|
|
4
|
+
import { buildContract } from '../../../core/contractBuilder.js';
|
|
5
|
+
import { extractFromFile } from '../../../core/astParser.js';
|
|
6
|
+
import { extractStyleMetadata } from '../../../core/styleExtractor.js';
|
|
7
|
+
import { readFileWithText } from '../../../utils/fsx.js';
|
|
8
|
+
import { Project } from 'ts-morph';
|
|
9
|
+
/**
|
|
10
|
+
* Build contracts from files
|
|
11
|
+
*/
|
|
12
|
+
export async function buildContractsFromFiles(files, options) {
|
|
13
|
+
const contracts = [];
|
|
14
|
+
let analyzed = 0;
|
|
15
|
+
let totalSourceSize = 0;
|
|
16
|
+
// Create ts-morph project for style extraction if needed
|
|
17
|
+
let styleProject;
|
|
18
|
+
if (options.includeStyle) {
|
|
19
|
+
styleProject = new Project({
|
|
20
|
+
skipAddingFilesFromTsConfig: true,
|
|
21
|
+
compilerOptions: {
|
|
22
|
+
jsx: 1, // React JSX
|
|
23
|
+
target: 99, // ESNext
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
for (const file of files) {
|
|
28
|
+
try {
|
|
29
|
+
// Extract AST from file
|
|
30
|
+
const ast = await extractFromFile(file);
|
|
31
|
+
// Build contract from AST
|
|
32
|
+
const { text } = await readFileWithText(file);
|
|
33
|
+
totalSourceSize += text.length; // Accumulate source size
|
|
34
|
+
// Extract style metadata if requested (separate layer)
|
|
35
|
+
let styleMetadata;
|
|
36
|
+
if (options.includeStyle && styleProject) {
|
|
37
|
+
try {
|
|
38
|
+
const sourceFile = styleProject.addSourceFileAtPath(file);
|
|
39
|
+
styleMetadata = await extractStyleMetadata(sourceFile, file);
|
|
40
|
+
}
|
|
41
|
+
catch (styleError) {
|
|
42
|
+
// Style extraction is optional - don't fail if it errors
|
|
43
|
+
if (!options.quiet) {
|
|
44
|
+
console.warn(` â ď¸ Style extraction failed for ${file}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const result = buildContract(file, ast, {
|
|
49
|
+
preset: 'none',
|
|
50
|
+
sourceText: text,
|
|
51
|
+
enablePredictions: options.predictBehavior,
|
|
52
|
+
styleMetadata,
|
|
53
|
+
});
|
|
54
|
+
if (result.contract) {
|
|
55
|
+
contracts.push(result.contract);
|
|
56
|
+
analyzed++;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// Skip files that can't be analyzed
|
|
61
|
+
if (!options.quiet) {
|
|
62
|
+
console.warn(` â ď¸ Skipped ${file}: ${error.message}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
contracts,
|
|
68
|
+
analyzed,
|
|
69
|
+
totalSourceSize,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=contractBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contractBuilder.js","sourceRoot":"","sources":["../../../../src/cli/commands/context/contractBuilder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAQnC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAe,EACf,OAIC;IAED,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,yDAAyD;IACzD,IAAI,YAAiC,CAAC;IACtC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,YAAY,GAAG,IAAI,OAAO,CAAC;YACzB,2BAA2B,EAAE,IAAI;YACjC,eAAe,EAAE;gBACf,GAAG,EAAE,CAAC,EAAE,YAAY;gBACpB,MAAM,EAAE,EAAE,EAAE,SAAS;aACtB;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAExC,0BAA0B;YAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC9C,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,yBAAyB;YAEzD,uDAAuD;YACvD,IAAI,aAAa,CAAC;YAClB,IAAI,OAAO,CAAC,YAAY,IAAI,YAAY,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;oBAC1D,aAAa,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBAC/D,CAAC;gBAAC,OAAO,UAAU,EAAE,CAAC;oBACpB,yDAAyD;oBACzD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wBACnB,OAAO,CAAC,IAAI,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE;gBACtC,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,IAAI;gBAChB,iBAAiB,EAAE,OAAO,CAAC,eAAe;gBAC1C,aAAa;aACd,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAChC,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oCAAoC;YACpC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,kBAAkB,IAAI,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS;QACT,QAAQ;QACR,eAAe;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Writer - Handles writing context files to disk
|
|
3
|
+
*/
|
|
4
|
+
import type { LogicStampBundle, FolderInfo } from '../../../core/pack.js';
|
|
5
|
+
/**
|
|
6
|
+
* Normalize path for display (convert backslashes to forward slashes)
|
|
7
|
+
*/
|
|
8
|
+
export declare function displayPath(path: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Detect if a folder is a root (application entry point) and assign a label
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectRootFolder(relativePath: string, components: string[]): {
|
|
13
|
+
isRoot: boolean;
|
|
14
|
+
rootLabel?: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Group bundles by folder
|
|
18
|
+
*/
|
|
19
|
+
export declare function groupBundlesByFolder(bundles: LogicStampBundle[]): Map<string, LogicStampBundle[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Write context files for all folders
|
|
22
|
+
*/
|
|
23
|
+
export declare function writeContextFiles(bundles: LogicStampBundle[], outputDir: string, projectRoot: string, options: {
|
|
24
|
+
format: 'json' | 'pretty' | 'ndjson';
|
|
25
|
+
quiet?: boolean;
|
|
26
|
+
}): Promise<{
|
|
27
|
+
filesWritten: number;
|
|
28
|
+
folderInfos: FolderInfo[];
|
|
29
|
+
totalTokenEstimate: number;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Write main context index file
|
|
33
|
+
*/
|
|
34
|
+
export declare function writeMainIndex(outputDir: string, folderInfos: FolderInfo[], contracts: unknown[], bundles: LogicStampBundle[], bundlesByFolderSize: number, totalTokenEstimate: number, projectRoot: string, options: {
|
|
35
|
+
quiet?: boolean;
|
|
36
|
+
suppressSuccessIndicator?: boolean;
|
|
37
|
+
}): Promise<void>;
|
|
38
|
+
//# sourceMappingURL=fileWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileWriter.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/context/fileWriter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAmB,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAK3F;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAsCpH;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAcjG;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IACP,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAC,CAkE1F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,UAAU,EAAE,EACzB,SAAS,EAAE,OAAO,EAAE,EACpB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,mBAAmB,EAAE,MAAM,EAC3B,kBAAkB,EAAE,MAAM,EAC1B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GACA,OAAO,CAAC,IAAI,CAAC,CAsCf"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Writer - Handles writing context files to disk
|
|
3
|
+
*/
|
|
4
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
5
|
+
import { dirname, join } from 'node:path';
|
|
6
|
+
import { getFolderPath, normalizeEntryId } from '../../../utils/fsx.js';
|
|
7
|
+
import { estimateGPT4Tokens } from '../../../utils/tokens.js';
|
|
8
|
+
import { formatBundlesForFolder } from './bundleFormatter.js';
|
|
9
|
+
/**
|
|
10
|
+
* Normalize path for display (convert backslashes to forward slashes)
|
|
11
|
+
*/
|
|
12
|
+
export function displayPath(path) {
|
|
13
|
+
return path.replace(/\\/g, '/');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Detect if a folder is a root (application entry point) and assign a label
|
|
17
|
+
*/
|
|
18
|
+
export function detectRootFolder(relativePath, components) {
|
|
19
|
+
// Project root is always a root
|
|
20
|
+
if (relativePath === '.') {
|
|
21
|
+
return { isRoot: true, rootLabel: 'Project Root' };
|
|
22
|
+
}
|
|
23
|
+
// Detect common application entry points
|
|
24
|
+
const pathLower = relativePath.toLowerCase();
|
|
25
|
+
// Next.js app router
|
|
26
|
+
if (pathLower.includes('/app') && components.some(c => c === 'page.tsx' || c === 'layout.tsx')) {
|
|
27
|
+
return { isRoot: true, rootLabel: 'Next.js App' };
|
|
28
|
+
}
|
|
29
|
+
// Examples folder
|
|
30
|
+
if (pathLower.startsWith('examples/') && pathLower.endsWith('/src')) {
|
|
31
|
+
const exampleName = relativePath.split('/')[1];
|
|
32
|
+
return { isRoot: true, rootLabel: `Example: ${exampleName}` };
|
|
33
|
+
}
|
|
34
|
+
// Test fixtures
|
|
35
|
+
if (pathLower.includes('tests/fixtures/') && pathLower.endsWith('/src')) {
|
|
36
|
+
return { isRoot: true, rootLabel: 'Test Fixture' };
|
|
37
|
+
}
|
|
38
|
+
// Root src folder
|
|
39
|
+
if (relativePath === 'src') {
|
|
40
|
+
return { isRoot: true, rootLabel: 'Main Source' };
|
|
41
|
+
}
|
|
42
|
+
// Apps folder (monorepo pattern)
|
|
43
|
+
if (pathLower.startsWith('apps/')) {
|
|
44
|
+
const appName = relativePath.split('/')[1];
|
|
45
|
+
return { isRoot: true, rootLabel: `App: ${appName}` };
|
|
46
|
+
}
|
|
47
|
+
// Default: not a root
|
|
48
|
+
return { isRoot: false };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Group bundles by folder
|
|
52
|
+
*/
|
|
53
|
+
export function groupBundlesByFolder(bundles) {
|
|
54
|
+
const bundlesByFolder = new Map();
|
|
55
|
+
for (const bundle of bundles) {
|
|
56
|
+
const folderPath = getFolderPath(bundle.entryId);
|
|
57
|
+
if (!bundlesByFolder.has(folderPath)) {
|
|
58
|
+
bundlesByFolder.set(folderPath, []);
|
|
59
|
+
}
|
|
60
|
+
bundlesByFolder.get(folderPath).push(bundle);
|
|
61
|
+
}
|
|
62
|
+
return bundlesByFolder;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Write context files for all folders
|
|
66
|
+
*/
|
|
67
|
+
export async function writeContextFiles(bundles, outputDir, projectRoot, options) {
|
|
68
|
+
const bundlesByFolder = groupBundlesByFolder(bundles);
|
|
69
|
+
const normalizedRoot = normalizeEntryId(projectRoot);
|
|
70
|
+
const folderInfos = [];
|
|
71
|
+
let filesWritten = 0;
|
|
72
|
+
let totalTokenEstimate = 0;
|
|
73
|
+
if (!options.quiet) {
|
|
74
|
+
console.log(`đ Writing context files for ${bundlesByFolder.size} folders...`);
|
|
75
|
+
}
|
|
76
|
+
for (const [folderPath, folderBundles] of bundlesByFolder) {
|
|
77
|
+
// Sort bundles for deterministic output
|
|
78
|
+
folderBundles.sort((a, b) => a.entryId.localeCompare(b.entryId));
|
|
79
|
+
// Calculate relative path from project root
|
|
80
|
+
let relativePath;
|
|
81
|
+
if (folderPath === normalizedRoot) {
|
|
82
|
+
relativePath = '.';
|
|
83
|
+
}
|
|
84
|
+
else if (folderPath.startsWith(normalizedRoot + '/')) {
|
|
85
|
+
relativePath = folderPath.substring(normalizedRoot.length + 1);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
relativePath = folderPath;
|
|
89
|
+
}
|
|
90
|
+
// Extract component file names from bundle entryIds
|
|
91
|
+
const components = folderBundles.map(b => {
|
|
92
|
+
const normalized = normalizeEntryId(b.entryId);
|
|
93
|
+
const lastSlash = normalized.lastIndexOf('/');
|
|
94
|
+
return lastSlash !== -1 ? normalized.substring(lastSlash + 1) : normalized;
|
|
95
|
+
});
|
|
96
|
+
// Detect if this is a root folder
|
|
97
|
+
const { isRoot, rootLabel } = detectRootFolder(relativePath, components);
|
|
98
|
+
// Format bundles for this folder
|
|
99
|
+
const folderOutput = formatBundlesForFolder(folderBundles, options.format);
|
|
100
|
+
// Estimate tokens for this folder's context file
|
|
101
|
+
const folderTokenEstimate = await estimateGPT4Tokens(folderOutput);
|
|
102
|
+
totalTokenEstimate += folderTokenEstimate;
|
|
103
|
+
// Write folder's context.json to output directory maintaining relative structure
|
|
104
|
+
const contextFileName = relativePath === '.' ? 'context.json' : join(relativePath, 'context.json');
|
|
105
|
+
const contextFilePath = relativePath === '.' ? 'context.json' : `${relativePath}/context.json`;
|
|
106
|
+
const folderContextPath = join(outputDir, contextFileName);
|
|
107
|
+
await mkdir(dirname(folderContextPath), { recursive: true });
|
|
108
|
+
await writeFile(folderContextPath, folderOutput, 'utf8');
|
|
109
|
+
filesWritten++;
|
|
110
|
+
if (!options.quiet) {
|
|
111
|
+
console.log(` â ${displayPath(folderContextPath)} (${folderBundles.length} bundles)`);
|
|
112
|
+
}
|
|
113
|
+
// Add to folder info array
|
|
114
|
+
folderInfos.push({
|
|
115
|
+
path: relativePath === '.' ? '.' : relativePath,
|
|
116
|
+
contextFile: contextFilePath,
|
|
117
|
+
bundles: folderBundles.length,
|
|
118
|
+
components: components.sort(),
|
|
119
|
+
isRoot,
|
|
120
|
+
rootLabel,
|
|
121
|
+
tokenEstimate: folderTokenEstimate,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return { filesWritten, folderInfos, totalTokenEstimate };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Write main context index file
|
|
128
|
+
*/
|
|
129
|
+
export async function writeMainIndex(outputDir, folderInfos, contracts, bundles, bundlesByFolderSize, totalTokenEstimate, projectRoot, options) {
|
|
130
|
+
const mainContextPath = join(outputDir, 'context_main.json');
|
|
131
|
+
const normalizedRoot = normalizeEntryId(projectRoot);
|
|
132
|
+
if (!options.quiet) {
|
|
133
|
+
console.log(`đ Writing main context index...`);
|
|
134
|
+
}
|
|
135
|
+
// Sort folders by path for deterministic output
|
|
136
|
+
folderInfos.sort((a, b) => a.path.localeCompare(b.path));
|
|
137
|
+
// Create index structure
|
|
138
|
+
const index = {
|
|
139
|
+
type: 'LogicStampIndex',
|
|
140
|
+
schemaVersion: '0.1',
|
|
141
|
+
projectRoot: '.',
|
|
142
|
+
projectRootResolved: normalizedRoot,
|
|
143
|
+
createdAt: new Date().toISOString(),
|
|
144
|
+
summary: {
|
|
145
|
+
totalComponents: contracts.length,
|
|
146
|
+
totalBundles: bundles.length,
|
|
147
|
+
totalFolders: bundlesByFolderSize,
|
|
148
|
+
totalTokenEstimate,
|
|
149
|
+
},
|
|
150
|
+
folders: folderInfos,
|
|
151
|
+
meta: {
|
|
152
|
+
source: 'logicstamp-context@0.1.1',
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
const indexOutput = JSON.stringify(index, null, 2);
|
|
156
|
+
await writeFile(mainContextPath, indexOutput, 'utf8');
|
|
157
|
+
if (options.quiet && !options.suppressSuccessIndicator) {
|
|
158
|
+
// Minimal output in quiet mode (unless suppressed for internal calls)
|
|
159
|
+
process.stdout.write('â\n');
|
|
160
|
+
}
|
|
161
|
+
else if (!options.quiet) {
|
|
162
|
+
console.log(` â ${displayPath(mainContextPath)} (index of ${bundlesByFolderSize} folders)`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=fileWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileWriter.js","sourceRoot":"","sources":["../../../../src/cli/commands/context/fileWriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stats Calculator - Calculates bundle statistics
|
|
3
|
+
*/
|
|
4
|
+
import type { LogicStampBundle } from '../../../core/pack.js';
|
|
5
|
+
import type { UIFContract } from '../../../types/UIFContract.js';
|
|
6
|
+
import type { ProjectManifest } from '../../../core/manifest.js';
|
|
7
|
+
import type { TokenEstimates } from './tokenEstimator.js';
|
|
8
|
+
export interface BundleStats {
|
|
9
|
+
totalNodes: number;
|
|
10
|
+
totalEdges: number;
|
|
11
|
+
totalMissing: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Calculate bundle statistics
|
|
15
|
+
*/
|
|
16
|
+
export declare function calculateStats(bundles: LogicStampBundle[]): BundleStats;
|
|
17
|
+
/**
|
|
18
|
+
* Generate stats output for --stats flag (CI-friendly JSON)
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateStatsOutput(contracts: UIFContract[], manifest: ProjectManifest, bundles: LogicStampBundle[], stats: BundleStats, tokenEstimates: TokenEstimates, elapsed: number): object;
|
|
21
|
+
/**
|
|
22
|
+
* Generate summary output for console
|
|
23
|
+
* Uses accurate token counting (regenerates contracts) like --compare-modes
|
|
24
|
+
*/
|
|
25
|
+
export declare function generateSummary(contracts: UIFContract[], manifest: ProjectManifest, bundles: LogicStampBundle[], stats: BundleStats, tokenEstimates: TokenEstimates, options: {
|
|
26
|
+
includeCode: 'none' | 'header' | 'full';
|
|
27
|
+
includeStyle?: boolean;
|
|
28
|
+
files: string[];
|
|
29
|
+
projectRoot: string;
|
|
30
|
+
currentGPT4: number;
|
|
31
|
+
currentClaude: number;
|
|
32
|
+
totalSourceSize: number;
|
|
33
|
+
packOptions: {
|
|
34
|
+
depth: number;
|
|
35
|
+
maxNodes: number;
|
|
36
|
+
format: 'json' | 'pretty' | 'ndjson';
|
|
37
|
+
hashLock: boolean;
|
|
38
|
+
strict: boolean;
|
|
39
|
+
allowMissing: boolean;
|
|
40
|
+
predictBehavior: boolean;
|
|
41
|
+
};
|
|
42
|
+
quiet?: boolean;
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
//# sourceMappingURL=statsCalculator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statsCalculator.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/context/statsCalculator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,WAAW,CAUvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,WAAW,EAAE,EACxB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,MAAM,GACd,MAAM,CAoBR;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,WAAW,EAAE,EACxB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE;IACP,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACrC,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,YAAY,EAAE,OAAO,CAAC;QACtB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CA4Gf"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stats Calculator - Calculates bundle statistics
|
|
3
|
+
*/
|
|
4
|
+
import { formatTokenCount, getTokenizerStatus } from '../../../utils/tokens.js';
|
|
5
|
+
/**
|
|
6
|
+
* Calculate bundle statistics
|
|
7
|
+
*/
|
|
8
|
+
export function calculateStats(bundles) {
|
|
9
|
+
const totalNodes = bundles.reduce((sum, b) => sum + b.graph.nodes.length, 0);
|
|
10
|
+
const totalEdges = bundles.reduce((sum, b) => sum + b.graph.edges.length, 0);
|
|
11
|
+
const totalMissing = bundles.reduce((sum, b) => sum + b.meta.missing.length, 0);
|
|
12
|
+
return {
|
|
13
|
+
totalNodes,
|
|
14
|
+
totalEdges,
|
|
15
|
+
totalMissing,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate stats output for --stats flag (CI-friendly JSON)
|
|
20
|
+
*/
|
|
21
|
+
export function generateStatsOutput(contracts, manifest, bundles, stats, tokenEstimates, elapsed) {
|
|
22
|
+
return {
|
|
23
|
+
totalComponents: contracts.length,
|
|
24
|
+
rootComponents: manifest.graph.roots.length,
|
|
25
|
+
leafComponents: manifest.graph.leaves.length,
|
|
26
|
+
bundlesGenerated: bundles.length,
|
|
27
|
+
totalNodes: stats.totalNodes,
|
|
28
|
+
totalEdges: stats.totalEdges,
|
|
29
|
+
missingDependencies: stats.totalMissing,
|
|
30
|
+
tokensGPT4: tokenEstimates.currentGPT4,
|
|
31
|
+
tokensClaude: tokenEstimates.currentClaude,
|
|
32
|
+
modeEstimates: {
|
|
33
|
+
none: { gpt4: tokenEstimates.modeEstimates.none.gpt4, claude: tokenEstimates.modeEstimates.none.claude },
|
|
34
|
+
header: { gpt4: tokenEstimates.modeEstimates.header.gpt4, claude: tokenEstimates.modeEstimates.header.claude },
|
|
35
|
+
full: { gpt4: tokenEstimates.modeEstimates.full.gpt4, claude: tokenEstimates.modeEstimates.full.claude },
|
|
36
|
+
},
|
|
37
|
+
savingsGPT4: tokenEstimates.savingsGPT4,
|
|
38
|
+
savingsClaude: tokenEstimates.savingsClaude,
|
|
39
|
+
elapsedMs: elapsed,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Generate summary output for console
|
|
44
|
+
* Uses accurate token counting (regenerates contracts) like --compare-modes
|
|
45
|
+
*/
|
|
46
|
+
export async function generateSummary(contracts, manifest, bundles, stats, tokenEstimates, options) {
|
|
47
|
+
console.log('\nđ Summary:');
|
|
48
|
+
console.log(` Total components: ${contracts.length}`);
|
|
49
|
+
console.log(` Root components: ${manifest.graph.roots.length}`);
|
|
50
|
+
console.log(` Leaf components: ${manifest.graph.leaves.length}`);
|
|
51
|
+
console.log(` Bundles generated: ${bundles.length}`);
|
|
52
|
+
console.log(` Total nodes in context: ${stats.totalNodes}`);
|
|
53
|
+
console.log(` Total edges: ${stats.totalEdges}`);
|
|
54
|
+
console.log(` Missing dependencies: ${stats.totalMissing}`);
|
|
55
|
+
// Determine mode label
|
|
56
|
+
const hasStyle = options.includeStyle === true;
|
|
57
|
+
const isHeaderMode = options.includeCode === 'header';
|
|
58
|
+
let modeLabel;
|
|
59
|
+
if (isHeaderMode && hasStyle) {
|
|
60
|
+
modeLabel = 'header+style';
|
|
61
|
+
}
|
|
62
|
+
else if (isHeaderMode && !hasStyle) {
|
|
63
|
+
modeLabel = 'header';
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
modeLabel = options.includeCode === 'full' ? 'full+style' : options.includeCode;
|
|
67
|
+
}
|
|
68
|
+
// Calculate header token estimates (use estimates for performance, accurate regeneration only in --compare-modes)
|
|
69
|
+
let headerNoStyleGPT4;
|
|
70
|
+
let headerNoStyleClaude;
|
|
71
|
+
let headerWithStyleGPT4;
|
|
72
|
+
let headerWithStyleClaude;
|
|
73
|
+
if (isHeaderMode && hasStyle) {
|
|
74
|
+
// Current output IS header+style, estimate header without style
|
|
75
|
+
headerNoStyleGPT4 = Math.ceil(options.currentGPT4 * 0.88); // Style typically adds ~12%
|
|
76
|
+
headerNoStyleClaude = Math.ceil(options.currentClaude * 0.88);
|
|
77
|
+
headerWithStyleGPT4 = options.currentGPT4;
|
|
78
|
+
headerWithStyleClaude = options.currentClaude;
|
|
79
|
+
}
|
|
80
|
+
else if (isHeaderMode && !hasStyle) {
|
|
81
|
+
// Current output IS header without style, estimate header+style
|
|
82
|
+
headerNoStyleGPT4 = options.currentGPT4;
|
|
83
|
+
headerNoStyleClaude = options.currentClaude;
|
|
84
|
+
headerWithStyleGPT4 = Math.ceil(options.currentGPT4 * 1.14); // Style adds ~14%
|
|
85
|
+
headerWithStyleClaude = Math.ceil(options.currentClaude * 1.14);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// For non-header modes, use estimates
|
|
89
|
+
headerNoStyleGPT4 = Math.ceil(options.currentGPT4 * 0.75);
|
|
90
|
+
headerNoStyleClaude = Math.ceil(options.currentClaude * 0.75);
|
|
91
|
+
headerWithStyleGPT4 = Math.ceil(options.currentGPT4 * 0.85);
|
|
92
|
+
headerWithStyleClaude = Math.ceil(options.currentClaude * 0.85);
|
|
93
|
+
}
|
|
94
|
+
// Calculate savings percentages vs raw source
|
|
95
|
+
const headerSavingsGPT4 = tokenEstimates.sourceTokensGPT4 > 0
|
|
96
|
+
? ((tokenEstimates.sourceTokensGPT4 - headerNoStyleGPT4) / tokenEstimates.sourceTokensGPT4 * 100).toFixed(0)
|
|
97
|
+
: '0';
|
|
98
|
+
const headerStyleSavingsGPT4 = tokenEstimates.sourceTokensGPT4 > 0
|
|
99
|
+
? ((tokenEstimates.sourceTokensGPT4 - headerWithStyleGPT4) / tokenEstimates.sourceTokensGPT4 * 100).toFixed(0)
|
|
100
|
+
: '0';
|
|
101
|
+
// Check tokenizer status and display it
|
|
102
|
+
const tokenizerStatus = await getTokenizerStatus();
|
|
103
|
+
const gpt4Method = tokenizerStatus.gpt4 ? 'tiktoken' : 'approximation';
|
|
104
|
+
const claudeMethod = tokenizerStatus.claude ? 'tokenizer' : 'approximation';
|
|
105
|
+
console.log(`\nđ Token Estimates (${modeLabel} mode):`);
|
|
106
|
+
console.log(` Token estimation: GPT-4o (${gpt4Method}) | Claude (${claudeMethod})`);
|
|
107
|
+
if (!tokenizerStatus.gpt4 || !tokenizerStatus.claude) {
|
|
108
|
+
const missing = [];
|
|
109
|
+
if (!tokenizerStatus.gpt4) {
|
|
110
|
+
missing.push('@dqbd/tiktoken (GPT-4)');
|
|
111
|
+
}
|
|
112
|
+
if (!tokenizerStatus.claude) {
|
|
113
|
+
missing.push('@anthropic-ai/tokenizer (Claude)');
|
|
114
|
+
}
|
|
115
|
+
console.log(` đĄ Tip: Install ${missing.join(' and/or ')} for accurate token counts`);
|
|
116
|
+
}
|
|
117
|
+
console.log(` â ď¸ Current mode = tokenizer-based.`);
|
|
118
|
+
console.log(` Other modes / raw source = heuristic.`);
|
|
119
|
+
console.log(` For precise per-mode breakdown, use "stamp context --compare-modes".`);
|
|
120
|
+
console.log(` GPT-4o-mini: ${formatTokenCount(tokenEstimates.currentGPT4)} tokens`);
|
|
121
|
+
console.log(` Claude: ${formatTokenCount(tokenEstimates.currentClaude)} tokens`);
|
|
122
|
+
console.log(`\n Comparison:`);
|
|
123
|
+
console.log(` Mode | Tokens GPT-4o | Tokens Claude | Savings vs Raw Source`);
|
|
124
|
+
console.log(` -------------|---------------|---------------|------------------------`);
|
|
125
|
+
console.log(` Raw source | ${formatTokenCount(tokenEstimates.sourceTokensGPT4).padStart(13)} | ${formatTokenCount(tokenEstimates.sourceTokensClaude).padStart(13)} | 0%`);
|
|
126
|
+
console.log(` Header | ${formatTokenCount(headerNoStyleGPT4).padStart(13)} | ${formatTokenCount(headerNoStyleClaude).padStart(13)} | ${headerSavingsGPT4}%`);
|
|
127
|
+
console.log(` Header+style | ${formatTokenCount(headerWithStyleGPT4).padStart(13)} | ${formatTokenCount(headerWithStyleClaude).padStart(13)} | ${headerStyleSavingsGPT4}%`);
|
|
128
|
+
console.log(`\n Full context (code+style): ~${formatTokenCount(tokenEstimates.modeEstimates.full.gpt4)} GPT-4o-mini / ~${formatTokenCount(tokenEstimates.modeEstimates.full.claude)} Claude`);
|
|
129
|
+
console.log(`\nđ Current Mode Comparison:`);
|
|
130
|
+
console.log(` â ď¸ Current mode = tokenizer-based.`);
|
|
131
|
+
console.log(` Other modes / raw source = heuristic.`);
|
|
132
|
+
console.log(` For precise per-mode breakdown, use "stamp context --compare-modes".`);
|
|
133
|
+
console.log(` none: ~${formatTokenCount(tokenEstimates.modeEstimates.none.gpt4)} tokens`);
|
|
134
|
+
// Show current mode with honest labeling - reflects actual mode (header or header+style)
|
|
135
|
+
const currentModeLabel = modeLabel;
|
|
136
|
+
console.log(` ${currentModeLabel.padEnd(13)} ~${formatTokenCount(tokenEstimates.currentGPT4)} tokens`);
|
|
137
|
+
console.log(` full: ~${formatTokenCount(tokenEstimates.modeEstimates.full.gpt4)} tokens`);
|
|
138
|
+
if (stats.totalMissing > 0) {
|
|
139
|
+
console.log('\nâ ď¸ Missing dependencies (external/third-party):');
|
|
140
|
+
const allMissing = new Set();
|
|
141
|
+
bundles.forEach(b => {
|
|
142
|
+
b.meta.missing.forEach(dep => allMissing.add(dep.name));
|
|
143
|
+
});
|
|
144
|
+
Array.from(allMissing).slice(0, 10).forEach(name => console.log(` - ${name}`));
|
|
145
|
+
if (allMissing.size > 10) {
|
|
146
|
+
console.log(` ... and ${allMissing.size - 10} more`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=statsCalculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statsCalculator.js","sourceRoot":"","sources":["../../../../src/cli/commands/context/statsCalculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Estimator - Calculates token counts and mode comparisons
|
|
3
|
+
*/
|
|
4
|
+
import type { ProjectManifest } from '../../../core/manifest.js';
|
|
5
|
+
export interface TokenEstimates {
|
|
6
|
+
currentGPT4: number;
|
|
7
|
+
currentClaude: number;
|
|
8
|
+
sourceTokensGPT4: number;
|
|
9
|
+
sourceTokensClaude: number;
|
|
10
|
+
modeEstimates: {
|
|
11
|
+
none: {
|
|
12
|
+
gpt4: number;
|
|
13
|
+
claude: number;
|
|
14
|
+
};
|
|
15
|
+
header: {
|
|
16
|
+
gpt4: number;
|
|
17
|
+
claude: number;
|
|
18
|
+
};
|
|
19
|
+
full: {
|
|
20
|
+
gpt4: number;
|
|
21
|
+
claude: number;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
savingsGPT4: string;
|
|
25
|
+
savingsClaude: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ModeComparisonResult {
|
|
28
|
+
headerNoStyleGPT4: number;
|
|
29
|
+
headerNoStyleClaude: number;
|
|
30
|
+
headerWithStyleGPT4: number;
|
|
31
|
+
headerWithStyleClaude: number;
|
|
32
|
+
sourceTokensGPT4: number;
|
|
33
|
+
sourceTokensClaude: number;
|
|
34
|
+
modeEstimates: {
|
|
35
|
+
none: {
|
|
36
|
+
gpt4: number;
|
|
37
|
+
claude: number;
|
|
38
|
+
};
|
|
39
|
+
header: {
|
|
40
|
+
gpt4: number;
|
|
41
|
+
claude: number;
|
|
42
|
+
};
|
|
43
|
+
headerStyle: {
|
|
44
|
+
gpt4: number;
|
|
45
|
+
claude: number;
|
|
46
|
+
};
|
|
47
|
+
full: {
|
|
48
|
+
gpt4: number;
|
|
49
|
+
claude: number;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Calculate token estimates for current output
|
|
55
|
+
*/
|
|
56
|
+
export declare function calculateTokenEstimates(output: string, totalSourceSize: number, currentGPT4: number, currentClaude: number): Promise<TokenEstimates>;
|
|
57
|
+
/**
|
|
58
|
+
* Generate mode comparison by rebuilding contracts with/without style
|
|
59
|
+
*/
|
|
60
|
+
export declare function generateModeComparison(files: string[], manifest: ProjectManifest, projectRoot: string, currentGPT4: number, currentClaude: number, totalSourceSize: number, options: {
|
|
61
|
+
includeCode: 'none' | 'header' | 'full';
|
|
62
|
+
includeStyle?: boolean;
|
|
63
|
+
depth: number;
|
|
64
|
+
maxNodes: number;
|
|
65
|
+
format: 'json' | 'pretty' | 'ndjson';
|
|
66
|
+
hashLock: boolean;
|
|
67
|
+
strict: boolean;
|
|
68
|
+
allowMissing: boolean;
|
|
69
|
+
predictBehavior: boolean;
|
|
70
|
+
quiet?: boolean;
|
|
71
|
+
}): Promise<ModeComparisonResult>;
|
|
72
|
+
/**
|
|
73
|
+
* Display mode comparison table
|
|
74
|
+
*/
|
|
75
|
+
export declare function displayModeComparison(comparison: ModeComparisonResult, elapsed: number): Promise<void>;
|
|
76
|
+
//# sourceMappingURL=tokenEstimator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenEstimator.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/context/tokenEstimator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAUjE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE;QACb,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACvC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACzC,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KACxC,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE;QACb,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACvC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACzC,WAAW,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9C,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KACxC,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,CAAC,CAyCzB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE;IACP,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC,oBAAoB,CAAC,CA6K/B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,oBAAoB,EAChC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAwDf"}
|