@spec0/cli 0.1.0 → 0.1.3

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 CHANGED
@@ -65,3 +65,28 @@ npm run sync:spec
65
65
  That runs `spec0 pull spec0/cli-api -o openapi-spec/cli-api-spec.yaml` and regenerates `src/types.ts`. Commit the updated YAML + types alongside the feature that consumes them.
66
66
 
67
67
  `sync:spec` calls into `dist/index.js`, so run `npm run build` first on fresh clones. Auth via `SPEC0_TOKEN` + `SPEC0_ORG_ID` env vars, or `spec0 auth login` for interactive use.
68
+
69
+ ## Cutting a release
70
+
71
+ Releases are tag-triggered. The workflow at `.github/workflows/release.yml` lints, builds, tests, then publishes to npm via Trusted Publishing (no `NPM_TOKEN`) and creates a GitHub Release. The tag must match `package.json` `version` exactly — otherwise the workflow fails.
72
+
73
+ From a clean `main` that is green on CI:
74
+
75
+ ```bash
76
+ # 1. Bump package.json + package-lock.json AND create the tag in one step.
77
+ # Use -m so the commit message is conventional-commits compliant (commitlint).
78
+ npm version patch -m "chore(release): v%s" # or: minor / major / X.Y.Z
79
+
80
+ # 2. Push the bump commit and the new tag together.
81
+ git push origin main --follow-tags
82
+ ```
83
+
84
+ `npm version` writes the new version into both files, makes a commit `chore(release): vX.Y.Z`, and creates tag `vX.Y.Z`. The tag push triggers the workflow.
85
+
86
+ **Watch the run:** `gh run watch $(gh run list --workflow=release.yml --limit 1 --json databaseId --jq '.[0].databaseId') --exit-status`
87
+
88
+ **Verify on npm:** `npm view @spec0/cli version` should print the new version.
89
+
90
+ If the publish step fails, do **not** retry by reusing the same tag. Fix the issue on `main`, then bump again (`npm version patch -m ...`) — npm forbids re-publishing the same `version`, so a new one is mandatory.
91
+
92
+ See [RELEASE.md](./RELEASE.md) for the full policy (versioning rules, trusted-publisher config, yanking).
package/dist/index.js CHANGED
@@ -34,7 +34,15 @@ program
34
34
  .name("spec0")
35
35
  .description("Manage and publish OpenAPI specs, run mock servers, and lint — powered by Spec0")
36
36
  .version(getCliVersion(), "-V, --version", "Print CLI version")
37
- .helpOption("-h, --help", "Show help");
37
+ .helpOption("-h, --help", "Show help")
38
+ // Without this, Commander parses every option in argv at the program level first,
39
+ // including options that appear AFTER the subcommand name. That makes the program-level
40
+ // `--version` option swallow the subcommand-level `--version <value>` option used by
41
+ // `spec0 publish` and `spec0 push`: invoking `spec0 publish --version 1.0.0` would print
42
+ // the CLI's own version and exit with code 0, never running publish. With positional
43
+ // options enabled, options after the subcommand belong to the subcommand parser and the
44
+ // collision goes away.
45
+ .enablePositionalOptions();
38
46
  registerVersionCommand(program);
39
47
  registerAuthCommands(program);
40
48
  registerInitCommand(program);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spec0/cli",
3
- "version": "0.1.0",
3
+ "version": "0.1.3",
4
4
  "description": "Spec0 CLI — publish API specs, create mock servers, lint, and interact with the Spec0 platform",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -46,6 +46,14 @@
46
46
  ],
47
47
  "type": "module",
