@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.
Files changed (220) hide show
  1. package/AGENTS.md +67 -0
  2. package/LICENSE +21 -0
  3. package/README.md +235 -0
  4. package/dist/commands/api/changelog.d.ts +9 -0
  5. package/dist/commands/api/changelog.d.ts.map +1 -0
  6. package/dist/commands/api/changelog.js +144 -0
  7. package/dist/commands/api/changelog.js.map +1 -0
  8. package/dist/commands/api/index.d.ts +6 -0
  9. package/dist/commands/api/index.d.ts.map +1 -0
  10. package/dist/commands/api/index.js +13 -0
  11. package/dist/commands/api/index.js.map +1 -0
  12. package/dist/commands/api/list.d.ts +10 -0
  13. package/dist/commands/api/list.d.ts.map +1 -0
  14. package/dist/commands/api/list.js +79 -0
  15. package/dist/commands/api/list.js.map +1 -0
  16. package/dist/commands/api/show.d.ts +9 -0
  17. package/dist/commands/api/show.d.ts.map +1 -0
  18. package/dist/commands/api/show.js +88 -0
  19. package/dist/commands/api/show.js.map +1 -0
  20. package/dist/commands/auth.d.ts +6 -0
  21. package/dist/commands/auth.d.ts.map +1 -0
  22. package/dist/commands/auth.js +166 -0
  23. package/dist/commands/auth.js.map +1 -0
  24. package/dist/commands/ci/generate.d.ts +10 -0
  25. package/dist/commands/ci/generate.d.ts.map +1 -0
  26. package/dist/commands/ci/generate.js +72 -0
  27. package/dist/commands/ci/generate.js.map +1 -0
  28. package/dist/commands/ci/index.d.ts +3 -0
  29. package/dist/commands/ci/index.d.ts.map +1 -0
  30. package/dist/commands/ci/index.js +6 -0
  31. package/dist/commands/ci/index.js.map +1 -0
  32. package/dist/commands/commands.d.ts +19 -0
  33. package/dist/commands/commands.d.ts.map +1 -0
  34. package/dist/commands/commands.js +127 -0
  35. package/dist/commands/commands.js.map +1 -0
  36. package/dist/commands/diff.d.ts +6 -0
  37. package/dist/commands/diff.d.ts.map +1 -0
  38. package/dist/commands/diff.js +102 -0
  39. package/dist/commands/diff.js.map +1 -0
  40. package/dist/commands/doctor.d.ts +11 -0
  41. package/dist/commands/doctor.d.ts.map +1 -0
  42. package/dist/commands/doctor.js +54 -0
  43. package/dist/commands/doctor.js.map +1 -0
  44. package/dist/commands/init.d.ts +6 -0
  45. package/dist/commands/init.d.ts.map +1 -0
  46. package/dist/commands/init.js +67 -0
  47. package/dist/commands/init.js.map +1 -0
  48. package/dist/commands/lint.d.ts +6 -0
  49. package/dist/commands/lint.d.ts.map +1 -0
  50. package/dist/commands/lint.js +109 -0
  51. package/dist/commands/lint.js.map +1 -0
  52. package/dist/commands/log.d.ts +6 -0
  53. package/dist/commands/log.d.ts.map +1 -0
  54. package/dist/commands/log.js +95 -0
  55. package/dist/commands/log.js.map +1 -0
  56. package/dist/commands/mcp.d.ts +6 -0
  57. package/dist/commands/mcp.d.ts.map +1 -0
  58. package/dist/commands/mcp.js +59 -0
  59. package/dist/commands/mcp.js.map +1 -0
  60. package/dist/commands/mock/create.d.ts +14 -0
  61. package/dist/commands/mock/create.d.ts.map +1 -0
  62. package/dist/commands/mock/create.js +75 -0
  63. package/dist/commands/mock/create.js.map +1 -0
  64. package/dist/commands/mock/index.d.ts +9 -0
  65. package/dist/commands/mock/index.d.ts.map +1 -0
  66. package/dist/commands/mock/index.js +18 -0
  67. package/dist/commands/mock/index.js.map +1 -0
  68. package/dist/commands/mock/list.d.ts +8 -0
  69. package/dist/commands/mock/list.d.ts.map +1 -0
  70. package/dist/commands/mock/list.js +52 -0
  71. package/dist/commands/mock/list.js.map +1 -0
  72. package/dist/commands/mock/show.d.ts +9 -0
  73. package/dist/commands/mock/show.d.ts.map +1 -0
  74. package/dist/commands/mock/show.js +68 -0
  75. package/dist/commands/mock/show.js.map +1 -0
  76. package/dist/commands/mock/url.d.ts +10 -0
  77. package/dist/commands/mock/url.d.ts.map +1 -0
  78. package/dist/commands/mock/url.js +42 -0
  79. package/dist/commands/mock/url.js.map +1 -0
  80. package/dist/commands/mock.d.ts +6 -0
  81. package/dist/commands/mock.d.ts.map +1 -0
  82. package/dist/commands/mock.js +116 -0
  83. package/dist/commands/mock.js.map +1 -0
  84. package/dist/commands/publish.d.ts +11 -0
  85. package/dist/commands/publish.d.ts.map +1 -0
  86. package/dist/commands/publish.js +242 -0
  87. package/dist/commands/publish.js.map +1 -0
  88. package/dist/commands/pull.d.ts +6 -0
  89. package/dist/commands/pull.d.ts.map +1 -0
  90. package/dist/commands/pull.js +62 -0
  91. package/dist/commands/pull.js.map +1 -0
  92. package/dist/commands/push.d.ts +18 -0
  93. package/dist/commands/push.d.ts.map +1 -0
  94. package/dist/commands/push.js +302 -0
  95. package/dist/commands/push.js.map +1 -0
  96. package/dist/commands/register.d.ts +6 -0
  97. package/dist/commands/register.d.ts.map +1 -0
  98. package/dist/commands/register.js +213 -0
  99. package/dist/commands/register.js.map +1 -0
  100. package/dist/commands/search.d.ts +6 -0
  101. package/dist/commands/search.d.ts.map +1 -0
  102. package/dist/commands/search.js +58 -0
  103. package/dist/commands/search.js.map +1 -0
  104. package/dist/commands/status.d.ts +6 -0
  105. package/dist/commands/status.d.ts.map +1 -0
  106. package/dist/commands/status.js +86 -0
  107. package/dist/commands/status.js.map +1 -0
  108. package/dist/commands/sync-status.d.ts +14 -0
  109. package/dist/commands/sync-status.d.ts.map +1 -0
  110. package/dist/commands/sync-status.js +119 -0
  111. package/dist/commands/sync-status.js.map +1 -0
  112. package/dist/commands/team.d.ts +6 -0
  113. package/dist/commands/team.d.ts.map +1 -0
  114. package/dist/commands/team.js +30 -0
  115. package/dist/commands/team.js.map +1 -0
  116. package/dist/commands/version.d.ts +6 -0
  117. package/dist/commands/version.d.ts.map +1 -0
  118. package/dist/commands/version.js +31 -0
  119. package/dist/commands/version.js.map +1 -0
  120. package/dist/index.d.ts +3 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +61 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/lib/agent-mode.d.ts +25 -0
  125. package/dist/lib/agent-mode.d.ts.map +1 -0
  126. package/dist/lib/agent-mode.js +36 -0
  127. package/dist/lib/agent-mode.js.map +1 -0
  128. package/dist/lib/api-client.d.ts +37 -0
  129. package/dist/lib/api-client.d.ts.map +1 -0
  130. package/dist/lib/api-client.js +144 -0
  131. package/dist/lib/api-client.js.map +1 -0
  132. package/dist/lib/auth-context.d.ts +18 -0
  133. package/dist/lib/auth-context.d.ts.map +1 -0
  134. package/dist/lib/auth-context.js +48 -0
  135. package/dist/lib/auth-context.js.map +1 -0
  136. package/dist/lib/breaking-change.d.ts +12 -0
  137. package/dist/lib/breaking-change.d.ts.map +1 -0
  138. package/dist/lib/breaking-change.js +10 -0
  139. package/dist/lib/breaking-change.js.map +1 -0
  140. package/dist/lib/ci-detect.d.ts +33 -0
  141. package/dist/lib/ci-detect.d.ts.map +1 -0
  142. package/dist/lib/ci-detect.js +136 -0
  143. package/dist/lib/ci-detect.js.map +1 -0
  144. package/dist/lib/cli-spec-path.d.ts +6 -0
  145. package/dist/lib/cli-spec-path.d.ts.map +1 -0
  146. package/dist/lib/cli-spec-path.js +34 -0
  147. package/dist/lib/cli-spec-path.js.map +1 -0
  148. package/dist/lib/codeowners.d.ts +11 -0
  149. package/dist/lib/codeowners.d.ts.map +1 -0
  150. package/dist/lib/codeowners.js +43 -0
  151. package/dist/lib/codeowners.js.map +1 -0
  152. package/dist/lib/config.d.ts +24 -0
  153. package/dist/lib/config.d.ts.map +1 -0
  154. package/dist/lib/config.js +49 -0
  155. package/dist/lib/config.js.map +1 -0
  156. package/dist/lib/deprecation.d.ts +17 -0
  157. package/dist/lib/deprecation.d.ts.map +1 -0
  158. package/dist/lib/deprecation.js +22 -0
  159. package/dist/lib/deprecation.js.map +1 -0
  160. package/dist/lib/doctor.d.ts +40 -0
  161. package/dist/lib/doctor.d.ts.map +1 -0
  162. package/dist/lib/doctor.js +107 -0
  163. package/dist/lib/doctor.js.map +1 -0
  164. package/dist/lib/exit-codes.d.ts +51 -0
  165. package/dist/lib/exit-codes.d.ts.map +1 -0
  166. package/dist/lib/exit-codes.js +78 -0
  167. package/dist/lib/exit-codes.js.map +1 -0
  168. package/dist/lib/lint.d.ts +18 -0
  169. package/dist/lib/lint.d.ts.map +1 -0
  170. package/dist/lib/lint.js +41 -0
  171. package/dist/lib/lint.js.map +1 -0
  172. package/dist/lib/local-config-yaml.d.ts +14 -0
  173. package/dist/lib/local-config-yaml.d.ts.map +1 -0
  174. package/dist/lib/local-config-yaml.js +29 -0
  175. package/dist/lib/local-config-yaml.js.map +1 -0
  176. package/dist/lib/output/index.d.ts +69 -0
  177. package/dist/lib/output/index.d.ts.map +1 -0
  178. package/dist/lib/output/index.js +120 -0
  179. package/dist/lib/output/index.js.map +1 -0
  180. package/dist/lib/output/table.d.ts +19 -0
  181. package/dist/lib/output/table.d.ts.map +1 -0
  182. package/dist/lib/output/table.js +48 -0
  183. package/dist/lib/output/table.js.map +1 -0
  184. package/dist/lib/output.d.ts +32 -0
  185. package/dist/lib/output.d.ts.map +1 -0
  186. package/dist/lib/output.js +64 -0
  187. package/dist/lib/output.js.map +1 -0
  188. package/dist/lib/platform-defaults.d.ts +27 -0
  189. package/dist/lib/platform-defaults.d.ts.map +1 -0
  190. package/dist/lib/platform-defaults.js +36 -0
  191. package/dist/lib/platform-defaults.js.map +1 -0
  192. package/dist/lib/ref-resolver.d.ts +37 -0
  193. package/dist/lib/ref-resolver.d.ts.map +1 -0
  194. package/dist/lib/ref-resolver.js +56 -0
  195. package/dist/lib/ref-resolver.js.map +1 -0
  196. package/dist/lib/registry-ref.d.ts +10 -0
  197. package/dist/lib/registry-ref.d.ts.map +1 -0
  198. package/dist/lib/registry-ref.js +18 -0
  199. package/dist/lib/registry-ref.js.map +1 -0
  200. package/dist/lib/spec-finder.d.ts +6 -0
  201. package/dist/lib/spec-finder.d.ts.map +1 -0
  202. package/dist/lib/spec-finder.js +42 -0
  203. package/dist/lib/spec-finder.js.map +1 -0
  204. package/dist/lib/update-check.d.ts +12 -0
  205. package/dist/lib/update-check.d.ts.map +1 -0
  206. package/dist/lib/update-check.js +62 -0
  207. package/dist/lib/update-check.js.map +1 -0
  208. package/dist/lib/version.d.ts +17 -0
  209. package/dist/lib/version.d.ts.map +1 -0
  210. package/dist/lib/version.js +33 -0
  211. package/dist/lib/version.js.map +1 -0
  212. package/dist/lib/winspect-yaml.d.ts +14 -0
  213. package/dist/lib/winspect-yaml.d.ts.map +1 -0
  214. package/dist/lib/winspect-yaml.js +28 -0
  215. package/dist/lib/winspect-yaml.js.map +1 -0
  216. package/dist/types.d.ts +664 -0
  217. package/dist/types.d.ts.map +1 -0
  218. package/dist/types.js +6 -0
  219. package/dist/types.js.map +1 -0
  220. package/package.json +87 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Two origins — do not conflate them:
