cimux-mcp 0.2.0 → 0.2.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.
Files changed (77) hide show
  1. package/README.md +57 -13
  2. package/dist/bin.js +10 -1
  3. package/dist/bin.js.map +1 -1
  4. package/dist/cli/cimux-cli.d.ts +2 -9
  5. package/dist/cli/cimux-cli.js +62 -201
  6. package/dist/cli/cimux-cli.js.map +1 -1
  7. package/dist/cli/commands/ack.d.ts +2 -0
  8. package/dist/cli/commands/ack.js +24 -0
  9. package/dist/cli/commands/ack.js.map +1 -0
  10. package/dist/cli/commands/brief.d.ts +2 -0
  11. package/dist/cli/commands/brief.js +33 -0
  12. package/dist/cli/commands/brief.js.map +1 -0
  13. package/dist/cli/commands/check.d.ts +2 -0
  14. package/dist/cli/commands/check.js +24 -0
  15. package/dist/cli/commands/check.js.map +1 -0
  16. package/dist/cli/commands/install.d.ts +2 -0
  17. package/dist/cli/commands/install.js +55 -0
  18. package/dist/cli/commands/install.js.map +1 -0
  19. package/dist/cli/commands/mailboxes.d.ts +2 -0
  20. package/dist/cli/commands/mailboxes.js +14 -0
  21. package/dist/cli/commands/mailboxes.js.map +1 -0
  22. package/dist/cli/commands/mcp.d.ts +2 -0
  23. package/dist/cli/commands/mcp.js +11 -0
  24. package/dist/cli/commands/mcp.js.map +1 -0
  25. package/dist/cli/commands/notify.d.ts +2 -0
  26. package/dist/cli/commands/notify.js +24 -0
  27. package/dist/cli/commands/notify.js.map +1 -0
  28. package/dist/cli/commands/read.d.ts +2 -0
  29. package/dist/cli/commands/read.js +21 -0
  30. package/dist/cli/commands/read.js.map +1 -0
  31. package/dist/cli/commands/register.d.ts +2 -0
  32. package/dist/cli/commands/register.js +27 -0
  33. package/dist/cli/commands/register.js.map +1 -0
  34. package/dist/cli/commands/send.d.ts +2 -0
  35. package/dist/cli/commands/send.js +37 -0
  36. package/dist/cli/commands/send.js.map +1 -0
  37. package/dist/cli/shared.d.ts +36 -0
  38. package/dist/cli/shared.js +71 -0
  39. package/dist/cli/shared.js.map +1 -0
  40. package/dist/index.d.ts +4 -3
  41. package/dist/index.js +2 -2
  42. package/dist/index.js.map +1 -1
  43. package/dist/install/cimux-install-plan.d.ts +5 -1
  44. package/dist/install/cimux-install-plan.js +37 -108
  45. package/dist/install/cimux-install-plan.js.map +1 -1
  46. package/dist/install/harnesses/claude.d.ts +2 -0
  47. package/dist/install/harnesses/claude.js +27 -0
  48. package/dist/install/harnesses/claude.js.map +1 -0
  49. package/dist/install/harnesses/codex.d.ts +2 -0
  50. package/dist/install/harnesses/codex.js +26 -0
  51. package/dist/install/harnesses/codex.js.map +1 -0
  52. package/dist/install/harnesses/cursor.d.ts +2 -0
  53. package/dist/install/harnesses/cursor.js +46 -0
  54. package/dist/install/harnesses/cursor.js.map +1 -0
  55. package/dist/install/harnesses/index.d.ts +5 -0
  56. package/dist/install/harnesses/index.js +16 -0
  57. package/dist/install/harnesses/index.js.map +1 -0
  58. package/dist/install/harnesses/shared.d.ts +26 -0
  59. package/dist/install/harnesses/shared.js +43 -0
  60. package/dist/install/harnesses/shared.js.map +1 -0
  61. package/dist/mcp/cimux-mcp-server.js +1 -1
  62. package/dist/mcp/cimux-mcp-server.js.map +1 -1
  63. package/dist/{registration/mailbox-registration.d.ts → naming/mailbox-naming.d.ts} +21 -0
  64. package/dist/naming/mailbox-naming.js +96 -0
  65. package/dist/naming/mailbox-naming.js.map +1 -0
  66. package/dist/service/cimux-mailbox-service.d.ts +1 -1
  67. package/dist/service/cimux-mailbox-service.js +5 -3
  68. package/dist/service/cimux-mailbox-service.js.map +1 -1
  69. package/dist/version.d.ts +1 -1
  70. package/dist/version.js +1 -1
  71. package/package.json +1 -2
  72. package/dist/registration/mailbox-registration.js +0 -48
  73. package/dist/registration/mailbox-registration.js.map +0 -1
  74. package/dist/runtime/mailbox-runtime.d.ts +0 -22
  75. package/dist/runtime/mailbox-runtime.js +0 -50
  76. package/dist/runtime/mailbox-runtime.js.map +0 -1
  77. package/docs/mvp-readiness.md +0 -85
