@apex-inc/mcp-server 0.28.0 → 0.29.0
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 +21 -0
- package/dist/adoption-compose.d.ts +1 -1
- package/dist/adoption-compose.d.ts.map +1 -1
- package/dist/adoption-compose.js +8 -3
- package/dist/adoption-compose.js.map +1 -1
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/live-test-guard.d.ts +45 -0
- package/dist/live-test-guard.d.ts.map +1 -0
- package/dist/live-test-guard.js +78 -0
- package/dist/live-test-guard.js.map +1 -0
- package/dist/screenshot-cli.d.ts +35 -3
- package/dist/screenshot-cli.d.ts.map +1 -1
- package/dist/screenshot-cli.js +126 -38
- package/dist/screenshot-cli.js.map +1 -1
- package/dist/tools.d.ts +122 -9
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +227 -14
- package/dist/tools.js.map +1 -1
- package/package.json +1 -1
- package/skills/apex-adoption/SKILL.md +36 -6
- package/skills/apex-communications/SKILL.md +4 -5
- package/skills/apex-experimentation/SKILL.md +4 -1
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)
|
|
@@ -19,9 +19,9 @@ export type AdoptionWriteArgs = {
|
|
|
19
19
|
gapKind?: "days_since_signup" | "event_not_fired";
|
|
20
20
|
sinceEventName?: string;
|
|
21
21
|
enrollMode?: "all" | "future";
|
|
22
|
+
finishWhen?: "this_person" | "anyone_here";
|
|
22
23
|
active?: boolean;
|
|
23
24
|
nudgeJourneyId?: string;
|
|
24
|
-
celebrationJourneyId?: string;
|
|
25
25
|
saveNotYetSegment?: boolean;
|
|
26
26
|
saveDoneSegment?: boolean;
|
|
27
27
|
};
|
|
@@ -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,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,
|
|
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,UAAU,CAAC,EAAE,aAAa,GAAG,aAAa,CAAC;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,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,CA2CnF;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"}
|
package/dist/adoption-compose.js
CHANGED
|
@@ -32,10 +32,15 @@ export function milestoneWriteBody(args) {
|
|
|
32
32
|
...(args.order !== undefined ? { order: args.order } : {}),
|
|
33
33
|
...(args.active !== undefined ? { active: args.active } : {}),
|
|
34
34
|
...(args.nudgeJourneyId !== undefined ? { nudgeJourneyId: args.nudgeJourneyId } : {}),
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
// No celebrationJourneyId. A Milestone keeps both letters on its one
|
|
36
|
+
// Adaptive Journey; a second journey publishes separately and strands the
|
|
37
|
+
// Celebration in draft. Existing rows are still read, never written.
|
|
38
38
|
...(args.enrollMode !== undefined ? { enrollMode: args.enrollMode } : {}),
|
|
39
|
+
...(args.finishWhen !== undefined
|
|
40
|
+
? {
|
|
41
|
+
finishWhen: args.adoptedWhenKind === "trait" ? "this_person" : args.finishWhen,
|
|
42
|
+
}
|
|
43
|
+
: {}),
|
|
39
44
|
gapPolicy,
|
|
40
45
|
...(adoptedWhen ? { adoptedWhen } : {}),
|
|
41
46
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adoption-compose.js","sourceRoot":"","sources":["../src/adoption-compose.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AA2BzC,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACxD,MAAM,KAAK,GACT,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjE,CAAC,CAAC,IAAI,CAAC,QAAQ;QACf,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,SAAS,GAA4B;QACzC,IAAI,EAAE,IAAI,CAAC,OAAO,KAAK,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB;QAClF,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QACnD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxE,CAAC;IACF,MAAM,WAAW,GACf,IAAI,CAAC,eAAe,KAAK,OAAO;QAC9B,CAAC,CAAC;YACE,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,QAAQ;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B;QACH,CAAC,CAAC,IAAI,CAAC,eAAe,KAAK,OAAO;YAChC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;YAC9C,CAAC,CAAC,SAAS,CAAC;IAClB,OAAO;QACL,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,IAAI,CAAC,
|
|
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
|
|
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");
|
|
@@ -19,9 +20,16 @@ if (process.argv[2] === "screenshot") {
|
|
|
19
20
|
const server = new McpServer({ name: "apex", version: MCP_SERVER_VERSION }, {
|
|
20
21
|
instructions: [
|
|
21
22
|
"You are connected to the Apex growth platform, which manages A/B tests and growth experiments.",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
23
|
+
"Do NOT call list_experiments on ordinary coding, debugging, or product work that does not mention",
|
|
24
|
+
"experiments — do not dump the test list when they are fixing a button.",
|
|
25
|
+
"DO call check_live_tests before you edit a page, commit, or push, even if the user did not mention",
|
|
26
|
+
"experiments or Apex. Pass the file paths and their full contents (not just the diff hunk).",
|
|
27
|
+
"Also call check_live_tests before edit_communication, publish_communication, publish_journey,",
|
|
28
|
+
"update_adoption_milestone, or delete_adoption_milestone. Pass communication_ids, journey_ids,",
|
|
29
|
+
"or milestone_ids. If a letter, Adaptive Journey, or Milestone is live, stop and ask.",
|
|
30
|
+
"If check_live_tests returns a running high-confidence hit, stop and ask. Do not edit. Do not commit.",
|
|
31
|
+
"Do not pass confirmLiveExperiment, confirmTreatmentChange, or confirmLiveMilestone unless they picked an out.",
|
|
32
|
+
"Three outs: end the test then ship; wait until it ends; or say this change is not the thing under test.",
|
|
25
33
|
"When the user does ask about their experiments (e.g. 'what experiments are running?',",
|
|
26
34
|
"'check Apex', 'any experiments ready to graduate?'), use list_experiments to check their status.",
|
|
27
35
|
"If any experiments show PENDING GRADUATION in that context, mention them and offer to",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAElF,6EAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared STOP for check_live_tests and mutating letter / journey / Milestone tools.
|
|
3
|
+
* Advisory only here — the check API never stamps or mails.
|
|
4
|
+
*/
|
|
5
|
+
export type LiveGuardHit = {
|
|
6
|
+
experimentId?: string;
|
|
7
|
+
name: string;
|
|
8
|
+
status: string;
|
|
9
|
+
confidence: string;
|
|
10
|
+
reason: string;
|
|
11
|
+
files?: string[];
|
|
12
|
+
objectKind?: string;
|
|
13
|
+
objectId?: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function fetchLiveTestHits(body: {
|
|
16
|
+
files?: Array<{
|
|
17
|
+
path: string;
|
|
18
|
+
content?: string;
|
|
19
|
+
}>;
|
|
20
|
+
urls?: string[];
|
|
21
|
+
communicationIds?: string[];
|
|
22
|
+
journeyIds?: string[];
|
|
23
|
+
milestoneIds?: string[];
|
|
24
|
+
includePublishedJourneys?: boolean;
|
|
25
|
+
}): Promise<LiveGuardHit[]>;
|
|
26
|
+
export declare function isFileStop(hit: LiveGuardHit): boolean;
|
|
27
|
+
export declare function isObjectStop(hit: LiveGuardHit): boolean;
|
|
28
|
+
/** Draft path edits: only stop when a live test is on that letter or journey. */
|
|
29
|
+
export declare function isDraftObjectStop(hit: LiveGuardHit): boolean;
|
|
30
|
+
export declare function formatLiveTestStop(hits: LiveGuardHit[]): string;
|
|
31
|
+
export declare function refuseLiveApexObject(opts: {
|
|
32
|
+
communicationIds?: string[];
|
|
33
|
+
journeyIds?: string[];
|
|
34
|
+
milestoneIds?: string[];
|
|
35
|
+
includePublishedJourneys?: boolean;
|
|
36
|
+
confirmed?: boolean;
|
|
37
|
+
/** draft = only stop when a test is measuring it. publish/milestone = also stop on live path / on Milestone. */
|
|
38
|
+
purpose: "draft" | "publish" | "milestone";
|
|
39
|
+
}): Promise<{
|
|
40
|
+
stop: true;
|
|
41
|
+
text: string;
|
|
42
|
+
} | {
|
|
43
|
+
stop: false;
|
|
44
|
+
}>;
|
|
45
|
+
//# sourceMappingURL=live-test-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-test-guard.d.ts","sourceRoot":"","sources":["../src/live-test-guard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAa1B;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAQrD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAQvD;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAE5D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,CAmB/D;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gHAAgH;IAChH,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,WAAW,CAAC;CAC5C,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAoB1D"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared STOP for check_live_tests and mutating letter / journey / Milestone tools.
|
|
3
|
+
* Advisory only here — the check API never stamps or mails.
|
|
4
|
+
*/
|
|
5
|
+
import { apiPost } from "./api-client.js";
|
|
6
|
+
export async function fetchLiveTestHits(body) {
|
|
7
|
+
const res = await apiPost("/api/experiments/check-live-tests", {
|
|
8
|
+
files: body.files,
|
|
9
|
+
urls: body.urls,
|
|
10
|
+
communicationIds: body.communicationIds,
|
|
11
|
+
journeyIds: body.journeyIds,
|
|
12
|
+
milestoneIds: body.milestoneIds,
|
|
13
|
+
includePublishedJourneys: body.includePublishedJourneys,
|
|
14
|
+
});
|
|
15
|
+
return res.data?.hits ?? [];
|
|
16
|
+
}
|
|
17
|
+
export function isFileStop(hit) {
|
|
18
|
+
return (hit.confidence === "high" &&
|
|
19
|
+
(hit.status === "running" || hit.status === "pending_deployment") &&
|
|
20
|
+
(hit.reason === "id_in_file" ||
|
|
21
|
+
hit.reason === "source_file" ||
|
|
22
|
+
hit.reason === "component"));
|
|
23
|
+
}
|
|
24
|
+
export function isObjectStop(hit) {
|
|
25
|
+
return (hit.confidence === "high" &&
|
|
26
|
+
(hit.status === "running" || hit.status === "pending_deployment") &&
|
|
27
|
+
(hit.reason === "communication" ||
|
|
28
|
+
hit.reason === "journey" ||
|
|
29
|
+
hit.reason === "milestone"));
|
|
30
|
+
}
|
|
31
|
+
/** Draft path edits: only stop when a live test is on that letter or journey. */
|
|
32
|
+
export function isDraftObjectStop(hit) {
|
|
33
|
+
return isObjectStop(hit) && Boolean(hit.experimentId);
|
|
34
|
+
}
|
|
35
|
+
export function formatLiveTestStop(hits) {
|
|
36
|
+
const lines = hits.map((h) => {
|
|
37
|
+
if (h.reason === "milestone") {
|
|
38
|
+
return `- ${h.name} is on. People are already being counted. Changing what "finished" means mixes old and new.`;
|
|
39
|
+
}
|
|
40
|
+
if (h.reason === "journey" && !h.experimentId) {
|
|
41
|
+
return `- ${h.name} is live. People are already on this path. A new publish changes what new people get. People already on it stay on the old path.`;
|
|
42
|
+
}
|
|
43
|
+
const files = h.files?.length ? ` Files: ${h.files.join(", ")}.` : "";
|
|
44
|
+
return `- ${h.name} is live. People still see both versions. If you change this, those counts mix. We will not call a winner on mixed numbers.${files}`;
|
|
45
|
+
});
|
|
46
|
+
return [
|
|
47
|
+
"Apex STOP. Something live is on what you are about to change.",
|
|
48
|
+
...lines,
|
|
49
|
+
"Do not edit. Do not commit. Do not publish. Ask which they want:",
|
|
50
|
+
"1. End the test (or turn the Milestone off), then change it.",
|
|
51
|
+
"2. Wait until it ends.",
|
|
52
|
+
"3. Say this change is not the thing under test (they mark that on the experiment page).",
|
|
53
|
+
].join("\n");
|
|
54
|
+
}
|
|
55
|
+
export async function refuseLiveApexObject(opts) {
|
|
56
|
+
if (opts.confirmed)
|
|
57
|
+
return { stop: false };
|
|
58
|
+
const ids = [
|
|
59
|
+
...(opts.communicationIds ?? []),
|
|
60
|
+
...(opts.journeyIds ?? []),
|
|
61
|
+
...(opts.milestoneIds ?? []),
|
|
62
|
+
];
|
|
63
|
+
if (ids.length === 0)
|
|
64
|
+
return { stop: false };
|
|
65
|
+
const hits = await fetchLiveTestHits({
|
|
66
|
+
communicationIds: opts.communicationIds,
|
|
67
|
+
journeyIds: opts.journeyIds,
|
|
68
|
+
milestoneIds: opts.milestoneIds,
|
|
69
|
+
includePublishedJourneys: opts.includePublishedJourneys,
|
|
70
|
+
});
|
|
71
|
+
const stopping = opts.purpose === "draft"
|
|
72
|
+
? hits.filter(isDraftObjectStop)
|
|
73
|
+
: hits.filter(isObjectStop);
|
|
74
|
+
if (stopping.length === 0)
|
|
75
|
+
return { stop: false };
|
|
76
|
+
return { stop: true, text: formatLiveTestStop(stopping) };
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=live-test-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-test-guard.js","sourceRoot":"","sources":["../src/live-test-guard.ts"],"names":[],"mappings":"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"}
|
package/dist/screenshot-cli.d.ts
CHANGED
|
@@ -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"`).
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
|
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"}
|
package/dist/screenshot-cli.js
CHANGED
|
@@ -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"`).
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
|
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
|
-
|
|
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
|
|
50
|
-
if (
|
|
51
|
-
throw new Error(`Missing required flag --${name}
|
|
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
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
64
|
-
|
|
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 "${
|
|
106
|
+
throw new Error(`Invalid --wait "${waitRaw}". Must be a non-negative number of ms.`);
|
|
67
107
|
}
|
|
68
108
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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 =
|
|
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:
|
|
123
|
-
const
|
|
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 =
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
|
|
149
|
-
"
|
|
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":"AAAA
|
|
1
|
+
{"version":3,"file":"screenshot-cli.js","sourceRoot":"","sources":["../src/screenshot-cli.ts"],"names":[],"mappings":"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"}
|