@runcofactor/cli 0.10.0 → 0.13.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.
Files changed (148) hide show
  1. package/dist/{api-catalog-GFGCLVS4.js → api-catalog-7HLEN7C2.js} +5 -4
  2. package/dist/{api-catalog-GFGCLVS4.js.map → api-catalog-7HLEN7C2.js.map} +1 -1
  3. package/dist/{attachment-SJC7D7FY.js → attachment-OVNQD6Z2.js} +5 -4
  4. package/dist/{attachment-SJC7D7FY.js.map → attachment-OVNQD6Z2.js.map} +1 -1
  5. package/dist/{auth-EN6NQCJY.js → auth-VUHL74FH.js} +3 -2
  6. package/dist/{chunk-IMPZAX6L.js → chunk-5GD47G2D.js} +37 -1
  7. package/dist/{chunk-IMPZAX6L.js.map → chunk-5GD47G2D.js.map} +1 -1
  8. package/dist/{chunk-WOHL4FTB.js → chunk-CQE46HSM.js} +5 -5
  9. package/dist/chunk-CQE46HSM.js.map +1 -0
  10. package/dist/{chunk-52IO7ACJ.js → chunk-CRHPDPRS.js} +39 -3
  11. package/dist/{chunk-52IO7ACJ.js.map → chunk-CRHPDPRS.js.map} +1 -1
  12. package/dist/{chunk-XQXVG7RA.js → chunk-EEN2TZUQ.js} +3 -3
  13. package/dist/{chunk-I4QLI3JO.js → chunk-EJ4U242G.js} +2 -2
  14. package/dist/{chunk-CLAWT7BJ.js → chunk-ENDHMYEJ.js} +3 -3
  15. package/dist/chunk-G4UYGRZR.js +2 -0
  16. package/dist/chunk-JZMJUPZP.js +92 -0
  17. package/dist/chunk-JZMJUPZP.js.map +1 -0
  18. package/dist/{chunk-GKY2KXO5.js → chunk-NL7CVG56.js} +105 -35
  19. package/dist/chunk-NL7CVG56.js.map +1 -0
  20. package/dist/{chunk-A4OFTUVV.js → chunk-PZ4LCN6K.js} +7 -4
  21. package/dist/chunk-PZ4LCN6K.js.map +1 -0
  22. package/dist/{chunk-SJJW77WN.js → chunk-QGI4UCJX.js} +69 -5
  23. package/dist/chunk-QGI4UCJX.js.map +1 -0
  24. package/dist/{chunk-4PNOV7OV.js → chunk-QQVWGWPI.js} +1023 -150
  25. package/dist/chunk-QQVWGWPI.js.map +1 -0
  26. package/dist/{chunk-N7HFALX3.js → chunk-VGTKUOYS.js} +2 -2
  27. package/dist/{chunk-B2VISN2V.js → chunk-YN763NWQ.js} +230 -66
  28. package/dist/chunk-YN763NWQ.js.map +1 -0
  29. package/dist/{chunk-QFDOWABX.js → chunk-Z5LUTUDN.js} +6 -3
  30. package/dist/chunk-Z5LUTUDN.js.map +1 -0
  31. package/dist/{chunk-Q4BO4Z5V.js → chunk-ZTOE3ND3.js} +4 -4
  32. package/dist/{credential-COLTBV6D.js → credential-LO2SEEHU.js} +24 -20
  33. package/dist/credential-LO2SEEHU.js.map +1 -0
  34. package/dist/{credential-template-EEPYFG7R.js → credential-template-ZN7W7734.js} +30 -28
  35. package/dist/credential-template-ZN7W7734.js.map +1 -0
  36. package/dist/{debug-workflow-KOVH5GOP.js → debug-workflow-R3RYYAXK.js} +5 -4
  37. package/dist/{debug-workflow-KOVH5GOP.js.map → debug-workflow-R3RYYAXK.js.map} +1 -1
  38. package/dist/{docs-3SSORHB5.js → docs-DIAFBDXQ.js} +5 -4
  39. package/dist/{docs-3SSORHB5.js.map → docs-DIAFBDXQ.js.map} +1 -1
  40. package/dist/{doctor-OTSIWV6G.js → doctor-NZPUSCRE.js} +9 -5
  41. package/dist/doctor-NZPUSCRE.js.map +1 -0
  42. package/dist/environment-RQVU4P5M.js +221 -0
  43. package/dist/environment-RQVU4P5M.js.map +1 -0
  44. package/dist/{feature-flag-T2LRZME3.js → feature-flag-XG26RURR.js} +72 -10
  45. package/dist/feature-flag-XG26RURR.js.map +1 -0
  46. package/dist/index.js +57 -48
  47. package/dist/index.js.map +1 -1
  48. package/dist/{init-TGWRECT2.js → init-EDNLKGPT.js} +5 -4
  49. package/dist/{init-TGWRECT2.js.map → init-EDNLKGPT.js.map} +1 -1
  50. package/dist/{install-DXSNWZKO.js → install-FYZ3HNZK.js} +7 -7
  51. package/dist/{issues-XIZOPX6T.js → issues-NNRVTJ4L.js} +5 -4
  52. package/dist/{issues-XIZOPX6T.js.map → issues-NNRVTJ4L.js.map} +1 -1
  53. package/dist/{knobs-NBINZIUB.js → knobs-A2BOBH22.js} +5 -4
  54. package/dist/{knobs-NBINZIUB.js.map → knobs-A2BOBH22.js.map} +1 -1
  55. package/dist/{list-3TDHK637.js → list-F33VZ4BJ.js} +5 -4
  56. package/dist/{list-3TDHK637.js.map → list-F33VZ4BJ.js.map} +1 -1
  57. package/dist/{local-HICVD6PU.js → local-DQDTM3XA.js} +7 -6
  58. package/dist/{local-HICVD6PU.js.map → local-DQDTM3XA.js.map} +1 -1
  59. package/dist/{login-UOIUXVUK.js → login-BUMVIB36.js} +5 -4
  60. package/dist/{login-UOIUXVUK.js.map → login-BUMVIB36.js.map} +1 -1
  61. package/dist/{mcp-54IJEOUA.js → mcp-B5Y5CDMQ.js} +23 -24
  62. package/dist/mcp-B5Y5CDMQ.js.map +1 -0
  63. package/dist/{property-UXLOLPTD.js → property-NJ4SRXQG.js} +76 -4
  64. package/dist/property-NJ4SRXQG.js.map +1 -0
  65. package/dist/{psql-BYUUNLGG.js → psql-VBZFCMNR.js} +3 -2
  66. package/dist/{psql-BYUUNLGG.js.map → psql-VBZFCMNR.js.map} +1 -1
  67. package/dist/{record-4TR2UIIS.js → record-WAO36O7G.js} +16 -17
  68. package/dist/record-WAO36O7G.js.map +1 -0
  69. package/dist/{redis-35VBUYW7.js → redis-DHZXHL4S.js} +3 -2
  70. package/dist/{redis-35VBUYW7.js.map → redis-DHZXHL4S.js.map} +1 -1
  71. package/dist/{release-OOLTUBUT.js → release-STJKUKTE.js} +5 -4
  72. package/dist/{release-OOLTUBUT.js.map → release-STJKUKTE.js.map} +1 -1
  73. package/dist/{sandbox-XGSUU6G7.js → sandbox-DWSGLY7B.js} +9 -8
  74. package/dist/{sandbox-XGSUU6G7.js.map → sandbox-DWSGLY7B.js.map} +1 -1
  75. package/dist/{scenarios-GWLJEGHA.js → scenarios-HCIDY725.js} +5 -4
  76. package/dist/{scenarios-GWLJEGHA.js.map → scenarios-HCIDY725.js.map} +1 -1
  77. package/dist/{session-MYFNZPRP.js → session-Y5RHU54D.js} +76 -8
  78. package/dist/session-Y5RHU54D.js.map +1 -0
  79. package/dist/{skill-KM34LDMO.js → skill-23WAHUOB.js} +217 -67
  80. package/dist/skill-23WAHUOB.js.map +1 -0
  81. package/dist/skills/debug-run/SKILL.md +33 -22
  82. package/dist/skills/debug-run/history/1.2.0.md +262 -0
  83. package/dist/skills/debug-run/history/1.3.0.md +273 -0
  84. package/dist/skills/debug-run/version.json +1 -1
  85. package/dist/skills/optimize-cache/SKILL.md +206 -0
  86. package/dist/{spec-RA3CFEKG.js → spec-LM5XHOQ5.js} +54 -25
  87. package/dist/spec-LM5XHOQ5.js.map +1 -0
  88. package/dist/{src-LB4HBTJQ.js → src-22RI5VP2.js} +19 -11
  89. package/dist/src-22RI5VP2.js.map +1 -0
  90. package/dist/src-BGDRMOKC.js +5748 -0
  91. package/dist/src-BGDRMOKC.js.map +1 -0
  92. package/dist/{src-N3TPKGTY.js → src-NCJPUAE6.js} +3 -2
  93. package/dist/{src-UVDX5UP6.js → src-Y3K7UJEF.js} +4 -2
  94. package/dist/{start-PSEQSQA3.js → start-SWY55CZX.js} +5 -4
  95. package/dist/{start-PSEQSQA3.js.map → start-SWY55CZX.js.map} +1 -1
  96. package/dist/{tag-YY6YAABQ.js → tag-YSU2XXPI.js} +6 -5
  97. package/dist/{task-IQC3YR5K.js → task-NLBKLD7D.js} +5 -4
  98. package/dist/{task-IQC3YR5K.js.map → task-NLBKLD7D.js.map} +1 -1
  99. package/dist/{test-suite-DZNJFXDW.js → test-suite-QCPWZ2LS.js} +9 -6
  100. package/dist/{test-suite-DZNJFXDW.js.map → test-suite-QCPWZ2LS.js.map} +1 -1
  101. package/dist/{trace-HXIW7U2D.js → trace-A3ZY6K26.js} +6 -4
  102. package/dist/{triage-ORG45R5W.js → triage-TT4BMDBU.js} +6 -5
  103. package/dist/triage-TT4BMDBU.js.map +1 -0
  104. package/dist/{upgrade-L2VYMP2V.js → upgrade-6ZUFETKX.js} +3 -3
  105. package/dist/{workflow-XYFH5LTP.js → workflow-2CX3ZNOQ.js} +241 -237
  106. package/dist/workflow-2CX3ZNOQ.js.map +1 -0
  107. package/dist/{workflow-cache-NQJQFWMV.js → workflow-cache-GXNE6SU2.js} +140 -7
  108. package/dist/workflow-cache-GXNE6SU2.js.map +1 -0
  109. package/dist/{workflow-debug-BGD4UIXU.js → workflow-debug-PRX3DWGD.js} +8 -7
  110. package/dist/{workflow-debug-BGD4UIXU.js.map → workflow-debug-PRX3DWGD.js.map} +1 -1
  111. package/dist/{workflow-proposals-MTUDX46O.js → workflow-proposals-BW327WGL.js} +5 -4
  112. package/dist/{workflow-proposals-MTUDX46O.js.map → workflow-proposals-BW327WGL.js.map} +1 -1
  113. package/package.json +2 -1
  114. package/dist/chunk-4PNOV7OV.js.map +0 -1
  115. package/dist/chunk-A4OFTUVV.js.map +0 -1
  116. package/dist/chunk-B2VISN2V.js.map +0 -1
  117. package/dist/chunk-GKY2KXO5.js.map +0 -1
  118. package/dist/chunk-JICSYFRJ.js +0 -46
  119. package/dist/chunk-JICSYFRJ.js.map +0 -1
  120. package/dist/chunk-QFDOWABX.js.map +0 -1
  121. package/dist/chunk-SJJW77WN.js.map +0 -1
  122. package/dist/chunk-WOHL4FTB.js.map +0 -1
  123. package/dist/credential-COLTBV6D.js.map +0 -1
  124. package/dist/credential-template-EEPYFG7R.js.map +0 -1
  125. package/dist/doctor-OTSIWV6G.js.map +0 -1
  126. package/dist/feature-flag-T2LRZME3.js.map +0 -1
  127. package/dist/mcp-54IJEOUA.js.map +0 -1
  128. package/dist/property-UXLOLPTD.js.map +0 -1
  129. package/dist/record-4TR2UIIS.js.map +0 -1
  130. package/dist/session-MYFNZPRP.js.map +0 -1
  131. package/dist/skill-KM34LDMO.js.map +0 -1
  132. package/dist/spec-RA3CFEKG.js.map +0 -1
  133. package/dist/src-LB4HBTJQ.js.map +0 -1
  134. package/dist/workflow-XYFH5LTP.js.map +0 -1
  135. package/dist/workflow-cache-NQJQFWMV.js.map +0 -1
  136. /package/dist/{auth-EN6NQCJY.js.map → auth-VUHL74FH.js.map} +0 -0
  137. /package/dist/{chunk-XQXVG7RA.js.map → chunk-EEN2TZUQ.js.map} +0 -0
  138. /package/dist/{chunk-I4QLI3JO.js.map → chunk-EJ4U242G.js.map} +0 -0
  139. /package/dist/{chunk-CLAWT7BJ.js.map → chunk-ENDHMYEJ.js.map} +0 -0
  140. /package/dist/{src-N3TPKGTY.js.map → chunk-G4UYGRZR.js.map} +0 -0
  141. /package/dist/{chunk-N7HFALX3.js.map → chunk-VGTKUOYS.js.map} +0 -0
  142. /package/dist/{chunk-Q4BO4Z5V.js.map → chunk-ZTOE3ND3.js.map} +0 -0
  143. /package/dist/{install-DXSNWZKO.js.map → install-FYZ3HNZK.js.map} +0 -0
  144. /package/dist/{src-UVDX5UP6.js.map → src-NCJPUAE6.js.map} +0 -0
  145. /package/dist/{tag-YY6YAABQ.js.map → src-Y3K7UJEF.js.map} +0 -0
  146. /package/dist/{trace-HXIW7U2D.js.map → tag-YSU2XXPI.js.map} +0 -0
  147. /package/dist/{triage-ORG45R5W.js.map → trace-A3ZY6K26.js.map} +0 -0
  148. /package/dist/{upgrade-L2VYMP2V.js.map → upgrade-6ZUFETKX.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/test-suite.ts"],"sourcesContent":["/**\n * CLI subcommand for querying and triggering test suite (workflow test execution) runs.\n *\n * @module TestSuiteCLI\n */\n\nimport process from 'node:process';\nimport { resolveConfig, getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\nimport { runRemoteTest } from './remote-test.js';\nimport { isTriageEnabledForExecution } from './triage.js';\n\n// ---------------------------------------------------------------------------\n// Types (matching API serializers in apps/api/src/workflows/routes/shared.ts)\n// ---------------------------------------------------------------------------\n\ntype Pagination = {\n page: number;\n pageSize: number;\n totalItems: number;\n totalPages: number;\n};\n\ntype TestExecutionSummary = {\n id: string;\n status: string;\n totalWorkflows: number;\n completedWorkflows: number;\n failedWorkflows: number;\n successfulWorkflows: number;\n skippedWorkflows: number;\n /** @deprecated Quarantine removed; always 0. Use degradedWorkflows. */\n quarantinedWorkflows: number;\n degradedWorkflows?: number;\n startedAt: string | null;\n finishedAt: string | null;\n createdAt: string;\n};\n\ntype TestExecution = TestExecutionSummary & {\n orgId: string;\n mode: string;\n triggeredByUserId: string | null;\n triggeredReason: string | null;\n errorMessage: string | null;\n updatedAt: string;\n};\n\ntype TestRunResult = {\n id: string;\n testRunId: string;\n workflowId: string;\n nodeId: string;\n status: string;\n message: string | null;\n issueId: string | null;\n metadata: Record<string, unknown> | null;\n createdAt: string;\n};\n\ntype TestRun = {\n id: string;\n executionId: string | null;\n workflowId: string;\n status: string;\n snapshotVersion: number;\n workflowRunId: string | null;\n triggeredByUserId: string | null;\n triggeredReason: string | null;\n linkedIssueId: string | null;\n isQuarantined: boolean;\n errorMessage: string | null;\n skipReason: string | null;\n startedAt: string | null;\n finishedAt: string | null;\n workflowName: string | null;\n results: TestRunResult[];\n};\n\ntype TestExecutionListResponse = {\n ok: boolean;\n error?: string;\n data: TestExecutionSummary[];\n pagination: Pagination;\n};\n\ntype TestExecutionDetailResponse = {\n ok: boolean;\n error?: string;\n execution: TestExecution;\n testRuns: TestRun[];\n};\n\ntype RunStep = {\n id: string;\n runId: string;\n nodeId: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n orderIndex: number;\n metadataJson: Record<string, unknown> | null;\n createdAt: string;\n};\n\ntype WorkflowRun = {\n id: string;\n workflowId: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n steps: RunStep[];\n};\n\ntype RunWithStepsResponse = {\n ok: boolean;\n error?: string;\n data: { run: WorkflowRun };\n};\n\ntype DiagnosticJson = {\n category?: string;\n confidence?: number;\n title?: string;\n analysis?: string;\n recommendation?: string;\n smokingGun?: { type: string; description: string; detail?: string } | null;\n};\n\ntype DiagnosticThought = {\n content: string;\n toolName: string | null;\n orderIndex: number;\n createdAt: string;\n};\n\ntype FailureDiagnosticResponse = {\n ok: boolean;\n error?: string;\n data: {\n id: string;\n status: string;\n diagnostic: DiagnosticJson | null;\n createdAt: string;\n updatedAt: string;\n thoughts?: DiagnosticThought[];\n } | null;\n};\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\nconst STATUS_ICONS: Record<string, string> = {\n completed: '✅',\n completed_with_errors: '⚠️',\n success: '✅',\n failed: '❌',\n running: '🔵',\n queued: '⏳',\n canceled: '🚫',\n timeout: '⏰',\n skipped: '⏭️',\n flaky_success: '🟡',\n pending: '⏳',\n};\n\nfunction statusIcon(status: string): string {\n return STATUS_ICONS[status] ?? '❓';\n}\n\nfunction formatRelative(iso: string | null): string {\n if (!iso) return '—';\n const diffMs = Date.now() - new Date(iso).getTime();\n if (diffMs < 0) return 'just now';\n const seconds = Math.floor(diffMs / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n\nfunction computeDuration(startedAt: string | null, finishedAt: string | null): string {\n if (!startedAt || !finishedAt) return '—';\n const ms = new Date(finishedAt).getTime() - new Date(startedAt).getTime();\n if (ms < 0) return '—';\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes < 60) return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n const remainMins = minutes % 60;\n return remainMins > 0 ? `${hours}h ${remainMins}m` : `${hours}h`;\n}\n\nfunction pad(str: string, len: number): string {\n return str.padEnd(len);\n}\n\n// ---------------------------------------------------------------------------\n// Handlers\n// ---------------------------------------------------------------------------\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, '--json');\n const page = getArgValue(argv, '--page') ?? '1';\n const pageSize = getArgValue(argv, '--page-size') ?? '20';\n\n const params = new URLSearchParams();\n params.set('page', page);\n params.set('pageSize', pageSize);\n params.set('sortBy', 'createdAt');\n params.set('sortOrder', 'desc');\n\n const result = await apiRequest<TestExecutionListResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/test-executions?${params}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const { data, pagination } = result;\n\n if (data.length === 0) {\n console.log('No test suites found.');\n return;\n }\n\n console.log(\n `Test Suites (page ${pagination.page}/${pagination.totalPages}, ${pagination.totalItems} total)\\n`\n );\n\n for (const exec of data) {\n const icon = statusIcon(exec.status);\n const total = String(exec.totalWorkflows).padStart(3);\n const passed = String(exec.successfulWorkflows).padStart(3);\n const failed = String(exec.failedWorkflows).padStart(3);\n const time = formatRelative(exec.createdAt);\n\n console.log(\n ` ${icon} ${exec.id} ${total} total ${passed} passed ${failed} failed ${time}`\n );\n }\n\n console.log('');\n}\n\nasync function handleGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv.find((a) => !a.startsWith('-'));\n if (!id) {\n console.error('Error: Missing execution ID. Usage: canary test-suite get <id>');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const failuresOnly = hasFlag(argv, '--failures-only');\n\n const result = await apiRequest<TestExecutionDetailResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/test-executions/${id}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const { execution, testRuns } = result;\n const duration = computeDuration(execution.startedAt, execution.finishedAt);\n\n console.log(`Test Suite: ${execution.id}`);\n console.log(`Status: ${statusIcon(execution.status)} ${execution.status}`);\n console.log(`Duration: ${duration}`);\n console.log(\n `Total: ${execution.totalWorkflows} | Passed: ${execution.successfulWorkflows} | Failed: ${execution.failedWorkflows} | Skipped: ${execution.skippedWorkflows} | Degraded: ${execution.degradedWorkflows ?? 0}`\n );\n console.log('');\n\n let runs = testRuns;\n if (failuresOnly) {\n runs = runs.filter((r) => r.status === 'failed');\n if (runs.length === 0) {\n console.log('No failing runs.');\n return;\n }\n }\n\n console.log('Runs:');\n for (const run of runs) {\n const icon = statusIcon(run.status);\n const name = run.workflowName ?? 'Unnamed';\n const dur = computeDuration(run.startedAt, run.finishedAt);\n const runId = run.workflowRunId ?? '—';\n\n console.log(` ${icon} ${pad(name, 30)} ${dur}`);\n console.log(` wf: ${run.workflowId} run: ${runId}`);\n\n if (run.errorMessage) {\n console.log(` Error: ${run.errorMessage}`);\n }\n if (run.skipReason) {\n console.log(` Skip reason: ${run.skipReason}`);\n }\n if (run.linkedIssueId) {\n console.log(` Linked issue: ${run.linkedIssueId}`);\n }\n }\n\n console.log('');\n\n if (execution.failedWorkflows > 0) {\n const triageEnabled = await isTriageEnabledForExecution(apiUrl, token, execution.id);\n if (triageEnabled) {\n console.log(`Triage: canary triage get ${execution.id}`);\n console.log('');\n }\n }\n}\n\nasync function handleDiagnostics(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n if (positional.length < 2) {\n console.error(\n 'Error: Missing arguments. Usage: canary test-suite diagnostics <workflowId> <runId>'\n );\n process.exit(1);\n }\n\n const [workflowId, runId] = positional;\n const jsonOutput = hasFlag(argv, '--json');\n const showThoughts = hasFlag(argv, '--thoughts');\n\n const result = await apiRequest<FailureDiagnosticResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs/${runId}/failure-diagnostic${\n showThoughts ? '?includeThoughts=true' : ''\n }`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (!result.data) {\n console.log('No diagnostic available for this run.');\n return;\n }\n\n const { status, diagnostic } = result.data;\n\n if (status === 'pending' || status === 'running') {\n console.log(`Diagnostic is still in progress (status: ${status}).`);\n return;\n }\n\n if (status === 'failed') {\n console.log('Diagnostic analysis failed.');\n return;\n }\n\n if (!diagnostic) {\n console.log('Diagnostic completed but no analysis data available.');\n return;\n }\n\n console.log('Failure Diagnostic');\n console.log(`Status: ${status}`);\n if (diagnostic.category) {\n const conf =\n diagnostic.confidence !== null && diagnostic.confidence !== undefined\n ? ` (${diagnostic.confidence > 1 ? Math.round(diagnostic.confidence) : Math.round(diagnostic.confidence * 100)}% confidence)`\n : '';\n console.log(`Category: ${diagnostic.category}${conf}`);\n }\n if (diagnostic.title) {\n console.log(`Title: ${diagnostic.title}`);\n }\n\n if (diagnostic.analysis) {\n console.log('');\n console.log('Analysis:');\n console.log(` ${diagnostic.analysis}`);\n }\n\n if (diagnostic.recommendation) {\n console.log('');\n console.log('Recommendation:');\n console.log(` ${diagnostic.recommendation}`);\n }\n\n if (diagnostic.smokingGun) {\n console.log('');\n console.log('Smoking Gun:');\n console.log(` > ${diagnostic.smokingGun.description}`);\n if (diagnostic.smokingGun.detail) {\n console.log(` ${diagnostic.smokingGun.detail}`);\n }\n }\n\n if (showThoughts) {\n const thoughts = result.data.thoughts ?? [];\n console.log('');\n console.log(`Agent reasoning (${thoughts.length} step${thoughts.length === 1 ? '' : 's'}):`);\n if (thoughts.length === 0) {\n console.log(' (no reasoning trace captured for this diagnostic)');\n } else {\n for (const t of thoughts) {\n const tool = t.toolName ? ` → ${t.toolName}()` : '';\n console.log(` [${t.orderIndex}]${tool}`);\n for (const line of t.content.split('\\n')) {\n console.log(` ${line}`);\n }\n }\n }\n }\n\n console.log('');\n}\n\nasync function handleSteps(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n if (positional.length < 2) {\n console.error('Error: Missing arguments. Usage: canary test-suite steps <workflowId> <runId>');\n process.exit(1);\n }\n\n const [workflowId, runId] = positional;\n const jsonOutput = hasFlag(argv, '--json');\n\n const result = await apiRequest<RunWithStepsResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs/${runId}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const { run } = result.data;\n const duration = computeDuration(run.startedAt, run.finishedAt);\n\n console.log(`Run: ${run.id} (${run.status})`);\n console.log(`Duration: ${duration}`);\n\n if (run.errorMessage) {\n console.log(`Error: ${run.errorMessage}`);\n }\n\n const steps = (run.steps ?? []).sort((a, b) => a.orderIndex - b.orderIndex);\n\n if (steps.length === 0) {\n console.log('\\nNo steps recorded.');\n return;\n }\n\n console.log(`\\nSteps (${steps.length}):`);\n for (const step of steps) {\n const idx = String(step.orderIndex + 1).padStart(2);\n const icon = statusIcon(step.status);\n const nodeId = step.nodeId.slice(0, 8);\n const dur = computeDuration(step.startedAt, step.finishedAt);\n\n console.log(` ${idx}. ${icon} ${pad(nodeId, 10)} ${dur}`);\n\n if (step.errorMessage) {\n console.log(` Error: ${step.errorMessage}`);\n }\n }\n\n console.log('');\n}\n\n// ---------------------------------------------------------------------------\n// Help\n// ---------------------------------------------------------------------------\n\nfunction printTestSuiteHelp(): void {\n console.log(\n [\n 'Usage: canary test-suite <sub-command> [options]',\n '',\n 'Sub-commands:',\n ' run [options] Trigger a test suite and stream results',\n ' list [options] List recent test suites',\n ' get <id> [options] Get test suite detail with runs',\n ' diagnostics <workflowId> <runId> Get failure diagnostic for a run (--thoughts for the agent reasoning trace)',\n ' steps <workflowId> <runId> Get workflow run steps',\n '',\n 'After a run, the suite id can be passed to triage commands:',\n ' canary triage wait <suiteId> Block until AI clusters failures (beta)',\n ' canary triage get <suiteId> Show clustered failures + suggested actions',\n ' canary triage get latest Resolves to the most recent suite',\n '',\n 'Run options:',\n ' --application <name|id> Target a specific application (alias: --property)',\n ' --environment <name|id> Target a specific environment',\n ' --tag <tag> Filter workflows by tag',\n ' --name-pattern <pat> Filter workflows by name pattern',\n ' --verbose, -v Show all SSE events',\n '',\n 'List options:',\n ' --page <n> Page number (default: 1)',\n ' --page-size <n> Page size (default: 20)',\n '',\n 'Get options:',\n ' --failures-only Show only failing test runs',\n '',\n 'Output options:',\n ' --json Output raw JSON',\n '',\n 'Common options:',\n ' --env <env> Target environment (prod, dev)',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n '',\n 'Examples:',\n ' canary test-suite run Run all workflow tests',\n ' canary test-suite run --tag smoke Run smoke-tagged workflows',\n ' canary test-suite run --application \"My App\" --environment staging',\n ' canary test-suite list List recent suite executions',\n ' canary test-suite get <id> --failures-only Show only failures',\n ].join('\\n')\n );\n}\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\nexport async function runTestSuite(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === 'help' || hasFlag(argv, '--help', '-h')) {\n printTestSuiteHelp();\n return;\n }\n\n if (subCommand === 'run') {\n // Delegate to runRemoteTest — pass through remaining args\n await runRemoteTest(rest);\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n switch (subCommand) {\n case 'list':\n await handleList(rest, apiUrl, token);\n break;\n case 'get':\n await handleGet(rest, apiUrl, token);\n break;\n case 'diagnostics':\n await handleDiagnostics(rest, apiUrl, token);\n break;\n case 'steps':\n await handleSteps(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printTestSuiteHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/test-suite.ts"],"sourcesContent":["/**\n * CLI subcommand for querying and triggering test suite (workflow test execution) runs.\n *\n * @module TestSuiteCLI\n */\n\nimport process from 'node:process';\nimport { resolveConfig, getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\nimport { runRemoteTest } from './remote-test.js';\nimport { isTriageEnabledForExecution } from './triage.js';\n\n// ---------------------------------------------------------------------------\n// Types (matching API serializers in apps/api/src/workflows/routes/shared.ts)\n// ---------------------------------------------------------------------------\n\ntype Pagination = {\n page: number;\n pageSize: number;\n totalItems: number;\n totalPages: number;\n};\n\ntype TestExecutionSummary = {\n id: string;\n status: string;\n totalWorkflows: number;\n completedWorkflows: number;\n failedWorkflows: number;\n successfulWorkflows: number;\n skippedWorkflows: number;\n /** @deprecated Quarantine removed; always 0. Use degradedWorkflows. */\n quarantinedWorkflows: number;\n degradedWorkflows?: number;\n startedAt: string | null;\n finishedAt: string | null;\n createdAt: string;\n};\n\ntype TestExecution = TestExecutionSummary & {\n orgId: string;\n mode: string;\n triggeredByUserId: string | null;\n triggeredReason: string | null;\n errorMessage: string | null;\n updatedAt: string;\n};\n\ntype TestRunResult = {\n id: string;\n testRunId: string;\n workflowId: string;\n nodeId: string;\n status: string;\n message: string | null;\n issueId: string | null;\n metadata: Record<string, unknown> | null;\n createdAt: string;\n};\n\ntype TestRun = {\n id: string;\n executionId: string | null;\n workflowId: string;\n status: string;\n snapshotVersion: number;\n workflowRunId: string | null;\n triggeredByUserId: string | null;\n triggeredReason: string | null;\n linkedIssueId: string | null;\n isQuarantined: boolean;\n errorMessage: string | null;\n skipReason: string | null;\n startedAt: string | null;\n finishedAt: string | null;\n workflowName: string | null;\n results: TestRunResult[];\n};\n\ntype TestExecutionListResponse = {\n ok: boolean;\n error?: string;\n data: TestExecutionSummary[];\n pagination: Pagination;\n};\n\ntype TestExecutionDetailResponse = {\n ok: boolean;\n error?: string;\n execution: TestExecution;\n testRuns: TestRun[];\n};\n\ntype RunStep = {\n id: string;\n runId: string;\n nodeId: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n orderIndex: number;\n metadataJson: Record<string, unknown> | null;\n createdAt: string;\n};\n\ntype WorkflowRun = {\n id: string;\n workflowId: string;\n status: string;\n startedAt: string | null;\n finishedAt: string | null;\n errorMessage: string | null;\n steps: RunStep[];\n};\n\ntype RunWithStepsResponse = {\n ok: boolean;\n error?: string;\n data: { run: WorkflowRun };\n};\n\ntype DiagnosticJson = {\n category?: string;\n confidence?: number;\n title?: string;\n analysis?: string;\n recommendation?: string;\n smokingGun?: { type: string; description: string; detail?: string } | null;\n};\n\ntype DiagnosticThought = {\n content: string;\n toolName: string | null;\n orderIndex: number;\n createdAt: string;\n};\n\ntype FailureDiagnosticResponse = {\n ok: boolean;\n error?: string;\n data: {\n id: string;\n status: string;\n diagnostic: DiagnosticJson | null;\n createdAt: string;\n updatedAt: string;\n thoughts?: DiagnosticThought[];\n } | null;\n};\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\nconst STATUS_ICONS: Record<string, string> = {\n completed: '✅',\n completed_with_errors: '⚠️',\n success: '✅',\n failed: '❌',\n running: '🔵',\n queued: '⏳',\n canceled: '🚫',\n timeout: '⏰',\n skipped: '⏭️',\n flaky_success: '🟡',\n pending: '⏳',\n};\n\nfunction statusIcon(status: string): string {\n return STATUS_ICONS[status] ?? '❓';\n}\n\nfunction formatRelative(iso: string | null): string {\n if (!iso) return '—';\n const diffMs = Date.now() - new Date(iso).getTime();\n if (diffMs < 0) return 'just now';\n const seconds = Math.floor(diffMs / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n\nfunction computeDuration(startedAt: string | null, finishedAt: string | null): string {\n if (!startedAt || !finishedAt) return '—';\n const ms = new Date(finishedAt).getTime() - new Date(startedAt).getTime();\n if (ms < 0) return '—';\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes < 60) return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n const remainMins = minutes % 60;\n return remainMins > 0 ? `${hours}h ${remainMins}m` : `${hours}h`;\n}\n\nfunction pad(str: string, len: number): string {\n return str.padEnd(len);\n}\n\n// ---------------------------------------------------------------------------\n// Handlers\n// ---------------------------------------------------------------------------\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, '--json');\n const page = getArgValue(argv, '--page') ?? '1';\n const pageSize = getArgValue(argv, '--page-size') ?? '20';\n\n const params = new URLSearchParams();\n params.set('page', page);\n params.set('pageSize', pageSize);\n params.set('sortBy', 'createdAt');\n params.set('sortOrder', 'desc');\n\n const result = await apiRequest<TestExecutionListResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/test-executions?${params}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const { data, pagination } = result;\n\n if (data.length === 0) {\n console.log('No test suites found.');\n return;\n }\n\n console.log(\n `Test Suites (page ${pagination.page}/${pagination.totalPages}, ${pagination.totalItems} total)\\n`\n );\n\n for (const exec of data) {\n const icon = statusIcon(exec.status);\n const total = String(exec.totalWorkflows).padStart(3);\n const passed = String(exec.successfulWorkflows).padStart(3);\n const failed = String(exec.failedWorkflows).padStart(3);\n const time = formatRelative(exec.createdAt);\n\n console.log(\n ` ${icon} ${exec.id} ${total} total ${passed} passed ${failed} failed ${time}`\n );\n }\n\n console.log('');\n}\n\nasync function handleGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv.find((a) => !a.startsWith('-'));\n if (!id) {\n console.error('Error: Missing execution ID. Usage: canary test-suite get <id>');\n process.exit(1);\n }\n\n const jsonOutput = hasFlag(argv, '--json');\n const failuresOnly = hasFlag(argv, '--failures-only');\n\n const result = await apiRequest<TestExecutionDetailResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/test-executions/${id}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const { execution, testRuns } = result;\n const duration = computeDuration(execution.startedAt, execution.finishedAt);\n\n console.log(`Test Suite: ${execution.id}`);\n console.log(`Status: ${statusIcon(execution.status)} ${execution.status}`);\n console.log(`Duration: ${duration}`);\n console.log(\n `Total: ${execution.totalWorkflows} | Passed: ${execution.successfulWorkflows} | Failed: ${execution.failedWorkflows} | Skipped: ${execution.skippedWorkflows} | Degraded: ${execution.degradedWorkflows ?? 0}`\n );\n console.log('');\n\n let runs = testRuns;\n if (failuresOnly) {\n runs = runs.filter((r) => r.status === 'failed');\n if (runs.length === 0) {\n console.log('No failing runs.');\n return;\n }\n }\n\n console.log('Runs:');\n for (const run of runs) {\n const icon = statusIcon(run.status);\n const name = run.workflowName ?? 'Unnamed';\n const dur = computeDuration(run.startedAt, run.finishedAt);\n const runId = run.workflowRunId ?? '—';\n\n console.log(` ${icon} ${pad(name, 30)} ${dur}`);\n console.log(` wf: ${run.workflowId} run: ${runId}`);\n\n if (run.errorMessage) {\n console.log(` Error: ${run.errorMessage}`);\n }\n if (run.skipReason) {\n console.log(` Skip reason: ${run.skipReason}`);\n }\n if (run.linkedIssueId) {\n console.log(` Linked issue: ${run.linkedIssueId}`);\n }\n }\n\n console.log('');\n\n if (execution.failedWorkflows > 0) {\n const triageEnabled = await isTriageEnabledForExecution(apiUrl, token, execution.id);\n if (triageEnabled) {\n console.log(`Triage: canary triage get ${execution.id}`);\n console.log('');\n }\n }\n}\n\nasync function handleDiagnostics(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n if (positional.length < 2) {\n console.error(\n 'Error: Missing arguments. Usage: canary test-suite diagnostics <workflowId> <runId>'\n );\n process.exit(1);\n }\n\n const [workflowId, runId] = positional;\n const jsonOutput = hasFlag(argv, '--json');\n const showThoughts = hasFlag(argv, '--thoughts');\n\n const result = await apiRequest<FailureDiagnosticResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs/${runId}/failure-diagnostic${\n showThoughts ? '?includeThoughts=true' : ''\n }`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (!result.data) {\n console.log('No diagnostic available for this run.');\n return;\n }\n\n const { status, diagnostic } = result.data;\n\n if (status === 'pending' || status === 'running') {\n console.log(`Diagnostic is still in progress (status: ${status}).`);\n return;\n }\n\n if (status === 'failed') {\n console.log('Diagnostic analysis failed.');\n return;\n }\n\n if (!diagnostic) {\n console.log('Diagnostic completed but no analysis data available.');\n return;\n }\n\n console.log('Failure Diagnostic');\n console.log(`Status: ${status}`);\n if (diagnostic.category) {\n const conf =\n diagnostic.confidence !== null && diagnostic.confidence !== undefined\n ? ` (${diagnostic.confidence > 1 ? Math.round(diagnostic.confidence) : Math.round(diagnostic.confidence * 100)}% confidence)`\n : '';\n console.log(`Category: ${diagnostic.category}${conf}`);\n }\n if (diagnostic.title) {\n console.log(`Title: ${diagnostic.title}`);\n }\n\n if (diagnostic.analysis) {\n console.log('');\n console.log('Analysis:');\n console.log(` ${diagnostic.analysis}`);\n }\n\n if (diagnostic.recommendation) {\n console.log('');\n console.log('Recommendation:');\n console.log(` ${diagnostic.recommendation}`);\n }\n\n if (diagnostic.smokingGun) {\n console.log('');\n console.log('Smoking Gun:');\n console.log(` > ${diagnostic.smokingGun.description}`);\n if (diagnostic.smokingGun.detail) {\n console.log(` ${diagnostic.smokingGun.detail}`);\n }\n }\n\n if (showThoughts) {\n const thoughts = result.data.thoughts ?? [];\n console.log('');\n console.log(`Agent reasoning (${thoughts.length} step${thoughts.length === 1 ? '' : 's'}):`);\n if (thoughts.length === 0) {\n console.log(' (no reasoning trace captured for this diagnostic)');\n } else {\n for (const t of thoughts) {\n const tool = t.toolName ? ` → ${t.toolName}()` : '';\n console.log(` [${t.orderIndex}]${tool}`);\n for (const line of t.content.split('\\n')) {\n console.log(` ${line}`);\n }\n }\n }\n }\n\n console.log('');\n}\n\nasync function handleSteps(argv: string[], apiUrl: string, token: string): Promise<void> {\n const positional = argv.filter((a) => !a.startsWith('-'));\n if (positional.length < 2) {\n console.error('Error: Missing arguments. Usage: canary test-suite steps <workflowId> <runId>');\n process.exit(1);\n }\n\n const [workflowId, runId] = positional;\n const jsonOutput = hasFlag(argv, '--json');\n\n const result = await apiRequest<RunWithStepsResponse>(\n apiUrl,\n token,\n 'GET',\n `/workflows/${workflowId}/runs/${runId}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n\n if (jsonOutput) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n const { run } = result.data;\n const duration = computeDuration(run.startedAt, run.finishedAt);\n\n console.log(`Run: ${run.id} (${run.status})`);\n console.log(`Duration: ${duration}`);\n\n if (run.errorMessage) {\n console.log(`Error: ${run.errorMessage}`);\n }\n\n const steps = (run.steps ?? []).sort((a, b) => a.orderIndex - b.orderIndex);\n\n if (steps.length === 0) {\n console.log('\\nNo steps recorded.');\n return;\n }\n\n console.log(`\\nSteps (${steps.length}):`);\n for (const step of steps) {\n const idx = String(step.orderIndex + 1).padStart(2);\n const icon = statusIcon(step.status);\n const nodeId = step.nodeId.slice(0, 8);\n const dur = computeDuration(step.startedAt, step.finishedAt);\n\n console.log(` ${idx}. ${icon} ${pad(nodeId, 10)} ${dur}`);\n\n if (step.errorMessage) {\n console.log(` Error: ${step.errorMessage}`);\n }\n }\n\n console.log('');\n}\n\n// ---------------------------------------------------------------------------\n// Help\n// ---------------------------------------------------------------------------\n\nfunction printTestSuiteHelp(): void {\n console.log(\n [\n 'Usage: canary test-suite <sub-command> [options]',\n '',\n 'Sub-commands:',\n ' run [options] Trigger a test suite and stream results',\n ' list [options] List recent test suites',\n ' get <id> [options] Get test suite detail with runs',\n ' diagnostics <workflowId> <runId> Get failure diagnostic for a run (--thoughts for the agent reasoning trace)',\n ' steps <workflowId> <runId> Get workflow run steps',\n '',\n 'After a run, the suite id can be passed to triage commands:',\n ' canary triage wait <suiteId> Block until AI clusters failures (beta)',\n ' canary triage get <suiteId> Show clustered failures + suggested actions',\n ' canary triage get latest Resolves to the most recent suite',\n '',\n 'Run options:',\n ' --suite <name|id> Run a named, layered test suite (members run in layer order)',\n ' --application <name|id> Target a specific application (alias: --property)',\n ' --environment <name|id> Target a specific environment',\n ' --tag <tag> Filter workflows by tag',\n ' --name-pattern <pat> Filter workflows by name pattern',\n ' --verbose, -v Show all SSE events',\n '',\n 'List options:',\n ' --page <n> Page number (default: 1)',\n ' --page-size <n> Page size (default: 20)',\n '',\n 'Get options:',\n ' --failures-only Show only failing test runs',\n '',\n 'Output options:',\n ' --json Output raw JSON',\n '',\n 'Common options:',\n ' --env <env> Target environment (prod, dev)',\n ' --api-url <url> API URL override',\n ' --token <key> API token override',\n '',\n 'Examples:',\n ' canary test-suite run Run all workflow tests',\n ' canary test-suite run --suite \"Checkout flow\" Run a named, layered suite',\n ' canary test-suite run --tag smoke Run smoke-tagged workflows',\n ' canary test-suite run --application \"My App\" --environment staging',\n ' canary test-suite list List recent suite executions',\n ' canary test-suite get <id> --failures-only Show only failures',\n ].join('\\n')\n );\n}\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\nexport async function runTestSuite(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === 'help' || hasFlag(argv, '--help', '-h')) {\n printTestSuiteHelp();\n return;\n }\n\n if (subCommand === 'run') {\n // Delegate to runRemoteTest — pass through remaining args\n await runRemoteTest(rest);\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n switch (subCommand) {\n case 'list':\n await handleList(rest, apiUrl, token);\n break;\n case 'get':\n await handleGet(rest, apiUrl, token);\n break;\n case 'diagnostics':\n await handleDiagnostics(rest, apiUrl, token);\n break;\n case 'steps':\n await handleSteps(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printTestSuiteHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,14 +1,16 @@
1
1
  import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
2
  import {
3
3
  runTrace
4
- } from "./chunk-Q4BO4Z5V.js";
5
- import "./chunk-A4OFTUVV.js";
6
- import "./chunk-4PNOV7OV.js";
4
+ } from "./chunk-ZTOE3ND3.js";
5
+ import "./chunk-PZ4LCN6K.js";
6
+ import "./chunk-JZMJUPZP.js";
7
+ import "./chunk-QQVWGWPI.js";
7
8
  import "./chunk-JWHYXEA2.js";
9
+ import "./chunk-QGI4UCJX.js";
8
10
  import "./chunk-6LEZCKKV.js";
9
11
  import "./chunk-ZD3KHESI.js";
10
12
  import "./chunk-VKVL7WBN.js";
11
13
  export {
12
14
  runTrace
13
15
  };
14
- //# sourceMappingURL=trace-HXIW7U2D.js.map
16
+ //# sourceMappingURL=trace-A3ZY6K26.js.map
@@ -2,15 +2,16 @@ import { createRequire as __cr } from "module"; const require = __cr(import.meta
2
2
  import {
3
3
  isTriageEnabledForExecution,
4
4
  runTriage
5
- } from "./chunk-CLAWT7BJ.js";
6
- import "./chunk-WOHL4FTB.js";
7
- import "./chunk-SJJW77WN.js";
5
+ } from "./chunk-ENDHMYEJ.js";
6
+ import "./chunk-CQE46HSM.js";
8
7
  import "./chunk-3CZU7XCS.js";
9
- import "./chunk-A4OFTUVV.js";
8
+ import "./chunk-PZ4LCN6K.js";
9
+ import "./chunk-JZMJUPZP.js";
10
10
  import "./chunk-JWHYXEA2.js";
11
+ import "./chunk-QGI4UCJX.js";
11
12
  import "./chunk-VKVL7WBN.js";
12
13
  export {
13
14
  isTriageEnabledForExecution,
14
15
  runTriage
15
16
  };
16
- //# sourceMappingURL=triage-ORG45R5W.js.map
17
+ //# sourceMappingURL=triage-TT4BMDBU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,10 +1,10 @@
1
1
  import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
2
  import {
3
3
  clearUpdateCache
4
- } from "./chunk-N7HFALX3.js";
4
+ } from "./chunk-VGTKUOYS.js";
5
5
  import {
6
6
  packageName
7
- } from "./chunk-JICSYFRJ.js";
7
+ } from "./chunk-JZMJUPZP.js";
8
8
  import "./chunk-VKVL7WBN.js";
9
9
 
10
10
  // src/upgrade.ts
@@ -58,4 +58,4 @@ Successfully upgraded ${packageName}.`);
58
58
  export {
59
59
  runUpgrade
60
60
  };
61
- //# sourceMappingURL=upgrade-L2VYMP2V.js.map
61
+ //# sourceMappingURL=upgrade-6ZUFETKX.js.map