@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.
Files changed (158) hide show
  1. package/.claude-plugin/plugin.json +14 -0
  2. package/.mcp.json +12 -0
  3. package/LICENSE +21 -0
  4. package/README.md +303 -0
  5. package/dist/cn.d.ts +3 -0
  6. package/dist/cn.d.ts.map +1 -0
  7. package/dist/cn.js +124 -0
  8. package/dist/cn.js.map +1 -0
  9. package/dist/commands/auth.d.ts +10 -0
  10. package/dist/commands/auth.d.ts.map +1 -0
  11. package/dist/commands/auth.js +188 -0
  12. package/dist/commands/auth.js.map +1 -0
  13. package/dist/commands/canvas.d.ts +3 -0
  14. package/dist/commands/canvas.d.ts.map +1 -0
  15. package/dist/commands/canvas.js +1383 -0
  16. package/dist/commands/canvas.js.map +1 -0
  17. package/dist/commands/claude-hook.d.ts +28 -0
  18. package/dist/commands/claude-hook.d.ts.map +1 -0
  19. package/dist/commands/claude-hook.js +59 -0
  20. package/dist/commands/claude-hook.js.map +1 -0
  21. package/dist/commands/config.d.ts +3 -0
  22. package/dist/commands/config.d.ts.map +1 -0
  23. package/dist/commands/config.js +47 -0
  24. package/dist/commands/config.js.map +1 -0
  25. package/dist/commands/files.d.ts +3 -0
  26. package/dist/commands/files.d.ts.map +1 -0
  27. package/dist/commands/files.js +119 -0
  28. package/dist/commands/files.js.map +1 -0
  29. package/dist/commands/init.d.ts +3 -0
  30. package/dist/commands/init.d.ts.map +1 -0
  31. package/dist/commands/init.js +473 -0
  32. package/dist/commands/init.js.map +1 -0
  33. package/dist/commands/mcp.d.ts +15 -0
  34. package/dist/commands/mcp.d.ts.map +1 -0
  35. package/dist/commands/mcp.js +118 -0
  36. package/dist/commands/mcp.js.map +1 -0
  37. package/dist/commands/memory.d.ts +3 -0
  38. package/dist/commands/memory.d.ts.map +1 -0
  39. package/dist/commands/memory.js +150 -0
  40. package/dist/commands/memory.js.map +1 -0
  41. package/dist/commands/notes.d.ts +3 -0
  42. package/dist/commands/notes.d.ts.map +1 -0
  43. package/dist/commands/notes.js +706 -0
  44. package/dist/commands/notes.js.map +1 -0
  45. package/dist/commands/operations.d.ts +18 -0
  46. package/dist/commands/operations.d.ts.map +1 -0
  47. package/dist/commands/operations.js +231 -0
  48. package/dist/commands/operations.js.map +1 -0
  49. package/dist/commands/relationships.d.ts +3 -0
  50. package/dist/commands/relationships.d.ts.map +1 -0
  51. package/dist/commands/relationships.js +94 -0
  52. package/dist/commands/relationships.js.map +1 -0
  53. package/dist/commands/schema.d.ts +12 -0
  54. package/dist/commands/schema.d.ts.map +1 -0
  55. package/dist/commands/schema.js +85 -0
  56. package/dist/commands/schema.js.map +1 -0
  57. package/dist/commands/search.d.ts +3 -0
  58. package/dist/commands/search.d.ts.map +1 -0
  59. package/dist/commands/search.js +57 -0
  60. package/dist/commands/search.js.map +1 -0
  61. package/dist/commands/theme.d.ts +3 -0
  62. package/dist/commands/theme.d.ts.map +1 -0
  63. package/dist/commands/theme.js +184 -0
  64. package/dist/commands/theme.js.map +1 -0
  65. package/dist/commands/timeline.d.ts +3 -0
  66. package/dist/commands/timeline.d.ts.map +1 -0
  67. package/dist/commands/timeline.js +97 -0
  68. package/dist/commands/timeline.js.map +1 -0
  69. package/dist/commands/types.d.ts +3 -0
  70. package/dist/commands/types.d.ts.map +1 -0
  71. package/dist/commands/types.js +139 -0
  72. package/dist/commands/types.js.map +1 -0
  73. package/dist/commands/versions.d.ts +3 -0
  74. package/dist/commands/versions.d.ts.map +1 -0
  75. package/dist/commands/versions.js +120 -0
  76. package/dist/commands/versions.js.map +1 -0
  77. package/dist/commands/workspace.d.ts +13 -0
  78. package/dist/commands/workspace.d.ts.map +1 -0
  79. package/dist/commands/workspace.js +176 -0
  80. package/dist/commands/workspace.js.map +1 -0
  81. package/dist/lib/api-client.d.ts +45 -0
  82. package/dist/lib/api-client.d.ts.map +1 -0
  83. package/dist/lib/api-client.js +198 -0
  84. package/dist/lib/api-client.js.map +1 -0
  85. package/dist/lib/auth-store.d.ts +47 -0
  86. package/dist/lib/auth-store.d.ts.map +1 -0
  87. package/dist/lib/auth-store.js +116 -0
  88. package/dist/lib/auth-store.js.map +1 -0
  89. package/dist/lib/brand.d.ts +32 -0
  90. package/dist/lib/brand.d.ts.map +1 -0
  91. package/dist/lib/brand.js +32 -0
  92. package/dist/lib/brand.js.map +1 -0
  93. package/dist/lib/build-schema.d.ts +97 -0
  94. package/dist/lib/build-schema.d.ts.map +1 -0
  95. package/dist/lib/build-schema.js +139 -0
  96. package/dist/lib/build-schema.js.map +1 -0
  97. package/dist/lib/canvas-read.d.ts +54 -0
  98. package/dist/lib/canvas-read.d.ts.map +1 -0
  99. package/dist/lib/canvas-read.js +145 -0
  100. package/dist/lib/canvas-read.js.map +1 -0
  101. package/dist/lib/claude-session.d.ts +73 -0
  102. package/dist/lib/claude-session.d.ts.map +1 -0
  103. package/dist/lib/claude-session.js +104 -0
  104. package/dist/lib/claude-session.js.map +1 -0
  105. package/dist/lib/config.d.ts +28 -0
  106. package/dist/lib/config.d.ts.map +1 -0
  107. package/dist/lib/config.js +66 -0
  108. package/dist/lib/config.js.map +1 -0
  109. package/dist/lib/env.d.ts +14 -0
  110. package/dist/lib/env.d.ts.map +1 -0
  111. package/dist/lib/env.js +16 -0
  112. package/dist/lib/env.js.map +1 -0
  113. package/dist/lib/errors.d.ts +47 -0
  114. package/dist/lib/errors.d.ts.map +1 -0
  115. package/dist/lib/errors.js +194 -0
  116. package/dist/lib/errors.js.map +1 -0
  117. package/dist/lib/fs-utils.d.ts +2 -0
  118. package/dist/lib/fs-utils.d.ts.map +1 -0
  119. package/dist/lib/fs-utils.js +16 -0
  120. package/dist/lib/fs-utils.js.map +1 -0
  121. package/dist/lib/install-hook.d.ts +86 -0
  122. package/dist/lib/install-hook.d.ts.map +1 -0
  123. package/dist/lib/install-hook.js +168 -0
  124. package/dist/lib/install-hook.js.map +1 -0
  125. package/dist/lib/install-mcp.d.ts +21 -0
  126. package/dist/lib/install-mcp.d.ts.map +1 -0
  127. package/dist/lib/install-mcp.js +133 -0
  128. package/dist/lib/install-mcp.js.map +1 -0
  129. package/dist/lib/install-skill.d.ts +49 -0
  130. package/dist/lib/install-skill.d.ts.map +1 -0
  131. package/dist/lib/install-skill.js +113 -0
  132. package/dist/lib/install-skill.js.map +1 -0
  133. package/dist/lib/output.d.ts +29 -0
  134. package/dist/lib/output.d.ts.map +1 -0
  135. package/dist/lib/output.js +78 -0
  136. package/dist/lib/output.js.map +1 -0
  137. package/dist/lib/resolve-note.d.ts +7 -0
  138. package/dist/lib/resolve-note.d.ts.map +1 -0
  139. package/dist/lib/resolve-note.js +23 -0
  140. package/dist/lib/resolve-note.js.map +1 -0
  141. package/dist/lib/stdin.d.ts +5 -0
  142. package/dist/lib/stdin.d.ts.map +1 -0
  143. package/dist/lib/stdin.js +11 -0
  144. package/dist/lib/stdin.js.map +1 -0
  145. package/dist/lib/style.d.ts +10 -0
  146. package/dist/lib/style.d.ts.map +1 -0
  147. package/dist/lib/style.js +17 -0
  148. package/dist/lib/style.js.map +1 -0
  149. package/dist/lib/themes.d.ts +44 -0
  150. package/dist/lib/themes.d.ts.map +1 -0
  151. package/dist/lib/themes.js +168 -0
  152. package/dist/lib/themes.js.map +1 -0
  153. package/dist/mcp-server.d.ts +3 -0
  154. package/dist/mcp-server.d.ts.map +1 -0
  155. package/dist/mcp-server.js +782 -0
  156. package/dist/mcp-server.js.map +1 -0
  157. package/package.json +66 -0
  158. package/skills/cnotes/SKILL.md +680 -0