package/README.md CHANGED
@@ -1,9 +1,39 @@
1
1
  # Cimux
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/cimux-mcp)](https://www.npmjs.com/package/cimux-mcp)
4
+ [![CI](https://github.com/jackkslash/cimux/actions/workflows/ci.yml/badge.svg)](https://github.com/jackkslash/cimux/actions/workflows/ci.yml)
5
+
3
6
  Local-first mailboxes for intentional AI agent context handoffs.
4
7
 
5
8
  Cimux gives concurrent coding agents a simple way to pass context without dumping every detail into every session. A sender creates a structured Context Package, addressed to a mailbox such as `codex/backend-auth` or `claude/frontend-login`. The receiver can preview the inbox cheaply, read the full package only when it matters, and ack it after loading.
6
9
 
10
+ ## What it looks like
11
+
12
+ One agent finishes a piece of work and hands off:
13
+
14
+ ```text
15
+ Codex session Claude Code session
16
+ ───────────────── ────────────────────
17
+ send_context ──────────────────────▶ (user types anything)
18
+ to: claude/frontend-login hook: "Cimux: 1 unread context
19
+ title: Login bug root cause package(s) for claude/frontend-login
20
+ summary: Session cookie dropped from codex/backend-auth. Call
21
+ on redirect check_inbox to preview."
22
+ artifacts: 2 files, 1 commit
23
+ check_inbox → preview (~40 tokens)
24
+ read_context → full body + artifacts
25
+ ack_context → sender can see it landed
26
+ ```
27
+
28
+ The receiver's context stays clean until the moment the handoff actually matters. Empty inboxes cost zero tokens — the hook prints nothing.
29
+
30
+ ## Why not just a shared notes file?
31
+
32
+ - **Token discipline.** A shared markdown file gets pasted into sessions whole. Cimux previews keep each unread handoff to a ~40-token summary until an agent decides to read it — bodies, code snippets, and payloads never enter context uninvited.
33
+ - **Delivery state.** Files can't tell you whether the other agent ever saw the note. Every Context Package tracks read and acknowledged state (first write wins, safe across concurrent processes), so a handoff is a receipt, not a hope.
34
+ - **Addressing.** Mailboxes are per harness and workstream (`codex/backend-auth`), inferred automatically from the git branch — parallel agents don't trample one shared document.
35
+ - **Cross-harness, repo-clean.** Works between Claude Code, Codex (app or CLI), and Cursor through one local SQLite database in `~/.cimux/` — nothing gets committed to your repo.
36
+
7
37
  The product idea is intentionally small:
8
38
 
9
39
  - anyone can send to an existing mailbox
@@ -18,25 +48,28 @@ The product idea is intentionally small:
18
48
  Included now:
19
49
 
20
50
  - Context Package schema
21
- - SQLite storage
51
+ - SQLite storage (WAL, safe for concurrent sessions)
22
52
  - mailbox registration and name inference
23
53
  - MCP server with mailbox tools
24
- - zero-token notification command
54
+ - zero-token notification hook and session-start briefing
55
+ - agent norms installed to `CLAUDE.md`/`AGENTS.md` so agents hand off without prompting
25
56
  - safe installer for Codex and Claude config targets
26
57
  - local CLI commands for debugging and demos
58
+ - prototype read-only mail viewer (`node scripts/mail-viewer.mjs`)
27
59
 
28
60
  Not included yet:
29
61
 
62
+ - message or mailbox deletion
30
63
  - hosted SaaS mode
31
64
  - vector search or embeddings
32
65
  - automatic routing
33
66
  - remote auth
34
- - read-only inspector UI
35
-
36
- See [docs/mvp-readiness.md](docs/mvp-readiness.md) for the release checklist and known limits.
67
+ - polished inspector UI (`cimux ui`)
37
68
 
38
69
  ## Install
39
70
 
71
+ Requires Node >= 22.13 (Cimux uses the built-in `node:sqlite` — no native dependencies).
72
+
40
73
  From npm (package `cimux-mcp`, command `cimux`):
41
74
 
42
75
  ```bash
@@ -45,6 +78,19 @@ cimux install --dry-run
45
78
  cimux install
46
79
  ```
47
80
 
81
+ `cimux install` detects which harnesses are on your machine and writes config only for those (`--harness <name>` for one, `--all` for every supported harness):
82
+
83
+ | | Claude Code | Codex (app or CLI) | Cursor |
84
+ | --- | --- | --- | --- |
85
+ | MCP server | `~/.claude.json` | `~/.codex/config.toml` | `~/.cursor/mcp.json` |
86
+ | Hooks | notify + brief, `~/.claude/settings.json` | notify + brief, `~/.codex/hooks.json` | session brief, `~/.cursor/hooks.json` |
87
+ | Agent norms | `~/.claude/CLAUDE.md` | `~/.codex/AGENTS.md` | — (via session brief) |
88
+
89
+ Harness notes:
90
+
91
+ - Codex asks you to trust the hooks once (and again after any change to them) — that's Codex's own safety prompt, expected behavior.
92
+ - Cursor has no context-injecting per-prompt hook, so agents get the mailbox briefing (including unread count) at session start rather than a notification on every prompt. Cursor keeps user-level rules in its settings GUI, so the handoff norms travel in the brief instead of a rules file.
93
+
48
94
  ## Install Locally
49
95
 
50
96
  From the repo:
@@ -76,6 +122,7 @@ For hook checks, users should not have to remember a name. `cimux notify --harne
76
122
  Cimux exposes:
77
123
 
78
124
  - `register_session`
125
+ - `list_mailboxes`
79
126
  - `send_context`
80
127
  - `check_inbox`
81
128
  - `read_context`
@@ -83,8 +130,8 @@ Cimux exposes:
83
130
 
84
131
  Typical flow:
85
132
 
86
- 1. A session registers or infers its mailbox.
87
- 2. Another session sends a Context Package to that mailbox.
133
+ 1. A session starts; the `SessionStart` hook briefs the agent on its mailbox and unread count.
134
+ 2. Another session finds the recipient with `list_mailboxes` and sends a Context Package.
88
135
  3. The receiver sees a hook notification on the next user prompt if unread mail exists.
89
136
  4. The receiver calls `check_inbox` to preview.
90
137
  5. The receiver calls `read_context` for the full package.
@@ -104,10 +151,11 @@ cimux send \
104
151
  --title "Auth handoff" \
105
152
  --summary "Frontend should handle the new auth error." \
106
153
  --body "validateSession now throws ExpiredSessionError." \
107
- --tags auth,frontend
154
+ --tags auth,frontend \
155
+ --artifacts-json '{"files":[{"path":"src/auth/session.ts"}]}'
108
156
 
109
157
  cimux notify --mailbox claude/frontend-login
110
- cimux check --mailbox claude/frontend-login
158
+ cimux check --mailbox claude/frontend-login --limit 5
111
159
  cimux read --mailbox claude/frontend-login --id <context-id>
112
160
  cimux ack --mailbox claude/frontend-login --id <context-id> --note "Loaded."
113
161
  ```
@@ -127,7 +175,3 @@ npm run build
127
175
  npm run demo:local
128
176
  npm pack --dry-run
129
177
  ```
130
-
131
- ## MVP Readiness
132
-
133
- Before calling a build MVP-complete, run the automated checks and manual harness verification in [docs/mvp-readiness.md](docs/mvp-readiness.md).
package/dist/bin.js CHANGED
@@ -1,4 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import { runCimuxCli } from "./cli/cimux-cli.js";
2
+ // Check the runtime before importing anything: node:sqlite (used by the
3
+ // storage layer) is only available unflagged from Node 22.13, and importing
4
+ // it on older versions crashes with an unhelpful builtin-module error.
5
+ const [major = 0, minor = 0] = process.versions.node.split(".").map(Number);
6
+ if (major < 22 || (major === 22 && minor < 13)) {
7
+ console.error(`cimux requires Node >= 22.13 (for node:sqlite). You are running ${process.versions.node}.`);
8
+ process.exit(1);
9
+ }
10
+ const { runCimuxCli } = await import("./cli/cimux-cli.js");
3
11
  process.exitCode = await runCimuxCli(process.argv.slice(2));
12
+ export {};
4
13
  //# sourceMappingURL=bin.js.map
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,CAAC,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AAEA,wEAAwE;AACxE,4EAA4E;AAC5E,uEAAuE;AACvE,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC5E,IAAI,KAAK,GAAG,EAAE,IAAI,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC;IAC/C,OAAO,CAAC,KAAK,CACX,mEAAmE,OAAO,CAAC,QAAQ,CAAC,IAAI,GAAG,CAC5F,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAC3D,OAAO,CAAC,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -1,10 +1,3 @@
1
- export type CimuxCliIo = {
2
- log(message: string): void;
3
- error(message: string): void;
4
- };
5
- export type CimuxCliEnv = {
6
- CIMUX_DB_PATH?: string;
7
- CIMUX_MAILBOX?: string;
8
- CIMUX_HARNESS?: string;
9
- };
1
+ import type { CimuxCliEnv, CimuxCliIo } from "./shared.js";
2
+ export type { CimuxCliEnv, CimuxCliIo } from "./shared.js";
10
3
  export declare function runCimuxCli(argv: string[], env?: CimuxCliEnv, cwd?: string, io?: CimuxCliIo): Promise<number>;
@@ -1,207 +1,77 @@
1
- import path from "node:path";
2
- import { applyInstallPlan, createInstallPlan } from "../install/cimux-install-plan.js";
3
- import { defaultDatabasePath, runCimuxMcpServer } from "../mcp/cimux-mcp-server.js";
4
- import { resolveRuntimeMailbox } from "../runtime/mailbox-runtime.js";
5
- import { ackContext, checkInbox, createInboxNotification, createSessionBrief, listMailboxes, readContext, registerSession, sendContext } from "../service/cimux-mailbox-service.js";
6
- import { SQLiteCimuxStore } from "../storage/sqlite-cimux-store.js";
1
+ import { parseArgs } from "node:util";
2
+ import { ZodError } from "zod";
7
3
  import { name, version } from "../version.js";
4
+ import { ackCommand } from "./commands/ack.js";
5
+ import { briefCommand } from "./commands/brief.js";
6
+ import { checkCommand } from "./commands/check.js";
7
+ import { installCommand } from "./commands/install.js";
8
+ import { mailboxesCommand } from "./commands/mailboxes.js";
9
+ import { mcpCommand } from "./commands/mcp.js";
10
+ import { notifyCommand } from "./commands/notify.js";
11
+ import { readCommand } from "./commands/read.js";
12
+ import { registerCommand } from "./commands/register.js";
13
+ import { sendCommand } from "./commands/send.js";
14
+ const commands = [
15
+ mcpCommand,
16
+ installCommand,
17
+ notifyCommand,
18
+ briefCommand,
19
+ registerCommand,
20
+ mailboxesCommand,
21
+ sendCommand,
22
+ checkCommand,
23
+ readCommand,
24
+ ackCommand
25
+ ];
8
26
  export async function runCimuxCli(argv, env = process.env, cwd = process.cwd(), io = console) {
9
27
  const command = argv[0];
10
- try {
11
- if (!command || command === "help" || command === "--help" || command === "-h") {
12
- io.log(usage());
13
- return 0;
14
- }
15
- if (command === "version" || command === "--version" || command === "-v") {
16
- io.log(`${name} ${version}`);
17
- return 0;
18
- }
19
- if (command === "mcp") {
20
- await runCimuxMcpServer(env.CIMUX_DB_PATH);
21
- return 0;
22
- }
23
- if (command === "notify") {
24
- return await runNotifyCommand(argv, env, cwd, io);
25
- }
26
- if (command === "brief") {
27
- return await runBriefCommand(argv, env, cwd, io);
28
- }
29
- if (command === "mailboxes") {
30
- return await withStore(env, async (store) => {
31
- writeJson(io, await listMailboxes(store));
32
- return 0;
33
- });
34
- }
35
- if (command === "install") {
36
- return runInstallCommand(argv, io);
37
- }
38
- if (command === "register") {
39
- return await withStore(env, async (store) => {
40
- const mailbox = resolveRuntimeMailboxFromArgs(argv, env, cwd);
41
- const result = await registerSession(store, {
42
- harness: readArg(argv, "--harness") ?? env.CIMUX_HARNESS ?? "codex",
43
- ...(mailbox.inferredFrom === "explicit"
44
- ? { explicitMailbox: mailbox.mailbox }
45
- : {
46
- branchName: mailbox.branchName ?? undefined,
47
- folderName: mailbox.folderName
48
- })
49
- });
50
- writeJson(io, result);
51
- return 0;
52
- });
53
- }
54
- if (command === "send") {
55
- return await withStore(env, async (store) => {
56
- const result = await sendContext(store, {
57
- fromMailbox: requireArg(argv, "--from"),
58
- toMailbox: requireArg(argv, "--to"),
59
- title: requireArg(argv, "--title"),
60
- summary: requireArg(argv, "--summary"),
61
- body: requireArg(argv, "--body"),
62
- tags: readCsvArg(argv, "--tags"),
63
- artifacts: {},
64
- payload: {}
65
- });
66
- writeJson(io, result);
67
- return 0;
68
- });
69
- }
70
- if (command === "check") {
71
- return await withStore(env, async (store) => {
72
- const result = await checkInbox(store, {
73
- mailbox: requireArg(argv, "--mailbox"),
74
- unreadOnly: !argv.includes("--all")
75
- });
76
- writeJson(io, result);
77
- return 0;
78
- });
79
- }
80
- if (command === "read") {
81
- return await withStore(env, async (store) => {
82
- const result = await readContext(store, {
83
- mailbox: requireArg(argv, "--mailbox"),
84
- id: requireArg(argv, "--id")
85
- });
86
- writeJson(io, result);
87
- return 0;
88
- });
89
- }
90
- if (command === "ack") {
91
- return await withStore(env, async (store) => {
92
- const note = readArg(argv, "--note");
93
- const result = await ackContext(store, {
94
- mailbox: requireArg(argv, "--mailbox"),
95
- id: requireArg(argv, "--id"),
96
- ...(note === undefined ? {} : { note })
97
- });
98
- writeJson(io, result);
99
- return 0;
100
- });
101
- }
28
+ if (!command || command === "help" || command === "--help" || command === "-h") {
29
+ io.log(usage());
30
+ return 0;
31
+ }
32
+ if (command === "version" || command === "--version" || command === "-v") {
33
+ io.log(`${name} ${version}`);
34
+ return 0;
35
+ }
36
+ const spec = commands.find((candidate) => candidate.name === command);
37
+ if (!spec) {
38
+ io.error(`Unknown command: ${command}`);
39
+ io.error("");
102
40
  io.error(usage());
103
41
  return 1;
104
42
  }
43
+ let values;
44
+ try {
45
+ // strict mode rejects unknown flags and flags missing their value, so
46
+ // typos fail loudly instead of being silently swallowed.
47
+ values = parseArgs({
48
+ args: argv.slice(1),
49
+ options: spec.options,
50
+ strict: true,
51
+ allowPositionals: false
52
+ }).values;
53
+ }
105
54
  catch (error) {
106
55
  io.error(error instanceof Error ? error.message : String(error));
56
+ io.error(`Usage: ${spec.usage}`);
107
57
  return 1;
108
58
  }
109
- }
110
- async function runNotifyCommand(argv, env, cwd, io) {
111
- return withStore(env, async (store) => {
112
- const { mailbox } = resolveRuntimeMailboxFromArgs(argv, env, cwd);
113
- // Hook checks also act as a heartbeat for the current local session name.
114
- // Creation is idempotent, so this does not reset existing mailbox state.
115
- await store.createMailbox(mailbox);
116
- const result = await createInboxNotification(store, { mailbox });
117
- if (result.message) {
118
- io.log(result.message);
119
- }
120
- return 0;
121
- });
122
- }
123
- async function runBriefCommand(argv, env, cwd, io) {
124
- return withStore(env, async (store) => {
125
- const { mailbox } = resolveRuntimeMailboxFromArgs(argv, env, cwd);
126
- // Runs from a SessionStart hook: register the session's mailbox, then
127
- // print the norms so agents use Cimux without being prompted.
128
- await store.createMailbox(mailbox);
129
- const result = await createSessionBrief(store, { mailbox });
130
- io.log(result.message);
131
- return 0;
132
- });
133
- }
134
- function runInstallCommand(argv, io) {
135
- const plan = createInstallPlan({ packageCommand: resolvePackageCommand() });
136
- if (!argv.includes("--dry-run")) {
137
- const results = applyInstallPlan(plan);
138
- for (const result of results) {
139
- const backup = result.backupPath ? ` backup: ${result.backupPath}` : "";
140
- io.log(`${result.status}: ${result.path}${backup}`);
141
- }
142
- return 0;
143
- }
144
- for (const target of plan.targets) {
145
- io.log(`# ${target.harness}: ${target.path}`);
146
- io.log(`# ${target.purpose}`);
147
- io.log(target.snippet);
148
- }
149
- return 0;
150
- }
151
- function resolvePackageCommand() {
152
- // GUI-launched harnesses (e.g. the Codex desktop app) do not inherit the
153
- // shell PATH, so write the absolute path of the running bin into config.
154
- const binPath = process.argv[1];
155
- return binPath && path.isAbsolute(binPath) ? binPath : "cimux";
156
- }
157
- async function withStore(env, callback) {
158
- const store = new SQLiteCimuxStore(env.CIMUX_DB_PATH ?? defaultDatabasePath());
159
59
  try {
160
- return await callback(store);
161
- }
162
- finally {
163
- store.close();
164
- }
165
- }
166
- function resolveRuntimeMailboxFromArgs(argv, env, cwd) {
167
- const explicitMailbox = readArg(argv, "--mailbox") ?? env.CIMUX_MAILBOX;
168
- const harness = readArg(argv, "--harness") ?? env.CIMUX_HARNESS;
169
- if (!explicitMailbox && !harness) {
170
- throw new Error("Expected --mailbox <harness/name> or --harness <name>");
171
- }
172
- return resolveRuntimeMailbox({
173
- ...(explicitMailbox === undefined ? {} : { explicitMailbox }),
174
- ...(harness === undefined ? {} : { harness }),
175
- cwd
176
- });
177
- }
178
- function readArg(argv, name) {
179
- const exact = argv.indexOf(name);
180
- if (exact >= 0) {
181
- return argv[exact + 1];
60
+ return await spec.run({ values, env, cwd, io });
182
61
  }
183
- const prefixed = argv.find((arg) => arg.startsWith(`${name}=`));
184
- return prefixed?.slice(name.length + 1);
185
- }
186
- function requireArg(argv, name) {
187
- const value = readArg(argv, name);
188
- if (!value) {
189
- throw new Error(`Expected ${name}`);
190
- }
191
- return value;
192
- }
193
- function readCsvArg(argv, name) {
194
- const value = readArg(argv, name);
195
- if (!value) {
196
- return [];
62
+ catch (error) {
63
+ if (error instanceof ZodError) {
64
+ io.error("Invalid input:");
65
+ for (const issue of error.issues) {
66
+ const flag = issue.path.length > 0 ? `--${issue.path.join(".")}` : "input";
67
+ io.error(` ${flag}: ${issue.message}`);
68
+ }
69
+ io.error(`Usage: ${spec.usage}`);
70
+ return 1;
71
+ }
72
+ io.error(error instanceof Error ? error.message : String(error));
73
+ return 1;
197
74
  }
198
- return value
199
- .split(",")
200
- .map((item) => item.trim())
201
- .filter(Boolean);
202
- }
203
- function writeJson(io, value) {
204
- io.log(JSON.stringify(value, null, 2));
205
75
  }
206
76
  function usage() {
207
77
  return [
@@ -210,16 +80,7 @@ function usage() {
210
80
  "Local-first mailboxes for intentional AI agent context handoffs.",
211
81
  "",
212
82
  "Usage:",
213
- " cimux mcp",
214
- " cimux install [--dry-run]",
215
- " cimux notify [--mailbox <harness/name> | --harness <name>]",
216
- " cimux brief [--mailbox <harness/name> | --harness <name>]",
217
- " cimux register [--mailbox <harness/name> | --harness <name>]",
218
- " cimux mailboxes",
219
- " cimux send --from <mailbox> --to <mailbox> --title <title> --summary <summary> --body <body> [--tags a,b]",
220
- " cimux check --mailbox <harness/name> [--all]",
221
- " cimux read --mailbox <harness/name> --id <context-id>",
222
- " cimux ack --mailbox <harness/name> --id <context-id> [--note <note>]",
83
+ ...commands.map((spec) => ` ${spec.usage}`),
223
84
  "",
224
85
  "Examples:",
225
86
  " cimux install --dry-run",
@@ -1 +1 @@
1
- {"version":3,"file":"cimux-cli.js","sourceRoot":"","sources":["../../src/cli/cimux-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cimux-cli.js","sourceRoot":"","sources":["../../src/cli/cimux-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { CommandSpec } from "../shared.js";
2
+ export declare const ackCommand: CommandSpec;
@@ -0,0 +1,24 @@
1
+ import { ackContext } from "../../service/cimux-mailbox-service.js";
2
+ import { readString, requireString, withStore, writeJson } from "../shared.js";
3
+ export const ackCommand = {
4
+ name: "ack",
5
+ usage: "cimux ack --mailbox <harness/name> --id <context-id> [--note <note>]",
6
+ options: {
7
+ mailbox: { type: "string" },
8
+ id: { type: "string" },
9
+ note: { type: "string" }
10
+ },
11
+ run(context) {
12
+ return withStore(context.env, async (store) => {
13
+ const note = readString(context.values, "note");
14
+ const result = await ackContext(store, {
15
+ mailbox: requireString(context.values, "mailbox"),
16
+ id: requireString(context.values, "id"),
17
+ ...(note === undefined ? {} : { note })
18
+ });
19
+ writeJson(context.io, result);
20
+ return 0;
21
+ });
22
+ }
23
+ };
24
+ //# sourceMappingURL=ack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ack.js","sourceRoot":"","sources":["../../../src/cli/commands/ack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG/E,MAAM,CAAC,MAAM,UAAU,GAAgB;IACrC,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,sEAAsE;IAC7E,OAAO,EAAE;QACP,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACtB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACzB;IACD,GAAG,CAAC,OAAO;QACT,OAAO,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE;gBACrC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;gBACjD,EAAE,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;gBACvC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;aACxC,CAAC,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC9B,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { CommandSpec } from "../shared.js";
2
+ export declare const briefCommand: CommandSpec;
@@ -0,0 +1,33 @@
1
+ import { createSessionBrief } from "../../service/cimux-mailbox-service.js";
2
+ import { readString, resolveRuntimeMailboxFromArgs, withStore } from "../shared.js";
3
+ export const briefCommand = {
4
+ name: "brief",
5
+ usage: "cimux brief [--mailbox <harness/name> | --harness <name>] [--format text|cursor]",
6
+ options: {
7
+ mailbox: { type: "string" },
8
+ harness: { type: "string" },
9
+ format: { type: "string" }
10
+ },
11
+ run(context) {
12
+ const format = readString(context.values, "format") ?? "text";
13
+ if (format !== "text" && format !== "cursor") {
14
+ throw new Error(`Unknown format: ${format} (supported: text, cursor)`);
15
+ }
16
+ return withStore(context.env, async (store) => {
17
+ const { mailbox } = resolveRuntimeMailboxFromArgs(context);
18
+ // Runs from a SessionStart hook: register the session's mailbox, then
19
+ // print the norms so agents use Cimux without being prompted.
20
+ await store.createMailbox(mailbox);
21
+ const result = await createSessionBrief(store, { mailbox });
22
+ // Cursor hooks reply with JSON on stdout instead of plain text.
23
+ if (format === "cursor") {
24
+ context.io.log(JSON.stringify({ additional_context: result.message }));
25
+ }
26
+ else {
27
+ context.io.log(result.message);
28
+ }
29
+ return 0;
30
+ });
31
+ }
32
+ };
33
+ //# sourceMappingURL=brief.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief.js","sourceRoot":"","sources":["../../../src/cli/commands/brief.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,6BAA6B,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGpF,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,kFAAkF;IACzF,OAAO,EAAE;QACP,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC3B;IACD,GAAG,CAAC,OAAO;QACT,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC;QAC9D,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,4BAA4B,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;YAE3D,sEAAsE;YACtE,8DAA8D;YAC9D,MAAM,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAE5D,gEAAgE;YAChE,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { CommandSpec } from "../shared.js";
2
+ export declare const checkCommand: CommandSpec;
@@ -0,0 +1,24 @@
1
+ import { checkInbox } from "../../service/cimux-mailbox-service.js";
2
+ import { readString, requireString, withStore, writeJson } from "../shared.js";
3
+ export const checkCommand = {
4
+ name: "check",
5
+ usage: "cimux check --mailbox <harness/name> [--all] [--limit <n>]",
6
+ options: {
7
+ mailbox: { type: "string" },
8
+ all: { type: "boolean" },
9
+ limit: { type: "string" }
10
+ },
11
+ run(context) {
12
+ return withStore(context.env, async (store) => {
13
+ const limit = readString(context.values, "limit");
14
+ const result = await checkInbox(store, {
15
+ mailbox: requireString(context.values, "mailbox"),
16
+ unreadOnly: context.values.all !== true,
17
+ ...(limit === undefined ? {} : { limit: Number(limit) })
18
+ });
19
+ writeJson(context.io, result);
20
+ return 0;
21
+ });
22
+ }
23
+ };
24
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG/E,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,4DAA4D;IACnE,OAAO,EAAE;QACP,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC1B;IACD,GAAG,CAAC,OAAO;QACT,OAAO,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE;gBACrC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;gBACjD,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI;gBACvC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;aACzD,CAAC,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC9B,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { CommandSpec } from "../shared.js";
2
+ export declare const installCommand: CommandSpec;