@spec0/cli 0.1.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/AGENTS.md +67 -0
- package/LICENSE +21 -0
- package/README.md +235 -0
- package/dist/commands/api/changelog.d.ts +9 -0
- package/dist/commands/api/changelog.d.ts.map +1 -0
- package/dist/commands/api/changelog.js +144 -0
- package/dist/commands/api/changelog.js.map +1 -0
- package/dist/commands/api/index.d.ts +6 -0
- package/dist/commands/api/index.d.ts.map +1 -0
- package/dist/commands/api/index.js +13 -0
- package/dist/commands/api/index.js.map +1 -0
- package/dist/commands/api/list.d.ts +10 -0
- package/dist/commands/api/list.d.ts.map +1 -0
- package/dist/commands/api/list.js +79 -0
- package/dist/commands/api/list.js.map +1 -0
- package/dist/commands/api/show.d.ts +9 -0
- package/dist/commands/api/show.d.ts.map +1 -0
- package/dist/commands/api/show.js +88 -0
- package/dist/commands/api/show.js.map +1 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +166 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/ci/generate.d.ts +10 -0
- package/dist/commands/ci/generate.d.ts.map +1 -0
- package/dist/commands/ci/generate.js +72 -0
- package/dist/commands/ci/generate.js.map +1 -0
- package/dist/commands/ci/index.d.ts +3 -0
- package/dist/commands/ci/index.d.ts.map +1 -0
- package/dist/commands/ci/index.js +6 -0
- package/dist/commands/ci/index.js.map +1 -0
- package/dist/commands/commands.d.ts +19 -0
- package/dist/commands/commands.d.ts.map +1 -0
- package/dist/commands/commands.js +127 -0
- package/dist/commands/commands.js.map +1 -0
- package/dist/commands/diff.d.ts +6 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +102 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +54 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +67 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +6 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +109 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/log.d.ts +6 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +95 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/mcp.d.ts +6 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +59 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/mock/create.d.ts +14 -0
- package/dist/commands/mock/create.d.ts.map +1 -0
- package/dist/commands/mock/create.js +75 -0
- package/dist/commands/mock/create.js.map +1 -0
- package/dist/commands/mock/index.d.ts +9 -0
- package/dist/commands/mock/index.d.ts.map +1 -0
- package/dist/commands/mock/index.js +18 -0
- package/dist/commands/mock/index.js.map +1 -0
- package/dist/commands/mock/list.d.ts +8 -0
- package/dist/commands/mock/list.d.ts.map +1 -0
- package/dist/commands/mock/list.js +52 -0
- package/dist/commands/mock/list.js.map +1 -0
- package/dist/commands/mock/show.d.ts +9 -0
- package/dist/commands/mock/show.d.ts.map +1 -0
- package/dist/commands/mock/show.js +68 -0
- package/dist/commands/mock/show.js.map +1 -0
- package/dist/commands/mock/url.d.ts +10 -0
- package/dist/commands/mock/url.d.ts.map +1 -0
- package/dist/commands/mock/url.js +42 -0
- package/dist/commands/mock/url.js.map +1 -0
- package/dist/commands/mock.d.ts +6 -0
- package/dist/commands/mock.d.ts.map +1 -0
- package/dist/commands/mock.js +116 -0
- package/dist/commands/mock.js.map +1 -0
- package/dist/commands/publish.d.ts +11 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +242 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/pull.d.ts +6 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +62 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +18 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +302 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/register.d.ts +6 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +213 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/search.d.ts +6 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +58 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +86 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync-status.d.ts +14 -0
- package/dist/commands/sync-status.d.ts.map +1 -0
- package/dist/commands/sync-status.js +119 -0
- package/dist/commands/sync-status.js.map +1 -0
- package/dist/commands/team.d.ts +6 -0
- package/dist/commands/team.d.ts.map +1 -0
- package/dist/commands/team.js +30 -0
- package/dist/commands/team.js.map +1 -0
- package/dist/commands/version.d.ts +6 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +31 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent-mode.d.ts +25 -0
- package/dist/lib/agent-mode.d.ts.map +1 -0
- package/dist/lib/agent-mode.js +36 -0
- package/dist/lib/agent-mode.js.map +1 -0
- package/dist/lib/api-client.d.ts +37 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +144 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/auth-context.d.ts +18 -0
- package/dist/lib/auth-context.d.ts.map +1 -0
- package/dist/lib/auth-context.js +48 -0
- package/dist/lib/auth-context.js.map +1 -0
- package/dist/lib/breaking-change.d.ts +12 -0
- package/dist/lib/breaking-change.d.ts.map +1 -0
- package/dist/lib/breaking-change.js +10 -0
- package/dist/lib/breaking-change.js.map +1 -0
- package/dist/lib/ci-detect.d.ts +33 -0
- package/dist/lib/ci-detect.d.ts.map +1 -0
- package/dist/lib/ci-detect.js +136 -0
- package/dist/lib/ci-detect.js.map +1 -0
- package/dist/lib/cli-spec-path.d.ts +6 -0
- package/dist/lib/cli-spec-path.d.ts.map +1 -0
- package/dist/lib/cli-spec-path.js +34 -0
- package/dist/lib/cli-spec-path.js.map +1 -0
- package/dist/lib/codeowners.d.ts +11 -0
- package/dist/lib/codeowners.d.ts.map +1 -0
- package/dist/lib/codeowners.js +43 -0
- package/dist/lib/codeowners.js.map +1 -0
- package/dist/lib/config.d.ts +24 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +49 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/deprecation.d.ts +17 -0
- package/dist/lib/deprecation.d.ts.map +1 -0
- package/dist/lib/deprecation.js +22 -0
- package/dist/lib/deprecation.js.map +1 -0
- package/dist/lib/doctor.d.ts +40 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +107 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/exit-codes.d.ts +51 -0
- package/dist/lib/exit-codes.d.ts.map +1 -0
- package/dist/lib/exit-codes.js +78 -0
- package/dist/lib/exit-codes.js.map +1 -0
- package/dist/lib/lint.d.ts +18 -0
- package/dist/lib/lint.d.ts.map +1 -0
- package/dist/lib/lint.js +41 -0
- package/dist/lib/lint.js.map +1 -0
- package/dist/lib/local-config-yaml.d.ts +14 -0
- package/dist/lib/local-config-yaml.d.ts.map +1 -0
- package/dist/lib/local-config-yaml.js +29 -0
- package/dist/lib/local-config-yaml.js.map +1 -0
- package/dist/lib/output/index.d.ts +69 -0
- package/dist/lib/output/index.d.ts.map +1 -0
- package/dist/lib/output/index.js +120 -0
- package/dist/lib/output/index.js.map +1 -0
- package/dist/lib/output/table.d.ts +19 -0
- package/dist/lib/output/table.d.ts.map +1 -0
- package/dist/lib/output/table.js +48 -0
- package/dist/lib/output/table.js.map +1 -0
- package/dist/lib/output.d.ts +32 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +64 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/platform-defaults.d.ts +27 -0
- package/dist/lib/platform-defaults.d.ts.map +1 -0
- package/dist/lib/platform-defaults.js +36 -0
- package/dist/lib/platform-defaults.js.map +1 -0
- package/dist/lib/ref-resolver.d.ts +37 -0
- package/dist/lib/ref-resolver.d.ts.map +1 -0
- package/dist/lib/ref-resolver.js +56 -0
- package/dist/lib/ref-resolver.js.map +1 -0
- package/dist/lib/registry-ref.d.ts +10 -0
- package/dist/lib/registry-ref.d.ts.map +1 -0
- package/dist/lib/registry-ref.js +18 -0
- package/dist/lib/registry-ref.js.map +1 -0
- package/dist/lib/spec-finder.d.ts +6 -0
- package/dist/lib/spec-finder.d.ts.map +1 -0
- package/dist/lib/spec-finder.js +42 -0
- package/dist/lib/spec-finder.js.map +1 -0
- package/dist/lib/update-check.d.ts +12 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +62 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/version.d.ts +17 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +33 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/lib/winspect-yaml.d.ts +14 -0
- package/dist/lib/winspect-yaml.d.ts.map +1 -0
- package/dist/lib/winspect-yaml.js +28 -0
- package/dist/lib/winspect-yaml.js.map +1 -0
- package/dist/types.d.ts +664 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 api show <ref> — single-API metadata.
|
|
3
|
+
*
|
|
4
|
+
* Backed by GET /apis/{apiId}/summary. Resolves <ref> via ref-resolver:
|
|
5
|
+
* accepts <org>/<api>, bare <api>, or a UUID.
|
|
6
|
+
*/
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { createOrgApiClient, is401 } from "../../lib/api-client.js";
|
|
9
|
+
import { requireOrgContext } from "../../lib/auth-context.js";
|
|
10
|
+
import { ExitCode } from "../../lib/exit-codes.js";
|
|
11
|
+
import { emit, fail, resolveOutputContext } from "../../lib/output/index.js";
|
|
12
|
+
import { resolveRef, resolveApiId } from "../../lib/ref-resolver.js";
|
|
13
|
+
import { getDefaultOrgId, getOrgConfig } from "../../lib/config.js";
|
|
14
|
+
export function registerApiShowCommand(api) {
|
|
15
|
+
api
|
|
16
|
+
.command("show <ref>")
|
|
17
|
+
.description("Show metadata for a single API (no spec body).")
|
|
18
|
+
.option("--org <uuid>", "Org id override")
|
|
19
|
+
.option("--output <format>", "Output format: text, json, or yaml (default: text)")
|
|
20
|
+
.action(async (ref, opts) => {
|
|
21
|
+
const outCtx = resolveOutputContext(opts);
|
|
22
|
+
let authCtx;
|
|
23
|
+
try {
|
|
24
|
+
authCtx = requireOrgContext(opts.org);
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
fail(outCtx, ExitCode.AUTH_MISSING, e.message, {
|
|
28
|
+
hint: "Set SPEC0_TOKEN + SPEC0_ORG_ID, or run 'spec0 auth login'.",
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
const defaultOrg = (() => {
|
|
32
|
+
const id = process.env.PLATFORM_ORG_ID ?? getDefaultOrgId();
|
|
33
|
+
return id ? getOrgConfig(id)?.name : undefined;
|
|
34
|
+
})();
|
|
35
|
+
let parsed;
|
|
36
|
+
try {
|
|
37
|
+
parsed = resolveRef(ref, { defaultOrg });
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
fail(outCtx, ExitCode.USAGE, e.message);
|
|
41
|
+
}
|
|
42
|
+
const client = createOrgApiClient(authCtx);
|
|
43
|
+
try {
|
|
44
|
+
const apiId = await resolveApiId(client, parsed);
|
|
45
|
+
const res = (await client.getJson(`/apis/${apiId}/summary`));
|
|
46
|
+
if (!res.api) {
|
|
47
|
+
fail(outCtx, ExitCode.NOT_FOUND, `No API found for ref '${ref}'.`, {
|
|
48
|
+
hint: "Run 'spec0 api list' to see what exists in this org.",
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
emit(outCtx, res.api, renderApiShowText);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
if (is401(err)) {
|
|
55
|
+
fail(outCtx, ExitCode.AUTH_MISSING, "Token invalid or expired.", {
|
|
56
|
+
hint: "Run 'spec0 auth login' or refresh SPEC0_TOKEN.",
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (err.message?.includes("No API named")) {
|
|
60
|
+
fail(outCtx, ExitCode.NOT_FOUND, err.message, {
|
|
61
|
+
hint: "Run 'spec0 api list' to see what exists in this org.",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
fail(outCtx, ExitCode.GENERIC, `api show failed: ${err.message}`);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function renderApiShowText(api) {
|
|
69
|
+
const lines = [];
|
|
70
|
+
lines.push(chalk.bold(`${api.apiName ?? "?"} ${chalk.gray(`v${api.version ?? "?"}`)}`));
|
|
71
|
+
if (api.description)
|
|
72
|
+
lines.push(api.description);
|
|
73
|
+
lines.push("");
|
|
74
|
+
lines.push(` status: ${api.status ?? "—"}`);
|
|
75
|
+
lines.push(` team: ${api.teamName ?? "—"}`);
|
|
76
|
+
lines.push(` apiId: ${api.apiId ?? "—"}`);
|
|
77
|
+
lines.push(` operations: ${api.operations?.length ?? 0}`);
|
|
78
|
+
lines.push(` environments: ${api.apiEnvConfigs?.length ?? 0}`);
|
|
79
|
+
lines.push(` subscribers: ${api.subscriberCount ?? 0}`);
|
|
80
|
+
if (api.specSourceType)
|
|
81
|
+
lines.push(` specSource: ${api.specSourceType}`);
|
|
82
|
+
if (api.githubBlobUrl)
|
|
83
|
+
lines.push(` github: ${api.githubBlobUrl}`);
|
|
84
|
+
if (api.updatedAt)
|
|
85
|
+
lines.push(` updated: ${api.updatedAt}`);
|
|
86
|
+
return lines.join("\n");
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/commands/api/show.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0CpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAoJpD"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 auth login | logout | status | token | switch
|
|
3
|
+
*/
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { createServer } from "http";
|
|
6
|
+
import { randomBytes } from "crypto";
|
|
7
|
+
import open from "open";
|
|
8
|
+
import { getConfig, getDefaultOrgId, getOrgConfig, setOrgConfig, setDefaultOrg, clearConfig, } from "../lib/config.js";
|
|
9
|
+
import { resolvedPlatformAppUrl, resolvedPlatformApiUrl } from "../lib/platform-defaults.js";
|
|
10
|
+
import { ExitCode, exit } from "../lib/exit-codes.js";
|
|
11
|
+
function getAppUrl() {
|
|
12
|
+
return resolvedPlatformAppUrl();
|
|
13
|
+
}
|
|
14
|
+
function getApiUrl() {
|
|
15
|
+
return resolvedPlatformApiUrl();
|
|
16
|
+
}
|
|
17
|
+
function printAuthStatus() {
|
|
18
|
+
const defaultOrgId = getDefaultOrgId();
|
|
19
|
+
if (!defaultOrgId) {
|
|
20
|
+
console.log(chalk.yellow("Not logged in. Run 'spec0 auth login'."));
|
|
21
|
+
console.log(chalk.gray("For CI/CD, set SPEC0_TOKEN and SPEC0_ORG_ID environment variables."));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const org = getOrgConfig(defaultOrgId);
|
|
25
|
+
if (!org) {
|
|
26
|
+
console.log(chalk.yellow("Org config missing. Run 'spec0 auth login'."));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
console.log(chalk.green("✓ Logged in"));
|
|
30
|
+
console.log(` Org: ${org.name}`);
|
|
31
|
+
console.log(` API URL: ${org.apiUrl}`);
|
|
32
|
+
console.log(` Key: ${org.keyName ?? "(unnamed)"}`);
|
|
33
|
+
}
|
|
34
|
+
export function registerAuthCommands(program) {
|
|
35
|
+
// Top-level whoami shorthand
|
|
36
|
+
program
|
|
37
|
+
.command("whoami")
|
|
38
|
+
.description("Show the active org and authentication state")
|
|
39
|
+
.action(printAuthStatus);
|
|
40
|
+
const auth = program.command("auth").description("Authentication and org management");
|
|
41
|
+
auth
|
|
42
|
+
.command("login")
|
|
43
|
+
.description("Log in via browser and store credentials in ~/.spec0/config.json")
|
|
44
|
+
.option("--app-url <url>", "Web app origin for /cli-auth (overrides SPEC0_APP_URL)")
|
|
45
|
+
.option("--api-url <url>", "Backend API base (overrides SPEC0_API_URL)")
|
|
46
|
+
.action(async (opts) => {
|
|
47
|
+
const appUrl = opts.appUrl ?? getAppUrl();
|
|
48
|
+
const state = randomBytes(16).toString("hex");
|
|
49
|
+
const port = 38473 + (Math.floor(Math.random() * 1000) % 1000);
|
|
50
|
+
const redirectUri = `http://127.0.0.1:${port}/callback`;
|
|
51
|
+
const authUrl = new URL("/cli-auth", appUrl);
|
|
52
|
+
authUrl.searchParams.set("state", state);
|
|
53
|
+
authUrl.searchParams.set("redirect_uri", redirectUri);
|
|
54
|
+
console.log(chalk.blue("Opening browser for authentication..."));
|
|
55
|
+
console.log(chalk.gray(`If the browser doesn't open, visit: ${authUrl.toString()}`));
|
|
56
|
+
const result = await new Promise((resolve) => {
|
|
57
|
+
let resolved = false;
|
|
58
|
+
const doResolve = (r) => {
|
|
59
|
+
if (resolved)
|
|
60
|
+
return;
|
|
61
|
+
resolved = true;
|
|
62
|
+
resolve(r);
|
|
63
|
+
};
|
|
64
|
+
const server = createServer((req, res) => {
|
|
65
|
+
const url = new URL(req.url ?? "/", `http://127.0.0.1:${port}`);
|
|
66
|
+
if (url.pathname === "/callback") {
|
|
67
|
+
const token = url.searchParams.get("token");
|
|
68
|
+
const orgId = url.searchParams.get("org");
|
|
69
|
+
const orgName = url.searchParams.get("org_name") ?? "default";
|
|
70
|
+
if (token && orgId) {
|
|
71
|
+
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
72
|
+
res.end(`<!DOCTYPE html><html><head><title>Spec0 CLI</title></head><body><p style="font-family:sans-serif;padding:2rem;">Authorization complete. You can close this window and return to the terminal.</p></body></html>`);
|
|
73
|
+
doResolve({ token, orgId, orgName });
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
res.writeHead(400, { "Content-Type": "text/plain" });
|
|
77
|
+
res.end("Missing token or org. Please try again.");
|
|
78
|
+
doResolve({ error: "Missing token or org" });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
res.writeHead(404);
|
|
83
|
+
res.end();
|
|
84
|
+
}
|
|
85
|
+
server.close();
|
|
86
|
+
});
|
|
87
|
+
server.listen(port, "127.0.0.1", () => {
|
|
88
|
+
open(authUrl.toString()).catch(() => { });
|
|
89
|
+
});
|
|
90
|
+
server.on("error", (err) => {
|
|
91
|
+
doResolve({ error: err.message });
|
|
92
|
+
});
|
|
93
|
+
const timeout = setTimeout(() => {
|
|
94
|
+
if (!resolved && server.listening) {
|
|
95
|
+
server.close();
|
|
96
|
+
doResolve({
|
|
97
|
+
error: "Login timed out. Run 'spec0 auth login' again, or set SPEC0_TOKEN and SPEC0_ORG_ID for non-interactive use.",
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}, 120000);
|
|
101
|
+
server.on("close", () => clearTimeout(timeout));
|
|
102
|
+
});
|
|
103
|
+
if ("error" in result) {
|
|
104
|
+
console.error(chalk.red(result.error));
|
|
105
|
+
// Login-flow failed mid-way (browser closed, timeout, port error). Not
|
|
106
|
+
// "no creds" — the user tried to authenticate and the flow couldn't
|
|
107
|
+
// complete. Treat as generic failure; callers see a non-zero exit.
|
|
108
|
+
exit(ExitCode.GENERIC);
|
|
109
|
+
}
|
|
110
|
+
const keyName = `CLI — ${new Date().toISOString().slice(0, 10)}`;
|
|
111
|
+
const apiUrlForStore = opts.apiUrl?.trim()
|
|
112
|
+
? opts.apiUrl.trim().replace(/\/$/, "")
|
|
113
|
+
: getApiUrl();
|
|
114
|
+
setOrgConfig(result.orgId, {
|
|
115
|
+
apiKey: result.token,
|
|
116
|
+
name: result.orgName,
|
|
117
|
+
apiUrl: apiUrlForStore,
|
|
118
|
+
keyName,
|
|
119
|
+
});
|
|
120
|
+
const config = getConfig();
|
|
121
|
+
if (!config.defaultOrg) {
|
|
122
|
+
setDefaultOrg(result.orgId);
|
|
123
|
+
}
|
|
124
|
+
console.log(chalk.green("Logged in successfully."));
|
|
125
|
+
console.log(` Org: ${result.orgName}`);
|
|
126
|
+
console.log(` API: ${apiUrlForStore}`);
|
|
127
|
+
console.log(` Key: ${keyName}`);
|
|
128
|
+
});
|
|
129
|
+
auth
|
|
130
|
+
.command("logout")
|
|
131
|
+
.description("Deactivate key on server and clear local config")
|
|
132
|
+
.action(async () => {
|
|
133
|
+
clearConfig();
|
|
134
|
+
console.log(chalk.green("Logged out. Config cleared."));
|
|
135
|
+
});
|
|
136
|
+
auth
|
|
137
|
+
.command("status")
|
|
138
|
+
.description("Show the active org and authentication state")
|
|
139
|
+
.action(printAuthStatus);
|
|
140
|
+
auth
|
|
141
|
+
.command("token")
|
|
142
|
+
.description("Print token (for scripting: spec0 auth token | pbcopy)")
|
|
143
|
+
.action(async () => {
|
|
144
|
+
const defaultOrgId = getDefaultOrgId();
|
|
145
|
+
if (!defaultOrgId)
|
|
146
|
+
exit(ExitCode.AUTH_MISSING);
|
|
147
|
+
const org = getOrgConfig(defaultOrgId);
|
|
148
|
+
if (!org)
|
|
149
|
+
exit(ExitCode.AUTH_MISSING);
|
|
150
|
+
console.log(org.apiKey);
|
|
151
|
+
});
|
|
152
|
+
auth
|
|
153
|
+
.command("switch <org-name>")
|
|
154
|
+
.description("Switch default org")
|
|
155
|
+
.action(async (orgName) => {
|
|
156
|
+
const config = getConfig();
|
|
157
|
+
const entry = Object.entries(config.orgs).find(([, o]) => o.name === orgName);
|
|
158
|
+
if (!entry) {
|
|
159
|
+
console.error(chalk.red(`Org '${orgName}' not found.`));
|
|
160
|
+
exit(ExitCode.NOT_FOUND);
|
|
161
|
+
}
|
|
162
|
+
setDefaultOrg(entry[0]);
|
|
163
|
+
console.log(chalk.green(`Switched to org: ${orgName}`));
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 ci generate github — emit a ready-to-commit GitHub Actions workflow.
|
|
3
|
+
*
|
|
4
|
+
* Wraps GET /api-management/cli/v1/ci-config. The backend renders the
|
|
5
|
+
* workflow YAML (including auth-secret references and the spec path filter),
|
|
6
|
+
* so the user just needs to drop it into `.github/workflows/`.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from "commander";
|
|
9
|
+
export declare function registerCiGenerateCommand(ci: Command): void;
|
|
10
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/commands/ci/generate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,OAAO,QA6EpD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 ci generate github — emit a ready-to-commit GitHub Actions workflow.
|
|
3
|
+
*
|
|
4
|
+
* Wraps GET /api-management/cli/v1/ci-config. The backend renders the
|
|
5
|
+
* workflow YAML (including auth-secret references and the spec path filter),
|
|
6
|
+
* so the user just needs to drop it into `.github/workflows/`.
|
|
7
|
+
*/
|
|
8
|
+
import { writeFileSync, mkdirSync } from "node:fs";
|
|
9
|
+
import { dirname, resolve } from "node:path";
|
|
10
|
+
import chalk from "chalk";
|
|
11
|
+
import { createOrgApiClient, is401 } from "../../lib/api-client.js";
|
|
12
|
+
import { requireOrgContext } from "../../lib/auth-context.js";
|
|
13
|
+
import { ExitCode } from "../../lib/exit-codes.js";
|
|
14
|
+
import { emit, fail, progress, resolveOutputContext, } from "../../lib/output/index.js";
|
|
15
|
+
export function registerCiGenerateCommand(ci) {
|
|
16
|
+
ci.command("generate")
|
|
17
|
+
.argument("<provider>", "CI provider (currently supported: github)")
|
|
18
|
+
.description("Generate a workflow file for <provider> that runs 'spec0 publish' on push.")
|
|
19
|
+
.option("--spec-file <path>", "Path to OpenAPI spec file", "openapi.yaml")
|
|
20
|
+
.option("--api-name <name>", "API name to embed in the workflow (default: spec filename)")
|
|
21
|
+
.option("--branch <branch>", "Git branch that triggers the workflow", "main")
|
|
22
|
+
.option("--write", "Write the workflow to its suggested path (default: print to stdout)")
|
|
23
|
+
.option("--org <uuid>", "Org id override")
|
|
24
|
+
.option("--output <format>", "Output format for metadata: text, json, yaml (default: text)")
|
|
25
|
+
.action(async (provider, opts) => {
|
|
26
|
+
const outCtx = resolveOutputContext(opts);
|
|
27
|
+
if (provider.toLowerCase() !== "github") {
|
|
28
|
+
fail(outCtx, ExitCode.USAGE, `Unsupported CI provider '${provider}'.`, {
|
|
29
|
+
hint: "Supported providers: github.",
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
let authCtx;
|
|
33
|
+
try {
|
|
34
|
+
authCtx = requireOrgContext(opts.org);
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
fail(outCtx, ExitCode.AUTH_MISSING, e.message, {
|
|
38
|
+
hint: "Set SPEC0_TOKEN + SPEC0_ORG_ID, or run 'spec0 auth login'.",
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const params = new URLSearchParams({
|
|
42
|
+
specFilePath: opts.specFile,
|
|
43
|
+
branch: opts.branch,
|
|
44
|
+
});
|
|
45
|
+
if (opts.apiName)
|
|
46
|
+
params.set("apiName", opts.apiName);
|
|
47
|
+
const client = createOrgApiClient(authCtx);
|
|
48
|
+
try {
|
|
49
|
+
const res = (await client.getJson(`/api-management/cli/v1/ci-config?${params.toString()}`));
|
|
50
|
+
if (opts.write) {
|
|
51
|
+
const target = resolve(process.cwd(), res.filePath ?? ".github/workflows/spec0-publish.yml");
|
|
52
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
53
|
+
writeFileSync(target, res.workflowYaml ?? "", "utf-8");
|
|
54
|
+
progress(outCtx, chalk.green(`wrote ${target}`));
|
|
55
|
+
emit(outCtx, { filePath: target, bytes: (res.workflowYaml ?? "").length }, (d) => `Workflow written to ${d.filePath} (${d.bytes} bytes).`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Dump the raw YAML on stdout so users can redirect to a file.
|
|
59
|
+
process.stdout.write(res.workflowYaml ?? "");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
if (is401(err)) {
|
|
64
|
+
fail(outCtx, ExitCode.AUTH_MISSING, "Token invalid or expired.", {
|
|
65
|
+
hint: "Run 'spec0 auth login' or refresh SPEC0_TOKEN.",
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
fail(outCtx, ExitCode.GENERIC, `ci generate failed: ${err.message}`);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/commands/ci/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/ci/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,QAGlD"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { registerCiGenerateCommand } from "./generate.js";
|
|
2
|
+
export function registerCiCommands(program) {
|
|
3
|
+
const ci = program.command("ci").description("Generate CI configuration for CI/CD pipelines.");
|
|
4
|
+
registerCiGenerateCommand(ci);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ci/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,gDAAgD,CAAC,CAAC;IAC/F,yBAAyB,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 commands — self-describing manifest of every command the CLI ships.
|
|
3
|
+
*
|
|
4
|
+
* Designed for AI agents and scripts that want to discover capabilities
|
|
5
|
+
* without shelling out to `--help` and parsing prose. Walks the Commander
|
|
6
|
+
* tree at runtime, so the manifest is always in lockstep with the binary.
|
|
7
|
+
*
|
|
8
|
+
* Typical agent workflow:
|
|
9
|
+
*
|
|
10
|
+
* 1. `spec0 commands --output=json` → enumerate every command, its flags,
|
|
11
|
+
* positional args, and description.
|
|
12
|
+
* 2. Pick the command that matches the task (e.g. "publish a spec" →
|
|
13
|
+
* `publish`).
|
|
14
|
+
* 3. Invoke it with `--output=json` for machine-readable results, and
|
|
15
|
+
* branch on exit codes (see the bundled `exitCodes` table).
|
|
16
|
+
*/
|
|
17
|
+
import { Command } from "commander";
|
|
18
|
+
export declare function registerCommandsCommand(program: Command): void;
|
|
19
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/commands/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6CpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAcvD"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spec0 commands — self-describing manifest of every command the CLI ships.
|
|
3
|
+
*
|
|
4
|
+
* Designed for AI agents and scripts that want to discover capabilities
|
|
5
|
+
* without shelling out to `--help` and parsing prose. Walks the Commander
|
|
6
|
+
* tree at runtime, so the manifest is always in lockstep with the binary.
|
|
7
|
+
*
|
|
8
|
+
* Typical agent workflow:
|
|
9
|
+
*
|
|
10
|
+
* 1. `spec0 commands --output=json` → enumerate every command, its flags,
|
|
11
|
+
* positional args, and description.
|
|
12
|
+
* 2. Pick the command that matches the task (e.g. "publish a spec" →
|
|
13
|
+
* `publish`).
|
|
14
|
+
* 3. Invoke it with `--output=json` for machine-readable results, and
|
|
15
|
+
* branch on exit codes (see the bundled `exitCodes` table).
|
|
16
|
+
*/
|
|
17
|
+
import chalk from "chalk";
|
|
18
|
+
import { ExitCode, exit } from "../lib/exit-codes.js";
|
|
19
|
+
import { emit, resolveOutputContext } from "../lib/output/index.js";
|
|
20
|
+
const EXIT_CODES = {
|
|
21
|
+
"0": "success",
|
|
22
|
+
"1": "generic / unclassified failure",
|
|
23
|
+
"2": "usage error (bad flags, missing args)",
|
|
24
|
+
"3": "not authenticated (no token / token expired)",
|
|
25
|
+
"4": "permission denied (403)",
|
|
26
|
+
"5": "resource not found (404)",
|
|
27
|
+
"6": "conflict (409 — e.g. name already taken)",
|
|
28
|
+
"7": "validation failed (422 — e.g. spec below min score)",
|
|
29
|
+
"8": "rate limited (429)",
|
|
30
|
+
"9": "upstream server error (5xx)",
|
|
31
|
+
"10": "network error (unreachable, timeout)",
|
|
32
|
+
};
|
|
33
|
+
export function registerCommandsCommand(program) {
|
|
34
|
+
program
|
|
35
|
+
.command("commands")
|
|
36
|
+
.description("List every command in a machine-readable manifest. Designed for AI agents and scripts.")
|
|
37
|
+
.argument("[pattern]", "Filter commands by substring match on name (case-insensitive)")
|
|
38
|
+
.option("--output <format>", "Output format: text, json, or yaml (default: text)")
|
|
39
|
+
.action((pattern, opts) => {
|
|
40
|
+
const ctx = resolveOutputContext(opts);
|
|
41
|
+
const manifest = buildManifest(program, pattern);
|
|
42
|
+
emit(ctx, manifest, renderText);
|
|
43
|
+
exit(ExitCode.SUCCESS);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function buildManifest(program, pattern) {
|
|
47
|
+
const needle = pattern?.toLowerCase();
|
|
48
|
+
const all = walkCommands(program, "");
|
|
49
|
+
const commands = needle ? all.filter((c) => c.name.toLowerCase().includes(needle)) : all;
|
|
50
|
+
return {
|
|
51
|
+
version: program.version() ?? "unknown",
|
|
52
|
+
commands,
|
|
53
|
+
exitCodes: EXIT_CODES,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function walkCommands(cmd, prefix) {
|
|
57
|
+
const out = [];
|
|
58
|
+
for (const sub of cmd.commands) {
|
|
59
|
+
// Skip commander's auto-generated `help` leaf — it's not a real operation.
|
|
60
|
+
if (sub.name() === "help")
|
|
61
|
+
continue;
|
|
62
|
+
const name = prefix ? `${prefix} ${sub.name()}` : sub.name();
|
|
63
|
+
// Only emit an entry when this node has an action (leaf command). Groups
|
|
64
|
+
// like `spec0 api` or `spec0 mock` exist purely to host subcommands and
|
|
65
|
+
// aren't themselves runnable.
|
|
66
|
+
const hasAction = hasRegisteredAction(sub);
|
|
67
|
+
if (hasAction) {
|
|
68
|
+
out.push({
|
|
69
|
+
name,
|
|
70
|
+
description: sub.description() || "",
|
|
71
|
+
usage: buildUsage(sub, name),
|
|
72
|
+
args: extractArgs(sub),
|
|
73
|
+
flags: extractFlags(sub),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// Recurse into subcommand groups.
|
|
77
|
+
if (sub.commands.length > 0) {
|
|
78
|
+
out.push(...walkCommands(sub, name));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
// Commander doesn't expose "has action?" publicly; reach for the underlying
|
|
84
|
+
// field. Commands registered via `.action(...)` set this; noun-only groups
|
|
85
|
+
// (e.g. `spec0 api`) don't.
|
|
86
|
+
function hasRegisteredAction(cmd) {
|
|
87
|
+
return typeof cmd._actionHandler === "function";
|
|
88
|
+
}
|
|
89
|
+
function buildUsage(cmd, name) {
|
|
90
|
+
const argSegments = cmd.registeredArguments
|
|
91
|
+
.map((a) => (a.required ? `<${a.name()}>` : `[${a.name()}]`))
|
|
92
|
+
.join(" ");
|
|
93
|
+
return `spec0 ${name}${argSegments ? ` ${argSegments}` : ""} [options]`;
|
|
94
|
+
}
|
|
95
|
+
function extractArgs(cmd) {
|
|
96
|
+
return cmd.registeredArguments.map((a) => ({
|
|
97
|
+
name: a.name(),
|
|
98
|
+
required: a.required,
|
|
99
|
+
description: a.description || undefined,
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
function extractFlags(cmd) {
|
|
103
|
+
return cmd.options.map((o) => ({
|
|
104
|
+
flags: o.flags,
|
|
105
|
+
description: o.description,
|
|
106
|
+
defaultValue: o.defaultValue,
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
function renderText(m) {
|
|
110
|
+
const lines = [];
|
|
111
|
+
lines.push(chalk.bold(`spec0 ${m.version} — command manifest`));
|
|
112
|
+
lines.push("");
|
|
113
|
+
lines.push(chalk.gray(`${m.commands.length} commands. For full detail, use --output=json.`));
|
|
114
|
+
lines.push("");
|
|
115
|
+
const nameWidth = Math.max(...m.commands.map((c) => c.name.length), 12);
|
|
116
|
+
for (const c of m.commands) {
|
|
117
|
+
const padded = c.name.padEnd(nameWidth);
|
|
118
|
+
lines.push(` ${chalk.cyan(padded)} ${c.description}`);
|
|
119
|
+
}
|
|
120
|
+
lines.push("");
|
|
121
|
+
lines.push(chalk.bold("Exit codes"));
|
|
122
|
+
for (const [code, label] of Object.entries(m.exitCodes)) {
|
|
123
|
+
lines.push(` ${code.padStart(2)} ${label}`);
|
|
124
|
+
}
|
|
125
|
+
return lines.join("\n");
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/commands/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4DpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAyDnD"}
|