48
48
  "license": "MIT",
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "git+https://github.com/spec-0/CLI.git"
52
+ },
53
+ "bugs": {
54
+ "url": "https://github.com/spec-0/CLI/issues"
55
+ },
56
+ "homepage": "https://github.com/spec-0/CLI#readme",
49
57
  "dependencies": {
50
58
  "@inquirer/prompts": "^7.2.0",
51
59
  "@stoplight/spectral-core": "^1.22.0",
@@ -1,6 +0,0 @@
1
- /**
2
- * spec0 mock create | list | url | delete | regenerate-key | logs
3
- */
4
- import { Command } from "commander";
5
- export declare function registerMockCommands(program: Command): void;
6
- //# sourceMappingURL=mock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/commands/mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QA2GpD"}
@@ -1,116 +0,0 @@
1
- /**
2
- * spec0 mock create | list | url | delete | regenerate-key | logs
3
- */
4
- import chalk from "chalk";
5
- import { createOrgApiClient, is401 } from "../lib/api-client.js";
6
- import { requireOrgContext } from "../lib/auth-context.js";
7
- import { ExitCode, exit } from "../lib/exit-codes.js";
8
- import { emit, resolveOutputContext } from "../lib/output/index.js";
9
- import { renderTable } from "../lib/output/table.js";
10
- export function registerMockCommands(program) {
11
- const mock = program.command("mock").description("Mock server management");
12
- mock
13
- .command("create")
14
- .description("Create mock server, print URL and key")
15
- .option("--api <name>", "API name (required unless --api-id is set)")
16
- .option("--api-id <uuid>", "API id")
17
- .option("--org <uuid>", "Org id override")
18
- .action(async (opts) => {
19
- let ctx;
20
- try {
21
- ctx = requireOrgContext(opts.org);
22
- }
23
- catch (e) {
24
- console.error(chalk.red(e.message));
25
- process.exit(1);
26
- }
27
- if (!opts.api && !opts.apiId) {
28
- console.error(chalk.red("Provide --api <name> or --api-id <uuid>"));
29
- process.exit(1);
30
- }
31
- const client = createOrgApiClient(ctx);
32
- const body = {
33
- apiName: opts.api,
34
- apiId: opts.apiId,
35
- };
36
- try {
37
- const res = (await client.postJson("/api-management/cli/v1/mocks", body));
38
- const base = ctx.apiUrl;
39
- const fullUrl = `${base}${res.mockBaseUrl ?? ""}`;
40
- console.log(chalk.green("Mock server:"));
41
- console.log(` Mock URL: ${fullUrl}`);
42
- if (res.apiKey) {
43
- console.log(` API Key: ${res.apiKey} (copy and keep safe — shown once)`);
44
- }
45
- else {
46
- console.log(chalk.yellow(" (Existing mock — API key was issued at creation.)"));
47
- }
48
- }
49
- catch (err) {
50
- if (is401(err)) {
51
- console.error(chalk.red("Token invalid. Run 'spec0 auth login'."));
52
- process.exit(1);
53
- }
54
- console.error(chalk.red(err.message));
55
- process.exit(1);
56
- }
57
- });
58
- mock
59
- .command("list")
60
- .description("List all mock servers")
61
- .option("--org <uuid>", "Org id override")
62
- .option("--output <format>", "Output format: text, json, or yaml (default: text)")
63
- .action(async (opts) => {
64
- const outCtx = resolveOutputContext(opts);
65
- let authCtx;
66
- try {
67
- authCtx = requireOrgContext(opts.org);
68
- }
69
- catch (e) {
70
- exit(ExitCode.AUTH_MISSING, e.message);
71
- }
72
- const client = createOrgApiClient(authCtx);
73
- try {
74
- const rows = (await client.getJson("/api-management/cli/v1/mocks"));
75
- const enriched = rows.map((m) => ({
76
- api: m.apiName ?? m.apiId ?? "—",
77
- name: m.name ?? "—",
78
- mockUrl: `${authCtx.apiUrl}${m.mockBaseUrl ?? ""}`,
79
- }));
80
- emit(outCtx, enriched, (data) => renderTable(data, [
81
- { key: "api", header: "API" },
82
- { key: "name", header: "Name" },
83
- { key: "mockUrl", header: "Mock URL" },
84
- ]));
85
- }
86
- catch (err) {
87
- if (is401(err)) {
88
- exit(ExitCode.AUTH_MISSING, "Token invalid or expired. Run 'spec0 auth login'.");
89
- }
90
- exit(ExitCode.GENERIC, err.message);
91
- }
92
- });
93
- mock
94
- .command("url <api-name>")
95
- .description("Print mock base URL for API")
96
- .option("--org <uuid>", "Org id override")
97
- .action(async (apiName, opts) => {
98
- let ctx;
99
- try {
100
- ctx = requireOrgContext(opts.org);
101
- }
102
- catch (e) {
103
- console.error(chalk.red(e.message));
104
- process.exit(1);
105
- }
106
- const client = createOrgApiClient(ctx);
107
- const rows = (await client.getJson("/api-management/cli/v1/mocks"));
108
- const hit = rows.find((r) => (r.apiName ?? "").toLowerCase() === apiName.toLowerCase());
109
- if (!hit) {
110
- console.error(chalk.red(`No mock found for API name '${apiName}'.`));
111
- process.exit(1);
112
- }
113
- console.log(`${ctx.apiUrl}${hit.mockBaseUrl ?? ""}`);
114
- });
115
- }
116
- //# sourceMappingURL=mock.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/commands/mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAsB,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AASrD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAE3E,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,cAAc,EAAE,4CAA4C,CAAC;SACpE,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC;SACnC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,IAAoD,EAAE,EAAE;QACrE,IAAI,GAAG,CAAC;QACR,IAAI,CAAC;YACH,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,IAAI,GAAsB;YAC9B,OAAO,EAAE,IAAI,CAAC,GAAG;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;QACF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAChC,8BAA8B,EAC9B,IAAI,CACL,CAAuB,CAAC;YACzB,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;YACxB,MAAM,OAAO,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;YACvC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,MAAM,oCAAoC,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC;SACzC,MAAM,CAAC,mBAAmB,EAAE,oDAAoD,CAAC;SACjF,MAAM,CAAC,KAAK,EAAE,IAAsC,EAAE,EAAE;QACvD,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAc,CAAC;YACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChC,GAAG,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG;gBAChC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG;gBACnB,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,IAAI,EAAE,EAAE;aACnD,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAC9B,WAAW,CAAC,IAA4C,EAAE;gBACxD,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;gBAC7B,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;gBAC/B,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE;aACvC,CAAC,CACH,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,mDAAmD,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAsB,EAAE,EAAE;QACxD,IAAI,GAAG,CAAC;QACR,IAAI,CAAC;YACH,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAc,CAAC;QACjF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,OAAO,IAAI,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,6 +0,0 @@
1
- /**
2
- * spec0 register — upload OpenAPI spec (lint gate + CLI publish API + mock URL hint)
3
- */
4
- import { Command } from "commander";
5
- export declare function registerRegisterCommand(program: Command): void;
6
- //# sourceMappingURL=register.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgDpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QAuNvD"}
@@ -1,213 +0,0 @@
1
- /**
2
- * spec0 register — upload OpenAPI spec (lint gate + CLI publish API + mock URL hint)
3
- */
4
- import chalk from "chalk";
5
- import ora from "ora";
6
- import { existsSync, readFileSync } from "fs";
7
- import { runSpectral } from "../lib/lint.js";
8
- import { formatLintText, formatPublishText, formatGitHubAnnotation } from "../lib/output.js";
9
- import { createOrgApiClient, is401 } from "../lib/api-client.js";
10
- import { requireOrgContext } from "../lib/auth-context.js";
11
- import { resolveCliSpecPathFromFlags } from "../lib/cli-spec-path.js";
12
- import { resolvedPlatformAppUrl } from "../lib/platform-defaults.js";
13
- const TEAM_SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
14
- function isUuid(v) {
15
- return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(v);
16
- }
17
- function validateTeamArg(team) {
18
- const t = team.trim();
19
- if (!t) {
20
- return "Missing --team value.";
21
- }
22
- if (isUuid(t)) {
23
- return null;
24
- }
25
- if (!TEAM_SLUG_PATTERN.test(t)) {
26
- return `Invalid --team '${team}'. Use a team UUID or a slug like 'platform-team' (lowercase letters, numbers, hyphens; no spaces).`;
27
- }
28
- return null;
29
- }
30
- function registerUsageExamples() {
31
- return [
32
- "Examples:",
33
- " spec0 register --spec-file ./openapi.yaml --name order-api --team platform-team --version 1.0.0",
34
- " spec0 --spec-file /abs/path/openapi.yaml register --name order-api --team platform-team --version 1.0.0",
35
- " spec0 register ./openapi.yaml --name order-api --team platform-team --version 1.0.0",
36
- " spec0 register --spec-file ./openapi.yaml --api-id 123e4567-e89b-12d3-a456-426614174000 --version 1.0.1",
37
- ].join("\n");
38
- }
39
- export function registerRegisterCommand(program) {
40
- program
41
- .command("register")
42
- .description("Register or update an API spec on Spec0 (explicit args only)")
43
- .argument("[spec-file]", "Path to OpenAPI spec (or use --spec-file / global --spec-file)")
44
- .option("--spec-file <path>", "Path to OpenAPI spec file")
45
- .option("--api-id <id>", "Existing API ID to update")
46
- .option("--name <name>", "API name (required when --api-id is not provided)")
47
- .option("--team <team>", "Team UUID or slug (required when --api-id is not provided)")
48
- .requiredOption("--version <version>", "API version tag (for example 1.2.0)")
49
- .option("--strict", "Fail on any Spectral lint warning")
50
- .option("--dry-run", "Validate only, do not call the API")
51
- .option("--verbose", "Print verbose request/response logs")
52
- .option("--format <fmt>", "Output format: text, json, github", "text")
53
- .option("--org <org>", "Override default org (UUID)")
54
- .option("--skip-lint", "Skip lint gate")
55
- .option("--git-sha <sha>", "Git commit SHA for provenance")
56
- .option("--github-repo <repo>", "GitHub repository URL for provenance")
57
- .option("--github-branch <branch>", "GitHub branch for provenance")
58
- .action(async (specArg, opts, command) => {
59
- const cwd = process.cwd();
60
- const specPath = resolveCliSpecPathFromFlags(command, cwd, opts.specFile, specArg);
61
- if (!specPath || !existsSync(specPath)) {
62
- console.error(chalk.red("Spec file not found. Pass a path via --spec-file, global spec0 --spec-file, or positional [spec-file].\n"));
63
- console.error(chalk.yellow(registerUsageExamples()));
64
- process.exit(1);
65
- }
66
- const apiId = opts["apiId"];
67
- const name = opts.name;
68
- const team = opts.team;
69
- const version = opts.version;
70
- const strict = !!opts.strict;
71
- const skipLint = !!opts.skipLint;
72
- const verbose = !!opts.verbose;
73
- const format = opts.format ?? "text";
74
- const gitSha = opts["gitSha"] ?? "";
75
- const githubRepo = opts["githubRepo"] ?? "";
76
- const githubBranch = opts["githubBranch"] ?? "";
77
- const vLog = (msg) => {
78
- if (verbose) {
79
- console.error(chalk.gray(`[verbose] ${msg}`));
80
- }
81
- };
82
- if (!apiId && (!name || !team)) {
83
- console.error(chalk.red("For new APIs, provide both --name and --team (or pass --api-id).\n"));
84
- console.error(chalk.yellow(registerUsageExamples()));
85
- process.exit(1);
86
- }
87
- if (team) {
88
- const teamErr = validateTeamArg(team);
89
- if (teamErr) {
90
- console.error(chalk.red(`${teamErr}\n`));
91
- console.error(chalk.yellow(registerUsageExamples()));
92
- process.exit(1);
93
- }
94
- }
95
- const spinner = ora("Registering...").start();
96
- if (!skipLint) {
97
- try {
98
- const lintResult = await runSpectral(specPath);
99
- spinner.succeed("Lint passed");
100
- if (format === "github") {
101
- for (const e of lintResult.errors) {
102
- console.log(formatGitHubAnnotation(specPath, e.line ?? 0, "error", e.message));
103
- }
104
- for (const w of lintResult.warnings) {
105
- console.log(formatGitHubAnnotation(specPath, w.line ?? 0, "warning", w.message));
106
- }
107
- }
108
- else if (format !== "json")
109
- console.log(formatLintText(lintResult));
110
- if (lintResult.errors.length > 0) {
111
- console.error(chalk.red("Lint errors block register. Fix them or use --skip-lint."));
112
- process.exit(1);
113
- }
114
- if (strict && lintResult.warnings.length > 0) {
115
- console.error(chalk.red("Strict mode: warnings block register."));
116
- process.exit(1);
117
- }
118
- }
119
- catch (e) {
120
- spinner.fail("Lint failed");
121
- console.error(e);
122
- process.exit(1);
123
- }
124
- }
125
- else {
126
- spinner.succeed("Lint skipped");
127
- }
128
- let ctx;
129
- try {
130
- ctx = requireOrgContext(opts.org);
131
- }
132
- catch (e) {
133
- console.error(chalk.red(e.message));
134
- process.exit(1);
135
- }
136
- const openapiSpec = readFileSync(specPath, "utf-8");
137
- if (opts.dryRun) {
138
- console.log(chalk.green(`Dry run — would register apiId=${apiId ?? "new"} name=${name ?? "-"} team=${team ?? "-"} version=${version}`));
139
- return;
140
- }
141
- const client = createOrgApiClient(ctx);
142
- const body = {
143
- apiId,
144
- name,
145
- team,
146
- version,
147
- openapiSpec,
148
- gitSha,
149
- githubRepo,
150
- githubBranch,
151
- specFilePath: specPath.replace(cwd + "/", ""),
152
- semver: false,
153
- };
154
- vLog(`POST ${ctx.apiUrl}/api-management/cli/v1/publish`);
155
- vLog(`register payload: apiId=${apiId ?? "<new>"} name=${name ?? "-"} team=${team ?? "-"} version=${version} specFilePath=${body.specFilePath ?? "-"}`);
156
- try {
157
- const reg = (await client.postJson("/api-management/cli/v1/publish", body));
158
- vLog(`register response: apiId=${reg.apiId ?? "-"} created=${String(reg.created ?? false)} versionCreated=${String(reg.versionCreated ?? false)}`);
159
- const resolvedApiId = reg.apiId ?? "";
160
- const appBase = resolvedPlatformAppUrl();
161
- const specUrl = `${appBase}/apis/${resolvedApiId}`;
162
- let mockUrl;
163
- try {
164
- const mocks = (await client.getJson("/api-management/cli/v1/mocks"));
165
- const hit = mocks.find((m) => m.apiId === resolvedApiId);
166
- if (hit?.mockBaseUrl) {
167
- mockUrl = `${ctx.apiUrl}${hit.mockBaseUrl}`;
168
- }
169
- }
170
- catch {
171
- /* optional */
172
- }
173
- if (format === "json") {
174
- console.log(JSON.stringify({
175
- apiId: resolvedApiId,
176
- version,
177
- created: reg.created ?? false,
178
- versionCreated: reg.versionCreated ?? false,
179
- specUrl,
180
- mockUrl: mockUrl ?? null,
181
- breakingChanges: [],
182
- lintScore: null,
183
- }, null, 2));
184
- }
185
- else {
186
- console.log(formatPublishText({
187
- apiId: resolvedApiId,
188
- version,
189
- specUrl,
190
- mockUrl,
191
- }));
192
- }
193
- }
194
- catch (err) {
195
- const statusCode = err?.response?.statusCode;
196
- if (statusCode) {
197
- vLog(`register failed with HTTP ${statusCode}`);
198
- }
199
- if (is401(err)) {
200
- console.error(chalk.red("Token invalid. Run 'spec0 auth login' to re-authenticate."));
201
- process.exit(1);
202
- }
203
- const msg = err?.response?.body
204
- ?.detail ??
205
- err.message ??
206
- String(err);
207
- console.error(chalk.red(`Register failed: ${msg}\n`));
208
- console.error(chalk.yellow(registerUsageExamples()));
209
- process.exit(1);
210
- }
211
- });
212
- }
213
- //# sourceMappingURL=register.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- /**
2
- * spec0 team list | create | invite | members
3
- */
4
- import { Command } from "commander";
5
- export declare function registerTeamCommands(program: Command): void;
6
- //# sourceMappingURL=team.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"team.d.ts","sourceRoot":"","sources":["../../src/commands/team.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QA4BpD"}
@@ -1,30 +0,0 @@
1
- /**
2
- * spec0 team list | create | invite | members
3
- */
4
- import chalk from "chalk";
5
- export function registerTeamCommands(program) {
6
- const team = program.command("team").description("Team management");
7
- team.command("list").description("List teams").action(async () => {
8
- console.log(chalk.yellow("Team list not yet implemented."));
9
- });
10
- team
11
- .command("create <name>")
12
- .description("Create team")
13
- .action(async (name) => {
14
- console.log(chalk.yellow(`Team create ${name} not yet implemented.`));
15
- });
16
- team
17
- .command("invite <email>")
18
- .description("Invite user to team")
19
- .option("--team <name>", "Team name")
20
- .action(async (email, opts) => {
21
- console.log(chalk.yellow("Team invite not yet implemented."));
22
- });
23
- team
24
- .command("members <name>")
25
- .description("List team members")
26
- .action(async (name) => {
27
- console.log(chalk.yellow(`Team members ${name} not yet implemented.`));
28
- });
29
- }
30
- //# sourceMappingURL=team.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"team.js","sourceRoot":"","sources":["../../src/commands/team.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAEpE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAI;SACD,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,IAAI,uBAAuB,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAuB,EAAE,EAAE;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,IAAI,uBAAuB,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,14 +0,0 @@
1
- export interface WinspectYaml {
2
- spec?: string;
3
- name?: string;
4
- owner?: string;
5
- namespace?: string;
6
- strict?: boolean;
7
- checkBreaking?: boolean;
8
- "auto-create-team"?: boolean;
9
- "check-breaking"?: boolean;
10
- }
11
- export declare function loadWinspectYaml(cwd: string): WinspectYaml | null;
12
- export declare function checkBreakingFromYaml(y: WinspectYaml | null): boolean;
13
- export declare function strictFromYaml(y: WinspectYaml | null): boolean;
14
- //# sourceMappingURL=winspect-yaml.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"winspect-yaml.d.ts","sourceRoot":"","sources":["../../src/lib/winspect-yaml.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAOjE;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAKrE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAG9D"}
@@ -1,28 +0,0 @@
1
- import { readFileSync, existsSync } from "fs";
2
- import { join } from "path";
3
- import YAML from "yaml";
4
- export function loadWinspectYaml(cwd) {
5
- const path = join(cwd, ".winspect.yaml");
6
- if (!existsSync(path))
7
- return null;
8
- const content = readFileSync(path, "utf-8");
9
- const doc = YAML.parse(content);
10
- if (!doc || typeof doc !== "object")
11
- return null;
12
- return doc;
13
- }
14
- export function checkBreakingFromYaml(y) {
15
- if (!y)
16
- return false;
17
- if (typeof y.checkBreaking === "boolean")
18
- return y.checkBreaking;
19
- if (typeof y["check-breaking"] === "boolean")
20
- return y["check-breaking"];
21
- return false;
22
- }
23
- export function strictFromYaml(y) {
24
- if (!y)
25
- return false;
26
- return !!y.strict;
27
- }
28
- //# sourceMappingURL=winspect-yaml.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"winspect-yaml.js","sourceRoot":"","sources":["../../src/lib/winspect-yaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AAaxB,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,OAAO,GAAmB,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,CAAsB;IAC1D,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,IAAI,OAAO,CAAC,CAAC,aAAa,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,aAAa,CAAC;IACjE,IAAI,OAAO,CAAC,CAAC,gBAAgB,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACzE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAsB;IACnD,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACpB,CAAC"}