@apex-inc/mcp-server 0.27.5 → 0.28.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 CHANGED
@@ -40,6 +40,27 @@ Add to `.cursor/mcp.json` (or your MCP client's equivalent):
40
40
  | `APEX_API_KEY` | Yes | API key generated in your Apex dashboard |
41
41
  | `APEX_PROJECT_KEY` | No | Defaults to your first workspace |
42
42
 
43
+ ## Screenshot CLI
44
+
45
+ Playwright runs on **their** machine, then the picture uploads. Apex cannot sign into their product.
46
+
47
+ ```bash
48
+ # Experiment arm (public or localhost)
49
+ npx @apex-inc/mcp-server screenshot \
50
+ --experiment <id> --variant control --url https://example.com --preview
51
+
52
+ # Milestone still — signed-in product
53
+ npx playwright codegen --save-storage .apex/auth.json https://app.theirproduct.com
54
+ npx @apex-inc/mcp-server screenshot \
55
+ --milestone <id> --state not_yet --url https://app.theirproduct.com/reports \
56
+ --storage-state .apex/auth.json
57
+ npx @apex-inc/mcp-server screenshot \
58
+ --milestone <id> --state done --url https://app.theirproduct.com/reports \
59
+ --storage-state .apex/auth.json
60
+ ```
61
+
62
+ `--storage-state` is a login file on this machine. Apex never receives it — only the picture. Install Playwright once: `npm i -D playwright && npx playwright install chromium`.
63
+
43
64
  ## License
44
65
 
45
66
  MIT — see [LICENSE](./LICENSE)
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Pure insert for add_journey_step.
3
+ *
4
+ * Wait `until_event` and Send `arm` author the same graph compose
5
+ * stamps. Prefer compose for a Milestone. Do not add a Send on a
6
+ * compose-built arm — use set_journey_send to point that step.
7
+ */
8
+ export type JourneyStepRecord = Record<string, unknown>;
9
+ export type AddJourneyStepInput = {
10
+ kind: "wait" | "send";
11
+ mode?: "duration" | "until_event";
12
+ durationIso?: string;
13
+ triggerContractId?: string;
14
+ deadlineIso?: string;
15
+ commId?: string;
16
+ commVersion?: number;
17
+ channels?: string[];
18
+ arm?: "event" | "deadline";
19
+ };
20
+ export type AddJourneyStepResult = {
21
+ ok: true;
22
+ steps: JourneyStepRecord[];
23
+ stepId: string;
24
+ } | {
25
+ ok: false;
26
+ error: string;
27
+ };
28
+ export declare function applyAddJourneyStep(steps: JourneyStepRecord[], input: AddJourneyStepInput, newId: string): AddJourneyStepResult;
29
+ //# sourceMappingURL=add-journey-step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-journey-step.d.ts","sourceRoot":"","sources":["../src/add-journey-step.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AA6CjC,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EAAE,EAC1B,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,MAAM,GACZ,oBAAoB,CA6FtB"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Pure insert for add_journey_step.
3
+ *
4
+ * Wait `until_event` and Send `arm` author the same graph compose
5
+ * stamps. Prefer compose for a Milestone. Do not add a Send on a
6
+ * compose-built arm — use set_journey_send to point that step.
7
+ */
8
+ function cloneSteps(steps) {
9
+ return steps.map((step) => {
10
+ const next = { ...step };
11
+ if (step.untilEvent && typeof step.untilEvent === "object") {
12
+ next.untilEvent = { ...step.untilEvent };
13
+ }
14
+ return next;
15
+ });
16
+ }
17
+ function findExit(steps) {
18
+ return steps.find((s) => s.type === "exit");
19
+ }
20
+ function findUntilEventWait(steps) {
21
+ return steps.find((s) => s.type === "wait" && s.mode === "until_event");
22
+ }
23
+ function armTarget(wait, arm) {
24
+ if (arm === "event")
25
+ return typeof wait.next === "string" ? wait.next : undefined;
26
+ const until = wait.untilEvent;
27
+ return typeof until?.onDeadlineNext === "string" ? until.onDeadlineNext : undefined;
28
+ }
29
+ function setArmTarget(wait, arm, nextId) {
30
+ if (arm === "event") {
31
+ wait.next = nextId;
32
+ return;
33
+ }
34
+ const until = wait.untilEvent ?? {};
35
+ until.onDeadlineNext = nextId;
36
+ wait.untilEvent = until;
37
+ }
38
+ export function applyAddJourneyStep(steps, input, newId) {
39
+ const next = cloneSteps(steps);
40
+ const exit = findExit(next);
41
+ if (!exit || typeof exit.id !== "string") {
42
+ return { ok: false, error: "Journey has no exit step; cannot insert." };
43
+ }
44
+ const exitId = exit.id;
45
+ if (input.kind === "wait") {
46
+ const mode = input.mode ?? "duration";
47
+ if (mode === "until_event") {
48
+ if (!input.triggerContractId || !input.deadlineIso) {
49
+ return {
50
+ ok: false,
51
+ error: "until_event needs trigger_contract_id and deadline_iso.",
52
+ };
53
+ }
54
+ const wait = {
55
+ id: newId,
56
+ type: "wait",
57
+ label: "Wait",
58
+ mode: "until_event",
59
+ next: exitId,
60
+ untilEvent: {
61
+ triggerContractId: input.triggerContractId,
62
+ matchFieldPath: "endUserId",
63
+ deadline: input.deadlineIso,
64
+ onDeadlineNext: exitId,
65
+ },
66
+ };
67
+ const pre = next.find((s) => s.next === exitId);
68
+ if (pre)
69
+ pre.next = newId;
70
+ next.push(wait);
71
+ return { ok: true, steps: next, stepId: newId };
72
+ }
73
+ const wait = {
74
+ id: newId,
75
+ type: "wait",
76
+ label: "Wait",
77
+ mode: "duration",
78
+ duration: input.durationIso ?? "P1D",
79
+ next: exitId,
80
+ };
81
+ const pre = next.find((s) => s.next === exitId);
82
+ if (pre)
83
+ pre.next = newId;
84
+ next.push(wait);
85
+ return { ok: true, steps: next, stepId: newId };
86
+ }
87
+ if (!input.commId) {
88
+ return { ok: false, error: "A send step needs commId." };
89
+ }
90
+ const send = {
91
+ id: newId,
92
+ type: "send",
93
+ label: "Send",
94
+ commId: input.commId,
95
+ commVersion: input.commVersion ?? 1,
96
+ channels: input.channels ?? ["email"],
97
+ next: exitId,
98
+ };
99
+ if (input.arm) {
100
+ const wait = findUntilEventWait(next);
101
+ if (!wait) {
102
+ return {
103
+ ok: false,
104
+ error: "Send arm needs a Wait until_event step first.",
105
+ };
106
+ }
107
+ const current = armTarget(wait, input.arm);
108
+ const currentStep = current
109
+ ? next.find((s) => s.id === current)
110
+ : undefined;
111
+ if (currentStep?.type === "send") {
112
+ return {
113
+ ok: false,
114
+ error: "That arm already has a Send. Use set_journey_send to point it at a Communication.",
115
+ };
116
+ }
117
+ send.next = current ?? exitId;
118
+ setArmTarget(wait, input.arm, newId);
119
+ next.push(send);
120
+ return { ok: true, steps: next, stepId: newId };
121
+ }
122
+ const pre = next.find((s) => s.next === exitId);
123
+ if (pre)
124
+ pre.next = newId;
125
+ next.push(send);
126
+ return { ok: true, steps: next, stepId: newId };
127
+ }
128
+ //# sourceMappingURL=add-journey-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-journey-step.js","sourceRoot":"","sources":["../src/add-journey-step.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@
6
6
  export type AdoptionWriteArgs = {
7
7
  name?: string;
8
8
  featureKey?: string;
9
+ actionLabel?: string;
9
10
  adoptedWhenKind?: "event" | "trait";
10
11
  eventName?: string;
11
12
  traitPath?: string;
@@ -21,6 +22,12 @@ export type AdoptionWriteArgs = {
21
22
  active?: boolean;
22
23
  nudgeJourneyId?: string;
23
24
  celebrationJourneyId?: string;
25
+ saveNotYetSegment?: boolean;
26
+ saveDoneSegment?: boolean;
27
+ };
28
+ export type NudgeClockArg = {
29
+ hours?: number;
30
+ days?: number;
24
31
  };
25
32
  export declare function milestoneWriteBody(args: AdoptionWriteArgs): Record<string, unknown>;
26
33
  export declare function preflightAdoptionMilestone(args: {
@@ -1 +1 @@
1
- {"version":3,"file":"adoption-compose.d.ts","sourceRoot":"","sources":["../src/adoption-compose.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,mBAAmB,GAAG,iBAAiB,CAAC;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoCnF;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CACrC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCpB"}
1
+ {"version":3,"file":"adoption-compose.d.ts","sourceRoot":"","sources":["../src/adoption-compose.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,mBAAmB,GAAG,iBAAiB,CAAC;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqCnF;AAED,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CACrC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCpB"}
@@ -27,6 +27,7 @@ export function milestoneWriteBody(args) {
27
27
  return {
28
28
  ...(args.name !== undefined ? { name: args.name } : {}),
29
29
  ...(args.featureKey !== undefined ? { featureKey: args.featureKey } : {}),
30
+ ...(args.actionLabel !== undefined ? { actionLabel: args.actionLabel } : {}),
30
31
  ...(args.priority !== undefined ? { priority: args.priority } : {}),
31
32
  ...(args.order !== undefined ? { order: args.order } : {}),
32
33
  ...(args.active !== undefined ? { active: args.active } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"adoption-compose.js","sourceRoot":"","sources":["../src/adoption-compose.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adoption-compose.js","sourceRoot":"","sources":["../src/adoption-compose.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -9,7 +9,8 @@ import { sendStartupPing, discoverContext } from "./api-client.js";
9
9
  import { MCP_SERVER_VERSION } from "./version.js";
10
10
  import { advertiseShape, restoreArgs, normalizeInbound } from "./param-casing.js";
11
11
  // Subcommand dispatch: `npx @apex-inc/mcp-server screenshot <opts>` runs the
12
- // Playwright capture flow and exits, instead of starting the stdio server.
12
+ // Playwright capture flow (experiment arm or Milestone still) and exits,
13
+ // instead of starting the stdio server.
13
14
  // The default (no subcommand) behavior stays: start the MCP server.
14
15
  if (process.argv[2] === "screenshot") {
15
16
  const { runScreenshotCli } = await import("./screenshot-cli.js");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -2,9 +2,14 @@
2
2
  * `screenshot` CLI subcommand for the Apex MCP server.
3
3
  *
4
4
  * Invoked as `npx @apex-inc/mcp-server screenshot <opts>` (dispatched from
5
- * index.ts when `process.argv[2] === "screenshot"`). It captures a variant
6
- * screenshot with Playwright and uploads it to Apex via the existing assets
7
- * endpoint (`POST /api/experiments/{id}/assets`, source: "agent").
5
+ * index.ts when `process.argv[2] === "screenshot"`). Playwright runs on
6
+ * THEIR machine, then the picture uploads:
7
+ *
8
+ * Experiment — POST /api/experiments/{id}/assets (source: "agent")
9
+ * Milestone — POST /api/adoption/milestones/{id}/assets (source: "agent")
10
+ *
11
+ * Signed-in product pages need `--storage-state` (a Playwright login file
12
+ * on this machine). Apex never receives that file — only the picture.
8
13
  *
9
14
  * Playwright is a LAZY / OPTIONAL dependency: it lives in optionalDependencies,
10
15
  * is never imported at the top level, and is resolved with a runtime
@@ -12,5 +17,32 @@
12
17
  * install hint and exit 1. Because it's only imported dynamically (and typed
13
18
  * with a minimal local interface below), tsc builds cleanly without the package.
14
19
  */
20
+ export type ScreenshotViewport = "desktop" | "tablet" | "mobile";
21
+ type ScreenshotShared = {
22
+ url: string;
23
+ viewport: ScreenshotViewport;
24
+ fullPage: boolean;
25
+ wait?: number;
26
+ storageState?: string;
27
+ headed: boolean;
28
+ };
29
+ export type ExperimentScreenshotOptions = ScreenshotShared & {
30
+ kind: "experiment";
31
+ experiment: string;
32
+ variant: string;
33
+ preview: boolean;
34
+ commit?: string;
35
+ };
36
+ export type MilestoneScreenshotOptions = ScreenshotShared & {
37
+ kind: "milestone";
38
+ milestone: string;
39
+ state: "not_yet" | "done";
40
+ };
41
+ export type ScreenshotOptions = ExperimentScreenshotOptions | MilestoneScreenshotOptions;
42
+ /** Login file stays on this machine. A URL would send someone else's cookies at a fetch. */
43
+ export declare function assertLocalStorageState(filePath: string): string;
44
+ /** Parse `--flag value` and `--bool` style argv into a typed options bag. */
45
+ export declare function parseScreenshotArgs(argv: string[]): ScreenshotOptions;
15
46
  export declare function runScreenshotCli(argv: string[]): Promise<void>;
47
+ export {};
16
48
  //# sourceMappingURL=screenshot-cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot-cli.d.ts","sourceRoot":"","sources":["../src/screenshot-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAmJH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEpE"}
1
+ {"version":3,"file":"screenshot-cli.d.ts","sourceRoot":"","sources":["../src/screenshot-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAyDH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjE,KAAK,gBAAgB,GAAG;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,gBAAgB,GAAG;IAC3D,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,gBAAgB,GAAG;IAC1D,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB,2BAA2B,GAC3B,0BAA0B,CAAC;AAM/B,4FAA4F;AAC5F,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAehE;AAUD,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CA2GrE;AAmCD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiGpE"}
@@ -2,9 +2,14 @@
2
2
  * `screenshot` CLI subcommand for the Apex MCP server.
3
3
  *
4
4
  * Invoked as `npx @apex-inc/mcp-server screenshot <opts>` (dispatched from
5
- * index.ts when `process.argv[2] === "screenshot"`). It captures a variant
6
- * screenshot with Playwright and uploads it to Apex via the existing assets
7
- * endpoint (`POST /api/experiments/{id}/assets`, source: "agent").
5
+ * index.ts when `process.argv[2] === "screenshot"`). Playwright runs on
6
+ * THEIR machine, then the picture uploads:
7
+ *
8
+ * Experiment — POST /api/experiments/{id}/assets (source: "agent")
9
+ * Milestone — POST /api/adoption/milestones/{id}/assets (source: "agent")
10
+ *
11
+ * Signed-in product pages need `--storage-state` (a Playwright login file
12
+ * on this machine). Apex never receives that file — only the picture.
8
13
  *
9
14
  * Playwright is a LAZY / OPTIONAL dependency: it lives in optionalDependencies,
10
15
  * is never imported at the top level, and is resolved with a runtime
@@ -23,8 +28,36 @@ const VIEWPORT_HEIGHTS = {
23
28
  tablet: 1112,
24
29
  mobile: 844,
25
30
  };
31
+ const USAGE = `Usage:
32
+ apex-mcp screenshot --experiment <id> --variant <key> --url <url>
33
+ [--viewport desktop|tablet|mobile] [--full-page] [--preview]
34
+ [--commit <sha>] [--wait <ms>] [--storage-state <file>] [--headed]
35
+ apex-mcp screenshot --milestone <id> --state not_yet|done --url <url>
36
+ [--viewport desktop|tablet|mobile] [--full-page]
37
+ [--wait <ms>] [--storage-state <file>] [--headed]
38
+
39
+ Signed-in pages: save a login file on this machine
40
+ (npx playwright codegen --save-storage .apex/auth.json <url>),
41
+ then pass --storage-state .apex/auth.json. Apex never receives that file.`;
42
+ /** Login file stays on this machine. A URL would send someone else's cookies at a fetch. */
43
+ export function assertLocalStorageState(filePath) {
44
+ const trimmed = filePath.trim();
45
+ if (trimmed.length === 0) {
46
+ throw new Error("Missing --storage-state path.");
47
+ }
48
+ if (/^https?:\/\//i.test(trimmed) ||
49
+ /^file:/i.test(trimmed) ||
50
+ trimmed.startsWith("//")) {
51
+ throw new Error("--storage-state must be a login file on this machine. Do not pass a URL. Apex never receives that file — only the picture.");
52
+ }
53
+ return trimmed;
54
+ }
55
+ function flagString(opts, name) {
56
+ const v = opts[name];
57
+ return typeof v === "string" && v.length > 0 ? v : undefined;
58
+ }
26
59
  /** Parse `--flag value` and `--bool` style argv into a typed options bag. */
27
- function parseArgs(argv) {
60
+ export function parseScreenshotArgs(argv) {
28
61
  const opts = {};
29
62
  for (let i = 0; i < argv.length; i++) {
30
63
  const arg = argv[i];
@@ -32,8 +65,7 @@ function parseArgs(argv) {
32
65
  continue;
33
66
  const flag = arg.slice(2);
34
67
  const next = argv[i + 1];
35
- // Boolean flags take no value (next arg is missing or another flag).
36
- if (flag === "full-page" || flag === "preview") {
68
+ if (flag === "full-page" || flag === "preview" || flag === "headed") {
37
69
  opts[flag] = true;
38
70
  continue;
39
71
  }
@@ -46,35 +78,73 @@ function parseArgs(argv) {
46
78
  }
47
79
  }
48
80
  const required = (name) => {
49
- const v = opts[name];
50
- if (typeof v !== "string" || v.length === 0) {
51
- throw new Error(`Missing required flag --${name}. Usage:\n` +
52
- ` apex-mcp screenshot --experiment <id> --variant <key> --url <url> ` +
53
- `[--viewport desktop|tablet|mobile] [--full-page] [--preview] ` +
54
- `[--commit <sha>] [--wait <ms>]`);
81
+ const v = flagString(opts, name);
82
+ if (!v) {
83
+ throw new Error(`Missing required flag --${name}.\n${USAGE}`);
55
84
  }
56
85
  return v;
57
86
  };
58
- const viewport = typeof opts.viewport === "string" ? opts.viewport : "desktop";
59
- if (!(viewport in VIEWPORT_WIDTHS)) {
60
- throw new Error(`Invalid --viewport "${viewport}". Must be one of: desktop, tablet, mobile.`);
87
+ const experiment = flagString(opts, "experiment");
88
+ const milestone = flagString(opts, "milestone");
89
+ if (experiment && milestone) {
90
+ throw new Error("Pass --experiment or --milestone, not both.\n" + USAGE);
61
91
  }
92
+ if (!experiment && !milestone) {
93
+ throw new Error("Pass --experiment <id> --variant <key> or --milestone <id> --state not_yet|done.\n" +
94
+ USAGE);
95
+ }
96
+ const viewportRaw = flagString(opts, "viewport") ?? "desktop";
97
+ if (!(viewportRaw in VIEWPORT_WIDTHS)) {
98
+ throw new Error(`Invalid --viewport "${viewportRaw}". Must be one of: desktop, tablet, mobile.`);
99
+ }
100
+ const viewport = viewportRaw;
62
101
  let wait;
63
- if (typeof opts.wait === "string") {
64
- wait = Number(opts.wait);
102
+ const waitRaw = flagString(opts, "wait");
103
+ if (waitRaw !== undefined) {
104
+ wait = Number(waitRaw);
65
105
  if (!Number.isFinite(wait) || wait < 0) {
66
- throw new Error(`Invalid --wait "${opts.wait}". Must be a non-negative number of ms.`);
106
+ throw new Error(`Invalid --wait "${waitRaw}". Must be a non-negative number of ms.`);
67
107
  }
68
108
  }
69
- return {
70
- experiment: required("experiment"),
71
- variant: required("variant"),
109
+ const storageRaw = flagString(opts, "storage-state");
110
+ const storageState = storageRaw
111
+ ? assertLocalStorageState(storageRaw)
112
+ : undefined;
113
+ const shared = {
72
114
  url: required("url"),
73
115
  viewport,
74
116
  fullPage: opts["full-page"] === true,
75
- preview: opts.preview === true,
76
- commit: typeof opts.commit === "string" ? opts.commit : undefined,
77
117
  wait,
118
+ storageState,
119
+ headed: opts.headed === true,
120
+ };
121
+ if (milestone) {
122
+ if (opts.preview === true) {
123
+ throw new Error("--preview is for experiment arms only. For a Milestone, sit the empty or finished URL.\n" +
124
+ USAGE);
125
+ }
126
+ if (flagString(opts, "variant") || flagString(opts, "commit")) {
127
+ throw new Error("--variant and --commit are for experiments. A Milestone uses --state not_yet|done.\n" +
128
+ USAGE);
129
+ }
130
+ const state = required("state");
131
+ if (state !== "not_yet" && state !== "done") {
132
+ throw new Error(`Invalid --state "${state}". Must be not_yet (empty screen) or done (finished).`);
133
+ }
134
+ return {
135
+ kind: "milestone",
136
+ milestone,
137
+ state,
138
+ ...shared,
139
+ };
140
+ }
141
+ return {
142
+ kind: "experiment",
143
+ experiment: experiment,
144
+ variant: required("variant"),
145
+ preview: opts.preview === true,
146
+ commit: flagString(opts, "commit"),
147
+ ...shared,
78
148
  };
79
149
  }
80
150
  /** Lazily load Playwright; print an actionable hint + exit 1 if it's missing. */
@@ -107,20 +177,22 @@ function applyPreview(url, exp, variant) {
107
177
  export async function runScreenshotCli(argv) {
108
178
  let opts;
109
179
  try {
110
- opts = parseArgs(argv);
180
+ opts = parseScreenshotArgs(argv);
111
181
  }
112
182
  catch (err) {
113
183
  console.error(err.message);
114
184
  process.exit(1);
185
+ return;
115
186
  }
116
- const targetUrl = opts.preview
187
+ const targetUrl = opts.kind === "experiment" && opts.preview
117
188
  ? applyPreview(opts.url, opts.experiment, opts.variant)
118
189
  : opts.url;
119
190
  const { chromium } = await loadPlaywright();
120
191
  let browser;
121
192
  try {
122
- browser = await chromium.launch({ headless: true });
123
- const page = await browser.newPage();
193
+ browser = await chromium.launch({ headless: !opts.headed });
194
+ const context = await browser.newContext(opts.storageState ? { storageState: opts.storageState } : {});
195
+ const page = await context.newPage();
124
196
  await page.setViewportSize({
125
197
  width: VIEWPORT_WIDTHS[opts.viewport],
126
198
  height: VIEWPORT_HEIGHTS[opts.viewport],
@@ -133,20 +205,36 @@ export async function runScreenshotCli(argv) {
133
205
  const buffer = await page.screenshot({ fullPage: opts.fullPage, type: "png" });
134
206
  const imageBase64 = Buffer.from(buffer).toString("base64");
135
207
  console.error("[apex] Uploading screenshot to Apex…");
136
- const res = await apiPost(`/api/experiments/${encodeURIComponent(opts.experiment)}/assets`, {
137
- variantKey: opts.variant,
138
- source: "agent",
139
- viewport: opts.viewport,
140
- imageBase64,
141
- format: "png",
142
- label: `Captured by CLI (${opts.viewport})`,
143
- ...(opts.commit ? { commitSha: opts.commit } : {}),
144
- });
208
+ const res = opts.kind === "experiment"
209
+ ? await apiPost(`/api/experiments/${encodeURIComponent(opts.experiment)}/assets`, {
210
+ variantKey: opts.variant,
211
+ source: "agent",
212
+ viewport: opts.viewport,
213
+ imageBase64,
214
+ format: "png",
215
+ label: `Captured by CLI (${opts.viewport})`,
216
+ ...(opts.commit ? { commitSha: opts.commit } : {}),
217
+ })
218
+ : await apiPost(`/api/adoption/milestones/${encodeURIComponent(opts.milestone)}/assets`, {
219
+ state: opts.state,
220
+ source: "agent",
221
+ viewport: opts.viewport,
222
+ imageBase64,
223
+ format: "png",
224
+ label: `Captured by CLI (${opts.viewport})`,
225
+ });
145
226
  const assetUrl = res?.data?.url;
146
227
  if (assetUrl) {
147
228
  console.log(assetUrl);
148
- console.error("[apex] Done. This screenshot now appears on the experiment's dashboard " +
149
- "card and in its screenshot gallery.");
229
+ if (opts.kind === "experiment") {
230
+ console.error("[apex] Done. This screenshot now appears on the experiment's dashboard " +
231
+ "card and in its screenshot gallery.");
232
+ }
233
+ else {
234
+ console.error(opts.state === "done"
235
+ ? "[apex] Done. That finished screen is now on the Milestone."
236
+ : "[apex] Done. That empty screen is now on the Milestone.");
237
+ }
150
238
  }
151
239
  else {
152
240
  console.error("[apex] Upload succeeded but the response did not include an asset URL.");
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot-cli.js","sourceRoot":"","sources":["../src/screenshot-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screenshot-cli.js","sourceRoot":"","sources":["../src/screenshot-cli.ts"],"names":[],"mappings":"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"}