@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,136 @@
1
+ /**
2
+ * CI environment auto-detection + local git metadata
3
+ * Priority: CLI flags > PLATFORM_* env vars > .spec0.yaml > CI env > local git
4
+ */
5
+ import { execSync } from "child_process";
6
+ import { existsSync } from "fs";
7
+ import { resolve, dirname } from "path";
8
+ export function detectCI() {
9
+ if (process.env.GITHUB_ACTIONS === "true") {
10
+ const repo = process.env.GITHUB_REPOSITORY ?? "";
11
+ const owner = process.env.GITHUB_REPOSITORY_OWNER ?? process.env.PLATFORM_OWNER ?? "";
12
+ const name = repo.split("/").pop() ?? process.env.PLATFORM_NAME ?? "unknown";
13
+ return {
14
+ name,
15
+ namespace: repo || "unknown",
16
+ owner,
17
+ gitSha: process.env.GITHUB_SHA ?? "",
18
+ branch: process.env.GITHUB_REF_NAME ?? "",
19
+ githubRepo: repo ? `https://github.com/${repo}` : undefined,
20
+ };
21
+ }
22
+ if (process.env.GITLAB_CI === "true") {
23
+ const path = process.env.CI_PROJECT_PATH ?? "";
24
+ const ns = process.env.CI_PROJECT_NAMESPACE ?? process.env.PLATFORM_OWNER ?? "";
25
+ const name = process.env.CI_PROJECT_NAME ?? path.split("/").pop() ?? "unknown";
26
+ return {
27
+ name,
28
+ namespace: path || "unknown",
29
+ owner: ns,
30
+ gitSha: process.env.CI_COMMIT_SHA ?? "",
31
+ branch: process.env.CI_COMMIT_REF_NAME ?? "",
32
+ githubRepo: process.env.CI_PROJECT_URL,
33
+ };
34
+ }
35
+ if (process.env.BITBUCKET_BUILD_NUMBER) {
36
+ const workspace = process.env.BITBUCKET_WORKSPACE ?? "";
37
+ const slug = process.env.BITBUCKET_REPO_SLUG ?? "";
38
+ const ns = process.env.BITBUCKET_REPO_OWNER ?? process.env.PLATFORM_OWNER ?? "";
39
+ const name = slug || "unknown";
40
+ const namespace = workspace && slug ? `${workspace}/${slug}` : "unknown";
41
+ return {
42
+ name,
43
+ namespace,
44
+ owner: ns,
45
+ gitSha: process.env.BITBUCKET_COMMIT ?? "",
46
+ branch: process.env.BITBUCKET_BRANCH ?? "",
47
+ githubRepo: process.env.BITBUCKET_GIT_HTTP_ORIGIN,
48
+ };
49
+ }
50
+ return null;
51
+ }
52
+ /**
53
+ * Returns true if the given directory (or any parent) contains a .git directory.
54
+ */
55
+ function hasGitRepo(startDir) {
56
+ let dir = resolve(startDir);
57
+ // Walk up max 10 levels to avoid infinite loop
58
+ for (let i = 0; i < 10; i++) {
59
+ if (existsSync(resolve(dir, ".git")))
60
+ return true;
61
+ const parent = dirname(dir);
62
+ if (parent === dir)
63
+ break; // filesystem root
64
+ dir = parent;
65
+ }
66
+ return false;
67
+ }
68
+ /**
69
+ * Get the git commit SHA of the last commit that touched a specific file.
70
+ * Uses `git log -1 --format=%H -- <file>` so the SHA reflects when the spec
71
+ * actually changed, not just the HEAD commit.
72
+ *
73
+ * Returns null if not in a git repo or git is not available.
74
+ */
75
+ export function getGitShaForFile(specFilePath) {
76
+ const dir = dirname(resolve(specFilePath));
77
+ if (!hasGitRepo(dir))
78
+ return null;
79
+ try {
80
+ const sha = execSync(`git log -1 --format=%H -- "${specFilePath}"`, {
81
+ encoding: "utf-8",
82
+ stdio: ["pipe", "pipe", "pipe"],
83
+ timeout: 5000,
84
+ }).trim();
85
+ return sha || null;
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ }
91
+ /**
92
+ * Get the current HEAD commit SHA (repo-level, not file-specific).
93
+ * Falls back to getGitShaForFile when a spec path is available.
94
+ */
95
+ export function getGitHeadSha() {
96
+ if (!hasGitRepo(process.cwd()))
97
+ return null;
98
+ try {
99
+ const sha = execSync("git rev-parse HEAD", {
100
+ encoding: "utf-8",
101
+ stdio: ["pipe", "pipe", "pipe"],
102
+ timeout: 5000,
103
+ }).trim();
104
+ return sha || null;
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ }
110
+ /**
111
+ * Get the current branch name.
112
+ */
113
+ export function getGitBranch() {
114
+ if (!hasGitRepo(process.cwd()))
115
+ return null;
116
+ try {
117
+ const branch = execSync("git rev-parse --abbrev-ref HEAD", {
118
+ encoding: "utf-8",
119
+ stdio: ["pipe", "pipe", "pipe"],
120
+ timeout: 5000,
121
+ }).trim();
122
+ return branch && branch !== "HEAD" ? branch : null;
123
+ }
124
+ catch {
125
+ return null;
126
+ }
127
+ }
128
+ export function getGitMetadata() {
129
+ return {};
130
+ }
131
+ export function hasPlatformEnv() {
132
+ const token = process.env.SPEC0_TOKEN ?? process.env.PLATFORM_API_TOKEN;
133
+ const orgId = process.env.SPEC0_ORG_ID ?? process.env.PLATFORM_ORG_ID;
134
+ return !!(token && orgId);
135
+ }
136
+ //# sourceMappingURL=ci-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-detect.js","sourceRoot":"","sources":["../../src/lib/ci-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Resolve OpenAPI spec path from: subcommand --spec-file > global spec0 --spec-file > positional.
3
+ */
4
+ import type { Command } from "commander";
5
+ export declare function resolveCliSpecPathFromFlags(command: Command, cwd: string, subcommandSpecFile: string | undefined, positional: string | undefined): string | null;
6
+ //# sourceMappingURL=cli-spec-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-spec-path.d.ts","sourceRoot":"","sources":["../../src/lib/cli-spec-path.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,MAAM,GAAG,IAAI,CAiCf"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Resolve OpenAPI spec path from: subcommand --spec-file > global spec0 --spec-file > positional.
3
+ */
4
+ import chalk from "chalk";
5
+ import { resolve } from "path";
6
+ export function resolveCliSpecPathFromFlags(command, cwd, subcommandSpecFile, positional) {
7
+ const fromSub = subcommandSpecFile?.trim();
8
+ const root = command.parent?.opts();
9
+ const fromRoot = root?.specFile?.trim();
10
+ const fromPos = positional?.trim();
11
+ const ordered = [];
12
+ if (fromSub) {
13
+ ordered.push(fromSub);
14
+ }
15
+ if (fromRoot) {
16
+ ordered.push(fromRoot);
17
+ }
18
+ if (fromPos) {
19
+ ordered.push(fromPos);
20
+ }
21
+ if (ordered.length === 0) {
22
+ return null;
23
+ }
24
+ const resolvedAbs = ordered.map((p) => resolve(cwd, p));
25
+ const firstAbs = resolvedAbs[0];
26
+ for (let i = 1; i < resolvedAbs.length; i++) {
27
+ if (resolvedAbs[i] !== firstAbs) {
28
+ console.error(chalk.red("Conflicting spec paths: use only one of --spec-file, spec0 --spec-file, or the positional [spec-file], and ensure they refer to the same file."));
29
+ process.exit(1);
30
+ }
31
+ }
32
+ return ordered[0];
33
+ }
34
+ //# sourceMappingURL=cli-spec-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-spec-path.js","sourceRoot":"","sources":["../../src/lib/cli-spec-path.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,MAAM,UAAU,2BAA2B,CACzC,OAAgB,EAChB,GAAW,EACX,kBAAsC,EACtC,UAA8B;IAE9B,MAAM,OAAO,GAAG,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAuC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;IAEnC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,gJAAgJ,CACjJ,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Parse .github/CODEOWNERS for team ownership
3
+ */
4
+ /**
5
+ * Extract team from CODEOWNERS line like:
6
+ * /path/to/spec.yaml @myorg/backend-team
7
+ * Returns "backend-team" or null
8
+ */
9
+ export declare function parseCodeownersLine(line: string, specPath: string): string | null;
10
+ export declare function getTeamFromCodeowners(cwd: string, specPath: string): string | null;
11
+ //# sourceMappingURL=codeowners.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeowners.d.ts","sourceRoot":"","sources":["../../src/lib/codeowners.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcjF;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWlF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Parse .github/CODEOWNERS for team ownership
3
+ */
4
+ import { existsSync, readFileSync } from "fs";
5
+ import { join } from "path";
6
+ /**
7
+ * Extract team from CODEOWNERS line like:
8
+ * /path/to/spec.yaml @myorg/backend-team
9
+ * Returns "backend-team" or null
10
+ */
11
+ export function parseCodeownersLine(line, specPath) {
12
+ const trimmed = line.trim();
13
+ if (!trimmed || trimmed.startsWith("#"))
14
+ return null;
15
+ const parts = trimmed.split(/\s+/);
16
+ if (parts.length < 2)
17
+ return null;
18
+ const pattern = parts[0];
19
+ const owner = parts[1];
20
+ // Simple match: if pattern matches spec path
21
+ if (!specPath.includes(pattern.replace(/^\//, "")))
22
+ return null;
23
+ // @org/team-name -> team-name
24
+ if (owner.startsWith("@") && owner.includes("/")) {
25
+ return owner.split("/").pop() ?? null;
26
+ }
27
+ return owner.startsWith("@") ? owner.slice(1) : owner;
28
+ }
29
+ export function getTeamFromCodeowners(cwd, specPath) {
30
+ const codeownersPath = join(cwd, ".github", "CODEOWNERS");
31
+ if (!existsSync(codeownersPath))
32
+ return null;
33
+ const content = readFileSync(codeownersPath, "utf-8");
34
+ const lines = content.split("\n");
35
+ let lastMatch = null;
36
+ for (const line of lines) {
37
+ const team = parseCodeownersLine(line, specPath);
38
+ if (team)
39
+ lastMatch = team;
40
+ }
41
+ return lastMatch;
42
+ }
43
+ //# sourceMappingURL=codeowners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeowners.js","sourceRoot":"","sources":["../../src/lib/codeowners.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,QAAgB;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,6CAA6C;IAC7C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChE,8BAA8B;IAC9B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,QAAgB;IACjE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,IAAI;YAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ~/.spec0/config.json management
3
+ * XDG-compliant config via conf package
4
+ */
5
+ export interface OrgConfig {
6
+ apiKey: string;
7
+ name: string;
8
+ apiUrl: string;
9
+ keyName?: string;
10
+ }
11
+ export interface Spec0Config {
12
+ version: number;
13
+ defaultOrg?: string;
14
+ telemetry?: boolean;
15
+ orgs: Record<string, OrgConfig>;
16
+ }
17
+ export declare function getConfig(): Spec0Config;
18
+ export declare function getDefaultOrgId(): string | null;
19
+ export declare function getOrgConfig(orgId: string): OrgConfig | undefined;
20
+ export declare function setOrgConfig(orgId: string, config: OrgConfig): void;
21
+ export declare function setDefaultOrg(orgId: string): void;
22
+ export declare function clearConfig(): void;
23
+ export declare function getConfigPath(): string;
24
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * ~/.spec0/config.json management
3
+ * XDG-compliant config via conf package
4
+ */
5
+ import Conf from "conf";
6
+ // Schema kept for documentation; not currently passed to Conf (defaults below
7
+ // are sufficient). Renamed `_schema` to satisfy lint while retaining intent.
8
+ const _schema = {
9
+ version: { type: "number", default: 1 },
10
+ defaultOrg: { type: ["string", "null"], default: null },
11
+ telemetry: { type: "boolean", default: true },
12
+ orgs: { type: "object", default: {} },
13
+ };
14
+ const store = new Conf({
15
+ projectName: "spec0",
16
+ defaults: {
17
+ version: 1,
18
+ defaultOrg: undefined,
19
+ telemetry: true,
20
+ orgs: {},
21
+ },
22
+ });
23
+ export function getConfig() {
24
+ return {
25
+ version: store.get("version", 1),
26
+ defaultOrg: store.get("defaultOrg"),
27
+ telemetry: store.get("telemetry", true),
28
+ orgs: store.get("orgs", {}),
29
+ };
30
+ }
31
+ export function getDefaultOrgId() {
32
+ return store.get("defaultOrg") ?? null;
33
+ }
34
+ export function getOrgConfig(orgId) {
35
+ return store.get(`orgs.${orgId}`);
36
+ }
37
+ export function setOrgConfig(orgId, config) {
38
+ store.set(`orgs.${orgId}`, config);
39
+ }
40
+ export function setDefaultOrg(orgId) {
41
+ store.set("defaultOrg", orgId);
42
+ }
43
+ export function clearConfig() {
44
+ store.clear();
45
+ }
46
+ export function getConfigPath() {
47
+ return store.path;
48
+ }
49
+ //# sourceMappingURL=config.js.map
@@ -0,0 +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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Deprecation warnings. Always print to stderr with a clear removal-version
3
+ * header so users have time to migrate.
4
+ *
5
+ * Set SPEC0_SUPPRESS_DEPRECATION=1 to silence in CI logs once the migration
6
+ * is queued.
7
+ */
8
+ export interface DeprecationNotice {
9
+ /** What the user did, e.g. "the --json flag" or "the SPEC0_LEGACY env var". */
10
+ what: string;
11
+ /** Version when this stops working. e.g. "v1.0.0". */
12
+ removeIn: string;
13
+ /** What the user should do instead. e.g. "use --output=json". */
14
+ alternative: string;
15
+ }
16
+ export declare function warnDeprecated(notice: DeprecationNotice): void;
17
+ //# sourceMappingURL=deprecation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deprecation.d.ts","sourceRoot":"","sources":["../../src/lib/deprecation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAW9D"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Deprecation warnings. Always print to stderr with a clear removal-version
3
+ * header so users have time to migrate.
4
+ *
5
+ * Set SPEC0_SUPPRESS_DEPRECATION=1 to silence in CI logs once the migration
6
+ * is queued.
7
+ */
8
+ import chalk from "chalk";
9
+ const seen = new Set();
10
+ export function warnDeprecated(notice) {
11
+ if (process.env.SPEC0_SUPPRESS_DEPRECATION)
12
+ return;
13
+ const key = `${notice.what}|${notice.removeIn}`;
14
+ if (seen.has(key))
15
+ return; // print once per process
16
+ seen.add(key);
17
+ const useColour = Boolean(process.stderr.isTTY);
18
+ const tag = useColour ? chalk.yellow("⚠ deprecated:") : "DEPRECATED:";
19
+ const msg = `${tag} ${notice.what} will be removed in ${notice.removeIn}. Use ${notice.alternative}.`;
20
+ process.stderr.write(msg + "\n");
21
+ }
22
+ //# sourceMappingURL=deprecation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deprecation.js","sourceRoot":"","sources":["../../src/lib/deprecation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;AAE/B,MAAM,UAAU,cAAc,CAAC,MAAyB;IACtD,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B;QAAE,OAAO;IAEnD,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,yBAAyB;IACpD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEd,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACtE,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,uBAAuB,MAAM,CAAC,QAAQ,SAAS,MAAM,CAAC,WAAW,GAAG,CAAC;IACtG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Diagnostic helpers — used by `spec0 doctor` and (one day) by error
3
+ * messages that want to attach a "here's what's set right now" pointer.
4
+ *
5
+ * The goal: make every "auth missing" or "wrong URL" failure into something
6
+ * the user can act on in 30 seconds, by surfacing where each setting came
7
+ * from (env var name, config file path, or default).
8
+ */
9
+ export type SettingSource = {
10
+ kind: "env";
11
+ var: string;
12
+ } | {
13
+ kind: "config";
14
+ path: string;
15
+ } | {
16
+ kind: "default";
17
+ } | {
18
+ kind: "missing";
19
+ };
20
+ export interface SettingReport {
21
+ name: string;
22
+ /** Display value; secrets are redacted. */
23
+ value: string;
24
+ source: SettingSource;
25
+ }
26
+ export interface DoctorReport {
27
+ settings: SettingReport[];
28
+ /** Aggregate status — "ok" only when every required setting is non-missing. */
29
+ ok: boolean;
30
+ /** Path to the local config file (whether or not it exists). */
31
+ configPath: string;
32
+ }
33
+ /**
34
+ * Build a structured diagnostic of the runtime config the CLI sees right now.
35
+ * Pure — no network calls. Good for inclusion in `--verbose` output too.
36
+ */
37
+ export declare function buildDoctorReport(): DoctorReport;
38
+ /** Stringify a setting source for human display. */
39
+ export declare function describeSource(source: SettingSource): string;
40
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/lib/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,+EAA+E;IAC/E,EAAE,EAAE,OAAO,CAAC;IACZ,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,YAAY,CA8EhD;AAQD,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAW5D"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Diagnostic helpers — used by `spec0 doctor` and (one day) by error
3
+ * messages that want to attach a "here's what's set right now" pointer.
4
+ *
5
+ * The goal: make every "auth missing" or "wrong URL" failure into something
6
+ * the user can act on in 30 seconds, by surfacing where each setting came
7
+ * from (env var name, config file path, or default).
8
+ */
9
+ import { getConfigPath, getDefaultOrgId, getOrgConfig } from "./config.js";
10
+ import { DEFAULT_PLATFORM_API_URL, DEFAULT_PLATFORM_APP_URL, resolvedPlatformApiUrl, resolvedPlatformAppUrl, } from "./platform-defaults.js";
11
+ /**
12
+ * Build a structured diagnostic of the runtime config the CLI sees right now.
13
+ * Pure — no network calls. Good for inclusion in `--verbose` output too.
14
+ */
15
+ export function buildDoctorReport() {
16
+ const settings = [];
17
+ // Token: env wins; otherwise from default org's config; otherwise missing.
18
+ const envToken = process.env.SPEC0_TOKEN ?? process.env.PLATFORM_API_TOKEN;
19
+ const defaultOrgId = process.env.SPEC0_ORG_ID ?? process.env.PLATFORM_ORG_ID ?? getDefaultOrgId();
20
+ const cfg = defaultOrgId ? getOrgConfig(defaultOrgId) : undefined;
21
+ settings.push({
22
+ name: "token",
23
+ value: redactToken(envToken ?? cfg?.apiKey),
24
+ source: envToken
25
+ ? { kind: "env", var: process.env.SPEC0_TOKEN ? "SPEC0_TOKEN" : "PLATFORM_API_TOKEN" }
26
+ : cfg?.apiKey
27
+ ? { kind: "config", path: getConfigPath() }
28
+ : { kind: "missing" },
29
+ });
30
+ settings.push({
31
+ name: "orgId",
32
+ value: defaultOrgId ?? "(missing)",
33
+ source: process.env.SPEC0_ORG_ID
34
+ ? { kind: "env", var: "SPEC0_ORG_ID" }
35
+ : process.env.PLATFORM_ORG_ID
36
+ ? { kind: "env", var: "PLATFORM_ORG_ID" }
37
+ : defaultOrgId
38
+ ? { kind: "config", path: getConfigPath() }
39
+ : { kind: "missing" },
40
+ });
41
+ // API URL: env override wins; otherwise config; otherwise default.
42
+ const envApiUrl = process.env.SPEC0_API_URL ?? process.env.PLATFORM_API_URL;
43
+ const apiUrl = resolvedPlatformApiUrl();
44
+ settings.push({
45
+ name: "apiUrl",
46
+ value: apiUrl,
47
+ source: envApiUrl
48
+ ? { kind: "env", var: process.env.SPEC0_API_URL ? "SPEC0_API_URL" : "PLATFORM_API_URL" }
49
+ : cfg?.apiUrl
50
+ ? { kind: "config", path: getConfigPath() }
51
+ : apiUrl === DEFAULT_PLATFORM_API_URL
52
+ ? { kind: "default" }
53
+ : { kind: "config", path: getConfigPath() },
54
+ });
55
+ // App URL — used for browser auth + dashboard links only.
56
+ const envAppUrl = process.env.SPEC0_APP_URL ?? process.env.PLATFORM_APP_URL;
57
+ const appUrl = resolvedPlatformAppUrl();
58
+ settings.push({
59
+ name: "appUrl",
60
+ value: appUrl,
61
+ source: envAppUrl
62
+ ? { kind: "env", var: process.env.SPEC0_APP_URL ? "SPEC0_APP_URL" : "PLATFORM_APP_URL" }
63
+ : appUrl === DEFAULT_PLATFORM_APP_URL
64
+ ? { kind: "default" }
65
+ : { kind: "config", path: getConfigPath() },
66
+ });
67
+ // Mode: "agent" when SPEC0_MODE=agent, "human" otherwise. Surfaced so agents
68
+ // can confirm the mode they think they're in is actually active.
69
+ const mode = (process.env.SPEC0_MODE ?? "").toLowerCase() === "agent" ? "agent" : "human";
70
+ settings.push({
71
+ name: "mode",
72
+ value: mode,
73
+ source: process.env.SPEC0_MODE ? { kind: "env", var: "SPEC0_MODE" } : { kind: "default" },
74
+ });
75
+ // OK when token + orgId are present — those are the only two strictly required.
76
+ const ok = settings.every((s) => {
77
+ if (s.name === "token" || s.name === "orgId")
78
+ return s.source.kind !== "missing";
79
+ return true;
80
+ });
81
+ return {
82
+ settings,
83
+ ok,
84
+ configPath: getConfigPath(),
85
+ };
86
+ }
87
+ function redactToken(value) {
88
+ if (!value)
89
+ return "(missing)";
90
+ if (value.length <= 8)
91
+ return "***";
92
+ return `${value.slice(0, 4)}…${value.slice(-4)}`;
93
+ }
94
+ /** Stringify a setting source for human display. */
95
+ export function describeSource(source) {
96
+ switch (source.kind) {
97
+ case "env":
98
+ return `env: ${source.var}`;
99
+ case "config":
100
+ return `config: ${source.path}`;
101
+ case "default":
102
+ return "default";
103
+ case "missing":
104
+ return "(not set)";
105
+ }
106
+ }
107
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/lib/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Stable exit-code contract. These values are part of the CLI's public API —
3
+ * once shipped, they MUST NOT be reused or repurposed. CI pipelines depend on
4
+ * them.
5
+ *
6
+ * See README "Exit codes" section for the user-facing reference.
7
+ */
8
+ export declare const ExitCode: {
9
+ /** Operation succeeded. */
10
+ readonly SUCCESS: 0;
11
+ /** Generic / unclassified failure. Avoid; pick a specific code instead. */
12
+ readonly GENERIC: 1;
13
+ /** Bad invocation: missing required arg, conflicting flags, etc. */
14
+ readonly USAGE: 2;
15
+ /** No credentials available, or token expired. Hint at SPEC0_TOKEN. */
16
+ readonly AUTH_MISSING: 3;
17
+ /** Authenticated but lacking required permission (HTTP 403). */
18
+ readonly PERMISSION_DENIED: 4;
19
+ /** Resource (API, mock, environment, …) does not exist (HTTP 404). */
20
+ readonly NOT_FOUND: 5;
21
+ /** Conflict on create/update — e.g. name already taken (HTTP 409). */
22
+ readonly CONFLICT: 6;
23
+ /** Validation failure — e.g. spec lint score below threshold (HTTP 422 or local). */
24
+ readonly VALIDATION: 7;
25
+ /** Rate limit hit (HTTP 429). */
26
+ readonly RATE_LIMITED: 8;
27
+ /** Server-side failure the user can't act on directly (HTTP 5xx). */
28
+ readonly SERVER_ERROR: 9;
29
+ /** Network unreachable, timeout, DNS failure. */
30
+ readonly NETWORK_ERROR: 10;
31
+ };
32
+ export type ExitCodeName = keyof typeof ExitCode;
33
+ export type ExitCodeValue = (typeof ExitCode)[ExitCodeName];
34
+ /**
35
+ * Classifies an HTTP-style error into the corresponding exit code. Anything
36
+ * unrecognised falls back to `GENERIC` so callers can chain this safely.
37
+ */
38
+ export declare function exitCodeForHttpStatus(status: number | undefined): ExitCodeValue;
39
+ /**
40
+ * Single exit point. Logs `message` to stderr (if provided) before exiting.
41
+ * Commands MUST go through this rather than calling `process.exit` directly so
42
+ * that future logging / telemetry can hook one place.
43
+ */
44
+ export declare function exit(code: ExitCodeValue, message?: string): never;
45
+ /**
46
+ * Reverse-lookup: turn a numeric exit code into its stable string name
47
+ * ("AUTH_MISSING", "NOT_FOUND", …). Used when emitting structured errors
48
+ * so agents can branch on the symbolic code rather than the number.
49
+ */
50
+ export declare function exitCodeName(code: ExitCodeValue): ExitCodeName;
51
+ //# sourceMappingURL=exit-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/lib/exit-codes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,QAAQ;IACnB,2BAA2B;;IAE3B,2EAA2E;;IAE3E,oEAAoE;;IAEpE,uEAAuE;;IAEvE,gEAAgE;;IAEhE,sEAAsE;;IAEtE,sEAAsE;;IAEtE,qFAAqF;;IAErF,iCAAiC;;IAEjC,qEAAqE;;IAErE,iDAAiD;;CAEzC,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,QAAQ,CAAC;AACjD,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAU/E;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAKjE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CAK9D"}