mdmaid-desk 0.1.0 → 0.1.2

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/README.md CHANGED
@@ -27,18 +27,22 @@ The repository contains the first usable shared-service vertical slice:
27
27
  - Server-Sent Event refreshes for both clients;
28
28
  - atomic, user-only daemon discovery state so the TUI reuses a running service;
29
29
  - memorable `http://mdmaid.desk.localhost:43127/` browser origin;
30
- - `workspace`, `register`, `list`, `web`, and `tui` commands.
30
+ - daemon-first CLI writes with daemonless SQLite fallback;
31
+ - explicit start, status, stop, login-service install, and uninstall lifecycle;
32
+ - selectable ports with automatic available-port fallback;
33
+ - `workspace`, `register`, `list`, `web`, `tui`, and `daemon` commands.
31
34
 
32
- Background `daemon ensure/status/stop`, directory watching, stdin-managed
33
- enqueue, comments, and editing remain planned milestones. `web` currently runs
34
- the persistent service in the foreground; `tui` attaches to it when present and
35
- uses an embedded loopback service otherwise.
35
+ Directory watching, stdin-managed enqueue, comments, and editing remain planned
36
+ milestones. Document registration works without a daemon, but automatically
37
+ uses its authenticated API when one is running. `web` reuses a daemon or runs
38
+ the service in the foreground; `tui` attaches to it when present and uses a
39
+ session-scoped embedded loopback service otherwise.
36
40
 
37
41
  ## Responsibility
38
42
 
39
43
  `mdmaid.desk` owns:
40
44
 
41
- - the persistent local daemon;
45
+ - the persistent catalog and optional local daemon;
42
46
  - workspace and document catalogs;
43
47
  - artifact-directory discovery;
44
48
  - stable document URLs;
@@ -117,8 +121,10 @@ Register a document:
117
121
  node dist/cli.js register /path/to/repository/docs/plan.md \
118
122
  --workspace example \
119
123
  --task PROJECT-123 \
124
+ --producer codex \
120
125
  --kind plan \
121
- --attention approval
126
+ --attention approval \
127
+ --tag architecture
122
128
  ```
123
129
 
124
130
  List documents:
@@ -154,6 +160,34 @@ same port as the service.
154
160
 
155
161
  See [Local browser URL](docs/LOCAL_WEB.md) for details.
156
162
 
163
+ Run an optional background daemon once:
164
+
165
+ ```bash
166
+ mdmaid-desk daemon start
167
+ mdmaid-desk daemon status
168
+ mdmaid-desk web
169
+ mdmaid-desk daemon stop
170
+ ```
171
+
172
+ The default port is `43127`. If it is occupied, an unpinned daemon selects an
173
+ available loopback port; `daemon start` and `daemon status` print the actual
174
+ port and authenticated web URL. Pin one when desired:
175
+
176
+ ```bash
177
+ mdmaid-desk daemon start --port 43210
178
+ ```
179
+
180
+ To start mdmaid.desk automatically at login, explicitly install its user
181
+ service (LaunchAgent on macOS, systemd user service on Linux):
182
+
183
+ ```bash
184
+ mdmaid-desk daemon install
185
+ # or: mdmaid-desk daemon install --port 43210
186
+ mdmaid-desk daemon uninstall
187
+ ```
188
+
189
+ Registration never installs or permanently starts the daemon.
190
+
157
191
  Run the terminal workspace:
158
192
 
159
193
  ```bash
@@ -170,7 +204,8 @@ The default state directory is:
170
204
  ${XDG_STATE_HOME:-~/.local/state}/mdmaid.desk/
171
205
  auth-token
172
206
  catalog.sqlite3
