swipium 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +295 -0
- package/dist/appMap/automationLink.js +74 -0
- package/dist/appMap/automationLink.js.map +1 -0
- package/dist/appMap/build.js +193 -0
- package/dist/appMap/build.js.map +1 -0
- package/dist/appMap/codeIndex.js +73 -0
- package/dist/appMap/codeIndex.js.map +1 -0
- package/dist/appMap/featureModel.js +83 -0
- package/dist/appMap/featureModel.js.map +1 -0
- package/dist/appMap/firstRunApply.js +131 -0
- package/dist/appMap/firstRunApply.js.map +1 -0
- package/dist/appMap/fsWalk.js +75 -0
- package/dist/appMap/fsWalk.js.map +1 -0
- package/dist/appMap/issues.js +227 -0
- package/dist/appMap/issues.js.map +1 -0
- package/dist/appMap/migrations.js +87 -0
- package/dist/appMap/migrations.js.map +1 -0
- package/dist/appMap/prelaunch.js +66 -0
- package/dist/appMap/prelaunch.js.map +1 -0
- package/dist/appMap/projectRegistry.js +70 -0
- package/dist/appMap/projectRegistry.js.map +1 -0
- package/dist/appMap/provenance.js +52 -0
- package/dist/appMap/provenance.js.map +1 -0
- package/dist/appMap/query.js +118 -0
- package/dist/appMap/query.js.map +1 -0
- package/dist/appMap/runtimeMerge.js +207 -0
- package/dist/appMap/runtimeMerge.js.map +1 -0
- package/dist/appMap/schema.js +65 -0
- package/dist/appMap/schema.js.map +1 -0
- package/dist/appMap/screenMatch.js +75 -0
- package/dist/appMap/screenMatch.js.map +1 -0
- package/dist/appMap/staticScan.js +614 -0
- package/dist/appMap/staticScan.js.map +1 -0
- package/dist/appMap/store.js +173 -0
- package/dist/appMap/store.js.map +1 -0
- package/dist/appMap/tsAstScan.js +184 -0
- package/dist/appMap/tsAstScan.js.map +1 -0
- package/dist/artifacts/bundletool.js +199 -0
- package/dist/artifacts/bundletool.js.map +1 -0
- package/dist/artifacts/resolve.js +388 -0
- package/dist/artifacts/resolve.js.map +1 -0
- package/dist/automationGen/appiumModel.js +129 -0
- package/dist/automationGen/appiumModel.js.map +1 -0
- package/dist/automationGen/ciEmitter.js +80 -0
- package/dist/automationGen/ciEmitter.js.map +1 -0
- package/dist/automationGen/jsEmitter.js +440 -0
- package/dist/automationGen/jsEmitter.js.map +1 -0
- package/dist/automationGen/packagePatch.js +56 -0
- package/dist/automationGen/packagePatch.js.map +1 -0
- package/dist/automationGen/projectProfile.js +317 -0
- package/dist/automationGen/projectProfile.js.map +1 -0
- package/dist/automationGen/pythonEmitter.js +386 -0
- package/dist/automationGen/pythonEmitter.js.map +1 -0
- package/dist/automationGen/readmeEmitter.js +66 -0
- package/dist/automationGen/readmeEmitter.js.map +1 -0
- package/dist/automationGen/suitePlan.js +94 -0
- package/dist/automationGen/suitePlan.js.map +1 -0
- package/dist/automationGen/validation.js +150 -0
- package/dist/automationGen/validation.js.map +1 -0
- package/dist/build/parseBuildLog.js +119 -0
- package/dist/build/parseBuildLog.js.map +1 -0
- package/dist/build/plan.js +150 -0
- package/dist/build/plan.js.map +1 -0
- package/dist/ci/preflight.js +85 -0
- package/dist/ci/preflight.js.map +1 -0
- package/dist/cli/init.js +105 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/scan.js +85 -0
- package/dist/cli/scan.js.map +1 -0
- package/dist/cli/suite.js +85 -0
- package/dist/cli/suite.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/consent/consent.js +43 -0
- package/dist/consent/consent.js.map +1 -0
- package/dist/context/detect.js +156 -0
- package/dist/context/detect.js.map +1 -0
- package/dist/context/findApps.js +198 -0
- package/dist/context/findApps.js.map +1 -0
- package/dist/context/projectRoot.js +41 -0
- package/dist/context/projectRoot.js.map +1 -0
- package/dist/context/scan.js +167 -0
- package/dist/context/scan.js.map +1 -0
- package/dist/core/target.js +115 -0
- package/dist/core/target.js.map +1 -0
- package/dist/core/targetPlan.js +140 -0
- package/dist/core/targetPlan.js.map +1 -0
- package/dist/drivers/DirectDriver.js +228 -0
- package/dist/drivers/DirectDriver.js.map +1 -0
- package/dist/drivers/Driver.js +4 -0
- package/dist/drivers/Driver.js.map +1 -0
- package/dist/drivers/SimctlDriver.js +127 -0
- package/dist/drivers/SimctlDriver.js.map +1 -0
- package/dist/drivers/WdaDriver.js +250 -0
- package/dist/drivers/WdaDriver.js.map +1 -0
- package/dist/explore/candidates.js +93 -0
- package/dist/explore/candidates.js.map +1 -0
- package/dist/explore/graph.js +116 -0
- package/dist/explore/graph.js.map +1 -0
- package/dist/explore/memory.js +35 -0
- package/dist/explore/memory.js.map +1 -0
- package/dist/explore/planner.js +105 -0
- package/dist/explore/planner.js.map +1 -0
- package/dist/explore/policy.js +85 -0
- package/dist/explore/policy.js.map +1 -0
- package/dist/explore/runner.js +475 -0
- package/dist/explore/runner.js.map +1 -0
- package/dist/explore/signatures.js +35 -0
- package/dist/explore/signatures.js.map +1 -0
- package/dist/explore/suite.js +55 -0
- package/dist/explore/suite.js.map +1 -0
- package/dist/featureTesting/executionBootstrap.js +140 -0
- package/dist/featureTesting/executionBootstrap.js.map +1 -0
- package/dist/firstRun/authStateMachine.js +83 -0
- package/dist/firstRun/authStateMachine.js.map +1 -0
- package/dist/firstRun/classifyScreen.js +201 -0
- package/dist/firstRun/classifyScreen.js.map +1 -0
- package/dist/firstRun/firstRunPlanner.js +207 -0
- package/dist/firstRun/firstRunPlanner.js.map +1 -0
- package/dist/firstRun/firstRunRunner.js +331 -0
- package/dist/firstRun/firstRunRunner.js.map +1 -0
- package/dist/firstRun/generatedDataPolicy.js +215 -0
- package/dist/firstRun/generatedDataPolicy.js.map +1 -0
- package/dist/firstRun/inputPlanner.js +67 -0
- package/dist/firstRun/inputPlanner.js.map +1 -0
- package/dist/firstRun/onboardingStateMachine.js +46 -0
- package/dist/firstRun/onboardingStateMachine.js.map +1 -0
- package/dist/firstRun/paywallPolicy.js +54 -0
- package/dist/firstRun/paywallPolicy.js.map +1 -0
- package/dist/firstRun/types.js +7 -0
- package/dist/firstRun/types.js.map +1 -0
- package/dist/fixtures/catalog.js +131 -0
- package/dist/fixtures/catalog.js.map +1 -0
- package/dist/flows/discover.js +18 -0
- package/dist/flows/discover.js.map +1 -0
- package/dist/flows/generate.js +211 -0
- package/dist/flows/generate.js.map +1 -0
- package/dist/flows/lint.js +97 -0
- package/dist/flows/lint.js.map +1 -0
- package/dist/flows/pack.js +68 -0
- package/dist/flows/pack.js.map +1 -0
- package/dist/flows/run.js +738 -0
- package/dist/flows/run.js.map +1 -0
- package/dist/flows/schema.js +240 -0
- package/dist/flows/schema.js.map +1 -0
- package/dist/flows/seedExec.js +108 -0
- package/dist/flows/seedExec.js.map +1 -0
- package/dist/flows/templates.js +155 -0
- package/dist/flows/templates.js.map +1 -0
- package/dist/flows/waitGuards.js +12 -0
- package/dist/flows/waitGuards.js.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/ios/signing.js +182 -0
- package/dist/ios/signing.js.map +1 -0
- package/dist/issues/classify.js +186 -0
- package/dist/issues/classify.js.map +1 -0
- package/dist/issues/fingerprint.js +130 -0
- package/dist/issues/fingerprint.js.map +1 -0
- package/dist/issues/index.js +240 -0
- package/dist/issues/index.js.map +1 -0
- package/dist/issues/metrics.js +155 -0
- package/dist/issues/metrics.js.map +1 -0
- package/dist/issues/recurrence.js +193 -0
- package/dist/issues/recurrence.js.map +1 -0
- package/dist/issues/report.js +110 -0
- package/dist/issues/report.js.map +1 -0
- package/dist/issues/reportBridge.js +119 -0
- package/dist/issues/reportBridge.js.map +1 -0
- package/dist/issues/schema.js +90 -0
- package/dist/issues/schema.js.map +1 -0
- package/dist/issues/sourceRevision.js +108 -0
- package/dist/issues/sourceRevision.js.map +1 -0
- package/dist/issues/store.js +155 -0
- package/dist/issues/store.js.map +1 -0
- package/dist/lib/android.js +278 -0
- package/dist/lib/android.js.map +1 -0
- package/dist/lib/commandTemplate.js +55 -0
- package/dist/lib/commandTemplate.js.map +1 -0
- package/dist/lib/coordSpace.js +23 -0
- package/dist/lib/coordSpace.js.map +1 -0
- package/dist/lib/device.js +87 -0
- package/dist/lib/device.js.map +1 -0
- package/dist/lib/gitignore.js +22 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/lib/image.js +97 -0
- package/dist/lib/image.js.map +1 -0
- package/dist/lib/logger.js +8 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/metroState.js +45 -0
- package/dist/lib/metroState.js.map +1 -0
- package/dist/lib/needsInput.js +201 -0
- package/dist/lib/needsInput.js.map +1 -0
- package/dist/lib/png.js +103 -0
- package/dist/lib/png.js.map +1 -0
- package/dist/lib/redact.js +21 -0
- package/dist/lib/redact.js.map +1 -0
- package/dist/lib/result.js +87 -0
- package/dist/lib/result.js.map +1 -0
- package/dist/lib/schemaHash.js +65 -0
- package/dist/lib/schemaHash.js.map +1 -0
- package/dist/lib/sensitive.js +13 -0
- package/dist/lib/sensitive.js.map +1 -0
- package/dist/lib/simctl.js +149 -0
- package/dist/lib/simctl.js.map +1 -0
- package/dist/lib/spawn.js +144 -0
- package/dist/lib/spawn.js.map +1 -0
- package/dist/lib/wda.js +347 -0
- package/dist/lib/wda.js.map +1 -0
- package/dist/lib/wdaConfig.js +69 -0
- package/dist/lib/wdaConfig.js.map +1 -0
- package/dist/lib/wdaTune.js +58 -0
- package/dist/lib/wdaTune.js.map +1 -0
- package/dist/oracle/auth.js +22 -0
- package/dist/oracle/auth.js.map +1 -0
- package/dist/oracle/failures.js +193 -0
- package/dist/oracle/failures.js.map +1 -0
- package/dist/oracle/health.js +123 -0
- package/dist/oracle/health.js.map +1 -0
- package/dist/oracle/record.js +36 -0
- package/dist/oracle/record.js.map +1 -0
- package/dist/orchestration/envelope.js +52 -0
- package/dist/orchestration/envelope.js.map +1 -0
- package/dist/orchestration/goal.js +98 -0
- package/dist/orchestration/goal.js.map +1 -0
- package/dist/plan/plan.js +124 -0
- package/dist/plan/plan.js.map +1 -0
- package/dist/prompts/index.js +63 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/report/artifactManifest.js +44 -0
- package/dist/report/artifactManifest.js.map +1 -0
- package/dist/report/coverage.js +60 -0
- package/dist/report/coverage.js.map +1 -0
- package/dist/report/evidence.js +84 -0
- package/dist/report/evidence.js.map +1 -0
- package/dist/report/export.js +447 -0
- package/dist/report/export.js.map +1 -0
- package/dist/report/flake.js +61 -0
- package/dist/report/flake.js.map +1 -0
- package/dist/report/history.js +564 -0
- package/dist/report/history.js.map +1 -0
- package/dist/report/policy.js +98 -0
- package/dist/report/policy.js.map +1 -0
- package/dist/report/qaLevel.js +96 -0
- package/dist/report/qaLevel.js.map +1 -0
- package/dist/report/readiness.js +213 -0
- package/dist/report/readiness.js.map +1 -0
- package/dist/report/summary.js +42 -0
- package/dist/report/summary.js.map +1 -0
- package/dist/report/testCatalog.js +93 -0
- package/dist/report/testCatalog.js.map +1 -0
- package/dist/report/timing.js +37 -0
- package/dist/report/timing.js.map +1 -0
- package/dist/server.js +180 -0
- package/dist/server.js.map +1 -0
- package/dist/services/automationGenerate.js +60 -0
- package/dist/services/automationGenerate.js.map +1 -0
- package/dist/services/build.js +66 -0
- package/dist/services/build.js.map +1 -0
- package/dist/services/preflight.js +51 -0
- package/dist/services/preflight.js.map +1 -0
- package/dist/services/prepareAndroid.js +183 -0
- package/dist/services/prepareAndroid.js.map +1 -0
- package/dist/services/prepareIos.js +162 -0
- package/dist/services/prepareIos.js.map +1 -0
- package/dist/services/report.js +537 -0
- package/dist/services/report.js.map +1 -0
- package/dist/services/smoke.js +120 -0
- package/dist/services/smoke.js.map +1 -0
- package/dist/services/suiteGenerate.js +123 -0
- package/dist/services/suiteGenerate.js.map +1 -0
- package/dist/services/testSuiteKnowledge.js +150 -0
- package/dist/services/testSuiteKnowledge.js.map +1 -0
- package/dist/session/attach.js +47 -0
- package/dist/session/attach.js.map +1 -0
- package/dist/session/progress.js +56 -0
- package/dist/session/progress.js.map +1 -0
- package/dist/session/store.js +329 -0
- package/dist/session/store.js.map +1 -0
- package/dist/snapshot/overlays.js +132 -0
- package/dist/snapshot/overlays.js.map +1 -0
- package/dist/snapshot/parse.js +204 -0
- package/dist/snapshot/parse.js.map +1 -0
- package/dist/snapshot/present.js +12 -0
- package/dist/snapshot/present.js.map +1 -0
- package/dist/snapshot/settle.js +36 -0
- package/dist/snapshot/settle.js.map +1 -0
- package/dist/state/profile.js +318 -0
- package/dist/state/profile.js.map +1 -0
- package/dist/suite/compile.js +176 -0
- package/dist/suite/compile.js.map +1 -0
- package/dist/suite/lint.js +45 -0
- package/dist/suite/lint.js.map +1 -0
- package/dist/suite/pom.js +285 -0
- package/dist/suite/pom.js.map +1 -0
- package/dist/suite/testcase.js +87 -0
- package/dist/suite/testcase.js.map +1 -0
- package/dist/testSuite/generator.js +222 -0
- package/dist/testSuite/generator.js.map +1 -0
- package/dist/testSuite/history.js +44 -0
- package/dist/testSuite/history.js.map +1 -0
- package/dist/testSuite/issueLinks.js +96 -0
- package/dist/testSuite/issueLinks.js.map +1 -0
- package/dist/testSuite/merge.js +190 -0
- package/dist/testSuite/merge.js.map +1 -0
- package/dist/testSuite/schema.js +86 -0
- package/dist/testSuite/schema.js.map +1 -0
- package/dist/testSuite/store.js +116 -0
- package/dist/testSuite/store.js.map +1 -0
- package/dist/testSuite/traceability.js +55 -0
- package/dist/testSuite/traceability.js.map +1 -0
- package/dist/tools/act.js +457 -0
- package/dist/tools/act.js.map +1 -0
- package/dist/tools/agent.js +225 -0
- package/dist/tools/agent.js.map +1 -0
- package/dist/tools/appMap.js +317 -0
- package/dist/tools/appMap.js.map +1 -0
- package/dist/tools/assertVisual.js +74 -0
- package/dist/tools/assertVisual.js.map +1 -0
- package/dist/tools/automationGenerate.js +394 -0
- package/dist/tools/automationGenerate.js.map +1 -0
- package/dist/tools/capabilities.js +114 -0
- package/dist/tools/capabilities.js.map +1 -0
- package/dist/tools/clearOverlay.js +150 -0
- package/dist/tools/clearOverlay.js.map +1 -0
- package/dist/tools/detectContext.js +41 -0
- package/dist/tools/detectContext.js.map +1 -0
- package/dist/tools/doctor.js +116 -0
- package/dist/tools/doctor.js.map +1 -0
- package/dist/tools/explore.js +289 -0
- package/dist/tools/explore.js.map +1 -0
- package/dist/tools/firstRun.js +136 -0
- package/dist/tools/firstRun.js.map +1 -0
- package/dist/tools/flow.js +331 -0
- package/dist/tools/flow.js.map +1 -0
- package/dist/tools/flowGenerate.js +55 -0
- package/dist/tools/flowGenerate.js.map +1 -0
- package/dist/tools/getArtifact.js +39 -0
- package/dist/tools/getArtifact.js.map +1 -0
- package/dist/tools/health.js +41 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/ios.js +492 -0
- package/dist/tools/ios.js.map +1 -0
- package/dist/tools/jobs.js +20 -0
- package/dist/tools/jobs.js.map +1 -0
- package/dist/tools/network.js +50 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/note.js +69 -0
- package/dist/tools/note.js.map +1 -0
- package/dist/tools/plan.js +49 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/prepareIosTarget.js +99 -0
- package/dist/tools/prepareIosTarget.js.map +1 -0
- package/dist/tools/prepareTarget.js +257 -0
- package/dist/tools/prepareTarget.js.map +1 -0
- package/dist/tools/report.js +42 -0
- package/dist/tools/report.js.map +1 -0
- package/dist/tools/screenRecord.js +24 -0
- package/dist/tools/screenRecord.js.map +1 -0
- package/dist/tools/screenshot.js +63 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/smoke.js +39 -0
- package/dist/tools/smoke.js.map +1 -0
- package/dist/tools/snapshot.js +129 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/tools/startSession.js +169 -0
- package/dist/tools/startSession.js.map +1 -0
- package/dist/tools/state.js +87 -0
- package/dist/tools/state.js.map +1 -0
- package/dist/tools/suite.js +412 -0
- package/dist/tools/suite.js.map +1 -0
- package/dist/tools/testThis.js +774 -0
- package/dist/tools/testThis.js.map +1 -0
- package/dist/tools/wda.js +477 -0
- package/dist/tools/wda.js.map +1 -0
- package/dist/version.js +62 -0
- package/dist/version.js.map +1 -0
- package/dist/visual/ocr.js +72 -0
- package/dist/visual/ocr.js.map +1 -0
- package/dist/visual/provider.js +75 -0
- package/dist/visual/provider.js.map +1 -0
- package/docs/README.md +19 -0
- package/docs/assets/swipium-lockup-ink-on-light.png +0 -0
- package/docs/mcp-server.md +135 -0
- package/docs/tools.md +130 -0
- package/package.json +70 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
// qa_suite_generate / qa_testcase_generate / qa_suite_compile.
|
|
2
|
+
//
|
|
3
|
+
// These turn the actions recorded during a session (qa_act) into a MAINTAINABLE POM suite under
|
|
4
|
+
// .swipium/ — page objects (selectors), tests (reference elements by name), a suite, a test-case
|
|
5
|
+
// catalog, and a locator audit — and lint the result for brittle/coordinate-only locators.
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { join, dirname } from 'node:path';
|
|
10
|
+
import { qaOk, qaError } from '../lib/result.js';
|
|
11
|
+
import { requireConsent, consumeConsent } from '../consent/consent.js';
|
|
12
|
+
import { generatePom } from '../suite/pom.js';
|
|
13
|
+
import { generateTestCases } from '../suite/testcase.js';
|
|
14
|
+
import { compileSuite } from '../suite/compile.js';
|
|
15
|
+
import { parseFlow } from '../flows/schema.js';
|
|
16
|
+
import { runFlow } from '../flows/run.js';
|
|
17
|
+
import { loadProjectConfig } from '../cli/scan.js';
|
|
18
|
+
import { generateAndCompileSuite } from '../services/suiteGenerate.js';
|
|
19
|
+
import { getDriver } from '../session/attach.js';
|
|
20
|
+
import { readinessForSession } from '../report/readiness.js';
|
|
21
|
+
import { loadStateProfile, prepareStateProfile, teardownStateProfile, verifyStateProfile } from '../state/profile.js';
|
|
22
|
+
import { hasStateProfileMutation, stateProfileAffects, stateRisk } from './state.js';
|
|
23
|
+
function stable(value) {
|
|
24
|
+
if (Array.isArray(value))
|
|
25
|
+
return value.map(stable);
|
|
26
|
+
if (value && typeof value === 'object') {
|
|
27
|
+
return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([k, v]) => [k, stable(v)]));
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
function hash(value) {
|
|
32
|
+
return createHash('sha256').update(JSON.stringify(stable(value))).digest('hex');
|
|
33
|
+
}
|
|
34
|
+
function hashFile(path) {
|
|
35
|
+
if (!path)
|
|
36
|
+
return null;
|
|
37
|
+
try {
|
|
38
|
+
return createHash('sha256').update(readFileSync(path)).digest('hex');
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function compiledFlowIdentity(c) {
|
|
45
|
+
return {
|
|
46
|
+
name: c.name,
|
|
47
|
+
ok: c.ok,
|
|
48
|
+
flowPath: c.flowPath ?? null,
|
|
49
|
+
compiledPath: c.compiledPath ?? null,
|
|
50
|
+
flowHash: hashFile(c.flowPath),
|
|
51
|
+
compiledHash: hashFile(c.compiledPath),
|
|
52
|
+
errors: c.errors,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function appIdOf(session) {
|
|
56
|
+
return session.appId ?? (loadProjectConfig(session.root)?.appId ?? undefined);
|
|
57
|
+
}
|
|
58
|
+
/** Map the replay outcome to the test-case catalog's replay status (Deliverable 4 — honest plumbing). */
|
|
59
|
+
function catalogReplayStatus(mode, results, passed) {
|
|
60
|
+
if (mode === 'none' || results.length === 0)
|
|
61
|
+
return 'not_replayed';
|
|
62
|
+
if (results.some((r) => r.status === 'blocked'))
|
|
63
|
+
return 'blocked';
|
|
64
|
+
if (results.some((r) => r.status === 'failed'))
|
|
65
|
+
return 'failed';
|
|
66
|
+
if (!passed)
|
|
67
|
+
return 'not_replayed';
|
|
68
|
+
if (mode === 'dry_run')
|
|
69
|
+
return 'dry_run';
|
|
70
|
+
if (mode === 'same_session')
|
|
71
|
+
return 'same_session';
|
|
72
|
+
if (mode === 'fresh_state')
|
|
73
|
+
return 'fresh_state';
|
|
74
|
+
return 'not_replayed';
|
|
75
|
+
}
|
|
76
|
+
function suiteDir(session) {
|
|
77
|
+
return join(session.root, '.swipium');
|
|
78
|
+
}
|
|
79
|
+
/** Write generated files under .swipium/, returning absolute paths written. */
|
|
80
|
+
function writeFiles(session, files) {
|
|
81
|
+
const base = suiteDir(session);
|
|
82
|
+
const written = [];
|
|
83
|
+
for (const f of files) {
|
|
84
|
+
const abs = join(base, f.path);
|
|
85
|
+
mkdirSync(dirname(abs), { recursive: true });
|
|
86
|
+
writeFileSync(abs, f.content);
|
|
87
|
+
written.push(abs);
|
|
88
|
+
}
|
|
89
|
+
return written;
|
|
90
|
+
}
|
|
91
|
+
function requireActions(session) {
|
|
92
|
+
if (!session.recordedActions.length) {
|
|
93
|
+
return qaError({
|
|
94
|
+
what: 'No actions recorded in this session yet',
|
|
95
|
+
changedState: false,
|
|
96
|
+
retrySafe: true,
|
|
97
|
+
nextSteps: ['Drive the app with qa_act first (each action is recorded), then regenerate the suite.'],
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
function pomFor(session, name) {
|
|
103
|
+
const appId = appIdOf(session);
|
|
104
|
+
const flowName = (name ?? `${(appId ?? 'app').split('.').pop()}-smoke`).replace(/[^\w.-]+/g, '-');
|
|
105
|
+
const pom = generatePom(session.recordedActions, { name: flowName, appId, budgetProfile: session.budgetProfile });
|
|
106
|
+
return { pom, flowName };
|
|
107
|
+
}
|
|
108
|
+
export function registerSuite(server, sessions) {
|
|
109
|
+
// ---- qa_suite_generate ----
|
|
110
|
+
server.registerTool('qa_suite_generate', {
|
|
111
|
+
title: 'Generate an automation suite',
|
|
112
|
+
description: 'Generate a full, committed-ready automation suite under .swipium/ from this session\'s recorded actions: page objects (pages/), a POM test (tests/), a suite (suites/), a test case catalog (testcases/), a locator audit (locators/), AND — unless compile:false — runnable Flow V2 compiled into flows/ + compiled/. Reports durability, brittle locators, and whether the suite is runnable. Pass save:false to preview without writing.',
|
|
113
|
+
inputSchema: {
|
|
114
|
+
sessionId: z.string(),
|
|
115
|
+
name: z.string().optional(),
|
|
116
|
+
save: z.boolean().optional().describe('Write files under .swipium/ (default true).'),
|
|
117
|
+
compile: z.boolean().optional().describe('Also compile to runnable Flow V2 (default true).'),
|
|
118
|
+
replay: z.enum(['none', 'dry_run', 'same_session', 'fresh_state']).optional().describe('Replay gate: dry_run validates compiled flows; same_session executes compiled flows now; fresh_state requires a state profile and is reported as blocked when absent. Default dry_run.'),
|
|
119
|
+
stateProfile: z.string().optional().describe('Required for replay:"fresh_state" so CI-ready means replay from declared state.'),
|
|
120
|
+
consentId: z.string().optional().describe('Required when replay:"fresh_state" applies a mutating state profile.'),
|
|
121
|
+
approve: z.boolean().optional().describe('Approve the exact fresh-state replay consent request.'),
|
|
122
|
+
},
|
|
123
|
+
}, async ({ sessionId, name, save, compile, replay, stateProfile, consentId, approve }) => {
|
|
124
|
+
const session = sessions.get(sessionId);
|
|
125
|
+
if (!session)
|
|
126
|
+
return qaError({ what: `Unknown sessionId ${sessionId}`, changedState: false, retrySafe: true, nextSteps: ['Call qa_start_session first.'] });
|
|
127
|
+
const noActions = requireActions(session);
|
|
128
|
+
if (noActions)
|
|
129
|
+
return noActions;
|
|
130
|
+
const res = generateAndCompileSuite(sessions, session, { name, save: save !== false, compile: compile !== false });
|
|
131
|
+
const audit = res.audit;
|
|
132
|
+
const ranOk = res.compiledFlows.filter((c) => c.ok).length;
|
|
133
|
+
const replayMode = replay ?? 'dry_run';
|
|
134
|
+
const replayResults = [];
|
|
135
|
+
const replayEvidence = {
|
|
136
|
+
stateLedgerUris: [],
|
|
137
|
+
consentRequired: false,
|
|
138
|
+
consentApproved: false,
|
|
139
|
+
};
|
|
140
|
+
if (replayMode === 'dry_run') {
|
|
141
|
+
for (const c of res.compiledFlows)
|
|
142
|
+
replayResults.push({ name: c.name, mode: replayMode, status: c.ok ? 'validated' : 'failed', reason: c.errors.join('; ') || undefined });
|
|
143
|
+
}
|
|
144
|
+
else if (replayMode === 'same_session') {
|
|
145
|
+
const { driver } = await getDriver(session);
|
|
146
|
+
if (!driver)
|
|
147
|
+
replayResults.push({ name: res.name ?? 'suite', mode: replayMode, status: 'blocked', reason: 'no driver attached for same-session replay' });
|
|
148
|
+
else {
|
|
149
|
+
for (const c of res.compiledFlows.filter((f) => f.ok && f.flowPath)) {
|
|
150
|
+
const parsed = parseFlow(readFileSync(c.flowPath, 'utf8'));
|
|
151
|
+
if (!parsed.flow) {
|
|
152
|
+
replayResults.push({ name: c.name, mode: replayMode, status: 'failed', reason: parsed.errors.join('; ') });
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const r = await runFlow(sessions, session, driver, parsed.flow, { variables: sessions.inputVariables(session) });
|
|
156
|
+
replayResults.push({ name: c.name, mode: replayMode, status: r.passed ? 'passed' : 'failed', reason: r.reason });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else if (replayMode === 'fresh_state') {
|
|
161
|
+
const { driver } = await getDriver(session);
|
|
162
|
+
if (!stateProfile)
|
|
163
|
+
replayResults.push({ name: res.name ?? 'suite', mode: replayMode, status: 'blocked', reason: 'stateProfile is required for fresh_state replay' });
|
|
164
|
+
else if (!driver)
|
|
165
|
+
replayResults.push({ name: res.name ?? 'suite', mode: replayMode, status: 'blocked', reason: 'no driver attached for fresh-state replay' });
|
|
166
|
+
else {
|
|
167
|
+
const loaded = loadStateProfile(session.root, stateProfile);
|
|
168
|
+
if (!loaded.profile)
|
|
169
|
+
replayResults.push({ name: res.name ?? 'suite', mode: replayMode, status: 'blocked', reason: loaded.error ?? 'could not load state profile' });
|
|
170
|
+
else {
|
|
171
|
+
replayEvidence.stateProfile = loaded.profile.name;
|
|
172
|
+
replayEvidence.stateProfilePath = loaded.path ?? null;
|
|
173
|
+
const mutatingProfile = hasStateProfileMutation('prepare', loaded.profile, session) || hasStateProfileMutation('teardown', loaded.profile, session);
|
|
174
|
+
replayEvidence.consentRequired = mutatingProfile;
|
|
175
|
+
let mutationPayloadHash;
|
|
176
|
+
if (mutatingProfile) {
|
|
177
|
+
const prepareAffects = stateProfileAffects(session, 'prepare', loaded.profile, loaded.path);
|
|
178
|
+
const teardownAffects = stateProfileAffects(session, 'teardown', loaded.profile, loaded.path);
|
|
179
|
+
const affects = {
|
|
180
|
+
suite: res.name ?? 'suite',
|
|
181
|
+
replayMode,
|
|
182
|
+
compiledFlows: res.compiledFlows.map(compiledFlowIdentity),
|
|
183
|
+
suiteManifestPath: res.manifestPath ?? null,
|
|
184
|
+
suiteManifestHash: hashFile(res.manifestPath),
|
|
185
|
+
statePrepare: prepareAffects,
|
|
186
|
+
stateTeardown: teardownAffects,
|
|
187
|
+
};
|
|
188
|
+
mutationPayloadHash = hash(affects);
|
|
189
|
+
const risk = stateRisk('prepare', loaded.profile, session) === 'high' || stateRisk('teardown', loaded.profile, session) === 'high'
|
|
190
|
+
? 'high'
|
|
191
|
+
: stateRisk('prepare', loaded.profile, session) === 'medium' || stateRisk('teardown', loaded.profile, session) === 'medium'
|
|
192
|
+
? 'medium'
|
|
193
|
+
: 'low';
|
|
194
|
+
const gate = consumeConsent(consentId, approve, { action: 'suite_fresh_state_replay', affects });
|
|
195
|
+
if (!gate.approved) {
|
|
196
|
+
sessions.recordMutation(session, {
|
|
197
|
+
tool: 'qa_suite_generate',
|
|
198
|
+
action: 'suite_fresh_state_replay',
|
|
199
|
+
risk,
|
|
200
|
+
target: affects,
|
|
201
|
+
consent: { required: true, approved: false, payloadHash: mutationPayloadHash },
|
|
202
|
+
status: 'requested',
|
|
203
|
+
});
|
|
204
|
+
return requireConsent({
|
|
205
|
+
action: 'suite_fresh_state_replay',
|
|
206
|
+
risk,
|
|
207
|
+
exactCommand: `qa_suite_generate replay=fresh_state stateProfile=${loaded.profile.name}`,
|
|
208
|
+
affects,
|
|
209
|
+
explain: `Replay generated suite "${res.name ?? 'suite'}" from state profile "${loaded.profile.name}"? This can mutate app/device state through prepare/teardown before proving CI readiness.`,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
replayEvidence.consentApproved = true;
|
|
213
|
+
sessions.recordMutation(session, {
|
|
214
|
+
tool: 'qa_suite_generate',
|
|
215
|
+
action: 'suite_fresh_state_replay',
|
|
216
|
+
risk,
|
|
217
|
+
target: affects,
|
|
218
|
+
consent: { required: true, consentId, approved: true, payloadHash: mutationPayloadHash },
|
|
219
|
+
status: 'approved',
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
const ledgers = [];
|
|
223
|
+
const saveLedger = (action, ledger) => {
|
|
224
|
+
const uri = sessions.saveArtifact(session, 'state', `suite-${action}-${loaded.profile.name}-${Date.now()}.json`, JSON.stringify(ledger, null, 2), 'application/json', `suite fresh-state ${action} ledger`);
|
|
225
|
+
ledgers.push(uri);
|
|
226
|
+
replayEvidence.stateLedgerUris.push(uri);
|
|
227
|
+
};
|
|
228
|
+
const prepared = await prepareStateProfile(sessions, session, driver, loaded.profile);
|
|
229
|
+
saveLedger('prepare', prepared);
|
|
230
|
+
if (prepared.status === 'state_refused' || prepared.status === 'state_blocked') {
|
|
231
|
+
replayResults.push({ name: res.name ?? 'suite', mode: replayMode, status: 'blocked', reason: `state prepare ${prepared.status}; ledgers=${ledgers.join(',')}` });
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
const verified = await verifyStateProfile(driver, loaded.profile);
|
|
235
|
+
saveLedger('verify', verified);
|
|
236
|
+
if (verified.status === 'state_blocked') {
|
|
237
|
+
replayResults.push({ name: res.name ?? 'suite', mode: replayMode, status: 'blocked', reason: `state verify blocked; ledgers=${ledgers.join(',')}` });
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
for (const c of res.compiledFlows.filter((f) => f.ok && f.flowPath)) {
|
|
241
|
+
const parsed = parseFlow(readFileSync(c.flowPath, 'utf8'));
|
|
242
|
+
if (!parsed.flow) {
|
|
243
|
+
replayResults.push({ name: c.name, mode: replayMode, status: 'failed', reason: parsed.errors.join('; ') });
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
const r = await runFlow(sessions, session, driver, parsed.flow, { variables: sessions.inputVariables(session) });
|
|
247
|
+
replayResults.push({ name: c.name, mode: replayMode, status: r.passed ? 'passed' : 'failed', reason: r.reason });
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const tornDown = await teardownStateProfile(sessions, session, driver, loaded.profile);
|
|
252
|
+
saveLedger('teardown', tornDown);
|
|
253
|
+
if (mutatingProfile) {
|
|
254
|
+
const ok = replayResults.length > 0 && replayResults.every((r) => r.status === 'passed');
|
|
255
|
+
sessions.recordMutation(session, {
|
|
256
|
+
tool: 'qa_suite_generate',
|
|
257
|
+
action: 'suite_fresh_state_replay',
|
|
258
|
+
risk: stateRisk('prepare', loaded.profile, session),
|
|
259
|
+
target: { stateProfile: loaded.profile.name, suite: res.name ?? 'suite', ledgerUris: ledgers },
|
|
260
|
+
consent: { required: true, consentId, approved: true, payloadHash: mutationPayloadHash },
|
|
261
|
+
status: ok ? 'executed' : 'blocked',
|
|
262
|
+
ledgerUri: ledgers[0],
|
|
263
|
+
detail: ok ? 'fresh_state replay passed' : 'fresh_state replay did not pass',
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const replayPassed = replayResults.length > 0 && replayResults.every((r) => r.status === 'passed' || r.status === 'validated');
|
|
270
|
+
const ciReadyGate = {
|
|
271
|
+
compiled: res.suiteRunnable,
|
|
272
|
+
freshStateReplay: replayMode === 'fresh_state' && replayResults.length > 0 && replayResults.every((r) => r.status === 'passed'),
|
|
273
|
+
declaredStateProfile: replayMode === 'fresh_state' && !!stateProfile,
|
|
274
|
+
stateEvidence: replayMode === 'fresh_state' && replayEvidence.stateLedgerUris.length >= 2,
|
|
275
|
+
stableEvidence: replayMode === 'fresh_state' && replayResults.length > 0 && replayResults.every((r) => r.status === 'passed') && replayEvidence.stateLedgerUris.length >= 2,
|
|
276
|
+
};
|
|
277
|
+
const ciReady = Object.values(ciReadyGate).every(Boolean);
|
|
278
|
+
const suiteReplayed = (replayMode === 'same_session' || replayMode === 'fresh_state') && replayPassed;
|
|
279
|
+
const readinessLabels = readinessForSession(session, { suiteRunnable: res.suiteRunnable, suiteReplayed, ciReady });
|
|
280
|
+
if (!readinessLabels.includes('generated'))
|
|
281
|
+
readinessLabels.push('generated');
|
|
282
|
+
if (res.suiteRunnable && !readinessLabels.includes('compiled'))
|
|
283
|
+
readinessLabels.push('compiled');
|
|
284
|
+
if (suiteReplayed && !readinessLabels.includes('replayed'))
|
|
285
|
+
readinessLabels.push('replayed');
|
|
286
|
+
if (ciReady && !readinessLabels.includes('ci_ready'))
|
|
287
|
+
readinessLabels.push('ci_ready');
|
|
288
|
+
const readiness = readinessLabels.at(-1) ?? 'generated';
|
|
289
|
+
const written = res.manifestPath ? [...res.written] : res.written;
|
|
290
|
+
if (res.manifestPath) {
|
|
291
|
+
writeFileSync(res.manifestPath, JSON.stringify({
|
|
292
|
+
schema: 'swipium.suite.manifest.v1',
|
|
293
|
+
generatedAt: new Date(session.createdAt).toISOString(),
|
|
294
|
+
name: res.name,
|
|
295
|
+
suiteFile: 'suites/smoke.yaml',
|
|
296
|
+
readinessLabels,
|
|
297
|
+
readiness,
|
|
298
|
+
suiteRunnable: res.suiteRunnable,
|
|
299
|
+
replay: { mode: replayMode, results: replayResults, passed: replayPassed, evidence: replayEvidence },
|
|
300
|
+
ciReady,
|
|
301
|
+
ciReadyGate,
|
|
302
|
+
compiledFlows: res.compiledFlows.map((f) => ({ name: f.name, slug: f.slug, ok: f.ok, errors: f.errors, flowPath: f.flowPath ?? null, compiledPath: f.compiledPath ?? null })),
|
|
303
|
+
audit,
|
|
304
|
+
variables: res.variables ?? [],
|
|
305
|
+
}, null, 2));
|
|
306
|
+
}
|
|
307
|
+
// Plumb the ACTUAL replay outcome back into the written catalog (review item #5): the suite
|
|
308
|
+
// service writes the catalog before replay (honest `not_replayed`); once we have a real replay
|
|
309
|
+
// result, rewrite the YAML/MD so the committed test cases reflect proven replay status.
|
|
310
|
+
let finalTestCases = res.testCases;
|
|
311
|
+
if (res.manifestPath) {
|
|
312
|
+
const replayStatus = catalogReplayStatus(replayMode, replayResults, replayPassed);
|
|
313
|
+
if (replayStatus !== 'not_replayed') {
|
|
314
|
+
const { pom, flowName } = pomFor(session, name);
|
|
315
|
+
const tc = generateTestCases(pom, {
|
|
316
|
+
appId: appIdOf(session),
|
|
317
|
+
fixtures: session.fixtures,
|
|
318
|
+
notes: session.notes,
|
|
319
|
+
budgetProfile: session.budgetProfile,
|
|
320
|
+
replayStatus,
|
|
321
|
+
});
|
|
322
|
+
writeFiles(session, [
|
|
323
|
+
{ path: `testcases/${flowName}.cases.yaml`, content: tc.yaml },
|
|
324
|
+
{ path: `testcases/${flowName}.cases.md`, content: tc.markdown },
|
|
325
|
+
]);
|
|
326
|
+
finalTestCases = tc.cases;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
const summary = `✅ Suite "${res.name}" generated (${res.pages?.length ?? 0} pages, ${res.testCases?.length ?? 0} test case, suite + audit).\n` +
|
|
330
|
+
`durability: ${audit.durable} durable / ${audit.semi} semi / ${audit.brittle} brittle (${audit.brittlePct}% brittle)` +
|
|
331
|
+
(res.variables?.length ? `\nvariables: ${res.variables.join(', ')}` : '') +
|
|
332
|
+
(audit.brittle ? `\n⚠ ${audit.brittle} brittle locator(s) — see locators/locator-audit.json for app-code fixes.` : '') +
|
|
333
|
+
(written.length ? `\nwrote ${written.length} files under ${suiteDir(session)}` : `\n(preview — pass save:true to write)`) +
|
|
334
|
+
(res.compiledFlows.length ? `\ncompiled ${ranOk}/${res.compiledFlows.length} runnable flow(s) → run: swipium suite run (or qa_flow_run).` : `\nNext: qa_suite_compile to produce runnable Flow V2.`) +
|
|
335
|
+
`\nreplay gate (${replayMode}): ${replayPassed ? 'passed' : replayResults.length ? 'not proven' : 'not run'}; readiness=${readiness}; labels=${readinessLabels.join(' → ')}` +
|
|
336
|
+
(ciReady ? '\nci_ready: compiled + fresh-state replay + state evidence proved' : replayMode === 'fresh_state' ? `\nci_ready missing: ${Object.entries(ciReadyGate).filter(([, ok]) => !ok).map(([k]) => k).join(', ') || 'none'}` : '');
|
|
337
|
+
return qaOk({ name: res.name, pages: res.pages, audit, variables: res.variables, testCases: finalTestCases, written, manifestPath: res.manifestPath ?? null, compiledFlows: res.compiledFlows, suiteRunnable: res.suiteRunnable, replay: { mode: replayMode, results: replayResults, passed: replayPassed, evidence: replayEvidence }, readiness, readinessLabels, ciReady, ciReadyGate }, summary);
|
|
338
|
+
});
|
|
339
|
+
// ---- qa_testcase_generate ----
|
|
340
|
+
server.registerTool('qa_testcase_generate', {
|
|
341
|
+
title: 'Generate test case docs',
|
|
342
|
+
description: 'Generate an industry-style test case catalog (TC-xxx: purpose, priority, preconditions, steps, expected, automation status, known blockers, evidence) from this session\'s recorded actions + observed outcomes. Returns YAML + Markdown. Pass save:true to write under .swipium/testcases.',
|
|
343
|
+
inputSchema: {
|
|
344
|
+
sessionId: z.string(),
|
|
345
|
+
name: z.string().optional(),
|
|
346
|
+
format: z.enum(['yaml', 'markdown', 'both']).optional(),
|
|
347
|
+
save: z.boolean().optional(),
|
|
348
|
+
},
|
|
349
|
+
}, async ({ sessionId, name, format, save }) => {
|
|
350
|
+
const session = sessions.get(sessionId);
|
|
351
|
+
if (!session)
|
|
352
|
+
return qaError({ what: `Unknown sessionId ${sessionId}`, changedState: false, retrySafe: true, nextSteps: ['Call qa_start_session first.'] });
|
|
353
|
+
const noActions = requireActions(session);
|
|
354
|
+
if (noActions)
|
|
355
|
+
return noActions;
|
|
356
|
+
const { pom, flowName } = pomFor(session, name);
|
|
357
|
+
const tc = generateTestCases(pom, { appId: appIdOf(session), fixtures: session.fixtures, notes: session.notes, budgetProfile: session.budgetProfile });
|
|
358
|
+
const fmt = format ?? 'both';
|
|
359
|
+
const files = [];
|
|
360
|
+
if (fmt !== 'markdown')
|
|
361
|
+
files.push({ path: `testcases/${flowName}.cases.yaml`, content: tc.yaml });
|
|
362
|
+
if (fmt !== 'yaml')
|
|
363
|
+
files.push({ path: `testcases/${flowName}.cases.md`, content: tc.markdown });
|
|
364
|
+
const written = save ? writeFiles(session, files) : [];
|
|
365
|
+
const summary = `Generated ${tc.cases.length} test case(s): ${tc.cases.map((c) => `${c.id} ${c.title}`).join('; ')}` + (written.length ? `\nsaved under .swipium/testcases` : '');
|
|
366
|
+
return qaOk({ cases: tc.cases, yaml: fmt !== 'markdown' ? tc.yaml : undefined, markdown: fmt !== 'yaml' ? tc.markdown : undefined, written }, summary);
|
|
367
|
+
});
|
|
368
|
+
// ---- qa_suite_compile ----
|
|
369
|
+
server.registerTool('qa_suite_compile', {
|
|
370
|
+
title: 'Compile a POM suite to runnable flows',
|
|
371
|
+
description: 'Compile the generated POM suite (.swipium/suites/<suite>.yaml → its POM tests) into Flow V2 YAML that qa_flow_run and `swipium ci` can execute. Resolves page-object element refs to selectors, carries variables/secrets, and writes runnable flows to .swipium/flows/ (+ a readable copy under .swipium/compiled/). Validates each compiled flow through parseFlow and reports any errors. This is the step that makes a generated suite runnable, not just documentation.',
|
|
372
|
+
inputSchema: {
|
|
373
|
+
sessionId: z.string().optional(),
|
|
374
|
+
projectRoot: z.string().optional(),
|
|
375
|
+
suite: z.string().optional().describe('Suite file relative to .swipium/ (default suites/smoke.yaml).'),
|
|
376
|
+
},
|
|
377
|
+
}, async ({ sessionId, projectRoot, suite }) => {
|
|
378
|
+
let root;
|
|
379
|
+
if (sessionId)
|
|
380
|
+
root = sessions.get(sessionId)?.root;
|
|
381
|
+
root = root ?? projectRoot;
|
|
382
|
+
if (!root)
|
|
383
|
+
return qaError({ what: 'No project root', changedState: false, retrySafe: true, nextSteps: ['Pass sessionId or projectRoot.'] });
|
|
384
|
+
const result = compileSuite(root, suite ?? 'suites/smoke.yaml');
|
|
385
|
+
if (result.errors.length && result.flows.length === 0) {
|
|
386
|
+
return qaError({ what: `Could not compile suite: ${result.errors.join('; ')}`, changedState: false, retrySafe: true, nextSteps: ['Generate a suite first: qa_suite_generate, then qa_suite_compile.'] });
|
|
387
|
+
}
|
|
388
|
+
const flowsDir = join(root, '.swipium', 'flows');
|
|
389
|
+
const compiledDir = join(root, '.swipium', 'compiled');
|
|
390
|
+
mkdirSync(flowsDir, { recursive: true });
|
|
391
|
+
mkdirSync(compiledDir, { recursive: true });
|
|
392
|
+
const compiled = result.flows.map((f) => {
|
|
393
|
+
const slug = f.name.replace(/[^\w.-]+/g, '-');
|
|
394
|
+
const parse = f.yaml ? parseFlow(f.yaml) : { errors: ['empty'] };
|
|
395
|
+
const ok = !!f.yaml && parse.errors.length === 0 && f.errors.length === 0;
|
|
396
|
+
let flowPath;
|
|
397
|
+
let compiledPath;
|
|
398
|
+
if (ok) {
|
|
399
|
+
flowPath = join(flowsDir, `${slug}.yaml`); // discoverable by `swipium ci --flow <slug>`
|
|
400
|
+
compiledPath = join(compiledDir, `${slug}.flow.yaml`);
|
|
401
|
+
writeFileSync(flowPath, f.yaml);
|
|
402
|
+
writeFileSync(compiledPath, f.yaml);
|
|
403
|
+
}
|
|
404
|
+
return { name: f.name, slug, ok, variables: f.variables, errors: [...f.errors, ...parse.errors], flowPath, compiledPath };
|
|
405
|
+
});
|
|
406
|
+
const okCount = compiled.filter((c) => c.ok).length;
|
|
407
|
+
const summary = `Compiled ${okCount}/${compiled.length} flow(s) from ${result.suite}.\n` +
|
|
408
|
+
compiled.map((c) => ` ${c.ok ? '✓' : '✗'} ${c.name}${c.ok ? ` → flows/${c.slug}.yaml (run: swipium ci --flow ${c.slug})` : `: ${c.errors.join('; ')}`}`).join('\n');
|
|
409
|
+
return qaOk({ suite: result.suite, flows: compiled, okCount }, summary);
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=suite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suite.js","sourceRoot":"","sources":["../../src/tools/suite.ts"],"names":[],"mappings":"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"}
|