@snapvisor/cli 6.4.1 → 7.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 +8 -8
- package/README.md +45 -45
- package/bin/argos-cli.js +3 -3
- package/dist/index.mjs +25 -25
- package/package.json +7 -7
package/LICENSE
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
Copyright 2026 Devino Solutions Inc. (Snapvisor modifications)
|
|
2
|
-
Copyright 2022 Smooth Code
|
|
3
|
-
|
|
4
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
5
|
-
|
|
6
|
-
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
7
|
-
|
|
8
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
1
|
+
Copyright 2026 Devino Solutions Inc. (Snapvisor modifications)
|
|
2
|
+
Copyright 2022 Smooth Code
|
|
3
|
+
|
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
5
|
+
|
|
6
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
7
|
+
|
|
8
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
<p align="center">
|
|
2
|
-
<a href="https://argos-ci.com/?utm_source=github&utm_medium=logo" target="_blank">
|
|
3
|
-
<picture>
|
|
4
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/argos-ci/argos/main/resources/logos/github-readme-logo-dark.png">
|
|
5
|
-
<img alt="Argos" src="https://raw.githubusercontent.com/argos-ci/argos/main/resources/logos/github-readme-logo-light.png" width="360" height="70">
|
|
6
|
-
</picture>
|
|
7
|
-
</a>
|
|
8
|
-
</p>
|
|
9
|
-
|
|
10
|
-
<p align="center"><strong>The open source visual testing platform for AI-native engineering teams.</strong></p>
|
|
11
|
-
|
|
12
|
-
# Argos Command Line Interface
|
|
13
|
-
|
|
14
|
-
Interact with and upload screenshots to [argos-ci.com](https://argos-ci.com) from the command line.
|
|
15
|
-
|
|
16
|
-
[](https://www.npmjs.com/package/@snapvisor/cli)
|
|
17
|
-
[](https://www.npmjs.com/package/@snapvisor/cli)
|
|
18
|
-
[](https://www.npmjs.com/package/@snapvisor/cli)
|
|
19
|
-
|
|
20
|
-
Visit the [Argos CLI documentation](https://argos-ci.com/docs/reference/argos-command-line-interface-cli) for the full command reference and more.
|
|
21
|
-
|
|
22
|
-
## Installation
|
|
23
|
-
|
|
24
|
-
```sh
|
|
25
|
-
npm install --save-dev @snapvisor/cli
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Usage
|
|
29
|
-
|
|
30
|
-
Upload a directory of screenshots to Argos. Authenticate with your project token via the `ARGOS_TOKEN` environment variable:
|
|
31
|
-
|
|
32
|
-
```sh
|
|
33
|
-
ARGOS_TOKEN="<your-argos-token>" npx @snapvisor/cli upload ./screenshots
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
The CLI also exposes commands to `deploy` a static build, inspect and `review` builds, post a `comment`, and more. List them all with:
|
|
37
|
-
|
|
38
|
-
```sh
|
|
39
|
-
npx @snapvisor/cli --help
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## Links
|
|
43
|
-
|
|
44
|
-
- [Official CLI Docs](https://argos-ci.com/docs/reference/argos-command-line-interface-cli)
|
|
45
|
-
- [Discord](https://argos-ci.com/discord)
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="https://argos-ci.com/?utm_source=github&utm_medium=logo" target="_blank">
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/argos-ci/argos/main/resources/logos/github-readme-logo-dark.png">
|
|
5
|
+
<img alt="Argos" src="https://raw.githubusercontent.com/argos-ci/argos/main/resources/logos/github-readme-logo-light.png" width="360" height="70">
|
|
6
|
+
</picture>
|
|
7
|
+
</a>
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
<p align="center"><strong>The open source visual testing platform for AI-native engineering teams.</strong></p>
|
|
11
|
+
|
|
12
|
+
# Argos Command Line Interface
|
|
13
|
+
|
|
14
|
+
Interact with and upload screenshots to [argos-ci.com](https://argos-ci.com) from the command line.
|
|
15
|
+
|
|
16
|
+
[](https://www.npmjs.com/package/@snapvisor/cli)
|
|
17
|
+
[](https://www.npmjs.com/package/@snapvisor/cli)
|
|
18
|
+
[](https://www.npmjs.com/package/@snapvisor/cli)
|
|
19
|
+
|
|
20
|
+
Visit the [Argos CLI documentation](https://argos-ci.com/docs/reference/argos-command-line-interface-cli) for the full command reference and more.
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
npm install --save-dev @snapvisor/cli
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Usage
|
|
29
|
+
|
|
30
|
+
Upload a directory of screenshots to Argos. Authenticate with your project token via the `ARGOS_TOKEN` environment variable:
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
ARGOS_TOKEN="<your-argos-token>" npx @snapvisor/cli upload ./screenshots
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The CLI also exposes commands to `deploy` a static build, inspect and `review` builds, post a `comment`, and more. List them all with:
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
npx @snapvisor/cli --help
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Links
|
|
43
|
+
|
|
44
|
+
- [Official CLI Docs](https://argos-ci.com/docs/reference/argos-command-line-interface-cli)
|
|
45
|
+
- [Discord](https://argos-ci.com/discord)
|
package/bin/argos-cli.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import "../dist/index.mjs";
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import "../dist/index.mjs";
|
package/dist/index.mjs
CHANGED
|
@@ -33,7 +33,7 @@ function toMetricsPeriod(choice) {
|
|
|
33
33
|
//#endregion
|
|
34
34
|
//#region src/commands/upload.ts
|
|
35
35
|
function uploadCommand(program) {
|
|
36
|
-
program.command("upload").argument("<directory>", "Directory to upload").description("Upload screenshots to Snapvisor").option("-f, --files <patterns...>", "One or more globs matching image file paths to upload", "**/*.{png,jpg,jpeg}").option("-i, --ignore <patterns...>", "One or more globs matching image file paths to ignore (ex: \"**/*.png **/diff.jpg\")").addOption(tokenOption).addOption(projectOption).addOption(buildNameOption).addOption(new Option("--mode <string>", "Mode of comparison applied. CI for visual regression testing, monitoring for visual monitoring.").default("ci").choices(["ci", "monitoring"])).addOption(new Option("--parallel", "Enable parallel mode. Run multiple
|
|
36
|
+
program.command("upload").argument("<directory>", "Directory to upload").description("Upload screenshots to Snapvisor").option("-f, --files <patterns...>", "One or more globs matching image file paths to upload", "**/*.{png,jpg,jpeg}").option("-i, --ignore <patterns...>", "One or more globs matching image file paths to ignore (ex: \"**/*.png **/diff.jpg\")").addOption(tokenOption).addOption(projectOption).addOption(buildNameOption).addOption(new Option("--mode <string>", "Mode of comparison applied. CI for visual regression testing, monitoring for visual monitoring.").default("ci").choices(["ci", "monitoring"])).addOption(new Option("--parallel", "Enable parallel mode. Run multiple Snapvisor builds and combine them at the end.\nCan also be set via the ARGOS_PARALLEL environment variable.")).addOption(new Option("--parallel-total <number>", "The number of parallel nodes being ran")).addOption(parallelNonceOption).addOption(new Option("--parallel-index <number>", "The index of the parallel node being ran (must be at least 1)")).addOption(new Option("--reference-branch <string>", "Branch used as baseline for screenshot comparison")).addOption(new Option("--reference-commit <string>", "Commit used as baseline for screenshot comparison")).addOption(new Option("--threshold <number>", "Sensitivity threshold between 0 and 1. The higher the threshold, the less sensitive the diff will be. Default to 0.5")).addOption(new Option("--subset", "Whether this build contains only a subset of screenshots.\nThis is useful when a build is created from an incomplete test suite where some tests are skipped.\nCan also be set via the ARGOS_SUBSET environment variable.")).action(async (directory, options) => {
|
|
37
37
|
const spinner = ora("Uploading screenshots").start();
|
|
38
38
|
try {
|
|
39
39
|
const parallel = (() => {
|
|
@@ -78,7 +78,7 @@ function uploadCommand(program) {
|
|
|
78
78
|
}
|
|
79
79
|
//#endregion
|
|
80
80
|
//#region src/commands/finalize.ts
|
|
81
|
-
const skipIfEmptyOption = new Option("--skip-if-empty", "Create a skipped build when no parallel build matches the nonce.\nUseful when uploads are conditional (e.g. skipped by a CI cache) and
|
|
81
|
+
const skipIfEmptyOption = new Option("--skip-if-empty", "Create a skipped build when no parallel build matches the nonce.\nUseful when uploads are conditional (e.g. skipped by a CI cache) and Snapvisor is a required status check: the skipped build reports a success status even though nothing was uploaded.");
|
|
82
82
|
function finalizeCommand(program) {
|
|
83
83
|
program.command("finalize").description("Finalize pending parallel builds").addOption(parallelNonceOption).addOption(tokenOption).addOption(skipIfEmptyOption).addOption(buildNameOption).action(async (options) => {
|
|
84
84
|
const spinner = ora("Finalizing builds").start();
|
|
@@ -125,7 +125,7 @@ function skipCommand(program) {
|
|
|
125
125
|
function getApiBaseUrl() {
|
|
126
126
|
return process.env["ARGOS_API_BASE_URL"];
|
|
127
127
|
}
|
|
128
|
-
/** Create an
|
|
128
|
+
/** Create an Snapvisor API client authenticated with the given token. */
|
|
129
129
|
function createApiClient(authToken) {
|
|
130
130
|
return createClient({
|
|
131
131
|
authToken,
|
|
@@ -154,7 +154,7 @@ function formatUser(user) {
|
|
|
154
154
|
}
|
|
155
155
|
function formatMe(me) {
|
|
156
156
|
const lines = [
|
|
157
|
-
`Logged in to
|
|
157
|
+
`Logged in to Snapvisor as ${formatValue(me.user.name)}.`,
|
|
158
158
|
`Name: ${formatValue(me.user.name)}`,
|
|
159
159
|
`Email: ${formatValue(me.user.email)}`
|
|
160
160
|
];
|
|
@@ -375,10 +375,10 @@ function fail(message) {
|
|
|
375
375
|
* OAuth 2.1 client configuration and helpers for the `argos login` flow
|
|
376
376
|
* (Authorization Code + PKCE with a loopback redirect, RFC 8252).
|
|
377
377
|
*
|
|
378
|
-
* The authorization server is the
|
|
379
|
-
* validation are implemented in the main
|
|
378
|
+
* The authorization server is the Snapvisor app origin; endpoints and token
|
|
379
|
+
* validation are implemented in the main Snapvisor repo (`apps/backend/src/oauth`).
|
|
380
380
|
*/
|
|
381
|
-
/** First-party public client id, seeded in the
|
|
381
|
+
/** First-party public client id, seeded in the Snapvisor database. */
|
|
382
382
|
const OAUTH_CLIENT_ID = "argos-cli";
|
|
383
383
|
/**
|
|
384
384
|
* Scopes requested by `argos login`, covering the CLI's user actions (identity,
|
|
@@ -564,8 +564,8 @@ async function getAccessToken() {
|
|
|
564
564
|
return tokens.accessToken;
|
|
565
565
|
} catch (err) {
|
|
566
566
|
if (config.token) return config.token;
|
|
567
|
-
if (err instanceof OAuthTokenError) console.warn("Warning: Your
|
|
568
|
-
else console.warn("Warning: Could not reach
|
|
567
|
+
if (err instanceof OAuthTokenError) console.warn("Warning: Your Snapvisor session has expired. Run `argos login` again.");
|
|
568
|
+
else console.warn("Warning: Could not reach Snapvisor to refresh your session. Check your connection and try again.");
|
|
569
569
|
return;
|
|
570
570
|
}
|
|
571
571
|
}
|
|
@@ -588,7 +588,7 @@ async function clearStoredCredentials() {
|
|
|
588
588
|
const BUILD_URL_REGEXP = /^https:\/\/app\.argos-ci\.(?:com|dev(?::\d+)?)\/(?<owner>[^/?#]+)\/(?<project>[^/?#]+)\/builds\/(?<buildNumber>\d+)(?:[/?#]|$)/;
|
|
589
589
|
/**
|
|
590
590
|
* Parse a build reference, accepting either a bare build number (`"1234"`) or a
|
|
591
|
-
* full
|
|
591
|
+
* full Snapvisor build URL. Returns `null` when the input is neither.
|
|
592
592
|
*/
|
|
593
593
|
function parseBuildReference(reference) {
|
|
594
594
|
const asNumber = Number(reference);
|
|
@@ -607,7 +607,7 @@ function parseBuildReference(reference) {
|
|
|
607
607
|
*/
|
|
608
608
|
function parseBuildReferenceOrFail(reference) {
|
|
609
609
|
const parsed = parseBuildReference(reference);
|
|
610
|
-
if (!parsed) fail(`Build reference must be a valid build number or
|
|
610
|
+
if (!parsed) fail(`Build reference must be a valid build number or Snapvisor build URL (https://app.snapvisor.io/.../builds/<number>), got "${reference}".`);
|
|
611
611
|
return parsed;
|
|
612
612
|
}
|
|
613
613
|
//#endregion
|
|
@@ -640,7 +640,7 @@ function parseProjectPathOrFail(slug) {
|
|
|
640
640
|
*/
|
|
641
641
|
async function resolveToken(options) {
|
|
642
642
|
const token = options.token || process.env["ARGOS_TOKEN"] || await getAccessToken();
|
|
643
|
-
if (!token) fail("No
|
|
643
|
+
if (!token) fail("No Snapvisor token found. Use --token, set ARGOS_TOKEN, or run `argos login`.");
|
|
644
644
|
return token;
|
|
645
645
|
}
|
|
646
646
|
function explicitProjectPath(reference, options) {
|
|
@@ -820,7 +820,7 @@ function buildCommand(program) {
|
|
|
820
820
|
* Resolve the Markdown body of a comment or review from the mutually-exclusive
|
|
821
821
|
* `--body` (inline) and `--body-file` (path) options.
|
|
822
822
|
*
|
|
823
|
-
* The
|
|
823
|
+
* The Snapvisor API also accepts a rich-text JSON document, but that form is only
|
|
824
824
|
* needed for `@mentions` (which require user ids); the CLI exposes Markdown
|
|
825
825
|
* only, which the API converts server-side.
|
|
826
826
|
*/
|
|
@@ -843,7 +843,7 @@ const events = {
|
|
|
843
843
|
comment: "COMMENT"
|
|
844
844
|
};
|
|
845
845
|
function registerReviewCreate(review) {
|
|
846
|
-
review.command("create").description("Submit a review on a build").argument("<buildReference>", "Build number or
|
|
846
|
+
review.command("create").description("Submit a review on a build").argument("<buildReference>", "Build number or Snapvisor build URL").addOption(new Option("--event <event>", "Review event to apply to the build").choices(Object.keys(events)).makeOptionMandatory()).option("--body <markdown>", "Markdown comment to attach to the review").option("--body-file <path>", "Read the review comment from a Markdown file").addOption(tokenOption).addOption(projectPathOption).addOption(jsonOption).action((reference, options) => runBuildAction({
|
|
847
847
|
reference,
|
|
848
848
|
options,
|
|
849
849
|
auth: "user",
|
|
@@ -867,7 +867,7 @@ function registerReviewCreate(review) {
|
|
|
867
867
|
//#endregion
|
|
868
868
|
//#region src/commands/review/dismiss.ts
|
|
869
869
|
function registerReviewDismiss(review) {
|
|
870
|
-
review.command("dismiss").description("Dismiss a submitted review on a build").argument("<buildReference>", "Build number or
|
|
870
|
+
review.command("dismiss").description("Dismiss a submitted review on a build").argument("<buildReference>", "Build number or Snapvisor build URL").argument("<reviewId>", "ID of the review to dismiss").addOption(tokenOption).addOption(projectPathOption).addOption(jsonOption).action((reference, reviewId, options) => runBuildAction({
|
|
871
871
|
reference,
|
|
872
872
|
options,
|
|
873
873
|
auth: "user",
|
|
@@ -883,7 +883,7 @@ function registerReviewDismiss(review) {
|
|
|
883
883
|
//#endregion
|
|
884
884
|
//#region src/commands/review/list.ts
|
|
885
885
|
function registerReviewList(review) {
|
|
886
|
-
review.command("list").description("List the reviews submitted on a build").argument("<buildReference>", "Build number or
|
|
886
|
+
review.command("list").description("List the reviews submitted on a build").argument("<buildReference>", "Build number or Snapvisor build URL").addOption(tokenOption).addOption(projectPathOption).addOption(jsonOption).action((reference, options) => runBuildAction({
|
|
887
887
|
reference,
|
|
888
888
|
options,
|
|
889
889
|
auth: "user",
|
|
@@ -943,7 +943,7 @@ function parseAnchor(options) {
|
|
|
943
943
|
//#endregion
|
|
944
944
|
//#region src/commands/comment/create.ts
|
|
945
945
|
function registerCommentCreate(comment) {
|
|
946
|
-
comment.command("create").description("Post a comment (or reply) on a build").argument("<buildReference>", "Build number or
|
|
946
|
+
comment.command("create").description("Post a comment (or reply) on a build").argument("<buildReference>", "Build number or Snapvisor build URL").option("--body <markdown>", "Markdown body of the comment").option("--body-file <path>", "Read the comment body from a Markdown file").option("--reply-to <threadId>", "Reply to an existing thread (its root comment ID)").option("--diff <screenshotDiffId>", "Anchor the comment to a screenshot diff").option("--anchor-point <x,y>", "Point on the diff in normalized 0-1 coordinates (requires --diff)").option("--anchor-lines <from,to>", "1-based inclusive line range on the diff (requires --diff)").option("--draft", "Attach to your pending review instead of posting immediately").addOption(tokenOption).addOption(projectPathOption).addOption(jsonOption).action((reference, options) => runBuildAction({
|
|
947
947
|
reference,
|
|
948
948
|
options,
|
|
949
949
|
auth: "user",
|
|
@@ -978,7 +978,7 @@ function registerCommentCreate(comment) {
|
|
|
978
978
|
*/
|
|
979
979
|
function defineCommentAction(opts) {
|
|
980
980
|
return (comment) => {
|
|
981
|
-
comment.command(opts.name).description(opts.description).argument("<buildReference>", "Build number or
|
|
981
|
+
comment.command(opts.name).description(opts.description).argument("<buildReference>", "Build number or Snapvisor build URL").argument("<commentId>", "ID of the comment").addOption(tokenOption).addOption(projectPathOption).addOption(jsonOption).action((reference, commentId, options) => runBuildAction({
|
|
982
982
|
reference,
|
|
983
983
|
options,
|
|
984
984
|
auth: "user",
|
|
@@ -1008,7 +1008,7 @@ const registerCommentDelete = defineCommentAction({
|
|
|
1008
1008
|
//#endregion
|
|
1009
1009
|
//#region src/commands/comment/edit.ts
|
|
1010
1010
|
function registerCommentEdit(comment) {
|
|
1011
|
-
comment.command("edit").description("Update the body of a comment (author only)").argument("<buildReference>", "Build number or
|
|
1011
|
+
comment.command("edit").description("Update the body of a comment (author only)").argument("<buildReference>", "Build number or Snapvisor build URL").argument("<commentId>", "ID of the comment").option("--body <markdown>", "New Markdown body of the comment").option("--body-file <path>", "Read the new body from a Markdown file").addOption(tokenOption).addOption(projectPathOption).addOption(jsonOption).action((reference, commentId, options) => runBuildAction({
|
|
1012
1012
|
reference,
|
|
1013
1013
|
options,
|
|
1014
1014
|
auth: "user",
|
|
@@ -1042,7 +1042,7 @@ const registerCommentGet = defineCommentAction({
|
|
|
1042
1042
|
//#endregion
|
|
1043
1043
|
//#region src/commands/comment/list.ts
|
|
1044
1044
|
function registerCommentList(comment) {
|
|
1045
|
-
comment.command("list").description("List the comments on a build").argument("<buildReference>", "Build number or
|
|
1045
|
+
comment.command("list").description("List the comments on a build").argument("<buildReference>", "Build number or Snapvisor build URL").addOption(tokenOption).addOption(projectPathOption).addOption(jsonOption).action((reference, options) => runBuildAction({
|
|
1046
1046
|
reference,
|
|
1047
1047
|
options,
|
|
1048
1048
|
auth: "user",
|
|
@@ -1057,7 +1057,7 @@ function registerCommentList(comment) {
|
|
|
1057
1057
|
//#endregion
|
|
1058
1058
|
//#region src/commands/comment/react.ts
|
|
1059
1059
|
function registerCommentReact(comment) {
|
|
1060
|
-
comment.command("react").description("Add an emoji reaction to a comment").argument("<buildReference>", "Build number or
|
|
1060
|
+
comment.command("react").description("Add an emoji reaction to a comment").argument("<buildReference>", "Build number or Snapvisor build URL").argument("<commentId>", "ID of the comment").argument("<emoji>", "Emoji to react with").addOption(tokenOption).addOption(projectPathOption).addOption(jsonOption).action((reference, commentId, emoji, options) => runBuildAction({
|
|
1061
1061
|
reference,
|
|
1062
1062
|
options,
|
|
1063
1063
|
auth: "user",
|
|
@@ -1100,7 +1100,7 @@ const registerCommentSubscribe = defineCommentAction({
|
|
|
1100
1100
|
//#endregion
|
|
1101
1101
|
//#region src/commands/comment/unreact.ts
|
|
1102
1102
|
function registerCommentUnreact(comment) {
|
|
1103
|
-
comment.command("unreact").description("Remove one of your emoji reactions from a comment").argument("<buildReference>", "Build number or
|
|
1103
|
+
comment.command("unreact").description("Remove one of your emoji reactions from a comment").argument("<buildReference>", "Build number or Snapvisor build URL").argument("<commentId>", "ID of the comment").argument("<emoji>", "Emoji reaction to remove").addOption(tokenOption).addOption(projectPathOption).addOption(jsonOption).action((reference, commentId, emoji, options) => runBuildAction({
|
|
1104
1104
|
reference,
|
|
1105
1105
|
options,
|
|
1106
1106
|
auth: "user",
|
|
@@ -1163,7 +1163,7 @@ const LOGIN_TIMEOUT_MS = 300 * 1e3;
|
|
|
1163
1163
|
const CALLBACK_ERROR_HTML = `<!DOCTYPE html><html lang="en">
|
|
1164
1164
|
<head>
|
|
1165
1165
|
<meta charset="UTF-8">
|
|
1166
|
-
<title>
|
|
1166
|
+
<title>Snapvisor CLI</title>
|
|
1167
1167
|
</head>
|
|
1168
1168
|
<body>
|
|
1169
1169
|
<p>Authorization failed. Please run <code>argos login</code> again.</p>
|
|
@@ -1297,7 +1297,7 @@ function loginCommand(program) {
|
|
|
1297
1297
|
console.error(errorColor(`Error: Authentication failed${err instanceof Error ? ` — ${err.message}` : ""}. Please run \`argos login\` again.`));
|
|
1298
1298
|
process.exit(1);
|
|
1299
1299
|
}
|
|
1300
|
-
console.log(successColor("Logged in to
|
|
1300
|
+
console.log(successColor("Logged in to Snapvisor successfully."));
|
|
1301
1301
|
});
|
|
1302
1302
|
}
|
|
1303
1303
|
//#endregion
|
|
@@ -1311,7 +1311,7 @@ function logoutCommand(program) {
|
|
|
1311
1311
|
}
|
|
1312
1312
|
if (oauth) await revokeToken(oauth.refreshToken);
|
|
1313
1313
|
await clearStoredCredentials();
|
|
1314
|
-
console.log("Logged out from
|
|
1314
|
+
console.log("Logged out from Snapvisor.");
|
|
1315
1315
|
});
|
|
1316
1316
|
}
|
|
1317
1317
|
//#endregion
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@snapvisor/cli",
|
|
3
3
|
"description": "Command-line (CLI) for visual testing with Snapvisor.",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "7.0.0",
|
|
5
5
|
"bin": {
|
|
6
6
|
"snapvisor": "./bin/argos-cli.js",
|
|
7
7
|
"argos": "./bin/argos-cli.js"
|
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
},
|
|
13
13
|
"repository": {
|
|
14
14
|
"type": "git",
|
|
15
|
-
"url": "https://github.com/
|
|
16
|
-
"directory": "packages/
|
|
15
|
+
"url": "git+https://github.com/DevinoSolutions/snapvisor-js.git",
|
|
16
|
+
"directory": "packages/cli"
|
|
17
17
|
},
|
|
18
|
-
"homepage": "https://
|
|
18
|
+
"homepage": "https://snapvisor.io/docs",
|
|
19
19
|
"bugs": {
|
|
20
20
|
"url": "https://github.com/argos-ci/argos-javascript/issues"
|
|
21
21
|
},
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"access": "public"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@snapvisor/api-client": "0.
|
|
39
|
-
"@snapvisor/core": "
|
|
38
|
+
"@snapvisor/api-client": "0.27.0",
|
|
39
|
+
"@snapvisor/core": "7.0.0",
|
|
40
40
|
"commander": "^15.0.0",
|
|
41
41
|
"open": "^11.0.0",
|
|
42
42
|
"ora": "^9.4.0",
|
|
@@ -55,5 +55,5 @@
|
|
|
55
55
|
"check-format": "prettier --check --ignore-unknown --ignore-path=../../.gitignore --ignore-path=../../.prettierignore .",
|
|
56
56
|
"lint": "eslint ."
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "b27308a53667724cc3c4f3e5eb7811bce3321f15"
|
|
59
59
|
}
|