173
- daemon.json # present while the web service is running
207
+ daemon.json # present while a foreground or background service is running
208
+ daemon.log
174
209
  ```
175
210
 
176
211
  ## Target Interaction
@@ -1,7 +1,8 @@
1
- import type { DocumentAction, HealthData, PublicDocument, PublicWorkspace, TerminalRenderPreferences, TerminalRender, WebRender } from "./api-types.js";
1
+ import type { DocumentAction, DocumentRegistration, HealthData, PublicDocument, PublicWorkspace, TerminalRenderPreferences, TerminalRender, WebRender, WorkspaceRegistration } from "./api-types.js";
2
2
  export interface CatalogEvent {
3
3
  action: string;
4
- documentId: string;
4
+ documentId?: string;
5
+ workspaceId?: string;
5
6
  }
6
7
  export interface CatalogSubscriptionOptions {
7
8
  signal?: AbortSignal;
@@ -13,6 +14,8 @@ export declare class DeskApiClient {
13
14
  health(signal?: AbortSignal): Promise<HealthData>;
14
15
  listDocuments(): Promise<PublicDocument[]>;
15
16
  listWorkspaces(): Promise<PublicWorkspace[]>;
17
+ addWorkspace(input: WorkspaceRegistration): Promise<PublicWorkspace>;
18
+ registerDocument(input: DocumentRegistration): Promise<PublicDocument>;
16
19
  renderDocument(id: string, target: "terminal", width?: number, preferences?: TerminalRenderPreferences): Promise<TerminalRender>;
17
20
  renderDocument(id: string, target: "web", width?: number): Promise<WebRender>;
18
21
  act(id: string, action: DocumentAction): Promise<PublicDocument>;
@@ -40,6 +40,26 @@ export class DeskApiClient {
40
40
  }
41
41
  return value;
42
42
  }
43
+ async addWorkspace(input) {
44
+ const value = await this.#request("/api/v1/workspaces", {
45
+ method: "POST",
46
+ body: input,
47
+ });
48
+ if (!isPublicWorkspace(value)) {
49
+ throw new Error("Daemon returned an invalid workspace response");
50
+ }
51
+ return value;
52
+ }
53
+ async registerDocument(input) {
54
+ const value = await this.#request("/api/v1/documents", {
55
+ method: "POST",
56
+ body: input,
57
+ });
58
+ if (!isPublicDocument(value)) {
59
+ throw new Error("Daemon returned an invalid document response");
60
+ }
61
+ return value;
62
+ }
43
63
  async renderDocument(id, target, width = 100, preferences = {}) {
44
64
  assertDocumentId(id);
45
65
  if (!Number.isSafeInteger(width) || width < 20 || width > 1_000) {
@@ -121,11 +141,19 @@ export class DeskApiClient {
121
141
  }
122
142
  async #request(path, options = {}) {
123
143
  const authenticated = options.authenticated ?? true;
144
+ const headers = {};
145
+ if (authenticated) {
146
+ headers.authorization = `Bearer ${this.#token}`;
147
+ }
148
+ if (options.body !== undefined) {
149
+ headers["content-type"] = "application/json";
150
+ }
124
151
  const response = await fetch(`${this.#baseUrl}${path}`, {
125
152
  method: options.method ?? "GET",
126
- ...(authenticated
127
- ? { headers: { authorization: `Bearer ${this.#token}` } }
128
- : {}),
153
+ ...(Object.keys(headers).length > 0 ? { headers } : {}),
154
+ ...(options.body === undefined
155
+ ? {}
156
+ : { body: JSON.stringify(options.body) }),
129
157
  ...(options.signal === undefined ? {} : { signal: options.signal }),
130
158
  });
131
159
  let body;
@@ -235,11 +263,24 @@ function dispatchEventBlock(block, listener, onReady) {
235
263
  }
236
264
  if (!isRecord(value) ||
237
265
  typeof value.action !== "string" ||
238
- typeof value.documentId !== "string" ||
239
- !/^doc-[a-f0-9]{20}$/.test(value.documentId)) {
266
+ (value.documentId !== undefined &&
267
+ (typeof value.documentId !== "string" ||
268
+ !/^doc-[a-f0-9]{20}$/.test(value.documentId))) ||
269
+ (value.workspaceId !== undefined &&
270
+ (typeof value.workspaceId !== "string" ||
271
+ !/^[a-z0-9][a-z0-9-]{0,63}$/.test(value.workspaceId))) ||
272
+ (value.documentId === undefined && value.workspaceId === undefined)) {
240
273
  throw new Error("Daemon returned an invalid catalog event");
241
274
  }
