@unbrained/pm-web 2026.6.2 → 2026.6.9
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/CHANGELOG.md +36 -0
- package/README.md +92 -1
- package/dist/auth.js +6 -0
- package/dist/auth.js.map +1 -1
- package/dist/board.js +27 -7
- package/dist/board.js.map +1 -1
- package/dist/ical.js +141 -0
- package/dist/ical.js.map +1 -0
- package/dist/index.js +351 -6
- package/dist/index.js.map +1 -1
- package/dist/routes/admin.js +11 -10
- package/dist/routes/admin.js.map +1 -1
- package/dist/routes/github.js +19 -18
- package/dist/routes/github.js.map +1 -1
- package/dist/routes/groups.js +11 -10
- package/dist/routes/groups.js.map +1 -1
- package/dist/routes/pm.js +241 -197
- package/dist/routes/pm.js.map +1 -1
- package/dist/routes/projects.js +4 -3
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/route-params.js +7 -0
- package/dist/routes/route-params.js.map +1 -0
- package/dist/routes/sharing.js +5 -4
- package/dist/routes/sharing.js.map +1 -1
- package/dist/server.js +13 -2
- package/dist/server.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +13 -13
- package/public/index.html +2 -1
- package/public/src/app.js +12 -1
- package/public/src/app.js.map +1 -1
- package/public/src/app.ts +12 -1
- package/public/src/filters.js +40 -0
- package/public/src/filters.js.map +1 -0
- package/public/src/filters.ts +52 -0
- package/public/src/state.js +1 -1
- package/public/src/state.js.map +1 -1
- package/public/src/state.ts +1 -1
- package/public/src/theme.js +74 -0
- package/public/src/theme.js.map +1 -0
- package/public/src/theme.ts +75 -0
- package/public/src/types.ts +1 -0
- package/public/src/utils.js +3 -1
- package/public/src/utils.js.map +1 -1
- package/public/src/utils.ts +3 -1
- package/public/src/views/calendar.js +1 -0
- package/public/src/views/calendar.js.map +1 -1
- package/public/src/views/calendar.ts +1 -0
- package/public/src/views/items.js +56 -3
- package/public/src/views/items.js.map +1 -1
- package/public/src/views/items.ts +55 -3
- package/public/styles.css +85 -0
package/dist/index.js
CHANGED
|
@@ -2,16 +2,81 @@
|
|
|
2
2
|
// This file registers the web server as a pm extension command.
|
|
3
3
|
import { spawn, spawnSync } from "node:child_process";
|
|
4
4
|
import fs from "node:fs";
|
|
5
|
+
import net from "node:net";
|
|
6
|
+
import os from "node:os";
|
|
5
7
|
import path from "node:path";
|
|
6
8
|
import { fileURLToPath } from "node:url";
|
|
7
9
|
// Inline defineExtension helper (avoids runtime dependency on @unbrained/pm-cli/sdk)
|
|
8
10
|
function defineExtension(m) { return m; }
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Error contract
|
|
13
|
+
// CommandError carries a numeric exitCode so the pm runtime surfaces a clean
|
|
14
|
+
// failure instead of double-invoking the handler on a plain thrown Error.
|
|
15
|
+
// 1 = generic, 2 = usage, 3 = not-found
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
class CommandError extends Error {
|
|
18
|
+
exitCode;
|
|
19
|
+
constructor(message, exitCode = 1) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = "CommandError";
|
|
22
|
+
this.exitCode = exitCode;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
9
25
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
10
26
|
const packageRoot = path.resolve(__dirname, "..");
|
|
11
27
|
let serverProcess = null;
|
|
12
|
-
|
|
28
|
+
const DEFAULT_PORT = "4000";
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Pure helpers (unit-tested in test/)
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
/** Resolve the port from flag → PORT env → default 4000. */
|
|
33
|
+
export function resolvePort(options, env = process.env) {
|
|
34
|
+
const flag = options["port"];
|
|
35
|
+
if (flag !== undefined && flag !== null && String(flag).length > 0) {
|
|
36
|
+
return String(flag);
|
|
37
|
+
}
|
|
38
|
+
if (env["PORT"] && String(env["PORT"]).length > 0) {
|
|
39
|
+
return String(env["PORT"]);
|
|
40
|
+
}
|
|
41
|
+
return DEFAULT_PORT;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolve the pidfile path used to track a detached server.
|
|
45
|
+
* Uses PM_WEB_STATE_DIR when set, else the OS temp dir, keyed by port so
|
|
46
|
+
* multiple detached servers don't clobber each other's pidfile.
|
|
47
|
+
*/
|
|
48
|
+
export function pidfilePath(port, env = process.env, tmpDir = os.tmpdir()) {
|
|
49
|
+
const baseDir = env["PM_WEB_STATE_DIR"] && String(env["PM_WEB_STATE_DIR"]).length > 0
|
|
50
|
+
? String(env["PM_WEB_STATE_DIR"])
|
|
51
|
+
: tmpDir;
|
|
52
|
+
return path.join(baseDir, `pm-web-${String(port)}.pid`);
|
|
53
|
+
}
|
|
54
|
+
/** Shape a /healthz probe outcome into a stable status result object. */
|
|
55
|
+
export function shapeStatusResult(input) {
|
|
56
|
+
const portNum = Number(input.port);
|
|
57
|
+
const body = (input.body ?? null);
|
|
58
|
+
const version = body && typeof body["version"] === "string" ? body["version"] : null;
|
|
59
|
+
const result = {
|
|
60
|
+
status: input.reachable ? "up" : "down",
|
|
61
|
+
port: portNum,
|
|
62
|
+
reachable: input.reachable,
|
|
63
|
+
url: `http://localhost:${portNum}/healthz`,
|
|
64
|
+
version,
|
|
65
|
+
healthz: input.body ?? null,
|
|
66
|
+
};
|
|
67
|
+
if (input.error)
|
|
68
|
+
result.error = input.error;
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// Runtime helpers
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
function runtimeDependenciesInstalled() {
|
|
13
75
|
const expressPackage = path.join(packageRoot, "node_modules", "express", "package.json");
|
|
14
|
-
|
|
76
|
+
return fs.existsSync(expressPackage);
|
|
77
|
+
}
|
|
78
|
+
function ensureRuntimeDependencies() {
|
|
79
|
+
if (runtimeDependenciesInstalled())
|
|
15
80
|
return;
|
|
16
81
|
console.error("Installing pm-web runtime dependencies...");
|
|
17
82
|
const install = spawnSync("npm", ["install", "--omit=dev"], {
|
|
@@ -22,7 +87,77 @@ function ensureRuntimeDependencies() {
|
|
|
22
87
|
if (install.error)
|
|
23
88
|
throw install.error;
|
|
24
89
|
if (install.status !== 0) {
|
|
25
|
-
throw new
|
|
90
|
+
throw new CommandError(`npm install --omit=dev failed with exit code ${install.status ?? "unknown"}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** HTTP GET /healthz with a short timeout. Never throws; returns a probe result. */
|
|
94
|
+
async function probeHealthz(port) {
|
|
95
|
+
const url = `http://localhost:${port}/healthz`;
|
|
96
|
+
const controller = new AbortController();
|
|
97
|
+
const timer = setTimeout(() => controller.abort(), 1500);
|
|
98
|
+
try {
|
|
99
|
+
const res = await fetch(url, { signal: controller.signal });
|
|
100
|
+
let body = null;
|
|
101
|
+
try {
|
|
102
|
+
body = await res.json();
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
body = null;
|
|
106
|
+
}
|
|
107
|
+
return { reachable: res.ok, body };
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
return { reachable: false, error: err instanceof Error ? err.message : String(err) };
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
clearTimeout(timer);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Check whether a TCP port is free to bind locally. Never throws. */
|
|
117
|
+
function isPortFree(port) {
|
|
118
|
+
return new Promise((resolve) => {
|
|
119
|
+
const tester = net
|
|
120
|
+
.createServer()
|
|
121
|
+
.once("error", () => resolve(false))
|
|
122
|
+
.once("listening", () => {
|
|
123
|
+
tester.close(() => resolve(true));
|
|
124
|
+
})
|
|
125
|
+
.listen(port, "127.0.0.1");
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
function pmOnPath() {
|
|
129
|
+
const probe = spawnSync("pm", ["--version"], { stdio: "ignore" });
|
|
130
|
+
return !probe.error && probe.status === 0;
|
|
131
|
+
}
|
|
132
|
+
function workspaceInitialized(pmRoot) {
|
|
133
|
+
if (!pmRoot)
|
|
134
|
+
return false;
|
|
135
|
+
// A pm workspace has a settings.json plus item-type directories under the
|
|
136
|
+
// pm root (e.g. tasks/, features/). Match on the settings file or a known
|
|
137
|
+
// item-type dir so detection is robust across pm versions.
|
|
138
|
+
if (!fs.existsSync(pmRoot))
|
|
139
|
+
return false;
|
|
140
|
+
return (fs.existsSync(path.join(pmRoot, "settings.json")) ||
|
|
141
|
+
fs.existsSync(path.join(pmRoot, "schema")) ||
|
|
142
|
+
fs.existsSync(path.join(pmRoot, "tasks")));
|
|
143
|
+
}
|
|
144
|
+
function readPackageVersion() {
|
|
145
|
+
try {
|
|
146
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(packageRoot, "package.json"), "utf8"));
|
|
147
|
+
return pkg.version ?? "unknown";
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return "unknown";
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function processAlive(pid) {
|
|
154
|
+
try {
|
|
155
|
+
process.kill(pid, 0);
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
// ESRCH = no such process; EPERM = exists but not ours (treat as alive)
|
|
160
|
+
return err.code === "EPERM";
|
|
26
161
|
}
|
|
27
162
|
}
|
|
28
163
|
export default defineExtension({
|
|
@@ -30,7 +165,7 @@ export default defineExtension({
|
|
|
30
165
|
version: "1.0.0",
|
|
31
166
|
activate(api) {
|
|
32
167
|
// -----------------------------------------------------------------------
|
|
33
|
-
// Command: pm web [--port <port>]
|
|
168
|
+
// Command: pm web [--port <port>] [--detach]
|
|
34
169
|
// -----------------------------------------------------------------------
|
|
35
170
|
api.registerCommand({
|
|
36
171
|
name: "web",
|
|
@@ -39,13 +174,14 @@ export default defineExtension({
|
|
|
39
174
|
examples: [
|
|
40
175
|
"pm web",
|
|
41
176
|
"pm web --port 8080",
|
|
177
|
+
"pm web --detach",
|
|
42
178
|
],
|
|
43
179
|
flags: [
|
|
44
180
|
{ long: "--port", value_name: "port", description: "Port to listen on (default: 4000 or PORT env var)" },
|
|
45
181
|
{ long: "--detach", description: "Run the server in the background" },
|
|
46
182
|
],
|
|
47
183
|
async run(ctx) {
|
|
48
|
-
const port = ctx.options
|
|
184
|
+
const port = resolvePort(ctx.options);
|
|
49
185
|
const detach = Boolean(ctx.options["detach"]);
|
|
50
186
|
const serverPath = path.resolve(__dirname, "server.js");
|
|
51
187
|
ensureRuntimeDependencies();
|
|
@@ -60,6 +196,15 @@ export default defineExtension({
|
|
|
60
196
|
stdio: "ignore",
|
|
61
197
|
});
|
|
62
198
|
serverProcess.unref();
|
|
199
|
+
// Track the detached PID so `pm web stop` can terminate it.
|
|
200
|
+
if (serverProcess.pid) {
|
|
201
|
+
try {
|
|
202
|
+
fs.writeFileSync(pidfilePath(port), String(serverProcess.pid), "utf8");
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
console.error(`Warning: could not write pidfile: ${err instanceof Error ? err.message : String(err)}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
63
208
|
console.error(`pm-web started on port ${port} (PID ${serverProcess.pid})`);
|
|
64
209
|
return { status: "started", port: Number(port), pid: serverProcess.pid };
|
|
65
210
|
}
|
|
@@ -77,12 +222,212 @@ export default defineExtension({
|
|
|
77
222
|
resolve();
|
|
78
223
|
return;
|
|
79
224
|
}
|
|
80
|
-
reject(new
|
|
225
|
+
reject(new CommandError(`pm-web exited with code ${code ?? `signal ${signal}`}`));
|
|
81
226
|
});
|
|
82
227
|
});
|
|
83
228
|
return { status: "stopped", port: Number(port) };
|
|
84
229
|
},
|
|
85
230
|
});
|
|
231
|
+
// -----------------------------------------------------------------------
|
|
232
|
+
// Command: pm web status [--port <port>] [--json]
|
|
233
|
+
// -----------------------------------------------------------------------
|
|
234
|
+
api.registerCommand({
|
|
235
|
+
name: "web status",
|
|
236
|
+
description: "Report whether a pm-web server is reachable on the configured port.",
|
|
237
|
+
intent: "check pm-web server status",
|
|
238
|
+
examples: ["pm web status", "pm web status --port 8080 --json"],
|
|
239
|
+
flags: [
|
|
240
|
+
{ long: "--port", value_name: "port", description: "Port to probe (default: 4000 or PORT env var)" },
|
|
241
|
+
{ long: "--json", description: "Emit machine-readable JSON" },
|
|
242
|
+
],
|
|
243
|
+
async run(ctx) {
|
|
244
|
+
const port = resolvePort(ctx.options);
|
|
245
|
+
const json = Boolean(ctx.options["json"]);
|
|
246
|
+
const probe = await probeHealthz(port);
|
|
247
|
+
const result = shapeStatusResult({
|
|
248
|
+
port,
|
|
249
|
+
reachable: probe.reachable,
|
|
250
|
+
body: probe.body,
|
|
251
|
+
error: probe.error,
|
|
252
|
+
});
|
|
253
|
+
if (json) {
|
|
254
|
+
console.log(JSON.stringify(result, null, 2));
|
|
255
|
+
}
|
|
256
|
+
else if (result.status === "up") {
|
|
257
|
+
console.log(`pm-web is UP on port ${result.port}` +
|
|
258
|
+
(result.version ? ` (version ${result.version})` : ""));
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
console.log(`pm-web is DOWN on port ${result.port}`);
|
|
262
|
+
}
|
|
263
|
+
return result;
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
// -----------------------------------------------------------------------
|
|
267
|
+
// Command: pm web stop [--port <port>] [--json]
|
|
268
|
+
// -----------------------------------------------------------------------
|
|
269
|
+
api.registerCommand({
|
|
270
|
+
name: "web stop",
|
|
271
|
+
description: "Stop a pm-web server previously started with --detach.",
|
|
272
|
+
intent: "stop a detached pm-web server",
|
|
273
|
+
examples: ["pm web stop", "pm web stop --port 8080"],
|
|
274
|
+
flags: [
|
|
275
|
+
{ long: "--port", value_name: "port", description: "Port of the detached server (default: 4000 or PORT env var)" },
|
|
276
|
+
{ long: "--json", description: "Emit machine-readable JSON" },
|
|
277
|
+
],
|
|
278
|
+
async run(ctx) {
|
|
279
|
+
const port = resolvePort(ctx.options);
|
|
280
|
+
const json = Boolean(ctx.options["json"]);
|
|
281
|
+
const pidfile = pidfilePath(port);
|
|
282
|
+
const emit = (result) => {
|
|
283
|
+
if (json) {
|
|
284
|
+
console.log(JSON.stringify(result, null, 2));
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
console.log(String(result["message"]));
|
|
288
|
+
}
|
|
289
|
+
return result;
|
|
290
|
+
};
|
|
291
|
+
// Prefer the in-process handle if we started it this session.
|
|
292
|
+
let pid = null;
|
|
293
|
+
if (serverProcess?.pid) {
|
|
294
|
+
pid = serverProcess.pid;
|
|
295
|
+
}
|
|
296
|
+
else if (fs.existsSync(pidfile)) {
|
|
297
|
+
const raw = fs.readFileSync(pidfile, "utf8").trim();
|
|
298
|
+
const parsed = Number.parseInt(raw, 10);
|
|
299
|
+
if (Number.isInteger(parsed) && parsed > 0)
|
|
300
|
+
pid = parsed;
|
|
301
|
+
}
|
|
302
|
+
if (pid === null) {
|
|
303
|
+
return emit({
|
|
304
|
+
status: "not_running",
|
|
305
|
+
port: Number(port),
|
|
306
|
+
message: `pm-web is not running (no pidfile for port ${port}).`,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
if (!processAlive(pid)) {
|
|
310
|
+
// Stale pidfile — clean it up and report gracefully.
|
|
311
|
+
if (fs.existsSync(pidfile))
|
|
312
|
+
fs.rmSync(pidfile, { force: true });
|
|
313
|
+
return emit({
|
|
314
|
+
status: "not_running",
|
|
315
|
+
port: Number(port),
|
|
316
|
+
pid,
|
|
317
|
+
message: `pm-web process (PID ${pid}) is not running; cleared stale pidfile.`,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
try {
|
|
321
|
+
process.kill(pid, "SIGTERM");
|
|
322
|
+
}
|
|
323
|
+
catch (err) {
|
|
324
|
+
throw new CommandError(`Failed to stop pm-web (PID ${pid}): ${err instanceof Error ? err.message : String(err)}`);
|
|
325
|
+
}
|
|
326
|
+
if (fs.existsSync(pidfile))
|
|
327
|
+
fs.rmSync(pidfile, { force: true });
|
|
328
|
+
if (serverProcess?.pid === pid)
|
|
329
|
+
serverProcess = null;
|
|
330
|
+
return emit({
|
|
331
|
+
status: "stopped",
|
|
332
|
+
port: Number(port),
|
|
333
|
+
pid,
|
|
334
|
+
message: `Stopped pm-web (PID ${pid}) on port ${port}.`,
|
|
335
|
+
});
|
|
336
|
+
},
|
|
337
|
+
});
|
|
338
|
+
// -----------------------------------------------------------------------
|
|
339
|
+
// Command: pm web doctor [--port <port>] [--json]
|
|
340
|
+
// -----------------------------------------------------------------------
|
|
341
|
+
api.registerCommand({
|
|
342
|
+
name: "web doctor",
|
|
343
|
+
description: "Preflight diagnostics for running pm-web (Node, deps, port, pm, workspace).",
|
|
344
|
+
intent: "diagnose pm-web preflight readiness",
|
|
345
|
+
examples: ["pm web doctor", "pm web doctor --json"],
|
|
346
|
+
flags: [
|
|
347
|
+
{ long: "--port", value_name: "port", description: "Port to check availability for (default: 4000 or PORT env var)" },
|
|
348
|
+
{ long: "--json", description: "Emit machine-readable JSON" },
|
|
349
|
+
],
|
|
350
|
+
async run(ctx) {
|
|
351
|
+
const port = resolvePort(ctx.options);
|
|
352
|
+
const json = Boolean(ctx.options["json"]);
|
|
353
|
+
const nodeMajor = Number.parseInt(process.versions.node.split(".")[0] ?? "0", 10);
|
|
354
|
+
const depsInstalled = runtimeDependenciesInstalled();
|
|
355
|
+
const portFree = await isPortFree(Number(port));
|
|
356
|
+
const pmAvailable = pmOnPath();
|
|
357
|
+
const wsInit = workspaceInitialized(ctx.pm_root);
|
|
358
|
+
const checks = [
|
|
359
|
+
{
|
|
360
|
+
name: "node_version",
|
|
361
|
+
ok: nodeMajor >= 20,
|
|
362
|
+
detail: `Node ${process.versions.node} (requires >= 20)`,
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
name: "runtime_dependencies",
|
|
366
|
+
ok: depsInstalled,
|
|
367
|
+
detail: depsInstalled
|
|
368
|
+
? "express and runtime deps installed"
|
|
369
|
+
: "runtime deps missing (will auto-install on `pm web`)",
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
name: "port_available",
|
|
373
|
+
ok: portFree,
|
|
374
|
+
detail: portFree
|
|
375
|
+
? `port ${port} is free`
|
|
376
|
+
: `port ${port} is in use (a server may already be running)`,
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
name: "pm_on_path",
|
|
380
|
+
ok: pmAvailable,
|
|
381
|
+
detail: pmAvailable ? "pm CLI is on PATH" : "pm CLI not found on PATH",
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
name: "workspace_initialized",
|
|
385
|
+
ok: wsInit,
|
|
386
|
+
detail: wsInit
|
|
387
|
+
? `pm workspace found at ${ctx.pm_root}`
|
|
388
|
+
: `no pm workspace at ${ctx.pm_root || "(unset)"} — run \`pm init\``,
|
|
389
|
+
},
|
|
390
|
+
];
|
|
391
|
+
// port_available is informational (in-use can be a healthy running server),
|
|
392
|
+
// so it does not gate overall readiness.
|
|
393
|
+
const ok = checks
|
|
394
|
+
.filter((c) => c.name !== "port_available")
|
|
395
|
+
.every((c) => c.ok);
|
|
396
|
+
const result = {
|
|
397
|
+
ok,
|
|
398
|
+
version: readPackageVersion(),
|
|
399
|
+
node: process.versions.node,
|
|
400
|
+
port: Number(port),
|
|
401
|
+
checks,
|
|
402
|
+
};
|
|
403
|
+
if (json) {
|
|
404
|
+
console.log(JSON.stringify(result, null, 2));
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
console.log(`pm-web doctor — overall: ${ok ? "OK" : "ISSUES"}`);
|
|
408
|
+
for (const c of checks) {
|
|
409
|
+
console.log(` [${c.ok ? "ok" : "!!"}] ${c.name}: ${c.detail}`);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return result;
|
|
413
|
+
},
|
|
414
|
+
});
|
|
415
|
+
// -----------------------------------------------------------------------
|
|
416
|
+
// services capability — intentionally NOT registered.
|
|
417
|
+
//
|
|
418
|
+
// The SDK's `registerService(name, override)` only accepts one of the eight
|
|
419
|
+
// fixed CORE service names (output_format, error_format, help_format,
|
|
420
|
+
// lock_acquire, lock_release, history_append, item_store_write,
|
|
421
|
+
// item_store_delete) and OVERRIDES that core service on every pm command.
|
|
422
|
+
// There is no API to register a new "pm-web lifecycle" service, and
|
|
423
|
+
// overriding a core service would alter/replace core output for unrelated
|
|
424
|
+
// commands. The pm-web server lifecycle is surfaced safely via the
|
|
425
|
+
// web/status/stop/doctor commands instead. The guarded block below
|
|
426
|
+
// documents the deliberate no-op; the "services" capability is therefore
|
|
427
|
+
// NOT declared in manifest.json.
|
|
428
|
+
if (typeof api.registerService === "function") {
|
|
429
|
+
// Deliberately register no service overrides — see comment above.
|
|
430
|
+
}
|
|
86
431
|
},
|
|
87
432
|
});
|
|
88
433
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,gEAAgE;AAEhE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,qFAAqF;AACrF,SAAS,eAAe,CAAI,CAAI,IAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AAsBlD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAElD,IAAI,aAAa,GAAoC,IAAI,CAAC;AAE1D,SAAS,yBAAyB;IAChC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACzF,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO;IAE1C,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE;QAC1D,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE;KAChD,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,OAAO,CAAC,KAAK,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,gDAAgD,OAAO,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,eAAe,eAAe,CAAC;IAC7B,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,OAAO;IAEhB,QAAQ,CAAC,GAAiB;QACxB,0EAA0E;QAC1E,kCAAkC;QAClC,0EAA0E;QAC1E,GAAG,CAAC,eAAe,CAAC;YAClB,IAAI,EAAE,KAAK;YACX,WAAW,EACT,6EAA6E;YAC/E,MAAM,EAAE,0BAA0B;YAClC,QAAQ,EAAE;gBACR,QAAQ;gBACR,oBAAoB;aACrB;YACD,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,mDAAmD,EAAE;gBACxG,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,kCAAkC,EAAE;aACtE;YACD,KAAK,CAAC,GAAG,CAAC,GAA0B;gBAClC,MAAM,IAAI,GAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;gBAC1F,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAE9C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBACxD,yBAAyB,EAAE,CAAC;gBAE5B,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,aAAa,EAAE,CAAC;wBAClB,OAAO,CAAC,KAAK,CAAC,kCAAkC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;wBACtE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,CAAC;oBAC/D,CAAC;oBAED,aAAa,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE;wBAC1C,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;wBAC3C,QAAQ,EAAE,IAAI;wBACd,KAAK,EAAE,QAAQ;qBAChB,CAAC,CAAC;oBAEH,aAAa,CAAC,KAAK,EAAE,CAAC;oBAEtB,OAAO,CAAC,KAAK,CAAC,0BAA0B,IAAI,SAAS,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;oBAC3E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,CAAC;gBAC3E,CAAC;gBAED,sDAAsD;gBACtD,OAAO,CAAC,KAAK,CAAC,2BAA2B,IAAI,GAAG,CAAC,CAAC;gBAClD,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE;oBACxC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;oBAC3C,KAAK,EAAE,SAAS;iBACjB,CAAC,CAAC;gBAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBAC1C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;wBAChC,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;4BAC9D,OAAO,EAAE,CAAC;4BACV,OAAO;wBACT,CAAC;wBACD,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,IAAI,UAAU,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;oBAC7E,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;gBAEH,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/admin.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Router } from "express";
|
|
2
2
|
import { pool } from "../db.js";
|
|
3
3
|
import { requireAuth } from "../middleware/auth.js";
|
|
4
|
+
import { routeParam } from "./route-params.js";
|
|
4
5
|
const router = Router();
|
|
5
6
|
router.use(requireAuth);
|
|
6
7
|
async function getAdminCount() {
|
|
@@ -79,7 +80,7 @@ router.patch("/users/:id", async (req, res) => {
|
|
|
79
80
|
return;
|
|
80
81
|
}
|
|
81
82
|
try {
|
|
82
|
-
const currentAdmin = await isUserAdmin(req
|
|
83
|
+
const currentAdmin = await isUserAdmin(routeParam(req, "id"));
|
|
83
84
|
if (currentAdmin && !isAdmin) {
|
|
84
85
|
const adminCount = await getAdminCount();
|
|
85
86
|
if (adminCount <= 1) {
|
|
@@ -89,12 +90,12 @@ router.patch("/users/:id", async (req, res) => {
|
|
|
89
90
|
}
|
|
90
91
|
const result = await pool.query(`UPDATE pm_users SET is_admin = $1, updated_at = NOW()
|
|
91
92
|
WHERE id = $2
|
|
92
|
-
RETURNING id, email, display_name, is_admin, github_token IS NOT NULL AS has_github_token, created_at, updated_at`, [isAdmin, req
|
|
93
|
+
RETURNING id, email, display_name, is_admin, github_token IS NOT NULL AS has_github_token, created_at, updated_at`, [isAdmin, routeParam(req, "id")]);
|
|
93
94
|
if (result.rows.length === 0) {
|
|
94
95
|
res.status(404).json({ error: "User not found" });
|
|
95
96
|
return;
|
|
96
97
|
}
|
|
97
|
-
await logAudit(req.user.userId, "user.update", `Set is_admin=${isAdmin} for user ${req
|
|
98
|
+
await logAudit(req.user.userId, "user.update", `Set is_admin=${isAdmin} for user ${routeParam(req, "id")}`);
|
|
98
99
|
res.json({ user: result.rows[0] });
|
|
99
100
|
}
|
|
100
101
|
catch (err) {
|
|
@@ -105,19 +106,19 @@ router.patch("/users/:id", async (req, res) => {
|
|
|
105
106
|
// DELETE /admin/users/:id — Delete a user and all their data
|
|
106
107
|
router.delete("/users/:id", async (req, res) => {
|
|
107
108
|
try {
|
|
108
|
-
if (await isUserAdmin(req
|
|
109
|
+
if (await isUserAdmin(routeParam(req, "id"))) {
|
|
109
110
|
const adminCount = await getAdminCount();
|
|
110
111
|
if (adminCount <= 1) {
|
|
111
112
|
res.status(409).json({ error: "Cannot delete the last admin user." });
|
|
112
113
|
return;
|
|
113
114
|
}
|
|
114
115
|
}
|
|
115
|
-
const result = await pool.query(`DELETE FROM pm_users WHERE id = $1 RETURNING id, email`, [req
|
|
116
|
+
const result = await pool.query(`DELETE FROM pm_users WHERE id = $1 RETURNING id, email`, [routeParam(req, "id")]);
|
|
116
117
|
if (result.rows.length === 0) {
|
|
117
118
|
res.status(404).json({ error: "User not found" });
|
|
118
119
|
return;
|
|
119
120
|
}
|
|
120
|
-
await logAudit(req.user.userId, "user.delete", `Deleted user ${result.rows[0].email} (${req
|
|
121
|
+
await logAudit(req.user.userId, "user.delete", `Deleted user ${result.rows[0].email} (${routeParam(req, "id")})`);
|
|
121
122
|
res.json({ ok: true, deleted: result.rows[0] });
|
|
122
123
|
}
|
|
123
124
|
catch (err) {
|
|
@@ -128,12 +129,12 @@ router.delete("/users/:id", async (req, res) => {
|
|
|
128
129
|
// DELETE /admin/projects/:id — Delete a project
|
|
129
130
|
router.delete("/projects/:id", async (req, res) => {
|
|
130
131
|
try {
|
|
131
|
-
const result = await pool.query(`DELETE FROM pm_projects WHERE id = $1 RETURNING id, name, slug`, [req
|
|
132
|
+
const result = await pool.query(`DELETE FROM pm_projects WHERE id = $1 RETURNING id, name, slug`, [routeParam(req, "id")]);
|
|
132
133
|
if (result.rows.length === 0) {
|
|
133
134
|
res.status(404).json({ error: "Project not found" });
|
|
134
135
|
return;
|
|
135
136
|
}
|
|
136
|
-
await logAudit(req.user.userId, "project.delete", `Deleted project ${result.rows[0].name} (${req
|
|
137
|
+
await logAudit(req.user.userId, "project.delete", `Deleted project ${result.rows[0].name} (${routeParam(req, "id")})`);
|
|
137
138
|
res.json({ ok: true, deleted: result.rows[0] });
|
|
138
139
|
}
|
|
139
140
|
catch (err) {
|
|
@@ -162,12 +163,12 @@ router.post("/groups", async (req, res) => {
|
|
|
162
163
|
// DELETE /admin/groups/:id — Delete a group
|
|
163
164
|
router.delete("/groups/:id", async (req, res) => {
|
|
164
165
|
try {
|
|
165
|
-
const result = await pool.query(`DELETE FROM pm_groups WHERE id = $1 RETURNING id, name`, [req
|
|
166
|
+
const result = await pool.query(`DELETE FROM pm_groups WHERE id = $1 RETURNING id, name`, [routeParam(req, "id")]);
|
|
166
167
|
if (result.rows.length === 0) {
|
|
167
168
|
res.status(404).json({ error: "Group not found" });
|
|
168
169
|
return;
|
|
169
170
|
}
|
|
170
|
-
await logAudit(req.user.userId, "group.delete", `Deleted group "${result.rows[0].name}" (${req
|
|
171
|
+
await logAudit(req.user.userId, "group.delete", `Deleted group "${result.rows[0].name}" (${routeParam(req, "id")})`);
|
|
171
172
|
res.json({ ok: true, deleted: result.rows[0] });
|
|
172
173
|
}
|
|
173
174
|
catch (err) {
|
package/dist/routes/admin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/routes/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoC,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,WAAW,EAAoB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/routes/admin.ts"],"names":[],"mappings":"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"}
|