@e2edev/e2e 0.5.1 → 0.6.1
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 +24 -11
- package/dist/agent/act.d.ts +1 -1
- package/dist/agent/act.js +4 -2
- package/dist/agent/act.js.map +1 -1
- package/dist/agent/ai-sdk.d.ts +1 -2
- package/dist/agent/ai-sdk.d.ts.map +1 -1
- package/dist/agent/ai-sdk.js +1 -2
- package/dist/agent/ai-sdk.js.map +1 -1
- package/dist/agent/default-agent.d.ts +7 -3
- package/dist/agent/default-agent.d.ts.map +1 -1
- package/dist/agent/default-agent.js +2 -2
- package/dist/agent/default-agent.js.map +1 -1
- package/dist/agent/derived.d.ts +1 -1
- package/dist/agent/derived.js +1 -1
- package/dist/agent/error.d.ts +2 -2
- package/dist/agent/error.d.ts.map +1 -1
- package/dist/agent/error.js +2 -2
- package/dist/agent/error.js.map +1 -1
- package/dist/agent/executor.d.ts +8 -3
- package/dist/agent/executor.d.ts.map +1 -1
- package/dist/agent/executor.js +1 -1
- package/dist/agent/executor.js.map +1 -1
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +8 -5
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/invocation.d.ts +2 -2
- package/dist/agent/invocation.d.ts.map +1 -1
- package/dist/agent/invocation.js +9 -3
- package/dist/agent/invocation.js.map +1 -1
- package/dist/agent/ledger.d.ts +1 -1
- package/dist/agent/ledger.js +1 -1
- package/dist/agent/model/adapter.d.ts +7 -4
- package/dist/agent/model/adapter.d.ts.map +1 -1
- package/dist/agent/model/adapter.js +2 -2
- package/dist/agent/model/adapter.js.map +1 -1
- package/dist/agent/model/router.d.ts +1 -1
- package/dist/agent/model/router.d.ts.map +1 -1
- package/dist/agent/model/router.js +1 -1
- package/dist/agent/model/router.js.map +1 -1
- package/dist/agent/model/sdk.d.ts +11 -1
- package/dist/agent/model/sdk.d.ts.map +1 -1
- package/dist/agent/model/sdk.js +54 -10
- package/dist/agent/model/sdk.js.map +1 -1
- package/dist/agent/observation.d.ts +1 -1
- package/dist/agent/observation.d.ts.map +1 -1
- package/dist/agent/observation.js +2 -2
- package/dist/agent/observation.js.map +1 -1
- package/dist/agent/prompts.d.ts +1 -1
- package/dist/agent/prompts.js +1 -1
- package/dist/agent/protocol.d.ts +2 -3
- package/dist/agent/protocol.d.ts.map +1 -1
- package/dist/agent/protocol.js +2 -3
- package/dist/agent/protocol.js.map +1 -1
- package/dist/agent/public.d.ts +1 -1
- package/dist/agent/public.js +1 -1
- package/dist/agent/replay.d.ts +1 -1
- package/dist/agent/replay.js +1 -1
- package/dist/agent/secrets.d.ts +1 -1
- package/dist/agent/secrets.d.ts.map +1 -1
- package/dist/agent/secrets.js +1 -1
- package/dist/agent/secrets.js.map +1 -1
- package/dist/agent/step-cache.d.ts +1 -1
- package/dist/agent/step-cache.d.ts.map +1 -1
- package/dist/agent/step-cache.js +7 -1
- package/dist/agent/step-cache.js.map +1 -1
- package/dist/agent/tool-loop.d.ts +7 -3
- package/dist/agent/tool-loop.d.ts.map +1 -1
- package/dist/agent/tool-loop.js +6 -5
- package/dist/agent/tool-loop.js.map +1 -1
- package/dist/agent/usage.d.ts +6 -1
- package/dist/agent/usage.d.ts.map +1 -1
- package/dist/agent/usage.js +12 -0
- package/dist/agent/usage.js.map +1 -1
- package/dist/cache/anchors.d.ts +1 -1
- package/dist/cache/anchors.js +1 -1
- package/dist/cache/context.d.ts +6 -1
- package/dist/cache/context.d.ts.map +1 -1
- package/dist/cache/context.js +2 -1
- package/dist/cache/context.js.map +1 -1
- package/dist/cache/decide.d.ts +1 -1
- package/dist/cache/decide.js +1 -1
- package/dist/cache/identity.d.ts +1 -1
- package/dist/cache/identity.js +1 -1
- package/dist/cache/recorder.d.ts +4 -2
- package/dist/cache/recorder.d.ts.map +1 -1
- package/dist/cache/recorder.js +10 -1
- package/dist/cache/recorder.js.map +1 -1
- package/dist/cache/relocate.d.ts +1 -1
- package/dist/cache/relocate.js +1 -1
- package/dist/cache/store.d.ts +1 -1
- package/dist/cache/store.js +1 -1
- package/dist/cache/trace.d.ts +16 -1
- package/dist/cache/trace.d.ts.map +1 -1
- package/dist/cache/trace.js +22 -1
- package/dist/cache/trace.js.map +1 -1
- package/dist/cli/bin.js +9 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/cache.d.ts +25 -0
- package/dist/cli/cache.d.ts.map +1 -0
- package/dist/cli/cache.js +249 -0
- package/dist/cli/cache.js.map +1 -0
- package/dist/cli/docs-url.d.ts +3 -0
- package/dist/cli/docs-url.d.ts.map +1 -0
- package/dist/cli/docs-url.js +3 -0
- package/dist/cli/docs-url.js.map +1 -0
- package/dist/cli/guide.d.ts +4 -0
- package/dist/cli/guide.d.ts.map +1 -0
- package/dist/cli/guide.js +16 -0
- package/dist/cli/guide.js.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +210 -41
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/agent-skill.d.ts +34 -0
- package/dist/cli/init/agent-skill.d.ts.map +1 -0
- package/dist/cli/init/agent-skill.js +44 -0
- package/dist/cli/init/agent-skill.js.map +1 -0
- package/dist/cli/init/engines.d.ts +31 -23
- package/dist/cli/init/engines.d.ts.map +1 -1
- package/dist/cli/init/engines.js +34 -24
- package/dist/cli/init/engines.js.map +1 -1
- package/dist/cli/init/package.d.ts +19 -3
- package/dist/cli/init/package.d.ts.map +1 -1
- package/dist/cli/init/package.js +20 -20
- package/dist/cli/init/package.js.map +1 -1
- package/dist/cli/init/scaffold.d.ts.map +1 -1
- package/dist/cli/init/scaffold.js +5 -3
- package/dist/cli/init/scaffold.js.map +1 -1
- package/dist/cli/init.d.ts +14 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +94 -16
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/signals.d.ts +4 -1
- package/dist/cli/signals.d.ts.map +1 -1
- package/dist/cli/signals.js +8 -2
- package/dist/cli/signals.js.map +1 -1
- package/dist/cli/skill.d.ts +16 -0
- package/dist/cli/skill.d.ts.map +1 -0
- package/dist/cli/skill.js +57 -0
- package/dist/cli/skill.js.map +1 -0
- package/dist/collect/collect.d.ts +9 -1
- package/dist/collect/collect.d.ts.map +1 -1
- package/dist/collect/collect.js +50 -5
- package/dist/collect/collect.js.map +1 -1
- package/dist/collect/registry.d.ts +1 -1
- package/dist/collect/registry.d.ts.map +1 -1
- package/dist/collect/registry.js +1 -1
- package/dist/collect/registry.js.map +1 -1
- package/dist/collect/select.d.ts +1 -1
- package/dist/collect/select.d.ts.map +1 -1
- package/dist/collect/select.js +77 -8
- package/dist/collect/select.js.map +1 -1
- package/dist/config/agent.d.ts +14 -2
- package/dist/config/agent.d.ts.map +1 -1
- package/dist/config/agent.js +53 -16
- package/dist/config/agent.js.map +1 -1
- package/dist/config/app.d.ts +2 -2
- package/dist/config/app.d.ts.map +1 -1
- package/dist/config/app.js +3 -3
- package/dist/config/app.js.map +1 -1
- package/dist/config/diagnose.d.ts +15 -0
- package/dist/config/diagnose.d.ts.map +1 -0
- package/dist/config/diagnose.js +122 -0
- package/dist/config/diagnose.js.map +1 -0
- package/dist/config/load.d.ts +9 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +35 -3
- package/dist/config/load.js.map +1 -1
- package/dist/config/resolve.d.ts +2 -2
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +51 -16
- package/dist/config/resolve.js.map +1 -1
- package/dist/config/validate.d.ts +6 -2
- package/dist/config/validate.d.ts.map +1 -1
- package/dist/config/validate.js +20 -3
- package/dist/config/validate.js.map +1 -1
- package/dist/credentials.d.ts +1 -1
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +1 -1
- package/dist/credentials.js.map +1 -1
- package/dist/engine/contract.d.ts +2 -2
- package/dist/engine/contract.js +1 -1
- package/dist/engine/index.d.ts +2 -2
- package/dist/engine/index.js +3 -3
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/session.d.ts +1 -1
- package/dist/engine/session.d.ts.map +1 -1
- package/dist/engine/session.js +5 -2
- package/dist/engine/session.js.map +1 -1
- package/dist/expect/async.d.ts +1 -1
- package/dist/expect/async.d.ts.map +1 -1
- package/dist/expect/async.js +37 -1
- package/dist/expect/async.js.map +1 -1
- package/dist/expect/values.d.ts +1 -1
- package/dist/expect/values.d.ts.map +1 -1
- package/dist/expect/values.js +1 -1
- package/dist/expect/values.js.map +1 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +1 -1
- package/dist/internal/errors.d.ts +21 -3
- package/dist/internal/errors.d.ts.map +1 -1
- package/dist/internal/errors.js +55 -5
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/globs.d.ts +2 -2
- package/dist/internal/globs.d.ts.map +1 -1
- package/dist/internal/globs.js +2 -2
- package/dist/internal/globs.js.map +1 -1
- package/dist/internal/ids.d.ts +3 -3
- package/dist/internal/ids.d.ts.map +1 -1
- package/dist/internal/ids.js +3 -3
- package/dist/internal/ids.js.map +1 -1
- package/dist/internal/node-version.d.ts +10 -0
- package/dist/internal/node-version.d.ts.map +1 -0
- package/dist/internal/node-version.js +28 -0
- package/dist/internal/node-version.js.map +1 -0
- package/dist/internal/package-manager.d.ts +10 -0
- package/dist/internal/package-manager.d.ts.map +1 -0
- package/dist/internal/package-manager.js +43 -0
- package/dist/internal/package-manager.js.map +1 -0
- package/dist/internal/redact.d.ts +1 -1
- package/dist/internal/redact.d.ts.map +1 -1
- package/dist/internal/redact.js +1 -1
- package/dist/internal/redact.js.map +1 -1
- package/dist/internal/suggest.d.ts +16 -0
- package/dist/internal/suggest.d.ts.map +1 -0
- package/dist/internal/suggest.js +61 -0
- package/dist/internal/suggest.js.map +1 -0
- package/dist/internal/text.d.ts +1 -1
- package/dist/internal/text.d.ts.map +1 -1
- package/dist/internal/text.js +1 -1
- package/dist/internal/text.js.map +1 -1
- package/dist/internal/urls.d.ts +2 -2
- package/dist/internal/urls.d.ts.map +1 -1
- package/dist/internal/urls.js +2 -2
- package/dist/internal/urls.js.map +1 -1
- package/dist/locator/engine.d.ts +1 -1
- package/dist/locator/engine.d.ts.map +1 -1
- package/dist/locator/engine.js +1 -1
- package/dist/locator/engine.js.map +1 -1
- package/dist/locator/expression.d.ts +1 -1
- package/dist/locator/expression.d.ts.map +1 -1
- package/dist/locator/expression.js +1 -1
- package/dist/locator/expression.js.map +1 -1
- package/dist/locator/screen.js +1 -1
- package/dist/locator/screen.js.map +1 -1
- package/dist/report/build.d.ts +1 -1
- package/dist/report/build.d.ts.map +1 -1
- package/dist/report/build.js +4 -4
- package/dist/report/build.js.map +1 -1
- package/dist/report/format.d.ts +9 -1
- package/dist/report/format.d.ts.map +1 -1
- package/dist/report/format.js +17 -4
- package/dist/report/format.js.map +1 -1
- package/dist/report/junit.d.ts +1 -1
- package/dist/report/junit.d.ts.map +1 -1
- package/dist/report/junit.js +1 -1
- package/dist/report/junit.js.map +1 -1
- package/dist/report/list-model.d.ts +79 -0
- package/dist/report/list-model.d.ts.map +1 -0
- package/dist/report/list-model.js +10 -0
- package/dist/report/list-model.js.map +1 -0
- package/dist/report/list-steps.d.ts +27 -0
- package/dist/report/list-steps.d.ts.map +1 -0
- package/dist/report/list-steps.js +65 -0
- package/dist/report/list-steps.js.map +1 -0
- package/dist/report/list.d.ts +26 -24
- package/dist/report/list.d.ts.map +1 -1
- package/dist/report/list.js +89 -157
- package/dist/report/list.js.map +1 -1
- package/dist/report/live-window.d.ts +11 -0
- package/dist/report/live-window.d.ts.map +1 -1
- package/dist/report/live-window.js +12 -5
- package/dist/report/live-window.js.map +1 -1
- package/dist/report/running-tree.d.ts +46 -0
- package/dist/report/running-tree.d.ts.map +1 -0
- package/dist/report/running-tree.js +182 -0
- package/dist/report/running-tree.js.map +1 -0
- package/dist/report/write.d.ts +1 -1
- package/dist/report/write.d.ts.map +1 -1
- package/dist/report/write.js +1 -1
- package/dist/report/write.js.map +1 -1
- package/dist/run/budget.d.ts +2 -2
- package/dist/run/budget.js +2 -2
- package/dist/run/declared-processes.d.ts +1 -1
- package/dist/run/declared-processes.js +1 -1
- package/dist/run/events.d.ts +2 -0
- package/dist/run/events.d.ts.map +1 -1
- package/dist/run/events.js.map +1 -1
- package/dist/run/execute.d.ts +2 -3
- package/dist/run/execute.d.ts.map +1 -1
- package/dist/run/execute.js +4 -5
- package/dist/run/execute.js.map +1 -1
- package/dist/run/fixtures.d.ts +1 -1
- package/dist/run/fixtures.d.ts.map +1 -1
- package/dist/run/fixtures.js +41 -5
- package/dist/run/fixtures.js.map +1 -1
- package/dist/run/managed-process.d.ts +8 -1
- package/dist/run/managed-process.d.ts.map +1 -1
- package/dist/run/managed-process.js +35 -17
- package/dist/run/managed-process.js.map +1 -1
- package/dist/run/realm.d.ts +2 -2
- package/dist/run/realm.js +2 -2
- package/dist/run/runner.d.ts +22 -0
- package/dist/run/runner.d.ts.map +1 -1
- package/dist/run/runner.js +47 -9
- package/dist/run/runner.js.map +1 -1
- package/dist/run/scheduler.d.ts +1 -2
- package/dist/run/scheduler.d.ts.map +1 -1
- package/dist/run/scheduler.js +2 -3
- package/dist/run/scheduler.js.map +1 -1
- package/dist/run/serial.d.ts +1 -1
- package/dist/run/serial.d.ts.map +1 -1
- package/dist/run/serial.js +3 -3
- package/dist/run/serial.js.map +1 -1
- package/dist/run/sessions.d.ts +1 -1
- package/dist/run/sessions.d.ts.map +1 -1
- package/dist/run/sessions.js +1 -1
- package/dist/run/sessions.js.map +1 -1
- package/dist/run/steps.d.ts +8 -2
- package/dist/run/steps.d.ts.map +1 -1
- package/dist/run/steps.js +1 -1
- package/dist/run/steps.js.map +1 -1
- package/dist/run/units.d.ts +1 -1
- package/dist/run/units.js +1 -1
- package/dist/types.d.ts +27 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/package.json +13 -12
- package/skills/e2e/SKILL.md +110 -0
- package/skills/e2e/references/agent.md +210 -0
- package/skills/e2e/references/debugging.md +81 -0
- package/skills/e2e/references/running.md +153 -0
- package/skills/e2e/references/setup.md +239 -0
- package/skills/e2e/references/writing-tests.md +289 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** package.json reading
|
|
1
|
+
/** package.json reading and dependency additions for `e2e init`. */
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
declare const packageSchema: z.ZodObject<{
|
|
4
4
|
dependencies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
@@ -6,6 +6,7 @@ declare const packageSchema: z.ZodObject<{
|
|
|
6
6
|
peerDependencies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
7
7
|
optionalDependencies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
8
8
|
packageManager: z.ZodOptional<z.ZodString>;
|
|
9
|
+
scripts: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
9
10
|
}, z.core.$loose>;
|
|
10
11
|
type PackageManifest = z.infer<typeof packageSchema>;
|
|
11
12
|
/**
|
|
@@ -21,8 +22,11 @@ export declare function readPackage(cwd: string): {
|
|
|
21
22
|
peerDependencies?: Record<string, string> | undefined;
|
|
22
23
|
optionalDependencies?: Record<string, string> | undefined;
|
|
23
24
|
packageManager?: string | undefined;
|
|
25
|
+
scripts?: Record<string, string> | undefined;
|
|
24
26
|
};
|
|
25
27
|
};
|
|
28
|
+
/** Why a manifest failed to read: the JSON parser's own position, or the field that has the wrong shape. */
|
|
29
|
+
export declare function describeManifestError(cause: unknown): string;
|
|
26
30
|
/** Adds only missing dependencies to devDependencies and returns what was added. */
|
|
27
31
|
export declare function addDependencies(manifest: PackageManifest, dependencies: Readonly<Record<string, string>>): {
|
|
28
32
|
manifest: {
|
|
@@ -32,11 +36,23 @@ export declare function addDependencies(manifest: PackageManifest, dependencies:
|
|
|
32
36
|
peerDependencies?: Record<string, string> | undefined;
|
|
33
37
|
optionalDependencies?: Record<string, string> | undefined;
|
|
34
38
|
packageManager?: string | undefined;
|
|
39
|
+
scripts?: Record<string, string> | undefined;
|
|
40
|
+
};
|
|
41
|
+
additions: [string, string][];
|
|
42
|
+
};
|
|
43
|
+
/** Adds only missing scripts and returns what was added. */
|
|
44
|
+
export declare function addScripts(manifest: PackageManifest, scripts: Readonly<Record<string, string>>): {
|
|
45
|
+
manifest: {
|
|
46
|
+
[x: string]: unknown;
|
|
47
|
+
dependencies?: Record<string, string> | undefined;
|
|
48
|
+
devDependencies?: Record<string, string> | undefined;
|
|
49
|
+
peerDependencies?: Record<string, string> | undefined;
|
|
50
|
+
optionalDependencies?: Record<string, string> | undefined;
|
|
51
|
+
packageManager?: string | undefined;
|
|
52
|
+
scripts?: Record<string, string> | undefined;
|
|
35
53
|
};
|
|
36
54
|
additions: [string, string][];
|
|
37
55
|
};
|
|
38
|
-
/** The `packageManager` field wins, then a lockfile, then the manager that invoked the CLI, then npm. */
|
|
39
|
-
export declare function detectPackageManager(cwd: string, manifest: PackageManifest): string;
|
|
40
56
|
/** Serializes with the original manifest's indentation and newline convention. */
|
|
41
57
|
export declare function serializePackage(manifest: PackageManifest, original: string | undefined): string;
|
|
42
58
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../../src/cli/init/package.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../../src/cli/init/package.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAIpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,QAAA,MAAM,aAAa;;;;;;;iBAOjB,CAAC;AACH,KAAK,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAErD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM;;;;;;;;;;;EAKtC;AAED,4GAA4G;AAC5G,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAO5D;AAQD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;;;;;;;;;;EAOxG;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;;;;;;;;;;EAO9F;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAIhG"}
|
package/dist/cli/init/package.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** package.json reading
|
|
1
|
+
/** package.json reading and dependency additions for `e2e init`. */
|
|
2
2
|
import { existsSync, readFileSync } from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { z } from 'zod';
|
|
@@ -9,15 +9,8 @@ const packageSchema = z.looseObject({
|
|
|
9
9
|
peerDependencies: dependencyBlock,
|
|
10
10
|
optionalDependencies: dependencyBlock,
|
|
11
11
|
packageManager: z.string().optional(),
|
|
12
|
+
scripts: z.record(z.string(), z.string()).optional(),
|
|
12
13
|
});
|
|
13
|
-
const PACKAGE_MANAGERS = new Set(['npm', 'pnpm', 'yarn', 'bun']);
|
|
14
|
-
const LOCKFILES = [
|
|
15
|
-
['pnpm-lock.yaml', 'pnpm'],
|
|
16
|
-
['yarn.lock', 'yarn'],
|
|
17
|
-
['bun.lock', 'bun'],
|
|
18
|
-
['bun.lockb', 'bun'],
|
|
19
|
-
['package-lock.json', 'npm'],
|
|
20
|
-
];
|
|
21
14
|
/**
|
|
22
15
|
* Reads and validates the manifest, keeping its original text so edits can
|
|
23
16
|
* preserve formatting. A missing manifest starts as a private ESM package.
|
|
@@ -28,6 +21,15 @@ export function readPackage(cwd) {
|
|
|
28
21
|
const manifest = packageSchema.parse(original === undefined ? { private: true, type: 'module' } : JSON.parse(original));
|
|
29
22
|
return { original, manifest };
|
|
30
23
|
}
|
|
24
|
+
/** Why a manifest failed to read: the JSON parser's own position, or the field that has the wrong shape. */
|
|
25
|
+
export function describeManifestError(cause) {
|
|
26
|
+
if (cause instanceof z.ZodError) {
|
|
27
|
+
return cause.issues
|
|
28
|
+
.map((issue) => `${issue.path.length === 0 ? 'package.json' : issue.path.join('.')}: ${issue.message}`)
|
|
29
|
+
.join('; ');
|
|
30
|
+
}
|
|
31
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
32
|
+
}
|
|
31
33
|
/** True when any dependency section lists `name`, so existing versions and workspace links are kept. */
|
|
32
34
|
function declaresDependency(manifest, name) {
|
|
33
35
|
return [manifest.dependencies, manifest.devDependencies, manifest.peerDependencies, manifest.optionalDependencies]
|
|
@@ -43,17 +45,15 @@ export function addDependencies(manifest, dependencies) {
|
|
|
43
45
|
additions,
|
|
44
46
|
};
|
|
45
47
|
}
|
|
46
|
-
/**
|
|
47
|
-
export function
|
|
48
|
-
const
|
|
49
|
-
if (
|
|
50
|
-
return
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
const invoking = process.env['npm_config_user_agent']?.split('/')[0];
|
|
56
|
-
return invoking !== undefined && PACKAGE_MANAGERS.has(invoking) ? invoking : 'npm';
|
|
48
|
+
/** Adds only missing scripts and returns what was added. */
|
|
49
|
+
export function addScripts(manifest, scripts) {
|
|
50
|
+
const additions = Object.entries(scripts).filter(([name]) => manifest.scripts?.[name] === undefined);
|
|
51
|
+
if (additions.length === 0)
|
|
52
|
+
return { manifest, additions };
|
|
53
|
+
return {
|
|
54
|
+
manifest: { ...manifest, scripts: { ...manifest.scripts, ...Object.fromEntries(additions) } },
|
|
55
|
+
additions,
|
|
56
|
+
};
|
|
57
57
|
}
|
|
58
58
|
/** Serializes with the original manifest's indentation and newline convention. */
|
|
59
59
|
export function serializePackage(manifest, original) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/cli/init/package.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/cli/init/package.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../src/cli/init/scaffold.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../src/cli/init/scaffold.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAU9D,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO;;;;;;;;EA2B7D"}
|
|
@@ -2,6 +2,8 @@ import { packageVersion } from '../../internal/package-version.js';
|
|
|
2
2
|
import { getEnginePreset } from './engines.js';
|
|
3
3
|
const AGENT_IMPORT = "import { createAgent } from '@e2edev/e2e/agent';";
|
|
4
4
|
const AGENT_CONFIG = ` // The model comes from E2E_MODEL; authenticate with E2E_MODEL_API_KEY.
|
|
5
|
+
// E2E_MODEL_ENDPOINT points at another OpenAI-compatible endpoint (default: the AI Gateway).
|
|
6
|
+
// To call a provider directly, pass an AI SDK model: createAgent({ model: openai('gpt-5.4-mini') }).
|
|
5
7
|
agent: createAgent({
|
|
6
8
|
system: 'You are a thorough QA agent. Verify every outcome.',
|
|
7
9
|
}),`;
|
|
@@ -9,7 +11,7 @@ const AGENT_CONFIG = ` // The model comes from E2E_MODEL; authenticate with E2E
|
|
|
9
11
|
export function createScaffold(engineId, ai) {
|
|
10
12
|
const engine = getEnginePreset(engineId);
|
|
11
13
|
const imports = [
|
|
12
|
-
"import {
|
|
14
|
+
"import type { E2EConfig } from '@e2edev/e2e';",
|
|
13
15
|
...(ai ? [AGENT_IMPORT] : []),
|
|
14
16
|
...engine.imports,
|
|
15
17
|
];
|
|
@@ -25,9 +27,9 @@ export function createScaffold(engineId, ai) {
|
|
|
25
27
|
},
|
|
26
28
|
config: `${imports.join('\n')}
|
|
27
29
|
|
|
28
|
-
export default
|
|
30
|
+
export default {
|
|
29
31
|
${configFields.join('\n')}
|
|
30
|
-
}
|
|
32
|
+
} satisfies E2EConfig;
|
|
31
33
|
`,
|
|
32
34
|
example: engine.example + (ai ? engine.aiExample ?? '' : ''),
|
|
33
35
|
runCommand: engine.runCommand,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/cli/init/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAiB,MAAM,cAAc,CAAC;AAE9D,MAAM,YAAY,GAAG,kDAAkD,CAAC;AACxE,MAAM,YAAY,GAAG
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/cli/init/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAiB,MAAM,cAAc,CAAC;AAE9D,MAAM,YAAY,GAAG,kDAAkD,CAAC;AACxE,MAAM,YAAY,GAAG;;;;;MAKf,CAAC;AAEP,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAAC,QAAkB,EAAE,EAAW;IAC5D,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG;QACd,+CAA+C;QAC/C,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,MAAM,CAAC,OAAO;KAClB,CAAC;IACF,MAAM,YAAY,GAAG;QACnB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM;KACd,CAAC;IAEF,OAAO;QACL,YAAY,EAAE;YACZ,aAAa,EAAE,IAAI,cAAc,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,uBAAuB,EAAE,OAAO,CAAC,EAAE;YACtF,GAAG,MAAM,CAAC,YAAY;YACtB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC;QACD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAG/B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;CAExB;QACG,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC"}
|
package/dist/cli/init.d.ts
CHANGED
|
@@ -1,11 +1,23 @@
|
|
|
1
|
-
/** Non-destructive project scaffolding
|
|
1
|
+
/** Non-destructive project scaffolding. */
|
|
2
2
|
export interface InitOptions {
|
|
3
3
|
yes?: boolean;
|
|
4
|
+
/**
|
|
5
|
+
* The directory argument as the user typed it, when `cwd` was chosen from
|
|
6
|
+
* one; the closing `next:` line then starts with `cd` into it.
|
|
7
|
+
*/
|
|
8
|
+
directory?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Whether prompts can be answered. The CLI passes its terminal state; a
|
|
11
|
+
* non-interactive run without `--yes` stops before asking anything, since
|
|
12
|
+
* a prompt nobody can answer would otherwise wait forever.
|
|
13
|
+
*/
|
|
14
|
+
interactive?: boolean;
|
|
4
15
|
}
|
|
5
16
|
/**
|
|
6
17
|
* Runs `e2e init`. Every prompt happens before the first write, existing
|
|
7
18
|
* config and test files are never touched, and dependencies install only when
|
|
8
|
-
* the user asks.
|
|
19
|
+
* the user asks. The agent skill is offered once; later runs refresh the
|
|
20
|
+
* copies that exist and never add new locations.
|
|
9
21
|
*/
|
|
10
22
|
export declare function init(cwd: string, options?: InitOptions): Promise<number>;
|
|
11
23
|
//# sourceMappingURL=init.d.ts.map
|
package/dist/cli/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAgB3C,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAiBD;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoKlF"}
|
package/dist/cli/init.js
CHANGED
|
@@ -1,35 +1,56 @@
|
|
|
1
|
-
/** Non-destructive project scaffolding
|
|
1
|
+
/** Non-destructive project scaffolding. */
|
|
2
2
|
import * as clack from '@clack/prompts';
|
|
3
3
|
import { spawnSync } from 'node:child_process';
|
|
4
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import os from 'node:os';
|
|
5
6
|
import path from 'node:path';
|
|
6
7
|
import { esmPackageHint } from '../config/esm.js';
|
|
8
|
+
import { detectPackageManager } from '../internal/package-manager.js';
|
|
9
|
+
import { DOCS_URL } from './docs-url.js';
|
|
10
|
+
import { findInstalledSkillDirs, planSkillInstall, SKILL_LOCATIONS } from './init/agent-skill.js';
|
|
7
11
|
import { getEnginePresets, DEFAULT_ENGINE_ID } from './init/engines.js';
|
|
8
|
-
import { addDependencies,
|
|
12
|
+
import { addDependencies, addScripts, describeManifestError, readPackage, serializePackage } from './init/package.js';
|
|
9
13
|
import { createScaffold } from './init/scaffold.js';
|
|
14
|
+
import { MISSING_SKILL_MESSAGE, readSkillFiles } from './skill.js';
|
|
15
|
+
const CACHE_IGNORE_ENTRY = '.e2e/cache/';
|
|
10
16
|
const GITIGNORE_ENTRIES = [
|
|
11
17
|
'node_modules/',
|
|
12
18
|
'.e2e/artifacts/',
|
|
13
|
-
|
|
19
|
+
CACHE_IGNORE_ENTRY,
|
|
14
20
|
'.e2e/sessions/',
|
|
15
21
|
'.e2e/report.json',
|
|
16
22
|
'.e2e/ai-trace.json',
|
|
17
23
|
'.e2e/junit.xml',
|
|
18
24
|
'.e2e/logs/',
|
|
19
25
|
];
|
|
26
|
+
const SCRIPTS = { 'test:e2e': 'e2e run' };
|
|
20
27
|
/**
|
|
21
28
|
* Runs `e2e init`. Every prompt happens before the first write, existing
|
|
22
29
|
* config and test files are never touched, and dependencies install only when
|
|
23
|
-
* the user asks.
|
|
30
|
+
* the user asks. The agent skill is offered once; later runs refresh the
|
|
31
|
+
* copies that exist and never add new locations.
|
|
24
32
|
*/
|
|
25
33
|
export async function init(cwd, options = {}) {
|
|
26
|
-
clack.intro('e2e init');
|
|
34
|
+
clack.intro(options.directory === undefined ? 'e2e init' : `e2e init ${options.directory}`);
|
|
35
|
+
if (options.interactive === false && !options.yes) {
|
|
36
|
+
clack.log.error('e2e init asks questions and needs an interactive terminal; run it from a terminal, or pass --yes to accept the defaults (Playwright, AI on, no installation)');
|
|
37
|
+
return 2;
|
|
38
|
+
}
|
|
39
|
+
if (existsSync(cwd) && !statSync(cwd).isDirectory()) {
|
|
40
|
+
clack.log.error(`${options.directory ?? cwd} is a file, not a directory`);
|
|
41
|
+
return 2;
|
|
42
|
+
}
|
|
27
43
|
let pkg;
|
|
28
44
|
try {
|
|
29
45
|
pkg = readPackage(cwd);
|
|
30
46
|
}
|
|
31
|
-
catch {
|
|
32
|
-
clack.log.error('
|
|
47
|
+
catch (cause) {
|
|
48
|
+
clack.log.error(`${path.join(cwd, 'package.json')} could not be read: ${describeManifestError(cause)}; fix it before running e2e init`);
|
|
49
|
+
return 2;
|
|
50
|
+
}
|
|
51
|
+
const bundledSkill = readSkillFiles();
|
|
52
|
+
if (bundledSkill.length === 0) {
|
|
53
|
+
clack.log.error(MISSING_SKILL_MESSAGE);
|
|
33
54
|
return 2;
|
|
34
55
|
}
|
|
35
56
|
const existingConfig = ['e2e.config.ts', 'e2e.config.mts'].find((file) => existsSync(path.join(cwd, file)));
|
|
@@ -49,7 +70,7 @@ export async function init(cwd, options = {}) {
|
|
|
49
70
|
const ignoreLines = existingIgnore.split(/\r?\n/);
|
|
50
71
|
const missingIgnore = GITIGNORE_ENTRIES.filter((entry) => !ignoreLines.includes(entry));
|
|
51
72
|
// Engine and AI are choices for a new config only; an existing config keeps its own dependencies.
|
|
52
|
-
let engine = DEFAULT_ENGINE_ID;
|
|
73
|
+
let engine = existingConfig === undefined ? DEFAULT_ENGINE_ID : 'none';
|
|
53
74
|
let ai = existingConfig === undefined;
|
|
54
75
|
if (existingConfig === undefined && !options.yes) {
|
|
55
76
|
const selectedEngine = await clack.select({
|
|
@@ -65,32 +86,56 @@ export async function init(cwd, options = {}) {
|
|
|
65
86
|
return cancelled();
|
|
66
87
|
ai = enableAi;
|
|
67
88
|
}
|
|
89
|
+
// The skill goes where an earlier run put it; a project without one chooses.
|
|
90
|
+
let skillDirs = findInstalledSkillDirs(cwd);
|
|
91
|
+
if (skillDirs.length === 0) {
|
|
92
|
+
if (options.yes) {
|
|
93
|
+
skillDirs = SKILL_LOCATIONS.map((location) => location.dir);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const selected = await clack.multiselect({
|
|
97
|
+
message: 'Install the e2e skill for coding agents?',
|
|
98
|
+
options: SKILL_LOCATIONS.map(({ dir, hint }) => ({ value: dir, label: dir, hint })),
|
|
99
|
+
initialValues: SKILL_LOCATIONS.map((location) => location.dir),
|
|
100
|
+
required: false,
|
|
101
|
+
});
|
|
102
|
+
if (clack.isCancel(selected))
|
|
103
|
+
return cancelled();
|
|
104
|
+
skillDirs = selected;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const skillInstalls = planSkillInstall(cwd, skillDirs, bundledSkill);
|
|
68
108
|
const scaffold = createScaffold(engine, ai);
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
109
|
+
const dependencies = addDependencies(pkg.manifest, scaffold.dependencies);
|
|
110
|
+
const { manifest, additions: scripts } = addScripts(dependencies.manifest, SCRIPTS);
|
|
111
|
+
if (dependencies.additions.length > 0) {
|
|
112
|
+
clack.log.info(`add dev dependencies: ${dependencies.additions.map(([name, version]) => `${name}@${version}`).join(', ')}`);
|
|
113
|
+
}
|
|
114
|
+
if (scripts.length > 0) {
|
|
115
|
+
clack.log.info(`add scripts: ${scripts.map(([name, command]) => `${name} (${command})`).join(', ')}`);
|
|
72
116
|
}
|
|
73
117
|
const files = [
|
|
74
|
-
...(pkg.original === undefined || additions.length > 0
|
|
118
|
+
...(pkg.original === undefined || dependencies.additions.length > 0 || scripts.length > 0
|
|
75
119
|
? [{ relative: 'package.json', content: serializePackage(manifest, pkg.original), existing: pkg.original !== undefined }]
|
|
76
120
|
: []),
|
|
77
121
|
...(existingConfig === undefined ? [{ relative: 'e2e.config.ts', content: scaffold.config, existing: false }] : []),
|
|
78
122
|
...(exampleExists ? [] : [{ relative: examplePath, content: scaffold.example, existing: false }]),
|
|
79
123
|
];
|
|
80
|
-
if (files.length === 0 && missingIgnore.length === 0) {
|
|
124
|
+
if (files.length === 0 && skillInstalls.length === 0 && missingIgnore.length === 0) {
|
|
81
125
|
clack.outro('nothing to create; project already initialized');
|
|
82
126
|
return 0;
|
|
83
127
|
}
|
|
84
128
|
if (!options.yes) {
|
|
85
129
|
const actions = [
|
|
86
130
|
...files.map((file) => `${file.existing ? 'update' : 'create'} ${file.relative}`),
|
|
131
|
+
...skillInstalls.map((install) => `${install.existing ? 'update' : 'create'} ${install.relative}/`),
|
|
87
132
|
...(missingIgnore.length > 0 ? ['update .gitignore'] : []),
|
|
88
133
|
];
|
|
89
134
|
const proceed = await clack.confirm({ message: `${actions.join(', ')}?` });
|
|
90
135
|
if (clack.isCancel(proceed) || !proceed)
|
|
91
136
|
return cancelled();
|
|
92
137
|
}
|
|
93
|
-
const manager = detectPackageManager(cwd, manifest);
|
|
138
|
+
const manager = detectPackageManager(cwd, manifest.packageManager);
|
|
94
139
|
let install = false;
|
|
95
140
|
if (!options.yes) {
|
|
96
141
|
const selected = await clack.confirm({ message: `Install dependencies with ${manager}?`, initialValue: true });
|
|
@@ -98,16 +143,31 @@ export async function init(cwd, options = {}) {
|
|
|
98
143
|
return cancelled();
|
|
99
144
|
install = selected;
|
|
100
145
|
}
|
|
146
|
+
// The first write; a directory named on the command line comes into being here.
|
|
147
|
+
mkdirSync(cwd, { recursive: true });
|
|
101
148
|
for (const file of files) {
|
|
102
149
|
const absolute = path.join(cwd, file.relative);
|
|
103
150
|
mkdirSync(path.dirname(absolute), { recursive: true });
|
|
104
151
|
writeFileSync(absolute, file.content, 'utf8');
|
|
105
152
|
clack.log.success(`${file.existing ? 'updated' : 'created'} ${file.relative}`);
|
|
106
153
|
}
|
|
154
|
+
for (const skill of skillInstalls) {
|
|
155
|
+
for (const file of skill.files) {
|
|
156
|
+
mkdirSync(path.dirname(file.absolute), { recursive: true });
|
|
157
|
+
writeFileSync(file.absolute, file.content, 'utf8');
|
|
158
|
+
}
|
|
159
|
+
clack.log.success(`${skill.existing ? 'updated' : 'created'} ${skill.relative}/ (${skill.files.length} files)`);
|
|
160
|
+
}
|
|
161
|
+
if (skillDirs.length === 0) {
|
|
162
|
+
clack.log.info('skipped the agent skill; agents can still print it with npx --no-install e2e guide');
|
|
163
|
+
}
|
|
107
164
|
if (missingIgnore.length > 0) {
|
|
108
165
|
const prefix = existingIgnore === '' || existingIgnore.endsWith('\n') ? '' : '\n';
|
|
109
166
|
writeFileSync(gitignorePath, `${existingIgnore}${prefix}${missingIgnore.join('\n')}\n`, 'utf8');
|
|
110
167
|
clack.log.success(`updated .gitignore (${missingIgnore.length} entries)`);
|
|
168
|
+
if (missingIgnore.includes(CACHE_IGNORE_ENTRY)) {
|
|
169
|
+
clack.log.info(`${CACHE_IGNORE_ENTRY} is ignored; committing agent.act replays is opt-in, see ${DOCS_URL}/reference/config#commit-your-traces`);
|
|
170
|
+
}
|
|
111
171
|
}
|
|
112
172
|
if (install) {
|
|
113
173
|
const result = spawnSync(manager, ['install'], { cwd, stdio: 'inherit', shell: process.platform === 'win32' });
|
|
@@ -118,9 +178,27 @@ export async function init(cwd, options = {}) {
|
|
|
118
178
|
return result.signal === 'SIGINT' ? 130 : 2;
|
|
119
179
|
}
|
|
120
180
|
}
|
|
121
|
-
|
|
181
|
+
if (!existsSync(path.join(cwd, 'tsconfig.json'))) {
|
|
182
|
+
clack.log.info('no tsconfig.json; add one for editor completions on e2e.config.ts and tests/');
|
|
183
|
+
}
|
|
184
|
+
const next = [
|
|
185
|
+
options.directory === undefined ? undefined : `cd ${shellArgument(options.directory)}`,
|
|
186
|
+
install ? undefined : `${manager} install`,
|
|
187
|
+
scaffold.runCommand,
|
|
188
|
+
].filter((step) => step !== undefined);
|
|
189
|
+
clack.outro(`next: ${next.join(', then ')}`);
|
|
122
190
|
return 0;
|
|
123
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* A path as the user will paste it into their shell: bare while every character
|
|
194
|
+
* is safe, otherwise quoted for the platform (single quotes for POSIX shells,
|
|
195
|
+
* double quotes for cmd and PowerShell), so `apps/my web` stays one argument.
|
|
196
|
+
*/
|
|
197
|
+
function shellArgument(value) {
|
|
198
|
+
if (/^[A-Za-z0-9_./@%+=:,-]+$/.test(value))
|
|
199
|
+
return value;
|
|
200
|
+
return os.platform() === 'win32' ? `"${value.replaceAll('"', '""')}"` : `'${value.replaceAll("'", "'\\''")}'`;
|
|
201
|
+
}
|
|
124
202
|
/** Cancellation is only reachable before the first write, so nothing needs undoing. */
|
|
125
203
|
function cancelled() {
|
|
126
204
|
clack.cancel('cancelled; no changes were made');
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/signals.d.ts
CHANGED
|
@@ -8,7 +8,10 @@
|
|
|
8
8
|
* The escalation ladder behind SIGINT and SIGTERM. The next rung is the first
|
|
9
9
|
* one not yet reached, so the state is the signals themselves: the first
|
|
10
10
|
* signal interrupts, the second forces, the third exits on the spot — the
|
|
11
|
-
* last resort for a teardown that is itself stuck.
|
|
11
|
+
* last resort for a teardown that is itself stuck. That exit skips the
|
|
12
|
+
* runner's teardown, so the app and service process groups it spawned are
|
|
13
|
+
* killed first; otherwise they outlive the run in their own groups and the
|
|
14
|
+
* next run fails with `APP_ALREADY_RUNNING`.
|
|
12
15
|
*/
|
|
13
16
|
export declare class SignalLadder {
|
|
14
17
|
private readonly graceful;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/cli/signals.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/cli/signals.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAEhD,qEAAqE;IACrE,IAAI,eAAe,IAAI,WAAW,CAEjC;IAED,+EAA+E;IAC/E,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED,4DAA4D;IAC5D,GAAG,CAAC,IAAI,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAmC,GAAG,MAAM,IAAI,CAe3E;CACF"}
|
package/dist/cli/signals.js
CHANGED
|
@@ -4,11 +4,15 @@
|
|
|
4
4
|
* its own signals — so process termination is owned here, by the one caller
|
|
5
5
|
* that is the process.
|
|
6
6
|
*/
|
|
7
|
+
import { killManagedProcessGroups } from '../run/managed-process.js';
|
|
7
8
|
/**
|
|
8
9
|
* The escalation ladder behind SIGINT and SIGTERM. The next rung is the first
|
|
9
10
|
* one not yet reached, so the state is the signals themselves: the first
|
|
10
11
|
* signal interrupts, the second forces, the third exits on the spot — the
|
|
11
|
-
* last resort for a teardown that is itself stuck.
|
|
12
|
+
* last resort for a teardown that is itself stuck. That exit skips the
|
|
13
|
+
* runner's teardown, so the app and service process groups it spawned are
|
|
14
|
+
* killed first; otherwise they outlive the run in their own groups and the
|
|
15
|
+
* next run fails with `APP_ALREADY_RUNNING`.
|
|
12
16
|
*/
|
|
13
17
|
export class SignalLadder {
|
|
14
18
|
graceful = new AbortController();
|
|
@@ -28,8 +32,10 @@ export class SignalLadder {
|
|
|
28
32
|
this.graceful.abort();
|
|
29
33
|
else if (!this.forced.signal.aborted)
|
|
30
34
|
this.forced.abort();
|
|
31
|
-
else
|
|
35
|
+
else {
|
|
36
|
+
killManagedProcessGroups();
|
|
32
37
|
exit(130);
|
|
38
|
+
}
|
|
33
39
|
};
|
|
34
40
|
process.on('SIGINT', escalate);
|
|
35
41
|
process.on('SIGTERM', escalate);
|
package/dist/cli/signals.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/cli/signals.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH
|
|
1
|
+
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/cli/signals.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE;;;;;;;;GAQG;AACH,MAAM,OAAO,YAAY;IACN,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IAEhD,qEAAqE;IACrE,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,+EAA+E;IAC/E,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,4DAA4D;IAC5D,GAAG,CAAC,IAAI,GAA2B,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7D,MAAM,QAAQ,GAAG,GAAS,EAAE;YAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO;gBAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;iBACpD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;gBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;iBACrD,CAAC;gBACJ,wBAAwB,EAAE,CAAC;gBAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** The bundled agent skill: `SKILL.md` plus one reference file per `e2e guide` topic. */
|
|
2
|
+
export declare const SKILL_NAME = "e2e";
|
|
3
|
+
/** Printed when a build or an install left the skill files out of the package. */
|
|
4
|
+
export declare const MISSING_SKILL_MESSAGE = "this installation ships no skill files; reinstall @e2edev/e2e";
|
|
5
|
+
export interface SkillFile {
|
|
6
|
+
/** Path relative to the skill root with `/` separators. */
|
|
7
|
+
readonly relative: string;
|
|
8
|
+
readonly content: string;
|
|
9
|
+
}
|
|
10
|
+
/** Every file of the skill, `SKILL.md` first, or none when the installation lacks it. */
|
|
11
|
+
export declare function readSkillFiles(): readonly SkillFile[];
|
|
12
|
+
/** Topics `e2e guide <topic>` accepts: one per `references/<topic>.md`. */
|
|
13
|
+
export declare function skillTopics(): readonly string[];
|
|
14
|
+
/** The overview (`SKILL.md` without its frontmatter) or one topic's text; undefined for an unknown topic. */
|
|
15
|
+
export declare function readGuide(topic: string | undefined): string | undefined;
|
|
16
|
+
//# sourceMappingURL=skill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/cli/skill.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAMzF,eAAO,MAAM,UAAU,QAAQ,CAAC;AAEhC,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,kEAAkE,CAAC;AAmBrG,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,yFAAyF;AACzF,wBAAgB,cAAc,IAAI,SAAS,SAAS,EAAE,CAcrD;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,IAAI,SAAS,MAAM,EAAE,CAI/C;AAED,6GAA6G;AAC7G,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAMvE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** The bundled agent skill: `SKILL.md` plus one reference file per `e2e guide` topic. */
|
|
2
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
export const SKILL_NAME = 'e2e';
|
|
6
|
+
/** Printed when a build or an install left the skill files out of the package. */
|
|
7
|
+
export const MISSING_SKILL_MESSAGE = 'this installation ships no skill files; reinstall @e2edev/e2e';
|
|
8
|
+
const TOPIC_PREFIX = 'references/';
|
|
9
|
+
/**
|
|
10
|
+
* The published package ships the skill at `<package>/skills/e2e`, copied from
|
|
11
|
+
* the repository's `skills/e2e` by the build. That copy is tried first so a
|
|
12
|
+
* user project's own `skills/` directory is never mistaken for it; inside the
|
|
13
|
+
* repository the source directory is read directly, so nothing here needs a
|
|
14
|
+
* build. Undefined only for a broken installation.
|
|
15
|
+
*/
|
|
16
|
+
function skillDirectory() {
|
|
17
|
+
for (const candidate of ['../../skills/e2e/', '../../../../skills/e2e/']) {
|
|
18
|
+
const dir = fileURLToPath(new URL(candidate, import.meta.url));
|
|
19
|
+
if (existsSync(path.join(dir, 'SKILL.md')))
|
|
20
|
+
return dir;
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
/** Every file of the skill, `SKILL.md` first, or none when the installation lacks it. */
|
|
25
|
+
export function readSkillFiles() {
|
|
26
|
+
const root = skillDirectory();
|
|
27
|
+
if (root === undefined)
|
|
28
|
+
return [];
|
|
29
|
+
const files = [];
|
|
30
|
+
const walk = (dir) => {
|
|
31
|
+
const entries = readdirSync(dir, { withFileTypes: true }).toSorted((a, b) => a.name.localeCompare(b.name));
|
|
32
|
+
for (const entry of entries) {
|
|
33
|
+
const absolute = path.join(dir, entry.name);
|
|
34
|
+
if (entry.isDirectory())
|
|
35
|
+
walk(absolute);
|
|
36
|
+
else
|
|
37
|
+
files.push({ relative: path.relative(root, absolute).split(path.sep).join('/'), content: readFileSync(absolute, 'utf8') });
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
walk(root);
|
|
41
|
+
return [...files.filter((file) => file.relative === 'SKILL.md'), ...files.filter((file) => file.relative !== 'SKILL.md')];
|
|
42
|
+
}
|
|
43
|
+
/** Topics `e2e guide <topic>` accepts: one per `references/<topic>.md`. */
|
|
44
|
+
export function skillTopics() {
|
|
45
|
+
return readSkillFiles()
|
|
46
|
+
.filter((file) => file.relative.startsWith(TOPIC_PREFIX) && file.relative.endsWith('.md'))
|
|
47
|
+
.map((file) => file.relative.slice(TOPIC_PREFIX.length, -'.md'.length));
|
|
48
|
+
}
|
|
49
|
+
/** The overview (`SKILL.md` without its frontmatter) or one topic's text; undefined for an unknown topic. */
|
|
50
|
+
export function readGuide(topic) {
|
|
51
|
+
const files = readSkillFiles();
|
|
52
|
+
if (topic === undefined) {
|
|
53
|
+
return files.find((file) => file.relative === 'SKILL.md')?.content.replace(/^---\n[\s\S]*?\n---\n+/, '');
|
|
54
|
+
}
|
|
55
|
+
return files.find((file) => file.relative === `${TOPIC_PREFIX}${topic}.md`)?.content;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/cli/skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,14 @@ export interface CollectedFile {
|
|
|
34
34
|
export interface Collection {
|
|
35
35
|
readonly files: readonly CollectedFile[];
|
|
36
36
|
readonly tests: readonly CollectedTest[];
|
|
37
|
+
/** Every file the config globs matched, before positionals narrowed it. */
|
|
38
|
+
readonly discovered: readonly string[];
|
|
39
|
+
/**
|
|
40
|
+
* Files that look like tests but match no config glob, gathered only when
|
|
41
|
+
* the globs matched nothing: a `login.test.ts` beside an empty `tests/**`
|
|
42
|
+
* is almost always the file the author meant.
|
|
43
|
+
*/
|
|
44
|
+
readonly nearMisses: readonly string[];
|
|
37
45
|
/**
|
|
38
46
|
* Positional arguments, as written, that selected no discovered file. They
|
|
39
47
|
* are not an error on their own: a positional narrows the selection, and
|
|
@@ -56,7 +64,7 @@ export interface PositionalSelection {
|
|
|
56
64
|
/**
|
|
57
65
|
* Narrows the files the config globs discovered by positional arguments. Each
|
|
58
66
|
* positional resolves from the project root and is one of: a glob (any `*` or
|
|
59
|
-
* `?`) in the
|
|
67
|
+
* `?`) in the test glob grammar matched against the discovered files, an
|
|
60
68
|
* existing directory selecting every discovered file beneath it, or a file
|
|
61
69
|
* path matched exactly. Positionals only narrow: a file the config globs did
|
|
62
70
|
* not discover is never selected. Discovery order is preserved.
|