@creator-notes/cnotes 0.16.11
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/.claude-plugin/plugin.json +14 -0
- package/.mcp.json +12 -0
- package/LICENSE +21 -0
- package/README.md +303 -0
- package/dist/cn.d.ts +3 -0
- package/dist/cn.d.ts.map +1 -0
- package/dist/cn.js +124 -0
- package/dist/cn.js.map +1 -0
- package/dist/commands/auth.d.ts +10 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +188 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/canvas.d.ts +3 -0
- package/dist/commands/canvas.d.ts.map +1 -0
- package/dist/commands/canvas.js +1383 -0
- package/dist/commands/canvas.js.map +1 -0
- package/dist/commands/claude-hook.d.ts +28 -0
- package/dist/commands/claude-hook.d.ts.map +1 -0
- package/dist/commands/claude-hook.js +59 -0
- package/dist/commands/claude-hook.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +47 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/files.d.ts +3 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +119 -0
- package/dist/commands/files.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +473 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp.d.ts +15 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +118 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/memory.d.ts +3 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +150 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/notes.d.ts +3 -0
- package/dist/commands/notes.d.ts.map +1 -0
- package/dist/commands/notes.js +706 -0
- package/dist/commands/notes.js.map +1 -0
- package/dist/commands/operations.d.ts +18 -0
- package/dist/commands/operations.d.ts.map +1 -0
- package/dist/commands/operations.js +231 -0
- package/dist/commands/operations.js.map +1 -0
- package/dist/commands/relationships.d.ts +3 -0
- package/dist/commands/relationships.d.ts.map +1 -0
- package/dist/commands/relationships.js +94 -0
- package/dist/commands/relationships.js.map +1 -0
- package/dist/commands/schema.d.ts +12 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +85 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +57 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/theme.d.ts +3 -0
- package/dist/commands/theme.d.ts.map +1 -0
- package/dist/commands/theme.js +184 -0
- package/dist/commands/theme.js.map +1 -0
- package/dist/commands/timeline.d.ts +3 -0
- package/dist/commands/timeline.d.ts.map +1 -0
- package/dist/commands/timeline.js +97 -0
- package/dist/commands/timeline.js.map +1 -0
- package/dist/commands/types.d.ts +3 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +139 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/versions.d.ts +3 -0
- package/dist/commands/versions.d.ts.map +1 -0
- package/dist/commands/versions.js +120 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/commands/workspace.d.ts +13 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +176 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/lib/api-client.d.ts +45 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +198 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/auth-store.d.ts +47 -0
- package/dist/lib/auth-store.d.ts.map +1 -0
- package/dist/lib/auth-store.js +116 -0
- package/dist/lib/auth-store.js.map +1 -0
- package/dist/lib/brand.d.ts +32 -0
- package/dist/lib/brand.d.ts.map +1 -0
- package/dist/lib/brand.js +32 -0
- package/dist/lib/brand.js.map +1 -0
- package/dist/lib/build-schema.d.ts +97 -0
- package/dist/lib/build-schema.d.ts.map +1 -0
- package/dist/lib/build-schema.js +139 -0
- package/dist/lib/build-schema.js.map +1 -0
- package/dist/lib/canvas-read.d.ts +54 -0
- package/dist/lib/canvas-read.d.ts.map +1 -0
- package/dist/lib/canvas-read.js +145 -0
- package/dist/lib/canvas-read.js.map +1 -0
- package/dist/lib/claude-session.d.ts +73 -0
- package/dist/lib/claude-session.d.ts.map +1 -0
- package/dist/lib/claude-session.js +104 -0
- package/dist/lib/claude-session.js.map +1 -0
- package/dist/lib/config.d.ts +28 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +66 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/env.d.ts +14 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +16 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/errors.d.ts +47 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +194 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/fs-utils.d.ts +2 -0
- package/dist/lib/fs-utils.d.ts.map +1 -0
- package/dist/lib/fs-utils.js +16 -0
- package/dist/lib/fs-utils.js.map +1 -0
- package/dist/lib/install-hook.d.ts +86 -0
- package/dist/lib/install-hook.d.ts.map +1 -0
- package/dist/lib/install-hook.js +168 -0
- package/dist/lib/install-hook.js.map +1 -0
- package/dist/lib/install-mcp.d.ts +21 -0
- package/dist/lib/install-mcp.d.ts.map +1 -0
- package/dist/lib/install-mcp.js +133 -0
- package/dist/lib/install-mcp.js.map +1 -0
- package/dist/lib/install-skill.d.ts +49 -0
- package/dist/lib/install-skill.d.ts.map +1 -0
- package/dist/lib/install-skill.js +113 -0
- package/dist/lib/install-skill.js.map +1 -0
- package/dist/lib/output.d.ts +29 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +78 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/resolve-note.d.ts +7 -0
- package/dist/lib/resolve-note.d.ts.map +1 -0
- package/dist/lib/resolve-note.js +23 -0
- package/dist/lib/resolve-note.js.map +1 -0
- package/dist/lib/stdin.d.ts +5 -0
- package/dist/lib/stdin.d.ts.map +1 -0
- package/dist/lib/stdin.js +11 -0
- package/dist/lib/stdin.js.map +1 -0
- package/dist/lib/style.d.ts +10 -0
- package/dist/lib/style.d.ts.map +1 -0
- package/dist/lib/style.js +17 -0
- package/dist/lib/style.js.map +1 -0
- package/dist/lib/themes.d.ts +44 -0
- package/dist/lib/themes.d.ts.map +1 -0
- package/dist/lib/themes.js +168 -0
- package/dist/lib/themes.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +782 -0
- package/dist/mcp-server.js.map +1 -0
- package/package.json +66 -0
- package/skills/cnotes/SKILL.md +680 -0
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
import { confirm, select } from "@inquirer/prompts";
|
|
2
|
+
import { spawnSync } from "child_process";
|
|
3
|
+
import { loadConfig, getServerConfig, setWorkspaceId, } from "../lib/auth-store.js";
|
|
4
|
+
import { ApiClient } from "../lib/api-client.js";
|
|
5
|
+
import { browserLogin } from "./auth.js";
|
|
6
|
+
import { fetchAndSelectWorkspace } from "./workspace.js";
|
|
7
|
+
import { buildClaudeConfig } from "./mcp.js";
|
|
8
|
+
import { bold, dim, green, cyan, CHECK, ARROW, WARN } from "../lib/style.js";
|
|
9
|
+
import { installMcpConfig, getConfigPath } from "../lib/install-mcp.js";
|
|
10
|
+
import { hasAgentConfigDir, installSkill, getSkillDestPath, skillTargetLabel, SKILL_TARGETS, } from "../lib/install-skill.js";
|
|
11
|
+
import { installClaudeSessionHook, isClaudeSessionHookInstalled, SESSION_HOOK_COMMAND, SESSION_HOOK_COMMAND_NPX, } from "../lib/install-hook.js";
|
|
12
|
+
function printBanner(version) {
|
|
13
|
+
const width = 41; // inner width of the box
|
|
14
|
+
const title = "CreatorNotes CLI";
|
|
15
|
+
const ver = `v${version}`;
|
|
16
|
+
const pad = (text) => text + " ".repeat(Math.max(0, width - 3 - text.length));
|
|
17
|
+
console.log();
|
|
18
|
+
console.log(" ┌" + "─".repeat(width) + "┐");
|
|
19
|
+
console.log(" │" + " ".repeat(width) + "│");
|
|
20
|
+
console.log(` │ ${bold(pad(title))}│`);
|
|
21
|
+
console.log(` │ ${dim(pad(ver))}│`);
|
|
22
|
+
console.log(" │" + " ".repeat(width) + "│");
|
|
23
|
+
console.log(" └" + "─".repeat(width) + "┘");
|
|
24
|
+
console.log();
|
|
25
|
+
}
|
|
26
|
+
function printStepHeader(step, total, label) {
|
|
27
|
+
const tag = dim(`── Step ${step} of ${total}:`);
|
|
28
|
+
const line = dim("─".repeat(Math.max(0, 40 - label.length)));
|
|
29
|
+
console.log(` ${tag} ${label} ${line}`);
|
|
30
|
+
console.log();
|
|
31
|
+
}
|
|
32
|
+
function printDivider(label) {
|
|
33
|
+
const line = dim("─".repeat(Math.max(0, 43 - label.length)));
|
|
34
|
+
console.log();
|
|
35
|
+
console.log(` ${dim("──")} ${bold(label)} ${line}`);
|
|
36
|
+
console.log();
|
|
37
|
+
}
|
|
38
|
+
function printNextSteps(cliCommand) {
|
|
39
|
+
const examples = [
|
|
40
|
+
[`${cliCommand} notes list`, "Browse your notes"],
|
|
41
|
+
[`${cliCommand} notes create --notes '{...}'`, "Create one or more notes"],
|
|
42
|
+
[`${cliCommand} search "keyword"`, "Search across everything"],
|
|
43
|
+
[`${cliCommand} --help`, "See all commands"],
|
|
44
|
+
];
|
|
45
|
+
const widest = Math.max(...examples.map(([cmd]) => cmd.length));
|
|
46
|
+
console.log(` Next up — try these commands:`);
|
|
47
|
+
console.log();
|
|
48
|
+
for (const [cmd, desc] of examples) {
|
|
49
|
+
const padding = " ".repeat(widest - cmd.length + 4);
|
|
50
|
+
console.log(` ${ARROW} ${cyan(cmd)}${padding}${desc}`);
|
|
51
|
+
}
|
|
52
|
+
console.log();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Detect whether this `cnotes init` invocation is running through a "dlx-style"
|
|
56
|
+
* runner (npx, pnpm dlx, bunx, yarn dlx) rather than from a globally
|
|
57
|
+
* installed binary.
|
|
58
|
+
*
|
|
59
|
+
* - npm/npx: sets `npm_command=exec`
|
|
60
|
+
* - pnpm dlx: cache path contains `/dlx-` (and sets pnpm-specific env)
|
|
61
|
+
* - bunx: cache path contains `/.bun/install/cache/` and binary lives in a tmp dir
|
|
62
|
+
* - yarn dlx: cache path contains `/yarn/berry/cache/`
|
|
63
|
+
*
|
|
64
|
+
* Best-effort — defaults to false (assume globally installed) when uncertain.
|
|
65
|
+
*/
|
|
66
|
+
function isRunningUnderDlx() {
|
|
67
|
+
if (process.env.npm_command === "exec")
|
|
68
|
+
return true;
|
|
69
|
+
const argv1 = process.argv[1] || "";
|
|
70
|
+
if (argv1.includes("/_npx/") || argv1.includes("\\_npx\\"))
|
|
71
|
+
return true;
|
|
72
|
+
if (argv1.includes("/dlx-") || argv1.includes("\\dlx-"))
|
|
73
|
+
return true;
|
|
74
|
+
if (argv1.includes("/.bun/install/cache/") || argv1.includes("\\.bun\\install\\cache\\"))
|
|
75
|
+
return true;
|
|
76
|
+
if (argv1.includes("/yarn/berry/cache/"))
|
|
77
|
+
return true;
|
|
78
|
+
const userAgent = process.env.npm_config_user_agent || "";
|
|
79
|
+
if (userAgent.startsWith("npm/") && process.env.npm_lifecycle_event === "npx")
|
|
80
|
+
return true;
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Best-effort command prefix for copy-pasteable hints.
|
|
85
|
+
* Returns "cnotes" when globally installed, otherwise the full npx form —
|
|
86
|
+
* `npx cnotes` does NOT resolve (the published package is @creator-notes/cnotes).
|
|
87
|
+
*/
|
|
88
|
+
function detectCnCommand() {
|
|
89
|
+
return isRunningUnderDlx() ? "npx @creator-notes/cnotes@latest" : "cnotes";
|
|
90
|
+
}
|
|
91
|
+
function installGlobally() {
|
|
92
|
+
// `shell: true` is required on Windows so npm.cmd resolves correctly.
|
|
93
|
+
const result = spawnSync("npm", ["install", "-g", "@creator-notes/cnotes"], {
|
|
94
|
+
stdio: "inherit",
|
|
95
|
+
shell: true,
|
|
96
|
+
});
|
|
97
|
+
if (result.error) {
|
|
98
|
+
return { ok: false, error: result.error.message };
|
|
99
|
+
}
|
|
100
|
+
if (result.status !== 0) {
|
|
101
|
+
return { ok: false, error: `npm exited with code ${result.status}` };
|
|
102
|
+
}
|
|
103
|
+
return { ok: true };
|
|
104
|
+
}
|
|
105
|
+
export function registerInitCommand(program) {
|
|
106
|
+
program
|
|
107
|
+
.command("init")
|
|
108
|
+
.description("Set up authentication and workspace")
|
|
109
|
+
.action(async () => {
|
|
110
|
+
try {
|
|
111
|
+
await runInit(program);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
// Clean exit on Ctrl+C during prompts
|
|
115
|
+
if (error &&
|
|
116
|
+
typeof error === "object" &&
|
|
117
|
+
"name" in error &&
|
|
118
|
+
error.name === "ExitPromptError") {
|
|
119
|
+
console.log("\n Setup cancelled.");
|
|
120
|
+
process.exit(0);
|
|
121
|
+
}
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
async function runInit(program) {
|
|
127
|
+
const version = program.version() || "0.1.0";
|
|
128
|
+
printBanner(version);
|
|
129
|
+
// Non-TTY (coding agents, CI, piped shells): no interactive prompts and no
|
|
130
|
+
// browser we can open. Drive a fully scriptable flow that gets the agent all
|
|
131
|
+
// the way to "set up" instead of dead-ending with a useless placeholder.
|
|
132
|
+
if (!process.stdout.isTTY) {
|
|
133
|
+
await runInitNonInteractive();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Detect current state
|
|
137
|
+
const config = loadConfig();
|
|
138
|
+
const serverUrl = config.currentServer;
|
|
139
|
+
const sc = getServerConfig(config, serverUrl);
|
|
140
|
+
const isAuthenticated = !!(sc?.token);
|
|
141
|
+
const hasWorkspace = !!(sc?.workspaceId);
|
|
142
|
+
// Already fully configured — still offer skill / global install if missing
|
|
143
|
+
if (isAuthenticated && hasWorkspace) {
|
|
144
|
+
console.log(` ${CHECK} Already authenticated as ${bold(sc?.email || "unknown")}`);
|
|
145
|
+
console.log(` ${CHECK} Workspace is active`);
|
|
146
|
+
console.log();
|
|
147
|
+
await maybeInstallSkill();
|
|
148
|
+
const installedGlobally = await maybeInstallGlobally();
|
|
149
|
+
await maybeInstallSessionHook(installedGlobally);
|
|
150
|
+
console.log(` You're all set! Here are some commands to try:`);
|
|
151
|
+
console.log();
|
|
152
|
+
printNextSteps(installedGlobally ? "cnotes" : detectCnCommand());
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Count remaining steps
|
|
156
|
+
const stepsNeeded = (isAuthenticated ? 0 : 1) + (hasWorkspace ? 0 : 1);
|
|
157
|
+
let currentStep = 0;
|
|
158
|
+
console.log(` Welcome! This will walk you through setup.`);
|
|
159
|
+
console.log();
|
|
160
|
+
// ── Step: Authentication ──────────────────────────────────
|
|
161
|
+
let email = sc?.email || "unknown";
|
|
162
|
+
if (!isAuthenticated) {
|
|
163
|
+
currentStep++;
|
|
164
|
+
printStepHeader(currentStep, stepsNeeded, "Authentication");
|
|
165
|
+
console.log(` Opening your browser to sign in...`);
|
|
166
|
+
const result = await browserLogin(serverUrl, false, { quiet: true });
|
|
167
|
+
email = result.email;
|
|
168
|
+
console.log(` ${CHECK} Authenticated as ${bold(email)}`);
|
|
169
|
+
console.log();
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
console.log(` ${CHECK} Authenticated as ${bold(email)} ${dim("(already configured)")}`);
|
|
173
|
+
console.log();
|
|
174
|
+
}
|
|
175
|
+
// Reload config to get current token (may have changed after auth)
|
|
176
|
+
const currentConfig = loadConfig();
|
|
177
|
+
const currentSc = getServerConfig(currentConfig, serverUrl);
|
|
178
|
+
const token = currentSc?.token || "";
|
|
179
|
+
// ── Step: Workspace ───────────────────────────────────────
|
|
180
|
+
let workspaceName = "";
|
|
181
|
+
if (!hasWorkspace) {
|
|
182
|
+
currentStep++;
|
|
183
|
+
printStepHeader(currentStep, stepsNeeded, "Workspace");
|
|
184
|
+
const result = await fetchAndSelectWorkspace(serverUrl, token);
|
|
185
|
+
if (!result) {
|
|
186
|
+
console.log(` ${WARN} No workspaces found. Create one at ${cyan(serverUrl)} first.`);
|
|
187
|
+
console.log();
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
workspaceName = result.name;
|
|
191
|
+
console.log(` ${CHECK} Workspace ${bold(`"${workspaceName}"`)} selected`);
|
|
192
|
+
console.log();
|
|
193
|
+
}
|
|
194
|
+
// ── Verification ──────────────────────────────────────────
|
|
195
|
+
printDivider("All set!");
|
|
196
|
+
// Reload final state
|
|
197
|
+
const finalSc = getServerConfig(loadConfig(), serverUrl);
|
|
198
|
+
console.log(` ${CHECK} ${dim("Authentication")} ${email}`);
|
|
199
|
+
if (workspaceName) {
|
|
200
|
+
console.log(` ${CHECK} ${dim("Workspace")} ${workspaceName}`);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
console.log(` ${CHECK} ${dim("Workspace")} active`);
|
|
204
|
+
}
|
|
205
|
+
// Quick connectivity check
|
|
206
|
+
if (finalSc?.token && finalSc?.workspaceId) {
|
|
207
|
+
try {
|
|
208
|
+
const api = new ApiClient(serverUrl, finalSc.token);
|
|
209
|
+
await api.get(`/api/notes?workspaceId=${finalSc.workspaceId}&limit=1&excludeContent=true`);
|
|
210
|
+
console.log(` ${CHECK} ${dim("Connection")} ${green("connected")}`);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
console.log(` ${WARN} ${dim("Connection")} could not reach API`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// ── Skill (Claude Code + Codex) + global install ────────────
|
|
217
|
+
await maybeInstallSkill();
|
|
218
|
+
const installedGlobally = await maybeInstallGlobally();
|
|
219
|
+
// ── Conversation capture (Claude Code SessionStart hook) ────
|
|
220
|
+
await maybeInstallSessionHook(installedGlobally);
|
|
221
|
+
// ── Optional: MCP for Claude Desktop ────────────────────────
|
|
222
|
+
// Claude Code and Codex use the cnotes skill (installed above), so they don't
|
|
223
|
+
// need MCP. Claude Desktop has no skill mechanism — MCP is how it reaches
|
|
224
|
+
// CreatorNotes. Codex users who still want MCP can run `cnotes mcp setup-codex`.
|
|
225
|
+
console.log();
|
|
226
|
+
const mcpChoice = await select({
|
|
227
|
+
message: "Set up the MCP server for Claude Desktop?",
|
|
228
|
+
choices: [
|
|
229
|
+
{ name: "Yes — configure Claude Desktop", value: "claude" },
|
|
230
|
+
{ name: "Skip for now", value: "skip" },
|
|
231
|
+
],
|
|
232
|
+
});
|
|
233
|
+
if (mcpChoice === "claude" && finalSc?.token) {
|
|
234
|
+
const mcpCfg = {
|
|
235
|
+
serverUrl: serverUrl,
|
|
236
|
+
token: finalSc.token,
|
|
237
|
+
workspaceId: finalSc.workspaceId,
|
|
238
|
+
};
|
|
239
|
+
console.log();
|
|
240
|
+
console.log(` Setting up ${bold("Claude Desktop")}...`);
|
|
241
|
+
try {
|
|
242
|
+
const result = installMcpConfig("claude", mcpCfg);
|
|
243
|
+
if (result.created) {
|
|
244
|
+
console.log(` ${CHECK} Config created at ${dim(result.configPath)}`);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
console.log(` ${CHECK} Config updated at ${dim(result.configPath)}`);
|
|
248
|
+
if (result.backedUp) {
|
|
249
|
+
console.log(` ${dim(` Backup saved to ${result.backedUp}`)}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
console.log();
|
|
253
|
+
console.log(` Restart ${bold("Claude Desktop")} to start using CreatorNotes.`);
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
console.log(` ${WARN} Could not write config automatically.`);
|
|
257
|
+
console.log(` ${dim(` Error: ${err instanceof Error ? err.message : String(err)}`)}`);
|
|
258
|
+
console.log();
|
|
259
|
+
console.log(` You can manually add this to ${cyan(getConfigPath("claude"))}:`);
|
|
260
|
+
console.log();
|
|
261
|
+
console.log(JSON.stringify(buildClaudeConfig(mcpCfg), null, 2));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
console.log();
|
|
265
|
+
printNextSteps(installedGlobally ? "cnotes" : detectCnCommand());
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Non-interactive setup path for coding agents, CI, and piped shells.
|
|
269
|
+
*
|
|
270
|
+
* There's no TTY for prompts and no browser to open, so instead of bailing we:
|
|
271
|
+
* - hand the agent a one-action sign-in handoff when unauthenticated
|
|
272
|
+
* (open URL → user signs in → paste back the `auth login --token` command),
|
|
273
|
+
* - auto-select the workspace when there's exactly one (or list IDs to pick),
|
|
274
|
+
* - install the cnotes skill for whichever agents are present (Claude Code, Codex),
|
|
275
|
+
* and set a non-zero exit code whenever setup is NOT yet complete so the agent
|
|
276
|
+
* never reports false success.
|
|
277
|
+
*/
|
|
278
|
+
async function runInitNonInteractive() {
|
|
279
|
+
const cli = detectCnCommand();
|
|
280
|
+
const config = loadConfig();
|
|
281
|
+
const serverUrl = config.currentServer;
|
|
282
|
+
const sc = getServerConfig(config, serverUrl);
|
|
283
|
+
// ── Not authenticated: hand the browser sign-in off to the user ──
|
|
284
|
+
if (!sc?.token) {
|
|
285
|
+
const authUrl = `${serverUrl}/auth/cli`;
|
|
286
|
+
console.log(` ${WARN} ${bold("Sign-in required.")} This shell can't open a browser, so hand the sign-in to your user.`);
|
|
287
|
+
console.log();
|
|
288
|
+
console.log(` Show your user this link and ask them to click it to sign in:`);
|
|
289
|
+
console.log();
|
|
290
|
+
console.log(` ${cyan(authUrl)}`);
|
|
291
|
+
console.log();
|
|
292
|
+
console.log(` After they sign in, they'll paste back a command like this.`);
|
|
293
|
+
console.log(` Run it exactly as given (don't change the token):`);
|
|
294
|
+
console.log();
|
|
295
|
+
console.log(` ${cyan(`${cli} auth login --token cn_xxxxxxxxxxxx`)}`);
|
|
296
|
+
console.log();
|
|
297
|
+
console.log(` Then finish setup by running ${cyan(`${cli} init`)} again.`);
|
|
298
|
+
console.log();
|
|
299
|
+
process.exitCode = 1;
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
console.log(` ${CHECK} Authenticated as ${bold(sc.email || "unknown")}`);
|
|
303
|
+
// ── Authenticated but no workspace: auto-select the only one, else list ──
|
|
304
|
+
if (!sc.workspaceId) {
|
|
305
|
+
try {
|
|
306
|
+
const api = new ApiClient(serverUrl, sc.token);
|
|
307
|
+
const data = await api.get("/api/workspaces");
|
|
308
|
+
const workspaces = data.workspaces || data;
|
|
309
|
+
const list = Array.isArray(workspaces) ? workspaces : [];
|
|
310
|
+
if (list.length === 0) {
|
|
311
|
+
console.log(` ${WARN} No workspaces yet. Create one at ${cyan(serverUrl)}, then re-run ${cyan(`${cli} init`)}.`);
|
|
312
|
+
process.exitCode = 1;
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
if (list.length === 1) {
|
|
316
|
+
const id = String(list[0]._id || list[0].id || "");
|
|
317
|
+
const name = String(list[0].name || "(unnamed)");
|
|
318
|
+
setWorkspaceId(config, serverUrl, id);
|
|
319
|
+
console.log(` ${CHECK} Workspace ${bold(`"${name}"`)} selected`);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
console.log(` ${WARN} You have multiple workspaces — pick one and run it:`);
|
|
323
|
+
for (const w of list) {
|
|
324
|
+
const id = String(w._id || w.id || "");
|
|
325
|
+
console.log(` ${cyan(`${cli} workspace select ${id}`)} ${dim(String(w.name || ""))}`);
|
|
326
|
+
}
|
|
327
|
+
process.exitCode = 1;
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
console.log(` ${WARN} Could not reach the workspace API: ${dim(err instanceof Error ? err.message : String(err))}`);
|
|
333
|
+
process.exitCode = 1;
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
console.log(` ${CHECK} Workspace is active`);
|
|
339
|
+
}
|
|
340
|
+
// ── Install the agent skill(s) (best-effort, no prompt) ──
|
|
341
|
+
for (const target of SKILL_TARGETS.filter(hasAgentConfigDir)) {
|
|
342
|
+
installSkillForTarget(target);
|
|
343
|
+
}
|
|
344
|
+
// ── Conversation capture (Claude Code SessionStart hook) ──
|
|
345
|
+
// Best-effort + silent on failure: the env-var fallback still works, and a
|
|
346
|
+
// headless run must never fail setup over an optional capture hook.
|
|
347
|
+
if (hasAgentConfigDir("claude") && !isClaudeSessionHookInstalled()) {
|
|
348
|
+
try {
|
|
349
|
+
// No global install happens in this flow, so under dlx `cnotes` won't be on
|
|
350
|
+
// PATH — use the npx form so the hook resolves instead of no-opping.
|
|
351
|
+
const result = installClaudeSessionHook(isRunningUnderDlx() ? SESSION_HOOK_COMMAND_NPX : SESSION_HOOK_COMMAND);
|
|
352
|
+
if (result.status !== "already-present") {
|
|
353
|
+
console.log(` ${CHECK} Conversation capture enabled ${dim(`(${result.configPath})`)}`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
/* ignore — capture is optional; env-var fallback still applies */
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
console.log();
|
|
361
|
+
console.log(` ${green("You're all set.")}`);
|
|
362
|
+
if (isRunningUnderDlx()) {
|
|
363
|
+
console.log(` ${dim("Tip: run")} ${cyan("npm install -g @creator-notes/cnotes")} ${dim("once to drop the npx prefix.")}`);
|
|
364
|
+
}
|
|
365
|
+
console.log();
|
|
366
|
+
printNextSteps(cli);
|
|
367
|
+
}
|
|
368
|
+
// ── Skill install ───────────────────────────────────────────
|
|
369
|
+
async function maybeInstallSkill() {
|
|
370
|
+
// Install for whichever agents the user actually has (Claude Code, Codex).
|
|
371
|
+
const targets = SKILL_TARGETS.filter(hasAgentConfigDir);
|
|
372
|
+
if (targets.length === 0)
|
|
373
|
+
return;
|
|
374
|
+
const labels = targets.map(skillTargetLabel).join(" and ");
|
|
375
|
+
console.log();
|
|
376
|
+
const wantSkill = await confirm({
|
|
377
|
+
message: `Install the ${labels} skill so your agent knows how to use cnotes?`,
|
|
378
|
+
default: true,
|
|
379
|
+
});
|
|
380
|
+
if (!wantSkill)
|
|
381
|
+
return;
|
|
382
|
+
for (const target of targets) {
|
|
383
|
+
installSkillForTarget(target);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
/** Install (or refresh) the bundled skill for one agent, reporting the result. */
|
|
387
|
+
function installSkillForTarget(target) {
|
|
388
|
+
const label = skillTargetLabel(target);
|
|
389
|
+
try {
|
|
390
|
+
const result = installSkill(target);
|
|
391
|
+
console.log(result.alreadyUpToDate
|
|
392
|
+
? ` ${CHECK} ${label} skill already up to date`
|
|
393
|
+
: ` ${CHECK} ${label} skill installed at ${dim(result.destPath)}`);
|
|
394
|
+
}
|
|
395
|
+
catch (err) {
|
|
396
|
+
console.log(` ${WARN} Could not install ${label} skill: ${dim(err instanceof Error ? err.message : String(err))}`);
|
|
397
|
+
console.log(` ${dim(` Expected destination: ${getSkillDestPath(target)}`)}`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// ── Conversation capture (Claude Code SessionStart hook) ─────
|
|
401
|
+
/**
|
|
402
|
+
* Offer to add a SessionStart hook to ~/.claude/settings.json so Claude Code
|
|
403
|
+
* agent runs link back to the conversation that drove them (and can be resumed
|
|
404
|
+
* from the timeline). Claude-Code-only — the hook is Claude-specific. Skipped
|
|
405
|
+
* silently when already installed so re-running init doesn't nag.
|
|
406
|
+
*/
|
|
407
|
+
async function maybeInstallSessionHook(installedGlobally) {
|
|
408
|
+
if (!hasAgentConfigDir("claude"))
|
|
409
|
+
return; // Claude Code not present
|
|
410
|
+
if (isClaudeSessionHookInstalled())
|
|
411
|
+
return; // already set up — no prompt
|
|
412
|
+
console.log();
|
|
413
|
+
const want = await confirm({
|
|
414
|
+
message: "Link Claude Code conversations to your agent runs? (adds a SessionStart hook to ~/.claude/settings.json)",
|
|
415
|
+
default: true,
|
|
416
|
+
});
|
|
417
|
+
if (!want)
|
|
418
|
+
return;
|
|
419
|
+
try {
|
|
420
|
+
// Pick the command the hook will run: `cnotes` when it'll be on PATH, otherwise
|
|
421
|
+
// the npx form so the hook actually resolves instead of failing every
|
|
422
|
+
// session start with `command not found`.
|
|
423
|
+
const cnAvailable = !isRunningUnderDlx() || installedGlobally;
|
|
424
|
+
const result = installClaudeSessionHook(cnAvailable ? SESSION_HOOK_COMMAND : SESSION_HOOK_COMMAND_NPX);
|
|
425
|
+
console.log(` ${CHECK} Conversation capture enabled ${dim(`(${result.configPath})`)}`);
|
|
426
|
+
if (result.backedUp) {
|
|
427
|
+
console.log(` ${dim(` Backup saved to ${result.backedUp}`)}`);
|
|
428
|
+
}
|
|
429
|
+
if (!cnAvailable) {
|
|
430
|
+
console.log(` ${dim(" Tip: install cnotes globally for a faster hook —")} ${cyan("npm i -g @creator-notes/cnotes")}`);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
catch (err) {
|
|
434
|
+
console.log(` ${WARN} Could not enable conversation capture: ${dim(err instanceof Error ? err.message : String(err))}`);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
// ── Global install ──────────────────────────────────────────
|
|
438
|
+
/** Returns true if `cnotes` is now globally available. */
|
|
439
|
+
async function maybeInstallGlobally() {
|
|
440
|
+
// Only offer if running through a dlx-style runner — otherwise the user already has cnotes globally.
|
|
441
|
+
if (!isRunningUnderDlx())
|
|
442
|
+
return true;
|
|
443
|
+
console.log();
|
|
444
|
+
const wantGlobal = await confirm({
|
|
445
|
+
message: "Install `cnotes` globally so future calls are faster?",
|
|
446
|
+
default: true,
|
|
447
|
+
});
|
|
448
|
+
if (!wantGlobal) {
|
|
449
|
+
console.log(` ${dim("You can install later with:")} ${cyan("npm install -g @creator-notes/cnotes")}`);
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
console.log();
|
|
453
|
+
console.log(` ${dim("Running")} ${cyan("npm install -g @creator-notes/cnotes")}${dim("...")}`);
|
|
454
|
+
console.log();
|
|
455
|
+
const result = installGlobally();
|
|
456
|
+
if (result.ok) {
|
|
457
|
+
console.log(` ${CHECK} ${cyan("cnotes")} is now globally available`);
|
|
458
|
+
return true;
|
|
459
|
+
}
|
|
460
|
+
const errMsg = result.error || "unknown error";
|
|
461
|
+
const looksLikePermissionError = /eacces|permission denied|operation not permitted/i.test(errMsg);
|
|
462
|
+
console.log(` ${WARN} Global install failed: ${dim(errMsg)}`);
|
|
463
|
+
if (looksLikePermissionError) {
|
|
464
|
+
console.log(` ${dim("This looks like a permissions issue. Either use a Node version manager")}`);
|
|
465
|
+
console.log(` ${dim("(nvm, fnm, asdf) or run with sudo:")} ${cyan("sudo npm install -g @creator-notes/cnotes")}`);
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
console.log(` ${dim("You can run it manually:")} ${cyan("npm install -g @creator-notes/cnotes")}`);
|
|
469
|
+
}
|
|
470
|
+
console.log(` ${dim("Or keep using")} ${cyan("npx @creator-notes/cnotes")}${dim(" — both work.")}`);
|
|
471
|
+
return false;
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
/** Build the Claude Desktop MCP config object. */
|
|
3
|
+
export declare function buildClaudeConfig(cfg: {
|
|
4
|
+
serverUrl: string;
|
|
5
|
+
token: string;
|
|
6
|
+
workspaceId?: string;
|
|
7
|
+
}): object;
|
|
8
|
+
/** Build the Codex config.toml snippet string. */
|
|
9
|
+
export declare function buildCodexConfig(cfg: {
|
|
10
|
+
serverUrl: string;
|
|
11
|
+
token: string;
|
|
12
|
+
workspaceId?: string;
|
|
13
|
+
}): string;
|
|
14
|
+
export declare function registerMcpCommands(program: Command): void;
|
|
15
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAiBzG;AAED,kDAAkD;AAClD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAcxG;AAWD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwE1D"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { resolve, dirname } from "path";
|
|
2
|
+
import { fileURLToPath } from "url";
|
|
3
|
+
import { resolveBaseConfig } from "../lib/config.js";
|
|
4
|
+
import { handleError } from "../lib/errors.js";
|
|
5
|
+
/** Build the Claude Desktop MCP config object. */
|
|
6
|
+
export function buildClaudeConfig(cfg) {
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const mcpServerPath = resolve(__dirname, "..", "mcp-server.js");
|
|
9
|
+
return {
|
|
10
|
+
mcpServers: {
|
|
11
|
+
cnotes: {
|
|
12
|
+
command: "node",
|
|
13
|
+
args: [mcpServerPath],
|
|
14
|
+
env: {
|
|
15
|
+
CN_SERVER: cfg.serverUrl,
|
|
16
|
+
CN_TOKEN: cfg.token,
|
|
17
|
+
CN_WORKSPACE: cfg.workspaceId || "<your-workspace-id>",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** Build the Codex config.toml snippet string. */
|
|
24
|
+
export function buildCodexConfig(cfg) {
|
|
25
|
+
const cliDir = dirname(fileURLToPath(import.meta.url));
|
|
26
|
+
const mcpServerPath = resolve(cliDir, "..", "mcp-server.js");
|
|
27
|
+
const ws = cfg.workspaceId || "<your-workspace-id>";
|
|
28
|
+
return [
|
|
29
|
+
`[mcp_servers.cnotes]`,
|
|
30
|
+
`command = "node"`,
|
|
31
|
+
`args = ["${mcpServerPath}"]`,
|
|
32
|
+
``,
|
|
33
|
+
`[mcp_servers.cnotes.env]`,
|
|
34
|
+
`CN_SERVER = "${cfg.serverUrl}"`,
|
|
35
|
+
`CN_TOKEN = "${cfg.token}"`,
|
|
36
|
+
`CN_WORKSPACE = "${ws}"`,
|
|
37
|
+
].join("\n");
|
|
38
|
+
}
|
|
39
|
+
function printAuthWarnings(cfg) {
|
|
40
|
+
if (!cfg.token) {
|
|
41
|
+
console.log("\nNote: No auth token found. Run `cnotes auth login` first.");
|
|
42
|
+
}
|
|
43
|
+
if (!cfg.workspaceId) {
|
|
44
|
+
console.log("\nNote: No workspace selected. Run `cnotes workspace select` first.");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function registerMcpCommands(program) {
|
|
48
|
+
const mcp = program
|
|
49
|
+
.command("mcp")
|
|
50
|
+
.description("MCP server utilities");
|
|
51
|
+
mcp
|
|
52
|
+
.command("setup")
|
|
53
|
+
.description("Print Claude Desktop MCP config for this workspace")
|
|
54
|
+
.action(async () => {
|
|
55
|
+
const json = program.opts().json ?? false;
|
|
56
|
+
try {
|
|
57
|
+
const opts = program.opts();
|
|
58
|
+
const cfg = resolveBaseConfig(opts);
|
|
59
|
+
const config = buildClaudeConfig(cfg);
|
|
60
|
+
if (json) {
|
|
61
|
+
console.log(JSON.stringify(config, null, 2));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const configPath = process.platform === "win32"
|
|
65
|
+
? "%APPDATA%\\Claude\\claude_desktop_config.json"
|
|
66
|
+
: process.platform === "darwin"
|
|
67
|
+
? "~/Library/Application Support/Claude/claude_desktop_config.json"
|
|
68
|
+
: "~/.config/Claude/claude_desktop_config.json";
|
|
69
|
+
console.log(`Add this to ${configPath}:\n`);
|
|
70
|
+
console.log(JSON.stringify(config, null, 2));
|
|
71
|
+
console.log("\nThen restart Claude Desktop.");
|
|
72
|
+
printAuthWarnings(cfg);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
handleError(error, json);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
mcp
|
|
80
|
+
.command("setup-codex")
|
|
81
|
+
.description("Print OpenAI Codex MCP config for this workspace")
|
|
82
|
+
.action(async () => {
|
|
83
|
+
const json = program.opts().json ?? false;
|
|
84
|
+
try {
|
|
85
|
+
const opts = program.opts();
|
|
86
|
+
const cfg = resolveBaseConfig(opts);
|
|
87
|
+
const toml = buildCodexConfig(cfg);
|
|
88
|
+
if (json) {
|
|
89
|
+
const cliDir = dirname(fileURLToPath(import.meta.url));
|
|
90
|
+
const mcpPath = resolve(cliDir, "..", "mcp-server.js");
|
|
91
|
+
console.log(JSON.stringify({
|
|
92
|
+
mcp_servers: {
|
|
93
|
+
cnotes: {
|
|
94
|
+
command: "node",
|
|
95
|
+
args: [mcpPath],
|
|
96
|
+
env: {
|
|
97
|
+
CN_SERVER: cfg.serverUrl,
|
|
98
|
+
CN_TOKEN: cfg.token,
|
|
99
|
+
CN_WORKSPACE: cfg.workspaceId || "<your-workspace-id>",
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
}, null, 2));
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
const configPath = "~/.codex/config.toml";
|
|
107
|
+
console.log(`Add this to ${configPath}:\n`);
|
|
108
|
+
console.log(toml);
|
|
109
|
+
console.log("\nThen restart Codex or start a new session to load the MCP server.");
|
|
110
|
+
printAuthWarnings(cfg);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
handleError(error, json);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2GpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+G7D"}
|