@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,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 @@
|
|
|
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":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE9E,MAAM,cAAc,GAA2B;IAC7C,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,WAAW;CACf,CAAC;AAEF,SAAS,cAAc,CAAC,KAAa;IACnC,sCAAsC;IACtC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC3C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,oBAAoB;IACpB,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,iEAAiE;IACjE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,eAAe,CACvB,kBAAkB,KAAK,8DAA8D,CACtF,CAAC;IACJ,CAAC;IAED,sBAAsB;IACtB,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IACrC,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,eAAe,CACvB,kBAAkB,KAAK,8DAA8D,CACtF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAyBD,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,gBAAgB,EAAE,0CAA0C,EAAE,IAAI,CAAC;SAC1E,MAAM,CAAC,gBAAgB,EAAE,6BAA6B,CAAC;SACvD,MAAM,CAAC,mBAAmB,EAAE,8DAA8D,CAAC;SAC3F,MAAM,CAAC,iBAAiB,EAAE,sCAAsC,CAAC;SACjE,MAAM,CAAC,aAAa,EAAE,qBAAqB,EAAE,IAAI,CAAC;SAClD,WAAW,CAAC,OAAO,EAAE;;;;CAIzB,CAAC;SACG,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAEzE,MAAM,MAAM,GAAuC;gBACjD,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC;gBAC/B,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;gBACtD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;gBACpB,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,UAAU,EAAE,IAAI,CAAC,IAAI;aACtB,CAAC;YAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAmB,eAAe,EAAE,MAAM,CAAC,CAAC;YAEtE,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACb,UAAU,CAAC,IAAI,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC9B,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,SAAS;gBACnB,IAAI,IAAI,CAAC,aAAa,EAAE;gBACxB,QAAQ,CAAC,IAAI,CAAC,iBAAiB,IAAI,kBAAkB,EAAE,EAAE,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;aAC3B,CAAC,CAAC;YACH,WAAW,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;YAEpD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;iBACpD,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC;iBAC3C,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CACT,KAAK,IAAI,CAAC,OAAO,CAAC,YAAY,mBAAmB,IAAI,CAAC,OAAO,CAAC,WAAW,WAAW,WAAW,GAAG,CACnG,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -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 @@
|
|
|
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"}
|