3
+ *
4
+ * - **`SPEC0_APP_URL`** — Web app only: opening the browser for `spec0 auth login`
5
+ * (`/cli-auth`). Also used when printing dashboard links in `spec0 push` output (`specUrl`);
6
+ * that is not an API request.
7
+ * - **`SPEC0_API_URL`** — Spring backend base for **all** programmatic HTTP (push, pull, mock,
8
+ * lint, search, registry, …). Stored on login as `org.apiUrl` and used by
9
+ * `createOrgApiClient` / `createApiClient`.
10
+ *
11
+ * Defaults below match local dev (Next :3000, Spring :8080 + context path). Override both for
12
+ * staging/production. `SPEC0_API_URL` should align with `NEXT_PUBLIC_API_BASE_URL` in
13
+ * api-management-ui, not the Next.js site origin alone.
14
+ *
15
+ * Legacy: `PLATFORM_APP_URL` / `PLATFORM_API_URL` are still accepted as fallbacks.
16
+ */
17
+ /** Next.js / browser app — CLI auth (`/cli-auth`) and push output links. */
18
+ export const DEFAULT_PLATFORM_APP_URL = "https://app.spec0.io";
19
+ /**
20
+ * Spring Boot API base (include servlet context path if your deploy uses one).
21
+ */
22
+ export const DEFAULT_PLATFORM_API_URL = "https://api.spec0.io/api-management";
23
+ function normalizeOrigin(url) {
24
+ return url.trim().replace(/\/$/, "");
25
+ }
26
+ /** Web app origin for auth + UI links — never used as the REST base. */
27
+ export function resolvedPlatformAppUrl() {
28
+ const raw = (process.env.SPEC0_APP_URL ?? process.env.PLATFORM_APP_URL)?.trim();
29
+ return normalizeOrigin(raw || DEFAULT_PLATFORM_APP_URL);
30
+ }
31
+ /** Backend base for all CLI REST calls — never derived from the app URL. */
32
+ export function resolvedPlatformApiUrl() {
33
+ const raw = (process.env.SPEC0_API_URL ?? process.env.PLATFORM_API_URL)?.trim();
34
+ return normalizeOrigin(raw || DEFAULT_PLATFORM_API_URL);
35
+ }
36
+ //# sourceMappingURL=platform-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-defaults.js","sourceRoot":"","sources":["../../src/lib/platform-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,qCAAqC,CAAC;AAE9E,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,sBAAsB;IACpC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC;IAChF,OAAO,eAAe,CAAC,GAAG,IAAI,wBAAwB,CAAC,CAAC;AAC1D,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,sBAAsB;IACpC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC;IAChF,OAAO,eAAe,CAAC,GAAG,IAAI,wBAAwB,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Single source of truth for parsing `<ref>` arguments.
3
+ *
4
+ * Accepts:
5
+ * - `<org>/<api>[@<tag>]` — full registry ref
6
+ * - `<api>[@<tag>]` — uses caller-supplied default org slug
7
+ * - `<uuid>` — API id (no org/api lookup needed)
8
+ *
9
+ * For commands that need an apiId from a name, call `resolveApiId(client, ref)`
10
+ * which hits `/apis/summary` and caches per-process.
11
+ */
12
+ /** Minimal structural type — avoids dragging the full client surface in. */
13
+ interface ApiSummaryClient {
14
+ getJson(path: string): Promise<unknown>;
15
+ }
16
+ export type ResolvedRef = {
17
+ kind: "uuid";
18
+ apiId: string;
19
+ tag?: undefined;
20
+ } | {
21
+ kind: "name";
22
+ org: string | undefined;
23
+ api: string;
24
+ tag?: string;
25
+ };
26
+ export interface ResolveOptions {
27
+ /** Fallback org slug used when the ref omits one (e.g. plain `api-name`). */
28
+ defaultOrg?: string;
29
+ }
30
+ export declare function resolveRef(ref: string, opts?: ResolveOptions): ResolvedRef;
31
+ /**
32
+ * Resolve an apiId from a ref. UUIDs pass through; names hit `/apis/summary`.
33
+ * Cached per-process so repeated calls in one command are free.
34
+ */
35
+ export declare function resolveApiId(client: ApiSummaryClient, ref: ResolvedRef): Promise<string>;
36
+ export {};
37
+ //# sourceMappingURL=ref-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/ref-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,4EAA4E;AAC5E,UAAU,gBAAgB;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC;AAID,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,SAAS,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,WAAW,CAsB9E;AASD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB9F"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Single source of truth for parsing `<ref>` arguments.
3
+ *
4
+ * Accepts:
5
+ * - `<org>/<api>[@<tag>]` — full registry ref
6
+ * - `<api>[@<tag>]` — uses caller-supplied default org slug
7
+ * - `<uuid>` — API id (no org/api lookup needed)
8
+ *
9
+ * For commands that need an apiId from a name, call `resolveApiId(client, ref)`
10
+ * which hits `/apis/summary` and caches per-process.
11
+ */
12
+ import { parseRegistryRef } from "./registry-ref.js";
13
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
14
+ export function resolveRef(ref, opts = {}) {
15
+ const trimmed = ref.trim();
16
+ if (!trimmed)
17
+ throw new Error("Empty ref. Expected <org>/<api>[@<tag>] or a UUID.");
18
+ if (UUID_RE.test(trimmed)) {
19
+ return { kind: "uuid", apiId: trimmed };
20
+ }
21
+ if (trimmed.includes("/")) {
22
+ const p = parseRegistryRef(trimmed);
23
+ return { kind: "name", org: p.org, api: p.api, tag: p.tag };
24
+ }
25
+ // No slash + not a UUID → treat as `<api>[@<tag>]` against defaultOrg.
26
+ let api = trimmed;
27
+ let tag;
28
+ const at = trimmed.lastIndexOf("@");
29
+ if (at !== -1) {
30
+ tag = trimmed.slice(at + 1);
31
+ api = trimmed.slice(0, at);
32
+ }
33
+ return { kind: "name", org: opts.defaultOrg, api, tag };
34
+ }
35
+ const idCache = new Map(); // key = `${org}/${api}` → apiId
36
+ /**
37
+ * Resolve an apiId from a ref. UUIDs pass through; names hit `/apis/summary`.
38
+ * Cached per-process so repeated calls in one command are free.
39
+ */
40
+ export async function resolveApiId(client, ref) {
41
+ if (ref.kind === "uuid")
42
+ return ref.apiId;
43
+ const key = `${ref.org ?? ""}/${ref.api}`;
44
+ const cached = idCache.get(key);
45
+ if (cached)
46
+ return cached;
47
+ const rows = (await client.getJson("/apis/summary"));
48
+ const wantedName = ref.api.toLowerCase();
49
+ const hit = rows.find((r) => (r.apiName ?? "").toLowerCase() === wantedName);
50
+ if (!hit?.apiId) {
51
+ throw new Error(`No API named '${ref.api}' found${ref.org ? ` in '${ref.org}'` : ""}. Run 'spec0 api list' to see what exists.`);
52
+ }
53
+ idCache.set(key, hit.apiId);
54
+ return hit.apiId;
55
+ }
56
+ //# sourceMappingURL=ref-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref-resolver.js","sourceRoot":"","sources":["../../src/lib/ref-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAOrD,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAWlF,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,OAAuB,EAAE;IAC/D,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAEpF,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IAC9D,CAAC;IAED,uEAAuE;IACvE,IAAI,GAAG,GAAG,OAAO,CAAC;IAClB,IAAI,GAAuB,CAAC;IAC5B,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACd,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5B,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC1D,CAAC;AAOD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,gCAAgC;AAE3E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAwB,EAAE,GAAgB;IAC3E,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC;IAE1C,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAiB,CAAC;IACrE,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC;IAC7E,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,4CAA4C,CAChH,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,KAAK,CAAC;AACnB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Parse registry refs like acme/order-api or acme/order-api@v1.2.0
3
+ */
4
+ export interface ParsedRegistryRef {
5
+ org: string;
6
+ api: string;
7
+ tag?: string;
8
+ }
9
+ export declare function parseRegistryRef(ref: string): ParsedRegistryRef;
10
+ //# sourceMappingURL=registry-ref.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-ref.d.ts","sourceRoot":"","sources":["../../src/lib/registry-ref.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAa/D"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Parse registry refs like acme/order-api or acme/order-api@v1.2.0
3
+ */
4
+ export function parseRegistryRef(ref) {
5
+ let rest = ref.trim();
6
+ let tag;
7
+ const at = rest.lastIndexOf("@");
8
+ if (at !== -1) {
9
+ tag = rest.slice(at + 1);
10
+ rest = rest.slice(0, at);
11
+ }
12
+ const slash = rest.indexOf("/");
13
+ if (slash === -1) {
14
+ throw new Error("Expected <org-slug>/<api-name>[@version]");
15
+ }
16
+ return { org: rest.slice(0, slash), api: rest.slice(slash + 1), tag };
17
+ }
18
+ //# sourceMappingURL=registry-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-ref.js","sourceRoot":"","sources":["../../src/lib/registry-ref.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,GAAuB,CAAC;IAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACd,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Find openapi.yaml / openapi.json in current repo
3
+ */
4
+ export declare function findSpecInDir(cwd?: string): string | null;
5
+ export declare function findSpecsInMonorepo(cwd: string): string[];
6
+ //# sourceMappingURL=spec-finder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-finder.d.ts","sourceRoot":"","sources":["../../src/lib/spec-finder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAMxE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBzD"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Find openapi.yaml / openapi.json in current repo
3
+ */
4
+ import { existsSync, readdirSync } from "fs";
5
+ import { join } from "path";
6
+ const DEFAULT_SPEC_NAMES = [
7
+ "openapi.yaml",
8
+ "openapi.yml",
9
+ "openapi.json",
10
+ "swagger.yaml",
11
+ "swagger.json",
12
+ "api-spec.yaml",
13
+ "api-spec.json",
14
+ ];
15
+ export function findSpecInDir(cwd = process.cwd()) {
16
+ for (const name of DEFAULT_SPEC_NAMES) {
17
+ const p = join(cwd, name);
18
+ if (existsSync(p))
19
+ return p;
20
+ }
21
+ return null;
22
+ }
23
+ export function findSpecsInMonorepo(cwd) {
24
+ const found = [];
25
+ // Simple scan: look for .spec0.yaml in subdirs, then resolve spec from each
26
+ // For v1, just scan one level
27
+ try {
28
+ const entries = readdirSync(cwd, { withFileTypes: true });
29
+ for (const e of entries) {
30
+ if (e.isDirectory() && !e.name.startsWith(".")) {
31
+ const subSpec = findSpecInDir(join(cwd, e.name));
32
+ if (subSpec)
33
+ found.push(subSpec);
34
+ }
35
+ }
36
+ }
37
+ catch {
38
+ // ignore
39
+ }
40
+ return found;
41
+ }
42
+ //# sourceMappingURL=spec-finder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-finder.js","sourceRoot":"","sources":["../../src/lib/spec-finder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,kBAAkB,GAAG;IACzB,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,eAAe;IACf,eAAe;CAChB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACvD,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,4EAA4E;IAC5E,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACjD,IAAI,OAAO;oBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Non-blocking update check against npm registry.
3
+ * Caches the result for 24 hours in ~/.spec0/config.json.
4
+ * Only runs in interactive (non-CI) terminals.
5
+ */
6
+ export declare function isNewer(candidate: string, current: string): boolean;
7
+ /**
8
+ * Prints an update notice if a newer version was cached from the last check.
9
+ * Then fires a background fetch to refresh the cache (fire-and-forget).
10
+ */
11
+ export declare function notifyUpdateIfAvailable(currentVersion: string): void;
12
+ //# sourceMappingURL=update-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQnE;AAMD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAgCpE"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Non-blocking update check against npm registry.
3
+ * Caches the result for 24 hours in ~/.spec0/config.json.
4
+ * Only runs in interactive (non-CI) terminals.
5
+ */
6
+ import chalk from "chalk";
7
+ import Conf from "conf";
8
+ const store = new Conf({
9
+ projectName: "spec0-update",
10
+ defaults: { lastCheck: 0, latestVersion: "" },
11
+ });
12
+ const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 1 day
13
+ export function isNewer(candidate, current) {
14
+ const c = candidate.split(".").map(Number);
15
+ const v = current.split(".").map(Number);
16
+ for (let i = 0; i < 3; i++) {
17
+ if ((c[i] ?? 0) > (v[i] ?? 0))
18
+ return true;
19
+ if ((c[i] ?? 0) < (v[i] ?? 0))
20
+ return false;
21
+ }
22
+ return false;
23
+ }
24
+ function shouldSkip() {
25
+ return !!(process.env.CI || process.env.GITHUB_ACTIONS || !process.stdout.isTTY);
26
+ }
27
+ /**
28
+ * Prints an update notice if a newer version was cached from the last check.
29
+ * Then fires a background fetch to refresh the cache (fire-and-forget).
30
+ */
31
+ export function notifyUpdateIfAvailable(currentVersion) {
32
+ if (shouldSkip())
33
+ return;
34
+ const cached = store.get("latestVersion");
35
+ if (cached && isNewer(cached, currentVersion)) {
36
+ process.stderr.write("\n" +
37
+ chalk.yellow(` Update available: `) +
38
+ chalk.bold(`${currentVersion} → ${cached}`) +
39
+ "\n" +
40
+ chalk.gray(` Run `) +
41
+ chalk.cyan(`npm install -g @spec0/cli`) +
42
+ chalk.gray(` to update\n`) +
43
+ "\n");
44
+ }
45
+ const now = Date.now();
46
+ const lastCheck = store.get("lastCheck", 0);
47
+ if (now - lastCheck < CHECK_INTERVAL_MS)
48
+ return;
49
+ // Fire-and-forget background fetch
50
+ store.set("lastCheck", now);
51
+ fetch("https://registry.npmjs.org/@spec0/cli/latest", {
52
+ signal: AbortSignal.timeout(3000),
53
+ })
54
+ .then((r) => r.json())
55
+ .then((data) => {
56
+ const latest = data.version;
57
+ if (latest)
58
+ store.set("latestVersion", latest);
59
+ })
60
+ .catch(() => { });
61
+ }
62
+ //# sourceMappingURL=update-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * CLI version from package.json next to dist/ (works when installed or from repo root).
3
+ */
4
+ export type VersionInfo = {
5
+ name: string;
6
+ version: string;
7
+ node: string;
8
+ /** Set via SPEC0_CLI_GIT_REF for local multi-branch builds */
9
+ gitRef?: string;
10
+ };
11
+ export declare function readPackageVersion(): {
12
+ name: string;
13
+ version: string;
14
+ };
15
+ export declare function getCliVersion(): string;
16
+ export declare function getVersionInfo(): VersionInfo;
17
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAQF,wBAAgB,kBAAkB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAOtE;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,cAAc,IAAI,WAAW,CAS5C"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * CLI version from package.json next to dist/ (works when installed or from repo root).
3
+ */
4
+ import { readFileSync } from "node:fs";
5
+ import { dirname, join } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ function packageJsonPath() {
8
+ const dir = dirname(fileURLToPath(import.meta.url));
9
+ // dist/lib/version.js -> ../../package.json
10
+ return join(dir, "..", "..", "package.json");
11
+ }
12
+ export function readPackageVersion() {
13
+ const raw = readFileSync(packageJsonPath(), "utf8");
14
+ const pkg = JSON.parse(raw);
15
+ return {
16
+ name: pkg.name ?? "@spec0/cli",
17
+ version: pkg.version ?? "0.0.0",
18
+ };
19
+ }
20
+ export function getCliVersion() {
21
+ return readPackageVersion().version;
22
+ }
23
+ export function getVersionInfo() {
24
+ const { name, version } = readPackageVersion();
25
+ const gitRef = process.env.SPEC0_CLI_GIT_REF?.trim() || undefined;
26
+ return {
27
+ name,
28
+ version,
29
+ node: process.version,
30
+ ...(gitRef ? { gitRef } : {}),
31
+ };
32
+ }
33
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAUzC,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,4CAA4C;IAC5C,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,EAAE,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwC,CAAC;IACnE,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,YAAY;QAC9B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,OAAO;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,kBAAkB,EAAE,CAAC,OAAO,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAClE,OAAO;QACL,IAAI;QACJ,OAAO;QACP,IAAI,EAAE,OAAO,CAAC,OAAO;QACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,28 @@
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
@@ -0,0 +1 @@
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"}