@muggleai/works 5.31.0-staging.268 → 5.31.0-staging.270
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/.claude-plugin/marketplace.json +1 -1
- package/README.md +8 -1
- package/dist/{chunk-J2DEXYH7.js → chunk-W3HJBL5U.js} +2 -2
- package/dist/{chunk-YLQSNSSM.js → chunk-XUANXZ2O.js} +271 -6
- package/dist/cli.js +2 -2
- package/dist/index.js +2 -2
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/.codex-mcp.json +1 -1
- package/dist/plugin/.codex-plugin/plugin.json +1 -1
- package/dist/plugin/.cursor-plugin/plugin.json +1 -1
- package/dist/plugin/.mcp.json +1 -1
- package/dist/plugin/skills/do/fix-ci.md +3 -1
- package/dist/release-manifest.json +3 -3
- package/dist/{src-7OY7H63R.js → src-J6AIYTLA.js} +1 -1
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/.codex-mcp.json +1 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.cursor-plugin/plugin.json +1 -1
- package/plugin/.mcp.json +1 -1
- package/plugin/skills/do/fix-ci.md +3 -1
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"name": "muggleai",
|
|
10
10
|
"source": "./plugin",
|
|
11
11
|
"description": "Real-browser E2E acceptance for your coding agent: test the flows you changed and open the PR with screenshots. Built for flows other tools can't reach: managed test identities with live inboxes (magic links, email OTP and 2FA, verification mail, password resets), an encrypted secret store for login and test credentials, and a test graph that runs prerequisite flows first. Plain-English tests become replayable scripts on localhost or preview URLs.",
|
|
12
|
-
"version": "5.31.0-staging.
|
|
12
|
+
"version": "5.31.0-staging.270"
|
|
13
13
|
}
|
|
14
14
|
]
|
|
15
15
|
}
|
package/README.md
CHANGED
|
@@ -273,7 +273,7 @@ so the result carries a viewUrl straight to the dashboard
|
|
|
273
273
|
|
|
274
274
|
## MCP tool reference
|
|
275
275
|
|
|
276
|
-
|
|
276
|
+
125 tools across authentication, projects, use cases, test cases, test states, scripts, workflows, local execution, reporting, secrets, billing, and administration. Call them directly from any MCP client to build your own pipeline.
|
|
277
277
|
|
|
278
278
|
**Authentication** — `muggle-remote-auth-status`, `-login`, `-poll`, `-logout`, plus `-api-key-create`, `-list`, `-get`, `-revoke`.
|
|
279
279
|
|
|
@@ -301,6 +301,13 @@ so the result carries a viewUrl straight to the dashboard
|
|
|
301
301
|
| `muggle-remote-test-case-bulk-preview-submit` | Async batch preview (~50% cheaper) |
|
|
302
302
|
| `muggle-remote-test-plan-graph-rebuild` | Rebuild the prerequisite graph |
|
|
303
303
|
|
|
304
|
+
| Test states | Purpose |
|
|
305
|
+
| :---------- | :------ |
|
|
306
|
+
| `muggle-remote-test-chaining-catalog-get` / `-settings-update` | Read a project's states and roles; set its fresh account set state and parallel account set limit |
|
|
307
|
+
| `muggle-remote-test-state-create` / `-update` / `-delete` | Manage states: facts about one account set's data, plus a check |
|
|
308
|
+
| `muggle-remote-test-role-create` / `-update` / `-delete` | Manage roles: created or supplied accounts a test acts as |
|
|
309
|
+
| `muggle-remote-test-chaining-plan-get` | Preview the account set plan without running anything |
|
|
310
|
+
|
|
304
311
|
Bulk-preview submissions return a `jobId` immediately. Poll `muggle-remote-bulk-preview-job-get` until terminal, then persist with the matching `-create` tool. `-list` and `-cancel` round out the set.
|
|
305
312
|
|
|
306
313
|
| Scripts and workflows | Purpose |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __export, getLogger, getConfig, createChildLogger, buildElectronAppReleaseAssetUrl, getActiveRuntimeTarget, getAuthService, hasApiKey, getElectronAppVersion, getElectronAppDir, getPlatformKey, reconcileProjectPreferences, getDataDir2, PREFERENCES_FILE_NAME, isFirstRun, writePreferences, DEFAULT_PREFERENCES, isElectronAppInstalled, getElectronAppChecksums, getChecksumForPlatform, getElectronAppSignedFromVersion, getReleaseSignerIdentityUri, verifyFileChecksum, resolveElectronAppExecutablePath, calculateFileChecksum, initTelemetry, Surface, ServiceName, track, EventName, getQaTools, getLocalQaTools, performLogout, assertDeviceCodeClientProvisioned, performLogin, getActiveElectronAppReleaseStream, buildToolInputJsonSchema, toolRequiresAuth, getCallerCredentials, parseElectronAppDirName, getElectronAppReleaseTagPrefix, hasShownDisclosure, markDisclosureShown, getBundledElectronAppVersion, getElectronAppVersionSource, getCredentialsFilePath, ElectronAppReleaseStream, buildElectronAppChecksumsUrl, __require, getDisclosureCopy, buildOnboardingPlan, applyOnboardingAnswers, needsOnboarding, buildLlmSourcePlan, describeLlmSourceStatus, resolveLlmSourceStatus, readRunView, RunViewError, renderRunViewText, writeRunViewHtml, openBrowserUrl, evaluateCheckoutFreshness, runGitCommand, BLOCKING_FRESHNESS_VERDICTS, claimServiceStack, BUSY_EXIT_CODE, checkServiceStack, releaseServiceStack, readServiceStackStatus, resolvePreferences, OnboardingBlanketChoice, PreferenceKey, LlmSource, applyLlmSourceSelection, describeStackMismatch, getDataDir, DEFAULT_LOCAL_LLM_BASE_URL, isValidLocalBaseUrl, local_exports } from './chunk-
|
|
1
|
+
import { __export, getLogger, getConfig, createChildLogger, buildElectronAppReleaseAssetUrl, getActiveRuntimeTarget, getAuthService, hasApiKey, getElectronAppVersion, getElectronAppDir, getPlatformKey, reconcileProjectPreferences, getDataDir2, PREFERENCES_FILE_NAME, isFirstRun, writePreferences, DEFAULT_PREFERENCES, isElectronAppInstalled, getElectronAppChecksums, getChecksumForPlatform, getElectronAppSignedFromVersion, getReleaseSignerIdentityUri, verifyFileChecksum, resolveElectronAppExecutablePath, calculateFileChecksum, initTelemetry, Surface, ServiceName, track, EventName, getQaTools, getLocalQaTools, performLogout, assertDeviceCodeClientProvisioned, performLogin, getActiveElectronAppReleaseStream, buildToolInputJsonSchema, toolRequiresAuth, getCallerCredentials, parseElectronAppDirName, getElectronAppReleaseTagPrefix, hasShownDisclosure, markDisclosureShown, getBundledElectronAppVersion, getElectronAppVersionSource, getCredentialsFilePath, ElectronAppReleaseStream, buildElectronAppChecksumsUrl, __require, getDisclosureCopy, buildOnboardingPlan, applyOnboardingAnswers, needsOnboarding, buildLlmSourcePlan, describeLlmSourceStatus, resolveLlmSourceStatus, readRunView, RunViewError, renderRunViewText, writeRunViewHtml, openBrowserUrl, evaluateCheckoutFreshness, runGitCommand, BLOCKING_FRESHNESS_VERDICTS, claimServiceStack, BUSY_EXIT_CODE, checkServiceStack, releaseServiceStack, readServiceStackStatus, resolvePreferences, OnboardingBlanketChoice, PreferenceKey, LlmSource, applyLlmSourceSelection, describeStackMismatch, getDataDir, DEFAULT_LOCAL_LLM_BASE_URL, isValidLocalBaseUrl, local_exports } from './chunk-XUANXZ2O.js';
|
|
2
2
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
3
|
import { ListToolsRequestSchema, CallToolRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
4
4
|
import { v4 } from 'uuid';
|
|
@@ -1165,7 +1165,7 @@ async function resolveGsScreenshotUrls(report, opts) {
|
|
|
1165
1165
|
if (gsUrls.length === 0) {
|
|
1166
1166
|
return report;
|
|
1167
1167
|
}
|
|
1168
|
-
const mcps = await import('./src-
|
|
1168
|
+
const mcps = await import('./src-J6AIYTLA.js');
|
|
1169
1169
|
const credentials = await mcps.getCallerCredentialsAsync();
|
|
1170
1170
|
if (!credentials.bearerToken && !credentials.apiKey) {
|
|
1171
1171
|
stderrWrite(
|
|
@@ -6375,6 +6375,9 @@ var PinnedAccountSchema = z.object({
|
|
|
6375
6375
|
|
|
6376
6376
|
// packages/mcps/src/mcp/e2e/contracts/constants.ts
|
|
6377
6377
|
var WORKFLOW_RUNTIME_ID_NOT_RUN_ID_HINT = "Use the `workflowRuntimeId` returned when the workflow was started \u2014 not a run `id` or a test runs summary's `latestWorkflowRunId`, which are run ids and are not found here.";
|
|
6378
|
+
var TEST_STATE_PARALLEL_ACCOUNT_SET_LIMIT_MIN = 1;
|
|
6379
|
+
var TEST_STATE_PARALLEL_ACCOUNT_SET_LIMIT_MAX = 20;
|
|
6380
|
+
var TEST_STATE_PARALLEL_ACCOUNT_SET_LIMIT_DEFAULT = 5;
|
|
6378
6381
|
var FanOutChoice = /* @__PURE__ */ ((FanOutChoice2) => {
|
|
6379
6382
|
FanOutChoice2["FollowPolicy"] = "followPolicy";
|
|
6380
6383
|
FanOutChoice2["PrimaryOnly"] = "primaryOnly";
|
|
@@ -6401,6 +6404,85 @@ var SecretFieldEnum = /* @__PURE__ */ ((SecretFieldEnum2) => {
|
|
|
6401
6404
|
SecretFieldEnum2["BILLING_POSTAL_CODE"] = "billing_postal_code";
|
|
6402
6405
|
return SecretFieldEnum2;
|
|
6403
6406
|
})(SecretFieldEnum || {});
|
|
6407
|
+
|
|
6408
|
+
// packages/mcps/src/mcp/e2e/contracts/test-state-types.ts
|
|
6409
|
+
var TestStateFactScopeEnum = /* @__PURE__ */ ((TestStateFactScopeEnum2) => {
|
|
6410
|
+
TestStateFactScopeEnum2["ACCOUNT_SET"] = "ACCOUNT_SET";
|
|
6411
|
+
TestStateFactScopeEnum2["ACCOUNT"] = "ACCOUNT";
|
|
6412
|
+
return TestStateFactScopeEnum2;
|
|
6413
|
+
})(TestStateFactScopeEnum || {});
|
|
6414
|
+
var TestRoleSourceEnum = /* @__PURE__ */ ((TestRoleSourceEnum2) => {
|
|
6415
|
+
TestRoleSourceEnum2["CREATED"] = "CREATED";
|
|
6416
|
+
TestRoleSourceEnum2["SUPPLIED"] = "SUPPLIED";
|
|
6417
|
+
return TestRoleSourceEnum2;
|
|
6418
|
+
})(TestRoleSourceEnum || {});
|
|
6419
|
+
|
|
6420
|
+
// packages/mcps/src/mcp/e2e/contracts/test-state-schemas.ts
|
|
6421
|
+
var TestStateProjectIdSchema = MuggleEntityIdSchema.describe("Project ID (UUID) that owns the test states and roles");
|
|
6422
|
+
var TestStateIdSchema = MuggleEntityIdSchema.describe("Test state ID (UUID)");
|
|
6423
|
+
var TestRoleIdSchema = MuggleEntityIdSchema.describe("Test role ID (UUID)");
|
|
6424
|
+
var TestStateFactSchema = z.object({
|
|
6425
|
+
statement: z.string().min(1).describe("What holds, e.g. 'the thread shows one unread message'"),
|
|
6426
|
+
scope: z.enum(TestStateFactScopeEnum).describe(
|
|
6427
|
+
"ACCOUNT_SET: only this account set's data, e.g. the patient's thread with the doctor. ACCOUNT: one account as a whole, e.g. the doctor's unread count"
|
|
6428
|
+
),
|
|
6429
|
+
roleId: MuggleEntityIdSchema.nullable().describe("Test role ID (UUID) whose account an ACCOUNT fact is about; null for an ACCOUNT_SET fact")
|
|
6430
|
+
});
|
|
6431
|
+
var TestStateFactsSchema = z.array(TestStateFactSchema).describe("Every fact the state's tests rely on");
|
|
6432
|
+
var TestStateCheckSchema = z.string().describe("Quick read-only check that an account set is in this state, e.g. 'the thread shows one unread message'; may be empty");
|
|
6433
|
+
var TestRoleSourceSchema = z.enum(TestRoleSourceEnum).describe("CREATED: Muggle signs the account up itself. SUPPLIED: the customer provides the account");
|
|
6434
|
+
var TestRoleAllowsChangesSchema = z.boolean().describe("SUPPLIED only: the customer allows tests to change the account's account-wide facts when a proven way back restores them");
|
|
6435
|
+
var TestChainingCatalogGetInputSchema = z.object({
|
|
6436
|
+
projectId: TestStateProjectIdSchema
|
|
6437
|
+
});
|
|
6438
|
+
var TestChainingSettingsUpdateInputSchema = z.object({
|
|
6439
|
+
projectId: TestStateProjectIdSchema,
|
|
6440
|
+
freshAccountSetStateId: MuggleEntityIdSchema.nullable().optional().describe("Test state ID (UUID) a newly formed account set starts in, e.g. 'New patient'; null clears it"),
|
|
6441
|
+
parallelAccountSetLimit: z.number().int().min(TEST_STATE_PARALLEL_ACCOUNT_SET_LIMIT_MIN).max(TEST_STATE_PARALLEL_ACCOUNT_SET_LIMIT_MAX).optional().describe(`Most account sets a batch runs at once (default ${TEST_STATE_PARALLEL_ACCOUNT_SET_LIMIT_DEFAULT})`)
|
|
6442
|
+
});
|
|
6443
|
+
var TestStateCreateInputSchema = z.object({
|
|
6444
|
+
projectId: TestStateProjectIdSchema,
|
|
6445
|
+
name: z.string().min(1).describe("State name, unique per project ignoring case, e.g. 'Message unread'"),
|
|
6446
|
+
facts: TestStateFactsSchema.optional(),
|
|
6447
|
+
check: TestStateCheckSchema.optional()
|
|
6448
|
+
});
|
|
6449
|
+
var TestStateUpdateInputSchema = z.object({
|
|
6450
|
+
projectId: TestStateProjectIdSchema,
|
|
6451
|
+
stateId: TestStateIdSchema,
|
|
6452
|
+
name: z.string().min(1).optional().describe("New state name, unique per project ignoring case"),
|
|
6453
|
+
facts: TestStateFactsSchema.optional(),
|
|
6454
|
+
check: TestStateCheckSchema.optional()
|
|
6455
|
+
});
|
|
6456
|
+
var TestStateDeleteInputSchema = z.object({
|
|
6457
|
+
projectId: TestStateProjectIdSchema,
|
|
6458
|
+
stateId: TestStateIdSchema
|
|
6459
|
+
});
|
|
6460
|
+
var TestRoleCreateInputSchema = z.object({
|
|
6461
|
+
projectId: TestStateProjectIdSchema,
|
|
6462
|
+
name: z.string().min(1).describe("Role name, unique per project ignoring case, e.g. 'Patient'"),
|
|
6463
|
+
source: TestRoleSourceSchema,
|
|
6464
|
+
allowsChanges: TestRoleAllowsChangesSchema.optional()
|
|
6465
|
+
});
|
|
6466
|
+
var TestRoleUpdateInputSchema = z.object({
|
|
6467
|
+
projectId: TestStateProjectIdSchema,
|
|
6468
|
+
roleId: TestRoleIdSchema,
|
|
6469
|
+
name: z.string().min(1).optional().describe("New role name, unique per project ignoring case"),
|
|
6470
|
+
source: TestRoleSourceSchema.optional(),
|
|
6471
|
+
allowsChanges: TestRoleAllowsChangesSchema.optional()
|
|
6472
|
+
});
|
|
6473
|
+
var TestRoleDeleteInputSchema = z.object({
|
|
6474
|
+
projectId: TestStateProjectIdSchema,
|
|
6475
|
+
roleId: TestRoleIdSchema
|
|
6476
|
+
});
|
|
6477
|
+
var TestChainingPlanGetInputSchema = z.object({
|
|
6478
|
+
projectId: TestStateProjectIdSchema,
|
|
6479
|
+
isProduction: z.boolean().optional().describe("True to plan for production, which runs at the floor with no extra account sets for speed (default false)")
|
|
6480
|
+
});
|
|
6481
|
+
var TestCaseTestStateFieldsSchema = z.object({
|
|
6482
|
+
actsAsRoleIds: z.array(MuggleEntityIdSchema).nullable().optional().describe("Test role IDs (UUID) the test acts as, in order; null clears them"),
|
|
6483
|
+
prerequisiteStateId: MuggleEntityIdSchema.nullable().optional().describe("Test state ID (UUID) the test needs to start; null clears it"),
|
|
6484
|
+
resultStateId: MuggleEntityIdSchema.nullable().optional().describe("Test state ID (UUID) the test leaves when it passes; the prerequisite's ID for an observation; null clears it")
|
|
6485
|
+
});
|
|
6404
6486
|
var FanOutPlanInputSchema = z.object({
|
|
6405
6487
|
projectId: z.string().min(1).describe("Project ID"),
|
|
6406
6488
|
testCaseId: z.string().min(1).describe("Test case ID whose fan-out to plan"),
|
|
@@ -6720,7 +6802,8 @@ var TestCaseCreateInputSchema = z.object({
|
|
|
6720
6802
|
category: z.string().optional().describe("Test case category"),
|
|
6721
6803
|
automated: z.boolean().optional().describe("Whether this test case is automated (default: true)"),
|
|
6722
6804
|
pinnedAccount: PinnedAccountSchema.optional().describe("Project secrets the test case signs in as. Omit to leave it unpinned"),
|
|
6723
|
-
alwaysStartsFreshSession: z.boolean().optional().describe(ALWAYS_STARTS_FRESH_SESSION_DESCRIPTION)
|
|
6805
|
+
alwaysStartsFreshSession: z.boolean().optional().describe(ALWAYS_STARTS_FRESH_SESSION_DESCRIPTION),
|
|
6806
|
+
...TestCaseTestStateFieldsSchema.shape
|
|
6724
6807
|
});
|
|
6725
6808
|
var TestCaseUpdateInputSchema = z.object({
|
|
6726
6809
|
testCaseId: IdSchema.describe("Test case ID (UUID) to update"),
|
|
@@ -6736,7 +6819,8 @@ var TestCaseUpdateInputSchema = z.object({
|
|
|
6736
6819
|
category: z.string().optional().describe("Updated category"),
|
|
6737
6820
|
automated: z.boolean().optional().describe("Whether this test case is automated"),
|
|
6738
6821
|
pinnedAccount: PinnedAccountSchema.nullable().optional().describe("Project secrets the test case signs in as; null clears the pin"),
|
|
6739
|
-
alwaysStartsFreshSession: z.boolean().optional().describe(ALWAYS_STARTS_FRESH_SESSION_DESCRIPTION)
|
|
6822
|
+
alwaysStartsFreshSession: z.boolean().optional().describe(ALWAYS_STARTS_FRESH_SESSION_DESCRIPTION),
|
|
6823
|
+
...TestCaseTestStateFieldsSchema.shape
|
|
6740
6824
|
});
|
|
6741
6825
|
var TestScriptListInputSchema = z.object({
|
|
6742
6826
|
projectId: IdSchema.describe("Project ID (UUID) to list test scripts for"),
|
|
@@ -7611,6 +7695,32 @@ function mapTestScriptsSummary(response) {
|
|
|
7611
7695
|
};
|
|
7612
7696
|
}
|
|
7613
7697
|
|
|
7698
|
+
// packages/mcps/src/mcp/tools/e2e/test-state-upstream.ts
|
|
7699
|
+
function buildTestChainingCatalogPath(projectId) {
|
|
7700
|
+
return `${MUGGLE_TEST_PREFIX}/projects/${projectId}/test-chaining/catalog`;
|
|
7701
|
+
}
|
|
7702
|
+
function buildTestStatesPath(projectId) {
|
|
7703
|
+
return `${MUGGLE_TEST_PREFIX}/projects/${projectId}/test-chaining/states`;
|
|
7704
|
+
}
|
|
7705
|
+
function buildTestRolesPath(projectId) {
|
|
7706
|
+
return `${MUGGLE_TEST_PREFIX}/projects/${projectId}/test-chaining/roles`;
|
|
7707
|
+
}
|
|
7708
|
+
function buildTestChainingSettingsPath(projectId) {
|
|
7709
|
+
return `${MUGGLE_TEST_PREFIX}/projects/${projectId}/test-chaining/settings`;
|
|
7710
|
+
}
|
|
7711
|
+
function buildTestChainingPlanPath(projectId) {
|
|
7712
|
+
return `${MUGGLE_TEST_PREFIX}/projects/${projectId}/test-chaining/plan`;
|
|
7713
|
+
}
|
|
7714
|
+
function pickTestCaseTestStateFields(testStateFields) {
|
|
7715
|
+
const requestFields = {};
|
|
7716
|
+
if (testStateFields.actsAsRoleIds !== void 0) requestFields.actsAsRoleIds = testStateFields.actsAsRoleIds;
|
|
7717
|
+
if (testStateFields.prerequisiteStateId !== void 0) {
|
|
7718
|
+
requestFields.prerequisiteStateId = testStateFields.prerequisiteStateId;
|
|
7719
|
+
}
|
|
7720
|
+
if (testStateFields.resultStateId !== void 0) requestFields.resultStateId = testStateFields.resultStateId;
|
|
7721
|
+
return requestFields;
|
|
7722
|
+
}
|
|
7723
|
+
|
|
7614
7724
|
// packages/mcps/src/mcp/tools/e2e/tool-registry.ts
|
|
7615
7725
|
var getWorkflowTimeoutMs = () => getConfig().e2e.workflowTimeoutMs;
|
|
7616
7726
|
var projectTools = [
|
|
@@ -8000,7 +8110,7 @@ var testCaseTools = [
|
|
|
8000
8110
|
},
|
|
8001
8111
|
{
|
|
8002
8112
|
name: "muggle-remote-test-case-create",
|
|
8003
|
-
description: "Create a new test case for a use case.",
|
|
8113
|
+
description: "Create a new test case for a use case. Optionally place it on the project's test states: the roles it acts as (actsAsRoleIds), the state it needs to start (prerequisiteStateId) and the state it leaves when it passes (resultStateId), using ids from muggle-remote-test-chaining-catalog-get.",
|
|
8004
8114
|
inputSchema: TestCaseCreateInputSchema,
|
|
8005
8115
|
dashboardLink: linkToInputProjectPage("test-cases" /* TestCases */),
|
|
8006
8116
|
mapToUpstream: (input) => {
|
|
@@ -8025,18 +8135,19 @@ var testCaseTools = [
|
|
|
8025
8135
|
...toolInput.pinnedAccount !== void 0 && { pinnedAccount: toolInput.pinnedAccount },
|
|
8026
8136
|
...toolInput.alwaysStartsFreshSession !== void 0 && {
|
|
8027
8137
|
alwaysStartsFreshSession: toolInput.alwaysStartsFreshSession
|
|
8028
|
-
}
|
|
8138
|
+
},
|
|
8139
|
+
...pickTestCaseTestStateFields(toolInput)
|
|
8029
8140
|
}
|
|
8030
8141
|
};
|
|
8031
8142
|
}
|
|
8032
8143
|
},
|
|
8033
8144
|
{
|
|
8034
8145
|
name: "muggle-remote-test-case-update",
|
|
8035
|
-
description: "Directly update an existing test case's fields. Pass only the fields you want to change \u2014 others are left untouched. Use this for cheap, deterministic edits (rename, change status/priority, fix expected result, add tags, set or clear the pinned account with pinnedAccount, set whether every run starts from a fresh session with alwaysStartsFreshSession; pinned account and fresh session apply from the next script generation, not to existing scripts). Does not touch the associated test script \u2014 script regeneration is a separate workflow (muggle-remote-workflow-start-test-script-generation).",
|
|
8146
|
+
description: "Directly update an existing test case's fields. Pass only the fields you want to change \u2014 others are left untouched. Use this for cheap, deterministic edits (rename, change status/priority, fix expected result, add tags, set or clear the pinned account with pinnedAccount, set whether every run starts from a fresh session with alwaysStartsFreshSession; pinned account and fresh session apply from the next script generation, not to existing scripts; set the roles it acts as and its prerequisite and result test states with actsAsRoleIds, prerequisiteStateId and resultStateId, null clearing each). Does not touch the associated test script \u2014 script regeneration is a separate workflow (muggle-remote-workflow-start-test-script-generation).",
|
|
8036
8147
|
inputSchema: TestCaseUpdateInputSchema,
|
|
8037
8148
|
mapToUpstream: (input) => {
|
|
8038
8149
|
const toolInput = input;
|
|
8039
|
-
const body = { id: toolInput.testCaseId };
|
|
8150
|
+
const body = { id: toolInput.testCaseId, ...pickTestCaseTestStateFields(toolInput) };
|
|
8040
8151
|
if (toolInput.title !== void 0) body.title = toolInput.title;
|
|
8041
8152
|
if (toolInput.description !== void 0) body.description = toolInput.description;
|
|
8042
8153
|
if (toolInput.goal !== void 0) body.goal = toolInput.goal;
|
|
@@ -8085,6 +8196,146 @@ var testCaseTools = [
|
|
|
8085
8196
|
}
|
|
8086
8197
|
}
|
|
8087
8198
|
];
|
|
8199
|
+
var testStateTools = [
|
|
8200
|
+
{
|
|
8201
|
+
name: "muggle-remote-test-chaining-catalog-get",
|
|
8202
|
+
description: "Get a project's test states and roles. A state is a named set of facts about one account set's data that tests start from and leave, each fact scoped to the account set or account-wide, with a quick read-only check. A role is a kind of account a test acts as, CREATED by Muggle or SUPPLIED by the customer. Also returns freshAccountSetStateId (the state a newly formed account set starts in) and parallelAccountSetLimit; a project with none saved returns an empty catalog. Response shape: { projectId, states: [{ id, name, facts: [{ statement, scope, roleId }], check }], roles: [{ id, name, source, allowsChanges }], freshAccountSetStateId, parallelAccountSetLimit, updatedAt }.",
|
|
8203
|
+
inputSchema: TestChainingCatalogGetInputSchema,
|
|
8204
|
+
mapToUpstream: (input) => {
|
|
8205
|
+
const toolInput = input;
|
|
8206
|
+
return {
|
|
8207
|
+
method: "GET",
|
|
8208
|
+
path: buildTestChainingCatalogPath(toolInput.projectId)
|
|
8209
|
+
};
|
|
8210
|
+
}
|
|
8211
|
+
},
|
|
8212
|
+
{
|
|
8213
|
+
name: "muggle-remote-test-chaining-settings-update",
|
|
8214
|
+
description: "Set a project's freshAccountSetStateId (the state a newly formed account set starts in, such as 'New patient'; null clears it) and parallelAccountSetLimit (the most account sets a batch runs at once). Omitted fields stay unchanged. Returns the whole catalog, as muggle-remote-test-chaining-catalog-get does.",
|
|
8215
|
+
inputSchema: TestChainingSettingsUpdateInputSchema,
|
|
8216
|
+
mapToUpstream: (input) => {
|
|
8217
|
+
const toolInput = input;
|
|
8218
|
+
const body = {};
|
|
8219
|
+
if (toolInput.freshAccountSetStateId !== void 0) body.freshAccountSetStateId = toolInput.freshAccountSetStateId;
|
|
8220
|
+
if (toolInput.parallelAccountSetLimit !== void 0) body.parallelAccountSetLimit = toolInput.parallelAccountSetLimit;
|
|
8221
|
+
return {
|
|
8222
|
+
method: "PUT",
|
|
8223
|
+
path: buildTestChainingSettingsPath(toolInput.projectId),
|
|
8224
|
+
body
|
|
8225
|
+
};
|
|
8226
|
+
}
|
|
8227
|
+
},
|
|
8228
|
+
{
|
|
8229
|
+
name: "muggle-remote-test-state-create",
|
|
8230
|
+
description: "Create a test state: a named set of facts about one account set's data, such as 'Booked' or 'Message unread'. List every fact the state's tests rely on, each scoped to the account set (only this account set's data, e.g. the patient's thread with the doctor) or account-wide (one account as a whole, e.g. the doctor's unread count, naming that account's role). check is a quick read-only check that an account set is in the state. Reuse a matching state from muggle-remote-test-chaining-catalog-get before creating one. Returns the created state.",
|
|
8231
|
+
inputSchema: TestStateCreateInputSchema,
|
|
8232
|
+
mapToUpstream: (input) => {
|
|
8233
|
+
const toolInput = input;
|
|
8234
|
+
const body = { name: toolInput.name };
|
|
8235
|
+
if (toolInput.facts !== void 0) body.facts = toolInput.facts;
|
|
8236
|
+
if (toolInput.check !== void 0) body.check = toolInput.check;
|
|
8237
|
+
return {
|
|
8238
|
+
method: "POST",
|
|
8239
|
+
path: buildTestStatesPath(toolInput.projectId),
|
|
8240
|
+
body
|
|
8241
|
+
};
|
|
8242
|
+
}
|
|
8243
|
+
},
|
|
8244
|
+
{
|
|
8245
|
+
name: "muggle-remote-test-state-update",
|
|
8246
|
+
description: "Update a test state's name, facts or check. Omitted fields stay unchanged; facts replaces the state's whole fact list. Returns the updated state.",
|
|
8247
|
+
inputSchema: TestStateUpdateInputSchema,
|
|
8248
|
+
mapToUpstream: (input) => {
|
|
8249
|
+
const toolInput = input;
|
|
8250
|
+
const body = {};
|
|
8251
|
+
if (toolInput.name !== void 0) body.name = toolInput.name;
|
|
8252
|
+
if (toolInput.facts !== void 0) body.facts = toolInput.facts;
|
|
8253
|
+
if (toolInput.check !== void 0) body.check = toolInput.check;
|
|
8254
|
+
return {
|
|
8255
|
+
method: "PUT",
|
|
8256
|
+
path: `${buildTestStatesPath(toolInput.projectId)}/${toolInput.stateId}`,
|
|
8257
|
+
body
|
|
8258
|
+
};
|
|
8259
|
+
}
|
|
8260
|
+
},
|
|
8261
|
+
{
|
|
8262
|
+
name: "muggle-remote-test-state-delete",
|
|
8263
|
+
description: "Delete a test state. Rejected while a test case uses it as its prerequisite or result state, or while it is the project's freshAccountSetStateId.",
|
|
8264
|
+
inputSchema: TestStateDeleteInputSchema,
|
|
8265
|
+
mapToUpstream: (input) => {
|
|
8266
|
+
const toolInput = input;
|
|
8267
|
+
return {
|
|
8268
|
+
method: "DELETE",
|
|
8269
|
+
path: `${buildTestStatesPath(toolInput.projectId)}/${toolInput.stateId}`
|
|
8270
|
+
};
|
|
8271
|
+
},
|
|
8272
|
+
mapFromUpstream: (_response, input) => {
|
|
8273
|
+
const toolInput = input;
|
|
8274
|
+
return { stateId: toolInput.stateId, isDeleted: true };
|
|
8275
|
+
}
|
|
8276
|
+
},
|
|
8277
|
+
{
|
|
8278
|
+
name: "muggle-remote-test-role-create",
|
|
8279
|
+
description: "Create a test role: a kind of account a test acts as, such as Patient or Doctor; two accounts of one kind in one test are two roles. CREATED: Muggle signs each account set's account up itself, and it is disposable. SUPPLIED: the customer provides the account, which is never used up; allowsChanges lets tests change its account-wide facts when a proven way back restores them. Returns the created role.",
|
|
8280
|
+
inputSchema: TestRoleCreateInputSchema,
|
|
8281
|
+
mapToUpstream: (input) => {
|
|
8282
|
+
const toolInput = input;
|
|
8283
|
+
const body = { name: toolInput.name, source: toolInput.source };
|
|
8284
|
+
if (toolInput.allowsChanges !== void 0) body.allowsChanges = toolInput.allowsChanges;
|
|
8285
|
+
return {
|
|
8286
|
+
method: "POST",
|
|
8287
|
+
path: buildTestRolesPath(toolInput.projectId),
|
|
8288
|
+
body
|
|
8289
|
+
};
|
|
8290
|
+
}
|
|
8291
|
+
},
|
|
8292
|
+
{
|
|
8293
|
+
name: "muggle-remote-test-role-update",
|
|
8294
|
+
description: "Update a test role's name, source or allowsChanges. Omitted fields stay unchanged. Returns the updated role.",
|
|
8295
|
+
inputSchema: TestRoleUpdateInputSchema,
|
|
8296
|
+
mapToUpstream: (input) => {
|
|
8297
|
+
const toolInput = input;
|
|
8298
|
+
const body = {};
|
|
8299
|
+
if (toolInput.name !== void 0) body.name = toolInput.name;
|
|
8300
|
+
if (toolInput.source !== void 0) body.source = toolInput.source;
|
|
8301
|
+
if (toolInput.allowsChanges !== void 0) body.allowsChanges = toolInput.allowsChanges;
|
|
8302
|
+
return {
|
|
8303
|
+
method: "PUT",
|
|
8304
|
+
path: `${buildTestRolesPath(toolInput.projectId)}/${toolInput.roleId}`,
|
|
8305
|
+
body
|
|
8306
|
+
};
|
|
8307
|
+
}
|
|
8308
|
+
},
|
|
8309
|
+
{
|
|
8310
|
+
name: "muggle-remote-test-role-delete",
|
|
8311
|
+
description: "Delete a test role. Rejected while a test case acts as it or a state's account-wide fact names it.",
|
|
8312
|
+
inputSchema: TestRoleDeleteInputSchema,
|
|
8313
|
+
mapToUpstream: (input) => {
|
|
8314
|
+
const toolInput = input;
|
|
8315
|
+
return {
|
|
8316
|
+
method: "DELETE",
|
|
8317
|
+
path: `${buildTestRolesPath(toolInput.projectId)}/${toolInput.roleId}`
|
|
8318
|
+
};
|
|
8319
|
+
},
|
|
8320
|
+
mapFromUpstream: (_response, input) => {
|
|
8321
|
+
const toolInput = input;
|
|
8322
|
+
return { roleId: toolInput.roleId, isDeleted: true };
|
|
8323
|
+
}
|
|
8324
|
+
},
|
|
8325
|
+
{
|
|
8326
|
+
name: "muggle-remote-test-chaining-plan-get",
|
|
8327
|
+
description: "Preview how the project's test cases would run on account sets. Read-only: it plans from the saved states, roles and test cases and does not run anything. Returns the floor (fewest account sets that can run every placed test), each account set's route in order with setup runs (replays that only reach a state, with no verdict) and the one-way test that forced each account set beyond the first, the groups of states, Not allowed tests that would change a supplied account, tests whose prerequisite state no test reaches, and test cases with no states yet (they run as today). Response shape: { floor, batchLength, totalRuns, setupRuns, account sets: [{ accountSetNumber, slotNumber, steps: [{ testCaseId, prerequisiteStateId, resultStateId, isSetup, heldSuppliedRoleIds }], endStateId, isUsedUp, forcedByTestCaseId }], groups: [{ groupNumber, stateIds, isTerminal }], notAllowed: [{ testCaseId, reason, suppliedRoleIds }], missingState: [{ testCaseId, prerequisiteStateId }], unplacedTestCaseIds, unrestoredSuppliedRoleIds }.",
|
|
8328
|
+
inputSchema: TestChainingPlanGetInputSchema,
|
|
8329
|
+
mapToUpstream: (input) => {
|
|
8330
|
+
const toolInput = input;
|
|
8331
|
+
return {
|
|
8332
|
+
method: "GET",
|
|
8333
|
+
path: buildTestChainingPlanPath(toolInput.projectId),
|
|
8334
|
+
queryParams: { isProduction: toolInput.isProduction }
|
|
8335
|
+
};
|
|
8336
|
+
}
|
|
8337
|
+
}
|
|
8338
|
+
];
|
|
8088
8339
|
var bulkPreviewTools = [
|
|
8089
8340
|
{
|
|
8090
8341
|
name: "muggle-remote-bulk-preview-job-get",
|
|
@@ -9368,6 +9619,7 @@ var allQaToolDefinitions = [
|
|
|
9368
9619
|
...projectTools,
|
|
9369
9620
|
...useCaseTools,
|
|
9370
9621
|
...testCaseTools,
|
|
9622
|
+
...testStateTools,
|
|
9371
9623
|
...bulkPreviewTools,
|
|
9372
9624
|
...testScriptTools,
|
|
9373
9625
|
...actionScriptTools,
|
|
@@ -10708,11 +10960,24 @@ __export(e2e_exports2, {
|
|
|
10708
10960
|
TestCaseGetInputSchema: () => TestCaseGetInputSchema,
|
|
10709
10961
|
TestCaseListByUseCaseInputSchema: () => TestCaseListByUseCaseInputSchema,
|
|
10710
10962
|
TestCaseListInputSchema: () => TestCaseListInputSchema,
|
|
10963
|
+
TestCaseTestStateFieldsSchema: () => TestCaseTestStateFieldsSchema,
|
|
10711
10964
|
TestCaseUpdateInputSchema: () => TestCaseUpdateInputSchema,
|
|
10965
|
+
TestChainingCatalogGetInputSchema: () => TestChainingCatalogGetInputSchema,
|
|
10966
|
+
TestChainingPlanGetInputSchema: () => TestChainingPlanGetInputSchema,
|
|
10967
|
+
TestChainingSettingsUpdateInputSchema: () => TestChainingSettingsUpdateInputSchema,
|
|
10712
10968
|
TestPlanGraphRebuildInputSchema: () => TestPlanGraphRebuildInputSchema,
|
|
10969
|
+
TestRoleCreateInputSchema: () => TestRoleCreateInputSchema,
|
|
10970
|
+
TestRoleDeleteInputSchema: () => TestRoleDeleteInputSchema,
|
|
10971
|
+
TestRoleSourceEnum: () => TestRoleSourceEnum,
|
|
10972
|
+
TestRoleUpdateInputSchema: () => TestRoleUpdateInputSchema,
|
|
10713
10973
|
TestScriptDeleteInputSchema: () => TestScriptDeleteInputSchema,
|
|
10714
10974
|
TestScriptGetInputSchema: () => TestScriptGetInputSchema,
|
|
10715
10975
|
TestScriptListInputSchema: () => TestScriptListInputSchema,
|
|
10976
|
+
TestStateCreateInputSchema: () => TestStateCreateInputSchema,
|
|
10977
|
+
TestStateDeleteInputSchema: () => TestStateDeleteInputSchema,
|
|
10978
|
+
TestStateFactSchema: () => TestStateFactSchema,
|
|
10979
|
+
TestStateFactScopeEnum: () => TestStateFactScopeEnum,
|
|
10980
|
+
TestStateUpdateInputSchema: () => TestStateUpdateInputSchema,
|
|
10716
10981
|
TokenPackageIdSchema: () => TokenPackageIdSchema,
|
|
10717
10982
|
TokenUsageFilterTypeSchema: () => TokenUsageFilterTypeSchema,
|
|
10718
10983
|
UseCaseCandidatesApproveInputSchema: () => UseCaseCandidatesApproveInputSchema,
|
package/dist/cli.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { src_exports as commands, createUnifiedMcpServer, server_exports as server } from './chunk-
|
|
2
|
-
export { createChildLogger, e2e_exports as e2e, getConfig, getLocalQaTools, getLogger, getQaTools, local_exports as localQa, mcp_exports as mcp, e2e_exports as qa, src_exports as shared } from './chunk-
|
|
1
|
+
export { src_exports as commands, createUnifiedMcpServer, server_exports as server } from './chunk-W3HJBL5U.js';
|
|
2
|
+
export { createChildLogger, e2e_exports as e2e, getConfig, getLocalQaTools, getLogger, getQaTools, local_exports as localQa, mcp_exports as mcp, e2e_exports as qa, src_exports as shared } from './chunk-XUANXZ2O.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "muggle",
|
|
3
3
|
"description": "Real-browser E2E acceptance for your coding agent: test the flows you changed and open the PR with screenshots. Built for flows other tools can't reach: managed test identities with live inboxes (magic links, email OTP and 2FA, verification mail, password resets), an encrypted secret store for login and test credentials, and a test graph that runs prerequisite flows first. Plain-English tests become replayable scripts on localhost or preview URLs.",
|
|
4
|
-
"version": "5.31.0-staging.
|
|
4
|
+
"version": "5.31.0-staging.270",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Muggle AI",
|
|
7
7
|
"email": "support@muggle-ai.com"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "muggle",
|
|
3
|
-
"version": "5.31.0-staging.
|
|
3
|
+
"version": "5.31.0-staging.270",
|
|
4
4
|
"description": "Real-browser E2E acceptance for your coding agent: test the flows you changed and open the PR with screenshots. Built for flows other tools can't reach: managed test identities with live inboxes (magic links, email OTP and 2FA, verification mail, password resets), an encrypted secret store for login and test credentials, and a test graph that runs prerequisite flows first. Plain-English tests become replayable scripts on localhost or preview URLs.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Muggle AI",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "muggle",
|
|
3
3
|
"displayName": "Muggle AI",
|
|
4
4
|
"description": "Real-browser E2E acceptance for your coding agent: test the flows you changed and open the PR with screenshots. Built for flows other tools can't reach: managed test identities with live inboxes (magic links, email OTP and 2FA, verification mail, password resets), an encrypted secret store for login and test credentials, and a test graph that runs prerequisite flows first. Plain-English tests become replayable scripts on localhost or preview URLs.",
|
|
5
|
-
"version": "5.31.0-staging.
|
|
5
|
+
"version": "5.31.0-staging.270",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Muggle AI",
|
|
8
8
|
"email": "support@muggle-ai.com"
|
package/dist/plugin/.mcp.json
CHANGED
|
@@ -33,6 +33,8 @@ Then increment `last_seen.ci_fix_attempts[red_sha]` — before any fix, re-run o
|
|
|
33
33
|
|
|
34
34
|
The increment opens a cycle this turn carries through Step 5 or Step 6 — it never stands in for one. The single exception is a red `muggle-walkthrough` whose E2E run for **this** PR is already queued or running (its `state.md` shows `E2E dispatch: queued` or `running`): that run is the cycle, and its report settles the comment. Writing the count for a PR with no such run, or because another PR's run is in flight, clears the turn-end gate while the PR stays red; the watch never asks again until the head moves, and the PR can merge red.
|
|
35
35
|
|
|
36
|
+
If the increment takes the count past 3, this head's budget was spent before the cycle began: make no fix, no re-run and no push — go straight to Step 6. A fixable failure does not reopen a spent budget.
|
|
37
|
+
|
|
36
38
|
### Step 2 — Map each failing check to a local command
|
|
37
39
|
|
|
38
40
|
Per [`../_shared/ci-check-to-command.md`](../_shared/ci-check-to-command.md). Fix the in-scope checks in the working tree; record out-of-scope checks for escalation (Step 6). A red `muggle-walkthrough` check takes Step 2.5; a red non-deterministic check takes Step 2.6.
|
|
@@ -84,7 +86,7 @@ Respawn the watcher per [`respawn-watcher.md`](respawn-watcher.md). CI on the ne
|
|
|
84
86
|
|
|
85
87
|
### Step 6 — Escalate (budget spent or out of scope)
|
|
86
88
|
|
|
87
|
-
When the failing checks are all out of scope, a non-deterministic check is red again after its re-run on this head (Step 2.6),
|
|
89
|
+
When the failing checks are all out of scope, a non-deterministic check is red again after its re-run on this head (Step 2.6), this is the head's third cycle (`ci_fix_attempts[red_sha]` reached 3 in Step 1) and it could not push a fix, or Step 1 found the budget already spent:
|
|
88
90
|
|
|
89
91
|
1. Add `red_sha` to `last_seen.ci_escalated_shas` so the SHA is not re-fixed. This cycle's Step 1 attempt is what makes the entry count.
|
|
90
92
|
2. Emit one terminal message naming the unresolved checks.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"release": "5.26.0",
|
|
3
|
-
"buildId": "run-
|
|
4
|
-
"commitSha": "
|
|
5
|
-
"buildTime": "2026-10-
|
|
3
|
+
"buildId": "run-270-1",
|
|
4
|
+
"commitSha": "09e34fedf072b7a5ab4fdce746bd0c0bfbe53c4a",
|
|
5
|
+
"buildTime": "2026-10-31T23:24:31Z",
|
|
6
6
|
"serviceName": "muggle-ai-works-mcp"
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { ACTION_SCRIPT_FILE_NAME, BASE_REMOTE_NAME, BLOCKING_FRESHNESS_VERDICTS, BRANCH_CREATION_REFLOG_PREFIX, BUSY_EXIT_CODE, CLAUDE_CODE_AUTH_STATUS_ARGS, CLAUDE_CODE_CHECK_TIMEOUT_MS, CLAUDE_CODE_EXECUTABLE, CLAUDE_CODE_EXECUTABLE_NOT_FOUND_CODE, CLAUDE_CODE_SESSION_LINK_ENV_VARS, CLAUDE_CODE_VERSION_ARGS, CheckoutFreshnessVerdict, ClaudeCodeReadiness, DEFAULT_LOCAL_LLM_BASE_URL, DEFAULT_PREFERENCES, ELECTRON_APP_EXECUTABLE_PATH_SEGMENTS, ElectronAppPlatform, ElectronAppReleaseStream, HTML_VIEW_OFFER_LINE, LLM_CREDENTIALS_FILE_MODE, LLM_CREDENTIALS_FILE_NAME, LLM_SOURCE_HEADER, LLM_SOURCE_OPTIONS, LLM_SOURCE_OWNED_ENV_NAMES, LLM_SOURCE_PROMPT, LLM_SOURCE_SCOPE_NOTE, LlmSource, MASKED_API_KEY_PREFIX, MASKED_API_KEY_VISIBLE_CHARS, MAX_LISTED_INHERITED_COMMITS, ONBOARDING_BLANKET_OPTIONS, ONBOARDING_CHOICE_GROUPS, ONBOARDING_MAX_OFFERS, ONBOARDING_PRIMER_BULLETS, ONBOARDING_PRIMER_HEADLINE, ONBOARDING_TOGGLE_GROUPS, ONBOARDING_TOGGLE_PROMPT, ONBOARDING_UNSELECTED_TOGGLE_VALUE, OnboardingBlanketChoice, OnboardingGroupKind, PREFERENCES_FILE_NAME, PREFERENCES_PROJECT_DIR_NAME, PREFERENCES_SCHEMA, PREFERENCES_VERSION, PREFERENCE_ALLOWED_VALUES, PreferenceKey, PreferenceValue, ProjectPreferencesReconcileOutcome, RUN_SESSIONS_DIR_NAME, RUN_VIEW_DASHBOARD_LINK_LABEL, RunViewError, RuntimeTarget, SCREENSHOT_DIR_RELATIVE_PATH, SCREENSHOT_FILE_EXTENSION, StackCheckVerdict, StackClaimVerdict, StackLeaseEndReason, StackMismatchKind, StackPortAction, WATCHER_LIFETIME_SECONDS, WATCHER_LIFETIME_UNBOUNDED_SECONDS, applyLlmSourceSelection, applyOnboardingAnswers, assertDeviceCodeClientProvisioned, buildElectronAppChecksumsUrl, buildElectronAppDirName, buildElectronAppReleaseAssetUrl, buildElectronAppReleaseTag, buildLlmSourcePlan, buildOnboardingPlan, buildToolInputJsonSchema, calculateFileChecksum, checkServiceStack, claimServiceStack, compareQueuePlaces, completeOnboarding, createApiKeyWithToken, createChildLogger, decideStackClaim, decideStackReap, decideStackRelease, decideStackRunEnd, decideStackRunStart, deleteApiKeyData, deleteCredentials, describeLlmSourceStatus, describeStackMismatch, e2e_exports as e2e, evaluateCheckoutFreshness, findVacatedNeeds, finishStackRun, formatPreferencesOneLiner, getActiveElectronAppReleaseStream, getActiveRuntimeTarget, getApiKey, getApiKeyFilePath, getAuthService, getBundledElectronAppVersion, getCallerCredentials, getCallerCredentialsAsync, getChecksumForPlatform, getConfig, getCredentialsFilePath, getDashboardBaseUrl, getDataDir2 as getDataDir, getDownloadBaseUrl, getElectronAppChecksums, getElectronAppDir, getElectronAppReleaseTagPrefix, getElectronAppSignedFromVersion, getElectronAppVersion, getElectronAppVersionSource, getLlmSourceOption, getLocalQaTools, getLogger, getOnboardingToggleKeys, getPlatformKey, getQaTools, getReleaseSignerIdentityUri, getRunSessionsDir, getValidApiKeyData, getValidCredentials, hasApiKey, isElectronAppInstalled, isElectronAppPlatform, isFirstRun, isValidLocalBaseUrl, loadApiKeyData, loadCredentials, local_exports as localQa, lookUpCheckoutPullRequest, markOnboardingCompleted, maskLlmApiKey, mcp_exports as mcp, needsConflict, needsOnboarding, openBrowserUrl, parseElectronAppDirName, performLogin, performLogout, pollDeviceCode, portOfUrl, e2e_exports as qa, readPreferencesMetadata, readRunView, readServiceStackStatus, reapServiceStack, reconcileProjectPreferences, recordOnboardingSkip, releaseServiceStack, renderRunViewHtml, renderRunViewText, resetConfig, resetLogger, resetPreference, resolveActiveProfile, resolveActiveReleaseStream, resolveActiveReleaseTagPrefix, resolveBlanketPreferences, resolveElectronAppExecutablePath, resolveElectronAppPathOrNull, resolveLlmSourceStatus, resolveOnboardingAnswers, resolvePreferences, resolveRunSessionPath, resolveRuntimeTarget, resolveTogglePreferences, runGitCommand, saveApiKey, saveApiKeyData, saveCredentials, startDeviceCodeFlow, startStackRun, stopVacatedServices, toDisplayRef, toolRequiresAuth, validatePreference, verifyFileChecksum, writeLlmEnvBlock, writePreferences, writePreferencesWithMetadata, writeRunViewHtml } from './chunk-
|
|
1
|
+
export { ACTION_SCRIPT_FILE_NAME, BASE_REMOTE_NAME, BLOCKING_FRESHNESS_VERDICTS, BRANCH_CREATION_REFLOG_PREFIX, BUSY_EXIT_CODE, CLAUDE_CODE_AUTH_STATUS_ARGS, CLAUDE_CODE_CHECK_TIMEOUT_MS, CLAUDE_CODE_EXECUTABLE, CLAUDE_CODE_EXECUTABLE_NOT_FOUND_CODE, CLAUDE_CODE_SESSION_LINK_ENV_VARS, CLAUDE_CODE_VERSION_ARGS, CheckoutFreshnessVerdict, ClaudeCodeReadiness, DEFAULT_LOCAL_LLM_BASE_URL, DEFAULT_PREFERENCES, ELECTRON_APP_EXECUTABLE_PATH_SEGMENTS, ElectronAppPlatform, ElectronAppReleaseStream, HTML_VIEW_OFFER_LINE, LLM_CREDENTIALS_FILE_MODE, LLM_CREDENTIALS_FILE_NAME, LLM_SOURCE_HEADER, LLM_SOURCE_OPTIONS, LLM_SOURCE_OWNED_ENV_NAMES, LLM_SOURCE_PROMPT, LLM_SOURCE_SCOPE_NOTE, LlmSource, MASKED_API_KEY_PREFIX, MASKED_API_KEY_VISIBLE_CHARS, MAX_LISTED_INHERITED_COMMITS, ONBOARDING_BLANKET_OPTIONS, ONBOARDING_CHOICE_GROUPS, ONBOARDING_MAX_OFFERS, ONBOARDING_PRIMER_BULLETS, ONBOARDING_PRIMER_HEADLINE, ONBOARDING_TOGGLE_GROUPS, ONBOARDING_TOGGLE_PROMPT, ONBOARDING_UNSELECTED_TOGGLE_VALUE, OnboardingBlanketChoice, OnboardingGroupKind, PREFERENCES_FILE_NAME, PREFERENCES_PROJECT_DIR_NAME, PREFERENCES_SCHEMA, PREFERENCES_VERSION, PREFERENCE_ALLOWED_VALUES, PreferenceKey, PreferenceValue, ProjectPreferencesReconcileOutcome, RUN_SESSIONS_DIR_NAME, RUN_VIEW_DASHBOARD_LINK_LABEL, RunViewError, RuntimeTarget, SCREENSHOT_DIR_RELATIVE_PATH, SCREENSHOT_FILE_EXTENSION, StackCheckVerdict, StackClaimVerdict, StackLeaseEndReason, StackMismatchKind, StackPortAction, WATCHER_LIFETIME_SECONDS, WATCHER_LIFETIME_UNBOUNDED_SECONDS, applyLlmSourceSelection, applyOnboardingAnswers, assertDeviceCodeClientProvisioned, buildElectronAppChecksumsUrl, buildElectronAppDirName, buildElectronAppReleaseAssetUrl, buildElectronAppReleaseTag, buildLlmSourcePlan, buildOnboardingPlan, buildToolInputJsonSchema, calculateFileChecksum, checkServiceStack, claimServiceStack, compareQueuePlaces, completeOnboarding, createApiKeyWithToken, createChildLogger, decideStackClaim, decideStackReap, decideStackRelease, decideStackRunEnd, decideStackRunStart, deleteApiKeyData, deleteCredentials, describeLlmSourceStatus, describeStackMismatch, e2e_exports as e2e, evaluateCheckoutFreshness, findVacatedNeeds, finishStackRun, formatPreferencesOneLiner, getActiveElectronAppReleaseStream, getActiveRuntimeTarget, getApiKey, getApiKeyFilePath, getAuthService, getBundledElectronAppVersion, getCallerCredentials, getCallerCredentialsAsync, getChecksumForPlatform, getConfig, getCredentialsFilePath, getDashboardBaseUrl, getDataDir2 as getDataDir, getDownloadBaseUrl, getElectronAppChecksums, getElectronAppDir, getElectronAppReleaseTagPrefix, getElectronAppSignedFromVersion, getElectronAppVersion, getElectronAppVersionSource, getLlmSourceOption, getLocalQaTools, getLogger, getOnboardingToggleKeys, getPlatformKey, getQaTools, getReleaseSignerIdentityUri, getRunSessionsDir, getValidApiKeyData, getValidCredentials, hasApiKey, isElectronAppInstalled, isElectronAppPlatform, isFirstRun, isValidLocalBaseUrl, loadApiKeyData, loadCredentials, local_exports as localQa, lookUpCheckoutPullRequest, markOnboardingCompleted, maskLlmApiKey, mcp_exports as mcp, needsConflict, needsOnboarding, openBrowserUrl, parseElectronAppDirName, performLogin, performLogout, pollDeviceCode, portOfUrl, e2e_exports as qa, readPreferencesMetadata, readRunView, readServiceStackStatus, reapServiceStack, reconcileProjectPreferences, recordOnboardingSkip, releaseServiceStack, renderRunViewHtml, renderRunViewText, resetConfig, resetLogger, resetPreference, resolveActiveProfile, resolveActiveReleaseStream, resolveActiveReleaseTagPrefix, resolveBlanketPreferences, resolveElectronAppExecutablePath, resolveElectronAppPathOrNull, resolveLlmSourceStatus, resolveOnboardingAnswers, resolvePreferences, resolveRunSessionPath, resolveRuntimeTarget, resolveTogglePreferences, runGitCommand, saveApiKey, saveApiKeyData, saveCredentials, startDeviceCodeFlow, startStackRun, stopVacatedServices, toDisplayRef, toolRequiresAuth, validatePreference, verifyFileChecksum, writeLlmEnvBlock, writePreferences, writePreferencesWithMetadata, writeRunViewHtml } from './chunk-XUANXZ2O.js';
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@muggleai/works",
|
|
3
3
|
"mcpName": "io.github.multiplex-ai/muggle",
|
|
4
|
-
"version": "5.31.0-staging.
|
|
4
|
+
"version": "5.31.0-staging.270",
|
|
5
5
|
"description": "13 years of Microsoft hyperscale engineering, packaged as a harness for your AI coding agent.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "dist/index.js",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "muggle",
|
|
3
3
|
"description": "Real-browser E2E acceptance for your coding agent: test the flows you changed and open the PR with screenshots. Built for flows other tools can't reach: managed test identities with live inboxes (magic links, email OTP and 2FA, verification mail, password resets), an encrypted secret store for login and test credentials, and a test graph that runs prerequisite flows first. Plain-English tests become replayable scripts on localhost or preview URLs.",
|
|
4
|
-
"version": "5.31.0-staging.
|
|
4
|
+
"version": "5.31.0-staging.270",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Muggle AI",
|
|
7
7
|
"email": "support@muggle-ai.com"
|
package/plugin/.codex-mcp.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "muggle",
|
|
3
|
-
"version": "5.31.0-staging.
|
|
3
|
+
"version": "5.31.0-staging.270",
|
|
4
4
|
"description": "Real-browser E2E acceptance for your coding agent: test the flows you changed and open the PR with screenshots. Built for flows other tools can't reach: managed test identities with live inboxes (magic links, email OTP and 2FA, verification mail, password resets), an encrypted secret store for login and test credentials, and a test graph that runs prerequisite flows first. Plain-English tests become replayable scripts on localhost or preview URLs.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Muggle AI",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "muggle",
|
|
3
3
|
"displayName": "Muggle AI",
|
|
4
4
|
"description": "Real-browser E2E acceptance for your coding agent: test the flows you changed and open the PR with screenshots. Built for flows other tools can't reach: managed test identities with live inboxes (magic links, email OTP and 2FA, verification mail, password resets), an encrypted secret store for login and test credentials, and a test graph that runs prerequisite flows first. Plain-English tests become replayable scripts on localhost or preview URLs.",
|
|
5
|
-
"version": "5.31.0-staging.
|
|
5
|
+
"version": "5.31.0-staging.270",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Muggle AI",
|
|
8
8
|
"email": "support@muggle-ai.com"
|
package/plugin/.mcp.json
CHANGED
|
@@ -33,6 +33,8 @@ Then increment `last_seen.ci_fix_attempts[red_sha]` — before any fix, re-run o
|
|
|
33
33
|
|
|
34
34
|
The increment opens a cycle this turn carries through Step 5 or Step 6 — it never stands in for one. The single exception is a red `muggle-walkthrough` whose E2E run for **this** PR is already queued or running (its `state.md` shows `E2E dispatch: queued` or `running`): that run is the cycle, and its report settles the comment. Writing the count for a PR with no such run, or because another PR's run is in flight, clears the turn-end gate while the PR stays red; the watch never asks again until the head moves, and the PR can merge red.
|
|
35
35
|
|
|
36
|
+
If the increment takes the count past 3, this head's budget was spent before the cycle began: make no fix, no re-run and no push — go straight to Step 6. A fixable failure does not reopen a spent budget.
|
|
37
|
+
|
|
36
38
|
### Step 2 — Map each failing check to a local command
|
|
37
39
|
|
|
38
40
|
Per [`../_shared/ci-check-to-command.md`](../_shared/ci-check-to-command.md). Fix the in-scope checks in the working tree; record out-of-scope checks for escalation (Step 6). A red `muggle-walkthrough` check takes Step 2.5; a red non-deterministic check takes Step 2.6.
|
|
@@ -84,7 +86,7 @@ Respawn the watcher per [`respawn-watcher.md`](respawn-watcher.md). CI on the ne
|
|
|
84
86
|
|
|
85
87
|
### Step 6 — Escalate (budget spent or out of scope)
|
|
86
88
|
|
|
87
|
-
When the failing checks are all out of scope, a non-deterministic check is red again after its re-run on this head (Step 2.6),
|
|
89
|
+
When the failing checks are all out of scope, a non-deterministic check is red again after its re-run on this head (Step 2.6), this is the head's third cycle (`ci_fix_attempts[red_sha]` reached 3 in Step 1) and it could not push a fix, or Step 1 found the budget already spent:
|
|
88
90
|
|
|
89
91
|
1. Add `red_sha` to `last_seen.ci_escalated_shas` so the SHA is not re-fixed. This cycle's Step 1 attempt is what makes the entry count.
|
|
90
92
|
2. Emit one terminal message naming the unresolved checks.
|