@copado/agentia-cli 1.1.0 → 1.3.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/CHANGELOG.md +69 -0
- package/README.md +3290 -2095
- package/dist/commands/ai/agent/ask.js +4 -4
- package/dist/commands/ai/agent/chat.js +4 -4
- package/dist/commands/auth/get.js +21 -1
- package/dist/commands/auth/set.js +13 -0
- package/dist/commands/auth/unset.js +37 -0
- package/dist/commands/cicd/cloud/commit.js +2 -2
- package/dist/commands/cicd/cloud/promote.js +19 -5
- package/dist/commands/cicd/credential/auth/status.js +38 -0
- package/dist/commands/cicd/credential/auth/web/login.js +54 -0
- package/dist/commands/cicd/credential/create.js +2 -2
- package/dist/commands/cicd/credential/list.js +15 -19
- package/dist/commands/cicd/credential/open.js +30 -0
- package/dist/commands/cicd/credential/update.js +11 -14
- package/dist/commands/cicd/data/commit/create.js +2 -2
- package/dist/commands/cicd/data/commit/list.js +2 -2
- package/dist/commands/cicd/data/dataset-file/content.js +2 -2
- package/dist/commands/cicd/data/dataset-file/list.js +2 -2
- package/dist/commands/cicd/data/filter/add.js +2 -2
- package/dist/commands/cicd/data/filter/delete.js +2 -2
- package/dist/commands/cicd/data/filter/list.js +2 -2
- package/dist/commands/cicd/data/filter/update.js +2 -2
- package/dist/commands/cicd/data/formula/create.js +2 -2
- package/dist/commands/cicd/data/formula/list.js +2 -2
- package/dist/commands/cicd/data/formula/update.js +2 -2
- package/dist/commands/cicd/data/records/match.js +2 -2
- package/dist/commands/cicd/data/records/search.js +2 -2
- package/dist/commands/cicd/data/sobject/fields.js +2 -2
- package/dist/commands/cicd/data/sobject/relationships.js +2 -2
- package/dist/commands/cicd/data/sync/apply.js +2 -2
- package/dist/commands/cicd/data/sync/preview-updates.js +2 -2
- package/dist/commands/cicd/data/template/convert-old.js +2 -2
- package/dist/commands/cicd/data/template/create.js +2 -2
- package/dist/commands/cicd/data/template/delete.js +2 -2
- package/dist/commands/cicd/data/template/get-detail.js +2 -2
- package/dist/commands/cicd/data/template/get.js +2 -2
- package/dist/commands/cicd/data/template/list.js +2 -2
- package/dist/commands/cicd/data/template/open.js +2 -2
- package/dist/commands/cicd/data/template/save-detail.js +2 -2
- package/dist/commands/cicd/environment/auth/status.js +36 -15
- package/dist/commands/cicd/environment/auth/web/login.js +22 -6
- package/dist/commands/cicd/environment/create.js +2 -2
- package/dist/commands/cicd/environment/get.js +2 -2
- package/dist/commands/cicd/environment/list.js +2 -2
- package/dist/commands/cicd/environment/open.js +8 -24
- package/dist/commands/cicd/environment/update.js +2 -2
- package/dist/commands/cicd/extension/create.js +2 -2
- package/dist/commands/cicd/extension/install.js +2 -2
- package/dist/commands/cicd/extension/package.js +2 -2
- package/dist/commands/cicd/extension/publish.js +2 -2
- package/dist/commands/cicd/extension/uninstall.js +2 -2
- package/dist/commands/cicd/extension/validate.js +2 -2
- package/dist/commands/cicd/extension-configuration/get.js +24 -0
- package/dist/commands/cicd/extension-configuration/list.js +49 -0
- package/dist/commands/cicd/extension-configuration/open.js +38 -0
- package/dist/commands/cicd/function/defaults.js +2 -2
- package/dist/commands/cicd/function/delete.js +2 -2
- package/dist/commands/cicd/function/get.js +2 -2
- package/dist/commands/cicd/function/list.js +2 -2
- package/dist/commands/cicd/function/open.js +2 -2
- package/dist/commands/cicd/function/result/get.js +2 -2
- package/dist/commands/cicd/function/result/log/get.js +2 -2
- package/dist/commands/cicd/function/run-local.js +2 -2
- package/dist/commands/cicd/function/run.js +2 -2
- package/dist/commands/cicd/function/upsert.js +2 -2
- package/dist/commands/cicd/health-check.js +2 -2
- package/dist/commands/cicd/job/get.js +2 -2
- package/dist/commands/cicd/job/kill.js +2 -2
- package/dist/commands/cicd/job/list.js +2 -2
- package/dist/commands/cicd/job/log/get.js +2 -2
- package/dist/commands/cicd/job/open.js +2 -2
- package/dist/commands/cicd/job/pause.js +2 -2
- package/dist/commands/cicd/job/result-file/get.js +2 -2
- package/dist/commands/cicd/job/result-file/list.js +2 -2
- package/dist/commands/cicd/job/resume.js +2 -2
- package/dist/commands/cicd/job/run.js +2 -2
- package/dist/commands/cicd/metadata/content/compare.js +2 -2
- package/dist/commands/cicd/metadata/content/get.js +3 -3
- package/dist/commands/cicd/metadata/dependency/list.js +45 -22
- package/dist/commands/cicd/metadata/explore.js +81 -0
- package/dist/commands/cicd/metadata/index/compare.js +2 -2
- package/dist/commands/cicd/metadata/list.js +5 -5
- package/dist/commands/cicd/metadata/refresh/deleted.js +3 -3
- package/dist/commands/cicd/metadata/refresh/run.js +4 -4
- package/dist/commands/cicd/metadata/refresh/status.js +4 -4
- package/dist/commands/cicd/notification/configure.js +2 -2
- package/dist/commands/cicd/notification/get.js +2 -2
- package/dist/commands/cicd/pipeline/automation/activate.js +39 -0
- package/dist/commands/cicd/pipeline/automation/create.js +33 -0
- package/dist/commands/cicd/pipeline/automation/deactivate.js +39 -0
- package/dist/commands/cicd/pipeline/automation/delete.js +45 -0
- package/dist/commands/cicd/pipeline/automation/get.js +32 -0
- package/dist/commands/cicd/pipeline/automation/list.js +38 -0
- package/dist/commands/cicd/pipeline/automation/open.js +38 -0
- package/dist/commands/cicd/pipeline/automation/update.js +38 -0
- package/dist/commands/cicd/pipeline/connection/create.js +2 -2
- package/dist/commands/cicd/pipeline/connection/delete.js +2 -2
- package/dist/commands/cicd/pipeline/connection/list.js +2 -2
- package/dist/commands/cicd/pipeline/connection/open.js +2 -2
- package/dist/commands/cicd/pipeline/connection/update.js +2 -2
- package/dist/commands/cicd/pipeline/create.js +2 -2
- package/dist/commands/cicd/pipeline/get.js +2 -2
- package/dist/commands/cicd/pipeline/list.js +2 -2
- package/dist/commands/cicd/pipeline/open.js +2 -2
- package/dist/commands/cicd/pipeline/quality-gate/activate.js +39 -0
- package/dist/commands/cicd/pipeline/quality-gate/create.js +34 -0
- package/dist/commands/cicd/pipeline/quality-gate/deactivate.js +39 -0
- package/dist/commands/cicd/pipeline/quality-gate/delete.js +45 -0
- package/dist/commands/cicd/pipeline/quality-gate/get.js +32 -0
- package/dist/commands/cicd/pipeline/quality-gate/list.js +34 -0
- package/dist/commands/cicd/pipeline/quality-gate/open.js +38 -0
- package/dist/commands/cicd/pipeline/quality-gate/update.js +38 -0
- package/dist/commands/cicd/pipeline/stage-connection/create.js +2 -2
- package/dist/commands/cicd/pipeline/stage-connection/delete.js +2 -2
- package/dist/commands/cicd/pipeline/stage-connection/list.js +2 -2
- package/dist/commands/cicd/pipeline/stage-connection/open.js +2 -2
- package/dist/commands/cicd/pipeline/stage-connection/update.js +2 -2
- package/dist/commands/cicd/pipeline/update.js +2 -2
- package/dist/commands/cicd/project/create.js +2 -2
- package/dist/commands/cicd/project/default/get.js +2 -2
- package/dist/commands/cicd/project/default/set.js +2 -2
- package/dist/commands/cicd/project/default/unset.js +2 -2
- package/dist/commands/cicd/project/delete.js +2 -2
- package/dist/commands/cicd/project/get.js +2 -2
- package/dist/commands/cicd/project/list.js +2 -2
- package/dist/commands/cicd/project/open.js +2 -2
- package/dist/commands/cicd/project/update.js +2 -2
- package/dist/commands/cicd/promotion/conflict/get.js +2 -2
- package/dist/commands/cicd/promotion/conflict/list.js +2 -2
- package/dist/commands/cicd/promotion/conflict/resolve.js +2 -2
- package/dist/commands/cicd/promotion/conflict/unresolve.js +2 -2
- package/dist/commands/cicd/promotion/get.js +2 -2
- package/dist/commands/cicd/promotion/job-step/update.js +2 -2
- package/dist/commands/cicd/promotion/list.js +2 -2
- package/dist/commands/cicd/promotion/open.js +2 -2
- package/dist/commands/cicd/promotion/queue/list.js +28 -0
- package/dist/commands/cicd/promotion/queue/remove.js +37 -0
- package/dist/commands/cicd/promotion/run.js +2 -2
- package/dist/commands/cicd/repository/auth/https/configure.js +2 -2
- package/dist/commands/cicd/repository/auth/oauth/login.js +2 -2
- package/dist/commands/cicd/repository/auth/setup.js +2 -2
- package/dist/commands/cicd/repository/auth/ssh/configure.js +2 -2
- package/dist/commands/cicd/repository/create.js +2 -2
- package/dist/commands/cicd/repository/delete.js +2 -2
- package/dist/commands/cicd/repository/get.js +2 -2
- package/dist/commands/cicd/repository/list.js +2 -2
- package/dist/commands/cicd/repository/open.js +2 -2
- package/dist/commands/cicd/repository/reset.js +2 -2
- package/dist/commands/cicd/repository/update.js +2 -2
- package/dist/commands/cicd/repository/validate.js +2 -2
- package/dist/commands/cicd/stage/create.js +2 -2
- package/dist/commands/cicd/stage/delete.js +2 -2
- package/dist/commands/cicd/stage/get.js +2 -2
- package/dist/commands/cicd/stage/list.js +2 -2
- package/dist/commands/cicd/stage/open.js +2 -2
- package/dist/commands/cicd/stage/update.js +2 -2
- package/dist/commands/cicd/template/defaults.js +2 -2
- package/dist/commands/cicd/template/delete.js +2 -2
- package/dist/commands/cicd/template/get.js +2 -2
- package/dist/commands/cicd/template/list.js +2 -2
- package/dist/commands/cicd/template/upsert.js +2 -2
- package/dist/commands/cicd/user/get.js +2 -2
- package/dist/commands/cicd/work/ahead-behind.js +2 -2
- package/dist/commands/cicd/work/create.js +3 -2
- package/dist/commands/cicd/work/delete.js +2 -2
- package/dist/commands/cicd/work/deployment-step/create.js +2 -2
- package/dist/commands/cicd/work/deployment-step/delete.js +2 -2
- package/dist/commands/cicd/work/deployment-step/list.js +2 -2
- package/dist/commands/cicd/work/deployment-step/reorder.js +2 -2
- package/dist/commands/cicd/work/deployment-step/salesforce-flows.js +2 -2
- package/dist/commands/cicd/work/deployment-step/types.js +2 -2
- package/dist/commands/cicd/work/deployment-step/update.js +2 -2
- package/dist/commands/cicd/work/done.js +2 -2
- package/dist/commands/cicd/work/environment-sync.js +10 -9
- package/dist/commands/cicd/work/get.js +2 -2
- package/dist/commands/cicd/work/list.js +2 -2
- package/dist/commands/cicd/work/open.js +2 -2
- package/dist/commands/cicd/work/promote.js +2 -2
- package/dist/commands/cicd/work/publish.js +2 -2
- package/dist/commands/cicd/work/push.js +2 -2
- package/dist/commands/cicd/work/set.js +8 -6
- package/dist/commands/cicd/work/status.js +2 -2
- package/dist/commands/cicd/work/submit.js +5 -4
- package/dist/commands/cicd/work/test/apex.js +2 -2
- package/dist/commands/cicd/work/test.js +2 -2
- package/dist/commands/cicd/work/update.js +3 -2
- package/dist/commands/help-agent.js +15 -0
- package/dist/commands/help.js +38 -0
- package/dist/commands/history/clear.js +42 -0
- package/dist/commands/history/list.js +50 -0
- package/dist/commands/plugins/install.js +2 -5
- package/dist/commands/setup/skills/create.js +28 -2
- package/dist/commands/setup/skills/list.js +55 -0
- package/dist/commands/setup/skills/update.js +36 -3
- package/dist/commands/setup.js +3 -3
- package/dist/commands/support.js +15 -0
- package/dist/commands/testing/browser/execute.js +49 -0
- package/dist/commands/testing/browser/history.js +49 -0
- package/dist/commands/testing/browser/inspect.js +35 -0
- package/dist/commands/testing/browser/recorder.js +52 -0
- package/dist/commands/testing/browser/reports.js +33 -0
- package/dist/commands/testing/browser/screenshot.js +27 -0
- package/dist/commands/testing/browser/set-options.js +35 -0
- package/dist/commands/testing/browser/start.js +51 -0
- package/dist/commands/testing/browser/status.js +26 -0
- package/dist/commands/testing/browser/stop.js +34 -0
- package/dist/commands/testing/browser/view.js +35 -0
- package/dist/commands/testing/data-table/create.js +1 -2
- package/dist/commands/testing/data-table/delete.js +1 -2
- package/dist/commands/testing/data-table/export.js +2 -6
- package/dist/commands/testing/data-table/get.js +2 -4
- package/dist/commands/testing/data-table/list.js +1 -2
- package/dist/commands/testing/data-table/update.js +3 -4
- package/dist/commands/testing/job/create.js +26 -22
- package/dist/commands/testing/job/delete.js +2 -2
- package/dist/commands/testing/job/files/download.js +73 -0
- package/dist/commands/testing/job/files/list.js +43 -0
- package/dist/commands/testing/job/{upload.js → files/upload.js} +13 -9
- package/dist/commands/testing/job/get.js +2 -2
- package/dist/commands/testing/job/list.js +1 -1
- package/dist/commands/testing/job/refs.js +4 -4
- package/dist/commands/testing/job/run.js +134 -1
- package/dist/commands/testing/{build → job/runs}/abort.js +10 -8
- package/dist/commands/testing/job/runs/get.js +42 -0
- package/dist/commands/testing/{build → job/runs}/list.js +19 -10
- package/dist/commands/testing/{logs.js → job/runs/logs.js} +9 -6
- package/dist/commands/testing/{build → job/runs}/search.js +9 -7
- package/dist/commands/testing/job/schedule/get.js +5 -11
- package/dist/commands/testing/job/schedule/remove.js +3 -3
- package/dist/commands/testing/job/schedule/set.js +3 -3
- package/dist/commands/testing/job/update.js +22 -65
- package/dist/commands/testing/project/create.js +1 -17
- package/dist/commands/testing/project/get.js +0 -1
- package/dist/commands/testing/project/list.js +2 -2
- package/dist/commands/testing/project/permission/set.js +3 -7
- package/dist/commands/testing/project/permission/update.js +2 -2
- package/dist/commands/testing/robot/create.js +22 -25
- package/dist/commands/testing/robot/get.js +1 -1
- package/dist/commands/testing/robot/list.js +3 -3
- package/dist/commands/testing/robot/update.js +3 -3
- package/dist/commands/testing/user-parameter/create.js +3 -9
- package/dist/commands/testing/user-parameter/update.js +1 -7
- package/dist/commands/testing/variable/create.js +4 -9
- package/dist/commands/testing/variable/list.js +3 -3
- package/dist/commands/testing/variable/update.js +5 -12
- package/dist/help.js +17 -0
- package/dist/hooks/init/cicd-connection.js +59 -0
- package/dist/lib/agentia-command.js +69 -6
- package/dist/lib/ai-types.js +2 -1
- package/dist/lib/cicd-command.js +3 -0
- package/dist/lib/cicd-connection.js +22 -0
- package/dist/lib/cicd-gateway.js +2 -1
- package/dist/lib/claude-mcp-config.js +15 -0
- package/dist/lib/command-history-sanitization.js +9 -0
- package/dist/lib/command-history.js +11 -0
- package/dist/lib/command-output-buffer.js +6 -1
- package/dist/lib/credential-sync.js +1 -2
- package/dist/lib/defaults-store.js +6 -1
- package/dist/lib/dependency-from-changes.js +3 -1
- package/dist/lib/dependency-source-context.js +3 -0
- package/dist/lib/environment-auth-status.js +2 -1
- package/dist/lib/environment-auth.js +2 -1
- package/dist/lib/environment-credential-flags.js +3 -1
- package/dist/lib/environment-credential-operations.js +8 -2
- package/dist/lib/environment-types.js +3 -1
- package/dist/lib/extension-configuration-ops.js +4 -0
- package/dist/lib/extension-configuration-sanitize.js +7 -0
- package/dist/lib/extension-configuration-types.js +8 -0
- package/dist/lib/help-agent-command.js +3 -0
- package/dist/lib/help-agent-interaction-history.js +10 -0
- package/dist/lib/help-agent-session.js +3 -0
- package/dist/lib/http-proxy.js +13 -0
- package/dist/lib/mcp/ai-tools.js +3 -3
- package/dist/lib/mcp/command-id.js +2 -0
- package/dist/lib/mcp/pipeline-automation-quality-tools.js +452 -0
- package/dist/lib/mcp/result.js +41 -3
- package/dist/lib/mcp/server.js +73 -3
- package/dist/lib/mcp/testing-browser-tools.js +194 -0
- package/dist/lib/mcp/testing-tools.js +242 -552
- package/dist/lib/mcp/tool-annotations.js +59 -30
- package/dist/lib/mcp/tools.js +202 -66
- package/dist/lib/mcp/work-tools.js +18 -4
- package/dist/lib/metadata-explore.js +8 -0
- package/dist/lib/network-error.js +8 -0
- package/dist/lib/pipeline-automation-flags.js +12 -0
- package/dist/lib/pipeline-automation-ops.js +9 -0
- package/dist/lib/pipeline-automation-types.js +18 -0
- package/dist/lib/pipeline-lifecycle-id.js +3 -0
- package/dist/lib/pipeline-quality-gate-flags.js +12 -0
- package/dist/lib/pipeline-quality-gate-ops.js +9 -0
- package/dist/lib/pipeline-quality-gate-types.js +17 -0
- package/dist/lib/plugin-host/ai.js +2 -1
- package/dist/lib/plugin-skills.js +22 -0
- package/dist/lib/plugin-trust/gate.js +1 -2
- package/dist/lib/project-root.js +3 -1
- package/dist/lib/promotion-queue.js +5 -0
- package/dist/lib/promotion-run.js +2 -1
- package/dist/lib/runtime.js +1 -1
- package/dist/lib/salesforce-tooling-check.js +6 -0
- package/dist/lib/skill-packs.js +7 -0
- package/dist/lib/support-ai-context.js +11 -0
- package/dist/lib/support-ai-stream-parser.js +4 -0
- package/dist/lib/support-ai.js +9 -0
- package/dist/lib/testing-archive.js +9 -0
- package/dist/lib/testing-browser-command.js +6 -0
- package/dist/lib/testing-browser-operations.js +17 -0
- package/dist/lib/testing-browser-requests.js +11 -0
- package/dist/lib/testing-browser-robot.js +9 -0
- package/dist/lib/testing-browser-session.js +14 -0
- package/dist/lib/testing-browser-state.js +17 -0
- package/dist/lib/testing-browser-stream.js +7 -0
- package/dist/lib/testing-browser-types.js +3 -0
- package/dist/lib/testing-browser-viewer-key.js +7 -0
- package/dist/lib/testing-data-table.js +39 -0
- package/dist/lib/testing-execution.js +22 -0
- package/dist/lib/testing-flags.js +6 -2
- package/dist/lib/testing-gateway.js +5 -1
- package/dist/lib/testing-operations.js +9 -4
- package/dist/lib/testing-sanitization.js +3 -1
- package/dist/lib/testing-secret-input.js +2 -1
- package/dist/lib/testing-types.js +24 -3
- package/dist/lib/work-environment-sync.js +3 -1
- package/dist/lib/work-flags.js +6 -1
- package/dist/lib/work-local-development-flow.js +4 -0
- package/dist/lib/work-promote.js +2 -1
- package/dist/lib/work-submit-wait.js +3 -1
- package/oclif.manifest.json +8841 -7469
- package/package.json +45 -5
- package/templates/skills/agentia-ai/SKILL.md +9 -6
- package/templates/skills/agentia-ai/references/ai-agents.md +21 -3
- package/templates/skills/agentia-cicd/SKILL.md +8 -5
- package/templates/skills/agentia-cicd/references/environments-and-credentials.md +35 -13
- package/templates/skills/agentia-cicd/references/extensions.md +3 -0
- package/templates/skills/agentia-cicd/references/pipelines.md +36 -2
- package/templates/skills/agentia-cicd/references/promotions.md +10 -1
- package/templates/skills/agentia-cicd/references/work.md +20 -5
- package/templates/skills/agentia-metadata/SKILL.md +146 -0
- package/templates/skills/agentia-metadata/references/metadata-dependency.md +70 -0
- package/templates/skills/agentia-metadata/references/metadata-explore.md +146 -0
- package/templates/skills/agentia-testing/SKILL.md +12 -7
- package/templates/skills/agentia-testing/references/browser-testing.md +93 -0
- package/templates/skills/agentia-testing/references/flow-automation.md +112 -0
- package/templates/skills/agentia-testing/references/qforce.md +88 -0
- package/templates/skills/agentia-testing/references/qweb.md +103 -0
- package/templates/skills/agentia-testing/references/tests.md +31 -23
- package/dist/commands/testing/build/get.js +0 -38
- package/dist/commands/testing/build/latest.js +0 -40
- package/dist/commands/testing/build/logs.js +0 -47
- package/dist/commands/testing/build/run.js +0 -26
- package/dist/commands/testing/create.js +0 -2
- package/dist/commands/testing/job/download.js +0 -54
- package/dist/commands/testing/job/files.js +0 -34
- package/dist/commands/testing/live/continue.js +0 -21
- package/dist/commands/testing/live/execute.js +0 -43
- package/dist/commands/testing/live/history.js +0 -35
- package/dist/commands/testing/live/inspect.js +0 -30
- package/dist/commands/testing/live/interrupt.js +0 -21
- package/dist/commands/testing/live/recorder.js +0 -134
- package/dist/commands/testing/live/reports.js +0 -31
- package/dist/commands/testing/live/screenshot.js +0 -25
- package/dist/commands/testing/live/set-options.js +0 -28
- package/dist/commands/testing/live/start.js +0 -53
- package/dist/commands/testing/live/status.js +0 -27
- package/dist/commands/testing/live/stop.js +0 -38
- package/dist/commands/testing/live/view.js +0 -36
- package/dist/commands/testing/run.js +0 -26
- package/dist/commands/testing/status.js +0 -45
- package/dist/commands/testing/test/create.js +0 -2
- package/dist/commands/testing/test/logs.js +0 -2
- package/dist/commands/testing/test/run.js +0 -26
- package/dist/commands/testing/test/status.js +0 -2
- package/dist/commands/testing/test/update.js +0 -2
- package/dist/commands/testing/update.js +0 -65
- package/dist/lib/mcp/testing-live-tools.js +0 -215
- package/dist/lib/testing-data-command.js +0 -8
- package/dist/lib/testing-data-core.js +0 -20
- package/dist/lib/testing-data-export.js +0 -6
- package/dist/lib/testing-data-import.js +0 -6
- package/dist/lib/testing-data-io.js +0 -12
- package/dist/lib/testing-data-operations.js +0 -10
- package/dist/lib/testing-data-types.js +0 -4
- package/dist/lib/testing-live-command.js +0 -6
- package/dist/lib/testing-live-endpoints.js +0 -6
- package/dist/lib/testing-live-history.js +0 -7
- package/dist/lib/testing-live-operations.js +0 -19
- package/dist/lib/testing-live-recorder.js +0 -9
- package/dist/lib/testing-live-robot.js +0 -9
- package/dist/lib/testing-live-state.js +0 -5
- package/dist/lib/testing-live-types.js +0 -3
- package/dist/lib/testing-run-command.js +0 -3
- package/dist/lib/testing-schedule.js +0 -5
- package/dist/lib/testing-session.js +0 -5
- package/dist/lib/testing-watch.js +0 -4
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
<!-- Agentia managed skill file: agentia setup skills -->
|
|
2
|
+
|
|
3
|
+
# QForce & Salesforce Lightning Reference for CRT
|
|
4
|
+
|
|
5
|
+
QForce is Copado Robotic Testing's Salesforce keyword library. It is a superset of [QWeb](qweb.md): all QWeb keywords (`ClickText`, `TypeText`, `VerifyText`, `UseTable`, etc.) work unchanged, and QForce adds Salesforce Lightning-aware locators and keywords on top.
|
|
6
|
+
|
|
7
|
+
To start a Salesforce browser session:
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
agentia testing browser start <job-id> --project <project-id> --library QForce --json
|
|
11
|
+
agentia testing browser execute --project <project-id> --line "SetConfig PartialMatch False" --json
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
When these Salesforce-specific rules conflict with generic QWeb text-first guidance, **the Salesforce rule wins**.
|
|
15
|
+
|
|
16
|
+
## Mandatory Salesforce Rules
|
|
17
|
+
|
|
18
|
+
1. **Always normalize app state with `LaunchApp`**:
|
|
19
|
+
Immediately after login—and before any app-specific click, tab navigation, or assertion—run:
|
|
20
|
+
```robotframework
|
|
21
|
+
LaunchApp Sales
|
|
22
|
+
```
|
|
23
|
+
`LaunchApp` is idempotent: it checks the active Lightning app and only opens the App Launcher when needed. Never skip it just because the right app appears open, and do not replace it with manual clicks on the App Launcher waffle icon.
|
|
24
|
+
2. **Verify Record Details with `VerifyField`, never `VerifyText`**:
|
|
25
|
+
Lightning record pages contain repeated labels in headers, related lists, and activity timelines, causing `VerifyText` to pass for the wrong reason.
|
|
26
|
+
3. **Three dropdown families require three distinct keywords**:
|
|
27
|
+
- Native HTML `<select>` -> `DropDown <label> <value>`
|
|
28
|
+
- Lightning custom picklist (button/div/listbox widget) -> `PickList <label> <value>`
|
|
29
|
+
- Lookup / searchable combobox (`input` with `role="combobox"`) -> `ComboBox <locator> <value> timeout=10`
|
|
30
|
+
4. **Lookups (`ComboBox`) only select existing records**:
|
|
31
|
+
Never finish a lookup field with `TypeText` (typed text is not a selected record). If the target record does not exist, use the nested `New <Object>` creation flow.
|
|
32
|
+
5. **Never hard-code org-specific Lightning URLs or record IDs**:
|
|
33
|
+
Navigate via `LaunchApp` and object tabs so tests survive sandbox refreshes. Store credentials in CRT Variables (`testing variable`) or User Parameters (`testing user-parameter`) and type secrets with `TypeSecret`.
|
|
34
|
+
|
|
35
|
+
## QForce Keyword Catalog
|
|
36
|
+
|
|
37
|
+
In `.robot` files and `testing browser execute`, always use `KeywordCase` (`LaunchApp`, `VerifyField`, `PickList`, `ComboBox`). Separate arguments with 4+ spaces.
|
|
38
|
+
|
|
39
|
+
| Keyword | Form | When to Use |
|
|
40
|
+
| --- | --- | --- |
|
|
41
|
+
| `LaunchApp` | `LaunchApp <Exact App Name>` | Open a Salesforce Lightning app via the App Launcher by exact name (`Sales`, `Service`). |
|
|
42
|
+
| `VerifyField` | `VerifyField <label> <expected>` | Assert a plain-text field value on a Record Details page (`VerifyField Phone 123456789`). |
|
|
43
|
+
| `VerifyField` (link) | `VerifyField <label> <expected> tag=a` | Assert a linked field value (lookup, owner, related record: `VerifyField Account Name Acme tag=a`). |
|
|
44
|
+
| `VerifyField` (indexed) | `VerifyField <label> <expected> <index> [tag=a]` | Disambiguate when the same field label appears multiple times on the Details page. Discover `<index>` with `GetFieldValue` first. |
|
|
45
|
+
| `GetFieldValue` | `GetFieldValue <label> [index]` | Read the value of the Nth field with `<label>` to discover which index to pass to `VerifyField`. |
|
|
46
|
+
| `PickList` | `PickList <label> <value> [index=1] [timeout=0]` | Select an option from a Lightning custom picklist (`PickList Stage Closed Won`). |
|
|
47
|
+
| `ComboBox` | `ComboBox <locator> <value> timeout=10` | Search and select an **existing** record in a Lightning lookup/combobox (`ComboBox Account Name Acme timeout=10` or `ComboBox Search Accounts... Acme timeout=10`). |
|
|
48
|
+
|
|
49
|
+
## Record Details Verification Ladder
|
|
50
|
+
|
|
51
|
+
On a Salesforce record's **Details** tab, follow this order:
|
|
52
|
+
|
|
53
|
+
1. **Plain field**: `VerifyField <label> <expected>`
|
|
54
|
+
2. **Linked field (lookup/owner)**: `VerifyField <label> <expected> tag=a`
|
|
55
|
+
3. **Duplicate field label on page**: Probe indexes with `GetFieldValue`, then assert with indexed `VerifyField`:
|
|
56
|
+
```robotframework
|
|
57
|
+
GetFieldValue Account Name 1
|
|
58
|
+
GetFieldValue Account Name 2
|
|
59
|
+
VerifyField Account Name Acme Corp 2 tag=a
|
|
60
|
+
```
|
|
61
|
+
4. **Never use `VerifyText` as the primary Details assertion**, and do not assert on ephemeral toast messages (toasts vanish quickly; verify the saved record's Details instead).
|
|
62
|
+
|
|
63
|
+
## Lookup Fields & Nested Record Creation
|
|
64
|
+
|
|
65
|
+
When filling a lookup field (such as `Account Name` on a Contact or Opportunity):
|
|
66
|
+
|
|
67
|
+
- **If the target record exists**:
|
|
68
|
+
```robotframework
|
|
69
|
+
ComboBox Account Name Acme Corp timeout=10
|
|
70
|
+
ClickText Save
|
|
71
|
+
ClickText Details
|
|
72
|
+
VerifyField Account Name Acme Corp tag=a
|
|
73
|
+
```
|
|
74
|
+
- **If `ComboBox` fails (`Could not find combobox ... with value ...`) or the record does not exist**:
|
|
75
|
+
Do not retry `ComboBox` in a loop and do not leave raw `TypeText` in the input. Trigger the nested `New <Object>` modal from the lookup instead:
|
|
76
|
+
```robotframework
|
|
77
|
+
ClickText Account Name
|
|
78
|
+
ClickText New Account
|
|
79
|
+
TypeText Account Name Acme Corp
|
|
80
|
+
ClickText Save
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Recognising Dropdown Types via `testing browser inspect`
|
|
84
|
+
|
|
85
|
+
When unsure whether a field uses `DropDown`, `PickList`, or `ComboBox`, run `agentia testing browser inspect --project <project-id> --json` and check the element in `systemState`:
|
|
86
|
+
- `elementType: "select"` -> `DropDown`
|
|
87
|
+
- Clickable button/div showing the current picklist value (not an `input`) -> `PickList`
|
|
88
|
+
- `elementType: "input"` with `role: "combobox"` or placeholder `Search ...` -> `ComboBox`
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
<!-- Agentia managed skill file: agentia setup skills -->
|
|
2
|
+
|
|
3
|
+
# QWeb Keyword Reference for CRT
|
|
4
|
+
|
|
5
|
+
QWeb is the web-automation Robot Framework library used by Copado Robotic Testing in `.robot` suites (`agentia testing job run`) and browser sessions (`agentia testing browser start <job-id> --project <project-id>`).
|
|
6
|
+
|
|
7
|
+
For goal-driven exploration in a browser session, pair this reference with [flow-automation.md](flow-automation.md). For Salesforce Lightning, also load [qforce.md](qforce.md).
|
|
8
|
+
|
|
9
|
+
## Syntax & Formatting Rules
|
|
10
|
+
|
|
11
|
+
- **4+ space separator**: Separate the keyword name, positional arguments, and `key=value` named arguments with **at least 4 spaces** (`KeywordName arg1 arg2 anchor=Header`). Never use a single space—Robot Framework treats `ClickText Login` as a single nonexistent keyword name.
|
|
12
|
+
- **Prefer visible text over XPath**: `PartialMatch` is `True` by default in browser sessions (`SetConfig PartialMatch False` forces exact matches).
|
|
13
|
+
- **`anchor=<text>` for disambiguation**: When the same text appears multiple times, pass `anchor=<nearby text>` (`ClickText Edit anchor=Profile`). Use 1-based `index=<N>` only as a last resort.
|
|
14
|
+
- **Booleans**: Capitalize `True` and `False` (`clear=False`, `partial_match=False`).
|
|
15
|
+
- **Submitting on Enter**: Append `\n` to `TypeText` (`TypeText Search laptop\n`) or run `PressKey ${EMPTY} {ENTER}`.
|
|
16
|
+
- **XPath `=` escaping**: In browser testing (`testing browser execute`), Agentia automatically escapes `=` inside `//...` XPath tokens so Robot Framework does not misread `@id="x"` as a named parameter.
|
|
17
|
+
|
|
18
|
+
## Keyword Catalog
|
|
19
|
+
|
|
20
|
+
### Navigation
|
|
21
|
+
|
|
22
|
+
| Keyword | Form | Notes |
|
|
23
|
+
| --- | --- | --- |
|
|
24
|
+
| `GoTo` | `GoTo https://example.com` | Navigate to a full URL (`https://...`). |
|
|
25
|
+
| `Back` / `Forward` | `Back` | Browser history navigation. |
|
|
26
|
+
| `RefreshPage` | `RefreshPage` | Reload the current page. |
|
|
27
|
+
| `Open Browser` | `Open Browser about:blank chrome` | Suite setup; already executed during `testing browser start` unless `--no-browser` is passed. |
|
|
28
|
+
| `Close All Browsers` | `Close All Browsers` | Suite teardown. Do not call during an active browser session; use `testing browser stop` instead. |
|
|
29
|
+
|
|
30
|
+
### Clicking
|
|
31
|
+
|
|
32
|
+
| Keyword | Form | When to Use |
|
|
33
|
+
| --- | --- | --- |
|
|
34
|
+
| `ClickText` | `ClickText <text> [anchor=<text>]` | Default choice for any button, link, or tab with visible text. |
|
|
35
|
+
| `ClickItem` | `ClickItem <alt_or_title> [anchor=<text>]` | Click by `alt`, `title`, `tooltip`, `data-tooltip`, or `data-icon` (ideal for icon-only buttons). |
|
|
36
|
+
| `ClickElement` | `ClickElement <xpath>` | Last resort when neither `ClickText` nor `ClickItem` can target the element. |
|
|
37
|
+
| `ClickCheckbox` | `ClickCheckbox <label> on\|off` | Idempotently set a checkbox to `on` or `off`. |
|
|
38
|
+
| `ClickList` | `ClickList <list_locator> <item_text>` | Click an item inside a list widget. |
|
|
39
|
+
| `ClickCell` | `ClickCell <row> <col>` | Click a cell inside the active table (requires `UseTable` first). |
|
|
40
|
+
|
|
41
|
+
### Typing & Form Inputs
|
|
42
|
+
|
|
43
|
+
| Keyword | Form | Notes |
|
|
44
|
+
| --- | --- | --- |
|
|
45
|
+
| `TypeText` | `TypeText <label> <value> [clear=False]` | Clears the field and types `<value>`. Append `\n` to submit. |
|
|
46
|
+
| `TypeSecret` | `TypeSecret <label> <value>` | Same as `TypeText`, but masks the value in logs and Agentia browser history. |
|
|
47
|
+
| `DropDown` | `DropDown <label> <option>` | Select an option from a native HTML `<select>` element. |
|
|
48
|
+
| `GetInputValue` | `GetInputValue <label>` | Read the current value of an input field. |
|
|
49
|
+
|
|
50
|
+
### Verification & Reading
|
|
51
|
+
|
|
52
|
+
| Keyword | Form | Notes |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| `VerifyText` | `VerifyText <text> [timeout=30]` | Assert visible text appears on the page (preferred over `Sleep` for waiting). |
|
|
55
|
+
| `VerifyNoText` | `VerifyNoText <text> [timeout=10]` | Assert text does not appear (or disappears). |
|
|
56
|
+
| `VerifyItem` | `VerifyItem <alt_or_title>` | Assert an element with the given `alt`/`title`/`tooltip` exists. |
|
|
57
|
+
| `VerifyElement` | `VerifyElement <xpath> [timeout=30]` | Assert an XPath exists in the DOM. |
|
|
58
|
+
| `VerifyValue` | `VerifyValue <label> <expected>` | Assert an input field holds `<expected>`. |
|
|
59
|
+
| `VerifyCheckboxValue` | `VerifyCheckboxValue <label> on\|off` | Assert a checkbox state. |
|
|
60
|
+
| `GetText` | `GetText <locator>` | Read visible text of an element. |
|
|
61
|
+
| `GetAttribute` | `GetAttribute <locator> <attribute>` | Read an attribute (e.g., `href`, `aria-expanded`, `outerHTML`). |
|
|
62
|
+
| `GetTitle` | `GetTitle` | Read the document title (also useful as a harmless keepalive keyword in browser sessions). |
|
|
63
|
+
|
|
64
|
+
### Hover, Scroll, Drag & Keyboard
|
|
65
|
+
|
|
66
|
+
| Keyword | Form | Notes |
|
|
67
|
+
| --- | --- | --- |
|
|
68
|
+
| `HoverText` / `HoverElement` | `HoverText <text>` | Hover over an element to reveal menus or tooltips. |
|
|
69
|
+
| `Scroll` | `Scroll <locator> page_down\|page_up\|<px>` | Scroll an element or `//html` for the full page. |
|
|
70
|
+
| `ScrollTo` | `ScrollTo <text_locator>` | Scroll until `<text_locator>` is in view. |
|
|
71
|
+
| `DragDrop` | `DragDrop <source> <target>` | Drag one element onto another. |
|
|
72
|
+
| `PressKey` | `PressKey <locator> <key>` | Use `${EMPTY}` for global key press (`{ENTER}`, `{ESC}`, `{TAB}`). |
|
|
73
|
+
|
|
74
|
+
### Stateful Tables
|
|
75
|
+
|
|
76
|
+
Call `UseTable` once to bind the active table, then address cells by 1-based row/column (`r1`, `c2`) or header/row text:
|
|
77
|
+
|
|
78
|
+
```robotframework
|
|
79
|
+
UseTable Users
|
|
80
|
+
ClickCell r1 Email
|
|
81
|
+
VerifyTable r1 Status Active
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Configuration (`SetConfig`)
|
|
85
|
+
|
|
86
|
+
| Setting | Example | Purpose |
|
|
87
|
+
| --- | --- | --- |
|
|
88
|
+
| `DefaultTimeout` | `SetConfig DefaultTimeout 20s` | Global auto-wait timeout for locators (default `10s`). |
|
|
89
|
+
| `XHRTimeout` | `SetConfig XHRTimeout 30s` | Wait for pending XHR/network activity before acting. |
|
|
90
|
+
| `PartialMatch` | `SetConfig PartialMatch False` | Require exact text matches instead of substring matches. |
|
|
91
|
+
| `CaseInsensitive` | `SetConfig CaseInsensitive True` | Enable case-insensitive text matching. |
|
|
92
|
+
| `ClickToFocus` | `SetConfig ClickToFocus True` | Click inputs before typing (enabled by default in browser sessions). |
|
|
93
|
+
|
|
94
|
+
## Decision Tree
|
|
95
|
+
|
|
96
|
+
1. **Open a URL** -> `GoTo https://...`
|
|
97
|
+
2. **Click readable text** -> `ClickText <text>` (add `anchor=<nearby>` if repeated)
|
|
98
|
+
3. **Click an icon/image with no text** -> `ClickItem <alt_or_title>`, else `ClickElement <xpath>`
|
|
99
|
+
4. **Type into a field** -> `TypeText <label> <value>` (or `TypeSecret` for passwords/tokens)
|
|
100
|
+
5. **Select from a native `<select>`** -> `DropDown <label> <option>`
|
|
101
|
+
6. **Toggle a checkbox** -> `ClickCheckbox <label> on`
|
|
102
|
+
7. **Wait for page readiness** -> `VerifyText <landmark> timeout=30` (avoid `Sleep`)
|
|
103
|
+
8. **Work with a table** -> `UseTable <table_name>` -> `VerifyTable` / `ClickCell`
|
|
@@ -19,7 +19,7 @@ Use explicit `--project` and `--job` context. Agentia does not reproduce the leg
|
|
|
19
19
|
|
|
20
20
|
1. Discover or create a project and robot.
|
|
21
21
|
2. Create a job/test using snapshot files or validated Git-backed storage.
|
|
22
|
-
3. Run through `testing
|
|
22
|
+
3. Run through `testing job run`, which waits for the terminal build unless `--no-wait` is passed.
|
|
23
23
|
4. Inspect build detail, search, logs, artifacts, or xUnit.
|
|
24
24
|
5. Update the job or data inputs as needed.
|
|
25
25
|
6. Clean up regression-owned resources in reverse order with explicit confirmation.
|
|
@@ -27,10 +27,10 @@ Use explicit `--project` and `--job` context. Agentia does not reproduce the leg
|
|
|
27
27
|
```sh
|
|
28
28
|
agentia testing project list --json
|
|
29
29
|
agentia testing robot list --json
|
|
30
|
-
agentia testing
|
|
31
|
-
agentia testing
|
|
32
|
-
agentia testing
|
|
33
|
-
agentia testing
|
|
30
|
+
agentia testing job create --project <project-id> --robot <robot-id> --name "Smoke" --file tests/smoke.robot --json
|
|
31
|
+
agentia testing job run <job-id> --project <project-id> --json
|
|
32
|
+
agentia testing job runs get <build-id> --project <project-id> --job <job-id> --json
|
|
33
|
+
agentia testing job runs logs <build-id> --project <project-id> --job <job-id> --output ./crt.log --json
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
## Command Areas
|
|
@@ -39,24 +39,25 @@ agentia testing test logs <build-id> --project <project-id> --job <job-id> --out
|
|
|
39
39
|
| --- | --- |
|
|
40
40
|
| Projects | `testing project list|get|create|update|delete`; `project permission list|get|set|update` |
|
|
41
41
|
| Robots | `testing robot list|get|create|update|delete` |
|
|
42
|
-
| Jobs | `testing job list|get|create|update|delete|run|
|
|
42
|
+
| Jobs | `testing job list|get|create|update|delete|run|refs` |
|
|
43
|
+
| Runs | `testing job runs list|search|get|logs|abort` |
|
|
44
|
+
| Job files | `testing job files list|upload|download` |
|
|
43
45
|
| Schedules | `testing job schedule get|set|remove` |
|
|
44
|
-
| Builds | `testing build run|list|get|latest|search|logs|abort` |
|
|
45
46
|
| Variables | `testing variable list|get|create|update|delete` |
|
|
46
47
|
| User parameters | `testing user-parameter list|get|create|update|delete` |
|
|
47
48
|
| Data tables | `testing data-table list|get|create|update|delete|export` |
|
|
48
|
-
|
|
|
49
|
+
| Browser testing | `testing browser start|stop|status|execute|inspect|screenshot|reports|set-options|history|view|recorder` |
|
|
49
50
|
|
|
50
|
-
`testing create|update|
|
|
51
|
+
`testing job` is the single namespace for test definitions and their runs. Commands directly under `job` take a job ID; `job runs get|logs|abort` take a build/run ID plus `--job`. On `testing job create` and `testing job update`, `--[no-]show-video-params` (`showVideoParams` in the API/MCP) enables or disables Video Streaming and Recording capabilities when running the test job. The older `testing create|update|status|logs|run`, `testing test ...`, `testing build ...`, and `testing job files|upload|download` forms are deprecated aliases that still execute but warn when used: `create` maps to `job create`, `update` to `job files upload` (file operations, not `job update`), `status`, `build list`, and `build latest` to `job runs list`, `build get` to `job runs get`, and `build search|logs|abort` to `job runs search|logs|abort`.
|
|
51
52
|
|
|
52
53
|
## Execution And Builds
|
|
53
54
|
|
|
54
|
-
-
|
|
55
|
+
- Runs wait for terminal build data and exit non-zero unless the final status is `succeeded`. Use `--no-wait` to return the queued run record instead.
|
|
55
56
|
- `--timeout` bounds waiting; `--no-exit-code` keeps a failed remote run from failing the local command when explicitly desired.
|
|
56
|
-
- `--save-artifacts` and `--xunit` write only to validated explicit paths.
|
|
57
|
-
- `--stream-logs`
|
|
58
|
-
- Repeated `--datatable TABLE_ID:SELECTION` starts data-driven batch execution. It cannot be combined with
|
|
59
|
-
- Use
|
|
57
|
+
- `--save-artifacts` and `--xunit` write only to validated explicit paths. They require waiting, so they reject `--no-wait`.
|
|
58
|
+
- Run log output is printed live while the run executes. Pass `--no-stream-logs` for a progress spinner instead. `--json` never streams, so machine-readable output stays clean.
|
|
59
|
+
- Repeated `--datatable TABLE_ID:SELECTION` starts data-driven batch execution. It never waits and cannot be combined with stream, artifact-save, or xUnit modes.
|
|
60
|
+
- Use `job runs get`, `job runs list`, and `job runs search` instead of assuming list order.
|
|
60
61
|
|
|
61
62
|
## Schedules And Data Tables
|
|
62
63
|
|
|
@@ -64,19 +65,27 @@ Schedules support get, set with cron/timezone/record policy, and remove. Data ta
|
|
|
64
65
|
|
|
65
66
|
Data-table create/update/delete and existing-file overwrite are protected operations. Never overwrite or delete without user intent.
|
|
66
67
|
|
|
67
|
-
##
|
|
68
|
+
## Browser Testing
|
|
68
69
|
|
|
69
70
|
Use a regression-owned job:
|
|
70
71
|
|
|
71
72
|
```sh
|
|
72
|
-
agentia testing
|
|
73
|
-
agentia testing
|
|
74
|
-
agentia testing
|
|
75
|
-
agentia testing
|
|
76
|
-
agentia testing
|
|
73
|
+
agentia testing browser start <job-id> --project <project-id> --json
|
|
74
|
+
agentia testing browser status --project <project-id> --json
|
|
75
|
+
agentia testing browser view --project <project-id> --no-open --json
|
|
76
|
+
agentia testing browser execute --project <project-id> --line "GoTo https://example.com" --json
|
|
77
|
+
agentia testing browser inspect --project <project-id> --json
|
|
78
|
+
agentia testing browser history <job-id> --project <project-id> --lines-only
|
|
79
|
+
agentia testing browser stop --project <project-id> --yes --json
|
|
77
80
|
```
|
|
78
81
|
|
|
79
|
-
|
|
82
|
+
Always pass `--no-open` to `testing browser view` by default to print/return the interactive CRT browser session URL without launching a browser; omit `--no-open` only when the user explicitly asks to open the browser. Session cookies and XSRF values remain in-memory only. `recorder` is long-running and uses an owner-scoped local lock (`--force` reclaims a stale lock); neither `view` nor `recorder` is exposed through MCP. The older `testing live ...` commands remain available as deprecated aliases, except `continue` and `interrupt`, which were removed.
|
|
83
|
+
|
|
84
|
+
For deep browser-testing guidance, load:
|
|
85
|
+
- [browser-testing.md](browser-testing.md) — subcommands, flags, parallel recorder subagent pattern, 600s idle keepalive, and troubleshooting
|
|
86
|
+
- [flow-automation.md](flow-automation.md) — Observe -> Act -> Verify -> Recover loop and reading `screenshot` detection overlays with `inspect` `systemState`
|
|
87
|
+
- [qweb.md](qweb.md) — QWeb keyword catalog, 4+ space separator rule, and locator priority
|
|
88
|
+
- [qforce.md](qforce.md) — Salesforce Lightning rules (`--library QForce`, `LaunchApp`, `VerifyField`, `PickList`, `ComboBox`)
|
|
80
89
|
|
|
81
90
|
## Secret Inputs And Redaction
|
|
82
91
|
|
|
@@ -89,11 +98,10 @@ Live viewer secrets remain in the keychain. Session cookies and XSRF values are
|
|
|
89
98
|
|
|
90
99
|
Destructive or protected CLI actions prompt in an interactive TTY. JSON and non-TTY calls require `--yes`. Matching MCP tools require `confirm: true`, not a `yes` field.
|
|
91
100
|
|
|
92
|
-
This applies to resource deletion, build abort, schedule removal,
|
|
101
|
+
This applies to resource deletion, build abort, schedule removal, browser stop, protected data-table imports/deletion, and output overwrite.
|
|
93
102
|
|
|
94
103
|
## Gotchas
|
|
95
104
|
|
|
96
105
|
- `testing job` is a CRT test definition; `cicd job` is a Copado CICD JobExecution.
|
|
97
|
-
- There is no `testing test get` or `testing test delete`; use `testing job get` and `testing job delete`.
|
|
98
106
|
- CRT tenant users, organizations, groups, roles, licenses, and cross-region migration are intentionally not Agentia testing commands.
|
|
99
107
|
- Log, artifact, data-table, DOM, screenshot, and report commands may write files. Keep JSON stdout structured and report only sanitized output metadata.
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import { AgentiaCommand } from '../../../lib/agentia-command.js';
|
|
3
|
-
import { testingJobFlag, testingProjectFlag } from '../../../lib/testing-flags.js';
|
|
4
|
-
import { getTestingBuild } from '../../../lib/testing-operations.js';
|
|
5
|
-
import { formatTestingRecord } from '../../../lib/testing-types.js';
|
|
6
|
-
export default class TestingBuildGet extends AgentiaCommand {
|
|
7
|
-
static args = {
|
|
8
|
-
id: Args.integer({
|
|
9
|
-
description: 'CRT build/run ID.',
|
|
10
|
-
required: true,
|
|
11
|
-
}),
|
|
12
|
-
};
|
|
13
|
-
static description = 'Get a Copado Robotic Testing build/run';
|
|
14
|
-
static examples = [
|
|
15
|
-
'<%= config.bin %> <%= command.id %> <build-id> --project <project-id> --job <job-id>',
|
|
16
|
-
'<%= config.bin %> <%= command.id %> <build-id> --project <project-id> --job <job-id> --full --json',
|
|
17
|
-
];
|
|
18
|
-
static flags = {
|
|
19
|
-
...testingProjectFlag,
|
|
20
|
-
...testingJobFlag,
|
|
21
|
-
full: Flags.boolean({
|
|
22
|
-
default: false,
|
|
23
|
-
description: 'Fetch the full build result instead of the compact summary.',
|
|
24
|
-
}),
|
|
25
|
-
};
|
|
26
|
-
async run() {
|
|
27
|
-
const { args, flags } = await this.parse(TestingBuildGet);
|
|
28
|
-
const build = await this.withSpinner('Fetching testing build', () => getTestingBuild({
|
|
29
|
-
buildId: args.id,
|
|
30
|
-
full: flags.full,
|
|
31
|
-
jobId: flags.job,
|
|
32
|
-
projectId: flags.project,
|
|
33
|
-
}));
|
|
34
|
-
this.display(() => this.log(formatTestingRecord(build)));
|
|
35
|
-
return build;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=get.js.map
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { Flags } from '@oclif/core';
|
|
2
|
-
import { AgentiaCommand } from '../../../lib/agentia-command.js';
|
|
3
|
-
import { testingProjectFlag } from '../../../lib/testing-flags.js';
|
|
4
|
-
import { latestTestingBuilds } from '../../../lib/testing-operations.js';
|
|
5
|
-
import { formatTestingBuildTable, TESTING_BUILD_STATUSES, } from '../../../lib/testing-types.js';
|
|
6
|
-
export default class TestingBuildLatest extends AgentiaCommand {
|
|
7
|
-
static description = 'List the latest Copado Robotic Testing builds/runs';
|
|
8
|
-
static examples = [
|
|
9
|
-
'<%= config.bin %> <%= command.id %> --project <project-id>',
|
|
10
|
-
'<%= config.bin %> <%= command.id %> --project <project-id> --status failed --json',
|
|
11
|
-
];
|
|
12
|
-
static flags = {
|
|
13
|
-
...testingProjectFlag,
|
|
14
|
-
'result-size': Flags.option({
|
|
15
|
-
default: 'compact',
|
|
16
|
-
description: 'CRT build result size.',
|
|
17
|
-
options: ['compact'],
|
|
18
|
-
})(),
|
|
19
|
-
status: Flags.option({
|
|
20
|
-
description: 'Build status filter.',
|
|
21
|
-
options: [...TESTING_BUILD_STATUSES],
|
|
22
|
-
})(),
|
|
23
|
-
};
|
|
24
|
-
async run() {
|
|
25
|
-
const { flags } = await this.parse(TestingBuildLatest);
|
|
26
|
-
const builds = await this.withSpinner('Fetching latest testing builds', () => latestTestingBuilds({
|
|
27
|
-
projectId: flags.project,
|
|
28
|
-
resultSize: flags['result-size'],
|
|
29
|
-
status: flags.status,
|
|
30
|
-
}));
|
|
31
|
-
this.display(() => {
|
|
32
|
-
if (builds.length === 0)
|
|
33
|
-
this.log('No latest testing builds found.');
|
|
34
|
-
else
|
|
35
|
-
this.log(formatTestingBuildTable(builds));
|
|
36
|
-
});
|
|
37
|
-
return builds;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=latest.js.map
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { Args } from '@oclif/core';
|
|
2
|
-
import { AgentiaCommand } from '../../../lib/agentia-command.js';
|
|
3
|
-
import { testingJobFlag, testingLogOptionFlags, testingOutputFlags, testingProjectFlag, } from '../../../lib/testing-flags.js';
|
|
4
|
-
import { getTestingBuildLogs } from '../../../lib/testing-operations.js';
|
|
5
|
-
export default class TestingBuildLogs extends AgentiaCommand {
|
|
6
|
-
static args = {
|
|
7
|
-
id: Args.integer({
|
|
8
|
-
description: 'CRT build/run ID.',
|
|
9
|
-
required: true,
|
|
10
|
-
}),
|
|
11
|
-
};
|
|
12
|
-
static description = 'Get logs for a Copado Robotic Testing build/run';
|
|
13
|
-
static examples = [
|
|
14
|
-
'<%= config.bin %> <%= command.id %> <build-id> --project <project-id> --job <job-id>',
|
|
15
|
-
'<%= config.bin %> <%= command.id %> <build-id> --project <project-id> --job <job-id> --output log.html --json',
|
|
16
|
-
];
|
|
17
|
-
static flags = {
|
|
18
|
-
...testingProjectFlag,
|
|
19
|
-
...testingJobFlag,
|
|
20
|
-
...testingLogOptionFlags,
|
|
21
|
-
...testingOutputFlags,
|
|
22
|
-
};
|
|
23
|
-
async run() {
|
|
24
|
-
const { args, flags } = await this.parse(TestingBuildLogs);
|
|
25
|
-
const result = await this.withSpinner('Fetching testing build logs', () => getTestingBuildLogs({
|
|
26
|
-
buildId: args.id,
|
|
27
|
-
container: flags.container,
|
|
28
|
-
jobId: flags.job,
|
|
29
|
-
limitBytes: flags['limit-bytes'],
|
|
30
|
-
output: flags.output,
|
|
31
|
-
pretty: flags.pretty ? true : undefined,
|
|
32
|
-
projectId: flags.project,
|
|
33
|
-
sinceSeconds: flags['since-seconds'],
|
|
34
|
-
tailLines: flags['tail-lines'],
|
|
35
|
-
timestamps: flags.timestamps ? true : undefined,
|
|
36
|
-
}));
|
|
37
|
-
this.display(() => {
|
|
38
|
-
if (flags.output !== undefined) {
|
|
39
|
-
this.log(`Testing build logs written to ${flags.output}`);
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
process.stdout.write(result.log);
|
|
43
|
-
});
|
|
44
|
-
return result;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=logs.js.map
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { Args } from '@oclif/core';
|
|
2
|
-
import { testingProjectFlag, testingRunOptionFlags } from '../../../lib/testing-flags.js';
|
|
3
|
-
import { TestingRunCommand } from '../../../lib/testing-run-command.js';
|
|
4
|
-
export default class TestingBuildRun extends TestingRunCommand {
|
|
5
|
-
static args = {
|
|
6
|
-
id: Args.integer({
|
|
7
|
-
description: 'CRT job/test ID to run.',
|
|
8
|
-
required: true,
|
|
9
|
-
}),
|
|
10
|
-
};
|
|
11
|
-
static description = 'Run a Copado Robotic Testing job/test';
|
|
12
|
-
static examples = [
|
|
13
|
-
'<%= config.bin %> <%= command.id %> <job-id> --project <project-id>',
|
|
14
|
-
'<%= config.bin %> <%= command.id %> <job-id> --project <project-id> --param BROWSER=chrome --record failed',
|
|
15
|
-
'<%= config.bin %> <%= command.id %> <job-id> --project <project-id> --json',
|
|
16
|
-
];
|
|
17
|
-
static flags = {
|
|
18
|
-
...testingProjectFlag,
|
|
19
|
-
...testingRunOptionFlags,
|
|
20
|
-
};
|
|
21
|
-
async run() {
|
|
22
|
-
const { args, flags } = await this.parse(TestingBuildRun);
|
|
23
|
-
return this.executeTestingRun(flags, { jobId: args.id, projectId: flags.project }, 'build');
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=run.js.map
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import { AgentiaCommand } from '../../../lib/agentia-command.js';
|
|
3
|
-
import { testingBranchFlag, testingProjectFlag, } from '../../../lib/testing-flags.js';
|
|
4
|
-
import { downloadTestingJobFiles } from '../../../lib/testing-operations.js';
|
|
5
|
-
import { formatTestingTable } from '../../../lib/testing-types.js';
|
|
6
|
-
export default class TestingJobDownload extends AgentiaCommand {
|
|
7
|
-
static args = {
|
|
8
|
-
id: Args.integer({
|
|
9
|
-
description: 'CRT job/test ID.',
|
|
10
|
-
required: true,
|
|
11
|
-
}),
|
|
12
|
-
};
|
|
13
|
-
static description = 'Download files from a Copado Robotic Testing job/test';
|
|
14
|
-
static examples = [
|
|
15
|
-
'<%= config.bin %> <%= command.id %> <job-id> --project <project-id> --file tests.robot',
|
|
16
|
-
'<%= config.bin %> <%= command.id %> <job-id> --project <project-id> --file tests.robot --output-dir ./crt-files --json',
|
|
17
|
-
];
|
|
18
|
-
static flags = {
|
|
19
|
-
...testingProjectFlag,
|
|
20
|
-
...testingBranchFlag,
|
|
21
|
-
file: Flags.string({
|
|
22
|
-
char: 'f',
|
|
23
|
-
description: 'Remote CRT file path to download. Can be provided multiple times.',
|
|
24
|
-
multiple: true,
|
|
25
|
-
required: true,
|
|
26
|
-
}),
|
|
27
|
-
'output-dir': Flags.string({
|
|
28
|
-
description: 'Directory to write downloaded files.',
|
|
29
|
-
}),
|
|
30
|
-
};
|
|
31
|
-
async run() {
|
|
32
|
-
const { args, flags } = await this.parse(TestingJobDownload);
|
|
33
|
-
const result = await this.withSpinner('Downloading testing job files', () => downloadTestingJobFiles({
|
|
34
|
-
branch: flags.branch,
|
|
35
|
-
files: flags.file,
|
|
36
|
-
jobId: args.id,
|
|
37
|
-
outputDir: flags['output-dir'],
|
|
38
|
-
projectId: flags.project,
|
|
39
|
-
}));
|
|
40
|
-
this.display(() => {
|
|
41
|
-
if (flags['output-dir'] !== undefined) {
|
|
42
|
-
this.log(`Downloaded files to ${flags['output-dir']}`);
|
|
43
|
-
}
|
|
44
|
-
if (result.files.length > 0) {
|
|
45
|
-
this.log(formatTestingTable(result.files));
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
this.log('Downloaded file response did not include a file listing.');
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
return result;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=download.js.map
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { Args } from '@oclif/core';
|
|
2
|
-
import { AgentiaCommand } from '../../../lib/agentia-command.js';
|
|
3
|
-
import { testingProjectFlag } from '../../../lib/testing-flags.js';
|
|
4
|
-
import { listTestingJobFiles } from '../../../lib/testing-operations.js';
|
|
5
|
-
import { formatTestingTable } from '../../../lib/testing-types.js';
|
|
6
|
-
export default class TestingJobFiles extends AgentiaCommand {
|
|
7
|
-
static args = {
|
|
8
|
-
id: Args.integer({
|
|
9
|
-
description: 'CRT job/test ID.',
|
|
10
|
-
required: true,
|
|
11
|
-
}),
|
|
12
|
-
};
|
|
13
|
-
static description = 'List files for a Copado Robotic Testing job/test';
|
|
14
|
-
static examples = [
|
|
15
|
-
'<%= config.bin %> <%= command.id %> <job-id> --project <project-id>',
|
|
16
|
-
'<%= config.bin %> <%= command.id %> <job-id> --project <project-id> --json',
|
|
17
|
-
];
|
|
18
|
-
static flags = {
|
|
19
|
-
...testingProjectFlag,
|
|
20
|
-
};
|
|
21
|
-
async run() {
|
|
22
|
-
const { args, flags } = await this.parse(TestingJobFiles);
|
|
23
|
-
const files = await this.withSpinner('Fetching testing job files', () => listTestingJobFiles({ jobId: args.id, projectId: flags.project }));
|
|
24
|
-
this.display(() => {
|
|
25
|
-
if (files.length === 0) {
|
|
26
|
-
this.log('No testing job files found.');
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
this.log(formatTestingTable(files));
|
|
30
|
-
});
|
|
31
|
-
return files;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=files.js.map
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Args } from '@oclif/core';
|
|
2
|
-
import { AgentiaCommand } from '../../../lib/agentia-command.js';
|
|
3
|
-
import { testingLiveCommonFlags } from '../../../lib/testing-live-command.js';
|
|
4
|
-
import { controlTestingLive } from '../../../lib/testing-live-operations.js';
|
|
5
|
-
export default class TestingLiveContinue extends AgentiaCommand {
|
|
6
|
-
static args = { 'job-id': Args.integer({ description: 'Optional CRT job/test ID guard.', required: false }) };
|
|
7
|
-
static description = 'Continue paused Robot execution in the active CRT live session';
|
|
8
|
-
static examples = ['<%= config.bin %> <%= command.id %> --project <project-id>'];
|
|
9
|
-
static flags = testingLiveCommonFlags;
|
|
10
|
-
async run() {
|
|
11
|
-
const { args, flags } = await this.parse(TestingLiveContinue);
|
|
12
|
-
const result = await controlTestingLive('continue', {
|
|
13
|
-
jobId: args['job-id'],
|
|
14
|
-
projectId: flags.project,
|
|
15
|
-
sessionId: flags['session-id'],
|
|
16
|
-
});
|
|
17
|
-
this.display(() => this.log(result.message));
|
|
18
|
-
return result;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=continue.js.map
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import { AgentiaCommand } from '../../../lib/agentia-command.js';
|
|
3
|
-
import { testingLiveCommonFlags } from '../../../lib/testing-live-command.js';
|
|
4
|
-
import { executeTestingLive } from '../../../lib/testing-live-operations.js';
|
|
5
|
-
export default class TestingLiveExecute extends AgentiaCommand {
|
|
6
|
-
static args = { 'job-id': Args.integer({ description: 'Optional CRT job/test ID guard.', required: false }) };
|
|
7
|
-
static description = 'Execute bounded Robot Framework keywords in an active CRT live session';
|
|
8
|
-
static examples = [
|
|
9
|
-
'<%= config.bin %> <%= command.id %> --project <project-id> --keyword GoTo --arg https://example.com',
|
|
10
|
-
'<%= config.bin %> <%= command.id %> <job-id> --project <project-id> --file smoke.robot --section Login',
|
|
11
|
-
];
|
|
12
|
-
static flags = {
|
|
13
|
-
...testingLiveCommonFlags,
|
|
14
|
-
arg: Flags.string({ description: 'Keyword argument. Repeat to preserve argument boundaries.', multiple: true }),
|
|
15
|
-
file: Flags.string({ description: 'Robot Framework input file.' }),
|
|
16
|
-
keyword: Flags.string({ description: 'Robot Framework keyword name.' }),
|
|
17
|
-
line: Flags.string({ description: 'Raw Robot Framework keyword line. Repeat for multiple lines.', multiple: true }),
|
|
18
|
-
raw: Flags.boolean({ default: false, description: 'Treat file input as raw keyword lines.' }),
|
|
19
|
-
section: Flags.string({ description: 'Robot test/task name to execute.' }),
|
|
20
|
-
'section-index': Flags.integer({ description: 'One-based Robot test/task index to execute.', min: 1 }),
|
|
21
|
-
};
|
|
22
|
-
async run() {
|
|
23
|
-
const { args, flags } = await this.parse(TestingLiveExecute);
|
|
24
|
-
const supplied = [flags.keyword !== undefined, flags.file !== undefined, (flags.line?.length ?? 0) > 0].filter(Boolean);
|
|
25
|
-
if (supplied.length !== 1)
|
|
26
|
-
throw new Error('Use exactly one of --keyword, --line, or --file.');
|
|
27
|
-
const result = await this.withSpinner('Executing CRT live keyword', () => executeTestingLive({
|
|
28
|
-
args: flags.arg,
|
|
29
|
-
file: flags.file,
|
|
30
|
-
jobId: args['job-id'],
|
|
31
|
-
keyword: flags.keyword,
|
|
32
|
-
lines: flags.line,
|
|
33
|
-
projectId: flags.project,
|
|
34
|
-
raw: flags.raw,
|
|
35
|
-
section: flags.section,
|
|
36
|
-
sectionIndex: flags['section-index'],
|
|
37
|
-
sessionId: flags['session-id'],
|
|
38
|
-
}));
|
|
39
|
-
this.display(() => this.log(`Execution ${result.executionId}: ${result.status}`));
|
|
40
|
-
return result;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=execute.js.map
|