@bonyadnouri/autoend 0.1.0 → 0.1.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/README.md +138 -38
- package/dist/cli.js +5 -3
- package/dist/cli.js.map +1 -1
- package/dist/explore/explorer.d.ts +4 -1
- package/dist/explore/explorer.js +62 -23
- package/dist/explore/explorer.js.map +1 -1
- package/dist/map/flow-map.d.ts +46 -0
- package/dist/map/flow-map.js +99 -6
- package/dist/map/flow-map.js.map +1 -1
- package/dist/replay/replay.d.ts +13 -2
- package/dist/replay/replay.js +92 -11
- package/dist/replay/replay.js.map +1 -1
- package/dist/report/artifact.d.ts +7 -1
- package/dist/report/artifact.js +10 -0
- package/dist/report/artifact.js.map +1 -1
- package/dist/report/types.d.ts +62 -0
- package/dist/run/run.d.ts +6 -1
- package/dist/run/run.js +64 -9
- package/dist/run/run.js.map +1 -1
- package/dist/run/sensitive-env.d.ts +24 -0
- package/dist/run/sensitive-env.js +45 -0
- package/dist/run/sensitive-env.js.map +1 -0
- package/dist/setup/wizard.js +5 -3
- package/dist/setup/wizard.js.map +1 -1
- package/dist/spa/assets/index-BYZk0rZl.js +264 -0
- package/dist/spa/assets/index-D8cAgArG.css +1 -0
- package/dist/spa/index.html +14 -0
- package/dist/spa/logo.svg +7 -0
- package/dist/viewer/server.d.ts +7 -6
- package/dist/viewer/server.js +168 -26
- package/dist/viewer/server.js.map +1 -1
- package/package.json +17 -4
- package/dist/viewer/html.d.ts +0 -7
- package/dist/viewer/html.js +0 -240
- package/dist/viewer/html.js.map +0 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardrail for the verify-by-running trust boundary (ADR-0002, issue #3).
|
|
3
|
+
*
|
|
4
|
+
* Discovered and replayed Flow scripts are LLM-authored and run in-process via
|
|
5
|
+
* dynamic import(), so they inherit the Run's full Node authority — including
|
|
6
|
+
* whatever secrets `.env` loaded into `process.env` (notably CURSOR_API_KEY).
|
|
7
|
+
* A flow script never needs those secrets: it only drives a Playwright `page`.
|
|
8
|
+
*
|
|
9
|
+
* `withoutSensitiveEnv` removes secret-looking variables from `process.env`
|
|
10
|
+
* for the duration of a callback and restores them afterward, so a malicious or
|
|
11
|
+
* buggy generated script can't read them. It is a defense-in-depth mitigation,
|
|
12
|
+
* not a sandbox — full isolation (running scripts in a locked-down child
|
|
13
|
+
* process) is tracked separately.
|
|
14
|
+
*
|
|
15
|
+
* IMPORTANT: `process.env` is process-global, so wrap a whole batch of script
|
|
16
|
+
* executions in one call rather than each script — never run agent creation
|
|
17
|
+
* (which needs the key) concurrently inside the callback.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isSensitiveEnvName(name: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Run `fn` with secret-looking `process.env` entries temporarily removed,
|
|
22
|
+
* restoring the exact prior environment in a `finally` (even on throw).
|
|
23
|
+
*/
|
|
24
|
+
export declare function withoutSensitiveEnv<T>(fn: () => Promise<T>): Promise<T>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardrail for the verify-by-running trust boundary (ADR-0002, issue #3).
|
|
3
|
+
*
|
|
4
|
+
* Discovered and replayed Flow scripts are LLM-authored and run in-process via
|
|
5
|
+
* dynamic import(), so they inherit the Run's full Node authority — including
|
|
6
|
+
* whatever secrets `.env` loaded into `process.env` (notably CURSOR_API_KEY).
|
|
7
|
+
* A flow script never needs those secrets: it only drives a Playwright `page`.
|
|
8
|
+
*
|
|
9
|
+
* `withoutSensitiveEnv` removes secret-looking variables from `process.env`
|
|
10
|
+
* for the duration of a callback and restores them afterward, so a malicious or
|
|
11
|
+
* buggy generated script can't read them. It is a defense-in-depth mitigation,
|
|
12
|
+
* not a sandbox — full isolation (running scripts in a locked-down child
|
|
13
|
+
* process) is tracked separately.
|
|
14
|
+
*
|
|
15
|
+
* IMPORTANT: `process.env` is process-global, so wrap a whole batch of script
|
|
16
|
+
* executions in one call rather than each script — never run agent creation
|
|
17
|
+
* (which needs the key) concurrently inside the callback.
|
|
18
|
+
*/
|
|
19
|
+
/** A variable is treated as a secret when its name matches this pattern. */
|
|
20
|
+
const SENSITIVE_ENV_PATTERN = /(KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIAL|AUTH|PRIVATE)/i;
|
|
21
|
+
export function isSensitiveEnvName(name) {
|
|
22
|
+
return SENSITIVE_ENV_PATTERN.test(name);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Run `fn` with secret-looking `process.env` entries temporarily removed,
|
|
26
|
+
* restoring the exact prior environment in a `finally` (even on throw).
|
|
27
|
+
*/
|
|
28
|
+
export async function withoutSensitiveEnv(fn) {
|
|
29
|
+
const removed = {};
|
|
30
|
+
for (const [name, value] of Object.entries(process.env)) {
|
|
31
|
+
if (value !== undefined && isSensitiveEnvName(name)) {
|
|
32
|
+
removed[name] = value;
|
|
33
|
+
delete process.env[name];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
return await fn();
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
for (const [name, value] of Object.entries(removed)) {
|
|
41
|
+
process.env[name] = value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=sensitive-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sensitive-env.js","sourceRoot":"","sources":["../../src/run/sensitive-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,4EAA4E;AAC5E,MAAM,qBAAqB,GAAG,6DAA6D,CAAC;AAE5F,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAI,EAAoB;IAC/D,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxD,IAAI,KAAK,KAAK,SAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACtB,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC5B,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/setup/wizard.js
CHANGED
|
@@ -2,6 +2,8 @@ import * as p from '@clack/prompts';
|
|
|
2
2
|
import pc from 'picocolors';
|
|
3
3
|
import { appendDotEnv, ensureGitignore, loadDotEnv, saveConfig } from '../config.js';
|
|
4
4
|
import { EFFORT_BUDGETS } from '../run/effort.js';
|
|
5
|
+
/** How users must invoke us via npx — bare "autoend" is npm-blocked (see README). */
|
|
6
|
+
const PACKAGE = '@bonyadnouri/autoend';
|
|
5
7
|
const EFFORT_CHOICES = [
|
|
6
8
|
{ value: 'low', label: 'low', hint: 'quick pass · ~1-2 min' },
|
|
7
9
|
{ value: 'mid', label: 'mid', hint: 'everyday runs · ~2-3 min' },
|
|
@@ -63,9 +65,9 @@ export async function runSetupWizard(repoRoot) {
|
|
|
63
65
|
: 'Config written');
|
|
64
66
|
const budget = EFFORT_BUDGETS[effort];
|
|
65
67
|
p.note([
|
|
66
|
-
`${pc.cyan(
|
|
67
|
-
`${pc.cyan(
|
|
68
|
-
`${pc.cyan(
|
|
68
|
+
`${pc.cyan(`npx ${PACKAGE}`)} run with your defaults`,
|
|
69
|
+
`${pc.cyan(`npx ${PACKAGE} <url>`)} run against another target`,
|
|
70
|
+
`${pc.cyan(`npx ${PACKAGE} -e high`)} push harder for one run`,
|
|
69
71
|
'',
|
|
70
72
|
pc.dim(`Defaults: ${target} · effort ${effort} (${budget.explorers} explorers, ${budget.seconds}s exploration)`),
|
|
71
73
|
pc.dim(`Commit ${pc.reset(pc.dim('.autoend/flows/'))} — it is your team's shared baseline.`),
|
package/dist/setup/wizard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/setup/wizard.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/setup/wizard.ts"],"names":[],"mappings":"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"}
|