@spec0/cli 0.5.0 → 0.6.1
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 +0 -1
- package/dist/commands/api/changelog.d.ts.map +1 -1
- package/dist/commands/api/changelog.js +10 -7
- package/dist/commands/api/changelog.js.map +1 -1
- package/dist/commands/api/delete.d.ts.map +1 -1
- package/dist/commands/api/delete.js +11 -9
- package/dist/commands/api/delete.js.map +1 -1
- package/dist/commands/api/list.d.ts.map +1 -1
- package/dist/commands/api/list.js +10 -7
- package/dist/commands/api/list.js.map +1 -1
- package/dist/commands/api/show.d.ts.map +1 -1
- package/dist/commands/api/show.js +11 -4
- package/dist/commands/api/show.js.map +1 -1
- package/dist/commands/auth.d.ts +5 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +36 -20
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/ci/generate.d.ts.map +1 -1
- package/dist/commands/ci/generate.js +10 -7
- package/dist/commands/ci/generate.js.map +1 -1
- package/dist/commands/log.d.ts.map +1 -1
- package/dist/commands/log.js +10 -5
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/mcp.d.ts +7 -4
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +21 -42
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/mock/create.d.ts.map +1 -1
- package/dist/commands/mock/create.js +10 -7
- package/dist/commands/mock/create.js.map +1 -1
- package/dist/commands/mock/delete.d.ts.map +1 -1
- package/dist/commands/mock/delete.js +11 -10
- package/dist/commands/mock/delete.js.map +1 -1
- package/dist/commands/mock/list.d.ts.map +1 -1
- package/dist/commands/mock/list.js +10 -7
- package/dist/commands/mock/list.js.map +1 -1
- package/dist/commands/mock/show.d.ts.map +1 -1
- package/dist/commands/mock/show.js +10 -7
- package/dist/commands/mock/show.js.map +1 -1
- package/dist/commands/mock/url.d.ts.map +1 -1
- package/dist/commands/mock/url.js +12 -5
- package/dist/commands/mock/url.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +12 -5
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +5 -0
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +13 -9
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +10 -5
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync-status.d.ts.map +1 -1
- package/dist/commands/sync-status.js +10 -7
- package/dist/commands/sync-status.js.map +1 -1
- package/dist/commands/team/create.d.ts.map +1 -1
- package/dist/commands/team/create.js +11 -10
- package/dist/commands/team/create.js.map +1 -1
- package/dist/commands/team/delete.d.ts.map +1 -1
- package/dist/commands/team/delete.js +11 -8
- package/dist/commands/team/delete.js.map +1 -1
- package/dist/commands/team/list.d.ts.map +1 -1
- package/dist/commands/team/list.js +11 -9
- package/dist/commands/team/list.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +10 -0
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +58 -10
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/config.d.ts +11 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +14 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/errors.d.ts +46 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +99 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/http-trace.d.ts +37 -0
- package/dist/lib/http-trace.d.ts.map +1 -0
- package/dist/lib/http-trace.js +101 -0
- package/dist/lib/http-trace.js.map +1 -0
- package/dist/lib/output.d.ts +4 -0
- package/dist/lib/output.d.ts.map +1 -1
- package/dist/lib/output.js +8 -0
- package/dist/lib/output.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/api-client.js
CHANGED
|
@@ -3,6 +3,40 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import got from "got";
|
|
5
5
|
import { ApiError, OpenAPI } from "@spec0/sdk-public-platform";
|
|
6
|
+
import { httpTimeoutMs, httpTraceEnabled, traceRequest, traceResponse } from "./http-trace.js";
|
|
7
|
+
/**
|
|
8
|
+
* Shared `got` instance with `--verbose` tracing hooks. All raw HTTP goes
|
|
9
|
+
* through this so a single `setHttpTrace(true)` makes every request visible on
|
|
10
|
+
* stderr (the SDK is traced separately via the global `fetch` wrapper).
|
|
11
|
+
*/
|
|
12
|
+
const http = got.extend({
|
|
13
|
+
// Fail fast on a hung connection rather than blocking the CLI forever.
|
|
14
|
+
// got's TimeoutError carries code ETIMEDOUT, which classifies to NETWORK_ERROR.
|
|
15
|
+
timeout: { request: httpTimeoutMs() },
|
|
16
|
+
hooks: {
|
|
17
|
+
beforeRequest: [
|
|
18
|
+
(options) => {
|
|
19
|
+
if (options.url)
|
|
20
|
+
traceRequest(options.method, options.url.toString());
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
afterResponse: [
|
|
24
|
+
(response) => {
|
|
25
|
+
traceResponse(response.statusCode, response.requestUrl.toString());
|
|
26
|
+
return response;
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
beforeError: [
|
|
30
|
+
(error) => {
|
|
31
|
+
if (httpTraceEnabled()) {
|
|
32
|
+
const url = (error.response?.requestUrl ?? error.options?.url)?.toString() ?? "";
|
|
33
|
+
traceResponse(error.response?.statusCode ?? 0, url);
|
|
34
|
+
}
|
|
35
|
+
return error;
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
});
|
|
6
40
|
function orgHeaders(orgId, extra) {
|
|
7
41
|
return { "X-Org-Id": orgId, ...extra };
|
|
8
42
|
}
|
|
@@ -15,7 +49,7 @@ export function createApiClient(org) {
|
|
|
15
49
|
};
|
|
16
50
|
return {
|
|
17
51
|
async get(path, options) {
|
|
18
|
-
const res = await
|
|
52
|
+
const res = await http.get(`${baseUrl}${path}`, {
|
|
19
53
|
...options,
|
|
20
54
|
headers: { ...headers, ...options?.headers },
|
|
21
55
|
responseType: "json",
|
|
@@ -23,7 +57,7 @@ export function createApiClient(org) {
|
|
|
23
57
|
return res.body;
|
|
24
58
|
},
|
|
25
59
|
async post(path, body, options) {
|
|
26
|
-
const res = await
|
|
60
|
+
const res = await http.post(`${baseUrl}${path}`, {
|
|
27
61
|
...options,
|
|
28
62
|
json: body,
|
|
29
63
|
headers: { ...headers, ...options?.headers },
|
|
@@ -32,7 +66,7 @@ export function createApiClient(org) {
|
|
|
32
66
|
return res.body;
|
|
33
67
|
},
|
|
34
68
|
async put(path, body, options) {
|
|
35
|
-
const res = await
|
|
69
|
+
const res = await http.put(`${baseUrl}${path}`, {
|
|
36
70
|
...options,
|
|
37
71
|
json: body,
|
|
38
72
|
headers: { ...headers, ...options?.headers },
|
|
@@ -41,7 +75,7 @@ export function createApiClient(org) {
|
|
|
41
75
|
return res.body;
|
|
42
76
|
},
|
|
43
77
|
async delete(path, options) {
|
|
44
|
-
const res = await
|
|
78
|
+
const res = await http.delete(`${baseUrl}${path}`, {
|
|
45
79
|
...options,
|
|
46
80
|
headers: { ...headers, ...options?.headers },
|
|
47
81
|
responseType: "json",
|
|
@@ -63,14 +97,14 @@ export function createOrgApiClient(ctx) {
|
|
|
63
97
|
return {
|
|
64
98
|
baseUrl,
|
|
65
99
|
async getJson(path, headers) {
|
|
66
|
-
const res = await
|
|
100
|
+
const res = await http.get(`${baseUrl}${path}`, {
|
|
67
101
|
headers: { ...baseHeaders, Accept: "application/json", ...headers },
|
|
68
102
|
responseType: "json",
|
|
69
103
|
});
|
|
70
104
|
return res.body;
|
|
71
105
|
},
|
|
72
106
|
async getText(path, headers) {
|
|
73
|
-
const res = await
|
|
107
|
+
const res = await http.get(`${baseUrl}${path}`, {
|
|
74
108
|
headers: {
|
|
75
109
|
...baseHeaders,
|
|
76
110
|
Accept: "application/yaml, application/json, text/plain, */*",
|
|
@@ -80,7 +114,7 @@ export function createOrgApiClient(ctx) {
|
|
|
80
114
|
return res.body;
|
|
81
115
|
},
|
|
82
116
|
async postJson(path, body, headers) {
|
|
83
|
-
const res = await
|
|
117
|
+
const res = await http.post(`${baseUrl}${path}`, {
|
|
84
118
|
json: body,
|
|
85
119
|
headers: {
|
|
86
120
|
...baseHeaders,
|
|
@@ -93,7 +127,7 @@ export function createOrgApiClient(ctx) {
|
|
|
93
127
|
return res.body;
|
|
94
128
|
},
|
|
95
129
|
async putJson(path, body, headers) {
|
|
96
|
-
const res = await
|
|
130
|
+
const res = await http.put(`${baseUrl}${path}`, {
|
|
97
131
|
json: body,
|
|
98
132
|
headers: {
|
|
99
133
|
...baseHeaders,
|
|
@@ -111,7 +145,7 @@ export function createOrgApiClient(ctx) {
|
|
|
111
145
|
const blob = new Blob([content], { type: "application/octet-stream" });
|
|
112
146
|
form.append(name, blob, filename);
|
|
113
147
|
}
|
|
114
|
-
const res = await
|
|
148
|
+
const res = await http.post(`${baseUrl}${path}`, {
|
|
115
149
|
body: form,
|
|
116
150
|
headers: { ...baseHeaders, Accept: "application/json", ...headers },
|
|
117
151
|
responseType: "json",
|
|
@@ -119,7 +153,7 @@ export function createOrgApiClient(ctx) {
|
|
|
119
153
|
return res.body;
|
|
120
154
|
},
|
|
121
155
|
async deleteJson(path, headers) {
|
|
122
|
-
const res = await
|
|
156
|
+
const res = await http.delete(`${baseUrl}${path}`, {
|
|
123
157
|
headers: { ...baseHeaders, Accept: "application/json", ...headers },
|
|
124
158
|
responseType: "json",
|
|
125
159
|
});
|
|
@@ -158,6 +192,20 @@ export function errorStatusCode(err) {
|
|
|
158
192
|
return err.status;
|
|
159
193
|
return err?.response?.statusCode;
|
|
160
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Extract the request method + final URL from an error, for diagnostics.
|
|
197
|
+
* Handles both SDK `ApiError` (`err.url` / `err.request.method`) and `got`
|
|
198
|
+
* errors (`err.response.requestUrl` / `err.options.method`). Returns
|
|
199
|
+
* `undefined` fields when nothing is available.
|
|
200
|
+
*/
|
|
201
|
+
export function errorRequestInfo(err) {
|
|
202
|
+
if (err instanceof ApiError) {
|
|
203
|
+
return { method: err.request?.method, url: err.url };
|
|
204
|
+
}
|
|
205
|
+
const e = err;
|
|
206
|
+
const rawUrl = e?.response?.requestUrl ?? e?.request?.requestUrl;
|
|
207
|
+
return { method: e?.options?.method, url: rawUrl ? String(rawUrl) : undefined };
|
|
208
|
+
}
|
|
161
209
|
export function is401(err) {
|
|
162
210
|
return errorStatusCode(err) === 401;
|
|
163
211
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,GAAqB,MAAM,KAAK,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -18,6 +18,17 @@ export declare function getConfig(): Spec0Config;
|
|
|
18
18
|
export declare function getDefaultOrgId(): string | null;
|
|
19
19
|
export declare function getOrgConfig(orgId: string): OrgConfig | undefined;
|
|
20
20
|
export declare function setOrgConfig(orgId: string, config: OrgConfig): void;
|
|
21
|
+
/**
|
|
22
|
+
* Replace the entire org set with a single org and make it active, atomically.
|
|
23
|
+
*
|
|
24
|
+
* The CLI is single-org: `auth login` should always point every subsequent
|
|
25
|
+
* command at the org you just authenticated, with no stale entries left behind
|
|
26
|
+
* to silently win as the default. (A previous default org pointing at a dead
|
|
27
|
+
* `localhost` API base is exactly how a fresh login could appear to succeed yet
|
|
28
|
+
* every command still failed.) This clears any previously stored orgs, writes
|
|
29
|
+
* the one passed in, and sets it as the default in one step.
|
|
30
|
+
*/
|
|
31
|
+
export declare function replaceSoleOrg(orgId: string, config: OrgConfig): void;
|
|
21
32
|
export declare function setDefaultOrg(orgId: string): void;
|
|
22
33
|
export declare function clearConfig(): void;
|
|
23
34
|
export declare function getConfigPath(): string;
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACjC;AAqBD,wBAAgB,SAAS,IAAI,WAAW,CAOvC;AAED,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEjE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAEnE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACjC;AAqBD,wBAAgB,SAAS,IAAI,WAAW,CAOvC;AAED,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEjE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAEnE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAGrE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
package/dist/lib/config.js
CHANGED
|
@@ -37,6 +37,20 @@ export function getOrgConfig(orgId) {
|
|
|
37
37
|
export function setOrgConfig(orgId, config) {
|
|
38
38
|
store.set(`orgs.${orgId}`, config);
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Replace the entire org set with a single org and make it active, atomically.
|
|
42
|
+
*
|
|
43
|
+
* The CLI is single-org: `auth login` should always point every subsequent
|
|
44
|
+
* command at the org you just authenticated, with no stale entries left behind
|
|
45
|
+
* to silently win as the default. (A previous default org pointing at a dead
|
|
46
|
+
* `localhost` API base is exactly how a fresh login could appear to succeed yet
|
|
47
|
+
* every command still failed.) This clears any previously stored orgs, writes
|
|
48
|
+
* the one passed in, and sets it as the default in one step.
|
|
49
|
+
*/
|
|
50
|
+
export function replaceSoleOrg(orgId, config) {
|
|
51
|
+
store.set("orgs", { [orgId]: config });
|
|
52
|
+
store.set("defaultOrg", orgId);
|
|
53
|
+
}
|
|
40
54
|
export function setDefaultOrg(orgId) {
|
|
41
55
|
store.set("defaultOrg", orgId);
|
|
42
56
|
}
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAgBxB,8EAA8E;AAC9E,6EAA6E;AAC7E,MAAM,OAAO,GAAG;IACd,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;IACvC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;IACvD,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;IAC7C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;CAC7B,CAAC;AAEX,MAAM,KAAK,GAAG,IAAI,IAAI,CAAc;IAClC,WAAW,EAAE,OAAO;IACpB,QAAQ,EAAE;QACR,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,SAAS;QACrB,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,EAAE;KACT;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QACnC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC;QACvC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,MAAiB;IAC3D,KAAK,CAAC,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAgBxB,8EAA8E;AAC9E,6EAA6E;AAC7E,MAAM,OAAO,GAAG;IACd,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;IACvC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE;IACvD,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;IAC7C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;CAC7B,CAAC;AAEX,MAAM,KAAK,GAAG,IAAI,IAAI,CAAc;IAClC,WAAW,EAAE,OAAO;IACpB,QAAQ,EAAE;QACR,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,SAAS;QACrB,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,EAAE;KACT;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QACnC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC;QACvC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,MAAiB;IAC3D,KAAK,CAAC,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,MAAiB;IAC7D,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One place to turn a failed platform call into a diagnosable error.
|
|
3
|
+
*
|
|
4
|
+
* Before this, command catch-blocks printed a bare `(err as Error).message` —
|
|
5
|
+
* e.g. `api list failed: Not Found` — with no HTTP status, no URL, and no hint
|
|
6
|
+
* about which org/base was targeted. A developer literally could not tell what
|
|
7
|
+
* went wrong. `failApi` classifies the error into a stable exit code and surfaces:
|
|
8
|
+
*
|
|
9
|
+
* - the server's own message (from the response body when present),
|
|
10
|
+
* - the HTTP status (or a network label when the request never completed),
|
|
11
|
+
* - the method + URL that failed,
|
|
12
|
+
* - the active org + API base, and
|
|
13
|
+
* - a code-specific hint.
|
|
14
|
+
*
|
|
15
|
+
* In `--output json|yaml` mode the request/org context rides in `details` so the
|
|
16
|
+
* document stays a single clean object; in text mode it is appended to the
|
|
17
|
+
* message so a human sees it inline.
|
|
18
|
+
*/
|
|
19
|
+
import { type ExitCodeValue } from "./exit-codes.js";
|
|
20
|
+
import { type OutputContext } from "./output/index.js";
|
|
21
|
+
export interface ApiErrorContext {
|
|
22
|
+
/** Short action label, e.g. "api list", "mock create". */
|
|
23
|
+
action: string;
|
|
24
|
+
/** Active org name or id, for diagnostics. */
|
|
25
|
+
org?: string;
|
|
26
|
+
/** API base the call targeted, for diagnostics. */
|
|
27
|
+
apiUrl?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ApiErrorReport {
|
|
30
|
+
code: ExitCodeValue;
|
|
31
|
+
/** Message for `fail()` — multi-line (with request/org) only in text mode. */
|
|
32
|
+
message: string;
|
|
33
|
+
hint?: string;
|
|
34
|
+
details: Record<string, unknown>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Pure classification of a failed platform call into an exit code, message,
|
|
38
|
+
* hint and structured details. Separated from `failApi` so it can be unit
|
|
39
|
+
* tested without `process.exit`.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildApiError(err: unknown, info: ApiErrorContext, format?: OutputContext["format"]): ApiErrorReport;
|
|
42
|
+
/**
|
|
43
|
+
* Report a failed platform call and exit. Never returns.
|
|
44
|
+
*/
|
|
45
|
+
export declare function failApi(ctx: OutputContext, err: unknown, info: ApiErrorContext): never;
|
|
46
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAmC,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAQ,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAqCD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,eAAe,EACrB,MAAM,GAAE,aAAa,CAAC,QAAQ,CAAU,GACvC,cAAc,CA+BhB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,GAAG,KAAK,CAGtF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One place to turn a failed platform call into a diagnosable error.
|
|
3
|
+
*
|
|
4
|
+
* Before this, command catch-blocks printed a bare `(err as Error).message` —
|
|
5
|
+
* e.g. `api list failed: Not Found` — with no HTTP status, no URL, and no hint
|
|
6
|
+
* about which org/base was targeted. A developer literally could not tell what
|
|
7
|
+
* went wrong. `failApi` classifies the error into a stable exit code and surfaces:
|
|
8
|
+
*
|
|
9
|
+
* - the server's own message (from the response body when present),
|
|
10
|
+
* - the HTTP status (or a network label when the request never completed),
|
|
11
|
+
* - the method + URL that failed,
|
|
12
|
+
* - the active org + API base, and
|
|
13
|
+
* - a code-specific hint.
|
|
14
|
+
*
|
|
15
|
+
* In `--output json|yaml` mode the request/org context rides in `details` so the
|
|
16
|
+
* document stays a single clean object; in text mode it is appended to the
|
|
17
|
+
* message so a human sees it inline.
|
|
18
|
+
*/
|
|
19
|
+
import { errorStatusCode, errorRequestInfo, extractErrorMessage } from "./api-client.js";
|
|
20
|
+
import { ExitCode, exitCodeForHttpStatus } from "./exit-codes.js";
|
|
21
|
+
import { fail } from "./output/index.js";
|
|
22
|
+
const HINTS = {
|
|
23
|
+
[ExitCode.AUTH_MISSING]: "Run 'spec0 auth login', or refresh SPEC0_TOKEN.",
|
|
24
|
+
[ExitCode.PERMISSION_DENIED]: "Your account lacks permission for this resource.",
|
|
25
|
+
[ExitCode.NOT_FOUND]: "Check the name/id, or confirm SPEC0_API_URL points at the right backend.",
|
|
26
|
+
[ExitCode.CONFLICT]: "A resource with that name/version already exists.",
|
|
27
|
+
[ExitCode.VALIDATION]: "The request was rejected as invalid — see the message above.",
|
|
28
|
+
[ExitCode.RATE_LIMITED]: "Rate limit hit — wait a moment and retry.",
|
|
29
|
+
[ExitCode.SERVER_ERROR]: "Server error — retry shortly; if it persists, contact support.",
|
|
30
|
+
[ExitCode.NETWORK_ERROR]: "Could not reach the platform. Check connectivity, then SPEC0_API_URL (run 'spec0 doctor').",
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Best-effort label for a request that never produced an HTTP response.
|
|
34
|
+
* `got` puts the code on the error itself; the SDK uses `fetch`, which wraps the
|
|
35
|
+
* real cause (so the visible message is an unhelpful "fetch failed" and the code
|
|
36
|
+
* lives on `err.cause`). Check both.
|
|
37
|
+
*/
|
|
38
|
+
function networkLabel(err) {
|
|
39
|
+
// A `fetch` timeout/cancellation is a DOMException with no `code` — it
|
|
40
|
+
// identifies itself by `name` ("TimeoutError" / "AbortError") instead.
|
|
41
|
+
const name = err?.name ?? err?.cause?.name;
|
|
42
|
+
if (name === "TimeoutError")
|
|
43
|
+
return "timed out";
|
|
44
|
+
if (name === "AbortError")
|
|
45
|
+
return "request aborted";
|
|
46
|
+
const code = err?.code ?? err?.cause?.code;
|
|
47
|
+
if (!code)
|
|
48
|
+
return undefined;
|
|
49
|
+
if (code === "ECONNREFUSED")
|
|
50
|
+
return "connection refused";
|
|
51
|
+
if (code === "ENOTFOUND" || code === "EAI_AGAIN")
|
|
52
|
+
return "host not found";
|
|
53
|
+
if (code === "ETIMEDOUT" || code === "ETIME")
|
|
54
|
+
return "timed out";
|
|
55
|
+
return code;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Pure classification of a failed platform call into an exit code, message,
|
|
59
|
+
* hint and structured details. Separated from `failApi` so it can be unit
|
|
60
|
+
* tested without `process.exit`.
|
|
61
|
+
*/
|
|
62
|
+
export function buildApiError(err, info, format = "text") {
|
|
63
|
+
const status = errorStatusCode(err);
|
|
64
|
+
const code = exitCodeForHttpStatus(status);
|
|
65
|
+
const netLabel = status === undefined ? networkLabel(err) : undefined;
|
|
66
|
+
const serverMsg = extractErrorMessage(err);
|
|
67
|
+
const base = serverMsg ?? netLabel ?? err?.message ?? String(err);
|
|
68
|
+
const { method, url } = errorRequestInfo(err);
|
|
69
|
+
const statusPart = status !== undefined ? `HTTP ${status}` : undefined;
|
|
70
|
+
let message = `${info.action} failed: ${base}` + (statusPart ? ` (${statusPart})` : "");
|
|
71
|
+
const requestLine = url ? `${method ?? "GET"} ${url}` : undefined;
|
|
72
|
+
if (format === "text") {
|
|
73
|
+
const extra = [
|
|
74
|
+
requestLine ? ` ${requestLine}` : undefined,
|
|
75
|
+
info.org ? ` org: ${info.org}` : undefined,
|
|
76
|
+
].filter(Boolean);
|
|
77
|
+
if (extra.length)
|
|
78
|
+
message += "\n" + extra.join("\n");
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
code,
|
|
82
|
+
message,
|
|
83
|
+
hint: HINTS[code],
|
|
84
|
+
details: {
|
|
85
|
+
...(status !== undefined ? { status } : {}),
|
|
86
|
+
...(requestLine ? { request: requestLine } : {}),
|
|
87
|
+
...(info.org ? { org: info.org } : {}),
|
|
88
|
+
...(info.apiUrl ? { apiUrl: info.apiUrl } : {}),
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Report a failed platform call and exit. Never returns.
|
|
94
|
+
*/
|
|
95
|
+
export function failApi(ctx, err, info) {
|
|
96
|
+
const report = buildApiError(err, info, ctx.format);
|
|
97
|
+
fail(ctx, report.code, report.message, { hint: report.hint, details: report.details });
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP instrumentation: a default request timeout (always on) plus opt-in
|
|
3
|
+
* `--verbose` request tracing.
|
|
4
|
+
*
|
|
5
|
+
* The CLI talks to the platform over two transports: raw `got` (see
|
|
6
|
+
* `api-client.ts`) and the generated `@spec0/sdk-public-platform`, which issues
|
|
7
|
+
* calls through the global `fetch`. Neither had a timeout, so a silently
|
|
8
|
+
* dropped connection could hang the CLI forever, and neither printed anything,
|
|
9
|
+
* so a failing command could not show *which URL* it hit.
|
|
10
|
+
*
|
|
11
|
+
* `installHttpInstrumentation()` wraps the global `fetch` once at startup to
|
|
12
|
+
* - apply a default timeout (combined with any signal the SDK already passes,
|
|
13
|
+
* so cancellation still works), and
|
|
14
|
+
* - trace each request/response when `--verbose` is on.
|
|
15
|
+
* `got` gets the same timeout via its own options and calls `traceRequest` /
|
|
16
|
+
* `traceResponse` from its hooks.
|
|
17
|
+
*
|
|
18
|
+
* All trace output goes to **stderr** so stdout stays a clean single document
|
|
19
|
+
* for `--output json|yaml` consumers.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Default per-request timeout in milliseconds. Override with
|
|
23
|
+
* `SPEC0_HTTP_TIMEOUT_MS`; falls back to 30s for any unset/invalid value.
|
|
24
|
+
*/
|
|
25
|
+
export declare function httpTimeoutMs(): number;
|
|
26
|
+
/** Enable/disable `--verbose` request tracing. */
|
|
27
|
+
export declare function setHttpTrace(on: boolean): void;
|
|
28
|
+
export declare function httpTraceEnabled(): boolean;
|
|
29
|
+
export declare function traceRequest(method: string, url: string): void;
|
|
30
|
+
export declare function traceResponse(status: number, url: string): void;
|
|
31
|
+
export declare function traceError(method: string, url: string, message: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Wrap the global `fetch` once (covers all SDK calls) to apply the default
|
|
34
|
+
* timeout and trace when verbose. Idempotent; safe to call at startup.
|
|
35
|
+
*/
|
|
36
|
+
export declare function installHttpInstrumentation(): void;
|
|
37
|
+
//# sourceMappingURL=http-trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-trace.d.ts","sourceRoot":"","sources":["../../src/lib/http-trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AASH;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAMD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAE9D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAE/D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7E;AAgBD;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CA2BjD"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP instrumentation: a default request timeout (always on) plus opt-in
|
|
3
|
+
* `--verbose` request tracing.
|
|
4
|
+
*
|
|
5
|
+
* The CLI talks to the platform over two transports: raw `got` (see
|
|
6
|
+
* `api-client.ts`) and the generated `@spec0/sdk-public-platform`, which issues
|
|
7
|
+
* calls through the global `fetch`. Neither had a timeout, so a silently
|
|
8
|
+
* dropped connection could hang the CLI forever, and neither printed anything,
|
|
9
|
+
* so a failing command could not show *which URL* it hit.
|
|
10
|
+
*
|
|
11
|
+
* `installHttpInstrumentation()` wraps the global `fetch` once at startup to
|
|
12
|
+
* - apply a default timeout (combined with any signal the SDK already passes,
|
|
13
|
+
* so cancellation still works), and
|
|
14
|
+
* - trace each request/response when `--verbose` is on.
|
|
15
|
+
* `got` gets the same timeout via its own options and calls `traceRequest` /
|
|
16
|
+
* `traceResponse` from its hooks.
|
|
17
|
+
*
|
|
18
|
+
* All trace output goes to **stderr** so stdout stays a clean single document
|
|
19
|
+
* for `--output json|yaml` consumers.
|
|
20
|
+
*/
|
|
21
|
+
import chalk from "chalk";
|
|
22
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
23
|
+
let enabled = false;
|
|
24
|
+
let installed = false;
|
|
25
|
+
/**
|
|
26
|
+
* Default per-request timeout in milliseconds. Override with
|
|
27
|
+
* `SPEC0_HTTP_TIMEOUT_MS`; falls back to 30s for any unset/invalid value.
|
|
28
|
+
*/
|
|
29
|
+
export function httpTimeoutMs() {
|
|
30
|
+
const raw = process.env.SPEC0_HTTP_TIMEOUT_MS;
|
|
31
|
+
const n = raw ? Number(raw) : NaN;
|
|
32
|
+
return Number.isFinite(n) && n > 0 ? n : DEFAULT_TIMEOUT_MS;
|
|
33
|
+
}
|
|
34
|
+
/** Enable/disable `--verbose` request tracing. */
|
|
35
|
+
export function setHttpTrace(on) {
|
|
36
|
+
enabled = on;
|
|
37
|
+
}
|
|
38
|
+
export function httpTraceEnabled() {
|
|
39
|
+
return enabled;
|
|
40
|
+
}
|
|
41
|
+
function line(text) {
|
|
42
|
+
process.stderr.write(chalk.gray(text.endsWith("\n") ? text : `${text}\n`));
|
|
43
|
+
}
|
|
44
|
+
export function traceRequest(method, url) {
|
|
45
|
+
if (enabled)
|
|
46
|
+
line(`→ ${method} ${url}`);
|
|
47
|
+
}
|
|
48
|
+
export function traceResponse(status, url) {
|
|
49
|
+
if (enabled)
|
|
50
|
+
line(`← ${status} ${url}`);
|
|
51
|
+
}
|
|
52
|
+
export function traceError(method, url, message) {
|
|
53
|
+
if (enabled)
|
|
54
|
+
line(`✗ ${method} ${url} — ${message}`);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Combine the SDK's own abort signal (if any) with a timeout signal so a hung
|
|
58
|
+
* request fails fast while explicit cancellation still works.
|
|
59
|
+
*/
|
|
60
|
+
function withTimeout(init) {
|
|
61
|
+
const timeout = AbortSignal.timeout(httpTimeoutMs());
|
|
62
|
+
const existing = init?.signal ?? undefined;
|
|
63
|
+
const signal = existing && typeof AbortSignal.any === "function"
|
|
64
|
+
? AbortSignal.any([existing, timeout])
|
|
65
|
+
: (existing ?? timeout);
|
|
66
|
+
return { ...init, signal };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Wrap the global `fetch` once (covers all SDK calls) to apply the default
|
|
70
|
+
* timeout and trace when verbose. Idempotent; safe to call at startup.
|
|
71
|
+
*/
|
|
72
|
+
export function installHttpInstrumentation() {
|
|
73
|
+
if (installed)
|
|
74
|
+
return;
|
|
75
|
+
const original = globalThis.fetch;
|
|
76
|
+
if (typeof original !== "function")
|
|
77
|
+
return;
|
|
78
|
+
globalThis.fetch = (async (input, init) => {
|
|
79
|
+
const method = init?.method ??
|
|
80
|
+
(typeof input === "object" && input !== null && "method" in input
|
|
81
|
+
? input.method
|
|
82
|
+
: "GET");
|
|
83
|
+
const url = typeof input === "string"
|
|
84
|
+
? input
|
|
85
|
+
: input instanceof URL
|
|
86
|
+
? input.toString()
|
|
87
|
+
: input.url;
|
|
88
|
+
traceRequest(method, url);
|
|
89
|
+
try {
|
|
90
|
+
const res = await original(input, withTimeout(init));
|
|
91
|
+
traceResponse(res.status, url);
|
|
92
|
+
return res;
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
traceError(method, url, err.message);
|
|
96
|
+
throw err;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
installed = true;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=http-trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-trace.js","sourceRoot":"","sources":["../../src/lib/http-trace.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/output.d.ts
CHANGED
|
@@ -27,6 +27,10 @@ export declare function formatPublishText(output: {
|
|
|
27
27
|
versionUnchanged?: boolean;
|
|
28
28
|
versionUnchangedHint?: string;
|
|
29
29
|
created?: boolean;
|
|
30
|
+
governanceWarnings?: Array<{
|
|
31
|
+
section?: string;
|
|
32
|
+
message?: string;
|
|
33
|
+
}>;
|
|
30
34
|
}): string;
|
|
31
35
|
export declare function formatGitHubAnnotation(file: string, line: number, level: "error" | "warning", message: string): string;
|
|
32
36
|
//# sourceMappingURL=output.d.ts.map
|
package/dist/lib/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEtD,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE,GAAG,MAAM,CAsBT;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEtD,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnE,GAAG,MAAM,CAsBT;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpE,GAAG,MAAM,CA2CT;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GAAG,SAAS,EAC1B,OAAO,EAAE,MAAM,GACd,MAAM,CAER"}
|
package/dist/lib/output.js
CHANGED
|
@@ -56,6 +56,14 @@ export function formatPublishText(output) {
|
|
|
56
56
|
chalk.yellow(output.versionUnchangedHint ??
|
|
57
57
|
`Spec changed but version is still ${output.version}. Pass --semver to auto-bump.`));
|
|
58
58
|
}
|
|
59
|
+
const warnings = output.governanceWarnings ?? [];
|
|
60
|
+
if (warnings.length > 0) {
|
|
61
|
+
lines.push("");
|
|
62
|
+
lines.push(chalk.yellow(`⚠ ${warnings.length} governance warning${warnings.length === 1 ? "" : "s"}:`));
|
|
63
|
+
for (const w of warnings) {
|
|
64
|
+
lines.push(chalk.yellow(` [${w.section ?? "policy"}] ${w.message ?? ""}`));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
59
67
|
return lines.join("\n");
|
|
60
68
|
}
|
|
61
69
|
export function formatGitHubAnnotation(file, line, level, message) {
|
package/dist/lib/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,UAAU,cAAc,CAAC,MAI9B;IACC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,iCAAiC,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|