From c6dbca72631cce02a750f518602bdf2c69767ea7 Mon Sep 17 00:00:00 2001
From: pasichdev
Date: Tue, 22 Sep 2026 20:28:27 +0300
Subject: [PATCH 1/3] feat(setup): end on what worked and what to try next
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The last screen of `setup` is the only part of its output most people read, and
it ended on env snippets for hosts setup had just configured itself, followed by
"Start the server with: npx -y @pasichdev/docket" — a step that does not exist
(the first agent to connect starts everything), and, run inside a checkout of
this repo, the one invocation that fails.
It now names the hosts it actually configured, gives the one thing to try
("add a todo: try docket") and the dashboard URL. The manual snippet for other
hosts is a whole entry — command, args and env — rather than an env block with
nothing to attach it to.
---
src/setup.test.ts | 22 +++++++++++++-
src/setup.ts | 74 ++++++++++++++++++++++++++++++++++++++---------
2 files changed, 81 insertions(+), 15 deletions(-)
diff --git a/src/setup.test.ts b/src/setup.test.ts
index 4e106e6..29fec62 100644
--- a/src/setup.test.ts
+++ b/src/setup.test.ts
@@ -1,6 +1,6 @@
import assert from "node:assert/strict";
import { test } from "node:test";
-import { automationDefault, parseDataDirectoryArg } from "./setup.js";
+import { automationDefault, hostInvocation, nextSteps, parseDataDirectoryArg } from "./setup.js";
test("parseDataDirectoryArg: reads an explicit data directory", () => {
assert.equal(parseDataDirectoryArg(["--data-dir", "/srv/docket"]), "/srv/docket");
@@ -18,3 +18,23 @@ test("automationDefault: --yes/-y force true even if stdin were a TTY (can't fli
assert.equal(automationDefault(["--yes"]), true);
assert.equal(automationDefault(["-y"]), true);
});
+
+const invocation = hostInvocation("@pasichdev/docket@3.0.0", { DOCKET_DATA_DIR: "/home/u/.docket" });
+
+test("nextSteps: names the hosts it configured and says what to try, instead of a start command that does not exist", () => {
+ const out = nextSteps({ configured: ["Codex", "Claude Code"], invocation, dashboardPort: 8787 });
+ assert.match(out, /ready in Claude Code, Codex/);
+ assert.match(out, /Restart Claude Code and ask it: "add a todo/);
+ assert.match(out, /http:\/\/localhost:8787/);
+ assert.doesNotMatch(out, /Start the server with/);
+});
+
+test("nextSteps: the manual snippet is a whole host entry — command, args and env — not an env block with nothing to attach it to", () => {
+ const out = nextSteps({ configured: [], invocation, dashboardPort: 9000 });
+ assert.match(out, /No MCP host was configured automatically/);
+ assert.match(out, /http:\/\/localhost:9000/);
+ const json = JSON.parse(out.slice(out.indexOf("{"))) as { mcpServers: { docket: { command: string; args: string[]; env: Record } } };
+ assert.deepEqual(json.mcpServers.docket, invocation);
+ // The pinned, --prefix form: bare `npx @pasichdev/docket` run inside a checkout of this repo resolves the local package and dies.
+ assert.ok(json.mcpServers.docket.args.includes("--prefix"));
+});
diff --git a/src/setup.ts b/src/setup.ts
index 2678c2c..e64f081 100644
--- a/src/setup.ts
+++ b/src/setup.ts
@@ -165,8 +165,10 @@ async function readHostConfig(target: string): Promise {
}
}
-async function configureHosts(env: Record): Promise {
+/** Returns the hosts it actually configured, so the closing message can name them rather than guess. */
+async function configureHosts(env: Record): Promise {
const serverArgs = hostInvocation(await packageSpec(), env).args;
+ const configured: string[] = [];
const envPairs = Object.entries(env).map(([key, value]) => `${key}=${value}`);
/**
@@ -183,7 +185,7 @@ async function configureHosts(env: Record): Promise {
capture: string[],
remove: string[],
add: string[],
- ): Promise => {
+ ): Promise => {
const previous = await execFileAsync(command, capture).then((r) => r.stdout, () => null);
await execFileAsync(command, remove).catch(() => undefined);
try {
@@ -191,6 +193,7 @@ async function configureHosts(env: Record): Promise {
if (result.stdout) process.stdout.write(result.stdout);
if (result.stderr) process.stderr.write(result.stderr);
console.log(`Configured ${label}.`);
+ return true;
} catch (error) {
console.warn(`Skipped ${label}: ${(error as ExecFileException).message ?? "command failed"}`);
if (previous?.includes("docket")) {
@@ -199,18 +202,20 @@ async function configureHosts(env: Record): Promise {
` ${command} ${add.join(" ")}`,
);
}
+ return false;
}
};
if (await commandExists("codex")) {
const codexEnvArgs = envPairs.flatMap((pair) => ["--env", pair]);
- await reconfigure(
+ const ok = await reconfigure(
"codex",
"Codex",
["mcp", "list"],
["mcp", "remove", "docket"],
["mcp", "add", "docket", ...codexEnvArgs, "--", "npx", ...serverArgs],
);
+ if (ok) configured.push("Codex");
}
if (await commandExists("claude")) {
// `claude mcp add` takes the name as a bare positional right after "add" — -e/--env
@@ -218,18 +223,58 @@ async function configureHosts(env: Record): Promise {
// it, so putting the name after -e makes it try to consume "docket" as a second
// (invalid) env var instead of the server name.
const envFlag = envPairs.length > 0 ? ["-e", ...envPairs] : [];
- await reconfigure(
+ const ok = await reconfigure(
"claude",
"Claude Code MCP",
["mcp", "list"],
["mcp", "remove", "--scope", "user", "docket"],
["mcp", "add", "docket", "--scope", "user", ...envFlag, "--", "npx", ...serverArgs],
);
+ if (ok) configured.push("Claude Code");
}
- for (const target of [`${homedir()}/.cursor/mcp.json`, `${homedir()}/.codeium/windsurf/mcp_config.json`]) {
- await configureJsonHost(target, serverArgs, env);
+ for (const [label, target] of [
+ ["Cursor", `${homedir()}/.cursor/mcp.json`],
+ ["Windsurf", `${homedir()}/.codeium/windsurf/mcp_config.json`],
+ ] as const) {
+ const outcome = await configureJsonHost(target, serverArgs, env);
+ if (outcome === "configured" || outcome === "created") configured.push(label);
}
+ return configured;
+}
+
+/**
+ * The last thing setup prints, and so the only part of its output most people read.
+ *
+ * It used to end on env snippets for hosts setup had just configured itself, followed by
+ * "Start the server with: npx -y @pasichdev/docket" — a step that does not exist (the first
+ * agent to connect starts everything) and, run inside a checkout of this repo, the one
+ * invocation that fails. What a new user needs from the last screen is what worked, the one
+ * thing to try, and where to look; the manual config is for hosts setup could not reach.
+ */
+export function nextSteps(opts: {
+ configured: string[];
+ invocation: { command: string; args: string[]; env: Record };
+ dashboardPort: number;
+}): string {
+ const { invocation, dashboardPort } = opts;
+ // Claude Code first when it is there: it is the host the README's quick start is written for.
+ const configured = [...opts.configured].sort((x, y) => Number(y === "Claude Code") - Number(x === "Claude Code"));
+ const lines: string[] = [""];
+ if (configured.length > 0) {
+ lines.push(`✓ docket is ready in ${configured.join(", ")}.`, "");
+ lines.push("Next:");
+ lines.push(` 1. Restart ${configured[0]} and ask it: "add a todo: try docket"`);
+ } else {
+ lines.push("No MCP host was configured automatically — add docket to yours (below), then:", "");
+ lines.push("Next:");
+ lines.push(` 1. Restart your agent and ask it: "add a todo: try docket"`);
+ }
+ lines.push(` 2. Watch it land on the dashboard: http://localhost:${dashboardPort}`);
+ lines.push(" (it starts by itself when the first agent connects)", "");
+ lines.push(`${configured.length > 0 ? "Any other MCP host" : "Your MCP host"} (Claude Desktop, Zed, …) takes:`);
+ lines.push(JSON.stringify({ mcpServers: { docket: invocation } }, null, 2));
+ return lines.join("\n");
}
export type JsonHostOutcome = "configured" | "created" | "skipped-unreadable" | "skipped-absent" | "failed";
@@ -322,17 +367,18 @@ async function runLocalSetup(reader: LineReader, args: string[]): Promise
// `docket backup` in one backed up an empty ~/.docket and reported success.
await writeDataDirectoryConfig(dataDirectory);
await writeDeploymentConfig({ mode: "local" });
- if (await shouldAutomate(reader, "Configure detected MCP agents automatically?", args)) await configureHosts({ DOCKET_DATA_DIR: dataDirectory });
+ const env = { DOCKET_DATA_DIR: dataDirectory };
+ const hosts = (await shouldAutomate(reader, "Configure detected MCP agents automatically?", args)) ? await configureHosts(env) : [];
if (await shouldAutomate(reader, "Install the docket skill for Claude Code?", args)) await installSkill();
if (await shouldAutomate(reader, "Install the docket skill (Codex and other AGENTS.md-ecosystem agents)?", args)) await installAgentsSkill();
if (await shouldAutomate(reader, "Install the todo_stats terminal helper and shell startup entry?", args)) await installStatsIntegration(dataDirectory);
- console.log("\nUse this same directory in every MCP host that should share the list:\n");
- console.log("Codex (config.toml):");
- console.log("[mcp_servers.docket.env]");
- console.log(`DOCKET_DATA_DIR = ${JSON.stringify(dataDirectory)}\n`);
- console.log("Claude Desktop / Cursor / Windsurf / Zed:");
- console.log(JSON.stringify({ env: { DOCKET_DATA_DIR: dataDirectory } }, null, 2));
- console.log("\nStart the server with: npx -y @pasichdev/docket");
+ console.log(
+ nextSteps({
+ configured: hosts,
+ invocation: hostInvocation(await packageSpec(), env),
+ dashboardPort: Number(process.env.DOCKET_WEB_PORT ?? 8787),
+ }),
+ );
}
/**
From 7fe6e21d77a4d62320350a3ee77de9a8edf3f77f Mon Sep 17 00:00:00 2001
From: pasichdev
Date: Tue, 22 Sep 2026 20:28:27 +0300
Subject: [PATCH 2/3] docs: quick start first, with a recording of it working
The README opened with two paragraphs of why and four screenshots before the
install command, and the command block then told people to add the server by
hand after a `setup` that had already done it. Quick start now sits under the
tagline: one command, what it does, what to try.
demo.gif is a real run, not a staged one: two different coding CLIs, headless,
in two projects, each add a todo over MCP, and both land on the dashboard filed
under their own project.
demo-setup.sh seeded items under `acme/backend` while agents file them under
`gitlab.com/acme/backend`, so the demo showed one project as two.
---
README.md | 65 ++++++++++++++++++++++----------------
docs/assets/demo-setup.sh | 6 ++--
docs/assets/demo.gif | Bin 0 -> 214468 bytes
3 files changed, 40 insertions(+), 31 deletions(-)
create mode 100644 docs/assets/demo.gif
diff --git a/README.md b/README.md
index 3d7079d..ccdb6f6 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,43 @@
Warp — across every project, before the work is worth a ticket. Local-first,
self-hostable, no SaaS account.**
+
+
+
+
+## Quick start
+
+**You need:** Node.js 18+ and at least one MCP host — Claude Code, Codex,
+Cursor, Windsurf, Claude Desktop, Zed or Warp.
+
+```sh
+npx -y @pasichdev/docket setup
+```
+
+That configures every host it finds on this machine and ends by telling you
+which ones. Then restart your agent and ask it *"add a todo: buy milk"* — it
+shows up at **http://localhost:8787**, a dashboard that started by itself the
+moment the agent connected.
+
+Only want Claude Code, and nothing written anywhere else?
+`claude mcp add docket -- npx -y @pasichdev/docket` does just that part.
+Other hosts: [Supported hosts](#supported-hosts).
+
+
+Optional: see what's open in a project when a session starts
+
+```sh
+npm install -g @pasichdev/docket # the hook runs a command, so it needs one on PATH
+docket hook install # then: docket hook doctor
+```
+
+`hook install` works without the global install too — it pins the command to
+this exact copy of docket and tells you it did — but the short form survives
+moving or reinstalling, and `npx` leaves nothing on `PATH`.
+
+
+## Why
+
A thought that shows up mid-session is worth capturing but not worth the
ceremony: a Notion template, a GitLab issue format, a ticket id you have to
invent. So today it evaporates. Docket is the layer underneath all of that —
@@ -53,34 +90,6 @@ order and the `.docket.json` override: **[`docs/workspaces.md`](docs/workspaces.
Regenerate these with node docs/assets/demo-seed.mjs — it builds the workspace they show, so they stay a picture of the real dashboard rather than a staged one.
-## Quick start
-
-**You need:** [Claude Code](https://claude.com/claude-code) (or another MCP host)
-and Node.js 18+ (`node --version`; get it from [nodejs.org](https://nodejs.org)).
-
-```sh
-npx -y @pasichdev/docket setup # one shared data dir, detected MCP hosts configured
-claude mcp add docket -- npx -y @pasichdev/docket
-```
-
-Restart Claude Code and ask it *"add a todo: buy milk"*. The web dashboard is
-at **http://localhost:8787** — it started itself the moment the first client
-connected.
-
-Optionally, to see what's open in a project when a session starts:
-
-```sh
-npm install -g @pasichdev/docket # the hook runs a command, so it needs one on PATH
-docket hook install # then: docket hook doctor
-```
-
-`hook install` works without the global install too — it pins the command to
-this exact copy of docket and tells you it did — but the short form survives
-moving or reinstalling, and `npx` leaves nothing on `PATH`.
-
-Using Claude Desktop, Cursor, Windsurf, Zed, or Warp instead? Same MCP config
-shape — see [Supported hosts](#supported-hosts).
-
## Upgrading from 2.x
**Read this before you upgrade if you have existing items.**
diff --git a/docs/assets/demo-setup.sh b/docs/assets/demo-setup.sh
index 34311b5..c15790f 100755
--- a/docs/assets/demo-setup.sh
+++ b/docs/assets/demo-setup.sh
@@ -59,9 +59,9 @@ seed() {
node "$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)/dist/web.js" > "$ROOT/web.log" 2>&1 &
sleep 2
-seed "acme/backend" "fix token refresh race" "drop the legacy auth path"
-seed "you/tracker" "ship the new nav"
-seed "you/notes" "write up the migration notes"
+seed "gitlab.com/acme/backend" "fix token refresh race" "drop the legacy auth path"
+seed "github.com/you/tracker" "ship the new nav"
+seed "github.com/you/notes" "write up the migration notes"
curl -sS -X POST "http://127.0.0.1:$DOCKET_WEB_PORT/api/todos" -H 'Content-Type: application/json' \
-d '{"title":"a thought with no project yet"}' > /dev/null
diff --git a/docs/assets/demo.gif b/docs/assets/demo.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6c3047a5daab8f0e0e89b4784e75bf21d83d2a60
GIT binary patch
literal 214468
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