@@ -0,0 +1,184 @@
1
+ import { ApiClient } from "../lib/api-client.js";
2
+ import { resolveBaseConfig } from "../lib/config.js";
3
+ import { AuthError, ValidationError, handleError } from "../lib/errors.js";
4
+ import { outputJson, outputTable } from "../lib/output.js";
5
+ import { PRESETS, PRESET_IDS, EDITABLE_TOKEN_NAMES, EDITABLE_TOKEN_NAME_SET, hslTripleToHex, parseColorInput, } from "../lib/themes.js";
6
+ function requireAuthedConfig(program) {
7
+ const cfg = resolveBaseConfig(program.opts());
8
+ if (!cfg.token)
9
+ throw new AuthError();
10
+ return cfg;
11
+ }
12
+ export function registerThemeCommands(program) {
13
+ const theme = program
14
+ .command("theme")
15
+ .description("Manage your theme preset and per-token custom colors");
16
+ theme
17
+ .command("list")
18
+ .description("List available theme presets")
19
+ .action(async () => {
20
+ const cfg = requireAuthedConfig(program);
21
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
22
+ try {
23
+ const current = await api.get("/api/theme");
24
+ if (cfg.json) {
25
+ outputJson({
26
+ current: current.themeId,
27
+ customBaseId: current.customBaseId,
28
+ presets: PRESETS.map((p) => ({
29
+ id: p.id,
30
+ name: p.name,
31
+ isDark: p.isDark,
32
+ description: p.description,
33
+ })),
34
+ });
35
+ return;
36
+ }
37
+ const rows = PRESETS.map((p) => [
38
+ current.themeId === p.id ? "*" : "",
39
+ p.id,
40
+ p.name,
41
+ p.isDark ? "dark" : "light",
42
+ p.description,
43
+ ]);
44
+ outputTable(["", "ID", "NAME", "MODE", "DESCRIPTION"], rows);
45
+ if (current.themeId === "custom") {
46
+ console.log(`\nActive: custom (based on ${current.customBaseId}, ${Object.keys(current.customColors).length} overrides)`);
47
+ }
48
+ }
49
+ catch (error) {
50
+ handleError(error, cfg.json);
51
+ }
52
+ });
53
+ theme
54
+ .command("get")
55
+ .description("Show the active theme and any custom color overrides")
56
+ .action(async () => {
57
+ const cfg = requireAuthedConfig(program);
58
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
59
+ try {
60
+ const data = await api.get("/api/theme");
61
+ if (cfg.json) {
62
+ outputJson(data);
63
+ return;
64
+ }
65
+ console.log(`themeId: ${data.themeId}`);
66
+ console.log(`mode: ${data.isDark ? "dark" : "light"}`);
67
+ if (data.themeId === "custom") {
68
+ console.log(`customBaseId: ${data.customBaseId}`);
69
+ }
70
+ const overrides = Object.entries(data.customColors);
71
+ if (overrides.length === 0) {
72
+ console.log("custom colors: (none)");
73
+ }
74
+ else {
75
+ console.log("custom colors:");
76
+ const rows = overrides.map(([token, hsl]) => [
77
+ token,
78
+ hsl,
79
+ // Hex is a lossy preview, so omit it for alpha-bearing triples
80
+ // (including "transparent") where it would mislead.
81
+ hsl.includes("/") ? "—" : hslTripleToHex(hsl),
82
+ ]);
83
+ outputTable(["TOKEN", "HSL", "HEX"], rows);
84
+ }
85
+ }
86
+ catch (error) {
87
+ handleError(error, cfg.json);
88
+ }
89
+ });
90
+ theme
91
+ .command("set")
92
+ .description("Switch to a built-in theme preset")
93
+ .argument("<id>", "Preset ID (run `cnotes theme list` to see all)")
94
+ .action(async (id) => {
95
+ const cfg = requireAuthedConfig(program);
96
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
97
+ if (id === "custom") {
98
+ throw new ValidationError("`cnotes theme set custom` is not supported. Use `cnotes theme set-color <token> <color>` to enter custom mode (it seeds the base palette atomically).");
99
+ }
100
+ if (!PRESET_IDS.has(id)) {
101
+ throw new ValidationError(`Unknown theme id: ${id}. Run \`cnotes theme list\` to see available presets.`);
102
+ }
103
+ try {
104
+ const data = await api.put("/api/theme", { themeId: id });
105
+ if (cfg.json) {
106
+ outputJson(data);
107
+ }
108
+ else {
109
+ console.log(`Theme set to ${data.themeId} (${data.isDark ? "dark" : "light"}).`);
110
+ console.log("Reload an open browser tab to see the change.");
111
+ }
112
+ }
113
+ catch (error) {
114
+ handleError(error, cfg.json);
115
+ }
116
+ });
117
+ theme
118
+ .command("set-color")
119
+ .description("Override a single token color (switches theme to 'custom')")
120
+ .argument("<token>", "Editable token name (e.g. primary, background)")
121
+ .argument("<color>", 'HSL ("310 85% 67%"), HSL with alpha ("310 85% 67% / 0.5"), hex ("#ff00aa"), or "transparent"')
122
+ .action(async (token, color) => {
123
+ const cfg = requireAuthedConfig(program);
124
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
125
+ if (!EDITABLE_TOKEN_NAME_SET.has(token)) {
126
+ throw new ValidationError(`Token "${token}" is not editable. Editable tokens: ${EDITABLE_TOKEN_NAMES.join(", ")}`);
127
+ }
128
+ const normalized = parseColorInput(color);
129
+ if (normalized === null) {
130
+ throw new ValidationError(`Invalid color: ${color}. Use HSL ("310 85% 67%"), hex ("#ff00aa"), or "transparent".`);
131
+ }
132
+ try {
133
+ // Use PATCH so the server merges this single token into the
134
+ // existing HSL palette without round-tripping unmodified tokens.
135
+ // We still need the current themeId to seed customBaseId on the
136
+ // first transition into custom — once we're already custom, the
137
+ // server preserves the existing base.
138
+ const current = await api.get("/api/theme");
139
+ const customBaseId = current.themeId === "custom" ? undefined : current.themeId;
140
+ const data = await api.patch("/api/theme/colors", {
141
+ customColors: { [token]: normalized },
142
+ ...(customBaseId ? { customBaseId } : {}),
143
+ });
144
+ if (cfg.json) {
145
+ outputJson(data);
146
+ }
147
+ else {
148
+ const storedHsl = data.customColors[token];
149
+ const display = storedHsl ?? normalized;
150
+ // Skip the hex hint when alpha is in play — hex can't represent it.
151
+ const hexHint = storedHsl && !storedHsl.includes("/") ? hslTripleToHex(storedHsl) : "";
152
+ console.log(`Set ${token} = ${display}${hexHint && hexHint !== display ? ` (${hexHint})` : ""}.`);
153
+ console.log(`Theme is now custom (based on ${data.customBaseId}).`);
154
+ console.log("Reload an open browser tab to see the change.");
155
+ }
156
+ }
157
+ catch (error) {
158
+ handleError(error, cfg.json);
159
+ }
160
+ });
161
+ theme
162
+ .command("reset")
163
+ .description("Drop all custom color overrides and return to the base preset")
164
+ .action(async () => {
165
+ const cfg = requireAuthedConfig(program);
166
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
167
+ try {
168
+ const current = await api.get("/api/theme");
169
+ const targetId = current.themeId === "custom" ? current.customBaseId : current.themeId;
170
+ const data = await api.put("/api/theme", { themeId: targetId });
171
+ if (cfg.json) {
172
+ outputJson(data);
173
+ }
174
+ else {
175
+ console.log(`Theme reset to ${data.themeId}.`);
176
+ console.log("Reload an open browser tab to see the change.");
177
+ }
178
+ }
179
+ catch (error) {
180
+ handleError(error, cfg.json);
181
+ }
182
+ });
183
+ }
184
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/commands/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerTimelineCommands(program: Command): void;
3
+ //# sourceMappingURL=timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../src/commands/timeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoEpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsE/D"}
@@ -0,0 +1,97 @@
1
+ import { ApiClient } from "../lib/api-client.js";
2
+ import { resolveConfig } from "../lib/config.js";
3
+ import { handleError, ValidationError } from "../lib/errors.js";
4
+ import { outputJson, outputTable, timeAgo, truncate } from "../lib/output.js";
5
+ const DURATION_UNITS = {
6
+ m: 60_000,
7
+ h: 3_600_000,
8
+ d: 86_400_000,
9
+ w: 604_800_000,
10
+ };
11
+ function parseDateInput(input) {
12
+ // Relative shorthand: 7d, 3h, 30m, 2w
13
+ const rel = input.match(/^(\d+)([mhdw])$/);
14
+ if (rel) {
15
+ const amount = parseInt(rel[1], 10);
16
+ const unit = rel[2];
17
+ return Date.now() - amount * DURATION_UNITS[unit];
18
+ }
19
+ // Unix ms timestamp
20
+ if (/^\d{10,13}$/.test(input)) {
21
+ const n = parseInt(input, 10);
22
+ return input.length <= 10 ? n * 1000 : n;
23
+ }
24
+ // Reject short ambiguous strings (e.g. "7" parses as Jan 7 2001)
25
+ if (input.length < 6) {
26
+ throw new ValidationError(`Invalid date: "${input}". Use relative (7d, 2w), ISO date (2026-03-21), or unix ms.`);
27
+ }
28
+ // ISO / calendar date
29
+ const ms = new Date(input).getTime();
30
+ if (isNaN(ms)) {
31
+ throw new ValidationError(`Invalid date: "${input}". Use relative (7d, 2w), ISO date (2026-03-21), or unix ms.`);
32
+ }
33
+ return ms;
34
+ }
35
+ export function registerTimelineCommands(program) {
36
+ program
37
+ .command("timeline")
38
+ .alias("tl")
39
+ .description("Show recent changes across notes")
40
+ .option("--since <when>", "Start of range (e.g. 7d, 2w, 2026-03-21)", "7d")
41
+ .option("--until <when>", "End of range (default: now)")
42
+ .option("--type <noteType>", "Filter by note type (comma-separated, e.g. Meeting,Decision)")
43
+ .option("--note <filter>", "Filter by note ID or title substring")
44
+ .option("--limit <n>", "Max results (1-100)", "50")
45
+ .addHelpText("after", `
46
+ Examples:
47
+ $ cnotes timeline --since 7d
48
+ $ cnotes timeline --since 2026-03-01 --type Decision,Meeting --json
49
+ `)
50
+ .action(async (opts) => {
51
+ const cfg = resolveConfig(program.opts());
52
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
53
+ try {
54
+ const sinceMs = parseDateInput(opts.since);
55
+ const untilMs = opts.until ? parseDateInput(opts.until) : undefined;
56
+ const limit = Math.max(1, Math.min(100, parseInt(opts.limit, 10) || 50));
57
+ const params = {
58
+ workspaceId: cfg.workspaceId,
59
+ afterTimestamp: String(sinceMs),
60
+ beforeTimestamp: untilMs ? String(untilMs) : undefined,
61
+ limit: String(limit),
62
+ noteTypes: opts.type,
63
+ noteFilter: opts.note,
64
+ };
65
+ const data = await api.get("/api/timeline", params);
66
+ if (cfg.json) {
67
+ outputJson(data);
68
+ return;
69
+ }
70
+ if (cfg.quiet) {
71
+ for (const item of data.items) {
72
+ console.log(item.versionId);
73
+ }
74
+ return;
75
+ }
76
+ if (data.items.length === 0) {
77
+ console.log("No changes found in the specified time range.");
78
+ return;
79
+ }
80
+ const rows = data.items.map((item) => [
81
+ item.note.displayId,
82
+ `v${item.versionNumber}`,
83
+ truncate(item.changeDescription || "(no description)", 50),
84
+ timeAgo(item.createdAtRaw),
85
+ ]);
86
+ outputTable(["NOTE", "V#", "CHANGE", "WHEN"], rows);
87
+ const typeSummary = Object.entries(data.summary.byType)
88
+ .map(([type, count]) => `${type}: ${count}`)
89
+ .join(", ");
90
+ console.log(`\n${data.summary.totalChanges} changes across ${data.summary.uniqueNotes} notes (${typeSummary})`);
91
+ }
92
+ catch (error) {
93
+ handleError(error, cfg.json);
94
+ }
95
+ });
96
+ }
97
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../src/commands/timeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerTypesCommands(program: Command): void;
3
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0I5D"}
@@ -0,0 +1,139 @@
1
+ import { ApiClient } from "../lib/api-client.js";
2
+ import { resolveConfig } from "../lib/config.js";
3
+ import { handleError, ValidationError } from "../lib/errors.js";
4
+ import { outputJson, outputTable, outputQuiet } from "../lib/output.js";
5
+ export function registerTypesCommands(program) {
6
+ const types = program
7
+ .command("types")
8
+ .alias("t")
9
+ .description("Manage note types (supertags)");
10
+ types
11
+ .command("list")
12
+ .description("List note types in the current workspace")
13
+ .addHelpText("after", `
14
+ Examples:
15
+ $ cnotes types list --json
16
+ `)
17
+ .action(async () => {
18
+ const cfg = resolveConfig(program.opts());
19
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
20
+ try {
21
+ const data = await api.get("/api/supertags", {
22
+ workspaceId: cfg.workspaceId,
23
+ });
24
+ const list = Array.isArray(data) ? data : [];
25
+ if (cfg.json) {
26
+ outputJson(list, cfg.fields);
27
+ return;
28
+ }
29
+ if (list.length === 0) {
30
+ console.log("No types found.");
31
+ return;
32
+ }
33
+ const rows = list.map((s) => [
34
+ String(s.name || ""),
35
+ String(s.prefix || ""),
36
+ s.displayName !== s.name ? String(s.displayName || "") : "",
37
+ s.color ? String(s.color) : "",
38
+ s.isBuiltIn ? "yes" : "",
39
+ s.validationEnabled ? "on" : (s.validationPrompt ? "off" : ""),
40
+ ]);
41
+ outputTable(["NAME", "PREFIX", "DISPLAY NAME", "COLOR", "BUILT-IN", "RUBRIC"], rows);
42
+ console.log("\nTip: run with --json to read each type's full rubric (validationPrompt) before authoring.");
43
+ }
44
+ catch (error) {
45
+ handleError(error, cfg.json);
46
+ }
47
+ });
48
+ types
49
+ .command("create")
50
+ .description("Create a new note type")
51
+ .argument("<name>", "Type name (no spaces, e.g., PainPoint, UserStory)")
52
+ .option("--display-name <name>", "Display name (can have spaces)")
53
+ .option("--description <desc>", "Description")
54
+ .option("--color <color>", "Color hex code (e.g., #FF5733)")
55
+ .addHelpText("after", `
56
+ Examples:
57
+ $ cnotes types create Insight --display-name "Insight" --color "#4F46E5"
58
+ `)
59
+ .action(async (name, opts) => {
60
+ const cfg = resolveConfig(program.opts());
61
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
62
+ // Validate no spaces in name
63
+ if (/\s/.test(name)) {
64
+ throw new ValidationError(`Type name cannot contain spaces. Use PascalCase (e.g., "PainPoint" instead of "Pain Point").`);
65
+ }
66
+ try {
67
+ const data = await api.post("/api/supertags", {
68
+ workspaceId: cfg.workspaceId,
69
+ name,
70
+ displayName: opts.displayName,
71
+ description: opts.description,
72
+ color: opts.color,
73
+ });
74
+ if (cfg.quiet) {
75
+ outputQuiet(String(data.id || ""));
76
+ return;
77
+ }
78
+ if (cfg.json) {
79
+ outputJson(data);
80
+ }
81
+ else {
82
+ const displayName = opts.displayName ? ` (${opts.displayName})` : "";
83
+ console.log(`Created type: ${name}${displayName}`);
84
+ }
85
+ }
86
+ catch (error) {
87
+ handleError(error, cfg.json);
88
+ }
89
+ });
90
+ types
91
+ .command("update")
92
+ .description("Update a note type")
93
+ .argument("<name>", "Type name to update")
94
+ .option("--display-name <name>", "New display name (prefix is auto-derived from this)")
95
+ .option("--description <desc>", "New description")
96
+ .option("--color <color>", "Color hex code (e.g., #FF5733)")
97
+ .option("--validation-prompt <text>", "Set the type's quality rubric (the save-time check and the authoring spec agents read)")
98
+ .option("--enable-validation", "Turn this type's quality rubric on")
99
+ .option("--disable-validation", "Turn this type's quality rubric off")
100
+ .action(async (name, opts) => {
101
+ const cfg = resolveConfig(program.opts());
102
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
103
+ try {
104
+ const body = {
105
+ workspaceId: cfg.workspaceId,
106
+ name,
107
+ };
108
+ if (opts.displayName)
109
+ body.displayName = opts.displayName;
110
+ if (opts.description)
111
+ body.description = opts.description;
112
+ if (opts.color)
113
+ body.color = opts.color;
114
+ if (opts.validationPrompt)
115
+ body.validationPrompt = opts.validationPrompt;
116
+ if (opts.enableValidation && opts.disableValidation) {
117
+ throw new ValidationError("Pass only one of --enable-validation or --disable-validation.");
118
+ }
119
+ if (opts.enableValidation)
120
+ body.validationEnabled = true;
121
+ if (opts.disableValidation)
122
+ body.validationEnabled = false;
123
+ if (Object.keys(body).length === 2) {
124
+ throw new ValidationError("No update flags provided. Use --display-name, --description, --color, --validation-prompt, --enable-validation, or --disable-validation.");
125
+ }
126
+ const data = await api.patch("/api/supertags", body);
127
+ if (cfg.json) {
128
+ outputJson(data);
129
+ }
130
+ else {
131
+ console.log(`Updated type: ${name}`);
132
+ }
133
+ }
134
+ catch (error) {
135
+ handleError(error, cfg.json);
136
+ }
137
+ });
138
+ }
139
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerVersionsCommands(program: Command): void;
3
+ //# sourceMappingURL=versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAS5C,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgI/D"}
@@ -0,0 +1,120 @@
1
+ import { Option } from "commander";
2
+ import { ApiClient } from "../lib/api-client.js";
3
+ import { resolveConfig } from "../lib/config.js";
4
+ import { handleError, ValidationError } from "../lib/errors.js";
5
+ import { readFileSafe } from "../lib/fs-utils.js";
6
+ import { outputJson, outputTable, timeAgo } from "../lib/output.js";
7
+ import { resolveNoteId } from "../lib/resolve-note.js";
8
+ import { readStdin } from "../lib/stdin.js";
9
+ export function registerVersionsCommands(program) {
10
+ const versions = program
11
+ .command("versions")
12
+ .alias("v")
13
+ .description("Manage note versions");
14
+ versions
15
+ .command("list")
16
+ .description("List versions of a note")
17
+ .argument("<noteId>", "Note display ID or Convex ID")
18
+ .addHelpText("after", `
19
+ Examples:
20
+ $ cnotes versions list MEETING-12
21
+ `)
22
+ .action(async (noteId) => {
23
+ const cfg = resolveConfig(program.opts());
24
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
25
+ try {
26
+ // Resolve note ID and fetch versions from dedicated endpoint
27
+ const resolvedId = await resolveNoteId(api, cfg.workspaceId, noteId);
28
+ const data = await api.get(`/api/notes/${resolvedId}/versions`, {
29
+ workspaceId: cfg.workspaceId,
30
+ });
31
+ const versionsList = (data.versions || []);
32
+ if (cfg.json) {
33
+ outputJson(versionsList);
34
+ return;
35
+ }
36
+ if (versionsList.length === 0) {
37
+ console.log("No versions found.");
38
+ return;
39
+ }
40
+ const rows = versionsList.map((v) => [
41
+ String(v.versionNumber || ""),
42
+ v.isLatest ? "*" : "",
43
+ String(v.description || v.changeDescription || ""),
44
+ v.createdAt ? timeAgo(v.createdAt) : "",
45
+ ]);
46
+ outputTable(["VERSION", "LATEST", "DESCRIPTION", "CREATED"], rows);
47
+ }
48
+ catch (error) {
49
+ handleError(error, cfg.json);
50
+ }
51
+ });
52
+ versions
53
+ .command("create")
54
+ .description("Create a new version of a note.\n" +
55
+ " Relationship link syntax (use inside markdown):\n" +
56
+ " [NOTE-12: Title](relationship:references) → reference an existing note.\n" +
57
+ " Always include the `: Title` part — the title-less form `[NOTE-12](relationship:references)`\n" +
58
+ " produces a chip with `title: null`, which renders as \"Untitled\" in the UI.\n" +
59
+ " The relationship name is free-form (e.g. references, supports, triggers); use\n" +
60
+ " `references` if unsure.")
61
+ .argument("<noteId>", "Note display ID or Convex ID")
62
+ .option("--markdown <md>", "Content as markdown")
63
+ .option("--markdown-file <path>", "Read markdown content from file")
64
+ .option("--markdown-stdin", "Read markdown content from stdin")
65
+ .option("--description <text>", "Change description (required unless --minor is set)")
66
+ .option("--minor", "Mark as a minor change — skips the description requirement")
67
+ // Removed flags — kept as hidden options so we can emit a clear
68
+ // migration error instead of commander's generic "unknown option".
69
+ .addOption(new Option("--content-file <path>", "[removed]").hideHelp())
70
+ .addOption(new Option("--content-stdin", "[removed]").hideHelp())
71
+ .addHelpText("after", `
72
+ Examples:
73
+ $ cnotes versions create MEETING-12 --markdown-file ./meeting.md --description "Add action items"
74
+ $ echo "# Quick fix" | cnotes versions create MEETING-12 --markdown-stdin --minor
75
+ `)
76
+ .action(async (noteId, opts) => {
77
+ const cfg = resolveConfig(program.opts());
78
+ const api = new ApiClient(cfg.serverUrl, cfg.token);
79
+ try {
80
+ if (opts.contentFile || opts.contentStdin) {
81
+ throw new ValidationError("TipTap JSON input is no longer supported. Use --markdown, --markdown-file, or --markdown-stdin instead — the server now accepts markdown directly.");
82
+ }
83
+ let content;
84
+ if (opts.markdownFile) {
85
+ content = readFileSafe(opts.markdownFile);
86
+ }
87
+ else if (opts.markdownStdin) {
88
+ content = await readStdin();
89
+ }
90
+ else if (opts.markdown) {
91
+ content = opts.markdown;
92
+ }
93
+ if (!content) {
94
+ throw new ValidationError("Content is required. Use --markdown, --markdown-file, or --markdown-stdin");
95
+ }
96
+ // Enforce the same rule as the web UI: every version must have a description
97
+ // unless the caller explicitly marks it as a minor change.
98
+ if (!opts.minor && !opts.description) {
99
+ throw new ValidationError("--description is required unless --minor is set (minor changes may skip the description)");
100
+ }
101
+ // Resolve note ID if it's a display ID
102
+ const resolvedId = await resolveNoteId(api, cfg.workspaceId, noteId);
103
+ const data = await api.post(`/api/notes/${resolvedId}/versions`, {
104
+ content,
105
+ description: opts.description,
106
+ isMinor: opts.minor ? true : undefined,
107
+ });
108
+ if (cfg.json) {
109
+ outputJson(data);
110
+ }
111
+ else {
112
+ console.log(`Created version ${data.versionNumber || "new"} for ${noteId}`);
113
+ }
114
+ }
115
+ catch (error) {
116
+ handleError(error, cfg.json);
117
+ }
118
+ });
119
+ }
120
+ //# sourceMappingURL=versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/commands/versions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Command } from "commander";
2
+ export interface WorkspaceChoice {
3
+ id: string;
4
+ name: string;
5
+ }
6
+ /**
7
+ * Select a workspace from a pre-fetched list, or fetch from the API if not provided.
8
+ * Auto-selects if only one workspace exists.
9
+ * Returns null if no workspaces are available.
10
+ */
11
+ export declare function fetchAndSelectWorkspace(serverUrl: string, token: string, currentWorkspaceId?: string, prefetchedWorkspaces?: Array<Record<string, unknown>>): Promise<WorkspaceChoice | null>;
12
+ export declare function registerWorkspaceCommands(program: Command): void;
13
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,kBAAkB,CAAC,EAAE,MAAM,EAC3B,oBAAoB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACpD,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAoCjC;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiIhE"}