@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,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":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAyBrC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;AACpD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAC3D,SAAS,sBAAsB;IAC7B,IAAI,CAAC;QACH,IACE,UAAU,KAAK,iBAAiB;YAChC,UAAU,CAAC,iBAAiB,CAAC;YAC7B,CAAC,UAAU,CAAC,UAAU,CAAC,EACvB,CAAC;YACD,UAAU,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;IACrD,CAAC;AACH,CAAC;AACD,sBAAsB,EAAE,CAAC;AAEzB,MAAM,cAAc,GAClB,SAAS,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC;AAEvC,SAAS,aAAa;IACpB,OAAO;QACL,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,cAAc;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QACjE,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,kDAAkD;IAClD,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,MAAe;IAChE,MAAM,SAAS,GAAG,MAAM,IAAI,MAAM,CAAC,aAAa,CAAC;IACjD,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAiB,EACjB,SAAiB,EACjB,YAA0B;IAE1B,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC;IACzC,UAAU,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAAiB;IACrE,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjC,UAAU,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,SAAiB;IACnE,MAAM,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,UAAU,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAAiB,EACjB,SAAiB,EACjB,WAAmB;IAEnB,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,WAAW,GAAG,WAAW,CAAC;QAC7B,UAAU,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,SAAiB,EACjB,UAAkB,EAClB,SAAiB;IAEjB,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,gBAAgB,GAAG,UAAU,CAAC;QACjC,EAAE,CAAC,uBAAuB,GAAG,SAAS,CAAC;QACvC,UAAU,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,SAAiB;IAEjB,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,gBAAgB,IAAI,EAAE,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,CAAC,gBAAgB,CAAC;QAC3B,OAAO,EAAE,CAAC,uBAAuB,CAAC;QAClC,UAAU,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,SAAiB;IAEjB,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,EAAE,EAAE,gBAAgB,IAAI,EAAE,CAAC,uBAAuB,EAAE,CAAC;QACvD,OAAO;YACL,UAAU,EAAE,EAAE,CAAC,gBAAgB;YAC/B,SAAS,EAAE,EAAE,CAAC,uBAAuB;SACtC,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -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"}