praetom 0.2.1 → 0.2.3
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/dist/cli/cli.js +12 -0
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/login.d.ts.map +1 -1
- package/dist/cli/commands/login.js +48 -2
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logout.d.ts +12 -0
- package/dist/cli/commands/logout.d.ts.map +1 -1
- package/dist/cli/commands/logout.js +42 -4
- package/dist/cli/commands/logout.js.map +1 -1
- package/dist/cli/commands/workspaces.d.ts +4 -0
- package/dist/cli/commands/workspaces.d.ts.map +1 -0
- package/dist/cli/commands/workspaces.js +46 -0
- package/dist/cli/commands/workspaces.js.map +1 -0
- package/dist/cli/util/api.d.ts +1 -1
- package/dist/cli/util/api.d.ts.map +1 -1
- package/dist/cli/util/api.js +26 -5
- package/dist/cli/util/api.js.map +1 -1
- package/dist/cli/util/auth-file.d.ts +7 -0
- package/dist/cli/util/auth-file.d.ts.map +1 -1
- package/dist/cli/util/auth-file.js +36 -8
- package/dist/cli/util/auth-file.js.map +1 -1
- package/dist/cli/util/run.d.ts.map +1 -1
- package/dist/cli/util/run.js +12 -1
- package/dist/cli/util/run.js.map +1 -1
- package/package.json +7 -8
package/dist/cli/cli.js
CHANGED
|
@@ -15,6 +15,7 @@ import { featuresAddCommand, featuresListCommand, featuresShowCommand, } from ".
|
|
|
15
15
|
import { rotateCommand } from "./commands/rotate.js";
|
|
16
16
|
import { uninstallCommand } from "./commands/uninstall.js";
|
|
17
17
|
import { discoverCommand } from "./commands/discover.js";
|
|
18
|
+
import { workspacesListCommand, workspacesUseCommand, } from "./commands/workspaces.js";
|
|
18
19
|
import { detectAgent } from "./util/agent-env.js";
|
|
19
20
|
import { runCommand } from "./util/run.js";
|
|
20
21
|
// Read version from package.json so --version always matches what was
|
|
@@ -73,6 +74,17 @@ program
|
|
|
73
74
|
.command("usage")
|
|
74
75
|
.description("Workspace usage — span volume, discovery runs, MCP calls.")
|
|
75
76
|
.action(() => runCommand(program, usageCommand));
|
|
77
|
+
const workspaces = program
|
|
78
|
+
.command("workspaces")
|
|
79
|
+
.description("List workspace memberships and set the default.");
|
|
80
|
+
workspaces
|
|
81
|
+
.command("list")
|
|
82
|
+
.description("List the workspaces you belong to; marks the current default.")
|
|
83
|
+
.action(() => runCommand(program, workspacesListCommand));
|
|
84
|
+
workspaces
|
|
85
|
+
.command("use <slug>")
|
|
86
|
+
.description("Set the default workspace for subsequent commands (saved in ~/.config/praetom/auth.json).")
|
|
87
|
+
.action((slug) => runCommand(program, (ctx) => workspacesUseCommand(ctx, slug)));
|
|
76
88
|
const features = program
|
|
77
89
|
.command("features")
|
|
78
90
|
.description("Manage features in this workspace.");
|
package/dist/cli/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,sEAAsE;AACtE,uEAAuE;AACvE,qEAAqE;AACrE,6CAA6C;AAC7C,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAyB,CAAC;QAC9E,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CACV,2EAA2E,CAC5E;KACA,OAAO,CAAC,kBAAkB,EAAE,EAAE,eAAe,CAAC;KAC9C,MAAM,CAAC,oBAAoB,EAAE,wBAAwB,CAAC;KACtD,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;KACxD,MAAM,CACL,QAAQ,EACR,6EAA6E,CAC9E;KACA,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC,CAAC;AAE5E,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CACV,kGAAkG,CACnG;KACA,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AAElD,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CACV,qFAAqF,CACtF;KACA,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;AAErD,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CACV,8FAA8F,CAC/F;KACA,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;AAErD,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,uDAAuD,CAAC;KACpE,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AAEnD,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;AAEpD,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;AAEpD,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;AAEpD,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,2DAA2D,CAAC;KACxE,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AAEnD,MAAM,UAAU,GAAG,OAAO;KACvB,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,iDAAiD,CAAC,CAAC;AAElE,UAAU;KACP,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC;AAE5D,UAAU;KACP,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CACV,2FAA2F,CAC5F;KACA,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CACvB,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAC9D,CAAC;AAEJ,MAAM,QAAQ,GAAG,OAAO;KACrB,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,oCAAoC,CAAC,CAAC;AAErD,QAAQ;KACL,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAE1D,QAAQ;KACL,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAEzF,QAAQ;KACL,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAE1F,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CACV,8EAA8E,CAC/E;KACA,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;AAEpD,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CACV,+EAA+E,CAChF;KACA,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEvD,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;AAEtD,6EAA6E;AAC7E,6EAA6E;AAC7E,gCAAgC;AAChC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;AAC5B,IAAI,KAAK,EAAE,CAAC;IACV,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACpD,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,SAAS;QAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;AAC1E,CAAC;AAED,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAsB,CAAC;IAChD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAyBjD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFjE"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { createInterface } from "node:readline/promises";
|
|
3
|
+
import { readAuth, writeAuth, writeCurrentWorkspace, DEFAULT_API_BASE, } from "../util/auth-file.js";
|
|
4
|
+
import { colors, logError, logInfo, result, runTasks } from "../util/output.js";
|
|
4
5
|
/**
|
|
5
6
|
* OAuth-style device-authorization handshake. The CLI:
|
|
6
7
|
*
|
|
@@ -70,6 +71,49 @@ export async function loginCommand(ctx) {
|
|
|
70
71
|
result(ctx, { signedIn: true, prefix: out.prefix }, () => {
|
|
71
72
|
process.stdout.write(`\n${colors.green("✓")} Signed in. ${colors.dim(`Token (prefix ${out.prefix}…) saved to ~/.config/praetom/auth.json.`)}\n`);
|
|
72
73
|
});
|
|
74
|
+
// Offer to set a default workspace when the user is in more than one
|
|
75
|
+
// and doesn't already have one selected. Skipped in non-interactive
|
|
76
|
+
// / JSON modes (agents handle this via the explicit `workspaces use`
|
|
77
|
+
// command).
|
|
78
|
+
await maybePromptForWorkspace(ctx, apiBase, out.token);
|
|
79
|
+
}
|
|
80
|
+
async function maybePromptForWorkspace(ctx, apiBase, token) {
|
|
81
|
+
if (ctx.nonInteractive || ctx.json)
|
|
82
|
+
return;
|
|
83
|
+
const existing = await readAuth();
|
|
84
|
+
if (existing?.currentWorkspace)
|
|
85
|
+
return;
|
|
86
|
+
let workspaces;
|
|
87
|
+
try {
|
|
88
|
+
const res = await fetchJson(`${apiBase}/api/cli/workspaces`, { authToken: token });
|
|
89
|
+
if (!res.ok)
|
|
90
|
+
return;
|
|
91
|
+
workspaces = res.value.workspaces ?? [];
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (workspaces.length <= 1)
|
|
97
|
+
return;
|
|
98
|
+
process.stdout.write(`\n${colors.dim("You belong to multiple workspaces:")}\n`);
|
|
99
|
+
workspaces.forEach((w, i) => {
|
|
100
|
+
process.stdout.write(` ${colors.bold(String(i + 1))}) ${colors.bold(w.slug)} ${colors.dim(w.name)}\n`);
|
|
101
|
+
});
|
|
102
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
103
|
+
const answer = (await rl.question(`\nPick one to set as your default (1-${workspaces.length}, or enter to skip): `)).trim();
|
|
104
|
+
rl.close();
|
|
105
|
+
if (!answer) {
|
|
106
|
+
logInfo(ctx, `${colors.dim("Skipped.")} Pass ${colors.bold("--workspace <slug>")} per command, or run ${colors.bold("praetom workspaces use <slug>")} later.`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const idx = Number.parseInt(answer, 10);
|
|
110
|
+
if (!Number.isFinite(idx) || idx < 1 || idx > workspaces.length) {
|
|
111
|
+
logError(ctx, `"${answer}" is not in range; skipping.`);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const chosen = workspaces[idx - 1];
|
|
115
|
+
await writeCurrentWorkspace(chosen.slug);
|
|
116
|
+
process.stdout.write(`${colors.green("✓")} Default workspace set to ${colors.bold(chosen.slug)}.\n`);
|
|
73
117
|
}
|
|
74
118
|
async function pollUntilApproved(session, apiBase, t) {
|
|
75
119
|
const intervalMs = Math.max(1, session.interval) * 1000;
|
|
@@ -108,6 +152,8 @@ async function fetchJson(url, init = {}) {
|
|
|
108
152
|
};
|
|
109
153
|
if (init.contentType)
|
|
110
154
|
headers["Content-Type"] = init.contentType;
|
|
155
|
+
if (init.authToken)
|
|
156
|
+
headers["Authorization"] = `Bearer ${init.authToken}`;
|
|
111
157
|
let res;
|
|
112
158
|
try {
|
|
113
159
|
res = await fetch(url, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,15 @@
|
|
|
1
1
|
import type { RunContext } from "../util/run.js";
|
|
2
|
+
/**
|
|
3
|
+
* Revoke the current token server-side, then clear local state.
|
|
4
|
+
*
|
|
5
|
+
* Revoke is best-effort: if the network is down or the server can't
|
|
6
|
+
* reach the DB, we still wipe the local auth file so the user isn't
|
|
7
|
+
* stuck. The server endpoint is idempotent — an unknown or already-
|
|
8
|
+
* revoked token returns success with `revoked: false`.
|
|
9
|
+
*
|
|
10
|
+
* Env-sourced tokens (PRAETOM_TOKEN) are NOT revoked. Someone exporting
|
|
11
|
+
* a token explicitly is managing it themselves; killing it from logout
|
|
12
|
+
* would clobber other shell sessions / scripts that share the env var.
|
|
13
|
+
*/
|
|
2
14
|
export declare function logoutCommand(ctx: RunContext): Promise<void>;
|
|
3
15
|
//# sourceMappingURL=logout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKjD;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ClE"}
|
|
@@ -1,9 +1,47 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { apiRequest, AuthRejectedError } from "../util/api.js";
|
|
2
|
+
import { deleteAuth, authFilePath, readAuth } from "../util/auth-file.js";
|
|
3
|
+
import { colors, logInfo, logSuccess, logWarn, result } from "../util/output.js";
|
|
4
|
+
/**
|
|
5
|
+
* Revoke the current token server-side, then clear local state.
|
|
6
|
+
*
|
|
7
|
+
* Revoke is best-effort: if the network is down or the server can't
|
|
8
|
+
* reach the DB, we still wipe the local auth file so the user isn't
|
|
9
|
+
* stuck. The server endpoint is idempotent — an unknown or already-
|
|
10
|
+
* revoked token returns success with `revoked: false`.
|
|
11
|
+
*
|
|
12
|
+
* Env-sourced tokens (PRAETOM_TOKEN) are NOT revoked. Someone exporting
|
|
13
|
+
* a token explicitly is managing it themselves; killing it from logout
|
|
14
|
+
* would clobber other shell sessions / scripts that share the env var.
|
|
15
|
+
*/
|
|
3
16
|
export async function logoutCommand(ctx) {
|
|
4
|
-
const
|
|
17
|
+
const auth = await readAuth();
|
|
5
18
|
const path = authFilePath();
|
|
6
|
-
|
|
19
|
+
let revoked = null;
|
|
20
|
+
let revokeError = null;
|
|
21
|
+
if (auth && auth.source === "file") {
|
|
22
|
+
try {
|
|
23
|
+
const res = await apiRequest("/api/cli/auth/session", { method: "DELETE" });
|
|
24
|
+
revoked = res.revoked;
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
// 401 means the token's already invalid — that's "already
|
|
28
|
+
// revoked" from logout's perspective, not an error.
|
|
29
|
+
if (e instanceof AuthRejectedError) {
|
|
30
|
+
revoked = false;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
revokeError = e.message;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const removed = await deleteAuth();
|
|
38
|
+
result(ctx, { removed, path, revoked, revokeError }, () => {
|
|
39
|
+
if (revokeError) {
|
|
40
|
+
logWarn(ctx, `Server revoke failed (${revokeError}). Local credential cleared anyway.`);
|
|
41
|
+
}
|
|
42
|
+
else if (revoked === true) {
|
|
43
|
+
logSuccess(ctx, "Token revoked on the server.");
|
|
44
|
+
}
|
|
7
45
|
if (removed) {
|
|
8
46
|
logSuccess(ctx, `Removed ${colors.dim(path)}`);
|
|
9
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEjF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAe;IACjD,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAE5B,IAAI,OAAO,GAAmB,IAAI,CAAC;IACnC,IAAI,WAAW,GAAkB,IAAI,CAAC;IAEtC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,uBAAuB,EACvB,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAC;YACF,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QACxB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,0DAA0D;YAC1D,oDAAoD;YACpD,IAAI,CAAC,YAAY,iBAAiB,EAAE,CAAC;gBACnC,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAI,CAAW,CAAC,OAAO,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAEnC,MAAM,CACJ,GAAG,EACH,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EACvC,GAAG,EAAE;QACH,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CACL,GAAG,EACH,yBAAyB,WAAW,qCAAqC,CAC1E,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5B,UAAU,CAAC,GAAG,EAAE,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,CAAC,GAAG,EAAE,WAAW,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,EAAE,mBAAmB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/workspaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAejD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC1E;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { apiRequest } from "../util/api.js";
|
|
2
|
+
import { readAuth, writeCurrentWorkspace } from "../util/auth-file.js";
|
|
3
|
+
import { colors, logError, logInfo, logSuccess, result } from "../util/output.js";
|
|
4
|
+
export async function workspacesListCommand(ctx) {
|
|
5
|
+
const res = await apiRequest("/api/cli/workspaces");
|
|
6
|
+
const auth = await readAuth();
|
|
7
|
+
const current = auth?.currentWorkspace;
|
|
8
|
+
result(ctx, { workspaces: res.workspaces, current }, () => {
|
|
9
|
+
if (res.workspaces.length === 0) {
|
|
10
|
+
logInfo(ctx, "You don't belong to any workspaces yet.");
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
process.stdout.write(`${colors.bold(String(res.workspaces.length))} ${colors.dim("workspace(s):")}\n\n`);
|
|
14
|
+
for (const w of res.workspaces) {
|
|
15
|
+
const marker = w.slug === current ? colors.green("●") : " ";
|
|
16
|
+
process.stdout.write(` ${marker} ${colors.bold(w.slug.padEnd(24))} ${colors.dim(w.name)}\n`);
|
|
17
|
+
}
|
|
18
|
+
if (current) {
|
|
19
|
+
process.stdout.write(`\n${colors.dim("●")} ${colors.dim("current default — change with")} ${colors.bold("praetom workspaces use <slug>")}\n`);
|
|
20
|
+
}
|
|
21
|
+
else if (res.workspaces.length > 1) {
|
|
22
|
+
process.stdout.write(`\n${colors.dim("Set a default with")} ${colors.bold("praetom workspaces use <slug>")}${colors.dim(" — or pass --workspace <slug> per command.")}\n`);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export async function workspacesUseCommand(ctx, slug) {
|
|
27
|
+
const target = slug.trim().toLowerCase();
|
|
28
|
+
if (!target) {
|
|
29
|
+
logError(ctx, "workspace slug is required");
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
// Verify membership before writing — silently storing a typo would
|
|
33
|
+
// produce confusing 404s on later commands.
|
|
34
|
+
const res = await apiRequest("/api/cli/workspaces");
|
|
35
|
+
const match = res.workspaces.find((w) => w.slug === target);
|
|
36
|
+
if (!match) {
|
|
37
|
+
const available = res.workspaces.map((w) => w.slug).join(", ");
|
|
38
|
+
logError(ctx, `workspace "${target}" not found or you're not a member. Available: ${available || "(none)"}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
await writeCurrentWorkspace(target);
|
|
42
|
+
result(ctx, { ok: true, currentWorkspace: target }, () => {
|
|
43
|
+
logSuccess(ctx, `Default workspace set to ${colors.bold(target)}.`);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=workspaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../src/cli/commands/workspaces.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAYlF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAe;IACzD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAqB,qBAAqB,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,EAAE,gBAAgB,CAAC;IAEvC,MAAM,CACJ,GAAG,EACH,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,EACvC,GAAG,EAAE;QACH,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,EAAE,yCAAyC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CACnF,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CACxE,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,+BAA+B,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,IAAI,CACxH,CAAC;QACJ,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,4CAA4C,CAAC,IAAI,CACrJ,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAe,EACf,IAAY;IAEZ,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,QAAQ,CAAC,GAAG,EAAE,4BAA4B,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mEAAmE;IACnE,4CAA4C;IAC5C,MAAM,GAAG,GAAG,MAAM,UAAU,CAAqB,qBAAqB,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,QAAQ,CACN,GAAG,EACH,cAAc,MAAM,kDAAkD,SAAS,IAAI,QAAQ,EAAE,CAC9F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAEpC,MAAM,CACJ,GAAG,EACH,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,EACtC,GAAG,EAAE;QACH,UAAU,CAAC,GAAG,EAAE,4BAA4B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtE,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/cli/util/api.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export declare class NotAuthenticatedError extends Error {
|
|
|
18
18
|
* their stored credential is the problem, not the absence of one.
|
|
19
19
|
*/
|
|
20
20
|
export declare class AuthRejectedError extends Error {
|
|
21
|
-
constructor();
|
|
21
|
+
constructor(serverMessage?: string);
|
|
22
22
|
}
|
|
23
23
|
export declare function requireAuth(): Promise<AuthState>;
|
|
24
24
|
interface RequestOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/cli/util/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE1D,qBAAa,QAAS,SAAQ,KAAK;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;gBACD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAM3D;AAED,qBAAa,qBAAsB,SAAQ,KAAK;;CAO/C;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,KAAK
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/cli/util/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE1D,qBAAa,QAAS,SAAQ,KAAK;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;gBACD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAM3D;AAED,qBAAa,qBAAsB,SAAQ,KAAK;;CAO/C;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,aAAa,CAAC,EAAE,MAAM;CAQnC;AAgBD,wBAAsB,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,CAItD;AAED,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3C,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAkBD,wBAAsB,UAAU,CAAC,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,CAAC,CAAC,CAuCZ;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACrC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAGhD"}
|
package/dist/cli/util/api.js
CHANGED
|
@@ -26,12 +26,29 @@ export class NotAuthenticatedError extends Error {
|
|
|
26
26
|
* their stored credential is the problem, not the absence of one.
|
|
27
27
|
*/
|
|
28
28
|
export class AuthRejectedError extends Error {
|
|
29
|
-
constructor() {
|
|
30
|
-
super(
|
|
31
|
-
"
|
|
29
|
+
constructor(serverMessage) {
|
|
30
|
+
super(serverMessage ??
|
|
31
|
+
"Your stored praetom token was rejected by the server. " +
|
|
32
|
+
"Run `praetom logout && praetom login` to issue a fresh token.");
|
|
32
33
|
this.name = "AuthRejectedError";
|
|
33
34
|
}
|
|
34
35
|
}
|
|
36
|
+
function parseErrorBody(text) {
|
|
37
|
+
if (!text)
|
|
38
|
+
return null;
|
|
39
|
+
try {
|
|
40
|
+
const parsed = JSON.parse(text);
|
|
41
|
+
if (typeof parsed.error !== "string")
|
|
42
|
+
return null;
|
|
43
|
+
return {
|
|
44
|
+
error: parsed.error,
|
|
45
|
+
code: typeof parsed.code === "string" ? parsed.code : undefined,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
35
52
|
export async function requireAuth() {
|
|
36
53
|
const auth = await readAuth();
|
|
37
54
|
if (!auth)
|
|
@@ -69,10 +86,14 @@ export async function apiRequest(path, opts = {}) {
|
|
|
69
86
|
});
|
|
70
87
|
const text = await res.text().catch(() => "");
|
|
71
88
|
if (!res.ok) {
|
|
89
|
+
// Parse the body's `{ error, code? }` shape if present, so users
|
|
90
|
+
// see the server's actual message ("you belong to 3 workspaces…")
|
|
91
|
+
// instead of a generic status-code string.
|
|
92
|
+
const parsed = parseErrorBody(text);
|
|
72
93
|
if (res.status === 401) {
|
|
73
|
-
throw new AuthRejectedError();
|
|
94
|
+
throw new AuthRejectedError(parsed?.error);
|
|
74
95
|
}
|
|
75
|
-
throw new ApiError(res.status, text);
|
|
96
|
+
throw new ApiError(res.status, text, parsed?.error);
|
|
76
97
|
}
|
|
77
98
|
if (!text)
|
|
78
99
|
return undefined;
|
package/dist/cli/util/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/cli/util/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAkB,MAAM,gBAAgB,CAAC;AAE1D,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,MAAM,CAAS;IACf,IAAI,CAAS;IACb,YAAY,MAAc,EAAE,IAAY,EAAE,OAAgB;QACxD,KAAK,CAAC,OAAO,IAAI,eAAe,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C;QACE,KAAK,CACH,2EAA2E,CAC5E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/cli/util/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,10 +16,17 @@ export declare const DEFAULT_API_BASE = "https://praetom.com";
|
|
|
16
16
|
export interface AuthState {
|
|
17
17
|
token: string;
|
|
18
18
|
apiBase: string;
|
|
19
|
+
currentWorkspace: string | undefined;
|
|
19
20
|
source: "env" | "file";
|
|
20
21
|
}
|
|
21
22
|
export declare function authFilePath(): string;
|
|
22
23
|
export declare function readAuth(): Promise<AuthState | null>;
|
|
23
24
|
export declare function writeAuth(token: string, apiBase?: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Update only the `currentWorkspace` field; everything else carries
|
|
27
|
+
* over. Used by `praetom workspaces use <slug>` and by the post-login
|
|
28
|
+
* picker. Passing `undefined` clears the selection.
|
|
29
|
+
*/
|
|
30
|
+
export declare function writeCurrentWorkspace(slug: string | undefined): Promise<void>;
|
|
24
31
|
export declare function deleteAuth(): Promise<boolean>;
|
|
25
32
|
//# sourceMappingURL=auth-file.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-file.d.ts","sourceRoot":"","sources":["../../../src/cli/util/auth-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,eAAO,MAAM,gBAAgB,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-file.d.ts","sourceRoot":"","sources":["../../../src/cli/util/auth-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,eAAO,MAAM,gBAAgB,wBAAwB,CAAC;AAkBtD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;CACxB;AAED,wBAAgB,YAAY,IAAI,MAAM,CAIrC;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAmB1D;AAaD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa9E;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CASnD"}
|
|
@@ -28,19 +28,24 @@ export async function readAuth() {
|
|
|
28
28
|
return {
|
|
29
29
|
token: envToken,
|
|
30
30
|
apiBase: (process.env["PRAETOM_API_BASE"] ?? DEFAULT_API_BASE).replace(/\/+$/, ""),
|
|
31
|
+
currentWorkspace: process.env["PRAETOM_WORKSPACE"] || undefined,
|
|
31
32
|
source: "env",
|
|
32
33
|
};
|
|
33
34
|
}
|
|
35
|
+
const parsed = await readAuthFile();
|
|
36
|
+
if (!parsed?.token)
|
|
37
|
+
return null;
|
|
38
|
+
return {
|
|
39
|
+
token: parsed.token,
|
|
40
|
+
apiBase: (parsed.apiBase ?? DEFAULT_API_BASE).replace(/\/+$/, ""),
|
|
41
|
+
currentWorkspace: parsed.currentWorkspace,
|
|
42
|
+
source: "file",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async function readAuthFile() {
|
|
34
46
|
try {
|
|
35
47
|
const raw = await fs.readFile(authFilePath(), "utf8");
|
|
36
|
-
|
|
37
|
-
if (!parsed.token)
|
|
38
|
-
return null;
|
|
39
|
-
return {
|
|
40
|
-
token: parsed.token,
|
|
41
|
-
apiBase: (parsed.apiBase ?? DEFAULT_API_BASE).replace(/\/+$/, ""),
|
|
42
|
-
source: "file",
|
|
43
|
-
};
|
|
48
|
+
return JSON.parse(raw);
|
|
44
49
|
}
|
|
45
50
|
catch (e) {
|
|
46
51
|
const err = e;
|
|
@@ -52,13 +57,36 @@ export async function readAuth() {
|
|
|
52
57
|
export async function writeAuth(token, apiBase) {
|
|
53
58
|
const path = authFilePath();
|
|
54
59
|
await fs.mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
60
|
+
// Preserve any prior currentWorkspace selection — overwriting the
|
|
61
|
+
// file on relogin shouldn't silently drop the user's saved default.
|
|
62
|
+
const prior = await readAuthFile();
|
|
55
63
|
const payload = {
|
|
56
64
|
token,
|
|
57
65
|
apiBase: apiBase && apiBase !== DEFAULT_API_BASE ? apiBase : undefined,
|
|
66
|
+
currentWorkspace: prior?.currentWorkspace,
|
|
58
67
|
savedAt: new Date().toISOString(),
|
|
59
68
|
};
|
|
60
69
|
await fs.writeFile(path, JSON.stringify(payload, null, 2) + "\n", { mode: 0o600 });
|
|
61
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Update only the `currentWorkspace` field; everything else carries
|
|
73
|
+
* over. Used by `praetom workspaces use <slug>` and by the post-login
|
|
74
|
+
* picker. Passing `undefined` clears the selection.
|
|
75
|
+
*/
|
|
76
|
+
export async function writeCurrentWorkspace(slug) {
|
|
77
|
+
const path = authFilePath();
|
|
78
|
+
const prior = await readAuthFile();
|
|
79
|
+
if (!prior?.token) {
|
|
80
|
+
throw new Error("Cannot set current workspace: no auth file exists. Run `praetom login` first.");
|
|
81
|
+
}
|
|
82
|
+
const payload = {
|
|
83
|
+
...prior,
|
|
84
|
+
currentWorkspace: slug,
|
|
85
|
+
savedAt: new Date().toISOString(),
|
|
86
|
+
};
|
|
87
|
+
await fs.mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
88
|
+
await fs.writeFile(path, JSON.stringify(payload, null, 2) + "\n", { mode: 0o600 });
|
|
89
|
+
}
|
|
62
90
|
export async function deleteAuth() {
|
|
63
91
|
try {
|
|
64
92
|
await fs.unlink(authFilePath());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-file.js","sourceRoot":"","sources":["../../../src/cli/util/auth-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-file.js","sourceRoot":"","sources":["../../../src/cli/util/auth-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/util/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/util/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAElE;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB/E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,CASnE"}
|
package/dist/cli/util/run.js
CHANGED
|
@@ -1,12 +1,23 @@
|
|
|
1
1
|
import { detectAgent } from "./agent-env.js";
|
|
2
|
+
import { readAuth } from "./auth-file.js";
|
|
2
3
|
/**
|
|
3
4
|
* Lift a command implementation into commander's action signature: parse the
|
|
4
5
|
* global flags off the program root and hand the command a clean RunContext.
|
|
5
6
|
*/
|
|
6
7
|
export async function runCommand(program, fn) {
|
|
7
8
|
const opts = program.opts();
|
|
9
|
+
// Workspace resolution: --workspace flag wins, then the saved
|
|
10
|
+
// `currentWorkspace` from auth.json (set by `praetom workspaces use`).
|
|
11
|
+
// If neither is set, leave undefined and let the server respond —
|
|
12
|
+
// the one-membership case auto-resolves there; multi-membership
|
|
13
|
+
// returns a 400 with the available slugs.
|
|
14
|
+
let workspace = opts.workspace;
|
|
15
|
+
if (!workspace) {
|
|
16
|
+
const auth = await readAuth();
|
|
17
|
+
workspace = auth?.currentWorkspace ?? undefined;
|
|
18
|
+
}
|
|
8
19
|
const ctx = {
|
|
9
|
-
workspace
|
|
20
|
+
workspace,
|
|
10
21
|
repo: opts.repo,
|
|
11
22
|
json: opts.json === true,
|
|
12
23
|
nonInteractive: opts.nonInteractive === true,
|
package/dist/cli/util/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/util/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/util/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAgB1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAgB,EAAE,EAAa;IAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAKrB,CAAC;IACL,8DAA8D;IAC9D,uEAAuE;IACvE,kEAAkE;IAClE,gEAAgE;IAChE,0CAA0C;IAC1C,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAC/B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC9B,SAAS,GAAG,IAAI,EAAE,gBAAgB,IAAI,SAAS,CAAC;IAClD,CAAC;IACD,MAAM,GAAG,GAAe;QACtB,SAAS;QACT,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI;QACxB,cAAc,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI;QAC5C,KAAK,EAAE,WAAW,EAAE;KACrB,CAAC;IACF,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAe,EAAE,IAAY;IAC1D,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CACnE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,0BAA0B,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "praetom",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "Praetom — production intelligence for AI-generated code. One package: runtime SDK, bundler plugins, and CLI. `register()` once, the praetom server defines what gets wrapped at runtime; the bundler plugin handles bundled code; the CLI wires it all up from the terminal.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -53,12 +53,6 @@
|
|
|
53
53
|
"access": "public"
|
|
54
54
|
},
|
|
55
55
|
"homepage": "https://praetom.com",
|
|
56
|
-
"scripts": {
|
|
57
|
-
"build": "tsc -p tsconfig.json && chmod +x dist/cli/cli.js",
|
|
58
|
-
"prepare": "tsc -p tsconfig.json && chmod +x dist/cli/cli.js",
|
|
59
|
-
"lint": "eslint src",
|
|
60
|
-
"dev": "tsc -p tsconfig.json --watch"
|
|
61
|
-
},
|
|
62
56
|
"dependencies": {
|
|
63
57
|
"boxen": "^8.0.1",
|
|
64
58
|
"commander": "^12.1.0",
|
|
@@ -83,5 +77,10 @@
|
|
|
83
77
|
"typescript": "^5",
|
|
84
78
|
"vite": "^5",
|
|
85
79
|
"webpack": "^5"
|
|
80
|
+
},
|
|
81
|
+
"scripts": {
|
|
82
|
+
"build": "tsc -p tsconfig.json && chmod +x dist/cli/cli.js",
|
|
83
|
+
"lint": "eslint src",
|
|
84
|
+
"dev": "tsc -p tsconfig.json --watch"
|
|
86
85
|
}
|
|
87
|
-
}
|
|
86
|
+
}
|