@nimbase/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/run.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { execute } from "@oclif/core";
3
+
4
+ await execute({ dir: import.meta.url });
@@ -0,0 +1,293 @@
1
+ // src/credentials.ts
2
+ import { homedir } from "os";
3
+ import { join } from "path";
4
+ import { z as z2 } from "zod/v4";
5
+
6
+ // src/env.ts
7
+ import { createEnv } from "@t3-oss/env-core";
8
+ import { z } from "zod/v4";
9
+ var env = createEnv({
10
+ server: {
11
+ HOME: z.string().optional(),
12
+ NIMBASE_API_URL: z.url().default("https://api.nimbase.ai"),
13
+ XDG_CONFIG_HOME: z.string().optional()
14
+ },
15
+ runtimeEnv: process.env,
16
+ emptyStringAsUndefined: true
17
+ });
18
+
19
+ // src/private-json-file.ts
20
+ import { randomUUID } from "crypto";
21
+ import {
22
+ chmod,
23
+ mkdir,
24
+ readFile,
25
+ rename,
26
+ rm,
27
+ writeFile
28
+ } from "fs/promises";
29
+ import { dirname } from "path";
30
+ async function readValidatedJsonFile(path, schema, description) {
31
+ let contents;
32
+ try {
33
+ contents = await readFile(path, "utf8");
34
+ } catch (error) {
35
+ if (isMissingFile(error)) return null;
36
+ throw new Error(`Could not read ${description} at ${path}`, {
37
+ cause: error
38
+ });
39
+ }
40
+ try {
41
+ return schema.parse(JSON.parse(contents));
42
+ } catch {
43
+ await removePrivateFile(path);
44
+ return null;
45
+ }
46
+ }
47
+ async function writePrivateJsonFile(path, value) {
48
+ const directory = dirname(path);
49
+ const temporaryPath = `${path}.${randomUUID()}.tmp`;
50
+ await mkdir(directory, { recursive: true, mode: 448 });
51
+ await chmod(directory, 448);
52
+ try {
53
+ await writeFile(temporaryPath, `${JSON.stringify(value)}
54
+ `, {
55
+ flag: "wx",
56
+ mode: 384
57
+ });
58
+ await chmod(temporaryPath, 384);
59
+ await rename(temporaryPath, path);
60
+ } catch (error) {
61
+ await rm(temporaryPath, { force: true }).catch(() => void 0);
62
+ throw error;
63
+ }
64
+ }
65
+ async function removePrivateFile(path) {
66
+ await rm(path, { force: true });
67
+ }
68
+ function isMissingFile(error) {
69
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
70
+ }
71
+
72
+ // src/credentials.ts
73
+ var credentialsSchema = z2.object({ token: z2.string().min(1) });
74
+ function credentialsPath(environment = env) {
75
+ const configRoot = environment.XDG_CONFIG_HOME ?? join(environment.HOME ?? homedir(), ".config");
76
+ return join(configRoot, "nimbase", "credentials.json");
77
+ }
78
+ async function readToken(path = credentialsPath()) {
79
+ const credentials = await readValidatedJsonFile(
80
+ path,
81
+ credentialsSchema,
82
+ "CLI credentials"
83
+ );
84
+ return credentials?.token ?? null;
85
+ }
86
+ async function writeToken(token, path = credentialsPath()) {
87
+ await writePrivateJsonFile(path, credentialsSchema.parse({ token }));
88
+ }
89
+ async function clearToken(path = credentialsPath()) {
90
+ await removePrivateFile(path);
91
+ }
92
+
93
+ // src/base-command.ts
94
+ import { Command } from "@oclif/core";
95
+
96
+ // ../../packages/sdk/src/contracts.ts
97
+ import { z as z3 } from "zod/v4";
98
+
99
+ // ../../packages/knowledge/src/model.ts
100
+ var toKnowledgeItemId = (value) => value;
101
+
102
+ // ../../packages/sources/src/model.ts
103
+ var toSourceId = (value) => value;
104
+
105
+ // ../../packages/tenancy/src/index.ts
106
+ var toWorkspaceId = (value) => value;
107
+
108
+ // ../../packages/sdk/src/contracts.ts
109
+ var userSchema = z3.object({
110
+ id: z3.string(),
111
+ name: z3.string(),
112
+ email: z3.string()
113
+ });
114
+ var sessionSchema = z3.object({ user: userSchema });
115
+ var workspaceSchema = z3.object({
116
+ id: z3.uuid(),
117
+ name: z3.string(),
118
+ slug: z3.string()
119
+ }).transform((workspace) => ({
120
+ ...workspace,
121
+ id: toWorkspaceId(workspace.id)
122
+ }));
123
+ var workspaceListSchema = z3.object({
124
+ workspaces: z3.array(workspaceSchema)
125
+ });
126
+ var workspaceCreatedSchema = z3.object({ workspace: workspaceSchema });
127
+ var retrievalResponseSchema = z3.object({
128
+ kind: z3.literal("success"),
129
+ evidence: z3.array(
130
+ z3.object({
131
+ excerpt: z3.string(),
132
+ provenance: z3.object({
133
+ workspaceId: z3.uuid(),
134
+ knowledgeItemId: z3.uuid(),
135
+ sourceId: z3.uuid(),
136
+ sourceExternalId: z3.string(),
137
+ sourceRevisionKey: z3.string(),
138
+ observedAt: z3.iso.datetime()
139
+ }).transform((provenance) => ({
140
+ ...provenance,
141
+ workspaceId: toWorkspaceId(provenance.workspaceId),
142
+ knowledgeItemId: toKnowledgeItemId(provenance.knowledgeItemId),
143
+ sourceId: toSourceId(provenance.sourceId),
144
+ observedAt: new Date(provenance.observedAt)
145
+ }))
146
+ })
147
+ ),
148
+ retrievedAt: z3.iso.datetime().transform((value) => new Date(value))
149
+ });
150
+
151
+ // ../../packages/sdk/src/client.ts
152
+ var ApiError = class extends Error {
153
+ constructor(message, status) {
154
+ super(message);
155
+ this.status = status;
156
+ this.name = "ApiError";
157
+ }
158
+ status;
159
+ };
160
+ var NimbaseApi = class {
161
+ constructor(baseUrl, request = fetch, createRequestId = () => crypto.randomUUID()) {
162
+ this.baseUrl = baseUrl;
163
+ this.request = request;
164
+ this.createRequestId = createRequestId;
165
+ this.origin = new URL(baseUrl).origin;
166
+ }
167
+ baseUrl;
168
+ request;
169
+ createRequestId;
170
+ origin;
171
+ async signIn(email, password) {
172
+ const response = await this.request(this.url("/api/auth/sign-in/email"), {
173
+ method: "POST",
174
+ headers: {
175
+ "Content-Type": "application/json",
176
+ Origin: this.origin
177
+ },
178
+ body: JSON.stringify({ email, password })
179
+ });
180
+ if (!response.ok) throw await apiError(response, "Sign-in failed.");
181
+ const token = response.headers.get("set-auth-token");
182
+ if (!token) {
183
+ throw new Error("The server did not issue a CLI session token.");
184
+ }
185
+ return token;
186
+ }
187
+ async getUser(token) {
188
+ const response = await this.request(this.url("/api/auth/get-session"), {
189
+ headers: authorization(token)
190
+ });
191
+ if (!response.ok) throw await apiError(response, "Session expired.");
192
+ const session = sessionSchema.safeParse(await response.json());
193
+ if (!session.success) throw new ApiError("Session expired.", 401);
194
+ return session.data.user;
195
+ }
196
+ async signOut(token) {
197
+ const response = await this.request(this.url("/api/auth/sign-out"), {
198
+ method: "POST",
199
+ headers: {
200
+ ...authorization(token),
201
+ "Content-Type": "application/json",
202
+ Origin: this.origin
203
+ },
204
+ body: "{}"
205
+ });
206
+ if (!response.ok) throw await apiError(response, "Sign-out failed.");
207
+ }
208
+ async listWorkspaces(token) {
209
+ const response = await this.request(this.url("/api/workspaces"), {
210
+ headers: authorization(token)
211
+ });
212
+ if (!response.ok) {
213
+ throw await apiError(response, "Could not load workspaces.");
214
+ }
215
+ return workspaceListSchema.parse(await response.json()).workspaces;
216
+ }
217
+ async createWorkspace(token, name) {
218
+ const response = await this.request(this.url("/api/workspaces"), {
219
+ method: "POST",
220
+ headers: {
221
+ ...authorization(token),
222
+ "Content-Type": "application/json"
223
+ },
224
+ body: JSON.stringify({ requestId: this.createRequestId(), name })
225
+ });
226
+ if (!response.ok) {
227
+ throw await apiError(response, "Could not create the workspace.");
228
+ }
229
+ return workspaceCreatedSchema.parse(await response.json()).workspace;
230
+ }
231
+ async retrieve(token, workspaceId, query, limit = 10) {
232
+ const response = await this.request(
233
+ this.url(`/api/workspaces/${encodeURIComponent(workspaceId)}/retrieval`),
234
+ {
235
+ method: "POST",
236
+ headers: {
237
+ ...authorization(token),
238
+ "Content-Type": "application/json",
239
+ Origin: this.origin
240
+ },
241
+ body: JSON.stringify({ query, limit })
242
+ }
243
+ );
244
+ if (!response.ok) {
245
+ throw await apiError(response, "Could not retrieve workspace memory.");
246
+ }
247
+ return retrievalResponseSchema.parse(await response.json());
248
+ }
249
+ url(path) {
250
+ return new URL(path, this.baseUrl);
251
+ }
252
+ };
253
+ function authorization(token) {
254
+ return { Authorization: `Bearer ${token}` };
255
+ }
256
+ async function apiError(response, fallback) {
257
+ const value = await response.json().catch(() => null);
258
+ if (typeof value === "object" && value !== null && "message" in value && typeof value.message === "string") {
259
+ return new ApiError(value.message, response.status);
260
+ }
261
+ return new ApiError(fallback, response.status);
262
+ }
263
+
264
+ // src/base-command.ts
265
+ var NimbaseCommand = class extends Command {
266
+ api = new NimbaseApi(env.NIMBASE_API_URL);
267
+ async requireToken() {
268
+ const token = await readToken();
269
+ if (!token) this.error("You are not signed in. Run `nimbase auth login`.");
270
+ return token;
271
+ }
272
+ async handleError(error) {
273
+ if (error instanceof ApiError && error.status === 401) {
274
+ await clearToken();
275
+ this.error("Your session has expired. Run `nimbase auth login` again.");
276
+ }
277
+ this.error(
278
+ error instanceof Error ? error.message : "Something went wrong."
279
+ );
280
+ }
281
+ };
282
+
283
+ export {
284
+ readValidatedJsonFile,
285
+ writePrivateJsonFile,
286
+ removePrivateFile,
287
+ credentialsPath,
288
+ readToken,
289
+ writeToken,
290
+ clearToken,
291
+ NimbaseCommand
292
+ };
293
+ //# sourceMappingURL=chunk-YQIGSGD4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/credentials.ts","../src/env.ts","../src/private-json-file.ts","../src/base-command.ts","../../../packages/sdk/src/contracts.ts","../../../packages/knowledge/src/model.ts","../../../packages/sources/src/model.ts","../../../packages/tenancy/src/index.ts","../../../packages/sdk/src/client.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { z } from \"zod/v4\";\n\nimport { env } from \"./env.js\";\nimport {\n readValidatedJsonFile,\n removePrivateFile,\n writePrivateJsonFile,\n} from \"./private-json-file.js\";\n\nconst credentialsSchema = z.object({ token: z.string().min(1) });\n\ninterface ConfigEnvironment {\n HOME?: string;\n XDG_CONFIG_HOME?: string;\n}\n\nexport function credentialsPath(environment: ConfigEnvironment = env) {\n const configRoot =\n environment.XDG_CONFIG_HOME ??\n join(environment.HOME ?? homedir(), \".config\");\n return join(configRoot, \"nimbase\", \"credentials.json\");\n}\n\nexport async function readToken(\n path = credentialsPath(),\n): Promise<string | null> {\n const credentials = await readValidatedJsonFile(\n path,\n credentialsSchema,\n \"CLI credentials\",\n );\n return credentials?.token ?? null;\n}\n\nexport async function writeToken(\n token: string,\n path = credentialsPath(),\n): Promise<void> {\n await writePrivateJsonFile(path, credentialsSchema.parse({ token }));\n}\n\nexport async function clearToken(path = credentialsPath()): Promise<void> {\n await removePrivateFile(path);\n}\n","import { createEnv } from \"@t3-oss/env-core\";\nimport { z } from \"zod/v4\";\n\nexport const env = createEnv({\n server: {\n HOME: z.string().optional(),\n NIMBASE_API_URL: z.url().default(\"https://api.nimbase.ai\"),\n XDG_CONFIG_HOME: z.string().optional(),\n },\n runtimeEnv: process.env,\n emptyStringAsUndefined: true,\n});\n","import { randomUUID } from \"node:crypto\";\nimport {\n chmod,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { ZodType } from \"zod/v4\";\n\nexport async function readValidatedJsonFile<T>(\n path: string,\n schema: ZodType<T>,\n description: string,\n): Promise<T | null> {\n let contents: string;\n try {\n contents = await readFile(path, \"utf8\");\n } catch (error) {\n if (isMissingFile(error)) return null;\n throw new Error(`Could not read ${description} at ${path}`, {\n cause: error,\n });\n }\n\n try {\n return schema.parse(JSON.parse(contents));\n } catch {\n await removePrivateFile(path);\n return null;\n }\n}\n\nexport async function writePrivateJsonFile(\n path: string,\n value: unknown,\n): Promise<void> {\n const directory = dirname(path);\n const temporaryPath = `${path}.${randomUUID()}.tmp`;\n await mkdir(directory, { recursive: true, mode: 0o700 });\n await chmod(directory, 0o700);\n try {\n await writeFile(temporaryPath, `${JSON.stringify(value)}\\n`, {\n flag: \"wx\",\n mode: 0o600,\n });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, path);\n } catch (error) {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nexport async function removePrivateFile(path: string): Promise<void> {\n await rm(path, { force: true });\n}\n\nfunction isMissingFile(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n","import { Command } from \"@oclif/core\";\n\nimport { ApiError, NimbaseApi } from \"@nimbase/sdk\";\n\nimport { clearToken, readToken } from \"./credentials.js\";\nimport { env } from \"./env.js\";\n\nexport abstract class NimbaseCommand extends Command {\n protected readonly api = new NimbaseApi(env.NIMBASE_API_URL);\n\n protected async requireToken(): Promise<string> {\n const token = await readToken();\n if (!token) this.error(\"You are not signed in. Run `nimbase auth login`.\");\n return token;\n }\n\n protected async handleError(error: unknown): Promise<never> {\n if (error instanceof ApiError && error.status === 401) {\n await clearToken();\n this.error(\"Your session has expired. Run `nimbase auth login` again.\");\n }\n this.error(\n error instanceof Error ? error.message : \"Something went wrong.\",\n );\n }\n}\n","import { z } from \"zod/v4\";\n\nimport { toKnowledgeItemId } from \"@nimbase/knowledge\";\nimport { toSourceId } from \"@nimbase/sources\";\nimport { toWorkspaceId } from \"@nimbase/tenancy\";\n\nexport const userSchema = z.object({\n id: z.string(),\n name: z.string(),\n email: z.string(),\n});\n\nexport const sessionSchema = z.object({ user: userSchema });\n\nexport const workspaceSchema = z\n .object({\n id: z.uuid(),\n name: z.string(),\n slug: z.string(),\n })\n .transform((workspace) => ({\n ...workspace,\n id: toWorkspaceId(workspace.id),\n }));\n\nexport const workspaceListSchema = z.object({\n workspaces: z.array(workspaceSchema),\n});\n\nexport const workspaceCreatedSchema = z.object({ workspace: workspaceSchema });\n\nexport const retrievalResponseSchema = z.object({\n kind: z.literal(\"success\"),\n evidence: z.array(\n z.object({\n excerpt: z.string(),\n provenance: z\n .object({\n workspaceId: z.uuid(),\n knowledgeItemId: z.uuid(),\n sourceId: z.uuid(),\n sourceExternalId: z.string(),\n sourceRevisionKey: z.string(),\n observedAt: z.iso.datetime(),\n })\n .transform((provenance) => ({\n ...provenance,\n workspaceId: toWorkspaceId(provenance.workspaceId),\n knowledgeItemId: toKnowledgeItemId(provenance.knowledgeItemId),\n sourceId: toSourceId(provenance.sourceId),\n observedAt: new Date(provenance.observedAt),\n })),\n }),\n ),\n retrievedAt: z.iso.datetime().transform((value) => new Date(value)),\n});\n\nexport type User = z.infer<typeof userSchema>;\nexport type Workspace = z.infer<typeof workspaceSchema>;\nexport type RetrievalResult = z.infer<typeof retrievalResponseSchema>;\n","import type { SourceId } from \"@nimbase/sources\";\nimport type { WorkspaceId } from \"@nimbase/tenancy\";\n\ndeclare const knowledgeItemIdBrand: unique symbol;\n\nexport type KnowledgeItemId = string & {\n readonly [knowledgeItemIdBrand]: \"KnowledgeItemId\";\n};\n\nexport const toKnowledgeItemId = (value: string) => value as KnowledgeItemId;\n\nexport type JsonValue =\n | boolean\n | number\n | string\n | null\n | readonly JsonValue[]\n | { readonly [key: string]: JsonValue };\n\nexport type KnowledgeMetadata = Readonly<Record<string, JsonValue>>;\n\nexport interface KnowledgeContent {\n mediaType: string;\n text: string;\n}\n\nexport interface KnowledgeProvenance {\n sourceId: SourceId;\n externalId: string;\n revisionKey: string;\n observedAt: Date;\n}\n\nexport interface KnowledgeItem {\n id: KnowledgeItemId;\n workspaceId: WorkspaceId;\n type: string;\n content: KnowledgeContent;\n provenance: KnowledgeProvenance;\n metadata: KnowledgeMetadata;\n createdAt: Date;\n updatedAt: Date;\n}\n","import type { ActorId } from \"@nimbase/access\";\nimport type { WorkspaceId } from \"@nimbase/tenancy\";\n\nimport type { ConnectorConnectionId } from \"./connector\";\n\ndeclare const sourceIdBrand: unique symbol;\n\nexport type SourceId = string & {\n readonly [sourceIdBrand]: \"SourceId\";\n};\n\nexport const toSourceId = (value: string) => value as SourceId;\n\nexport interface Source {\n id: SourceId;\n workspaceId: WorkspaceId;\n connectionId?: ConnectorConnectionId;\n createdByActorId: ActorId;\n provider: string;\n externalId: string;\n name: string;\n createdAt: Date;\n updatedAt: Date;\n}\n","declare const workspaceIdBrand: unique symbol;\n\nexport type WorkspaceId = string & {\n readonly [workspaceIdBrand]: \"WorkspaceId\";\n};\n\nexport const toWorkspaceId = (value: string) => value as WorkspaceId;\n\nexport interface Workspace {\n id: WorkspaceId;\n slug: string;\n name: string;\n}\n","import type { RetrievalResult, User, Workspace } from \"./contracts\";\nimport {\n retrievalResponseSchema,\n sessionSchema,\n workspaceCreatedSchema,\n workspaceListSchema,\n} from \"./contracts\";\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport class NimbaseApi {\n private readonly origin: string;\n\n constructor(\n private readonly baseUrl: string,\n private readonly request: typeof fetch = fetch,\n private readonly createRequestId: () => string = () => crypto.randomUUID(),\n ) {\n this.origin = new URL(baseUrl).origin;\n }\n\n async signIn(email: string, password: string): Promise<string> {\n const response = await this.request(this.url(\"/api/auth/sign-in/email\"), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: this.origin,\n },\n body: JSON.stringify({ email, password }),\n });\n if (!response.ok) throw await apiError(response, \"Sign-in failed.\");\n\n const token = response.headers.get(\"set-auth-token\");\n if (!token) {\n throw new Error(\"The server did not issue a CLI session token.\");\n }\n return token;\n }\n\n async getUser(token: string): Promise<User> {\n const response = await this.request(this.url(\"/api/auth/get-session\"), {\n headers: authorization(token),\n });\n if (!response.ok) throw await apiError(response, \"Session expired.\");\n const session = sessionSchema.safeParse(await response.json());\n if (!session.success) throw new ApiError(\"Session expired.\", 401);\n return session.data.user;\n }\n\n async signOut(token: string): Promise<void> {\n const response = await this.request(this.url(\"/api/auth/sign-out\"), {\n method: \"POST\",\n headers: {\n ...authorization(token),\n \"Content-Type\": \"application/json\",\n Origin: this.origin,\n },\n body: \"{}\",\n });\n if (!response.ok) throw await apiError(response, \"Sign-out failed.\");\n }\n\n async listWorkspaces(token: string): Promise<Workspace[]> {\n const response = await this.request(this.url(\"/api/workspaces\"), {\n headers: authorization(token),\n });\n if (!response.ok) {\n throw await apiError(response, \"Could not load workspaces.\");\n }\n return workspaceListSchema.parse(await response.json()).workspaces;\n }\n\n async createWorkspace(token: string, name: string): Promise<Workspace> {\n const response = await this.request(this.url(\"/api/workspaces\"), {\n method: \"POST\",\n headers: {\n ...authorization(token),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ requestId: this.createRequestId(), name }),\n });\n if (!response.ok) {\n throw await apiError(response, \"Could not create the workspace.\");\n }\n return workspaceCreatedSchema.parse(await response.json()).workspace;\n }\n\n async retrieve(\n token: string,\n workspaceId: string,\n query: string,\n limit = 10,\n ): Promise<RetrievalResult> {\n const response = await this.request(\n this.url(`/api/workspaces/${encodeURIComponent(workspaceId)}/retrieval`),\n {\n method: \"POST\",\n headers: {\n ...authorization(token),\n \"Content-Type\": \"application/json\",\n Origin: this.origin,\n },\n body: JSON.stringify({ query, limit }),\n },\n );\n if (!response.ok) {\n throw await apiError(response, \"Could not retrieve workspace memory.\");\n }\n return retrievalResponseSchema.parse(await response.json());\n }\n\n private url(path: string): URL {\n return new URL(path, this.baseUrl);\n }\n}\n\nfunction authorization(token: string): Record<string, string> {\n return { Authorization: `Bearer ${token}` };\n}\n\nasync function apiError(\n response: Response,\n fallback: string,\n): Promise<ApiError> {\n const value: unknown = await response.json().catch(() => null);\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"message\" in value &&\n typeof value.message === \"string\"\n ) {\n return new ApiError(value.message, response.status);\n }\n return new ApiError(fallback, response.status);\n}\n"],"mappings":"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","names":["z","z","z","z"]}
@@ -0,0 +1,35 @@
1
+ import {
2
+ credentialsPath,
3
+ readValidatedJsonFile,
4
+ removePrivateFile,
5
+ writePrivateJsonFile
6
+ } from "./chunk-YQIGSGD4.js";
7
+
8
+ // src/preferences.ts
9
+ import { dirname, join } from "path";
10
+ import { z } from "zod/v4";
11
+ var preferencesSchema = z.object({ workspaceId: z.uuid().optional() });
12
+ function preferencesPath() {
13
+ return join(dirname(credentialsPath()), "preferences.json");
14
+ }
15
+ async function readWorkspaceId(path = preferencesPath()) {
16
+ const value = await readValidatedJsonFile(
17
+ path,
18
+ preferencesSchema,
19
+ "CLI preferences"
20
+ );
21
+ return value?.workspaceId ?? null;
22
+ }
23
+ async function writeWorkspaceId(workspaceId, path = preferencesPath()) {
24
+ await writePrivateJsonFile(path, preferencesSchema.parse({ workspaceId }));
25
+ }
26
+ async function clearWorkspaceId(path = preferencesPath()) {
27
+ await removePrivateFile(path);
28
+ }
29
+
30
+ export {
31
+ readWorkspaceId,
32
+ writeWorkspaceId,
33
+ clearWorkspaceId
34
+ };
35
+ //# sourceMappingURL=chunk-Z6XCOT3K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/preferences.ts"],"sourcesContent":["import { dirname, join } from \"node:path\";\nimport { z } from \"zod/v4\";\n\nimport { credentialsPath } from \"./credentials.js\";\nimport {\n readValidatedJsonFile,\n removePrivateFile,\n writePrivateJsonFile,\n} from \"./private-json-file.js\";\n\nconst preferencesSchema = z.object({ workspaceId: z.uuid().optional() });\n\nfunction preferencesPath(): string {\n return join(dirname(credentialsPath()), \"preferences.json\");\n}\n\nexport async function readWorkspaceId(\n path = preferencesPath(),\n): Promise<string | null> {\n const value = await readValidatedJsonFile(\n path,\n preferencesSchema,\n \"CLI preferences\",\n );\n return value?.workspaceId ?? null;\n}\n\nexport async function writeWorkspaceId(\n workspaceId: string,\n path = preferencesPath(),\n): Promise<void> {\n await writePrivateJsonFile(path, preferencesSchema.parse({ workspaceId }));\n}\n\nexport async function clearWorkspaceId(\n path = preferencesPath(),\n): Promise<void> {\n await removePrivateFile(path);\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,SAAS,YAAY;AAC9B,SAAS,SAAS;AASlB,IAAM,oBAAoB,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAEvE,SAAS,kBAA0B;AACjC,SAAO,KAAK,QAAQ,gBAAgB,CAAC,GAAG,kBAAkB;AAC5D;AAEA,eAAsB,gBACpB,OAAO,gBAAgB,GACC;AACxB,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,OAAO,eAAe;AAC/B;AAEA,eAAsB,iBACpB,aACA,OAAO,gBAAgB,GACR;AACf,QAAM,qBAAqB,MAAM,kBAAkB,MAAM,EAAE,YAAY,CAAC,CAAC;AAC3E;AAEA,eAAsB,iBACpB,OAAO,gBAAgB,GACR;AACf,QAAM,kBAAkB,IAAI;AAC9B;","names":[]}
@@ -0,0 +1,42 @@
1
+ import {
2
+ NimbaseCommand,
3
+ writeToken
4
+ } from "../../chunk-YQIGSGD4.js";
5
+
6
+ // src/commands/auth/login.ts
7
+ import { password as passwordPrompt } from "@inquirer/prompts";
8
+ import { Flags } from "@oclif/core";
9
+ var Login = class _Login extends NimbaseCommand {
10
+ static description = "Sign in to Nimbase";
11
+ static examples = [
12
+ "<%= config.bin %> <%= command.id %> --email you@example.com"
13
+ ];
14
+ static flags = {
15
+ email: Flags.string({
16
+ char: "e",
17
+ description: "account email",
18
+ required: true
19
+ }),
20
+ password: Flags.string({
21
+ description: "account password (prefer the prompt)"
22
+ })
23
+ };
24
+ async run() {
25
+ const { flags } = await this.parse(_Login);
26
+ const password = flags.password ?? await passwordPrompt({ message: "Password", mask: "*" });
27
+ let token = null;
28
+ try {
29
+ token = await this.api.signIn(flags.email.trim(), password);
30
+ const user = await this.api.getUser(token);
31
+ await writeToken(token);
32
+ this.log(`Signed in as ${user.email}.`);
33
+ } catch (error) {
34
+ if (token) await this.api.signOut(token).catch(() => void 0);
35
+ await this.handleError(error);
36
+ }
37
+ }
38
+ };
39
+ export {
40
+ Login as default
41
+ };
42
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/commands/auth/login.ts"],"sourcesContent":["import { password as passwordPrompt } from \"@inquirer/prompts\";\nimport { Flags } from \"@oclif/core\";\n\nimport { NimbaseCommand } from \"../../base-command.js\";\nimport { writeToken } from \"../../credentials.js\";\n\nexport default class Login extends NimbaseCommand {\n static description = \"Sign in to Nimbase\";\n static examples = [\n \"<%= config.bin %> <%= command.id %> --email you@example.com\",\n ];\n static flags = {\n email: Flags.string({\n char: \"e\",\n description: \"account email\",\n required: true,\n }),\n password: Flags.string({\n description: \"account password (prefer the prompt)\",\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Login);\n const password =\n flags.password ??\n (await passwordPrompt({ message: \"Password\", mask: \"*\" }));\n let token: string | null = null;\n try {\n token = await this.api.signIn(flags.email.trim(), password);\n const user = await this.api.getUser(token);\n await writeToken(token);\n this.log(`Signed in as ${user.email}.`);\n } catch (error) {\n if (token) await this.api.signOut(token).catch(() => undefined);\n await this.handleError(error);\n }\n }\n}\n"],"mappings":";;;;;;AAAA,SAAS,YAAY,sBAAsB;AAC3C,SAAS,aAAa;AAKtB,IAAqB,QAArB,MAAqB,eAAc,eAAe;AAAA,EAChD,OAAO,cAAc;AAAA,EACrB,OAAO,WAAW;AAAA,IAChB;AAAA,EACF;AAAA,EACA,OAAO,QAAQ;AAAA,IACb,OAAO,MAAM,OAAO;AAAA,MAClB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,UAAU,MAAM,OAAO;AAAA,MACrB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,MAAK;AACxC,UAAM,WACJ,MAAM,YACL,MAAM,eAAe,EAAE,SAAS,YAAY,MAAM,IAAI,CAAC;AAC1D,QAAI,QAAuB;AAC3B,QAAI;AACF,cAAQ,MAAM,KAAK,IAAI,OAAO,MAAM,MAAM,KAAK,GAAG,QAAQ;AAC1D,YAAM,OAAO,MAAM,KAAK,IAAI,QAAQ,KAAK;AACzC,YAAM,WAAW,KAAK;AACtB,WAAK,IAAI,gBAAgB,KAAK,KAAK,GAAG;AAAA,IACxC,SAAS,OAAO;AACd,UAAI,MAAO,OAAM,KAAK,IAAI,QAAQ,KAAK,EAAE,MAAM,MAAM,MAAS;AAC9D,YAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,36 @@
1
+ import {
2
+ clearWorkspaceId
3
+ } from "../../chunk-Z6XCOT3K.js";
4
+ import {
5
+ NimbaseCommand,
6
+ clearToken,
7
+ readToken
8
+ } from "../../chunk-YQIGSGD4.js";
9
+
10
+ // src/commands/auth/logout.ts
11
+ var Logout = class _Logout extends NimbaseCommand {
12
+ static description = "Sign out of Nimbase";
13
+ async run() {
14
+ await this.parse(_Logout);
15
+ const token = await readToken();
16
+ if (!token) {
17
+ this.log("Already signed out.");
18
+ return;
19
+ }
20
+ let remoteFailed;
21
+ try {
22
+ await this.api.signOut(token);
23
+ remoteFailed = false;
24
+ } catch {
25
+ remoteFailed = true;
26
+ }
27
+ await Promise.all([clearToken(), clearWorkspaceId()]);
28
+ this.log(
29
+ remoteFailed ? "Signed out locally; the server session could not be revoked." : "Signed out."
30
+ );
31
+ }
32
+ };
33
+ export {
34
+ Logout as default
35
+ };
36
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/commands/auth/logout.ts"],"sourcesContent":["import { NimbaseCommand } from \"../../base-command.js\";\nimport { clearToken, readToken } from \"../../credentials.js\";\nimport { clearWorkspaceId } from \"../../preferences.js\";\n\nexport default class Logout extends NimbaseCommand {\n static description = \"Sign out of Nimbase\";\n\n async run(): Promise<void> {\n await this.parse(Logout);\n const token = await readToken();\n if (!token) {\n this.log(\"Already signed out.\");\n return;\n }\n\n let remoteFailed: boolean;\n try {\n await this.api.signOut(token);\n remoteFailed = false;\n } catch {\n remoteFailed = true;\n }\n await Promise.all([clearToken(), clearWorkspaceId()]);\n this.log(\n remoteFailed\n ? \"Signed out locally; the server session could not be revoked.\"\n : \"Signed out.\",\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAIA,IAAqB,SAArB,MAAqB,gBAAe,eAAe;AAAA,EACjD,OAAO,cAAc;AAAA,EAErB,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,OAAM;AACvB,UAAM,QAAQ,MAAM,UAAU;AAC9B,QAAI,CAAC,OAAO;AACV,WAAK,IAAI,qBAAqB;AAC9B;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,KAAK,IAAI,QAAQ,KAAK;AAC5B,qBAAe;AAAA,IACjB,QAAQ;AACN,qBAAe;AAAA,IACjB;AACA,UAAM,QAAQ,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC,CAAC;AACpD,SAAK;AAAA,MACH,eACI,iEACA;AAAA,IACN;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,21 @@
1
+ import {
2
+ NimbaseCommand
3
+ } from "../../chunk-YQIGSGD4.js";
4
+
5
+ // src/commands/auth/status.ts
6
+ var Status = class _Status extends NimbaseCommand {
7
+ static description = "Show the signed-in account";
8
+ async run() {
9
+ await this.parse(_Status);
10
+ try {
11
+ const user = await this.api.getUser(await this.requireToken());
12
+ this.log(`${user.email} (${user.name})`);
13
+ } catch (error) {
14
+ await this.handleError(error);
15
+ }
16
+ }
17
+ };
18
+ export {
19
+ Status as default
20
+ };
21
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/commands/auth/status.ts"],"sourcesContent":["import { NimbaseCommand } from \"../../base-command.js\";\n\nexport default class Status extends NimbaseCommand {\n static description = \"Show the signed-in account\";\n\n async run(): Promise<void> {\n await this.parse(Status);\n try {\n const user = await this.api.getUser(await this.requireToken());\n this.log(`${user.email} (${user.name})`);\n } catch (error) {\n await this.handleError(error);\n }\n }\n}\n"],"mappings":";;;;;AAEA,IAAqB,SAArB,MAAqB,gBAAe,eAAe;AAAA,EACjD,OAAO,cAAc;AAAA,EAErB,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,OAAM;AACvB,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,IAAI,QAAQ,MAAM,KAAK,aAAa,CAAC;AAC7D,WAAK,IAAI,GAAG,KAAK,KAAK,KAAK,KAAK,IAAI,GAAG;AAAA,IACzC,SAAS,OAAO;AACd,YAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,40 @@
1
+ import {
2
+ writeWorkspaceId
3
+ } from "../../chunk-Z6XCOT3K.js";
4
+ import {
5
+ NimbaseCommand
6
+ } from "../../chunk-YQIGSGD4.js";
7
+
8
+ // src/commands/workspace/create.ts
9
+ import { Args, Flags } from "@oclif/core";
10
+ var Create = class _Create extends NimbaseCommand {
11
+ static description = "Create a workspace";
12
+ static args = {
13
+ name: Args.string({ description: "workspace name", required: true })
14
+ };
15
+ static flags = {
16
+ select: Flags.boolean({
17
+ description: "select the new workspace",
18
+ default: true,
19
+ allowNo: true
20
+ })
21
+ };
22
+ async run() {
23
+ const { args, flags } = await this.parse(_Create);
24
+ try {
25
+ const workspace = await this.api.createWorkspace(
26
+ await this.requireToken(),
27
+ args.name.trim()
28
+ );
29
+ if (flags.select) await writeWorkspaceId(workspace.id);
30
+ this.log(`Created ${workspace.name} (${workspace.slug}).`);
31
+ if (flags.select) this.log("Selected the new workspace.");
32
+ } catch (error) {
33
+ await this.handleError(error);
34
+ }
35
+ }
36
+ };
37
+ export {
38
+ Create as default
39
+ };
40
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/commands/workspace/create.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\n\nimport { NimbaseCommand } from \"../../base-command.js\";\nimport { writeWorkspaceId } from \"../../preferences.js\";\n\nexport default class Create extends NimbaseCommand {\n static description = \"Create a workspace\";\n static args = {\n name: Args.string({ description: \"workspace name\", required: true }),\n };\n static flags = {\n select: Flags.boolean({\n description: \"select the new workspace\",\n default: true,\n allowNo: true,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Create);\n try {\n const workspace = await this.api.createWorkspace(\n await this.requireToken(),\n args.name.trim(),\n );\n if (flags.select) await writeWorkspaceId(workspace.id);\n this.log(`Created ${workspace.name} (${workspace.slug}).`);\n if (flags.select) this.log(\"Selected the new workspace.\");\n } catch (error) {\n await this.handleError(error);\n }\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,MAAM,aAAa;AAK5B,IAAqB,SAArB,MAAqB,gBAAe,eAAe;AAAA,EACjD,OAAO,cAAc;AAAA,EACrB,OAAO,OAAO;AAAA,IACZ,MAAM,KAAK,OAAO,EAAE,aAAa,kBAAkB,UAAU,KAAK,CAAC;AAAA,EACrE;AAAA,EACA,OAAO,QAAQ;AAAA,IACb,QAAQ,MAAM,QAAQ;AAAA,MACpB,aAAa;AAAA,MACb,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,OAAM;AAC/C,QAAI;AACF,YAAM,YAAY,MAAM,KAAK,IAAI;AAAA,QAC/B,MAAM,KAAK,aAAa;AAAA,QACxB,KAAK,KAAK,KAAK;AAAA,MACjB;AACA,UAAI,MAAM,OAAQ,OAAM,iBAAiB,UAAU,EAAE;AACrD,WAAK,IAAI,WAAW,UAAU,IAAI,KAAK,UAAU,IAAI,IAAI;AACzD,UAAI,MAAM,OAAQ,MAAK,IAAI,6BAA6B;AAAA,IAC1D,SAAS,OAAO;AACd,YAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,35 @@
1
+ import {
2
+ readWorkspaceId
3
+ } from "../../chunk-Z6XCOT3K.js";
4
+ import {
5
+ NimbaseCommand
6
+ } from "../../chunk-YQIGSGD4.js";
7
+
8
+ // src/commands/workspace/current.ts
9
+ var Current = class _Current extends NimbaseCommand {
10
+ static description = "Show the selected workspace";
11
+ async run() {
12
+ await this.parse(_Current);
13
+ const selectedId = await readWorkspaceId();
14
+ if (!selectedId)
15
+ this.error(
16
+ "No workspace selected. Run `nimbase workspace select <workspace>`."
17
+ );
18
+ let workspaces;
19
+ try {
20
+ workspaces = await this.api.listWorkspaces(await this.requireToken());
21
+ } catch (error) {
22
+ return this.handleError(error);
23
+ }
24
+ const workspace = workspaces.find(
25
+ (candidate) => candidate.id === selectedId
26
+ );
27
+ if (!workspace)
28
+ this.error("The selected workspace is no longer available.");
29
+ this.log(`${workspace.slug} ${workspace.name} ${workspace.id}`);
30
+ }
31
+ };
32
+ export {
33
+ Current as default
34
+ };
35
+ //# sourceMappingURL=current.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/commands/workspace/current.ts"],"sourcesContent":["import { NimbaseCommand } from \"../../base-command.js\";\nimport { readWorkspaceId } from \"../../preferences.js\";\n\nexport default class Current extends NimbaseCommand {\n static description = \"Show the selected workspace\";\n\n async run(): Promise<void> {\n await this.parse(Current);\n const selectedId = await readWorkspaceId();\n if (!selectedId)\n this.error(\n \"No workspace selected. Run `nimbase workspace select <workspace>`.\",\n );\n let workspaces;\n try {\n workspaces = await this.api.listWorkspaces(await this.requireToken());\n } catch (error) {\n return this.handleError(error);\n }\n const workspace = workspaces.find(\n (candidate) => candidate.id === selectedId,\n );\n if (!workspace)\n this.error(\"The selected workspace is no longer available.\");\n this.log(`${workspace.slug}\\t${workspace.name}\\t${workspace.id}`);\n }\n}\n"],"mappings":";;;;;;;;AAGA,IAAqB,UAArB,MAAqB,iBAAgB,eAAe;AAAA,EAClD,OAAO,cAAc;AAAA,EAErB,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,QAAO;AACxB,UAAM,aAAa,MAAM,gBAAgB;AACzC,QAAI,CAAC;AACH,WAAK;AAAA,QACH;AAAA,MACF;AACF,QAAI;AACJ,QAAI;AACF,mBAAa,MAAM,KAAK,IAAI,eAAe,MAAM,KAAK,aAAa,CAAC;AAAA,IACtE,SAAS,OAAO;AACd,aAAO,KAAK,YAAY,KAAK;AAAA,IAC/B;AACA,UAAM,YAAY,WAAW;AAAA,MAC3B,CAAC,cAAc,UAAU,OAAO;AAAA,IAClC;AACA,QAAI,CAAC;AACH,WAAK,MAAM,gDAAgD;AAC7D,SAAK,IAAI,GAAG,UAAU,IAAI,IAAK,UAAU,IAAI,IAAK,UAAU,EAAE,EAAE;AAAA,EAClE;AACF;","names":[]}
@@ -0,0 +1,43 @@
1
+ import {
2
+ readWorkspaceId
3
+ } from "../../chunk-Z6XCOT3K.js";
4
+ import {
5
+ NimbaseCommand
6
+ } from "../../chunk-YQIGSGD4.js";
7
+
8
+ // src/commands/workspace/list.ts
9
+ import { Flags } from "@oclif/core";
10
+ var List = class _List extends NimbaseCommand {
11
+ static description = "List your workspaces";
12
+ static flags = {
13
+ json: Flags.boolean({ description: "output JSON" })
14
+ };
15
+ async run() {
16
+ const { flags } = await this.parse(_List);
17
+ try {
18
+ const [workspaces, selectedId] = await Promise.all([
19
+ this.api.listWorkspaces(await this.requireToken()),
20
+ readWorkspaceId()
21
+ ]);
22
+ if (flags.json) {
23
+ this.log(JSON.stringify(workspaces, null, 2));
24
+ return;
25
+ }
26
+ if (workspaces.length === 0) {
27
+ this.log("No workspaces found.");
28
+ return;
29
+ }
30
+ for (const workspace of workspaces) {
31
+ this.log(
32
+ `${workspace.id === selectedId ? "*" : " "} ${workspace.slug} ${workspace.name}`
33
+ );
34
+ }
35
+ } catch (error) {
36
+ await this.handleError(error);
37
+ }
38
+ }
39
+ };
40
+ export {
41
+ List as default
42
+ };
43
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/commands/workspace/list.ts"],"sourcesContent":["import { Flags } from \"@oclif/core\";\n\nimport { NimbaseCommand } from \"../../base-command.js\";\nimport { readWorkspaceId } from \"../../preferences.js\";\n\nexport default class List extends NimbaseCommand {\n static description = \"List your workspaces\";\n static flags = {\n json: Flags.boolean({ description: \"output JSON\" }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(List);\n try {\n const [workspaces, selectedId] = await Promise.all([\n this.api.listWorkspaces(await this.requireToken()),\n readWorkspaceId(),\n ]);\n if (flags.json) {\n this.log(JSON.stringify(workspaces, null, 2));\n return;\n }\n if (workspaces.length === 0) {\n this.log(\"No workspaces found.\");\n return;\n }\n for (const workspace of workspaces) {\n this.log(\n `${workspace.id === selectedId ? \"*\" : \" \"} ${workspace.slug}\\t${workspace.name}`,\n );\n }\n } catch (error) {\n await this.handleError(error);\n }\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,aAAa;AAKtB,IAAqB,OAArB,MAAqB,cAAa,eAAe;AAAA,EAC/C,OAAO,cAAc;AAAA,EACrB,OAAO,QAAQ;AAAA,IACb,MAAM,MAAM,QAAQ,EAAE,aAAa,cAAc,CAAC;AAAA,EACpD;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,KAAI;AACvC,QAAI;AACF,YAAM,CAAC,YAAY,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,QACjD,KAAK,IAAI,eAAe,MAAM,KAAK,aAAa,CAAC;AAAA,QACjD,gBAAgB;AAAA,MAClB,CAAC;AACD,UAAI,MAAM,MAAM;AACd,aAAK,IAAI,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAC5C;AAAA,MACF;AACA,UAAI,WAAW,WAAW,GAAG;AAC3B,aAAK,IAAI,sBAAsB;AAC/B;AAAA,MACF;AACA,iBAAW,aAAa,YAAY;AAClC,aAAK;AAAA,UACH,GAAG,UAAU,OAAO,aAAa,MAAM,GAAG,IAAI,UAAU,IAAI,IAAK,UAAU,IAAI;AAAA,QACjF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,37 @@
1
+ import {
2
+ writeWorkspaceId
3
+ } from "../../chunk-Z6XCOT3K.js";
4
+ import {
5
+ NimbaseCommand
6
+ } from "../../chunk-YQIGSGD4.js";
7
+
8
+ // src/commands/workspace/select.ts
9
+ import { Args } from "@oclif/core";
10
+ var Select = class _Select extends NimbaseCommand {
11
+ static description = "Select a workspace by slug or ID";
12
+ static args = {
13
+ workspace: Args.string({
14
+ description: "workspace slug or ID",
15
+ required: true
16
+ })
17
+ };
18
+ async run() {
19
+ const { args } = await this.parse(_Select);
20
+ let workspaces;
21
+ try {
22
+ workspaces = await this.api.listWorkspaces(await this.requireToken());
23
+ } catch (error) {
24
+ return this.handleError(error);
25
+ }
26
+ const workspace = workspaces.find(
27
+ (candidate) => candidate.id === args.workspace || candidate.slug === args.workspace
28
+ );
29
+ if (!workspace) this.error(`Workspace not found: ${args.workspace}`);
30
+ await writeWorkspaceId(workspace.id);
31
+ this.log(`Selected ${workspace.name} (${workspace.slug}).`);
32
+ }
33
+ };
34
+ export {
35
+ Select as default
36
+ };
37
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/commands/workspace/select.ts"],"sourcesContent":["import { Args } from \"@oclif/core\";\n\nimport { NimbaseCommand } from \"../../base-command.js\";\nimport { writeWorkspaceId } from \"../../preferences.js\";\n\nexport default class Select extends NimbaseCommand {\n static description = \"Select a workspace by slug or ID\";\n static args = {\n workspace: Args.string({\n description: \"workspace slug or ID\",\n required: true,\n }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(Select);\n let workspaces;\n try {\n workspaces = await this.api.listWorkspaces(await this.requireToken());\n } catch (error) {\n return this.handleError(error);\n }\n const workspace = workspaces.find(\n (candidate) =>\n candidate.id === args.workspace || candidate.slug === args.workspace,\n );\n if (!workspace) this.error(`Workspace not found: ${args.workspace}`);\n await writeWorkspaceId(workspace.id);\n this.log(`Selected ${workspace.name} (${workspace.slug}).`);\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,YAAY;AAKrB,IAAqB,SAArB,MAAqB,gBAAe,eAAe;AAAA,EACjD,OAAO,cAAc;AAAA,EACrB,OAAO,OAAO;AAAA,IACZ,WAAW,KAAK,OAAO;AAAA,MACrB,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,OAAM;AACxC,QAAI;AACJ,QAAI;AACF,mBAAa,MAAM,KAAK,IAAI,eAAe,MAAM,KAAK,aAAa,CAAC;AAAA,IACtE,SAAS,OAAO;AACd,aAAO,KAAK,YAAY,KAAK;AAAA,IAC/B;AACA,UAAM,YAAY,WAAW;AAAA,MAC3B,CAAC,cACC,UAAU,OAAO,KAAK,aAAa,UAAU,SAAS,KAAK;AAAA,IAC/D;AACA,QAAI,CAAC,UAAW,MAAK,MAAM,wBAAwB,KAAK,SAAS,EAAE;AACnE,UAAM,iBAAiB,UAAU,EAAE;AACnC,SAAK,IAAI,YAAY,UAAU,IAAI,KAAK,UAAU,IAAI,IAAI;AAAA,EAC5D;AACF;","names":[]}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@nimbase/cli",
3
+ "version": "0.1.0",
4
+ "description": "Command-line client for Nimbase company memory",
5
+ "license": "UNLICENSED",
6
+ "type": "module",
7
+ "files": [
8
+ "bin/run.js",
9
+ "dist"
10
+ ],
11
+ "engines": {
12
+ "node": ">=22.0.0"
13
+ },
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/Theskrtnerd/nimbase.git",
20
+ "directory": "apps/cli"
21
+ },
22
+ "bin": {
23
+ "nimbase": "bin/run.js"
24
+ },
25
+ "scripts": {
26
+ "build": "tsup",
27
+ "clean": "git clean -xdf .cache .turbo node_modules",
28
+ "dev": "node --import tsx bin/dev.js",
29
+ "format": "prettier --check . --ignore-path ../../.gitignore",
30
+ "format:write": "prettier --write . --ignore-path ../../.gitignore",
31
+ "lint": "NODE_OPTIONS=--experimental-strip-types eslint --flag unstable_native_nodejs_ts_config",
32
+ "prepack": "pnpm build",
33
+ "test": "tsx --test src/*.test.ts",
34
+ "typecheck": "tsc --noEmit"
35
+ },
36
+ "dependencies": {
37
+ "@inquirer/prompts": "^8.0.1",
38
+ "@oclif/core": "^4.5.4",
39
+ "@t3-oss/env-core": "^0.13.8",
40
+ "zod": "^4.4.3"
41
+ },
42
+ "devDependencies": {
43
+ "@nimbase/eslint-config": "workspace:*",
44
+ "@nimbase/prettier-config": "workspace:*",
45
+ "@nimbase/sdk": "workspace:*",
46
+ "@nimbase/tsconfig": "workspace:*",
47
+ "@types/node": "catalog:",
48
+ "eslint": "catalog:",
49
+ "prettier": "catalog:",
50
+ "tsup": "^8.5.1",
51
+ "tsx": "^4.23.12",
52
+ "typescript": "catalog:"
53
+ },
54
+ "oclif": {
55
+ "bin": "nimbase",
56
+ "dirname": "nimbase",
57
+ "commands": "./dist/commands",
58
+ "topicSeparator": " "
59
+ },
60
+ "prettier": "@nimbase/prettier-config"
61
+ }