@creator-notes/cnotes 0.35.0 → 0.37.0
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 +8 -0
- package/dist/cn.js +13 -5
- package/dist/cn.js.map +1 -1
- package/dist/commands/canvas.d.ts.map +1 -1
- package/dist/commands/canvas.js +13 -0
- package/dist/commands/canvas.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +21 -14
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +7 -2
- package/dist/commands/skills.js.map +1 -1
- package/dist/generated/embedded-build.d.ts +22 -0
- package/dist/generated/embedded-build.d.ts.map +1 -0
- package/dist/generated/embedded-build.js +14 -0
- package/dist/generated/embedded-build.js.map +1 -0
- package/dist/lib/install-mcp.d.ts.map +1 -1
- package/dist/lib/install-mcp.js +4 -7
- package/dist/lib/install-mcp.js.map +1 -1
- package/dist/lib/install-skill.d.ts +2 -1
- package/dist/lib/install-skill.d.ts.map +1 -1
- package/dist/lib/install-skill.js +40 -4
- package/dist/lib/install-skill.js.map +1 -1
- package/dist/lib/runtime.d.ts +40 -0
- package/dist/lib/runtime.d.ts.map +1 -0
- package/dist/lib/runtime.js +79 -0
- package/dist/lib/runtime.js.map +1 -0
- package/dist/mcp-server.js +2 -2
- package/dist/mcp-server.js.map +1 -1
- package/package.json +3 -1
- package/skills/cnotes/SKILL.md +6 -0
- package/skills/howto-filmstrips/SKILL.md +214 -0
- package/skills/howto-filmstrips/scripts/inject-highlight.js +198 -0
- package/skills/howto-filmstrips/scripts/soft-spotlight.py +75 -0
package/dist/commands/skills.js
CHANGED
|
@@ -23,7 +23,7 @@ function resolveTargets(agentOpt) {
|
|
|
23
23
|
export function registerSkillsCommands(program) {
|
|
24
24
|
const skills = program
|
|
25
25
|
.command("skills")
|
|
26
|
-
.description("Install bundled agent skills (e.g. fat-marker flows) into Claude Code or Codex");
|
|
26
|
+
.description("Install bundled agent skills (e.g. fat-marker flows, how-to filmstrips) into Claude Code or Codex");
|
|
27
27
|
skills
|
|
28
28
|
.command("list")
|
|
29
29
|
.description("List the skills this CLI can install")
|
|
@@ -57,6 +57,7 @@ export function registerSkillsCommands(program) {
|
|
|
57
57
|
.addHelpText("after", `
|
|
58
58
|
Examples:
|
|
59
59
|
$ cnotes skills install fat-marker
|
|
60
|
+
$ cnotes skills install howto-filmstrips
|
|
60
61
|
$ cnotes skills install fat-marker --agent codex
|
|
61
62
|
$ cnotes skills install fat-marker --agent all`)
|
|
62
63
|
.action((name, options) => {
|
|
@@ -82,11 +83,15 @@ Examples:
|
|
|
82
83
|
console.log(`✓ Installed ${skill.label} for ${label} → ${r.destPath}`);
|
|
83
84
|
}
|
|
84
85
|
}
|
|
85
|
-
//
|
|
86
|
+
// Filmstrip skills also need an authed workspace to place canvases.
|
|
86
87
|
if (skill.name === "fat-marker-flows") {
|
|
87
88
|
console.log("");
|
|
88
89
|
console.log('Next: cnotes auth login then ask your agent to "fat-marker this flow".');
|
|
89
90
|
}
|
|
91
|
+
if (skill.name === "howto-filmstrips") {
|
|
92
|
+
console.log("");
|
|
93
|
+
console.log('Next: cnotes auth login then ask your agent to "capture a how-to filmstrip of …".');
|
|
94
|
+
}
|
|
90
95
|
}
|
|
91
96
|
catch (error) {
|
|
92
97
|
handleError(error, cfg.json);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,aAAa,EACb,aAAa,EAEb,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC;;;;;GAKG;AACH,SAAS,cAAc,CAAC,QAAiB;IACvC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,OAAO;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,IAAI,eAAe,CACvB,oBAAoB,QAAQ,+BAA+B,CAC5D,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build-time asset embedding for the standalone (bun-compiled) binary.
|
|
3
|
+
*
|
|
4
|
+
* The checked-in copy is the npm STUB: `EMBEDDED_BUILD` is null, which is how
|
|
5
|
+
* the CLI knows it is running from an npm install (assets live on disk inside
|
|
6
|
+
* the package). `scripts/build-binaries.mjs` overwrites this file with the real
|
|
7
|
+
* payload — version, target, and the whole `skills/` tree base64-encoded —
|
|
8
|
+
* right before `bun build --compile`, then restores this stub. Nothing outside
|
|
9
|
+
* that script may write here, and nothing may import this module except
|
|
10
|
+
* `lib/runtime.ts`, so the "am I a compiled binary?" question has exactly one
|
|
11
|
+
* source of truth.
|
|
12
|
+
*/
|
|
13
|
+
export interface EmbeddedBuild {
|
|
14
|
+
/** CLI version baked in at compile time (package.json is not on disk). */
|
|
15
|
+
version: string;
|
|
16
|
+
/** bun compile target, e.g. "bun-darwin-arm64" (diagnostic only). */
|
|
17
|
+
target: string;
|
|
18
|
+
/** skills/ tree: path relative to skills/ root → base64 file contents. */
|
|
19
|
+
skills: Record<string, string>;
|
|
20
|
+
}
|
|
21
|
+
export declare const EMBEDDED_BUILD: EmbeddedBuild | null;
|
|
22
|
+
//# sourceMappingURL=embedded-build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedded-build.d.ts","sourceRoot":"","sources":["../../src/generated/embedded-build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,eAAO,MAAM,cAAc,EAAE,aAAa,GAAG,IAAW,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build-time asset embedding for the standalone (bun-compiled) binary.
|
|
3
|
+
*
|
|
4
|
+
* The checked-in copy is the npm STUB: `EMBEDDED_BUILD` is null, which is how
|
|
5
|
+
* the CLI knows it is running from an npm install (assets live on disk inside
|
|
6
|
+
* the package). `scripts/build-binaries.mjs` overwrites this file with the real
|
|
7
|
+
* payload — version, target, and the whole `skills/` tree base64-encoded —
|
|
8
|
+
* right before `bun build --compile`, then restores this stub. Nothing outside
|
|
9
|
+
* that script may write here, and nothing may import this module except
|
|
10
|
+
* `lib/runtime.ts`, so the "am I a compiled binary?" question has exactly one
|
|
11
|
+
* source of truth.
|
|
12
|
+
*/
|
|
13
|
+
export const EMBEDDED_BUILD = null;
|
|
14
|
+
//# sourceMappingURL=embedded-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedded-build.js","sourceRoot":"","sources":["../../src/generated/embedded-build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,MAAM,CAAC,MAAM,cAAc,GAAyB,IAAI,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-mcp.d.ts","sourceRoot":"","sources":["../../src/lib/install-mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3C,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAuBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAEvD;
|
|
1
|
+
{"version":3,"file":"install-mcp.d.ts","sourceRoot":"","sources":["../../src/lib/install-mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3C,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAuBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAEvD;AAsID,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,gBAAgB,GAAG,aAAa,CAExF"}
|
package/dist/lib/install-mcp.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { readFileSync, writeFileSync, mkdirSync, existsSync, copyFileSync, chmodSync } from "fs";
|
|
8
8
|
import { dirname, resolve } from "path";
|
|
9
9
|
import { homedir } from "os";
|
|
10
|
-
import {
|
|
10
|
+
import { mcpLaunchSpec } from "./runtime.js";
|
|
11
11
|
// ── Path resolution ─────────────────────────────────────────
|
|
12
12
|
function expandHome(p) {
|
|
13
13
|
return p.startsWith("~") ? resolve(homedir(), p.slice(2)) : p;
|
|
@@ -45,14 +45,11 @@ function lockDownConfigFile(configPath) {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
// ── MCP server entry ────────────────────────────────────────
|
|
48
|
-
function getMcpServerPath() {
|
|
49
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
50
|
-
return resolve(__dirname, "..", "mcp-server.js");
|
|
51
|
-
}
|
|
52
48
|
function buildMcpEntry(cfg) {
|
|
49
|
+
const launch = mcpLaunchSpec();
|
|
53
50
|
return {
|
|
54
|
-
command:
|
|
55
|
-
args:
|
|
51
|
+
command: launch.command,
|
|
52
|
+
args: launch.args,
|
|
56
53
|
env: {
|
|
57
54
|
CNOTES_SERVER: cfg.serverUrl,
|
|
58
55
|
CNOTES_TOKEN: cfg.token,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-mcp.js","sourceRoot":"","sources":["../../src/lib/install-mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"install-mcp.js","sourceRoot":"","sources":["../../src/lib/install-mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAgB7C,+DAA+D;AAE/D,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,mBAAmB;IAC1B,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;QAC1H,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;QACtG;YACE,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO,UAAU,CAAC,sBAAsB,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;AAC5E,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,IAAI,CAAC;QACH,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;IAC1E,CAAC;AACH,CAAC;AAED,+DAA+D;AAE/D,SAAS,aAAa,CAAC,GAAqB;IAC1C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE;YACH,aAAa,EAAE,GAAG,CAAC,SAAS;YAC5B,YAAY,EAAE,GAAG,CAAC,KAAK;YACvB,gBAAgB,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;SACxC;KACF,CAAC;AACJ,CAAC;AAED,+DAA+D;AAE/D,SAAS,aAAa,CAAC,GAAqB;IAC1C,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpC,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,QAA4B,CAAC;IAEjC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,GAAG,KAAK,CAAC;QAChB,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;YAC5C,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;YAC/B,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACnC,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;QACD,oDAAoD;QACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;YAC/B,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,MAAM,UAAU,GAAI,QAAQ,CAAC,UAAsC,IAAI,EAAE,CAAC;IAC1E,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC,4CAA4C;IAClE,UAAU,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACvC,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;IAEjC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7E,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC/B,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC3E,CAAC;AAED,+DAA+D;AAE/D;;;GAGG;AACH,SAAS,YAAY,CAAC,GAAqB;IACzC,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpC,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG;QACZ,sBAAsB;QACtB,cAAc,KAAK,CAAC,OAAO,GAAG;QAC9B,WAAW,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QACtD,EAAE;QACF,0BAA0B;QAC1B,oBAAoB,KAAK,CAAC,GAAG,CAAC,aAAa,GAAG;QAC9C,mBAAmB,KAAK,CAAC,GAAG,CAAC,YAAY,GAAG;QAC5C,uBAAuB,KAAK,CAAC,GAAG,CAAC,gBAAgB,GAAG;KACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,QAA4B,CAAC;IAEjC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,GAAG,KAAK,CAAC;QAChB,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;QAC/B,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEnC,IAAI,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAEhD,2EAA2E;QAC3E,0EAA0E;QAC1E,MAAM,kBAAkB,GAAG,wEAAwE,CAAC;QACpG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAElD,0EAA0E;QAC1E,sEAAsE;QACtE,oEAAoE;QACpE,2BAA2B;QAC3B,MAAM,kBAAkB,GAAG,gEAAgE,CAAC;QAC5F,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAElD,yCAAyC;QACzC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QAEvD,uBAAuB;QACvB,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;QAC1C,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,UAAU,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC/B,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC3E,CAAC;AAED,+DAA+D;AAE/D,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,GAAqB;IACvE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -35,7 +35,8 @@ export declare function legacySkillInstalled(target: SkillTarget): boolean;
|
|
|
35
35
|
*
|
|
36
36
|
* Unlike the auto-installed `cnotes` skill (a single SKILL.md), catalog skills
|
|
37
37
|
* can be whole folders — e.g. `fat-marker-flows` ships SKILL.md plus an
|
|
38
|
-
* `examples/` set of reference keyframes
|
|
38
|
+
* `examples/` set of reference keyframes, and `howto-filmstrips` ships
|
|
39
|
+
* SKILL.md plus helper `scripts/` the skill tells the agent to run.
|
|
39
40
|
* The source folder lives at `<package>/skills/<name>/`.
|
|
40
41
|
*/
|
|
41
42
|
export interface CatalogSkill {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../../src/lib/install-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../../src/lib/install-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwBH,mDAAmD;AACnD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE7C,eAAO,MAAM,aAAa,EAAE,WAAW,EAAwB,CAAC;AAEhE,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE5D;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAOD,kEAAkE;AAClE,wBAAgB,mBAAmB,IAAI,MAAM,CAM5C;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,WAAsB,GAAG,MAAM,CAEvE;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED,iEAAiE;AACjE,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,WAAsB,GAAG,OAAO,CAE7E;AAOD,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEjE;AAkDD;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,IAAI,EAAE,OAAO,CAAC;CACf;AAED,eAAO,MAAM,aAAa,EAAE,YAAY,EA+BvC,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAK3E;AAcD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,kBAAkB,CAexF;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,IAAI,kBAAkB,EAAE,CAc7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,GAAE,WAAsB,GAAG,kBAAkB,CAkB/E"}
|
|
@@ -13,6 +13,23 @@ import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync } from
|
|
|
13
13
|
import { dirname, relative, resolve } from "path";
|
|
14
14
|
import { homedir } from "os";
|
|
15
15
|
import { fileURLToPath } from "url";
|
|
16
|
+
import { materializedSkillsRoot } from "./runtime.js";
|
|
17
|
+
/**
|
|
18
|
+
* Root of the bundled skills tree, wherever this CLI is running from.
|
|
19
|
+
*
|
|
20
|
+
* npm install: `<package>/skills/` on disk (this file runs from dist/lib/, so
|
|
21
|
+
* two directories up). Compiled binary: that path points into bun's virtual
|
|
22
|
+
* filesystem and does not exist, so the embedded copy is materialized under
|
|
23
|
+
* ~/.cnotes/bundled-skills/<version>/ instead. Null only in a broken install
|
|
24
|
+
* (no skills on disk and nothing embedded); callers surface that as the
|
|
25
|
+
* existing "Bundled skill not found" error.
|
|
26
|
+
*/
|
|
27
|
+
function skillsRootDir() {
|
|
28
|
+
const disk = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "skills");
|
|
29
|
+
if (existsSync(disk))
|
|
30
|
+
return disk;
|
|
31
|
+
return materializedSkillsRoot();
|
|
32
|
+
}
|
|
16
33
|
export const SKILL_TARGETS = ["claude", "codex"];
|
|
17
34
|
/** Human-facing label for a target (used in init/output messages). */
|
|
18
35
|
export function skillTargetLabel(target) {
|
|
@@ -24,8 +41,12 @@ function agentConfigDir(target) {
|
|
|
24
41
|
}
|
|
25
42
|
/** Where the skill lives on disk inside the installed package. */
|
|
26
43
|
export function getBundledSkillPath() {
|
|
27
|
-
const
|
|
28
|
-
|
|
44
|
+
const root = skillsRootDir();
|
|
45
|
+
// A nonexistent path (not a throw) so existsSync-based callers keep their
|
|
46
|
+
// established "Bundled skill not found" behavior.
|
|
47
|
+
if (!root)
|
|
48
|
+
return resolve(homedir(), ".cnotes", "bundled-skills", "missing", "cnotes", "SKILL.md");
|
|
49
|
+
return resolve(root, "cnotes", "SKILL.md");
|
|
29
50
|
}
|
|
30
51
|
/** Where the skill should be copied to for a given agent. */
|
|
31
52
|
export function getSkillDestPath(target = "claude") {
|
|
@@ -107,6 +128,19 @@ export const SKILL_CATALOG = [
|
|
|
107
128
|
description: "Storyboard a UI flow as rough Shape Up 'broad-strokes' keyframes and lay them on a canvas as a left-to-right filmstrip.",
|
|
108
129
|
auto: false,
|
|
109
130
|
},
|
|
131
|
+
{
|
|
132
|
+
name: "howto-filmstrips",
|
|
133
|
+
aliases: [
|
|
134
|
+
"howto-filmstrip",
|
|
135
|
+
"how-to-filmstrips",
|
|
136
|
+
"how-to-filmstrip",
|
|
137
|
+
"live-howto",
|
|
138
|
+
"live-how-to",
|
|
139
|
+
],
|
|
140
|
+
label: "How-to filmstrips",
|
|
141
|
+
description: "Capture a live product how-to as screenshot filmstrips (CSS highlight + soft spotlight) and place them on a CreatorNotes canvas.",
|
|
142
|
+
auto: false,
|
|
143
|
+
},
|
|
110
144
|
];
|
|
111
145
|
/** Resolve a CLI-provided name/alias to a catalog skill (case-insensitive). */
|
|
112
146
|
export function resolveCatalogSkill(query) {
|
|
@@ -115,8 +149,10 @@ export function resolveCatalogSkill(query) {
|
|
|
115
149
|
}
|
|
116
150
|
/** Where a bundled skill's source folder lives inside the installed package. */
|
|
117
151
|
function bundledSkillDir(name) {
|
|
118
|
-
const
|
|
119
|
-
|
|
152
|
+
const root = skillsRootDir();
|
|
153
|
+
if (!root)
|
|
154
|
+
return resolve(homedir(), ".cnotes", "bundled-skills", "missing", name);
|
|
155
|
+
return resolve(root, name);
|
|
120
156
|
}
|
|
121
157
|
/** Where a skill folder should be copied for a given agent. */
|
|
122
158
|
function skillFolderDest(name, target) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/lib/install-skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/lib/install-skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime-mode detection: npm install (runs under the user's Node) vs the
|
|
3
|
+
* standalone bun-compiled binary (no Node on the machine at all).
|
|
4
|
+
*
|
|
5
|
+
* The two modes differ in exactly three ways, and every difference is answered
|
|
6
|
+
* here so command code never sniffs `process.versions.bun` or bun's virtual
|
|
7
|
+
* `/$bunfs` paths directly:
|
|
8
|
+
*
|
|
9
|
+
* 1. Version — the binary has no ../package.json on disk; it is baked into
|
|
10
|
+
* EMBEDDED_BUILD at compile time.
|
|
11
|
+
* 2. skills/ tree — the binary carries it base64-embedded and materializes it
|
|
12
|
+
* to ~/.cnotes/bundled-skills/<version>/ on first use.
|
|
13
|
+
* 3. Launching the MCP server — there is no `node` to spawn, so agent configs
|
|
14
|
+
* point back at this very binary via `cnotes mcp serve`.
|
|
15
|
+
*/
|
|
16
|
+
/** True when running as the standalone compiled binary (no Node required). */
|
|
17
|
+
export declare function isCompiledBinary(): boolean;
|
|
18
|
+
/** Compile-time version, or null under an npm install (read package.json). */
|
|
19
|
+
export declare function embeddedVersion(): string | null;
|
|
20
|
+
/**
|
|
21
|
+
* On-disk root of the bundled skills tree for the compiled binary, or null
|
|
22
|
+
* under an npm install (where skills/ ships inside the package).
|
|
23
|
+
*
|
|
24
|
+
* Materializes once per CLI version to ~/.cnotes/bundled-skills/<version>/ via
|
|
25
|
+
* a write-to-temp-then-rename so a Ctrl+C mid-write can never leave a
|
|
26
|
+
* half-populated tree that later refreshes would trust as complete.
|
|
27
|
+
*/
|
|
28
|
+
export declare function materializedSkillsRoot(): string | null;
|
|
29
|
+
/**
|
|
30
|
+
* How an agent (Claude Desktop, Codex, …) should launch the cnotes MCP server.
|
|
31
|
+
*
|
|
32
|
+
* npm install: `node <package>/dist/mcp-server.js` — unchanged, battle-tested.
|
|
33
|
+
* Compiled binary: the binary itself with `mcp serve` (there is no node, and
|
|
34
|
+
* dist/mcp-server.js only exists inside bun's virtual filesystem).
|
|
35
|
+
*/
|
|
36
|
+
export declare function mcpLaunchSpec(): {
|
|
37
|
+
command: string;
|
|
38
|
+
args: string[];
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/lib/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,8EAA8E;AAC9E,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CA6BtD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAMnE"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime-mode detection: npm install (runs under the user's Node) vs the
|
|
3
|
+
* standalone bun-compiled binary (no Node on the machine at all).
|
|
4
|
+
*
|
|
5
|
+
* The two modes differ in exactly three ways, and every difference is answered
|
|
6
|
+
* here so command code never sniffs `process.versions.bun` or bun's virtual
|
|
7
|
+
* `/$bunfs` paths directly:
|
|
8
|
+
*
|
|
9
|
+
* 1. Version — the binary has no ../package.json on disk; it is baked into
|
|
10
|
+
* EMBEDDED_BUILD at compile time.
|
|
11
|
+
* 2. skills/ tree — the binary carries it base64-embedded and materializes it
|
|
12
|
+
* to ~/.cnotes/bundled-skills/<version>/ on first use.
|
|
13
|
+
* 3. Launching the MCP server — there is no `node` to spawn, so agent configs
|
|
14
|
+
* point back at this very binary via `cnotes mcp serve`.
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, mkdirSync, renameSync, rmSync, writeFileSync } from "fs";
|
|
17
|
+
import { dirname, resolve } from "path";
|
|
18
|
+
import { homedir } from "os";
|
|
19
|
+
import { fileURLToPath } from "url";
|
|
20
|
+
import { EMBEDDED_BUILD } from "../generated/embedded-build.js";
|
|
21
|
+
/** True when running as the standalone compiled binary (no Node required). */
|
|
22
|
+
export function isCompiledBinary() {
|
|
23
|
+
return EMBEDDED_BUILD !== null;
|
|
24
|
+
}
|
|
25
|
+
/** Compile-time version, or null under an npm install (read package.json). */
|
|
26
|
+
export function embeddedVersion() {
|
|
27
|
+
return EMBEDDED_BUILD?.version ?? null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* On-disk root of the bundled skills tree for the compiled binary, or null
|
|
31
|
+
* under an npm install (where skills/ ships inside the package).
|
|
32
|
+
*
|
|
33
|
+
* Materializes once per CLI version to ~/.cnotes/bundled-skills/<version>/ via
|
|
34
|
+
* a write-to-temp-then-rename so a Ctrl+C mid-write can never leave a
|
|
35
|
+
* half-populated tree that later refreshes would trust as complete.
|
|
36
|
+
*/
|
|
37
|
+
export function materializedSkillsRoot() {
|
|
38
|
+
if (!EMBEDDED_BUILD)
|
|
39
|
+
return null;
|
|
40
|
+
const root = resolve(homedir(), ".cnotes", "bundled-skills", EMBEDDED_BUILD.version);
|
|
41
|
+
if (existsSync(root))
|
|
42
|
+
return root;
|
|
43
|
+
// Stage as a sibling of the destination, not in os.tmpdir(): rename() only
|
|
44
|
+
// atomically replaces within one filesystem, and /tmp is routinely a
|
|
45
|
+
// different mount than $HOME (EXDEV).
|
|
46
|
+
const staging = resolve(dirname(root), `.staging-${EMBEDDED_BUILD.version}-${process.pid}`);
|
|
47
|
+
rmSync(staging, { recursive: true, force: true });
|
|
48
|
+
for (const [rel, b64] of Object.entries(EMBEDDED_BUILD.skills)) {
|
|
49
|
+
const dest = resolve(staging, rel);
|
|
50
|
+
mkdirSync(dirname(dest), { recursive: true });
|
|
51
|
+
writeFileSync(dest, Buffer.from(b64, "base64"));
|
|
52
|
+
}
|
|
53
|
+
mkdirSync(dirname(root), { recursive: true });
|
|
54
|
+
try {
|
|
55
|
+
renameSync(staging, root);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
// A concurrent invocation won the rename — its tree is equally good.
|
|
59
|
+
rmSync(staging, { recursive: true, force: true });
|
|
60
|
+
if (!existsSync(root))
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
return root;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* How an agent (Claude Desktop, Codex, …) should launch the cnotes MCP server.
|
|
67
|
+
*
|
|
68
|
+
* npm install: `node <package>/dist/mcp-server.js` — unchanged, battle-tested.
|
|
69
|
+
* Compiled binary: the binary itself with `mcp serve` (there is no node, and
|
|
70
|
+
* dist/mcp-server.js only exists inside bun's virtual filesystem).
|
|
71
|
+
*/
|
|
72
|
+
export function mcpLaunchSpec() {
|
|
73
|
+
if (isCompiledBinary()) {
|
|
74
|
+
return { command: process.execPath, args: ["mcp", "serve"] };
|
|
75
|
+
}
|
|
76
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
77
|
+
return { command: "node", args: [resolve(__dirname, "..", "mcp-server.js")] };
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/lib/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB;IAC9B,OAAO,cAAc,KAAK,IAAI,CAAC;AACjC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,eAAe;IAC7B,OAAO,cAAc,EAAE,OAAO,IAAI,IAAI,CAAC;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB;IACpC,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACrF,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,2EAA2E;IAC3E,qEAAqE;IACrE,sCAAsC;IACtC,MAAM,OAAO,GAAG,OAAO,CACrB,OAAO,CAAC,IAAI,CAAC,EACb,YAAY,cAAc,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CACpD,CAAC;IACF,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACnC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,qEAAqE;QACrE,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,GAAG,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;IAC/D,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;AAChF,CAAC"}
|
package/dist/mcp-server.js
CHANGED
|
@@ -391,7 +391,7 @@ const addTextElement = ({ canvasId, content, size, color, x, y }) => withErrorHa
|
|
|
391
391
|
action: "bulkAddNodes",
|
|
392
392
|
items: [{ type: "richtext", content, size, colorHex: color, positionX: x, positionY: y }],
|
|
393
393
|
}));
|
|
394
|
-
server.tool("cnotes_canvas_add_text", "[Deprecated: use cnotes_canvas_bulk_add] Add a Text element to a canvas — free-form rich text placed directly on the canvas (markdown: headings, emphasis, images), with an optional background tint (none by default). A heading is just content '# Title'.", textElementSchema, addTextElement);
|
|
394
|
+
server.tool("cnotes_canvas_add_text", "[Deprecated: use cnotes_canvas_bulk_add] Add a Text element to a canvas — free-form rich text placed directly on the canvas (markdown: headings, emphasis, images), with an optional background tint (none by default). A heading is just content '# Title'. Height follows content: if the result carries layoutWarning the element overlaps the named existing nodes — the write succeeded, but reflow what it runs over (bulk-move/arrange) before finishing.", textElementSchema, addTextElement);
|
|
395
395
|
server.tool("cnotes_canvas_add_richtext", "[Deprecated: use cnotes_canvas_add_text or cnotes_canvas_bulk_add] Alias of cnotes_canvas_add_text — adds the same Text element (richtext) with the same arguments.", textElementSchema, addTextElement);
|
|
396
396
|
server.tool("cnotes_canvas_add_list", "[Deprecated: use cnotes_canvas_bulk_add] Add a list/grid node grouping notes on a canvas. The description is the only label; its first paragraph derives the searchable title.", {
|
|
397
397
|
canvasId: z.string().describe("Canvas ID"),
|
|
@@ -421,7 +421,7 @@ server.tool("cnotes_canvas_add_link", "[Deprecated: use cnotes_canvas_bulk_add]
|
|
|
421
421
|
items: [{ type: "canvas", linkedCanvasId: targetCanvasId, positionX: x, positionY: y }],
|
|
422
422
|
})));
|
|
423
423
|
// --- Primary bulk tool ---
|
|
424
|
-
server.tool("cnotes_canvas_bulk_add", "Add one or more items to a canvas. Use this for ALL canvas additions — single or multiple. Supported item types: note, richtext (the Text element), list, canvas (link to another canvas), section (named region frame), and edge. ALWAYS prefer this over repeated single-item calls. Items are processed in order so edges can reference nodes created earlier in the same batch via sourceItemIndex/targetItemIndex.\n\nELEMENT CHOICE — notes are the knowledge tier (typed, versioned, searchable, the only content agents read back in full); everything else is presentation furniture. Default any claim/fact/decision/finding worth keeping to a typed NOTE. Use richtext (the Text element) for card-sized framing — orientation banners, a markdown heading used as a label ('# Q1 Goals', untinted), emphasis quoting a note, image tiles — never as the sole home of a claim; section for a named REGION of the canvas; list for grouping member notes (description = one-line frame; N distinct things = N notes); canvas for portals; edge for note-to-note relationships (notes only — richtext endpoints fail; mirror the relationship as a mention in the note bodies).", {
|
|
424
|
+
server.tool("cnotes_canvas_bulk_add", "Add one or more items to a canvas. Use this for ALL canvas additions — single or multiple. Supported item types: note, richtext (the Text element), list, canvas (link to another canvas), section (named region frame), and edge. ALWAYS prefer this over repeated single-item calls. Items are processed in order so edges can reference nodes created earlier in the same batch via sourceItemIndex/targetItemIndex.\n\nELEMENT CHOICE — notes are the knowledge tier (typed, versioned, searchable, the only content agents read back in full); everything else is presentation furniture. Default any claim/fact/decision/finding worth keeping to a typed NOTE. Use richtext (the Text element) for card-sized framing — orientation banners, a markdown heading used as a label ('# Q1 Goals', untinted), emphasis quoting a note, image tiles — never as the sole home of a claim; section for a named REGION of the canvas; list for grouping member notes (description = one-line frame; N distinct things = N notes); canvas for portals; edge for note-to-note relationships (notes only — richtext endpoints fail; mirror the relationship as a mention in the note bodies).\n\nRichtext height follows content: a results[] entry carrying layoutWarning means that element overlaps the named existing nodes (common after replacing a banner with longer copy — the new card is taller). The write succeeded; reflow what it runs over (bulk-move/arrange) before finishing.", {
|
|
425
425
|
canvasId: z.string().describe("Canvas ID"),
|
|
426
426
|
notes: z.array(z.object({
|
|
427
427
|
noteId: z.string().describe("Note display ID or Convex ID"),
|