242
- listener({ action: value.action, documentId: value.documentId });
275
+ listener({
276
+ action: value.action,
277
+ ...(value.documentId === undefined
278
+ ? {}
279
+ : { documentId: value.documentId }),
280
+ ...(value.workspaceId === undefined
281
+ ? {}
282
+ : { workspaceId: value.workspaceId }),
283
+ });
243
284
  }
244
285
  function optionalString(value) {
245
286
  return value === undefined || typeof value === "string";
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,22 @@ export interface PublicWorkspace {
25
25
  documentCount: number;
26
26
  route: string;
27
27
  }
28
+ export interface WorkspaceRegistration {
29
+ id: string;
30
+ name: string;
31
+ root: string;
32
+ artifactRoots: string[];
33
+ }
34
+ export interface DocumentRegistration {
35
+ workspaceId: string;
36
+ taskId?: string;
37
+ producer?: string;
38
+ kind: DocumentKind;
39
+ title: string;
40
+ path: string;
41
+ attention: Attention;
42
+ tags?: string[];
43
+ }
28
44
  export interface HealthData {
29
45
  service: "mdmaid.desk";
30
46
  status: "ok";
package/dist/cli.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { DeskApiClient } from "./api-client.js";
3
+ import { type DaemonConnection } from "./daemon-state.js";
3
4
  import { type DeskServerOptions, type RunningDeskServer } from "./server.js";
4
5
  interface Writer {
5
6
  write(value: string): unknown;
@@ -7,9 +8,15 @@ interface Writer {
7
8
  export interface RunOptions {
8
9
  statePath?: string;
9
10
  connectDaemon?: (statePath: string) => Promise<DeskApiClient | undefined>;
11
+ connectDaemonInfo?: (statePath: string) => Promise<DaemonConnection | undefined>;
12
+ startDaemon?: (statePath: string, port?: number) => Promise<DaemonConnection>;
13
+ stopDaemon?: (statePath: string) => Promise<boolean>;
14
+ installUserService?: (statePath: string, port?: number) => Promise<unknown>;
15
+ uninstallUserService?: (statePath: string) => Promise<unknown>;
10
16
  startServer?: (options: DeskServerOptions) => Promise<RunningDeskServer>;
11
17
  runTui?: (client: DeskApiClient) => Promise<void>;
12
18
  waitForShutdown?: (server: RunningDeskServer) => Promise<void>;
19
+ allowPortFallback?: boolean;
13
20
  }
14
21
  export declare function run(args: string[], stdout: Writer, stderr: Writer, options?: RunOptions): Promise<number>;
15
22
  export declare function isEntrypoint(moduleUrl: string, entryPath: string): boolean;
package/dist/cli.js CHANGED
@@ -5,11 +5,13 @@ import { basename, join, resolve } from "node:path";
5
5
  import { fileURLToPath, pathToFileURL } from "node:url";
6
6
  import { Catalog, } from "./catalog.js";
7
7
  import { DeskApiClient } from "./api-client.js";
8
- import { connectToDaemon, daemonDescriptorPath, descriptorForServer, removeDaemonDescriptor, writeDaemonDescriptor, } from "./daemon-state.js";
8
+ import { connectToDaemon, connectToDaemonInfo, daemonDescriptorPath, descriptorForServer, removeDaemonDescriptor, writeDaemonDescriptor, } from "./daemon-state.js";
9
+ import { startDaemon as startBackgroundDaemon, stopDaemon as stopBackgroundDaemon, } from "./daemon-lifecycle.js";
9
10
  import { normalizePublicUrl, startDeskServer, } from "./server.js";
10
11
  import { readOrCreateAuthToken } from "./auth-state.js";
11
12
  import { readPackageVersion } from "./package-info.js";
12
13
  import { runTui as runTerminalWorkspace } from "./tui.js";
14
+ import { installUserService as installLoginService, uninstallUserService as uninstallLoginService, } from "./user-service.js";
13
15
  const DOCUMENT_KINDS = new Set([
14
16
  "definition",
15
17
  "brief",
@@ -40,15 +42,21 @@ Usage:
40
42
  [--artifact-root <path> ...]
41
43
  mdmaid-desk workspace list
42
44
  mdmaid-desk register <file.md> --workspace <id>
43
- [--task <id>] [--kind <kind>] [--title <title>]
44
- [--attention <state>]
45
+ [--task <id>] [--producer <name>] [--kind <kind>] [--title <title>]
46
+ [--attention <state>] [--tag <tag> ...]
45
47
  mdmaid-desk list [--workspace <id>] [--task <id>]
46
48
  mdmaid-desk web [--port <port>]
47
49
  [--public-url <http[s]://name.localhost[:port]>]
48
50
  mdmaid-desk tui
51
+ mdmaid-desk daemon start [--port <port>]
52
+ mdmaid-desk daemon status
53
+ mdmaid-desk daemon stop
54
+ mdmaid-desk daemon install [--port <port>]
55
+ mdmaid-desk daemon uninstall
49
56
  `;
50
57
  class UsageError extends Error {
51
58
  }
59
+ const silentWriter = { write: () => undefined };
52
60
  export async function run(args, stdout, stderr, options = {}) {
53
61
  try {
54
62
  if (args.length === 0 ||
@@ -63,25 +71,64 @@ export async function run(args, stdout, stderr, options = {}) {
63
71
  stdout.write(`${readPackageVersion()}\n`);
64
72
  return 0;
65
73
  }
66
- const statePath = options.statePath ?? defaultStatePath();
74
+ let statePath = options.statePath ?? defaultStatePath();
75
+ if (args[0] === "__daemon-serve") {
76
+ const internal = parseArguments(args.slice(1));
77
+ rejectUnknownOptions(internal, new Set(["state-path", "port"]));
78
+ if (internal.positionals.length > 0) {
79
+ throw new UsageError("invalid internal daemon arguments");
80
+ }
81
+ statePath = firstOption(internal, "state-path") ?? statePath;
82
+ const port = firstOption(internal, "port");
83
+ const webArgs = port === undefined ? [] : ["--port", port];
84
+ const catalog = await Catalog.open(statePath);
85
+ try {
86
+ return await runWeb(catalog, statePath, webArgs, silentWriter, {
87
+ ...options,
88
+ allowPortFallback: port === undefined,
89
+ });
90
+ }
91
+ finally {
92
+ catalog.close();
93
+ }
94
+ }
67
95
  if (args[0] === "tui") {
68
96
  return await runTerminal(statePath, args.slice(1), options);
69
97
  }
98
+ if (args[0] === "daemon") {
99
+ return await runDaemon(statePath, args.slice(1), stdout, options);
100
+ }
101
+ if (args[0] === "web") {
102
+ if (args.length === 1) {
103
+ const running = await (options.connectDaemonInfo ?? connectToDaemonInfo)(statePath);
104
+ if (running) {
105
+ stdout.write(`mdmaid.desk web: ${daemonWebUrl(running)}\n`);
106
+ return 0;
107
+ }
108
+ }
109
+ const catalog = await Catalog.open(statePath);
110
+ try {
111
+ return await runWeb(catalog, statePath, args.slice(1), stdout, options);
112
+ }
113
+ finally {
114
+ catalog.close();
115
+ }
116
+ }
117
+ if (args[0] === "workspace" && args[1] === "add") {
118
+ return await runWorkspaceAdd(statePath, args.slice(2), stdout, options);
119
+ }
120
+ if (args[0] === "register") {
121
+ return await runRegister(statePath, args.slice(1), stdout, options);
122
+ }
70
123
  const catalog = await Catalog.open(statePath);
71
124
  try {
72
125
  const command = args[0];
73
126
  if (command === "workspace") {
74
- return await runWorkspace(catalog, args.slice(1), stdout);
75
- }
76
- if (command === "register") {
77
- return await runRegister(catalog, args.slice(1), stdout);
127
+ return runWorkspaceList(catalog, args.slice(1), stdout);
78
128
  }
79
129
  if (command === "list") {
80
130
  return runList(catalog, args.slice(1), stdout);
81
131
  }
82
- if (command === "web") {
83
- return await runWeb(catalog, statePath, args.slice(1), stdout, options);
84
- }
85
132
  throw new UsageError(`unknown command ${command}`);
86
133
  }
87
134
  finally {
@@ -107,23 +154,40 @@ async function runWeb(catalog, statePath, args, stdout, options) {
107
154
  const configuredPublicUrl = parsePublicUrl(firstOption(parsed, "public-url"));
108
155
  const configuredPort = firstOption(parsed, "port");
109
156
  const port = parsePort(configuredPort ?? inferDirectHttpPort(configuredPublicUrl) ?? "43127");
110
- const publicUrl = configuredPublicUrl ?? `http://mdmaid.desk.localhost:${port}`;
111
- validateDirectHttpPort(publicUrl, port);
157
+ const publicUrl = configuredPublicUrl ??
158
+ (port === 0 ? undefined : `http://mdmaid.desk.localhost:${port}`);
159
+ if (publicUrl !== undefined) {
160
+ validateDirectHttpPort(publicUrl, port);
161
+ }
112
162
  const token = await readOrCreateAuthToken(statePath);
113
163
  const startServer = options.startServer ?? startDeskServer;
114
- const server = await startServer({
115
- catalog,
116
- host: "127.0.0.1",
117
- port,
118
- token,
119
- ...(publicUrl ? { publicUrl } : {}),
120
- });
164
+ let server;
165
+ try {
166
+ server = await startServer({
167
+ catalog,
168
+ host: "127.0.0.1",
169
+ port,
170
+ token,
171
+ ...(publicUrl ? { publicUrl } : {}),
172
+ });
173
+ }
174
+ catch (error) {
175
+ if (!options.allowPortFallback || !isAddressInUse(error)) {
176
+ throw error;
177
+ }
178
+ server = await startServer({
179
+ catalog,
180
+ host: "127.0.0.1",
181
+ port: 0,
182
+ token,
183
+ });
184
+ }
121
185
  const descriptor = descriptorForServer(server);
122
186
  const descriptorPath = daemonDescriptorPath(statePath);
123
187
  try {
124
188
  await writeDaemonDescriptor(descriptorPath, descriptor);
125
189
  stdout.write(`mdmaid.desk web: ${server.webUrl}\n`);
126
- if (publicUrl.startsWith("https://")) {
190
+ if (publicUrl?.startsWith("https://")) {
127
191
  stdout.write(`proxy target: ${server.url}\n`);
128
192
  }
129
193
  stdout.write("Press Ctrl-C to stop the local service.\n");
@@ -165,6 +229,60 @@ async function runTerminal(statePath, args, options) {
165
229
  }
166
230
  return 0;
167
231
  }
232
+ async function runDaemon(statePath, args, stdout, options) {
233
+ const action = args[0];
234
+ if (!action) {
235
+ throw new UsageError("daemon action must be start, status, stop, install, or uninstall");
236
+ }
237
+ const parsed = parseArguments(args.slice(1));
238
+ if (parsed.positionals.length > 0) {
239
+ throw new UsageError(`${action} accepts options only`);
240
+ }
241
+ if (action === "start") {
242
+ rejectUnknownOptions(parsed, new Set(["port"]));
243
+ const selected = firstOption(parsed, "port");
244
+ const port = selected === undefined ? undefined : parsePort(selected);
245
+ const connection = await (options.startDaemon ?? startBackgroundDaemon)(statePath, port);
246
+ stdout.write(`daemon started (pid ${connection.descriptor.pid}, port ${connection.descriptor.port})\n`);
247
+ stdout.write(`mdmaid.desk web: ${daemonWebUrl(connection)}\n`);
248
+ return 0;
249
+ }
250
+ if (action === "status") {
251
+ rejectUnknownOptions(parsed, new Set());
252
+ const connection = await (options.connectDaemonInfo ?? connectToDaemonInfo)(statePath);
253
+ if (!connection) {
254
+ stdout.write("daemon stopped\n");
255
+ return 1;
256
+ }
257
+ stdout.write(`daemon running (pid ${connection.descriptor.pid}, port ${connection.descriptor.port})\n`);
258
+ stdout.write(`mdmaid.desk web: ${daemonWebUrl(connection)}\n`);
259
+ return 0;
260
+ }
261
+ if (action === "stop") {
262
+ rejectUnknownOptions(parsed, new Set());
263
+ const stopped = await (options.stopDaemon ?? stopBackgroundDaemon)(statePath);
264
+ stdout.write(stopped ? "daemon stopped\n" : "daemon already stopped\n");
265
+ return 0;
266
+ }
267
+ if (action === "install") {
268
+ rejectUnknownOptions(parsed, new Set(["port"]));
269
+ const selected = firstOption(parsed, "port");
270
+ const port = selected === undefined ? undefined : parsePort(selected);
271
+ await (options.installUserService ?? installLoginService)(statePath, port);
272
+ stdout.write("user service installed and started\n");
273
+ return 0;
274
+ }
275
+ if (action === "uninstall") {
276
+ rejectUnknownOptions(parsed, new Set());
277
+ await (options.uninstallUserService ?? uninstallLoginService)(statePath);
278
+ stdout.write("user service uninstalled\n");
279
+ return 0;
280
+ }
281
+ throw new UsageError("daemon action must be start, status, stop, install, or uninstall");
282
+ }
283
+ function daemonWebUrl(connection) {
284
+ return `http://mdmaid.desk.localhost:${connection.descriptor.port}/?token=${encodeURIComponent(connection.descriptor.token)}`;
285
+ }
168
286
  function parsePort(value) {
169
287
  if (!/^\d+$/.test(value)) {
170
288
  throw new UsageError("port must be an integer between 0 and 65535");
@@ -212,7 +330,7 @@ function waitForShutdown(_server) {
212
330
  process.once("SIGTERM", finish);
213
331
  });
214
332
  }
215
- async function runWorkspace(catalog, args, stdout) {
333
+ function runWorkspaceList(catalog, args, stdout) {
216
334
  const action = args[0];
217
335
  if (action === "list") {
218
336
  for (const workspace of catalog.listWorkspaces()) {
@@ -220,10 +338,10 @@ async function runWorkspace(catalog, args, stdout) {
220
338
  }
221
339
  return 0;
222
340
  }
223
- if (action !== "add") {
224
- throw new UsageError("workspace action must be add or list");
225
- }
226
- const parsed = parseArguments(args.slice(1));
341
+ throw new UsageError("workspace action must be add or list");
342
+ }
343
+ async function runWorkspaceAdd(statePath, args, stdout, options) {
344
+ const parsed = parseArguments(args);
227
345
  const root = parsed.positionals[0];
228
346
  if (!root) {
229
347
  throw new UsageError("workspace root is required");
@@ -235,16 +353,29 @@ async function runWorkspace(catalog, args, stdout) {
235
353
  const name = firstOption(parsed, "name") ?? id;
236
354
  const artifactRoots = parsed.options.get("artifact-root") ?? [root];
237
355
  rejectUnknownOptions(parsed, new Set(["id", "name", "artifact-root"]));
238
- const workspace = await catalog.addWorkspace({
356
+ const input = {
239
357
  id,
240
358
  name,
241
359
  root,
242
360
  artifactRoots,
243
- });
244
- stdout.write(`workspace ${workspace.id} added: ${workspace.root}\n`);
361
+ };
362
+ const client = await (options.connectDaemon ?? connectToDaemon)(statePath);
363
+ if (client) {
364
+ await client.addWorkspace(input);
365
+ }
366
+ else {
367
+ const catalog = await Catalog.open(statePath);
368
+ try {
369
+ await catalog.addWorkspace(input);
370
+ }
371
+ finally {
372
+ catalog.close();
373
+ }
374
+ }
375
+ stdout.write(`workspace ${id} added: ${root}\n`);
245
376
  return 0;
246
377
  }
247
- async function runRegister(catalog, args, stdout) {
378
+ async function runRegister(statePath, args, stdout, options) {
248
379
  const parsed = parseArguments(args);
249
380
  const path = parsed.positionals[0];
250
381
  if (!path) {
@@ -253,7 +384,15 @@ async function runRegister(catalog, args, stdout) {
253
384
  if (parsed.positionals.length > 1) {
254
385
  throw new UsageError("register accepts one document path");
255
386
  }
256
- rejectUnknownOptions(parsed, new Set(["workspace", "task", "kind", "title", "attention"]));
387
+ rejectUnknownOptions(parsed, new Set([
388
+ "workspace",
389
+ "task",
390
+ "producer",
391
+ "kind",
392
+ "title",
393
+ "attention",
394
+ "tag",
395
+ ]));
257
396
  const kind = (firstOption(parsed, "kind") ?? "other");
258
397
  if (!DOCUMENT_KINDS.has(kind)) {
259
398
  throw new UsageError(`unknown document kind ${kind}`);
@@ -264,15 +403,33 @@ async function runRegister(catalog, args, stdout) {
264
403
  throw new UsageError(`unknown attention state ${attention}`);
265
404
  }
266
405
  const taskId = firstOption(parsed, "task");
267
- const document = await catalog.registerDocument({
406
+ const producer = firstOption(parsed, "producer");
407
+ const tags = parsed.options.get("tag");
408
+ const input = {
268
409
  workspaceId: requiredOption(parsed, "workspace"),
269
410
  ...(taskId ? { taskId } : {}),
411
+ ...(producer ? { producer } : {}),
270
412
  kind,
271
413
  title: firstOption(parsed, "title") ?? basename(path, ".md"),
272
414
  path,
273
415
  attention,
274
- });
275
- stdout.write(`registered ${document.id}: ${document.path}\n`);
416
+ ...(tags === undefined ? {} : { tags }),
417
+ };
418
+ const client = await (options.connectDaemon ?? connectToDaemon)(statePath);
419
+ let id;
420
+ if (client) {
421
+ id = (await client.registerDocument(input)).id;
422
+ }
423
+ else {
424
+ const catalog = await Catalog.open(statePath);
425
+ try {
426
+ id = (await catalog.registerDocument(input)).id;
427
+ }
428
+ finally {
429
+ catalog.close();
430
+ }
431
+ }
432
+ stdout.write(`registered ${id}: ${path}\n`);
276
433
  return 0;
277
434
  }
278
435
  function runList(catalog, args, stdout) {
@@ -346,11 +503,16 @@ function rejectUnknownOptions(parsed, allowed) {
346
503
  if (!allowed.has(name)) {
347
504
  throw new UsageError(`unknown option --${name}`);
348
505
  }
349
- if (name !== "artifact-root" && values.length > 1) {
506
+ if (name !== "artifact-root" && name !== "tag" && values.length > 1) {
350
507
  throw new UsageError(`option --${name} may be used only once`);
351
508
  }
352
509
  }
353
510
  }
511
+ function isAddressInUse(error) {
512
+ return (error instanceof Error &&
513
+ "code" in error &&
514
+ error.code === "EADDRINUSE");
515
+ }
354
516
  function defaultStatePath() {
355
517
  const stateHome = process.env.XDG_STATE_HOME ?? join(homedir(), ".local", "state");
356
518
  return resolve(stateHome, "mdmaid.desk", "catalog.sqlite3");