bugproof 0.1.2 → 0.2.2
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/CHANGELOG.md +61 -5
- package/README.md +175 -4
- package/dist/capture/env-snapshot.d.ts +53 -0
- package/dist/capture/env-snapshot.d.ts.map +1 -0
- package/dist/capture/env-snapshot.js +122 -0
- package/dist/capture/env-snapshot.js.map +1 -0
- package/dist/capture/language-support.d.ts +55 -0
- package/dist/capture/language-support.d.ts.map +1 -0
- package/dist/capture/language-support.js +505 -0
- package/dist/capture/language-support.js.map +1 -0
- package/dist/capture/packager.d.ts +9 -0
- package/dist/capture/packager.d.ts.map +1 -1
- package/dist/capture/packager.js +23 -2
- package/dist/capture/packager.js.map +1 -1
- package/dist/capture/source-strategy.d.ts +52 -0
- package/dist/capture/source-strategy.d.ts.map +1 -0
- package/dist/capture/source-strategy.js +227 -0
- package/dist/capture/source-strategy.js.map +1 -0
- package/dist/cli.js +373 -12
- package/dist/cli.js.map +1 -1
- package/dist/config/loader.d.ts +44 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +87 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/replay/engine.d.ts +9 -0
- package/dist/replay/engine.d.ts.map +1 -1
- package/dist/replay/engine.js +29 -3
- package/dist/replay/engine.js.map +1 -1
- package/dist/replay/hints.d.ts +18 -0
- package/dist/replay/hints.d.ts.map +1 -0
- package/dist/replay/hints.js +138 -0
- package/dist/replay/hints.js.map +1 -0
- package/dist/replay/sandbox.js +41 -14
- package/dist/replay/sandbox.js.map +1 -1
- package/dist/replay/verdict.d.ts.map +1 -1
- package/dist/replay/verdict.js +41 -5
- package/dist/replay/verdict.js.map +1 -1
- package/dist/sandbox/bugbox.d.ts.map +1 -1
- package/dist/sandbox/bugbox.js +40 -6
- package/dist/sandbox/bugbox.js.map +1 -1
- package/dist/sandbox/container.d.ts +81 -0
- package/dist/sandbox/container.d.ts.map +1 -0
- package/dist/sandbox/container.js +343 -0
- package/dist/sandbox/container.js.map +1 -0
- package/dist/sandbox/cross-platform.d.ts +59 -0
- package/dist/sandbox/cross-platform.d.ts.map +1 -0
- package/dist/sandbox/cross-platform.js +330 -0
- package/dist/sandbox/cross-platform.js.map +1 -0
- package/dist/sandbox/network.d.ts.map +1 -1
- package/dist/sandbox/network.js +31 -2
- package/dist/sandbox/network.js.map +1 -1
- package/dist/share/gist.d.ts +21 -0
- package/dist/share/gist.d.ts.map +1 -0
- package/dist/share/gist.js +158 -0
- package/dist/share/gist.js.map +1 -0
- package/dist/utils/archive.d.ts +1 -0
- package/dist/utils/archive.d.ts.map +1 -1
- package/dist/utils/archive.js +42 -1
- package/dist/utils/archive.js.map +1 -1
- package/dist/utils/artifact-validation.d.ts +7 -0
- package/dist/utils/artifact-validation.d.ts.map +1 -0
- package/dist/utils/artifact-validation.js +212 -0
- package/dist/utils/artifact-validation.js.map +1 -0
- package/dist/utils/dependencies.d.ts +18 -0
- package/dist/utils/dependencies.d.ts.map +1 -0
- package/dist/utils/dependencies.js +218 -0
- package/dist/utils/dependencies.js.map +1 -0
- package/package.json +3 -2
- package/scripts/postinstall.cjs +38 -5
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Source Strategy
|
|
3
|
+
*
|
|
4
|
+
* Two-tier approach for including source code in a .bug artifact:
|
|
5
|
+
*
|
|
6
|
+
* Tier 1 (Git available):
|
|
7
|
+
* - git-full: Clean working tree → record commit only (zero files shipped)
|
|
8
|
+
* - git-patch: Dirty working tree → record commit + diff patch (tiny)
|
|
9
|
+
* - git-files: Force mode → ship all tracked files
|
|
10
|
+
*
|
|
11
|
+
* Tier 2 (No Git):
|
|
12
|
+
* - full-copy: Ship the entire codebase (excluding heavy dirs like node_modules)
|
|
13
|
+
* up to a configurable size limit (default 50MB).
|
|
14
|
+
* If size exceeds the limit → error out, recommend installing git.
|
|
15
|
+
*
|
|
16
|
+
* Why not stacktrace extraction? Because the file that appears in the error
|
|
17
|
+
* is often NOT the file that was changed to cause the bug. Transitive imports,
|
|
18
|
+
* config files, and build artifacts make guessing unreliable. Ship everything
|
|
19
|
+
* or use git — no middle ground that loses reproducibility.
|
|
20
|
+
*/
|
|
21
|
+
export type SourceStrategy = 'git-full' | 'git-patch' | 'git-files' | 'full-copy' | 'exceeded';
|
|
22
|
+
export interface SourceStrategyResult {
|
|
23
|
+
strategy: SourceStrategy;
|
|
24
|
+
/** Git commit hash (if available) */
|
|
25
|
+
commit?: string;
|
|
26
|
+
/** Git diff patch content (if dirty) */
|
|
27
|
+
patch?: string;
|
|
28
|
+
/** List of relative file paths to include in artifact */
|
|
29
|
+
filesToInclude: string[];
|
|
30
|
+
/** Total size in bytes of files to include */
|
|
31
|
+
totalSize: number;
|
|
32
|
+
/** Human-readable explanation */
|
|
33
|
+
reason: string;
|
|
34
|
+
/** If true, capture should abort — codebase too large without git */
|
|
35
|
+
shouldAbort: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface SourceStrategyOptions {
|
|
38
|
+
workingDir: string;
|
|
39
|
+
/** Force include all git files even when commit is available */
|
|
40
|
+
forceIncludeFiles?: boolean;
|
|
41
|
+
/** Max total codebase size to ship without git (bytes). Default 100MB. */
|
|
42
|
+
maxCodebaseSize?: number;
|
|
43
|
+
/** Max individual file size (bytes). Default 2MB. */
|
|
44
|
+
maxFileSize?: number;
|
|
45
|
+
/** Additional exclude patterns */
|
|
46
|
+
excludePatterns?: string[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Determines the optimal source inclusion strategy.
|
|
50
|
+
*/
|
|
51
|
+
export declare function determineSourceStrategy(options: SourceStrategyOptions): SourceStrategyResult;
|
|
52
|
+
//# sourceMappingURL=source-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-strategy.d.ts","sourceRoot":"","sources":["../../src/capture/source-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC;AAE/F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AA2BD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,oBAAoB,CAgB5F"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Source Strategy
|
|
3
|
+
*
|
|
4
|
+
* Two-tier approach for including source code in a .bug artifact:
|
|
5
|
+
*
|
|
6
|
+
* Tier 1 (Git available):
|
|
7
|
+
* - git-full: Clean working tree → record commit only (zero files shipped)
|
|
8
|
+
* - git-patch: Dirty working tree → record commit + diff patch (tiny)
|
|
9
|
+
* - git-files: Force mode → ship all tracked files
|
|
10
|
+
*
|
|
11
|
+
* Tier 2 (No Git):
|
|
12
|
+
* - full-copy: Ship the entire codebase (excluding heavy dirs like node_modules)
|
|
13
|
+
* up to a configurable size limit (default 50MB).
|
|
14
|
+
* If size exceeds the limit → error out, recommend installing git.
|
|
15
|
+
*
|
|
16
|
+
* Why not stacktrace extraction? Because the file that appears in the error
|
|
17
|
+
* is often NOT the file that was changed to cause the bug. Transitive imports,
|
|
18
|
+
* config files, and build artifacts make guessing unreliable. Ship everything
|
|
19
|
+
* or use git — no middle ground that loses reproducibility.
|
|
20
|
+
*/
|
|
21
|
+
import * as fs from 'fs';
|
|
22
|
+
import * as path from 'path';
|
|
23
|
+
import { spawnSync } from 'child_process';
|
|
24
|
+
/** Default max codebase size without git: 100MB */
|
|
25
|
+
const DEFAULT_MAX_CODEBASE_SIZE = 100 * 1024 * 1024;
|
|
26
|
+
/** Default max individual file size: 2MB */
|
|
27
|
+
const DEFAULT_MAX_FILE_SIZE = 2 * 1024 * 1024;
|
|
28
|
+
/** Directories always excluded from full-copy (heavy, regeneratable) */
|
|
29
|
+
const ALWAYS_EXCLUDE_DIRS = [
|
|
30
|
+
'node_modules', '.git', 'dist', 'build', 'out', 'target',
|
|
31
|
+
'__pycache__', '.venv', 'venv', 'env', '.env',
|
|
32
|
+
'vendor', '.gradle', '.idea', '.vs', '.vscode',
|
|
33
|
+
'coverage', '.nyc_output', '.next', '.nuxt',
|
|
34
|
+
'tmp', 'temp', '.cache', '.parcel-cache',
|
|
35
|
+
'bin', 'obj', 'packages', '.dart_tool',
|
|
36
|
+
];
|
|
37
|
+
/** File extensions to skip (binary/compiled) */
|
|
38
|
+
const SKIP_EXTENSIONS = new Set([
|
|
39
|
+
'.exe', '.dll', '.so', '.dylib', '.o', '.obj', '.class',
|
|
40
|
+
'.jar', '.war', '.zip', '.tar', '.gz', '.7z', '.rar',
|
|
41
|
+
'.png', '.jpg', '.jpeg', '.gif', '.bmp', '.ico', '.svg',
|
|
42
|
+
'.mp3', '.mp4', '.avi', '.mov', '.woff', '.woff2', '.ttf',
|
|
43
|
+
'.eot', '.pdf', '.psd', '.ai', '.sketch',
|
|
44
|
+
'.pyc', '.pyo', '.wasm', '.node',
|
|
45
|
+
]);
|
|
46
|
+
/**
|
|
47
|
+
* Determines the optimal source inclusion strategy.
|
|
48
|
+
*/
|
|
49
|
+
export function determineSourceStrategy(options) {
|
|
50
|
+
// Check if we're in a git repo
|
|
51
|
+
const gitCheck = spawnSync('git', ['rev-parse', '--is-inside-work-tree'], {
|
|
52
|
+
cwd: options.workingDir,
|
|
53
|
+
encoding: 'utf-8',
|
|
54
|
+
timeout: 5000,
|
|
55
|
+
});
|
|
56
|
+
const isGitRepo = gitCheck.status === 0 && gitCheck.stdout.trim() === 'true';
|
|
57
|
+
if (isGitRepo) {
|
|
58
|
+
return determineGitStrategy(options.workingDir, options.forceIncludeFiles);
|
|
59
|
+
}
|
|
60
|
+
// No git — ship the full codebase with size limit
|
|
61
|
+
return determineFullCopyStrategy(options);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Determines the git-based strategy.
|
|
65
|
+
*/
|
|
66
|
+
function determineGitStrategy(workingDir, forceIncludeFiles) {
|
|
67
|
+
// Get current commit
|
|
68
|
+
const commitResult = spawnSync('git', ['rev-parse', 'HEAD'], {
|
|
69
|
+
cwd: workingDir,
|
|
70
|
+
encoding: 'utf-8',
|
|
71
|
+
timeout: 5000,
|
|
72
|
+
});
|
|
73
|
+
const commit = commitResult.status === 0 ? commitResult.stdout.trim() : undefined;
|
|
74
|
+
// Check if working tree is dirty
|
|
75
|
+
const dirtyResult = spawnSync('git', ['status', '--porcelain'], {
|
|
76
|
+
cwd: workingDir,
|
|
77
|
+
encoding: 'utf-8',
|
|
78
|
+
timeout: 10000,
|
|
79
|
+
});
|
|
80
|
+
const isDirty = dirtyResult.status === 0 && dirtyResult.stdout.trim().length > 0;
|
|
81
|
+
if (forceIncludeFiles) {
|
|
82
|
+
return {
|
|
83
|
+
strategy: 'git-files',
|
|
84
|
+
commit,
|
|
85
|
+
filesToInclude: [],
|
|
86
|
+
totalSize: 0,
|
|
87
|
+
reason: 'Git repo detected. Including all tracked files (forced).',
|
|
88
|
+
shouldAbort: false,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (!isDirty && commit) {
|
|
92
|
+
return {
|
|
93
|
+
strategy: 'git-full',
|
|
94
|
+
commit,
|
|
95
|
+
filesToInclude: [],
|
|
96
|
+
totalSize: 0,
|
|
97
|
+
reason: `Git repo clean at ${commit.slice(0, 8)}. No files shipped — replay uses git checkout.`,
|
|
98
|
+
shouldAbort: false,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (isDirty && commit) {
|
|
102
|
+
// Dirty tree — generate a patch of uncommitted changes
|
|
103
|
+
const patchResult = spawnSync('git', ['diff', 'HEAD'], {
|
|
104
|
+
cwd: workingDir,
|
|
105
|
+
encoding: 'utf-8',
|
|
106
|
+
timeout: 30000,
|
|
107
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
108
|
+
});
|
|
109
|
+
const stagedResult = spawnSync('git', ['diff', '--cached'], {
|
|
110
|
+
cwd: workingDir,
|
|
111
|
+
encoding: 'utf-8',
|
|
112
|
+
timeout: 30000,
|
|
113
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
114
|
+
});
|
|
115
|
+
let patch = '';
|
|
116
|
+
if (patchResult.status === 0)
|
|
117
|
+
patch += patchResult.stdout;
|
|
118
|
+
if (stagedResult.status === 0 && stagedResult.stdout.trim()) {
|
|
119
|
+
patch += '\n' + stagedResult.stdout;
|
|
120
|
+
}
|
|
121
|
+
if (patch.trim()) {
|
|
122
|
+
return {
|
|
123
|
+
strategy: 'git-patch',
|
|
124
|
+
commit,
|
|
125
|
+
patch,
|
|
126
|
+
filesToInclude: [],
|
|
127
|
+
totalSize: Buffer.byteLength(patch),
|
|
128
|
+
reason: `Git repo dirty at ${commit.slice(0, 8)}. Shipping commit ref + diff patch (${(Buffer.byteLength(patch) / 1024).toFixed(1)} KB).`,
|
|
129
|
+
shouldAbort: false,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Fallback: ship tracked files
|
|
134
|
+
return {
|
|
135
|
+
strategy: 'git-files',
|
|
136
|
+
commit,
|
|
137
|
+
filesToInclude: [],
|
|
138
|
+
totalSize: 0,
|
|
139
|
+
reason: 'Git repo detected. Including tracked files.',
|
|
140
|
+
shouldAbort: false,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Collects all project files (excluding heavy directories and binaries)
|
|
145
|
+
* and checks against the size limit.
|
|
146
|
+
*/
|
|
147
|
+
function determineFullCopyStrategy(options) {
|
|
148
|
+
const maxCodebaseSize = options.maxCodebaseSize ?? DEFAULT_MAX_CODEBASE_SIZE;
|
|
149
|
+
const maxFileSize = options.maxFileSize ?? DEFAULT_MAX_FILE_SIZE;
|
|
150
|
+
const extraExcludes = new Set((options.excludePatterns || []).map(p => p.replace(/[/\\*]/g, '')));
|
|
151
|
+
const files = [];
|
|
152
|
+
let totalSize = 0;
|
|
153
|
+
let exceeded = false;
|
|
154
|
+
function walk(dir, relativeBase) {
|
|
155
|
+
if (exceeded)
|
|
156
|
+
return;
|
|
157
|
+
let entries;
|
|
158
|
+
try {
|
|
159
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
for (const entry of entries) {
|
|
165
|
+
if (exceeded)
|
|
166
|
+
return;
|
|
167
|
+
// Skip symlinks (security)
|
|
168
|
+
if (entry.isSymbolicLink())
|
|
169
|
+
continue;
|
|
170
|
+
const name = entry.name;
|
|
171
|
+
const relPath = relativeBase ? `${relativeBase}/${name}` : name;
|
|
172
|
+
if (entry.isDirectory()) {
|
|
173
|
+
// Skip always-excluded directories
|
|
174
|
+
if (ALWAYS_EXCLUDE_DIRS.includes(name) || extraExcludes.has(name))
|
|
175
|
+
continue;
|
|
176
|
+
// Skip hidden directories (except common ones like .github)
|
|
177
|
+
if (name.startsWith('.') && name !== '.github')
|
|
178
|
+
continue;
|
|
179
|
+
walk(path.join(dir, name), relPath);
|
|
180
|
+
}
|
|
181
|
+
else if (entry.isFile()) {
|
|
182
|
+
// Skip binary extensions
|
|
183
|
+
const ext = path.extname(name).toLowerCase();
|
|
184
|
+
if (SKIP_EXTENSIONS.has(ext))
|
|
185
|
+
continue;
|
|
186
|
+
// Skip hidden files
|
|
187
|
+
if (name.startsWith('.') && name !== '.env.example')
|
|
188
|
+
continue;
|
|
189
|
+
try {
|
|
190
|
+
const stat = fs.statSync(path.join(dir, name));
|
|
191
|
+
// Skip files exceeding individual size limit
|
|
192
|
+
if (stat.size > maxFileSize)
|
|
193
|
+
continue;
|
|
194
|
+
totalSize += stat.size;
|
|
195
|
+
if (totalSize > maxCodebaseSize) {
|
|
196
|
+
exceeded = true;
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
files.push(relPath);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// Skip unreadable files
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
walk(options.workingDir, '');
|
|
208
|
+
if (exceeded) {
|
|
209
|
+
const limitMB = (maxCodebaseSize / (1024 * 1024)).toFixed(0);
|
|
210
|
+
return {
|
|
211
|
+
strategy: 'exceeded',
|
|
212
|
+
filesToInclude: [],
|
|
213
|
+
totalSize,
|
|
214
|
+
reason: `Codebase exceeds ${limitMB}MB limit. Install git for efficient bug recording: git init && git add . && git commit -m "init"`,
|
|
215
|
+
shouldAbort: true,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
const sizeMB = (totalSize / (1024 * 1024)).toFixed(1);
|
|
219
|
+
return {
|
|
220
|
+
strategy: 'full-copy',
|
|
221
|
+
filesToInclude: files,
|
|
222
|
+
totalSize,
|
|
223
|
+
reason: `No git repo. Shipping full codebase (${files.length} files, ${sizeMB} MB).`,
|
|
224
|
+
shouldAbort: false,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=source-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-strategy.js","sourceRoot":"","sources":["../../src/capture/source-strategy.ts"],"names":[],"mappings":"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"}
|