@supatest/cli 0.0.52 → 0.0.53

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.
Files changed (2) hide show
  1. package/dist/index.js +92 -11
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -359,7 +359,7 @@ function getToolGroupCounts(tools) {
359
359
  );
360
360
  return Object.entries(groups).map(([name, count]) => ({ name, count })).sort((a, b) => b.count - a.count);
361
361
  }
362
- var AVAILABLE_MODELS, DATE_SUFFIX_REGEX, SMALL_COST_MULTIPLIER, MEDIUM_COST_MULTIPLIER, PREMIUM_COST_MULTIPLIER, SMALL_COST_LABEL, MEDIUM_COST_LABEL, PREMIUM_COST_LABEL, MODEL_TIERS, CONTEXT_WINDOWS, util, objectUtil, ZodParsedType, getParsedType, ZodIssueCode, ZodError, errorMap, overrideErrorMap, makeIssue, ParseStatus, INVALID, DIRTY, OK, isAborted, isDirty, isValid, isAsync, errorUtil, ParseInputLazyPath, handleResult, ZodType, cuidRegex, cuid2Regex, ulidRegex, uuidRegex, nanoidRegex, jwtRegex, durationRegex, emailRegex, _emojiRegex, emojiRegex, ipv4Regex, ipv4CidrRegex, ipv6Regex, ipv6CidrRegex, base64Regex, base64urlRegex, dateRegexSource, dateRegex, ZodString, ZodNumber, ZodBigInt, ZodBoolean, ZodDate, ZodSymbol, ZodUndefined, ZodNull, ZodAny, ZodUnknown, ZodNever, ZodVoid, ZodArray, ZodObject, ZodUnion, getDiscriminator, ZodDiscriminatedUnion, ZodIntersection, ZodTuple, ZodRecord, ZodMap, ZodSet, ZodFunction, ZodLazy, ZodLiteral, ZodEnum, ZodNativeEnum, ZodPromise, ZodEffects, ZodOptional, ZodNullable, ZodDefault, ZodCatch, ZodNaN, ZodBranded, ZodPipeline, ZodReadonly, ZodFirstPartyTypeKind, stringType, numberType, booleanType, dateType, unknownType, arrayType, objectType, unionType, discriminatedUnionType, recordType, functionType, lazyType, literalType, enumType, promiseType, coerce, MAX_API_KEY_NAME_LENGTH, apiKeySchema, apiKeyUsageSchema, createApiKeyRequestSchema, apiKeyResponseSchema, apiKeyUsageSummarySchema, genericErrorSchema, validationErrorSchema, feedbackCategorySchema, FEEDBACK_CATEGORIES, createFeedbackSchema, feedbackResponseSchema, listFeedbackQuerySchema, feedbackListResponseSchema, healthMetricSchema, healthMetricDailyItemSchema, healthMetricsWithDailySchema, healthAnalyticsPeriodSchema, healthAnalyticsDailyItemSchema, healthAnalyticsResponseSchema, MAX_TIMEZONE_CHAR_LENGTH, organizationSchema, organizationSettingsSchema, textBlockSchema, toolUseBlockSchema, toolResultBlockSchema, thinkingBlockSchema, imageBlockSchema, contentBlockSchema, sessionSchema, createSessionRequestSchema, updateSessionRequestSchema, messageSchema, createMessageRequestSchema, cliEventSchema, createCLISessionRequestSchema, queryResultSchema, queryTurnSchema, queryContentSchema, queryUsageSchema, querySchema, runStatusSchema, testResultStatusSchema, testOutcomeSchema, attachmentKindSchema, stepCategorySchema, runSummarySchema, ciMetadataSchema, gitMetadataSchema, playwrightConfigSchema, errorInfoSchema, locationSchema, sourceSnippetSchema, runSchema, annotationSchema, testSchema, testResultSchema, baseStepSchema, stepSchema, attachmentSchema, listRunsQuerySchema, listTestsQuerySchema, runsListResponseSchema, runDetailResponseSchema, coverageTestItemSchema, secondaryTagMetricSchema, tagCoverageSchema, coverageStatsSchema, coverageAlertSchema, coverageDashboardResponseSchema, coverageDashboardQuerySchema, testsListResponseSchema, testDetailResponseSchema, testHistoryItemSchema, testHistoryResponseSchema, visualComparisonScreenshotSchema, visualComparisonRunSchema, visualComparisonMatchedStepSchema, visualComparisonResponseSchema, topOffenderSchema, topOffendersResponseSchema, trendPointSchema, trendsResponseSchema, errorCategorySchema, failureClusterSchema, newFailureSchema, runInsightsResponseSchema, FailureCategoryEnum, SelectorTypeEnum, FailureCategoryStatsSchema, FailureCategoriesResponseSchema, FailingSelectorStatsSchema, FailingSelectorsResponseSchema, newFailureItemSchema, newFailuresResponseSchema, flakyTestItemSchema, flakyTestsResponseSchema, slowestTestItemSchema, slowestTestsResponseSchema, runSummaryEmailFailureSchema, runSummaryEmailReportSchema, sendRunReportRequestSchema, metricWithTrendSchema, weekOverWeekMetricsSchema, ciComputeTimeSchema, investigationCandidateSchema, failureCategoryBreakdownSchema, stabilityTrendSchema, folderStabilitySchema, managerReportSchema, managerReportQuerySchema, sendManagerReportRequestSchema, reportAttachmentLinkSchema, developerReportRegressionSchema, developerReportFlakyTestSchema, developerReportSlowTestSchema, developerRunSummaryReportSchema, executiveReportStatusSchema, executiveMetricSchema, executiveKeyMetricsSchema, executiveTrendPointSchema, executiveTrendsSchema, executiveFlakyOffenderSchema, executiveSlowestOffenderSchema, executiveTopOffendersSchema, executiveReportSchema, executiveReportQuerySchema, sendExecutiveReportRequestSchema, assigneeInfoSchema, assigneesListResponseSchema, testCatalogPrioritySchema, testCatalogTypeSchema, testCatalogAssignmentStatusSchema, testCatalogAssignmentSchema, testCatalogDefinitionSchema, testCatalogListItemSchema, testCatalogHistoryEntrySchema, testCatalogListQuerySchema, testCatalogListResponseSchema, testCatalogDetailResponseSchema, testCatalogFilterOptionsSchema, testCatalogAssigneeInfoSchema, testCatalogAssignRequestSchema, testCatalogUpdateAssignmentRequestSchema, testCatalogAssignmentResponseSchema, testCatalogFolderNodeSchema, testCatalogFolderTreeResponseSchema, testCatalogFolderTestsQuerySchema, SECONDS_PER_MINUTE, SECONDS_PER_HOUR, SECONDS_PER_DAY, DAYS_PER_WEEK, SECONDS_PER_WEEK, DAYS_PER_MONTH, SECONDS_PER_MONTH, DAYS_PER_YEAR, SECONDS_PER_YEAR;
362
+ var AVAILABLE_MODELS, DATE_SUFFIX_REGEX, SMALL_COST_MULTIPLIER, MEDIUM_COST_MULTIPLIER, PREMIUM_COST_MULTIPLIER, SMALL_COST_LABEL, MEDIUM_COST_LABEL, PREMIUM_COST_LABEL, MODEL_TIERS, CONTEXT_WINDOWS, util, objectUtil, ZodParsedType, getParsedType, ZodIssueCode, ZodError, errorMap, overrideErrorMap, makeIssue, ParseStatus, INVALID, DIRTY, OK, isAborted, isDirty, isValid, isAsync, errorUtil, ParseInputLazyPath, handleResult, ZodType, cuidRegex, cuid2Regex, ulidRegex, uuidRegex, nanoidRegex, jwtRegex, durationRegex, emailRegex, _emojiRegex, emojiRegex, ipv4Regex, ipv4CidrRegex, ipv6Regex, ipv6CidrRegex, base64Regex, base64urlRegex, dateRegexSource, dateRegex, ZodString, ZodNumber, ZodBigInt, ZodBoolean, ZodDate, ZodSymbol, ZodUndefined, ZodNull, ZodAny, ZodUnknown, ZodNever, ZodVoid, ZodArray, ZodObject, ZodUnion, getDiscriminator, ZodDiscriminatedUnion, ZodIntersection, ZodTuple, ZodRecord, ZodMap, ZodSet, ZodFunction, ZodLazy, ZodLiteral, ZodEnum, ZodNativeEnum, ZodPromise, ZodEffects, ZodOptional, ZodNullable, ZodDefault, ZodCatch, ZodNaN, ZodBranded, ZodPipeline, ZodReadonly, ZodFirstPartyTypeKind, stringType, numberType, booleanType, dateType, unknownType, arrayType, objectType, unionType, discriminatedUnionType, recordType, functionType, lazyType, literalType, enumType, promiseType, coerce, MAX_API_KEY_NAME_LENGTH, apiKeySchema, apiKeyUsageSchema, createApiKeyRequestSchema, apiKeyResponseSchema, apiKeyUsageSummarySchema, genericErrorSchema, validationErrorSchema, feedbackCategorySchema, FEEDBACK_CATEGORIES, createFeedbackSchema, feedbackResponseSchema, listFeedbackQuerySchema, feedbackListResponseSchema, healthMetricSchema, healthMetricDailyItemSchema, healthMetricsWithDailySchema, healthAnalyticsPeriodSchema, healthAnalyticsDailyItemSchema, healthAnalyticsResponseSchema, MAX_TIMEZONE_CHAR_LENGTH, organizationSchema, organizationSettingsSchema, adminOrganizationSchema, adminOrganizationListSchema, updateAdminOrganizationRequestSchema, textBlockSchema, toolUseBlockSchema, toolResultBlockSchema, thinkingBlockSchema, imageBlockSchema, contentBlockSchema, sessionSchema, createSessionRequestSchema, updateSessionRequestSchema, messageSchema, createMessageRequestSchema, cliEventSchema, createCLISessionRequestSchema, queryResultSchema, queryTurnSchema, queryContentSchema, queryUsageSchema, querySchema, runStatusSchema, testResultStatusSchema, testOutcomeSchema, attachmentKindSchema, stepCategorySchema, runSummarySchema, ciMetadataSchema, gitMetadataSchema, playwrightConfigSchema, errorInfoSchema, locationSchema, sourceSnippetSchema, runSourceSchema, runSchema, annotationSchema, testSchema, testResultSchema, baseStepSchema, stepSchema, attachmentSchema, listRunsQuerySchema, listTestsQuerySchema, runsListResponseSchema, runDetailResponseSchema, coverageTestItemSchema, secondaryTagMetricSchema, tagCoverageSchema, coverageStatsSchema, coverageAlertSchema, coverageDashboardResponseSchema, coverageDashboardQuerySchema, testsListResponseSchema, testDetailResponseSchema, testHistoryItemSchema, testHistoryResponseSchema, visualComparisonScreenshotSchema, visualComparisonRunSchema, visualComparisonMatchedStepSchema, visualComparisonResponseSchema, topOffenderSchema, topOffendersResponseSchema, trendPointSchema, trendsResponseSchema, errorCategorySchema, failureClusterSchema, newFailureSchema, runInsightsResponseSchema, FailureCategoryEnum, SelectorTypeEnum, FailureCategoryStatsSchema, FailureCategoriesResponseSchema, FailingSelectorStatsSchema, FailingSelectorsResponseSchema, newFailureItemSchema, newFailuresResponseSchema, flakyTestItemSchema, flakyTestsResponseSchema, slowestTestItemSchema, slowestTestsResponseSchema, runSummaryEmailFailureSchema, runSummaryEmailReportSchema, sendRunReportRequestSchema, metricWithTrendSchema, weekOverWeekMetricsSchema, ciComputeTimeSchema, investigationCandidateSchema, failureCategoryBreakdownSchema, stabilityTrendSchema, folderStabilitySchema, managerReportSchema, managerReportQuerySchema, sendManagerReportRequestSchema, reportAttachmentLinkSchema, developerReportRegressionSchema, developerReportFlakyTestSchema, developerReportSlowTestSchema, developerRunSummaryReportSchema, executiveReportStatusSchema, executiveMetricSchema, executiveKeyMetricsSchema, executiveTrendPointSchema, executiveTrendsSchema, executiveFlakyOffenderSchema, executiveSlowestOffenderSchema, executiveTopOffendersSchema, executiveReportSchema, executiveReportQuerySchema, sendExecutiveReportRequestSchema, manualTestCaseSchema, createManualRunRequestSchema, manualTestResultSchema, recordManualResultsRequestSchema, recordSingleManualResultRequestSchema, assigneeInfoSchema, assigneesListResponseSchema, testCatalogPrioritySchema, testCatalogTypeSchema, testCatalogAssignmentStatusSchema, testCatalogAssignmentSchema, testCatalogDefinitionSchema, testCatalogListItemSchema, testCatalogHistoryEntrySchema, testCatalogListQuerySchema, testCatalogListResponseSchema, testCatalogDetailResponseSchema, testCatalogFilterOptionsSchema, testCatalogAssigneeInfoSchema, testCatalogAssignRequestSchema, testCatalogUpdateAssignmentRequestSchema, testCatalogAssignmentResponseSchema, testCatalogFolderNodeSchema, testCatalogFolderTreeResponseSchema, testCatalogFolderTestsQuerySchema, SECONDS_PER_MINUTE, SECONDS_PER_HOUR, SECONDS_PER_DAY, DAYS_PER_WEEK, SECONDS_PER_WEEK, DAYS_PER_MONTH, SECONDS_PER_MONTH, DAYS_PER_YEAR, SECONDS_PER_YEAR;
363
363
  var init_shared_es = __esm({
364
364
  "../shared/dist/shared.es.mjs"() {
365
365
  "use strict";
@@ -4263,6 +4263,22 @@ var init_shared_es = __esm({
4263
4263
  timezone: stringType().max(MAX_TIMEZONE_CHAR_LENGTH, "Timezone must be less than 100 characters").nullable().optional(),
4264
4264
  monthlyTokenLimit: numberType().int().positive().optional()
4265
4265
  });
4266
+ adminOrganizationSchema = objectType({
4267
+ id: stringType().uuid(),
4268
+ clerkOrgId: stringType(),
4269
+ name: stringType(),
4270
+ timezone: stringType().nullable(),
4271
+ monthlyTokenLimit: numberType().int().positive(),
4272
+ createdAt: stringType(),
4273
+ updatedAt: stringType()
4274
+ });
4275
+ adminOrganizationListSchema = objectType({
4276
+ items: arrayType(adminOrganizationSchema),
4277
+ total: numberType().int()
4278
+ });
4279
+ updateAdminOrganizationRequestSchema = objectType({
4280
+ monthlyTokenLimit: numberType().int().positive()
4281
+ });
4266
4282
  textBlockSchema = objectType({
4267
4283
  type: literalType("text"),
4268
4284
  text: stringType()
@@ -4464,7 +4480,8 @@ var init_shared_es = __esm({
4464
4480
  "expected",
4465
4481
  "unexpected",
4466
4482
  "flaky",
4467
- "skipped"
4483
+ "skipped",
4484
+ "manual-pending"
4468
4485
  ]);
4469
4486
  attachmentKindSchema = enumType([
4470
4487
  "video",
@@ -4489,6 +4506,7 @@ var init_shared_es = __esm({
4489
4506
  failed: numberType(),
4490
4507
  flaky: numberType(),
4491
4508
  skipped: numberType(),
4509
+ manualPending: numberType().optional(),
4492
4510
  durationMs: numberType()
4493
4511
  });
4494
4512
  ciMetadataSchema = objectType({
@@ -4532,12 +4550,14 @@ var init_shared_es = __esm({
4532
4550
  highlightLine: numberType(),
4533
4551
  language: stringType()
4534
4552
  });
4553
+ runSourceSchema = enumType(["reporter", "manual", "manual-single"]);
4535
4554
  runSchema = objectType({
4536
4555
  id: stringType(),
4537
4556
  readableId: stringType().optional(),
4538
4557
  // e.g., "RUN-123"
4539
4558
  projectId: stringType(),
4540
4559
  status: runStatusSchema,
4560
+ source: runSourceSchema.optional().default("reporter"),
4541
4561
  summary: runSummarySchema,
4542
4562
  durationMs: numberType(),
4543
4563
  ci: ciMetadataSchema.optional(),
@@ -4572,6 +4592,7 @@ var init_shared_es = __esm({
4572
4592
  // e.g., "chromium", "firefox", "Mobile Safari"
4573
4593
  // Denormalized for list views
4574
4594
  status: testResultStatusSchema,
4595
+ outcome: testOutcomeSchema.optional(),
4575
4596
  durationMs: numberType(),
4576
4597
  retryCount: numberType(),
4577
4598
  isFlaky: booleanType().optional()
@@ -4644,8 +4665,10 @@ var init_shared_es = __esm({
4644
4665
  // Will validate against testCatalogTypeSchema in backend
4645
4666
  tags: stringType().optional(),
4646
4667
  // Comma-separated custom tags
4647
- testRunIds: stringType().optional()
4668
+ testRunIds: stringType().optional(),
4648
4669
  // Comma-separated test_run UUIDs for error pattern filtering
4670
+ isManualPending: coerce.boolean().optional()
4671
+ // Filter for manual-pending outcome
4649
4672
  });
4650
4673
  runsListResponseSchema = objectType({
4651
4674
  runs: arrayType(runSchema),
@@ -5206,6 +5229,36 @@ var init_shared_es = __esm({
5206
5229
  month: stringType().regex(/^\d{4}-\d{2}$/, "month must be in format YYYY-MM"),
5207
5230
  emails: arrayType(stringType().email())
5208
5231
  });
5232
+ manualTestCaseSchema = objectType({
5233
+ title: stringType().min(1),
5234
+ titlePath: arrayType(stringType()).optional(),
5235
+ file: stringType().optional(),
5236
+ tags: arrayType(stringType()).optional(),
5237
+ notes: stringType().optional(),
5238
+ existingTestId: stringType().optional()
5239
+ // If set, use this testId instead of computing a hash
5240
+ });
5241
+ createManualRunRequestSchema = objectType({
5242
+ projectId: stringType().min(1),
5243
+ name: stringType().min(1).optional(),
5244
+ tests: arrayType(manualTestCaseSchema).min(1),
5245
+ environment: stringType().optional(),
5246
+ notes: stringType().optional()
5247
+ });
5248
+ manualTestResultSchema = objectType({
5249
+ testRunId: stringType().uuid(),
5250
+ status: enumType(["passed", "failed", "skipped"]),
5251
+ notes: stringType().optional(),
5252
+ durationMs: numberType().int().min(0).optional()
5253
+ });
5254
+ recordManualResultsRequestSchema = objectType({
5255
+ results: arrayType(manualTestResultSchema).min(1)
5256
+ });
5257
+ recordSingleManualResultRequestSchema = objectType({
5258
+ status: enumType(["passed", "failed", "skipped"]),
5259
+ notes: stringType().optional(),
5260
+ durationMs: numberType().int().min(0).optional()
5261
+ });
5209
5262
  assigneeInfoSchema = objectType({
5210
5263
  id: stringType(),
5211
5264
  name: stringType(),
@@ -5258,6 +5311,7 @@ var init_shared_es = __esm({
5258
5311
  testType: testCatalogTypeSchema.nullable(),
5259
5312
  isSlow: booleanType(),
5260
5313
  isFlakyTagged: booleanType(),
5314
+ isManual: booleanType(),
5261
5315
  // Raw data
5262
5316
  tags: arrayType(stringType()).nullable(),
5263
5317
  customMetadata: recordType(stringType()).nullable(),
@@ -5284,6 +5338,7 @@ var init_shared_es = __esm({
5284
5338
  testId: stringType(),
5285
5339
  file: stringType(),
5286
5340
  title: stringType(),
5341
+ titlePath: arrayType(stringType()).optional(),
5287
5342
  projectName: stringType().nullable(),
5288
5343
  // Key metadata
5289
5344
  owner: stringType().nullable(),
@@ -5291,6 +5346,8 @@ var init_shared_es = __esm({
5291
5346
  feature: stringType().nullable(),
5292
5347
  isSlow: booleanType(),
5293
5348
  isFlakyTagged: booleanType(),
5349
+ isManual: booleanType(),
5350
+ tags: arrayType(stringType()).nullable().optional(),
5294
5351
  // Stats
5295
5352
  totalRuns: numberType(),
5296
5353
  passRate: numberType().nullable(),
@@ -5318,6 +5375,7 @@ var init_shared_es = __esm({
5318
5375
  feature: stringType().optional(),
5319
5376
  priority: testCatalogPrioritySchema.optional(),
5320
5377
  search: stringType().optional(),
5378
+ isManual: coerce.boolean().optional(),
5321
5379
  sortBy: enumType([
5322
5380
  "lastRunAt",
5323
5381
  "passRate",
@@ -5626,7 +5684,7 @@ var CLI_VERSION;
5626
5684
  var init_version = __esm({
5627
5685
  "src/version.ts"() {
5628
5686
  "use strict";
5629
- CLI_VERSION = "0.0.52";
5687
+ CLI_VERSION = "0.0.53";
5630
5688
  }
5631
5689
  });
5632
5690
 
@@ -7377,7 +7435,7 @@ ${projectInstructions}`,
7377
7435
  const fs4 = await import("fs/promises");
7378
7436
  let claudeCodePath;
7379
7437
  const require2 = createRequire(import.meta.url);
7380
- const sdkPath = require2.resolve("@anthropic-ai/claude-agent-sdk/sdk.mjs");
7438
+ const sdkPath = require2.resolve("@anthropic-ai/claude-agent-sdk");
7381
7439
  claudeCodePath = join7(dirname(sdkPath), "cli.js");
7382
7440
  this.presenter.onLog(`Using SDK CLI: ${claudeCodePath}`);
7383
7441
  if (config.claudeCodeExecutablePath) {
@@ -9627,16 +9685,37 @@ var init_test_tagging = __esm({
9627
9685
  testTaggingBlock = `<test_tagging>
9628
9686
  **IMPORTANT**: Before completing any fix or writing a new test, check if the test has metadata tags. If tags are missing, add them.
9629
9687
 
9630
- Required tags: @feature:name, @priority:critical|high|medium|low, @test_type:smoke|e2e|regression|integration|unit
9631
- Optional: @owner:email, @ticket:PROJ-123, @slow, @flaky, @key:value
9688
+ Required tags for ALL tests:
9689
+ - @id:UNIQUE-ID \u2014 Stable identity for history tracking. Generate a short memorable ID based on the feature and test purpose (e.g. AUTH-LOGIN-001, CART-ADD-001). REQUIRED for every test \u2014 without it, renaming or moving a test loses its entire run history.
9690
+ - @feature:name \u2014 Feature area or module this test covers
9691
+ - @priority:critical|high|medium|low \u2014 Test importance
9692
+ - @test_type:smoke|e2e|regression|integration|unit \u2014 Classification
9693
+
9694
+ Optional: @owner:email, @ticket:PROJ-123, @slow, @flaky, @manual, @key:value
9632
9695
 
9633
9696
  **Playwright** \u2014 ALWAYS use the native tag property (even if existing tests use title-based tags):
9634
- test("User can login", { tag: ['@feature:auth', '@priority:high', '@test_type:e2e'] }, async ({ page }) => { });
9697
+ test("User can login", { tag: ['@id:AUTH-LOGIN-001', '@feature:auth', '@priority:high', '@test_type:e2e'] }, async ({ page }) => { });
9635
9698
 
9636
9699
  **WebdriverIO/Other** \u2014 Append tags to the test title:
9637
- it("User can login (@feature:auth @priority:high @test_type:e2e)", async () => { });
9700
+ it("User can login (@id:AUTH-LOGIN-001 @feature:auth @priority:high @test_type:e2e)", async () => { });
9701
+
9702
+ **Existing tests without @id** \u2014 When fixing or modifying a test that has no @id tag, add one. Generate the ID from the feature + a short description, e.g. @id:CHECKOUT-SUBMIT-001.
9703
+
9704
+ **Manual test cases** \u2014 Use the @manual tag to mark tests that require human execution. For manual tests, write an empty shell that is skipped so it appears in the test catalog without running automatically:
9638
9705
 
9639
- A test is not complete until it has proper tags.
9706
+ Playwright:
9707
+ test("Verify checkout flow on mobile device", { tag: ['@id:CHECKOUT-MOBILE-001', '@manual', '@feature:checkout', '@priority:high'] }, async () => {
9708
+ test.skip(true, 'Manual test \u2014 requires human execution');
9709
+ });
9710
+
9711
+ WebdriverIO/Other:
9712
+ it("Verify checkout flow on mobile device (@id:CHECKOUT-MOBILE-001 @manual @feature:checkout @priority:high)", async () => {
9713
+ pending('Manual test \u2014 requires human execution');
9714
+ });
9715
+
9716
+ Manual tests show up in the Supatest dashboard as "Manual" and their results can be recorded through the platform UI.
9717
+
9718
+ A test is not complete until it has @id plus the other required tags.
9640
9719
  </test_tagging>`;
9641
9720
  }
9642
9721
  });
@@ -9726,7 +9805,7 @@ For each failing test:
9726
9805
  2. **Categorize** \u2014 Identify root cause: selector, timing, state, data, logic, or app bug
9727
9806
  3. **Investigate** \u2014 Read the failing test and relevant source code
9728
9807
  4. **Fix** \u2014 Make minimal, targeted changes. CRITICAL: Fix the implementation or test logic, NOT the assertions. Don't weaken assertions or skip tests.
9729
- 5. **Add Tags** \u2014 After fixing, check if the test has metadata tags. If tags are missing, add them: \`test("name", { tag: ['@feature:...', '@priority:...', '@test_type:...'] }, ...)\`
9808
+ 5. **Add Tags** \u2014 After fixing, open the test file (not just the page object or helper you modified) and check if the failing test has metadata tags. Required tags: \`@id:UNIQUE-ID\`, \`@feature:...\`, \`@priority:...\`, \`@test_type:...\`. If any are missing, add all four: \`test("name", { tag: ['@id:FEATURE-DESC-001', '@feature:...', '@priority:...', '@test_type:...'] }, ...)\`. This step is mandatory even when the fix was in a page object, fixture, or helper \u2014 always check the test file itself.
9730
9809
  6. **Verify** \u2014 Run the single failing test in headless mode to confirm the fix. If a process hangs, kill it and check for interactive flags.
9731
9810
  7. **Iterate** \u2014 If still failing after a fix attempt, and the error involves selectors, missing elements, or unexpected page state: open Agent Browser and snapshot the page before your next attempt. Max 3 attempts per test.
9732
9811
 
@@ -17415,6 +17494,8 @@ Make sure the file exists and is a valid image (png, jpg, gif, webp, bmp, svg).`
17415
17494
  }
17416
17495
  if (key.ctrl && key.name === "o") {
17417
17496
  toggleToolGroups();
17497
+ clearTerminalViewportAndScrollback();
17498
+ refreshStatic();
17418
17499
  }
17419
17500
  },
17420
17501
  { isActive: !isOverlayOpen }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supatest/cli",
3
- "version": "0.0.52",
3
+ "version": "0.0.53",
4
4
  "description": "Supatest CLI - AI-powered task automation for CI/CD",
5
5
  "type": "module",
6
6
  "bin": {
@@ -38,8 +38,8 @@
38
38
  "access": "public"
39
39
  },
40
40
  "dependencies": {
41
- "@anthropic-ai/claude-agent-sdk": "^0.2.39",
42
- "@anthropic-ai/sdk": "^0.71.2",
41
+ "@anthropic-ai/claude-agent-sdk": "^0.2.72",
42
+ "@anthropic-ai/sdk": "^0.78.0",
43
43
  "@modelcontextprotocol/sdk": "^1.0.4",
44
44
  "@types/inquirer": "^9.0.0",
45
45
  "ansi-escapes": "^7.0.0",