epismo 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.
@@ -0,0 +1,401 @@
1
+ import { Command } from "commander";
2
+ import { clearWorkspace, getCurrentWorkspace, listAvailableWorkspaces, login, logout, useWorkspace, whoami } from "./auth.js";
3
+ import { resolveExecutionContext } from "./context.js";
4
+ import { mergeDefined, parseJsonArrayOption, parseJsonObjectOption, parseOptionalInteger, parseStringArrayInput, readJsonObjectInput } from "./input.js";
5
+ import { printJson, printText } from "./output.js";
6
+ import { deleteTrack, getTrack, searchTracks, upsertTrack } from "./tracks.js";
7
+ import { deleteAsset, getAsset, importAssets, likeAsset, searchAssets, upsertAsset } from "./assets.js";
8
+ import { creditBalance, creditCheckout } from "./credits.js";
9
+ function printResult(payload, options) {
10
+ if (options.json) {
11
+ printJson(payload);
12
+ return;
13
+ }
14
+ if (options.summary) {
15
+ printText(options.summary);
16
+ return;
17
+ }
18
+ printJson(payload);
19
+ }
20
+ async function resolveInput(options, overrides) {
21
+ const base = await readJsonObjectInput(options.input);
22
+ return mergeDefined(base, overrides);
23
+ }
24
+ function parseBooleanLiteral(value, label) {
25
+ if (value === undefined) {
26
+ return undefined;
27
+ }
28
+ if (typeof value === "boolean") {
29
+ return value;
30
+ }
31
+ if (typeof value !== "string") {
32
+ throw new Error(`${label} must be true or false.`);
33
+ }
34
+ const normalized = value.trim().toLowerCase();
35
+ if (normalized === "true") {
36
+ return true;
37
+ }
38
+ if (normalized === "false") {
39
+ return false;
40
+ }
41
+ throw new Error(`${label} must be true or false.`);
42
+ }
43
+ export function buildProgram() {
44
+ const program = new Command();
45
+ program.name("epismo").description("Epismo CLI").version("0.1.0");
46
+ program
47
+ .command("login")
48
+ .description("log in and save credentials to ~/.epismo/credentials")
49
+ .option("--input <input>", "JSON object, @file, or - for stdin")
50
+ .option("--browser", "Open a browser for OAuth login")
51
+ .option("--email <email>", "Email address (used with default OTP login)")
52
+ .option("--pin <pin>", "OTP code (used with default OTP login)")
53
+ .option("--otp-id <otpId>", "Existing OTP id to verify (used with default OTP login)")
54
+ .option("--json", "Print JSON output")
55
+ .action(async (options) => {
56
+ const payload = await resolveInput({ input: options.input, json: options.json }, {
57
+ email: options.email,
58
+ pin: options.pin,
59
+ otpId: options.otpId
60
+ });
61
+ const result = await login({
62
+ browser: options.browser === true,
63
+ email: typeof payload.email === "string" ? payload.email : undefined,
64
+ pin: typeof payload.pin === "string" ? payload.pin : undefined,
65
+ otpId: typeof payload.otpId === "string" ? payload.otpId : undefined
66
+ });
67
+ printResult({
68
+ loggedIn: true,
69
+ userId: result.userId,
70
+ expiresAt: result.expiresAt
71
+ }, {
72
+ json: options.json,
73
+ summary: `Logged in as ${result.lastLoginEmail ?? result.userId}. Token expires at ${result.expiresAt}.`
74
+ });
75
+ });
76
+ program
77
+ .command("logout")
78
+ .description("revoke credentials and clear ~/.epismo/credentials")
79
+ .option("--json", "Print JSON output")
80
+ .action(async (options) => {
81
+ const result = await logout();
82
+ printResult(result, {
83
+ json: options.json,
84
+ summary: result.hadCredentials ? "Logged out." : "No saved credentials."
85
+ });
86
+ });
87
+ program
88
+ .command("whoami")
89
+ .description("show the currently authenticated user")
90
+ .option("--workspace-id <workspaceId>", "Workspace context override")
91
+ .option("--json", "Print JSON output")
92
+ .action(async (options) => {
93
+ const payload = await whoami({
94
+ workspaceId: options.workspaceId
95
+ });
96
+ printResult(payload, { json: options.json });
97
+ });
98
+ const workspace = program.command("workspace").description("manage the default workspace");
99
+ workspace
100
+ .command("list")
101
+ .description("list accessible workspaces")
102
+ .option("--json", "Print JSON output")
103
+ .action(async (options) => {
104
+ const payload = await listAvailableWorkspaces();
105
+ printResult(payload, { json: options.json });
106
+ });
107
+ workspace
108
+ .command("current")
109
+ .description("show the saved default workspace")
110
+ .option("--json", "Print JSON output")
111
+ .action(async (options) => {
112
+ const payload = await getCurrentWorkspace();
113
+ printResult(payload, {
114
+ json: options.json,
115
+ summary: payload.currentWorkspace
116
+ ? `Current workspace: ${payload.currentWorkspace.name} (${payload.currentWorkspace.id})`
117
+ : "No default workspace set."
118
+ });
119
+ });
120
+ workspace
121
+ .command("use")
122
+ .description("set the default workspace")
123
+ .argument("<workspaceId>", "Workspace id")
124
+ .option("--json", "Print JSON output")
125
+ .action(async (workspaceId, options) => {
126
+ const payload = await useWorkspace({ workspaceId });
127
+ printResult(payload, {
128
+ json: options.json,
129
+ summary: `Default workspace set to ${payload.workspace.name} (${payload.workspace.id}).`
130
+ });
131
+ });
132
+ workspace
133
+ .command("clear")
134
+ .description("clear the saved default workspace")
135
+ .option("--json", "Print JSON output")
136
+ .action(async (options) => {
137
+ const payload = await clearWorkspace();
138
+ printResult(payload, {
139
+ json: options.json,
140
+ summary: "Default workspace cleared."
141
+ });
142
+ });
143
+ const track = program.command("track").description("manage track resources");
144
+ track
145
+ .command("upsert")
146
+ .description("create or update a task, note, or goal")
147
+ .option("--input <input>", "JSON object, @file, or - for stdin")
148
+ .option("--type <type>", "task | note | goal")
149
+ .option("--id <id>", "Existing item id")
150
+ .option("--title <title>", "Title")
151
+ .option("--content <content>", "Markdown content")
152
+ .option("--projects <projects>", "JSON array or comma-separated project ids")
153
+ .option("--task <task>", "Task fields as JSON object")
154
+ .option("--goal <goal>", "Goal fields as JSON object")
155
+ .option("--workspace-id <workspaceId>", "Workspace context")
156
+ .option("--json", "Print JSON output")
157
+ .action(async (options) => {
158
+ const context = await resolveExecutionContext({
159
+ workspaceId: options.workspaceId
160
+ });
161
+ const payload = await resolveInput(options, {
162
+ type: options.type,
163
+ id: options.id,
164
+ title: options.title,
165
+ content: options.content,
166
+ projects: parseStringArrayInput(options.projects, "--projects"),
167
+ task: parseJsonObjectOption(options.task, "--task"),
168
+ goal: parseJsonObjectOption(options.goal, "--goal")
169
+ });
170
+ printResult(await upsertTrack(context, payload), { json: options.json });
171
+ });
172
+ track
173
+ .command("get")
174
+ .description("fetch one track")
175
+ .option("--input <input>", "JSON object, @file, or - for stdin")
176
+ .option("--type <type>", "task | note | goal")
177
+ .option("--id <id>", "Item id")
178
+ .option("--workspace-id <workspaceId>", "Workspace context")
179
+ .option("--json", "Print JSON output")
180
+ .action(async (options) => {
181
+ const context = await resolveExecutionContext({
182
+ workspaceId: options.workspaceId
183
+ });
184
+ const payload = await resolveInput(options, {
185
+ type: options.type,
186
+ id: options.id
187
+ });
188
+ printResult(await getTrack(context, payload), { json: options.json });
189
+ });
190
+ track
191
+ .command("search")
192
+ .description("search tracks")
193
+ .option("--input <input>", "JSON object, @file, or - for stdin")
194
+ .option("--type <type>", "task | note | goal")
195
+ .option("--query <query>", "Free-text query")
196
+ .option("--page <page>", "1-based page number")
197
+ .option("--view <view>", "full | summary")
198
+ .option("--projects <projects>", "JSON array or comma-separated project ids")
199
+ .option("--filter <filter>", "Filter as JSON object")
200
+ .option("--workspace-id <workspaceId>", "Workspace context")
201
+ .option("--json", "Print JSON output")
202
+ .action(async (options) => {
203
+ const context = await resolveExecutionContext({
204
+ workspaceId: options.workspaceId
205
+ });
206
+ const payload = await resolveInput(options, {
207
+ type: options.type,
208
+ query: options.query,
209
+ page: parseOptionalInteger(options.page, "--page"),
210
+ view: options.view,
211
+ projects: parseStringArrayInput(options.projects, "--projects"),
212
+ filter: parseJsonObjectOption(options.filter, "--filter")
213
+ });
214
+ printResult(await searchTracks(context, payload), { json: options.json });
215
+ });
216
+ track
217
+ .command("delete")
218
+ .description("delete one track")
219
+ .option("--input <input>", "JSON object, @file, or - for stdin")
220
+ .option("--type <type>", "task | note | goal")
221
+ .option("--id <id>", "Item id")
222
+ .option("--workspace-id <workspaceId>", "Workspace context")
223
+ .option("--json", "Print JSON output")
224
+ .action(async (options) => {
225
+ const context = await resolveExecutionContext({
226
+ workspaceId: options.workspaceId
227
+ });
228
+ const payload = await resolveInput(options, {
229
+ type: options.type,
230
+ id: options.id
231
+ });
232
+ printResult(await deleteTrack(context, payload), { json: options.json });
233
+ });
234
+ const asset = program.command("asset").description("manage asset resources");
235
+ asset
236
+ .command("upsert")
237
+ .description("create or update an asset")
238
+ .option("--input <input>", "JSON object, @file, or - for stdin")
239
+ .option("--type <type>", "Asset type (e.g. workflow)")
240
+ .option("--id <id>", "Existing asset id")
241
+ .option("--title <title>", "Title")
242
+ .option("--content <content>", "Markdown overview")
243
+ .option("--category <category>", "Asset category")
244
+ .option("--visibility <visibility>", "public | private")
245
+ .option("--projects <projects>", "JSON array or comma-separated project ids")
246
+ .option("--workflow <workflow>", "Workflow steps as JSON array")
247
+ .option("--workspace-id <workspaceId>", "Workspace context")
248
+ .option("--json", "Print JSON output")
249
+ .action(async (options) => {
250
+ const context = await resolveExecutionContext({
251
+ workspaceId: options.workspaceId
252
+ });
253
+ const payload = await resolveInput(options, {
254
+ type: options.type,
255
+ id: options.id,
256
+ title: options.title,
257
+ content: options.content,
258
+ category: options.category,
259
+ visibility: options.visibility,
260
+ projects: parseStringArrayInput(options.projects, "--projects"),
261
+ workflow: parseJsonArrayOption(options.workflow, "--workflow")
262
+ });
263
+ printResult(await upsertAsset(context, payload), { json: options.json });
264
+ });
265
+ asset
266
+ .command("get")
267
+ .description("fetch one asset")
268
+ .option("--input <input>", "JSON object, @file, or - for stdin")
269
+ .option("--type <type>", "Asset type (e.g. workflow)")
270
+ .option("--id <id>", "Asset id")
271
+ .option("--workspace-id <workspaceId>", "Workspace context")
272
+ .option("--json", "Print JSON output")
273
+ .action(async (options) => {
274
+ const context = await resolveExecutionContext({
275
+ workspaceId: options.workspaceId
276
+ });
277
+ const payload = await resolveInput(options, {
278
+ type: options.type,
279
+ id: options.id
280
+ });
281
+ printResult(await getAsset(context, payload), { json: options.json });
282
+ });
283
+ asset
284
+ .command("search")
285
+ .description("search assets")
286
+ .option("--input <input>", "JSON object, @file, or - for stdin")
287
+ .option("--type <type>", "Asset type (e.g. workflow)")
288
+ .option("--query <query>", "Free-text query")
289
+ .option("--page <page>", "1-based page number")
290
+ .option("--view <view>", "full | summary")
291
+ .option("--filter <filter>", "Filter as JSON object")
292
+ .option("--workspace-id <workspaceId>", "Workspace context")
293
+ .option("--json", "Print JSON output")
294
+ .action(async (options) => {
295
+ const context = await resolveExecutionContext({
296
+ workspaceId: options.workspaceId
297
+ });
298
+ const payload = await resolveInput(options, {
299
+ type: options.type,
300
+ query: options.query,
301
+ page: parseOptionalInteger(options.page, "--page"),
302
+ view: options.view,
303
+ filter: parseJsonObjectOption(options.filter, "--filter")
304
+ });
305
+ printResult(await searchAssets(context, payload), { json: options.json });
306
+ });
307
+ asset
308
+ .command("like")
309
+ .description("like or unlike an asset")
310
+ .option("--input <input>", "JSON object, @file, or - for stdin")
311
+ .option("--type <type>", "Asset type (e.g. workflow)")
312
+ .option("--id <id>", "Asset id")
313
+ .option("--liked <liked>", "true | false")
314
+ .option("--workspace-id <workspaceId>", "Workspace context")
315
+ .option("--json", "Print JSON output")
316
+ .action(async (options) => {
317
+ const context = await resolveExecutionContext({
318
+ workspaceId: options.workspaceId
319
+ });
320
+ const payload = await resolveInput(options, {
321
+ type: options.type,
322
+ id: options.id,
323
+ liked: parseBooleanLiteral(options.liked, "--liked")
324
+ });
325
+ printResult(await likeAsset(context, payload), { json: options.json });
326
+ });
327
+ asset
328
+ .command("import")
329
+ .description("import asset workflow steps into a project")
330
+ .option("--input <input>", "JSON object, @file, or - for stdin")
331
+ .option("--project-id <projectId>", "Target project id")
332
+ .option("--asset-ids <assetIds>", "JSON array or comma-separated asset ids")
333
+ .option("--workspace-id <workspaceId>", "Workspace context")
334
+ .option("--json", "Print JSON output")
335
+ .action(async (options) => {
336
+ const context = await resolveExecutionContext({
337
+ workspaceId: options.workspaceId
338
+ });
339
+ const payload = await resolveInput(options, {
340
+ projectId: options.projectId,
341
+ artifactIds: parseStringArrayInput(options.assetIds, "--asset-ids")
342
+ });
343
+ printResult(await importAssets(context, payload), { json: options.json });
344
+ });
345
+ asset
346
+ .command("delete")
347
+ .description("delete one asset")
348
+ .option("--input <input>", "JSON object, @file, or - for stdin")
349
+ .option("--type <type>", "Asset type (e.g. workflow)")
350
+ .option("--id <id>", "Asset id")
351
+ .option("--workspace-id <workspaceId>", "Workspace context")
352
+ .option("--json", "Print JSON output")
353
+ .action(async (options) => {
354
+ const context = await resolveExecutionContext({
355
+ workspaceId: options.workspaceId
356
+ });
357
+ const payload = await resolveInput(options, {
358
+ type: options.type,
359
+ id: options.id
360
+ });
361
+ printResult(await deleteAsset(context, payload), { json: options.json });
362
+ });
363
+ const credit = program.command("credit").description("view balance and purchase credits");
364
+ credit
365
+ .command("balance")
366
+ .description("show current credit balance and active grants")
367
+ .option("--workspace-id <workspaceId>", "Workspace context (omit for personal balance)")
368
+ .option("--json", "Print JSON output")
369
+ .action(async (options) => {
370
+ const result = await creditBalance(options.workspaceId);
371
+ printResult(result, {
372
+ json: options.json,
373
+ summary: [
374
+ `Balance: ${result.balance}`,
375
+ result.shortfall > 0 ? `Shortfall: ${result.shortfall}` : null
376
+ ]
377
+ .filter(Boolean)
378
+ .join("\n")
379
+ });
380
+ });
381
+ credit
382
+ .command("checkout")
383
+ .description("start a credit purchase and get a Stripe checkout URL")
384
+ .option("--input <input>", "JSON object, @file, or - for stdin")
385
+ .option("--allocations <allocations>", 'JSON array of { userId, quantity } e.g. \'[{"userId":"u_1","quantity":10}]\'')
386
+ .option("--workspace-id <workspaceId>", "Workspace to purchase credits for")
387
+ .option("--json", "Print JSON output")
388
+ .action(async (options) => {
389
+ const payload = await resolveInput({ input: options.input, json: options.json }, {
390
+ workspaceId: options.workspaceId,
391
+ allocations: parseJsonArrayOption(options.allocations, "--allocations")
392
+ });
393
+ const result = await creditCheckout({ workspaceId: options.workspaceId }, payload);
394
+ printResult(result, {
395
+ json: options.json,
396
+ summary: `Checkout URL: ${result.url}`
397
+ });
398
+ });
399
+ return program;
400
+ }
401
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
package/dist/tracks.js ADDED
@@ -0,0 +1,55 @@
1
+ import { requestJson } from "./api.js";
2
+ import { resolveApiUrl } from "./config.js";
3
+ function withWorkspaceQuery(pathname, workspaceId) {
4
+ if (!workspaceId?.trim()) {
5
+ return pathname;
6
+ }
7
+ const params = new URLSearchParams({ workspaceId: workspaceId.trim() });
8
+ return `${pathname}?${params.toString()}`;
9
+ }
10
+ function readRequiredString(input, key) {
11
+ if (!input || typeof input !== "object") {
12
+ throw new Error(`${key} is required.`);
13
+ }
14
+ const value = input[key];
15
+ if (typeof value !== "string" || !value.trim()) {
16
+ throw new Error(`${key} is required.`);
17
+ }
18
+ return value.trim();
19
+ }
20
+ export async function upsertTrack(context, input) {
21
+ return requestJson(resolveApiUrl(), "/v1/tracks", {
22
+ method: "PUT",
23
+ authToken: context.auth.accessToken,
24
+ body: {
25
+ ...(input && typeof input === "object" ? input : {}),
26
+ ...(context.workspaceId ? { workspaceId: context.workspaceId } : {})
27
+ }
28
+ });
29
+ }
30
+ export async function getTrack(context, input) {
31
+ const type = readRequiredString(input, "type");
32
+ const id = readRequiredString(input, "id");
33
+ return requestJson(resolveApiUrl(), withWorkspaceQuery(`/v1/tracks/${encodeURIComponent(type)}/${encodeURIComponent(id)}`, context.workspaceId), {
34
+ authToken: context.auth.accessToken
35
+ });
36
+ }
37
+ export async function searchTracks(context, input) {
38
+ return requestJson(resolveApiUrl(), withWorkspaceQuery("/v1/tracks/search", context.workspaceId), {
39
+ method: "POST",
40
+ authToken: context.auth.accessToken,
41
+ body: {
42
+ ...(input && typeof input === "object" ? input : {}),
43
+ ...(context.workspaceId ? { workspaceId: context.workspaceId } : {})
44
+ }
45
+ });
46
+ }
47
+ export async function deleteTrack(context, input) {
48
+ const type = readRequiredString(input, "type");
49
+ const id = readRequiredString(input, "id");
50
+ return requestJson(resolveApiUrl(), withWorkspaceQuery(`/v1/tracks/${encodeURIComponent(type)}/${encodeURIComponent(id)}`, context.workspaceId), {
51
+ method: "DELETE",
52
+ authToken: context.auth.accessToken
53
+ });
54
+ }
55
+ //# sourceMappingURL=tracks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracks.js","sourceRoot":"","sources":["../src/tracks.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "epismo",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "epismo": "dist/bin.js"
7
+ },
8
+ "files": ["dist", "README.md"],
9
+ "publishConfig": {
10
+ "access": "public"
11
+ },
12
+ "scripts": {
13
+ "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
14
+ "start": "node dist/bin.js",
15
+ "dev": "tsx watch src/index.ts",
16
+ "build": "npm run clean && tsc -p tsconfig.json && chmod +x dist/bin.js",
17
+ "typecheck": "tsc --noEmit -p tsconfig.json",
18
+ "lint": "eslint ."
19
+ },
20
+ "dependencies": {
21
+ "@bufbuild/protobuf": "^2.2.3",
22
+ "@grpc/grpc-js": "^1.13.2",
23
+ "commander": "^14.0.1",
24
+ "google-auth-library": "^10.1.0",
25
+ "tsx": "^4.20.6",
26
+ "zod": "^3.25.76"
27
+ }
28
+ }