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.
- package/README.md +57 -13
- package/dist/bin.js +10 -1
- package/dist/bin.js.map +1 -1
- package/dist/cli/cimux-cli.d.ts +2 -9
- package/dist/cli/cimux-cli.js +62 -201
- package/dist/cli/cimux-cli.js.map +1 -1
- package/dist/cli/commands/ack.d.ts +2 -0
- package/dist/cli/commands/ack.js +24 -0
- package/dist/cli/commands/ack.js.map +1 -0
- package/dist/cli/commands/brief.d.ts +2 -0
- package/dist/cli/commands/brief.js +33 -0
- package/dist/cli/commands/brief.js.map +1 -0
- package/dist/cli/commands/check.d.ts +2 -0
- package/dist/cli/commands/check.js +24 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/install.d.ts +2 -0
- package/dist/cli/commands/install.js +55 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/mailboxes.d.ts +2 -0
- package/dist/cli/commands/mailboxes.js +14 -0
- package/dist/cli/commands/mailboxes.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +2 -0
- package/dist/cli/commands/mcp.js +11 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/notify.d.ts +2 -0
- package/dist/cli/commands/notify.js +24 -0
- package/dist/cli/commands/notify.js.map +1 -0
- package/dist/cli/commands/read.d.ts +2 -0
- package/dist/cli/commands/read.js +21 -0
- package/dist/cli/commands/read.js.map +1 -0
- package/dist/cli/commands/register.d.ts +2 -0
- package/dist/cli/commands/register.js +27 -0
- package/dist/cli/commands/register.js.map +1 -0
- package/dist/cli/commands/send.d.ts +2 -0
- package/dist/cli/commands/send.js +37 -0
- package/dist/cli/commands/send.js.map +1 -0
- package/dist/cli/shared.d.ts +36 -0
- package/dist/cli/shared.js +71 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/install/cimux-install-plan.d.ts +5 -1
- package/dist/install/cimux-install-plan.js +37 -108
- package/dist/install/cimux-install-plan.js.map +1 -1
- package/dist/install/harnesses/claude.d.ts +2 -0
- package/dist/install/harnesses/claude.js +27 -0
- package/dist/install/harnesses/claude.js.map +1 -0
- package/dist/install/harnesses/codex.d.ts +2 -0
- package/dist/install/harnesses/codex.js +26 -0
- package/dist/install/harnesses/codex.js.map +1 -0
- package/dist/install/harnesses/cursor.d.ts +2 -0
- package/dist/install/harnesses/cursor.js +46 -0
- package/dist/install/harnesses/cursor.js.map +1 -0
- package/dist/install/harnesses/index.d.ts +5 -0
- package/dist/install/harnesses/index.js +16 -0
- package/dist/install/harnesses/index.js.map +1 -0
- package/dist/install/harnesses/shared.d.ts +26 -0
- package/dist/install/harnesses/shared.js +43 -0
- package/dist/install/harnesses/shared.js.map +1 -0
- package/dist/mcp/cimux-mcp-server.js +1 -1
- package/dist/mcp/cimux-mcp-server.js.map +1 -1
- package/dist/{registration/mailbox-registration.d.ts → naming/mailbox-naming.d.ts} +21 -0
- package/dist/naming/mailbox-naming.js +96 -0
- package/dist/naming/mailbox-naming.js.map +1 -0
- package/dist/service/cimux-mailbox-service.d.ts +1 -1
- package/dist/service/cimux-mailbox-service.js +5 -3
- package/dist/service/cimux-mailbox-service.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -2
- package/dist/registration/mailbox-registration.js +0 -48
- package/dist/registration/mailbox-registration.js.map +0 -1
- package/dist/runtime/mailbox-runtime.d.ts +0 -22
- package/dist/runtime/mailbox-runtime.js +0 -50
- package/dist/runtime/mailbox-runtime.js.map +0 -1
- package/docs/mvp-readiness.md +0 -85
package/README.md
CHANGED
|
@@ -1,9 +1,39 @@
|
|
|
1
1
|
# Cimux
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/cimux-mcp)
|
|
4
|
+
[](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
|
|
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
|
-
-
|
|
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
|
|
87
|
-
2. Another session sends a Context Package
|
|
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
|
-
|
|
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":";
|
|
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"}
|
package/dist/cli/cimux-cli.d.ts
CHANGED
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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>;
|
package/dist/cli/cimux-cli.js
CHANGED
|
@@ -1,207 +1,77 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
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
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"cimux-cli.js","sourceRoot":"","sources":["../../src/cli/cimux-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,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,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"}
|