@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,176 @@
|
|
|
1
|
+
import { select } from "@inquirer/prompts";
|
|
2
|
+
import { ApiClient } from "../lib/api-client.js";
|
|
3
|
+
import { resolveBaseConfig } from "../lib/config.js";
|
|
4
|
+
import { loadConfig, setWorkspaceId } from "../lib/auth-store.js";
|
|
5
|
+
import { handleError, AuthError } from "../lib/errors.js";
|
|
6
|
+
import { outputJson, outputTable } from "../lib/output.js";
|
|
7
|
+
/**
|
|
8
|
+
* Select a workspace from a pre-fetched list, or fetch from the API if not provided.
|
|
9
|
+
* Auto-selects if only one workspace exists.
|
|
10
|
+
* Returns null if no workspaces are available.
|
|
11
|
+
*/
|
|
12
|
+
export async function fetchAndSelectWorkspace(serverUrl, token, currentWorkspaceId, prefetchedWorkspaces) {
|
|
13
|
+
let list;
|
|
14
|
+
if (prefetchedWorkspaces) {
|
|
15
|
+
list = prefetchedWorkspaces;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
const api = new ApiClient(serverUrl, token);
|
|
19
|
+
const data = await api.get("/api/workspaces");
|
|
20
|
+
const workspaces = data.workspaces || data;
|
|
21
|
+
list = Array.isArray(workspaces) ? workspaces : [];
|
|
22
|
+
}
|
|
23
|
+
if (list.length === 0)
|
|
24
|
+
return null;
|
|
25
|
+
let chosenId;
|
|
26
|
+
let chosenName;
|
|
27
|
+
if (list.length === 1) {
|
|
28
|
+
chosenId = String(list[0]._id || list[0].id || "");
|
|
29
|
+
chosenName = String(list[0].name || "(unnamed)");
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
chosenId = await select({
|
|
33
|
+
message: "Select a workspace to activate:",
|
|
34
|
+
choices: list.map((w) => ({
|
|
35
|
+
name: `${String(w.name || "(unnamed)")}${(w._id || w.id) === currentWorkspaceId ? " (active)" : ""}`,
|
|
36
|
+
value: String(w._id || w.id || ""),
|
|
37
|
+
})),
|
|
38
|
+
});
|
|
39
|
+
chosenName = String(list.find((w) => String(w._id || w.id) === chosenId)?.name || "(unnamed)");
|
|
40
|
+
}
|
|
41
|
+
const config = loadConfig();
|
|
42
|
+
setWorkspaceId(config, serverUrl, chosenId);
|
|
43
|
+
return { id: chosenId, name: chosenName };
|
|
44
|
+
}
|
|
45
|
+
export function registerWorkspaceCommands(program) {
|
|
46
|
+
const ws = program
|
|
47
|
+
.command("workspace")
|
|
48
|
+
.alias("ws")
|
|
49
|
+
.description("Manage workspaces");
|
|
50
|
+
ws
|
|
51
|
+
.command("list")
|
|
52
|
+
.description("List your workspaces")
|
|
53
|
+
.addHelpText("after", `
|
|
54
|
+
Examples:
|
|
55
|
+
$ cnotes workspace list --json
|
|
56
|
+
`)
|
|
57
|
+
.action(async () => {
|
|
58
|
+
const opts = program.opts();
|
|
59
|
+
const cfg = resolveBaseConfig(opts);
|
|
60
|
+
if (!cfg.token)
|
|
61
|
+
throw new AuthError();
|
|
62
|
+
const api = new ApiClient(cfg.serverUrl, cfg.token);
|
|
63
|
+
try {
|
|
64
|
+
const data = await api.get("/api/workspaces");
|
|
65
|
+
const workspaces = data.workspaces || data;
|
|
66
|
+
if (cfg.json) {
|
|
67
|
+
outputJson(workspaces);
|
|
68
|
+
}
|
|
69
|
+
else if (process.stdout.isTTY) {
|
|
70
|
+
const list = Array.isArray(workspaces) ? workspaces : [];
|
|
71
|
+
const result = await fetchAndSelectWorkspace(cfg.serverUrl, cfg.token, cfg.workspaceId, list);
|
|
72
|
+
if (!result) {
|
|
73
|
+
console.log("No workspaces found.");
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log(`Active workspace set to ${result.name}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const rows = (Array.isArray(workspaces) ? workspaces : []).map((w) => [
|
|
81
|
+
String(w._id || w.id || ""),
|
|
82
|
+
String(w.name || ""),
|
|
83
|
+
(w._id || w.id) === cfg.workspaceId ? "(active)" : "",
|
|
84
|
+
]);
|
|
85
|
+
outputTable(["ID", "NAME", ""], rows);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
handleError(error, cfg.json);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
ws
|
|
93
|
+
.command("select")
|
|
94
|
+
.description("Set the active workspace")
|
|
95
|
+
.argument("<id>", "Workspace ID")
|
|
96
|
+
.action(async (id) => {
|
|
97
|
+
const opts = program.opts();
|
|
98
|
+
const cfg = resolveBaseConfig(opts);
|
|
99
|
+
try {
|
|
100
|
+
const config = loadConfig();
|
|
101
|
+
setWorkspaceId(config, cfg.serverUrl, id);
|
|
102
|
+
if (cfg.json) {
|
|
103
|
+
outputJson({ workspaceId: id });
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
console.log(`Active workspace set to ${id}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
handleError(error, cfg.json);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
ws
|
|
114
|
+
.command("current")
|
|
115
|
+
.description("Show the active workspace")
|
|
116
|
+
.addHelpText("after", `
|
|
117
|
+
Examples:
|
|
118
|
+
$ cnotes workspace current --json
|
|
119
|
+
`)
|
|
120
|
+
.action(async () => {
|
|
121
|
+
const opts = program.opts();
|
|
122
|
+
const cfg = resolveBaseConfig(opts);
|
|
123
|
+
try {
|
|
124
|
+
if (!cfg.workspaceId) {
|
|
125
|
+
if (cfg.json) {
|
|
126
|
+
outputJson({ workspaceId: null });
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
console.log("No workspace selected. Run `cnotes workspace select <id>`");
|
|
130
|
+
}
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (!cfg.token)
|
|
134
|
+
throw new AuthError();
|
|
135
|
+
const api = new ApiClient(cfg.serverUrl, cfg.token);
|
|
136
|
+
const data = await api.get(`/api/workspaces/${cfg.workspaceId}`);
|
|
137
|
+
const workspace = data.workspace || data;
|
|
138
|
+
// Surface the workspace's relationship types alongside its identity so
|
|
139
|
+
// agents reuse existing labels instead of coining near-duplicates.
|
|
140
|
+
// Best-effort: a failure here must not break `workspace current`.
|
|
141
|
+
let relTypes = [];
|
|
142
|
+
try {
|
|
143
|
+
const relData = await api.get("/api/relationship-types", { workspaceId: cfg.workspaceId });
|
|
144
|
+
relTypes = relData.relationshipTypes || [];
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Advisory section — leave it off if the fetch fails.
|
|
148
|
+
}
|
|
149
|
+
if (cfg.json) {
|
|
150
|
+
outputJson({ ...data, relationshipTypes: relTypes });
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
console.log(`Workspace: ${workspace.name || "Unknown"}`);
|
|
154
|
+
console.log(`ID: ${cfg.workspaceId}`);
|
|
155
|
+
if (workspace.userPermission) {
|
|
156
|
+
console.log(`Role: ${workspace.userPermission}`);
|
|
157
|
+
}
|
|
158
|
+
if (relTypes.length > 0) {
|
|
159
|
+
const builtIn = relTypes.filter((t) => !t.isCustom).map((t) => t.value);
|
|
160
|
+
const custom = relTypes.filter((t) => t.isCustom).map((t) => t.value);
|
|
161
|
+
console.log("");
|
|
162
|
+
console.log("Relationship types (reuse these before inventing new ones):");
|
|
163
|
+
if (builtIn.length)
|
|
164
|
+
console.log(` built-in: ${builtIn.join(", ")}`);
|
|
165
|
+
if (custom.length)
|
|
166
|
+
console.log(` custom: ${custom.join(", ")}`);
|
|
167
|
+
console.log(" See all: cnotes rel types");
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
handleError(error, cfg.json);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export declare class ApiClient {
|
|
2
|
+
private serverUrl;
|
|
3
|
+
private token;
|
|
4
|
+
constructor(serverUrl: string, token: string);
|
|
5
|
+
/**
|
|
6
|
+
* Build request headers, attaching the active agent-run when one is
|
|
7
|
+
* open. Resolution order:
|
|
8
|
+
*
|
|
9
|
+
* 1. `CN_AGENT_RUN_ID` env var (explicit override, wins everything).
|
|
10
|
+
* 2. The `activeAgentRunId` persisted on the current server's config
|
|
11
|
+
* (written by `cnotes operations begin`, cleared by `cnotes operations
|
|
12
|
+
* end`).
|
|
13
|
+
*
|
|
14
|
+
* The config fallback exists because env vars don't survive across
|
|
15
|
+
* separate shell processes (or stateless tool calls — e.g. an agent
|
|
16
|
+
* running `cnotes` from disjoint Bash invocations). Persisting the active
|
|
17
|
+
* run on disk lets every subsequent cnotes write auto-attach, no matter
|
|
18
|
+
* which shell it runs in, until the run is explicitly ended.
|
|
19
|
+
*
|
|
20
|
+
* X-Agent-Before-Snapshot-Id carries the begin-checkpoint's snapshot
|
|
21
|
+
* ID so the first mutation under the run can back-link
|
|
22
|
+
* operation.checkpointBeforeId at open time. The server validates the
|
|
23
|
+
* snapshot belongs to the target canvas before stamping it.
|
|
24
|
+
*
|
|
25
|
+
* Prompt + rationale are deliberately NOT carried per-request — they
|
|
26
|
+
* were already persisted on the operation row at begin time, and
|
|
27
|
+
* resending them on every mutation would create a spoofing surface (a
|
|
28
|
+
* leaked runId could overwrite stored intent metadata).
|
|
29
|
+
*/
|
|
30
|
+
private headers;
|
|
31
|
+
/**
|
|
32
|
+
* Execute a fetch with retry for 5xx and 429 errors.
|
|
33
|
+
* Retries up to 3 times with exponential backoff (1s, 2s, 4s).
|
|
34
|
+
* Never retries 4xx client errors (except 429).
|
|
35
|
+
*/
|
|
36
|
+
private fetchWithRetry;
|
|
37
|
+
get<T = unknown>(path: string, params?: Record<string, string | undefined>): Promise<T>;
|
|
38
|
+
post<T = unknown>(path: string, body?: Record<string, unknown>): Promise<T>;
|
|
39
|
+
postFormData<T = unknown>(path: string, buildFormData: () => FormData): Promise<T>;
|
|
40
|
+
put<T = unknown>(path: string, body?: Record<string, unknown>): Promise<T>;
|
|
41
|
+
patch<T = unknown>(path: string, body?: Record<string, unknown>, params?: Record<string, string | undefined>): Promise<T>;
|
|
42
|
+
delete<T = unknown>(path: string): Promise<T>;
|
|
43
|
+
private parseJsonSafe;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAeA,qBAAa,SAAS;IAElB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,KAAK;gBADL,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM;IAGvB;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO,CAAC,OAAO;IAef;;;;OAIG;YACW,cAAc;IA4CtB,GAAG,CAAC,CAAC,GAAG,OAAO,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC1C,OAAO,CAAC,CAAC,CAAC;IAqBP,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC;IAgBP,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,QAAQ,GAC5B,OAAO,CAAC,CAAC,CAAC;IAuBP,GAAG,CAAC,CAAC,GAAG,OAAO,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC;IAgBP,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC1C,OAAO,CAAC,CAAC,CAAC;IAqBP,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;YAerC,aAAa;CAI5B"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { ApiError } from "./errors.js";
|
|
2
|
+
import { loadConfig, getActiveAgentRunId } from "./auth-store.js";
|
|
3
|
+
import { cnotesEnv } from "./env.js";
|
|
4
|
+
const MAX_RETRIES = 3;
|
|
5
|
+
const RETRY_BASE_MS = 1000;
|
|
6
|
+
function isRetryable(status) {
|
|
7
|
+
return status >= 500 || status === 429;
|
|
8
|
+
}
|
|
9
|
+
function sleep(ms) {
|
|
10
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
11
|
+
}
|
|
12
|
+
export class ApiClient {
|
|
13
|
+
serverUrl;
|
|
14
|
+
token;
|
|
15
|
+
constructor(serverUrl, token) {
|
|
16
|
+
this.serverUrl = serverUrl;
|
|
17
|
+
this.token = token;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build request headers, attaching the active agent-run when one is
|
|
21
|
+
* open. Resolution order:
|
|
22
|
+
*
|
|
23
|
+
* 1. `CN_AGENT_RUN_ID` env var (explicit override, wins everything).
|
|
24
|
+
* 2. The `activeAgentRunId` persisted on the current server's config
|
|
25
|
+
* (written by `cnotes operations begin`, cleared by `cnotes operations
|
|
26
|
+
* end`).
|
|
27
|
+
*
|
|
28
|
+
* The config fallback exists because env vars don't survive across
|
|
29
|
+
* separate shell processes (or stateless tool calls — e.g. an agent
|
|
30
|
+
* running `cnotes` from disjoint Bash invocations). Persisting the active
|
|
31
|
+
* run on disk lets every subsequent cnotes write auto-attach, no matter
|
|
32
|
+
* which shell it runs in, until the run is explicitly ended.
|
|
33
|
+
*
|
|
34
|
+
* X-Agent-Before-Snapshot-Id carries the begin-checkpoint's snapshot
|
|
35
|
+
* ID so the first mutation under the run can back-link
|
|
36
|
+
* operation.checkpointBeforeId at open time. The server validates the
|
|
37
|
+
* snapshot belongs to the target canvas before stamping it.
|
|
38
|
+
*
|
|
39
|
+
* Prompt + rationale are deliberately NOT carried per-request — they
|
|
40
|
+
* were already persisted on the operation row at begin time, and
|
|
41
|
+
* resending them on every mutation would create a spoofing surface (a
|
|
42
|
+
* leaked runId could overwrite stored intent metadata).
|
|
43
|
+
*/
|
|
44
|
+
headers() {
|
|
45
|
+
const base = {
|
|
46
|
+
Authorization: `Bearer ${this.token}`,
|
|
47
|
+
"Content-Type": "application/json",
|
|
48
|
+
"X-Source": "cli",
|
|
49
|
+
};
|
|
50
|
+
const agentRunId = cnotesEnv("AGENT_RUN_ID") ??
|
|
51
|
+
getActiveAgentRunId(loadConfig(), this.serverUrl)?.agentRunId;
|
|
52
|
+
if (agentRunId)
|
|
53
|
+
base["X-Agent-Run-Id"] = agentRunId;
|
|
54
|
+
const beforeId = cnotesEnv("AGENT_BEFORE_SNAPSHOT_ID");
|
|
55
|
+
if (beforeId)
|
|
56
|
+
base["X-Agent-Before-Snapshot-Id"] = beforeId;
|
|
57
|
+
return base;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Execute a fetch with retry for 5xx and 429 errors.
|
|
61
|
+
* Retries up to 3 times with exponential backoff (1s, 2s, 4s).
|
|
62
|
+
* Never retries 4xx client errors (except 429).
|
|
63
|
+
*/
|
|
64
|
+
async fetchWithRetry(url, init, rebuildBody) {
|
|
65
|
+
let lastError;
|
|
66
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
67
|
+
try {
|
|
68
|
+
// Rebuild body on retries to avoid sending a consumed stream
|
|
69
|
+
if (attempt > 0 && rebuildBody) {
|
|
70
|
+
init = { ...init, body: rebuildBody() };
|
|
71
|
+
}
|
|
72
|
+
const res = await fetch(url, init);
|
|
73
|
+
if (res.ok || !isRetryable(res.status)) {
|
|
74
|
+
return res;
|
|
75
|
+
}
|
|
76
|
+
// Retryable server error — wait and retry
|
|
77
|
+
if (attempt < MAX_RETRIES - 1) {
|
|
78
|
+
const retryAfter = res.headers.get("Retry-After");
|
|
79
|
+
const delayMs = retryAfter
|
|
80
|
+
? Math.min(parseInt(retryAfter, 10) * 1000, 30_000)
|
|
81
|
+
: RETRY_BASE_MS * Math.pow(2, attempt);
|
|
82
|
+
await sleep(delayMs || RETRY_BASE_MS);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
return res; // Final attempt, return as-is
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
// Network error (ECONNREFUSED, DNS failure, timeout, etc.)
|
|
89
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
90
|
+
if (attempt < MAX_RETRIES - 1) {
|
|
91
|
+
const delayMs = RETRY_BASE_MS * Math.pow(2, attempt);
|
|
92
|
+
await sleep(delayMs);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
throw lastError || new Error("Request failed after retries");
|
|
98
|
+
}
|
|
99
|
+
async get(path, params) {
|
|
100
|
+
const url = new URL(path, this.serverUrl);
|
|
101
|
+
if (params) {
|
|
102
|
+
for (const [k, v] of Object.entries(params)) {
|
|
103
|
+
if (v !== undefined)
|
|
104
|
+
url.searchParams.set(k, v);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const res = await this.fetchWithRetry(url.toString(), {
|
|
108
|
+
method: "GET",
|
|
109
|
+
headers: this.headers(),
|
|
110
|
+
});
|
|
111
|
+
if (!res.ok) {
|
|
112
|
+
const body = await res.json().catch(() => ({}));
|
|
113
|
+
throw new ApiError(res.status, body);
|
|
114
|
+
}
|
|
115
|
+
return this.parseJsonSafe(res);
|
|
116
|
+
}
|
|
117
|
+
async post(path, body) {
|
|
118
|
+
const url = new URL(path, this.serverUrl);
|
|
119
|
+
const res = await this.fetchWithRetry(url.toString(), {
|
|
120
|
+
method: "POST",
|
|
121
|
+
headers: this.headers(),
|
|
122
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
123
|
+
});
|
|
124
|
+
if (!res.ok) {
|
|
125
|
+
const respBody = await res.json().catch(() => ({}));
|
|
126
|
+
throw new ApiError(res.status, respBody);
|
|
127
|
+
}
|
|
128
|
+
return this.parseJsonSafe(res);
|
|
129
|
+
}
|
|
130
|
+
async postFormData(path, buildFormData) {
|
|
131
|
+
const url = new URL(path, this.serverUrl);
|
|
132
|
+
const headers = {
|
|
133
|
+
Authorization: `Bearer ${this.token}`,
|
|
134
|
+
"X-Source": "cli",
|
|
135
|
+
// Do NOT set Content-Type — fetch auto-sets multipart boundary
|
|
136
|
+
};
|
|
137
|
+
// Build fresh FormData per attempt so retries don't send a consumed body
|
|
138
|
+
const res = await this.fetchWithRetry(url.toString(), {
|
|
139
|
+
method: "POST",
|
|
140
|
+
headers,
|
|
141
|
+
body: buildFormData(),
|
|
142
|
+
}, buildFormData);
|
|
143
|
+
if (!res.ok) {
|
|
144
|
+
const respBody = await res.json().catch(() => ({}));
|
|
145
|
+
throw new ApiError(res.status, respBody);
|
|
146
|
+
}
|
|
147
|
+
return res.json();
|
|
148
|
+
}
|
|
149
|
+
async put(path, body) {
|
|
150
|
+
const url = new URL(path, this.serverUrl);
|
|
151
|
+
const res = await this.fetchWithRetry(url.toString(), {
|
|
152
|
+
method: "PUT",
|
|
153
|
+
headers: this.headers(),
|
|
154
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
155
|
+
});
|
|
156
|
+
if (!res.ok) {
|
|
157
|
+
const respBody = await res.json().catch(() => ({}));
|
|
158
|
+
throw new ApiError(res.status, respBody);
|
|
159
|
+
}
|
|
160
|
+
return this.parseJsonSafe(res);
|
|
161
|
+
}
|
|
162
|
+
async patch(path, body, params) {
|
|
163
|
+
const url = new URL(path, this.serverUrl);
|
|
164
|
+
if (params) {
|
|
165
|
+
for (const [k, v] of Object.entries(params)) {
|
|
166
|
+
if (v !== undefined)
|
|
167
|
+
url.searchParams.set(k, v);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const res = await this.fetchWithRetry(url.toString(), {
|
|
171
|
+
method: "PATCH",
|
|
172
|
+
headers: this.headers(),
|
|
173
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
174
|
+
});
|
|
175
|
+
if (!res.ok) {
|
|
176
|
+
const respBody = await res.json().catch(() => ({}));
|
|
177
|
+
throw new ApiError(res.status, respBody);
|
|
178
|
+
}
|
|
179
|
+
return this.parseJsonSafe(res);
|
|
180
|
+
}
|
|
181
|
+
async delete(path) {
|
|
182
|
+
const url = new URL(path, this.serverUrl);
|
|
183
|
+
const res = await this.fetchWithRetry(url.toString(), {
|
|
184
|
+
method: "DELETE",
|
|
185
|
+
headers: this.headers(),
|
|
186
|
+
});
|
|
187
|
+
if (!res.ok) {
|
|
188
|
+
const body = await res.json().catch(() => ({}));
|
|
189
|
+
throw new ApiError(res.status, body);
|
|
190
|
+
}
|
|
191
|
+
return this.parseJsonSafe(res);
|
|
192
|
+
}
|
|
193
|
+
async parseJsonSafe(res) {
|
|
194
|
+
const text = await res.text();
|
|
195
|
+
return (text ? JSON.parse(text) : {});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface ServerConfig {
|
|
2
|
+
token: string;
|
|
3
|
+
email: string;
|
|
4
|
+
workspaceId?: string;
|
|
5
|
+
/**
|
|
6
|
+
* Currently-open agent-run on this server, written by `cnotes operations
|
|
7
|
+
* begin` and cleared by `cnotes operations end`. The api-client falls back
|
|
8
|
+
* to this when CNOTES_AGENT_RUN_ID env is unset, so cnotes writes across
|
|
9
|
+
* separate shell processes (or stateless tool calls) auto-attach to the
|
|
10
|
+
* active run. Env wins when set, for explicit overrides.
|
|
11
|
+
*/
|
|
12
|
+
activeAgentRunId?: string;
|
|
13
|
+
/** When activeAgentRunId was opened — used to surface helpful "started
|
|
14
|
+
* Xm ago" context on the "already-active" warning at begin time. */
|
|
15
|
+
activeAgentRunStartedAt?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface CliConfig {
|
|
18
|
+
version: 1;
|
|
19
|
+
servers: Record<string, ServerConfig>;
|
|
20
|
+
currentServer: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function loadConfig(): CliConfig;
|
|
23
|
+
export declare function saveConfig(config: CliConfig): void;
|
|
24
|
+
export declare function getServerConfig(config: CliConfig, server?: string): ServerConfig | null;
|
|
25
|
+
export declare function setServerConfig(config: CliConfig, serverUrl: string, serverConfig: ServerConfig): void;
|
|
26
|
+
export declare function removeServerConfig(config: CliConfig, serverUrl: string): void;
|
|
27
|
+
export declare function setCurrentServer(config: CliConfig, serverUrl: string): void;
|
|
28
|
+
export declare function setWorkspaceId(config: CliConfig, serverUrl: string, workspaceId: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Mark a given agent-run as the active one for a server. Subsequent cnotes
|
|
31
|
+
* writes against this server will carry X-Agent-Run-Id automatically.
|
|
32
|
+
*/
|
|
33
|
+
export declare function setActiveAgentRunId(config: CliConfig, serverUrl: string, agentRunId: string, startedAt: number): void;
|
|
34
|
+
/**
|
|
35
|
+
* Clear the active agent-run for a server. Called by `cnotes operations end`
|
|
36
|
+
* after a successful close, so the next cnotes write reverts to "unattached"
|
|
37
|
+
* unless the user opens a new run.
|
|
38
|
+
*/
|
|
39
|
+
export declare function clearActiveAgentRunId(config: CliConfig, serverUrl: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Read the active agent-run for a server (if any).
|
|
42
|
+
*/
|
|
43
|
+
export declare function getActiveAgentRunId(config: CliConfig, serverUrl: string): {
|
|
44
|
+
agentRunId: string;
|
|
45
|
+
startedAt: number;
|
|
46
|
+
} | null;
|
|
47
|
+
//# sourceMappingURL=auth-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-store.d.ts","sourceRoot":"","sources":["../../src/lib/auth-store.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;yEACqE;IACrE,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC;CACvB;AAuCD,wBAAgB,UAAU,IAAI,SAAS,CAOtC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAQlD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAGvF;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,GACzB,IAAI,CAGN;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAG7E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAG3E;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,IAAI,CAMN;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,IAAI,CAON;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,GAChB,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,GAChB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASlD"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, chmodSync, existsSync, renameSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { BRAND } from "./brand.js";
|
|
5
|
+
import { cnotesEnv } from "./env.js";
|
|
6
|
+
const CONFIG_DIR = join(homedir(), BRAND.configDir);
|
|
7
|
+
const CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
8
|
+
/**
|
|
9
|
+
* One-time migration of the pre-rename config dir (`~/.creatornotes`) to the
|
|
10
|
+
* current one (`~/.cnotes`). Best-effort and idempotent: it only acts when the
|
|
11
|
+
* old dir exists and the new one does not, and any error is swallowed so a
|
|
12
|
+
* permissions hiccup never blocks a command (re-auth into the new dir still
|
|
13
|
+
* works). Runs once at module load, before any config read/write.
|
|
14
|
+
*/
|
|
15
|
+
const LEGACY_CONFIG_DIR = join(homedir(), ".creatornotes");
|
|
16
|
+
function migrateLegacyConfigDir() {
|
|
17
|
+
try {
|
|
18
|
+
if (CONFIG_DIR !== LEGACY_CONFIG_DIR &&
|
|
19
|
+
existsSync(LEGACY_CONFIG_DIR) &&
|
|
20
|
+
!existsSync(CONFIG_DIR)) {
|
|
21
|
+
renameSync(LEGACY_CONFIG_DIR, CONFIG_DIR);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
/* ignore — re-auth into the new dir still works */
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
migrateLegacyConfigDir();
|
|
29
|
+
const DEFAULT_SERVER = cnotesEnv("SERVER_URL") || BRAND.url;
|
|
30
|
+
function defaultConfig() {
|
|
31
|
+
return {
|
|
32
|
+
version: 1,
|
|
33
|
+
servers: {},
|
|
34
|
+
currentServer: DEFAULT_SERVER,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function loadConfig() {
|
|
38
|
+
try {
|
|
39
|
+
const raw = readFileSync(CONFIG_FILE, "utf-8");
|
|
40
|
+
return JSON.parse(raw);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return defaultConfig();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function saveConfig(config) {
|
|
47
|
+
mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
48
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + "\n", {
|
|
49
|
+
encoding: "utf-8",
|
|
50
|
+
mode: 0o600,
|
|
51
|
+
});
|
|
52
|
+
// Ensure permissions even if file already existed
|
|
53
|
+
chmodSync(CONFIG_FILE, 0o600);
|
|
54
|
+
}
|
|
55
|
+
export function getServerConfig(config, server) {
|
|
56
|
+
const serverUrl = server || config.currentServer;
|
|
57
|
+
return config.servers[serverUrl] || null;
|
|
58
|
+
}
|
|
59
|
+
export function setServerConfig(config, serverUrl, serverConfig) {
|
|
60
|
+
config.servers[serverUrl] = serverConfig;
|
|
61
|
+
saveConfig(config);
|
|
62
|
+
}
|
|
63
|
+
export function removeServerConfig(config, serverUrl) {
|
|
64
|
+
delete config.servers[serverUrl];
|
|
65
|
+
saveConfig(config);
|
|
66
|
+
}
|
|
67
|
+
export function setCurrentServer(config, serverUrl) {
|
|
68
|
+
config.currentServer = serverUrl;
|
|
69
|
+
saveConfig(config);
|
|
70
|
+
}
|
|
71
|
+
export function setWorkspaceId(config, serverUrl, workspaceId) {
|
|
72
|
+
const sc = config.servers[serverUrl];
|
|
73
|
+
if (sc) {
|
|
74
|
+
sc.workspaceId = workspaceId;
|
|
75
|
+
saveConfig(config);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Mark a given agent-run as the active one for a server. Subsequent cnotes
|
|
80
|
+
* writes against this server will carry X-Agent-Run-Id automatically.
|
|
81
|
+
*/
|
|
82
|
+
export function setActiveAgentRunId(config, serverUrl, agentRunId, startedAt) {
|
|
83
|
+
const sc = config.servers[serverUrl];
|
|
84
|
+
if (sc) {
|
|
85
|
+
sc.activeAgentRunId = agentRunId;
|
|
86
|
+
sc.activeAgentRunStartedAt = startedAt;
|
|
87
|
+
saveConfig(config);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Clear the active agent-run for a server. Called by `cnotes operations end`
|
|
92
|
+
* after a successful close, so the next cnotes write reverts to "unattached"
|
|
93
|
+
* unless the user opens a new run.
|
|
94
|
+
*/
|
|
95
|
+
export function clearActiveAgentRunId(config, serverUrl) {
|
|
96
|
+
const sc = config.servers[serverUrl];
|
|
97
|
+
if (sc && (sc.activeAgentRunId || sc.activeAgentRunStartedAt)) {
|
|
98
|
+
delete sc.activeAgentRunId;
|
|
99
|
+
delete sc.activeAgentRunStartedAt;
|
|
100
|
+
saveConfig(config);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Read the active agent-run for a server (if any).
|
|
105
|
+
*/
|
|
106
|
+
export function getActiveAgentRunId(config, serverUrl) {
|
|
107
|
+
const sc = config.servers[serverUrl];
|
|
108
|
+
if (sc?.activeAgentRunId && sc.activeAgentRunStartedAt) {
|
|
109
|
+
return {
|
|
110
|
+
agentRunId: sc.activeAgentRunId,
|
|
111
|
+
startedAt: sc.activeAgentRunStartedAt,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=auth-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-store.js","sourceRoot":"","sources":["../../src/lib/auth-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brand single source of truth for the CLI.
|
|
3
|
+
*
|
|
4
|
+
* This is the CLI-side MIRROR of the app's `lib/brand.ts`. The CLI ships as a
|
|
5
|
+
* separate npm package and cannot import from the Next.js app, so the shared
|
|
6
|
+
* identity is duplicated here. A drift guard in the app
|
|
7
|
+
* (`__tests__/brand.test.ts`) asserts the shared fields below stay in sync with
|
|
8
|
+
* `lib/brand.ts` — update both together.
|
|
9
|
+
*
|
|
10
|
+
* On a rename, changing `configDir` orphans existing logins and changing
|
|
11
|
+
* `packageName` breaks `npx`/global-install updates — so when either moves, ship
|
|
12
|
+
* a migration. `configDir` carries a one-time rename of the old directory on
|
|
13
|
+
* load (see `auth-store.ts`); the old npm package should be deprecated to point
|
|
14
|
+
* at the new one.
|
|
15
|
+
*/
|
|
16
|
+
export declare const BRAND: {
|
|
17
|
+
/** Display name, used in CLI help/banner text. */
|
|
18
|
+
readonly name: "Creator Notes";
|
|
19
|
+
/** Canonical production origin (the published default server). */
|
|
20
|
+
readonly url: "https://creatornotes.app";
|
|
21
|
+
/** Bare domain. */
|
|
22
|
+
readonly domain: "creatornotes.app";
|
|
23
|
+
/** The installed command. */
|
|
24
|
+
readonly command: "cnotes";
|
|
25
|
+
/** Published package name. */
|
|
26
|
+
readonly packageName: "@creator-notes/cnotes";
|
|
27
|
+
/** Config dir under $HOME (holds login tokens). Migrated from the old name on load. */
|
|
28
|
+
readonly configDir: ".cnotes";
|
|
29
|
+
/** Source repo, owner/name form. */
|
|
30
|
+
readonly repo: "creatornotes/pm-notes";
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=brand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/lib/brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,KAAK;IAChB,kDAAkD;;IAElD,kEAAkE;;IAElE,mBAAmB;;IAEnB,6BAA6B;;IAE7B,8BAA8B;;IAE9B,uFAAuF;;IAEvF,oCAAoC;;CAE5B,CAAC"}
|