logicstamp-context 0.8.2 → 0.8.4
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 -21
- package/LLM_CONTEXT.md +703 -703
- package/README.md +404 -459
- package/dist/cli/commands/clean.d.ts.map +1 -1
- package/dist/cli/commands/clean.js +1 -6
- package/dist/cli/commands/clean.js.map +1 -1
- package/dist/cli/commands/context/fileWriter.js +2 -2
- package/dist/cli/commands/context/fileWriter.js.map +1 -1
- package/dist/cli/commands/context/statsCalculator.d.ts +3 -2
- package/dist/cli/commands/context/statsCalculator.d.ts.map +1 -1
- package/dist/cli/commands/context/statsCalculator.js +45 -104
- package/dist/cli/commands/context/statsCalculator.js.map +1 -1
- package/dist/cli/commands/context/watchMode/watchMode.d.ts.map +1 -1
- package/dist/cli/commands/context/watchMode/watchMode.js +124 -39
- package/dist/cli/commands/context/watchMode/watchMode.js.map +1 -1
- package/dist/cli/commands/init.js +20 -20
- package/dist/cli/commands/security.js +3 -3
- package/dist/cli/commands/security.js.map +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +1 -6
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/handlers/initHandler.js +5 -5
- package/dist/cli/index.d.ts +6 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +100 -96
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/parser/helpText.js +570 -570
- package/dist/cli/validate-index.js +26 -26
- package/dist/core/astParser/detectors.d.ts.map +1 -1
- package/dist/core/astParser/detectors.js +3 -2
- package/dist/core/astParser/detectors.js.map +1 -1
- package/dist/core/pack/loader.js +3 -3
- package/dist/core/pack/loader.js.map +1 -1
- package/dist/utils/codeSanitizer.d.ts.map +1 -1
- package/dist/utils/codeSanitizer.js +3 -2
- package/dist/utils/codeSanitizer.js.map +1 -1
- package/dist/utils/fsx.d.ts +5 -0
- package/dist/utils/fsx.d.ts.map +1 -1
- package/dist/utils/fsx.js +9 -2
- package/dist/utils/fsx.js.map +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +2 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/gitignore.d.ts.map +1 -1
- package/dist/utils/gitignore.js +2 -1
- package/dist/utils/gitignore.js.map +1 -1
- package/dist/utils/secretDetector.d.ts.map +1 -1
- package/dist/utils/secretDetector.js +17 -10
- package/dist/utils/secretDetector.js.map +1 -1
- package/package.json +85 -84
- package/schema/logicstamp.context.schema.json +1250 -1250
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/clean.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/clean.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAqED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FvE"}
|
|
@@ -7,13 +7,8 @@ import { glob } from 'glob';
|
|
|
7
7
|
import { unlink, rm, stat } from 'node:fs/promises';
|
|
8
8
|
import { resolve, join, relative } from 'node:path';
|
|
9
9
|
import { fileExists, normalizeEntryId } from '../../utils/fsx.js';
|
|
10
|
+
import { displayPath } from './context/index.js';
|
|
10
11
|
const GLOB_IGNORE = ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.next/**'];
|
|
11
|
-
/**
|
|
12
|
-
* Normalize path for display (convert backslashes to forward slashes)
|
|
13
|
-
*/
|
|
14
|
-
function displayPath(path) {
|
|
15
|
-
return path.replace(/\\/g, '/');
|
|
16
|
-
}
|
|
17
12
|
/**
|
|
18
13
|
* Find all context.json files in the project
|
|
19
14
|
* Returns relative paths from projectRoot
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../../src/cli/commands/clean.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../../src/cli/commands/clean.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { writeFile, mkdir } from 'node:fs/promises';
|
|
|
5
5
|
import { dirname, join, resolve, relative, basename } from 'node:path';
|
|
6
6
|
import { cwd } from 'node:process';
|
|
7
7
|
import { createRequire } from 'module';
|
|
8
|
-
import { getFolderPath, normalizeEntryId } from '../../../utils/fsx.js';
|
|
8
|
+
import { getFolderPath, normalizeEntryId, toForwardSlashes } from '../../../utils/fsx.js';
|
|
9
9
|
import { estimateGPT4Tokens } from '../../../utils/tokens.js';
|
|
10
10
|
import { formatBundlesForFolder } from './bundleFormatter.js';
|
|
11
11
|
import { debugError } from '../../../utils/debug.js';
|
|
@@ -24,7 +24,7 @@ catch (error) {
|
|
|
24
24
|
* Normalize path for display (convert backslashes to forward slashes)
|
|
25
25
|
*/
|
|
26
26
|
export function displayPath(path) {
|
|
27
|
-
return path
|
|
27
|
+
return toForwardSlashes(path);
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Display project root path in a normalized, user-friendly format
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileWriter.js","sourceRoot":"","sources":["../../../../src/cli/commands/context/fileWriter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"fileWriter.js","sourceRoot":"","sources":["../../../../src/cli/commands/context/fileWriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,8 +19,9 @@ export declare function calculateStats(bundles: LogicStampBundle[]): BundleStats
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function generateStatsOutput(contracts: UIFContract[], manifest: ProjectManifest, bundles: LogicStampBundle[], stats: BundleStats, tokenEstimates: TokenEstimates, elapsed: number): object;
|
|
21
21
|
/**
|
|
22
|
-
* Generate summary output for console
|
|
23
|
-
*
|
|
22
|
+
* Generate summary output for console.
|
|
23
|
+
* Shows accurate token counts for the current mode only.
|
|
24
|
+
* For detailed mode comparisons, use `stamp context --compare-modes`.
|
|
24
25
|
*/
|
|
25
26
|
export declare function generateSummary(contracts: UIFContract[], manifest: ProjectManifest, bundles: LogicStampBundle[], stats: BundleStats, tokenEstimates: TokenEstimates, options: {
|
|
26
27
|
includeCode: 'none' | 'header' | 'full';
|
|
@@ -1 +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;
|
|
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;;;;GAIG;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,GAAG,MAAM,CAAC;QAC9C,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,CA4Df"}
|
|
@@ -40,10 +40,25 @@ export function generateStatsOutput(contracts, manifest, bundles, stats, tokenEs
|
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
43
|
-
*
|
|
44
|
-
|
|
43
|
+
* Determines the display label for the current mode combination
|
|
44
|
+
*/
|
|
45
|
+
function getModeLabel(includeCode, hasStyle) {
|
|
46
|
+
if (includeCode === 'header') {
|
|
47
|
+
return hasStyle ? 'header+style' : 'header';
|
|
48
|
+
}
|
|
49
|
+
if (includeCode === 'full') {
|
|
50
|
+
return hasStyle ? 'full+style' : 'full';
|
|
51
|
+
}
|
|
52
|
+
return includeCode;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generate summary output for console.
|
|
56
|
+
* Shows accurate token counts for the current mode only.
|
|
57
|
+
* For detailed mode comparisons, use `stamp context --compare-modes`.
|
|
45
58
|
*/
|
|
46
59
|
export async function generateSummary(contracts, manifest, bundles, stats, tokenEstimates, options) {
|
|
60
|
+
const modeLabel = getModeLabel(options.includeCode, options.includeStyle === true);
|
|
61
|
+
// Print component summary
|
|
47
62
|
console.log('\n📊 Summary:');
|
|
48
63
|
console.log(` Total components: ${contracts.length}`);
|
|
49
64
|
console.log(` Root components: ${manifest.graph.roots.length}`);
|
|
@@ -52,120 +67,46 @@ export async function generateSummary(contracts, manifest, bundles, stats, token
|
|
|
52
67
|
console.log(` Total nodes in context: ${stats.totalNodes}`);
|
|
53
68
|
console.log(` Total edges: ${stats.totalEdges}`);
|
|
54
69
|
console.log(` Missing dependencies: ${stats.totalMissing}`);
|
|
55
|
-
//
|
|
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 recompilation only in --compare-modes)
|
|
69
|
-
let headerNoStyleGPT4;
|
|
70
|
-
let headerNoStyleClaude;
|
|
71
|
-
let headerWithStyleGPT4;
|
|
72
|
-
let headerWithStyleClaude;
|
|
73
|
-
// Improve raw source estimation: if we're in header mode, use header tokens to estimate raw source
|
|
74
|
-
// Header mode is approximately 30% of raw source tokens, so raw ≈ header / 0.30
|
|
75
|
-
let estimatedRawSourceGPT4 = tokenEstimates.sourceTokensGPT4;
|
|
76
|
-
let estimatedRawSourceClaude = tokenEstimates.sourceTokensClaude;
|
|
77
|
-
if (isHeaderMode && !hasStyle) {
|
|
78
|
-
// We're in header mode, so we can estimate raw source more accurately
|
|
79
|
-
// Header is ~30% of raw source, so raw source ≈ header / 0.30
|
|
80
|
-
estimatedRawSourceGPT4 = Math.ceil(options.currentGPT4 / 0.30);
|
|
81
|
-
estimatedRawSourceClaude = Math.ceil(options.currentClaude / 0.30);
|
|
82
|
-
}
|
|
83
|
-
else if (isHeaderMode && hasStyle) {
|
|
84
|
-
// We're in header+style mode, estimate header without style first
|
|
85
|
-
// Style adds ~105% overhead (170k vs 83k), so header ≈ header+style / 2.05
|
|
86
|
-
const estimatedHeaderGPT4 = Math.ceil(options.currentGPT4 / 2.05);
|
|
87
|
-
const estimatedHeaderClaude = Math.ceil(options.currentClaude / 2.05);
|
|
88
|
-
// Then estimate raw source from header
|
|
89
|
-
estimatedRawSourceGPT4 = Math.ceil(estimatedHeaderGPT4 / 0.30);
|
|
90
|
-
estimatedRawSourceClaude = Math.ceil(estimatedHeaderClaude / 0.30);
|
|
91
|
-
}
|
|
92
|
-
if (isHeaderMode && hasStyle) {
|
|
93
|
-
// Current output IS header+style, estimate header without style
|
|
94
|
-
headerNoStyleGPT4 = Math.ceil(options.currentGPT4 / 2.05); // Style typically doubles the size
|
|
95
|
-
headerNoStyleClaude = Math.ceil(options.currentClaude / 2.05);
|
|
96
|
-
headerWithStyleGPT4 = options.currentGPT4;
|
|
97
|
-
headerWithStyleClaude = options.currentClaude;
|
|
98
|
-
}
|
|
99
|
-
else if (isHeaderMode && !hasStyle) {
|
|
100
|
-
// Current output IS header without style, estimate header+style
|
|
101
|
-
headerNoStyleGPT4 = options.currentGPT4;
|
|
102
|
-
headerNoStyleClaude = options.currentClaude;
|
|
103
|
-
headerWithStyleGPT4 = Math.ceil(options.currentGPT4 * 2.05); // Style adds ~105%
|
|
104
|
-
headerWithStyleClaude = Math.ceil(options.currentClaude * 2.05);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
// For non-header modes, use estimates
|
|
108
|
-
headerNoStyleGPT4 = Math.ceil(options.currentGPT4 * 0.75);
|
|
109
|
-
headerNoStyleClaude = Math.ceil(options.currentClaude * 0.75);
|
|
110
|
-
headerWithStyleGPT4 = Math.ceil(options.currentGPT4 * 0.85);
|
|
111
|
-
headerWithStyleClaude = Math.ceil(options.currentClaude * 0.85);
|
|
112
|
-
}
|
|
113
|
-
// Calculate savings percentages vs raw source (use improved estimation)
|
|
114
|
-
// Clamp to valid range [0, 100] to handle edge cases where estimates may be off
|
|
115
|
-
const calculateSavings = (raw, current) => {
|
|
116
|
-
if (raw <= 0 || current < 0)
|
|
117
|
-
return '0';
|
|
118
|
-
const savings = ((raw - current) / raw) * 100;
|
|
119
|
-
return Math.max(0, Math.min(100, savings)).toFixed(0);
|
|
120
|
-
};
|
|
121
|
-
const headerSavingsGPT4 = calculateSavings(estimatedRawSourceGPT4, headerNoStyleGPT4);
|
|
122
|
-
const headerStyleSavingsGPT4 = calculateSavings(estimatedRawSourceGPT4, headerWithStyleGPT4);
|
|
123
|
-
// Check tokenizer status and display it
|
|
70
|
+
// Print token counts for current mode
|
|
124
71
|
const tokenizerStatus = await getTokenizerStatus();
|
|
125
72
|
const gpt4Method = tokenizerStatus.gpt4 ? 'tiktoken' : 'approximation';
|
|
126
73
|
const claudeMethod = tokenizerStatus.claude ? 'tokenizer' : 'approximation';
|
|
127
|
-
|
|
128
|
-
|
|
74
|
+
// Calculate savings vs raw source
|
|
75
|
+
const rawGPT4 = tokenEstimates.sourceTokensGPT4;
|
|
76
|
+
const rawClaude = tokenEstimates.sourceTokensClaude;
|
|
77
|
+
const savingsGPT4 = rawGPT4 > 0
|
|
78
|
+
? Math.round(((rawGPT4 - tokenEstimates.currentGPT4) / rawGPT4) * 100)
|
|
79
|
+
: 0;
|
|
80
|
+
const savingsClaude = rawClaude > 0
|
|
81
|
+
? Math.round(((rawClaude - tokenEstimates.currentClaude) / rawClaude) * 100)
|
|
82
|
+
: 0;
|
|
83
|
+
console.log(`\n📏 Token Count (${modeLabel} mode):`);
|
|
84
|
+
console.log(` Raw source: ${formatTokenCount(rawGPT4)} GPT-4o / ${formatTokenCount(rawClaude)} Claude`);
|
|
85
|
+
console.log(` ${modeLabel.padEnd(12)} ${formatTokenCount(tokenEstimates.currentGPT4)} GPT-4o / ${formatTokenCount(tokenEstimates.currentClaude)} Claude`);
|
|
86
|
+
console.log(` Savings: ~${savingsGPT4}% GPT-4o / ~${savingsClaude}% Claude`);
|
|
87
|
+
console.log(` Method: GPT-4o (${gpt4Method}) | Claude (${claudeMethod})`);
|
|
88
|
+
// Show tip for missing tokenizers
|
|
129
89
|
if (!tokenizerStatus.gpt4 || !tokenizerStatus.claude) {
|
|
130
90
|
const missing = [];
|
|
131
|
-
if (!tokenizerStatus.gpt4)
|
|
132
|
-
missing.push('@dqbd/tiktoken
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
console.log(` 💡 Tip: Tokenizers are included as optional dependencies. If installation failed, manually install ${missing.join(' and/or ')} for accurate token counts`);
|
|
91
|
+
if (!tokenizerStatus.gpt4)
|
|
92
|
+
missing.push('@dqbd/tiktoken');
|
|
93
|
+
if (!tokenizerStatus.claude)
|
|
94
|
+
missing.push('@anthropic-ai/tokenizer');
|
|
95
|
+
console.log(` 💡 Install ${missing.join(' and ')} for accurate counts`);
|
|
138
96
|
}
|
|
139
|
-
|
|
140
|
-
console.log(
|
|
141
|
-
|
|
142
|
-
console.log(` GPT-4o-mini: ${formatTokenCount(tokenEstimates.currentGPT4)} tokens`);
|
|
143
|
-
console.log(` Claude: ${formatTokenCount(tokenEstimates.currentClaude)} tokens`);
|
|
144
|
-
console.log(`\n Comparison:`);
|
|
145
|
-
console.log(` Mode | Tokens GPT-4o | Tokens Claude | Savings vs Raw Source`);
|
|
146
|
-
console.log(` -------------|---------------|---------------|------------------------`);
|
|
147
|
-
console.log(` Raw source | ${formatTokenCount(estimatedRawSourceGPT4).padStart(13)} | ${formatTokenCount(estimatedRawSourceClaude).padStart(13)} | 0%`);
|
|
148
|
-
console.log(` Header | ${formatTokenCount(headerNoStyleGPT4).padStart(13)} | ${formatTokenCount(headerNoStyleClaude).padStart(13)} | ${headerSavingsGPT4}%`);
|
|
149
|
-
console.log(` Header+style | ${formatTokenCount(headerWithStyleGPT4).padStart(13)} | ${formatTokenCount(headerWithStyleClaude).padStart(13)} | ${headerStyleSavingsGPT4}%`);
|
|
150
|
-
console.log(`\n Full context (code+style): ~${formatTokenCount(tokenEstimates.modeEstimates.full.gpt4)} GPT-4o-mini / ~${formatTokenCount(tokenEstimates.modeEstimates.full.claude)} Claude`);
|
|
151
|
-
console.log(`\n📊 Current Mode Comparison:`);
|
|
152
|
-
console.log(` ⚠️ Current mode = tokenizer-based.`);
|
|
153
|
-
console.log(` Other modes / raw source = heuristic.`);
|
|
154
|
-
console.log(` For precise per-mode breakdown, use "stamp context --compare-modes".`);
|
|
155
|
-
console.log(` none: ~${formatTokenCount(tokenEstimates.modeEstimates.none.gpt4)} tokens`);
|
|
156
|
-
// Show current mode with honest labeling - reflects actual mode (header or header+style)
|
|
157
|
-
const currentModeLabel = modeLabel;
|
|
158
|
-
console.log(` ${currentModeLabel.padEnd(13)} ~${formatTokenCount(tokenEstimates.currentGPT4)} tokens`);
|
|
159
|
-
console.log(` full: ~${formatTokenCount(tokenEstimates.modeEstimates.full.gpt4)} tokens`);
|
|
97
|
+
// Point to --compare-modes for detailed breakdown
|
|
98
|
+
console.log(`\n For detailed mode comparison, run: stamp context --compare-modes`);
|
|
99
|
+
// Print missing dependencies if any
|
|
160
100
|
if (stats.totalMissing > 0) {
|
|
161
101
|
console.log('\n⚠️ Missing dependencies (external/third-party):');
|
|
162
102
|
const allMissing = new Set();
|
|
163
103
|
bundles.forEach(b => {
|
|
164
104
|
b.meta.missing.forEach(dep => allMissing.add(dep.name));
|
|
165
105
|
});
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
106
|
+
const MAX_DISPLAY = 10;
|
|
107
|
+
Array.from(allMissing).slice(0, MAX_DISPLAY).forEach(name => console.log(` - ${name}`));
|
|
108
|
+
if (allMissing.size > MAX_DISPLAY) {
|
|
109
|
+
console.log(` ... and ${allMissing.size - MAX_DISPLAY} more`);
|
|
169
110
|
}
|
|
170
111
|
}
|
|
171
112
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statsCalculator.js","sourceRoot":"","sources":["../../../../src/cli/commands/context/statsCalculator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAQhF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAA2B;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEhF,OAAO;QACL,UAAU;QACV,UAAU;QACV,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAwB,EACxB,QAAyB,EACzB,OAA2B,EAC3B,KAAkB,EAClB,cAA8B,EAC9B,OAAe;IAEf,OAAO;QACL,eAAe,EAAE,SAAS,CAAC,MAAM;QACjC,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;QAC3C,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;QAC5C,eAAe,EAAE,OAAO,CAAC,MAAM;QAC/B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,mBAAmB,EAAE,KAAK,CAAC,YAAY;QACvC,UAAU,EAAE,cAAc,CAAC,WAAW;QACtC,YAAY,EAAE,cAAc,CAAC,aAAa;QAC1C,aAAa,EAAE;YACb,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE;YACxG,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE;YAC9G,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE;SACzG;QACD,WAAW,EAAE,cAAc,CAAC,WAAW;QACvC,aAAa,EAAE,cAAc,CAAC,aAAa;QAC3C,SAAS,EAAE,OAAO;KACnB,CAAC;AACJ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"statsCalculator.js","sourceRoot":"","sources":["../../../../src/cli/commands/context/statsCalculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchMode.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/context/watchMode/watchMode.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AASpB,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"watchMode.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/context/watchMode/watchMode.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AASpB,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAsBvE;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAE,UAAU,GAAG,IAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAirBxI"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { resolve, dirname, join, relative } from 'node:path';
|
|
5
5
|
import { readFile } from 'node:fs/promises';
|
|
6
6
|
import chokidar from 'chokidar';
|
|
7
|
-
import { globFiles } from '../../../../utils/fsx.js';
|
|
7
|
+
import { globFiles, toForwardSlashes } from '../../../../utils/fsx.js';
|
|
8
8
|
import { readStampignore, filterIgnoredFiles } from '../../../../utils/stampignore.js';
|
|
9
9
|
import { buildDependencyGraph } from '../../../../core/manifest.js';
|
|
10
10
|
import { normalizeEntryId } from '../../../../utils/fsx.js';
|
|
@@ -15,6 +15,9 @@ import { getChanges, showChanges } from './watchDiff.js';
|
|
|
15
15
|
import { initializeWatchCache, incrementalRebuild, } from './index.js';
|
|
16
16
|
import { buildContractsFromFiles, writeContextFiles, writeMainIndex, groupBundlesByFolder, displayProjectRoot, } from '../index.js';
|
|
17
17
|
import { contextCommand } from '../../context.js';
|
|
18
|
+
function formatErrorMessage(error) {
|
|
19
|
+
return error instanceof Error ? error.message : String(error);
|
|
20
|
+
}
|
|
18
21
|
/**
|
|
19
22
|
* Display session status block
|
|
20
23
|
*/
|
|
@@ -68,10 +71,10 @@ export async function startWatchMode(options, projectRoot, initialCache = null)
|
|
|
68
71
|
let debounceTimer = null;
|
|
69
72
|
let regenerationPromise = null; // Promise-based lock to prevent race conditions
|
|
70
73
|
let changedFiles = new Set();
|
|
71
|
-
|
|
74
|
+
/** Snapshot for `getChanges` / strict-watch: set on first load; reset when watch cache is recovered after an error (new stable tree). */
|
|
75
|
+
let baselineBundles = null;
|
|
72
76
|
let previousBundles = null; // Last state - for incremental tracking
|
|
73
77
|
let watchCache = initialCache;
|
|
74
|
-
let isFirstRun = false; // Set to false since cache is already initialized
|
|
75
78
|
// Strict watch mode state
|
|
76
79
|
let strictWatchStatus = options.strictWatch ? {
|
|
77
80
|
active: true,
|
|
@@ -88,30 +91,92 @@ export async function startWatchMode(options, projectRoot, initialCache = null)
|
|
|
88
91
|
const DEBOUNCE_DELAY = 500;
|
|
89
92
|
// Helper to load all bundles from context files
|
|
90
93
|
const loadAllBundles = async (outputDir) => {
|
|
94
|
+
const mainIndexPath = join(outputDir, 'context_main.json');
|
|
95
|
+
let mainIndexContent;
|
|
91
96
|
try {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const
|
|
96
|
-
if (
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
97
|
+
mainIndexContent = await readFile(mainIndexPath, 'utf8');
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
const code = error?.code;
|
|
101
|
+
if (code === 'ENOENT') {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
if (!options.quiet) {
|
|
105
|
+
console.warn(` ⚠️ Watch: could not read context index (${mainIndexPath}): ${formatErrorMessage(error)}`);
|
|
106
|
+
}
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
let mainIndex;
|
|
110
|
+
try {
|
|
111
|
+
mainIndex = JSON.parse(mainIndexContent);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (!options.quiet) {
|
|
115
|
+
console.warn(` ⚠️ Watch: context index is not valid JSON (${mainIndexPath}): ${formatErrorMessage(error)}`);
|
|
116
|
+
}
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
const allBundles = [];
|
|
120
|
+
if (mainIndex.folders) {
|
|
121
|
+
for (const folder of mainIndex.folders) {
|
|
122
|
+
if (folder.contextFile) {
|
|
123
|
+
const contextPath = join(outputDir, folder.contextFile);
|
|
124
|
+
try {
|
|
125
|
+
const contextContent = await readFile(contextPath, 'utf8');
|
|
126
|
+
const bundles = JSON.parse(contextContent);
|
|
127
|
+
allBundles.push(...bundles);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (!options.quiet) {
|
|
131
|
+
console.warn(` ⚠️ Watch: could not load folder context ${contextPath}: ${formatErrorMessage(error)}`);
|
|
107
132
|
}
|
|
108
133
|
}
|
|
109
134
|
}
|
|
110
135
|
}
|
|
111
|
-
return allBundles;
|
|
112
136
|
}
|
|
113
|
-
|
|
114
|
-
|
|
137
|
+
return allBundles;
|
|
138
|
+
};
|
|
139
|
+
/** After incremental failure, run a full rebuild and re-init cache so watch mode can recover. */
|
|
140
|
+
const attemptWatchCacheRecovery = async () => {
|
|
141
|
+
try {
|
|
142
|
+
const outPathResolved = resolve(options.out);
|
|
143
|
+
const outputDirResolved = outPathResolved.endsWith('.json') ? dirname(outPathResolved) : outPathResolved;
|
|
144
|
+
const regenerateOptions = {
|
|
145
|
+
...options,
|
|
146
|
+
watch: false,
|
|
147
|
+
strictMissing: false,
|
|
148
|
+
quiet: true,
|
|
149
|
+
suppressSuccessIndicator: true,
|
|
150
|
+
};
|
|
151
|
+
await contextCommand(regenerateOptions);
|
|
152
|
+
const newBundles = await loadAllBundles(outputDirResolved);
|
|
153
|
+
if (newBundles.length === 0) {
|
|
154
|
+
if (!options.quiet) {
|
|
155
|
+
console.warn(' ⚠️ Full rebuild after error produced no bundles; incremental watch stays disabled.');
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
const files = await globFiles(projectRoot);
|
|
160
|
+
const stampignore = await readStampignore(projectRoot);
|
|
161
|
+
const filteredFiles = stampignore ? filterIgnoredFiles(files, stampignore.ignore, projectRoot) : files;
|
|
162
|
+
const { contracts } = await buildContractsFromFiles(filteredFiles, projectRoot, {
|
|
163
|
+
includeStyle: options.includeStyle,
|
|
164
|
+
styleMode: options.styleMode,
|
|
165
|
+
predictBehavior: options.predictBehavior,
|
|
166
|
+
quiet: true,
|
|
167
|
+
});
|
|
168
|
+
const manifest = buildDependencyGraph(contracts);
|
|
169
|
+
const cache = await initializeWatchCache(filteredFiles, contracts, manifest, newBundles, projectRoot);
|
|
170
|
+
if (cache == null) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
return { cache, bundles: newBundles };
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (!options.quiet) {
|
|
177
|
+
console.warn(` ⚠️ Watch: full rebuild recovery failed: ${formatErrorMessage(error)}`);
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
115
180
|
}
|
|
116
181
|
};
|
|
117
182
|
const regenerate = async () => {
|
|
@@ -134,8 +199,8 @@ export async function startWatchMode(options, projectRoot, initialCache = null)
|
|
|
134
199
|
// Determine output directory
|
|
135
200
|
const outPath = resolve(options.out);
|
|
136
201
|
const outputDir = outPath.endsWith('.json') ? dirname(outPath) : outPath;
|
|
137
|
-
// Load baseline bundles for state-based comparison (like git diff)
|
|
138
|
-
//
|
|
202
|
+
// Load baseline bundles for state-based comparison (like git diff).
|
|
203
|
+
// Set on first successful load; also updated after error recovery (full rebuild) so diffs stay meaningful.
|
|
139
204
|
if (!baselineBundles) {
|
|
140
205
|
baselineBundles = await loadAllBundles(outputDir);
|
|
141
206
|
previousBundles = baselineBundles;
|
|
@@ -365,24 +430,42 @@ export async function startWatchMode(options, projectRoot, initialCache = null)
|
|
|
365
430
|
}
|
|
366
431
|
catch (error) {
|
|
367
432
|
const durationMs = Date.now() - startTime;
|
|
368
|
-
const errorMessage = error
|
|
433
|
+
const errorMessage = formatErrorMessage(error);
|
|
369
434
|
if (!options.quiet) {
|
|
370
435
|
console.error(` ❌ Error: ${errorMessage}\n`);
|
|
371
436
|
}
|
|
372
|
-
// Log error to watch logs (only if --log-file flag is set)
|
|
373
437
|
if (options.logFile) {
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
438
|
+
try {
|
|
439
|
+
const logEntry = {
|
|
440
|
+
timestamp: new Date().toISOString(),
|
|
441
|
+
changedFiles: changedFileList,
|
|
442
|
+
fileCount: changedFileList.length,
|
|
443
|
+
durationMs,
|
|
444
|
+
error: errorMessage,
|
|
445
|
+
};
|
|
446
|
+
await appendWatchLog(projectRoot, logEntry);
|
|
447
|
+
}
|
|
448
|
+
catch (logError) {
|
|
449
|
+
if (!options.quiet) {
|
|
450
|
+
console.warn(` ⚠️ Watch: could not append watch log: ${formatErrorMessage(logError)}`);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
const recovery = await attemptWatchCacheRecovery();
|
|
455
|
+
if (recovery != null) {
|
|
456
|
+
watchCache = recovery.cache;
|
|
457
|
+
baselineBundles = recovery.bundles;
|
|
458
|
+
previousBundles = recovery.bundles;
|
|
459
|
+
if (!options.quiet) {
|
|
460
|
+
console.log(` ✅ Watch cache restored after full rebuild.\n`);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
watchCache = null;
|
|
465
|
+
if (!options.quiet) {
|
|
466
|
+
console.warn(' ⚠️ Each file change will run a full context rebuild until a rebuild succeeds.\n');
|
|
467
|
+
}
|
|
382
468
|
}
|
|
383
|
-
// Fall back to full rebuild on error
|
|
384
|
-
watchCache = null;
|
|
385
|
-
isFirstRun = true;
|
|
386
469
|
}
|
|
387
470
|
};
|
|
388
471
|
// Execute and track the regeneration promise
|
|
@@ -396,7 +479,9 @@ export async function startWatchMode(options, projectRoot, initialCache = null)
|
|
|
396
479
|
clearTimeout(debounceTimer);
|
|
397
480
|
}
|
|
398
481
|
debounceTimer = setTimeout(() => {
|
|
399
|
-
regenerate()
|
|
482
|
+
void regenerate().catch((err) => {
|
|
483
|
+
console.error(` ❌ Watch: unexpected regenerate failure: ${formatErrorMessage(err)}\n`);
|
|
484
|
+
});
|
|
400
485
|
}, DEBOUNCE_DELAY);
|
|
401
486
|
};
|
|
402
487
|
try {
|
|
@@ -427,7 +512,7 @@ export async function startWatchMode(options, projectRoot, initialCache = null)
|
|
|
427
512
|
/context_main\.json$/,
|
|
428
513
|
/context_compare_modes\.json$/,
|
|
429
514
|
// Ignore output directory if different from project root
|
|
430
|
-
...(outputDir !== projectRoot ? [new RegExp('^' + relative(projectRoot, normalizedOutputDir)
|
|
515
|
+
...(outputDir !== projectRoot ? [new RegExp('^' + toForwardSlashes(relative(projectRoot, normalizedOutputDir)))] : []),
|
|
431
516
|
// Ignore common build/dependency directories
|
|
432
517
|
/node_modules/,
|
|
433
518
|
/dist/,
|
|
@@ -446,7 +531,7 @@ export async function startWatchMode(options, projectRoot, initialCache = null)
|
|
|
446
531
|
// Helper to check if a file should trigger regeneration
|
|
447
532
|
const shouldTrigger = (filePath) => {
|
|
448
533
|
// Normalize path separators
|
|
449
|
-
const normalizedPath = filePath
|
|
534
|
+
const normalizedPath = toForwardSlashes(filePath);
|
|
450
535
|
// Debug logging (can be enabled with LOGICSTAMP_DEBUG=1)
|
|
451
536
|
if (process.env.LOGICSTAMP_DEBUG === '1' && !options.quiet) {
|
|
452
537
|
console.log(`[DEBUG] Watch event for: ${normalizedPath}`);
|