@gonovus-ai/spec-flow-cli 0.0.0-stage → 0.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/README.md +805 -2
- package/dist/authentication-command-topology.d.ts +7 -0
- package/dist/authentication-command-topology.js +9 -0
- package/dist/authentication-command-topology.js.map +1 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +52 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.js +3355 -0
- package/dist/cli.js.map +1 -0
- package/dist/client-identity.d.ts +12 -0
- package/dist/client-identity.js +29 -0
- package/dist/client-identity.js.map +1 -0
- package/dist/credential-store.d.ts +20 -0
- package/dist/credential-store.js +146 -0
- package/dist/credential-store.js.map +1 -0
- package/dist/default-api-origin.d.ts +1 -0
- package/dist/default-api-origin.js +1 -0
- package/dist/default-api-origin.js.map +1 -0
- package/dist/github-account-commands.d.ts +25 -0
- package/dist/github-account-commands.js +117 -0
- package/dist/github-account-commands.js.map +1 -0
- package/dist/github-connection-commands.d.ts +4 -0
- package/dist/github-connection-commands.js +99 -0
- package/dist/github-connection-commands.js.map +1 -0
- package/dist/github-import-commands.d.ts +3 -0
- package/dist/github-import-commands.js +64 -0
- package/dist/github-import-commands.js.map +1 -0
- package/dist/http-origin.d.ts +13 -0
- package/dist/http-origin.js +39 -0
- package/dist/http-origin.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +240 -0
- package/dist/index.js.map +1 -0
- package/dist/node-version.d.ts +1 -0
- package/dist/node-version.js +8 -0
- package/dist/node-version.js.map +1 -0
- package/dist/product-map-commands.d.ts +17 -0
- package/dist/product-map-commands.js +48 -0
- package/dist/product-map-commands.js.map +1 -0
- package/dist/safe-cli-error.d.ts +2 -0
- package/dist/safe-cli-error.js +3 -0
- package/dist/safe-cli-error.js.map +1 -0
- package/dist/user-agent.d.ts +3 -0
- package/dist/user-agent.js +10 -0
- package/dist/user-agent.js.map +1 -0
- package/dist/user-api-key-commands.d.ts +28 -0
- package/dist/user-api-key-commands.js +129 -0
- package/dist/user-api-key-commands.js.map +1 -0
- package/dist/work-item-asset-commands.d.ts +24 -0
- package/dist/work-item-asset-commands.js +217 -0
- package/dist/work-item-asset-commands.js.map +1 -0
- package/dist/work-item-exchange-file.d.ts +4 -0
- package/dist/work-item-exchange-file.js +66 -0
- package/dist/work-item-exchange-file.js.map +1 -0
- package/dist/work-item-resource-link-commands.d.ts +23 -0
- package/dist/work-item-resource-link-commands.js +96 -0
- package/dist/work-item-resource-link-commands.js.map +1 -0
- package/dist/work-item-time-entry-input.d.ts +4 -0
- package/dist/work-item-time-entry-input.js +27 -0
- package/dist/work-item-time-entry-input.js.map +1 -0
- package/package.json +54 -4
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { InvalidArgumentError } from "commander";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { registerGitHubConnectionCommands } from "./github-connection-commands.js";
|
|
4
|
+
import { registerGitHubImportCommands } from "./github-import-commands.js";
|
|
5
|
+
const identity = z.number().int().positive().max(Number.MAX_SAFE_INTEGER);
|
|
6
|
+
const metadata = z.object({ accountId: identity, login: z.string(), status: z.enum(["connected", "disconnected", "credential-invalid"]), expiresAt: z.iso.datetime().nullable(), version: z.string().regex(/^"[1-9]\d*"$/) });
|
|
7
|
+
const read = z.object({ enabled: z.boolean(), account: metadata.nullable(), browserAuthorizationUrl: z.url().nullable() });
|
|
8
|
+
const page = (value) => {
|
|
9
|
+
const result = z.coerce.number().int().min(1).max(10_000).safeParse(value);
|
|
10
|
+
if (!result.success)
|
|
11
|
+
throw new InvalidArgumentError("Page must be an integer from 1 through 10000");
|
|
12
|
+
return result.data;
|
|
13
|
+
};
|
|
14
|
+
const installationId = (value) => {
|
|
15
|
+
const result = z.coerce.number().int().positive().max(Number.MAX_SAFE_INTEGER).safeParse(value);
|
|
16
|
+
if (!result.success)
|
|
17
|
+
throw new InvalidArgumentError("Installation ID must be a positive safe integer");
|
|
18
|
+
return result.data;
|
|
19
|
+
};
|
|
20
|
+
const version = (value) => {
|
|
21
|
+
if (!/^"[1-9]\d*"$/.test(value) || Number(value.slice(1, -1)) > 2_147_483_647)
|
|
22
|
+
throw new InvalidArgumentError("Expected version must be the quoted version returned by account status");
|
|
23
|
+
return value;
|
|
24
|
+
};
|
|
25
|
+
const uuid = (value) => {
|
|
26
|
+
if (!z.uuid().safeParse(value).success)
|
|
27
|
+
throw new InvalidArgumentError("Command identity must be a UUID");
|
|
28
|
+
return value.toLowerCase();
|
|
29
|
+
};
|
|
30
|
+
function browserEntry(value) {
|
|
31
|
+
const url = new URL(value);
|
|
32
|
+
if ((url.protocol !== "https:" && !(url.protocol === "http:" && url.hostname === "127.0.0.1")) || url.username !== "" || url.password !== "" || url.pathname !== "/account/github" || url.search !== "" || url.hash !== "")
|
|
33
|
+
throw new Error("Invalid browser entry");
|
|
34
|
+
return url.toString();
|
|
35
|
+
}
|
|
36
|
+
export function registerGitHubAccountCommands(program, runtime) {
|
|
37
|
+
const github = program.command("github").description("Manage the supported GitHub integration");
|
|
38
|
+
registerGitHubConnectionCommands(github, runtime);
|
|
39
|
+
registerGitHubImportCommands(github, runtime);
|
|
40
|
+
const account = github.command("account").description("Manage your separately authorized GitHub account using a User Session");
|
|
41
|
+
account.command("status").action(async () => {
|
|
42
|
+
runtime.setExitCode(await runtime.run(async (client) => {
|
|
43
|
+
const result = await client.GET("/v1/github/account");
|
|
44
|
+
return result.response.ok ? { ...result, data: read.parse(result.data) } : result;
|
|
45
|
+
}, { requireUserSession: true }));
|
|
46
|
+
});
|
|
47
|
+
account.command("authorize").description("Open the normal SpecFlow browser flow; use the same User as this CLI Session")
|
|
48
|
+
.option("--no-open", "Print only the credential-free account page for opening manually")
|
|
49
|
+
.action(async (options) => {
|
|
50
|
+
let failed = false;
|
|
51
|
+
runtime.setExitCode(await runtime.run(async (client) => {
|
|
52
|
+
const result = await client.GET("/v1/github/account");
|
|
53
|
+
if (!result.response.ok)
|
|
54
|
+
return result;
|
|
55
|
+
const current = read.parse(result.data);
|
|
56
|
+
if (!current.enabled || current.browserAuthorizationUrl === null) {
|
|
57
|
+
failed = true;
|
|
58
|
+
return { ...result, data: { browserOpened: false, enabled: false } };
|
|
59
|
+
}
|
|
60
|
+
const url = browserEntry(current.browserAuthorizationUrl);
|
|
61
|
+
let browserOpened = false;
|
|
62
|
+
if (options.open && runtime.dependencies.open !== undefined) {
|
|
63
|
+
try {
|
|
64
|
+
await runtime.dependencies.open(url);
|
|
65
|
+
browserOpened = true;
|
|
66
|
+
}
|
|
67
|
+
catch { /* A manual entry contains no one-time credentials. */ }
|
|
68
|
+
}
|
|
69
|
+
return { ...result, data: { browserOpened, browserAuthorizationUrl: url } };
|
|
70
|
+
}, { requireUserSession: true, validateSuccess: () => failed ? { message: "GitHub integration is not enabled on this server", reason: "Temporary Failure", retryable: false } : null }));
|
|
71
|
+
});
|
|
72
|
+
account.command("disconnect").description("Disconnect the observed authorization; preserve command identity when retrying")
|
|
73
|
+
.requiredOption("--expected-version <version>", "Quoted version from account status", version)
|
|
74
|
+
.requiredOption("--idempotency-key <id>", "Same UUID for same-intent retry", uuid)
|
|
75
|
+
.action(async (options) => {
|
|
76
|
+
runtime.setExitCode(await runtime.run(async (client) => {
|
|
77
|
+
const result = await client.DELETE("/v1/github/account", { params: { header: { "if-match": options.expectedVersion, "idempotency-key": options.idempotencyKey } } });
|
|
78
|
+
return result.response.ok ? { ...result, data: metadata.parse(result.data) } : result;
|
|
79
|
+
}, { requireUserSession: true }));
|
|
80
|
+
});
|
|
81
|
+
github.command("install").description("Open the configured GitHub App installation page; return and reread accessible repositories afterwards")
|
|
82
|
+
.option("--no-open", "Print the credential-free GitHub installation page for opening manually")
|
|
83
|
+
.action(async (options) => {
|
|
84
|
+
runtime.setExitCode(await runtime.run(async (client) => {
|
|
85
|
+
const result = await client.GET("/v1/github/application");
|
|
86
|
+
if (!result.response.ok)
|
|
87
|
+
return result;
|
|
88
|
+
const application = z.object({ id: identity, name: z.string().min(1).max(200), installationUrl: z.url() }).parse(result.data);
|
|
89
|
+
const url = new URL(application.installationUrl);
|
|
90
|
+
if (url.protocol !== "https:" || url.hostname !== "github.com" || url.port !== "" || url.username !== "" || url.password !== "" || url.search !== "" || url.hash !== "" || !/^\/apps\/[A-Za-z0-9_-][A-Za-z0-9_.-]{0,199}\/installations\/new$/.test(url.pathname))
|
|
91
|
+
throw new Error("Invalid installation entry");
|
|
92
|
+
let browserOpened = false;
|
|
93
|
+
if (options.open && runtime.dependencies.open !== undefined) {
|
|
94
|
+
try {
|
|
95
|
+
await runtime.dependencies.open(url.toString());
|
|
96
|
+
browserOpened = true;
|
|
97
|
+
}
|
|
98
|
+
catch { /* Print the public installation URL for manual opening. */ }
|
|
99
|
+
}
|
|
100
|
+
return { ...result, data: { ...application, installationUrl: url.toString(), browserOpened } };
|
|
101
|
+
}, { requireUserSession: true }));
|
|
102
|
+
});
|
|
103
|
+
github.command("installations").option("--page <page>", "Page number", page, 1).action(async (options) => {
|
|
104
|
+
runtime.setExitCode(await runtime.run(async (client) => {
|
|
105
|
+
const result = await client.GET("/v1/github/installations", { params: { query: options } });
|
|
106
|
+
return result.response.ok ? { ...result, data: z.object({ installations: z.array(z.object({ id: identity, account: z.object({ id: identity, login: z.string() }) })) }).parse(result.data) } : result;
|
|
107
|
+
}, { requireUserSession: true }));
|
|
108
|
+
});
|
|
109
|
+
github.command("repositories").requiredOption("--installation-id <id>", "Installation identity", installationId).option("--page <page>", "Page number", page, 1)
|
|
110
|
+
.action(async (options) => {
|
|
111
|
+
runtime.setExitCode(await runtime.run(async (client) => {
|
|
112
|
+
const result = await client.GET("/v1/github/installations/{installationId}/repositories", { params: { path: { installationId: options.installationId }, query: { page: options.page } } });
|
|
113
|
+
return result.response.ok ? { ...result, data: z.object({ repositories: z.array(z.object({ installationId: identity, repositoryId: identity, owner: z.string(), name: z.string(), private: z.boolean(), administrator: z.boolean() })) }).parse(result.data) } : result;
|
|
114
|
+
}, { requireUserSession: true }));
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=github-account-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-account-commands.js","sourceRoot":"","sources":["../src/github-account-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type Command } from "commander";
|
|
2
|
+
import type { GitHubCommandRuntime } from "./github-account-commands.js";
|
|
3
|
+
/** Team configuration uses the same Session and Project operation boundary. */
|
|
4
|
+
export declare function registerGitHubConnectionCommands(github: Command, runtime: GitHubCommandRuntime): void;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { InvalidArgumentError } from "commander";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
const identity = z.number().int().positive().max(Number.MAX_SAFE_INTEGER);
|
|
4
|
+
const rule = z.object({ event: z.enum(["branch_push", "pr_opened", "pr_merged", "issue_opened", "issue_closed"]), columnId: z.string().min(1).max(200) }).strict();
|
|
5
|
+
const rules = z.array(rule).max(5).refine((values) => new Set(values.map((value) => value.event)).size === values.length);
|
|
6
|
+
const branchPatterns = ["{slug}-{number}", "{slug}-{number}-{title}", "{number}", "{number}-{title}", "feature/{slug}-{number}", "feature/{number}-{title}", "fix/{slug}-{number}", "fix/{number}-{title}"];
|
|
7
|
+
const branchPattern = (value) => { const parsed = z.enum(branchPatterns).safeParse(value); if (!parsed.success)
|
|
8
|
+
throw new InvalidArgumentError("Choose a supported GitHub branch template"); return parsed.data; };
|
|
9
|
+
const customBranchRegex = (value) => {
|
|
10
|
+
if (!value || value.length > 500)
|
|
11
|
+
throw new InvalidArgumentError("A custom branch regexp must contain 1 to 500 characters");
|
|
12
|
+
try {
|
|
13
|
+
new RegExp(value, "i");
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new InvalidArgumentError("The custom branch regexp is invalid");
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
};
|
|
20
|
+
const metadata = z.object({ id: z.uuid(), projectId: z.string(), installationId: identity, repositoryId: identity, owner: z.string(), name: z.string(), status: z.enum(["connected", "importing", "import-failed", "reauthorization-required", "off", "disconnected"]).optional(), active: z.boolean(), outbound: z.boolean().optional(), disconnected: z.boolean().optional(), commentTaskLink: z.boolean(), branchPattern: z.enum(branchPatterns), customBranchRegex: z.string().min(1).max(500).nullable(), version: z.string().regex(/^"[1-9]\d*"$/), rules, createdAt: z.iso.datetime(), updatedAt: z.iso.datetime() });
|
|
21
|
+
const positiveIdentity = (value) => { const parsed = z.coerce.number().pipe(identity).safeParse(value); if (!parsed.success)
|
|
22
|
+
throw new InvalidArgumentError("GitHub identities must be positive safe integers"); return parsed.data; };
|
|
23
|
+
const uuid = (value) => { if (!z.uuid().safeParse(value).success)
|
|
24
|
+
throw new InvalidArgumentError("Command and delegation identities must be UUIDs"); return value.toLowerCase(); };
|
|
25
|
+
const version = (value) => { if (!/^"[1-9]\d{0,9}"$/.test(value) || Number(value.slice(1, -1)) > 2_147_483_647)
|
|
26
|
+
throw new InvalidArgumentError("Use the quoted observed connection version"); return value; };
|
|
27
|
+
const observed = (value) => value === "none" ? value : version(value);
|
|
28
|
+
const boolean = (value) => { if (value !== "true" && value !== "false")
|
|
29
|
+
throw new InvalidArgumentError("Use true or false"); return value === "true"; };
|
|
30
|
+
const workflowRules = (value) => {
|
|
31
|
+
try {
|
|
32
|
+
return rules.parse(JSON.parse(value));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
throw new InvalidArgumentError("Rules must be a JSON array of unique GitHub events and workflow column identities");
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
/** Team configuration uses the same Session and Project operation boundary. */
|
|
39
|
+
export function registerGitHubConnectionCommands(github, runtime) {
|
|
40
|
+
const connection = github.command("connection").description("Manage a Project's GitHub repository connection");
|
|
41
|
+
connection.command("list").requiredOption("--project-id <projectId>").action(async (options) => {
|
|
42
|
+
runtime.setExitCode(await runtime.run((client) => client.GET("/v1/projects/{projectId}/github/connections", { params: { path: options } }), {}));
|
|
43
|
+
});
|
|
44
|
+
connection.command("status").requiredOption("--project-id <projectId>").requiredOption("--connection-id <id>", "Explicit repository connection", uuid).action(async (options) => {
|
|
45
|
+
runtime.setExitCode(await runtime.run(async (client) => {
|
|
46
|
+
const result = await client.GET("/v1/projects/{projectId}/github/connections/{connectionId}", { params: { path: options } });
|
|
47
|
+
return result.response.ok ? { ...result, data: z.object({ enabled: z.boolean(), connection: metadata.nullable() }).parse(result.data) } : result;
|
|
48
|
+
}, {}));
|
|
49
|
+
});
|
|
50
|
+
connection.command("connect").requiredOption("--project-id <projectId>").option("--outbound <true|false>", "Create new Issues here", boolean)
|
|
51
|
+
.requiredOption("--owner <owner>").requiredOption("--repository <name>")
|
|
52
|
+
.requiredOption("--installation-id <id>", "Verified GitHub App installation", positiveIdentity)
|
|
53
|
+
.requiredOption("--repository-id <id>", "Stable numeric repository identity", positiveIdentity)
|
|
54
|
+
.requiredOption("--delegate-key-id <id>", "Your explicit current Task/label API key identity; never its secret", uuid)
|
|
55
|
+
.requiredOption("--expected-version <version|none>", "Quoted version, or none only after observing no connection", observed)
|
|
56
|
+
.requiredOption("--idempotency-key <id>", "Same UUID for the same intent", uuid)
|
|
57
|
+
.action(async (options) => {
|
|
58
|
+
runtime.setExitCode(await runtime.run(async (client) => {
|
|
59
|
+
const result = await client.POST("/v1/projects/{projectId}/github/connections", {
|
|
60
|
+
body: { ...(options.outbound === undefined ? {} : { outbound: options.outbound }), binding: { owner: options.owner, name: options.repository, installationId: options.installationId, repositoryId: options.repositoryId }, delegateKeyId: options.delegateKeyId },
|
|
61
|
+
params: { path: { projectId: options.projectId }, header: { "idempotency-key": options.idempotencyKey, ...(options.expectedVersion === "none" ? { "if-none-match": "*" } : { "if-match": options.expectedVersion }) } },
|
|
62
|
+
});
|
|
63
|
+
return result.response.ok ? { ...result, data: metadata.parse(result.data) } : result;
|
|
64
|
+
}, { requireUserSession: true }));
|
|
65
|
+
});
|
|
66
|
+
connection.command("update").requiredOption("--project-id <projectId>").requiredOption("--connection-id <id>", "Explicit repository connection", uuid)
|
|
67
|
+
.requiredOption("--expected-version <version>", "Observed quoted connection version", version)
|
|
68
|
+
.requiredOption("--idempotency-key <id>", "Same UUID for the same intent", uuid)
|
|
69
|
+
.option("--outbound <true|false>", "Use this repository for new Issues", boolean)
|
|
70
|
+
.option("--active <true|false>", "Enable or turn off synchronization", boolean)
|
|
71
|
+
.option("--comment-task-link <true|false>", "Comment the task link on GitHub issues", boolean)
|
|
72
|
+
.option("--branch-pattern <template>", "Choose one of the eight supported branch templates", branchPattern)
|
|
73
|
+
.option("--custom-branch-regex <expression>", "Match the first capture as a Task number; overrides the template", customBranchRegex)
|
|
74
|
+
.option("--clear-custom-branch-regex", "Return to the configured branch template")
|
|
75
|
+
.option("--rules-json <json>", "Replace the five supported event-to-column mappings", workflowRules)
|
|
76
|
+
.action(async (options) => {
|
|
77
|
+
if (options.outbound === undefined && options.active === undefined && options.commentTaskLink === undefined && options.rulesJson === undefined && options.branchPattern === undefined && options.customBranchRegex === undefined && !options.clearCustomBranchRegex)
|
|
78
|
+
throw new InvalidArgumentError("Specify an explicit connection setting to update");
|
|
79
|
+
if (options.clearCustomBranchRegex && options.customBranchRegex !== undefined)
|
|
80
|
+
throw new InvalidArgumentError("Choose a custom regexp or clear it");
|
|
81
|
+
runtime.setExitCode(await runtime.run(async (client) => {
|
|
82
|
+
const result = await client.PATCH("/v1/projects/{projectId}/github/connections/{connectionId}", {
|
|
83
|
+
body: { ...(options.outbound === undefined ? {} : { outbound: options.outbound }), ...(options.active === undefined ? {} : { active: options.active }), ...(options.commentTaskLink === undefined ? {} : { commentTaskLink: options.commentTaskLink }), ...(options.rulesJson === undefined ? {} : { rules: options.rulesJson }), ...(options.branchPattern === undefined ? {} : { branchPattern: options.branchPattern }), ...(options.clearCustomBranchRegex ? { customBranchRegex: null } : options.customBranchRegex === undefined ? {} : { customBranchRegex: options.customBranchRegex }) },
|
|
84
|
+
params: { path: { projectId: options.projectId, connectionId: options.connectionId }, header: { "if-match": options.expectedVersion, "idempotency-key": options.idempotencyKey } },
|
|
85
|
+
});
|
|
86
|
+
return result.response.ok ? { ...result, data: metadata.parse(result.data) } : result;
|
|
87
|
+
}, { requireUserSession: true }));
|
|
88
|
+
});
|
|
89
|
+
connection.command("disconnect").requiredOption("--project-id <projectId>").requiredOption("--connection-id <id>", "Explicit repository connection", uuid)
|
|
90
|
+
.requiredOption("--expected-version <version>", "Observed quoted connection version", version)
|
|
91
|
+
.requiredOption("--idempotency-key <id>", "Same UUID for the same intent", uuid)
|
|
92
|
+
.action(async (options) => {
|
|
93
|
+
runtime.setExitCode(await runtime.run(async (client) => {
|
|
94
|
+
const result = await client.DELETE("/v1/projects/{projectId}/github/connections/{connectionId}", { params: { path: { projectId: options.projectId, connectionId: options.connectionId }, header: { "if-match": options.expectedVersion, "idempotency-key": options.idempotencyKey } } });
|
|
95
|
+
return result.response.ok ? { ...result, data: z.object({ id: z.uuid(), version: z.string().regex(/^"[1-9]\d*"$/) }).parse(result.data) } : result;
|
|
96
|
+
}, { requireUserSession: true }));
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=github-connection-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-connection-commands.js","sourceRoot":"","sources":["../src/github-connection-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { InvalidArgumentError } from "commander";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { formatResourceDiagnostic } from "./cli.js";
|
|
6
|
+
const count = z.number().int().min(0).max(Number.MAX_SAFE_INTEGER);
|
|
7
|
+
const progress = z.object({ runId: z.uuid(), pending: z.boolean(), imported: count, updated: count, skipped: count });
|
|
8
|
+
const uuid = (value) => { if (!z.uuid().safeParse(value).success)
|
|
9
|
+
throw new InvalidArgumentError("Import and command identities must be UUIDs"); return value.toLowerCase(); };
|
|
10
|
+
const version = (value) => {
|
|
11
|
+
if (!/^"[1-9]\d{0,9}"$/.test(value) || Number(value.slice(1, -1)) > 2_147_483_647)
|
|
12
|
+
throw new InvalidArgumentError("Use the quoted observed connection version");
|
|
13
|
+
return value;
|
|
14
|
+
};
|
|
15
|
+
export function registerGitHubImportCommands(github, runtime) {
|
|
16
|
+
const imports = github.command("import").description("Import GitHub Issues and linked PRs using saved progress");
|
|
17
|
+
imports.command("status").requiredOption("--project-id <projectId>").requiredOption("--connection-id <id>", "Explicit repository connection", uuid).action(async (options) => {
|
|
18
|
+
runtime.setExitCode(await runtime.run(async (client) => {
|
|
19
|
+
const result = await client.GET("/v1/projects/{projectId}/github/connections/{connectionId}/import", { params: { path: options } });
|
|
20
|
+
return result.response.ok ? { ...result, data: z.object({ progress: progress.nullable() }).parse(result.data) } : result;
|
|
21
|
+
}, { requireUserSession: true }));
|
|
22
|
+
});
|
|
23
|
+
imports.command("run").requiredOption("--project-id <projectId>").requiredOption("--connection-id <id>", "Explicit repository connection", uuid)
|
|
24
|
+
.requiredOption("--expected-version <version>", "Quoted observed connection version", version)
|
|
25
|
+
.requiredOption("--idempotency-key <id>", "Keep the same UUID when retrying a lost start response", uuid)
|
|
26
|
+
.option("--run-id <id>", "Resume this saved import; a completed import returns its original counts", uuid)
|
|
27
|
+
.action(async (options) => {
|
|
28
|
+
runtime.setExitCode(await runtime.run(async (client) => {
|
|
29
|
+
let runId = options.runId;
|
|
30
|
+
let commandId = options.idempotencyKey;
|
|
31
|
+
let retries = 0;
|
|
32
|
+
for (;;) {
|
|
33
|
+
const result = await client.POST("/v1/projects/{projectId}/github/connections/{connectionId}/import", { body: runId === undefined ? {} : { runId },
|
|
34
|
+
params: { path: { projectId: options.projectId, connectionId: options.connectionId }, header: { "if-match": options.expectedVersion, "idempotency-key": commandId } } });
|
|
35
|
+
if (result.response.status === 429 && retries < 5) {
|
|
36
|
+
const retryAfter = result.response.headers.get("retry-after");
|
|
37
|
+
const seconds = retryAfter === null ? 1 : /^\d+$/u.test(retryAfter) ? Number(retryAfter) : Math.ceil((Date.parse(retryAfter) - Date.now()) / 1000);
|
|
38
|
+
// Long provider pauses return to the caller instead of blocking an interactive command.
|
|
39
|
+
if (!Number.isFinite(seconds) || seconds > 60)
|
|
40
|
+
return result;
|
|
41
|
+
retries++;
|
|
42
|
+
await delay(Math.max(0, seconds) * 1000);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (!result.response.ok) {
|
|
46
|
+
runtime.dependencies.stderr(formatResourceDiagnostic(runId === undefined
|
|
47
|
+
? "GitHub import failed; retry with the same initial command identity to resume saved progress"
|
|
48
|
+
: `GitHub import failed; resume run ${runId} with the observed connection version`));
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
const current = progress.parse(result.data);
|
|
52
|
+
if (runId !== undefined && current.runId !== runId || current.pending !== (result.response.status === 202))
|
|
53
|
+
throw new Error("Invalid GitHub import progress");
|
|
54
|
+
if (!current.pending)
|
|
55
|
+
return { ...result, data: current };
|
|
56
|
+
runId = current.runId;
|
|
57
|
+
commandId = randomUUID();
|
|
58
|
+
retries = 0;
|
|
59
|
+
runtime.dependencies.stderr(formatResourceDiagnostic(`GitHub import ${runId}: ${String(current.imported)} imported, ${String(current.updated)} updated, ${String(current.skipped)} skipped`));
|
|
60
|
+
}
|
|
61
|
+
}, { requireUserSession: true }));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=github-import-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-import-commands.js","sourceRoot":"","sources":["../src/github-import-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { defaultSpecFlowApiOrigin } from "./default-api-origin.js";
|
|
2
|
+
export declare function readBuildDefaultApiOrigin(value: string | undefined): string;
|
|
3
|
+
export declare function readServerFlag(arguments_: readonly string[]): string | undefined;
|
|
4
|
+
export declare function unresolvedSpecFlowApiOrigin(serverFlag: string | undefined, environmentUrl: string | undefined): string;
|
|
5
|
+
export type HttpOriginErrorReason = "invalid-url" | "unsupported-protocol" | "unexpected-components";
|
|
6
|
+
export type HttpOriginResult = {
|
|
7
|
+
readonly origin: string;
|
|
8
|
+
readonly valid: true;
|
|
9
|
+
} | {
|
|
10
|
+
readonly reason: HttpOriginErrorReason;
|
|
11
|
+
readonly valid: false;
|
|
12
|
+
};
|
|
13
|
+
export declare function parseHttpOrigin(value: string): HttpOriginResult;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { defaultSpecFlowApiOrigin } from "./default-api-origin.js";
|
|
2
|
+
export { defaultSpecFlowApiOrigin } from "./default-api-origin.js";
|
|
3
|
+
export function readBuildDefaultApiOrigin(value) {
|
|
4
|
+
if (value === undefined)
|
|
5
|
+
return "";
|
|
6
|
+
const result = parseHttpOrigin(value);
|
|
7
|
+
if (!result.valid || new URL(value).username !== "" || new URL(value).password !== "") {
|
|
8
|
+
throw new Error("SPEC_FLOW_DEFAULT_API_URL must be an HTTP(S) origin without credentials, path, query or fragment");
|
|
9
|
+
}
|
|
10
|
+
return result.origin;
|
|
11
|
+
}
|
|
12
|
+
export function readServerFlag(arguments_) {
|
|
13
|
+
const index = arguments_.indexOf("--server");
|
|
14
|
+
const value = index === -1 ? undefined : arguments_[index + 1];
|
|
15
|
+
if (value === undefined || value.startsWith("-")) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
export function unresolvedSpecFlowApiOrigin(serverFlag, environmentUrl) {
|
|
21
|
+
return serverFlag ?? environmentUrl ?? defaultSpecFlowApiOrigin;
|
|
22
|
+
}
|
|
23
|
+
export function parseHttpOrigin(value) {
|
|
24
|
+
let url;
|
|
25
|
+
try {
|
|
26
|
+
url = new URL(value);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return { reason: "invalid-url", valid: false };
|
|
30
|
+
}
|
|
31
|
+
if (url.protocol !== "https:" && url.protocol !== "http:") {
|
|
32
|
+
return { reason: "unsupported-protocol", valid: false };
|
|
33
|
+
}
|
|
34
|
+
if (url.pathname !== "/" || url.search !== "" || url.hash !== "") {
|
|
35
|
+
return { reason: "unexpected-components", valid: false };
|
|
36
|
+
}
|
|
37
|
+
return { origin: url.origin, valid: true };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=http-origin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-origin.js","sourceRoot":"","sources":["../src/http-origin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,UAAU,yBAAyB,CAAC,KAAyB;IACjE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,EAAE,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QACtF,MAAM,IAAI,KAAK,CAAC,kGAAkG,CAAC,CAAC;IACtH,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,UAA6B;IAE7B,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,UAA8B,EAC9B,cAAkC;IAElC,OAAO,UAAU,IAAI,cAAc,IAAI,wBAAwB,CAAC;AAClE,CAAC;AAiBD,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC1D,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1D,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QACjE,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC7C,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type CliClientIdentity } from "./client-identity.js";
|
|
2
|
+
import { type CredentialStore } from "./credential-store.js";
|
|
3
|
+
export type { CredentialStore } from "./credential-store.js";
|
|
4
|
+
export { assertSupportedNodeVersion } from "./node-version.js";
|
|
5
|
+
export interface AuthenticationCliDependencies {
|
|
6
|
+
readonly environment?: Readonly<Record<string, string | undefined>>;
|
|
7
|
+
readonly createCredentialStore: (options: {
|
|
8
|
+
readonly allowFileFallback: boolean;
|
|
9
|
+
readonly serverOrigin: string;
|
|
10
|
+
readonly warning: (message: string) => void;
|
|
11
|
+
}) => Promise<CredentialStore>;
|
|
12
|
+
readonly fetch: typeof globalThis.fetch;
|
|
13
|
+
/** Where this CLI runs, reported once when a session is authorized. */
|
|
14
|
+
readonly clientIdentity?: () => CliClientIdentity;
|
|
15
|
+
readonly nodeVersion: string;
|
|
16
|
+
readonly open: (url: string) => Promise<unknown>;
|
|
17
|
+
readonly sleep: (milliseconds: number) => Promise<void>;
|
|
18
|
+
readonly stderr: (message: string) => void;
|
|
19
|
+
readonly stdout: (message: string) => void;
|
|
20
|
+
}
|
|
21
|
+
export declare function runSpecFlowCli(argv: readonly string[], dependencies?: AuthenticationCliDependencies): Promise<number>;
|
|
22
|
+
export { runCli, type CliDependencies, } from "./cli.js";
|