@creator-notes/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/cn.d.ts +3 -0
  2. package/dist/cn.d.ts.map +1 -0
  3. package/dist/cn.js +38 -0
  4. package/dist/cn.js.map +1 -0
  5. package/dist/commands/auth.d.ts +3 -0
  6. package/dist/commands/auth.d.ts.map +1 -0
  7. package/dist/commands/auth.js +184 -0
  8. package/dist/commands/auth.js.map +1 -0
  9. package/dist/commands/canvas.d.ts +3 -0
  10. package/dist/commands/canvas.d.ts.map +1 -0
  11. package/dist/commands/canvas.js +721 -0
  12. package/dist/commands/canvas.js.map +1 -0
  13. package/dist/commands/config.d.ts +3 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +47 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/mcp.d.ts +3 -0
  18. package/dist/commands/mcp.d.ts.map +1 -0
  19. package/dist/commands/mcp.js +59 -0
  20. package/dist/commands/mcp.js.map +1 -0
  21. package/dist/commands/memory.d.ts +3 -0
  22. package/dist/commands/memory.d.ts.map +1 -0
  23. package/dist/commands/memory.js +145 -0
  24. package/dist/commands/memory.js.map +1 -0
  25. package/dist/commands/notes.d.ts +3 -0
  26. package/dist/commands/notes.d.ts.map +1 -0
  27. package/dist/commands/notes.js +508 -0
  28. package/dist/commands/notes.js.map +1 -0
  29. package/dist/commands/relationships.d.ts +3 -0
  30. package/dist/commands/relationships.d.ts.map +1 -0
  31. package/dist/commands/relationships.js +47 -0
  32. package/dist/commands/relationships.js.map +1 -0
  33. package/dist/commands/search.d.ts +3 -0
  34. package/dist/commands/search.d.ts.map +1 -0
  35. package/dist/commands/search.js +52 -0
  36. package/dist/commands/search.js.map +1 -0
  37. package/dist/commands/timeline.d.ts +3 -0
  38. package/dist/commands/timeline.d.ts.map +1 -0
  39. package/dist/commands/timeline.js +92 -0
  40. package/dist/commands/timeline.js.map +1 -0
  41. package/dist/commands/types.d.ts +3 -0
  42. package/dist/commands/types.d.ts.map +1 -0
  43. package/dist/commands/types.js +124 -0
  44. package/dist/commands/types.js.map +1 -0
  45. package/dist/commands/versions.d.ts +3 -0
  46. package/dist/commands/versions.d.ts.map +1 -0
  47. package/dist/commands/versions.js +104 -0
  48. package/dist/commands/versions.js.map +1 -0
  49. package/dist/commands/workspace.d.ts +3 -0
  50. package/dist/commands/workspace.d.ts.map +1 -0
  51. package/dist/commands/workspace.js +116 -0
  52. package/dist/commands/workspace.js.map +1 -0
  53. package/dist/lib/api-client.d.ts +12 -0
  54. package/dist/lib/api-client.d.ts.map +1 -0
  55. package/dist/lib/api-client.js +76 -0
  56. package/dist/lib/api-client.js.map +1 -0
  57. package/dist/lib/auth-store.d.ts +18 -0
  58. package/dist/lib/auth-store.d.ts.map +1 -0
  59. package/dist/lib/auth-store.js +54 -0
  60. package/dist/lib/auth-store.js.map +1 -0
  61. package/dist/lib/config.d.ts +26 -0
  62. package/dist/lib/config.d.ts.map +1 -0
  63. package/dist/lib/config.js +54 -0
  64. package/dist/lib/config.js.map +1 -0
  65. package/dist/lib/errors.d.ts +20 -0
  66. package/dist/lib/errors.d.ts.map +1 -0
  67. package/dist/lib/errors.js +54 -0
  68. package/dist/lib/errors.js.map +1 -0
  69. package/dist/lib/markdown-to-tiptap.d.ts +17 -0
  70. package/dist/lib/markdown-to-tiptap.d.ts.map +1 -0
  71. package/dist/lib/markdown-to-tiptap.js +228 -0
  72. package/dist/lib/markdown-to-tiptap.js.map +1 -0
  73. package/dist/lib/output.d.ts +22 -0
  74. package/dist/lib/output.d.ts.map +1 -0
  75. package/dist/lib/output.js +56 -0
  76. package/dist/lib/output.js.map +1 -0
  77. package/dist/lib/resolve-note.d.ts +7 -0
  78. package/dist/lib/resolve-note.d.ts.map +1 -0
  79. package/dist/lib/resolve-note.js +22 -0
  80. package/dist/lib/resolve-note.js.map +1 -0
  81. package/dist/lib/stdin.d.ts +5 -0
  82. package/dist/lib/stdin.d.ts.map +1 -0
  83. package/dist/lib/stdin.js +11 -0
  84. package/dist/lib/stdin.js.map +1 -0
  85. package/dist/mcp-server.d.ts +3 -0
  86. package/dist/mcp-server.d.ts.map +1 -0
  87. package/dist/mcp-server.js +508 -0
  88. package/dist/mcp-server.js.map +1 -0
  89. package/package.json +42 -0
@@ -0,0 +1,54 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, chmodSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ const CONFIG_DIR = join(homedir(), ".creatornotes");
5
+ const CONFIG_FILE = join(CONFIG_DIR, "config.json");
6
+ function defaultConfig() {
7
+ return {
8
+ version: 1,
9
+ servers: {},
10
+ currentServer: "http://localhost:3000",
11
+ };
12
+ }
13
+ export function loadConfig() {
14
+ try {
15
+ const raw = readFileSync(CONFIG_FILE, "utf-8");
16
+ return JSON.parse(raw);
17
+ }
18
+ catch {
19
+ return defaultConfig();
20
+ }
21
+ }
22
+ export function saveConfig(config) {
23
+ mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
24
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + "\n", {
25
+ encoding: "utf-8",
26
+ mode: 0o600,
27
+ });
28
+ // Ensure permissions even if file already existed
29
+ chmodSync(CONFIG_FILE, 0o600);
30
+ }
31
+ export function getServerConfig(config, server) {
32
+ const serverUrl = server || config.currentServer;
33
+ return config.servers[serverUrl] || null;
34
+ }
35
+ export function setServerConfig(config, serverUrl, serverConfig) {
36
+ config.servers[serverUrl] = serverConfig;
37
+ saveConfig(config);
38
+ }
39
+ export function removeServerConfig(config, serverUrl) {
40
+ delete config.servers[serverUrl];
41
+ saveConfig(config);
42
+ }
43
+ export function setCurrentServer(config, serverUrl) {
44
+ config.currentServer = serverUrl;
45
+ saveConfig(config);
46
+ }
47
+ export function setWorkspaceId(config, serverUrl, workspaceId) {
48
+ const sc = config.servers[serverUrl];
49
+ if (sc) {
50
+ sc.workspaceId = workspaceId;
51
+ saveConfig(config);
52
+ }
53
+ }
54
+ //# 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,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAclC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AACpD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,SAAS,aAAa;IACpB,OAAO;QACL,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,uBAAuB;KACvC,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"}
@@ -0,0 +1,26 @@
1
+ export interface ResolvedConfig {
2
+ serverUrl: string;
3
+ token: string;
4
+ workspaceId: string;
5
+ json: boolean;
6
+ quiet: boolean;
7
+ }
8
+ interface GlobalOpts {
9
+ server?: string;
10
+ workspace?: string;
11
+ json?: boolean;
12
+ quiet?: boolean;
13
+ }
14
+ /**
15
+ * Resolve server URL, token, and workspace from env vars, flags, and config file.
16
+ * Priority: flags > env vars > config file.
17
+ */
18
+ export declare function resolveConfig(opts: GlobalOpts): ResolvedConfig;
19
+ /**
20
+ * Resolve config without requiring workspace (for auth/config/workspace commands).
21
+ */
22
+ export declare function resolveBaseConfig(opts: GlobalOpts): Omit<ResolvedConfig, "workspaceId"> & {
23
+ workspaceId?: string;
24
+ };
25
+ export {};
26
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,UAAU;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAoC9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAkBlH"}
@@ -0,0 +1,54 @@
1
+ import { loadConfig, getServerConfig } from "./auth-store.js";
2
+ import { AuthError, ValidationError } from "./errors.js";
3
+ /**
4
+ * Resolve server URL, token, and workspace from env vars, flags, and config file.
5
+ * Priority: flags > env vars > config file.
6
+ */
7
+ export function resolveConfig(opts) {
8
+ const config = loadConfig();
9
+ // Server URL
10
+ const serverUrl = opts.server || process.env.CN_SERVER || config.currentServer;
11
+ // Token
12
+ const envToken = process.env.CN_TOKEN;
13
+ const configToken = getServerConfig(config, serverUrl)?.token;
14
+ const token = envToken || configToken;
15
+ if (!token) {
16
+ throw new AuthError();
17
+ }
18
+ // Workspace ID
19
+ const envWorkspace = process.env.CN_WORKSPACE;
20
+ const configWorkspace = getServerConfig(config, serverUrl)?.workspaceId;
21
+ const workspaceId = opts.workspace || envWorkspace || configWorkspace;
22
+ if (!workspaceId) {
23
+ throw new ValidationError("No workspace selected. Run `cn workspace select` or pass --workspace <id>");
24
+ }
25
+ // Output format
26
+ const json = opts.json || process.env.CN_JSON === "1" || !process.stdout.isTTY;
27
+ return {
28
+ serverUrl,
29
+ token,
30
+ workspaceId,
31
+ json: json ?? false,
32
+ quiet: opts.quiet ?? false,
33
+ };
34
+ }
35
+ /**
36
+ * Resolve config without requiring workspace (for auth/config/workspace commands).
37
+ */
38
+ export function resolveBaseConfig(opts) {
39
+ const config = loadConfig();
40
+ const serverUrl = opts.server || process.env.CN_SERVER || config.currentServer;
41
+ const envToken = process.env.CN_TOKEN;
42
+ const configToken = getServerConfig(config, serverUrl)?.token;
43
+ const token = envToken || configToken || "";
44
+ const configWorkspace = getServerConfig(config, serverUrl)?.workspaceId;
45
+ const json = opts.json || process.env.CN_JSON === "1" || !process.stdout.isTTY;
46
+ return {
47
+ serverUrl,
48
+ token,
49
+ workspaceId: opts.workspace || process.env.CN_WORKSPACE || configWorkspace,
50
+ json: json ?? false,
51
+ quiet: opts.quiet ?? false,
52
+ };
53
+ }
54
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAiBzD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,aAAa;IACb,MAAM,SAAS,GACb,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC,aAAa,CAAC;IAE/D,QAAQ;IACR,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtC,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC;IAC9D,MAAM,KAAK,GAAG,QAAQ,IAAI,WAAW,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,SAAS,EAAE,CAAC;IACxB,CAAC;IAED,eAAe;IACf,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC9C,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC;IACxE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,IAAI,YAAY,IAAI,eAAe,CAAC;IACtE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,eAAe,CACvB,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,MAAM,IAAI,GACR,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IAEpE,OAAO;QACL,SAAS;QACT,KAAK;QACL,WAAW;QACX,IAAI,EAAE,IAAI,IAAI,KAAK;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAgB;IAChD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,SAAS,GACb,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC,aAAa,CAAC;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtC,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC;IAC9D,MAAM,KAAK,GAAG,QAAQ,IAAI,WAAW,IAAI,EAAE,CAAC;IAC5C,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC;IACxE,MAAM,IAAI,GACR,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IAEpE,OAAO;QACL,SAAS;QACT,KAAK;QACL,WAAW,EAAE,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,eAAe;QAC1E,IAAI,EAAE,IAAI,IAAI,KAAK;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ export declare class CliError extends Error {
2
+ exitCode: number;
3
+ constructor(message: string, exitCode?: number);
4
+ }
5
+ export declare class AuthError extends CliError {
6
+ constructor(message?: string);
7
+ }
8
+ export declare class ValidationError extends CliError {
9
+ constructor(message: string);
10
+ }
11
+ export declare class ApiError extends CliError {
12
+ status: number;
13
+ body: Record<string, unknown>;
14
+ constructor(status: number, body: Record<string, unknown>);
15
+ }
16
+ /**
17
+ * Handle errors from CLI commands uniformly.
18
+ */
19
+ export declare function handleError(error: unknown, json: boolean): never;
20
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;IAGxB,QAAQ,EAAE,MAAM;gBADvB,OAAO,EAAE,MAAM,EACR,QAAQ,GAAE,MAAU;CAK9B;AAED,qBAAa,SAAU,SAAQ,QAAQ;gBACzB,OAAO,GAAE,MAA8D;CAIpF;AAED,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,QAAS,SAAQ,QAAQ;IAE3B,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAD7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAMvC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK,CAiBhE"}
@@ -0,0 +1,54 @@
1
+ export class CliError extends Error {
2
+ exitCode;
3
+ constructor(message, exitCode = 1) {
4
+ super(message);
5
+ this.exitCode = exitCode;
6
+ this.name = "CliError";
7
+ }
8
+ }
9
+ export class AuthError extends CliError {
10
+ constructor(message = "Authentication required. Run `cn auth login` first.") {
11
+ super(message, 2);
12
+ this.name = "AuthError";
13
+ }
14
+ }
15
+ export class ValidationError extends CliError {
16
+ constructor(message) {
17
+ super(message, 3);
18
+ this.name = "ValidationError";
19
+ }
20
+ }
21
+ export class ApiError extends CliError {
22
+ status;
23
+ body;
24
+ constructor(status, body) {
25
+ const msg = body.error || `API error: HTTP ${status}`;
26
+ super(msg, 1);
27
+ this.status = status;
28
+ this.body = body;
29
+ this.name = "ApiError";
30
+ }
31
+ }
32
+ /**
33
+ * Handle errors from CLI commands uniformly.
34
+ */
35
+ export function handleError(error, json) {
36
+ if (error instanceof CliError) {
37
+ if (json) {
38
+ console.error(JSON.stringify({ error: error.message, code: error.name }));
39
+ }
40
+ else {
41
+ console.error(`Error: ${error.message}`);
42
+ }
43
+ process.exit(error.exitCode);
44
+ }
45
+ const message = error instanceof Error ? error.message : String(error);
46
+ if (json) {
47
+ console.error(JSON.stringify({ error: message, code: "unknown_error" }));
48
+ }
49
+ else {
50
+ console.error(`Error: ${message}`);
51
+ }
52
+ process.exit(1);
53
+ }
54
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGxB;IAFT,YACE,OAAe,EACR,WAAmB,CAAC;QAE3B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,aAAQ,GAAR,QAAQ,CAAY;QAG3B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,QAAQ;IACrC,YAAY,UAAkB,qDAAqD;QACjF,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,QAAQ;IAE3B;IACA;IAFT,YACS,MAAc,EACd,IAA6B;QAEpC,MAAM,GAAG,GAAI,IAAI,CAAC,KAAgB,IAAI,mBAAmB,MAAM,EAAE,CAAC;QAClE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAJP,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAyB;QAIpC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,IAAa;IACvD,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Markdown to TipTap JSON converter for CLI.
3
+ * Handles: headings, paragraphs, bold, italic, inline code, bullet lists,
4
+ * and relationship mentions ([NOTE-123: Title] or [NOTE-123: Title](relationship:type)).
5
+ */
6
+ interface TipTapNode {
7
+ type: string;
8
+ content?: TipTapNode[];
9
+ text?: string;
10
+ marks?: Array<{
11
+ type: string;
12
+ }>;
13
+ attrs?: Record<string, unknown>;
14
+ }
15
+ export declare function markdownToTiptap(markdown: string): TipTapNode;
16
+ export {};
17
+ //# sourceMappingURL=markdown-to-tiptap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-to-tiptap.d.ts","sourceRoot":"","sources":["../../src/lib/markdown-to-tiptap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAwND,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAqC7D"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Markdown to TipTap JSON converter for CLI.
3
+ * Handles: headings, paragraphs, bold, italic, inline code, bullet lists,
4
+ * and relationship mentions ([NOTE-123: Title] or [NOTE-123: Title](relationship:type)).
5
+ */
6
+ /**
7
+ * Parse inline content into TipTap nodes, handling mentions and formatting.
8
+ * Uses a match-and-sort approach: run each regex independently, collect matches,
9
+ * resolve overlaps, then emit nodes in order.
10
+ */
11
+ function parseInlineMarks(text) {
12
+ const matches = [];
13
+ // 1. Relationship mentions: [NOTE-123: Title](relationship:type)
14
+ const relMentionRe = /\[([A-Z]+-\d+)(?::\s*([^\]]+))?\]\(relationship:\s*([^)]+)\)/g;
15
+ let m;
16
+ while ((m = relMentionRe.exec(text)) !== null) {
17
+ matches.push({
18
+ type: "relMention",
19
+ start: m.index,
20
+ end: m.index + m[0].length,
21
+ groups: [m[1], m[2] || "", m[3]],
22
+ });
23
+ }
24
+ // 2. Short mentions: [NOTE-123] or [NOTE-123: Title] — defaults to "references"
25
+ // Skip if already matched by relMention (the [...](relationship:...) form)
26
+ const mentionRe = /\[([A-Z]+-\d+)(?::\s*([^\]]+))?\]/g;
27
+ while ((m = mentionRe.exec(text)) !== null) {
28
+ const overlaps = matches.some((e) => m.index >= e.start && m.index < e.end);
29
+ if (overlaps)
30
+ continue;
31
+ // Skip if immediately followed by ( — that's a markdown link, not a mention
32
+ const afterClose = m.index + m[0].length;
33
+ if (afterClose < text.length && text[afterClose] === "(")
34
+ continue;
35
+ matches.push({
36
+ type: "mention",
37
+ start: m.index,
38
+ end: m.index + m[0].length,
39
+ groups: [m[1], m[2] || ""],
40
+ });
41
+ }
42
+ // 3. Inline code
43
+ const codeRe = /`([^`]+)`/g;
44
+ while ((m = codeRe.exec(text)) !== null) {
45
+ matches.push({
46
+ type: "code",
47
+ start: m.index,
48
+ end: m.index + m[0].length,
49
+ groups: [m[1]],
50
+ });
51
+ }
52
+ // 4. Bold+italic
53
+ const boldItalicRe = /\*\*\*(.+?)\*\*\*/g;
54
+ while ((m = boldItalicRe.exec(text)) !== null) {
55
+ matches.push({
56
+ type: "boldItalic",
57
+ start: m.index,
58
+ end: m.index + m[0].length,
59
+ groups: [m[1]],
60
+ });
61
+ }
62
+ // 5. Bold
63
+ const boldRe = /\*\*(.+?)\*\*/g;
64
+ while ((m = boldRe.exec(text)) !== null) {
65
+ matches.push({
66
+ type: "bold",
67
+ start: m.index,
68
+ end: m.index + m[0].length,
69
+ groups: [m[1]],
70
+ });
71
+ }
72
+ // 6. Italic
73
+ const italicRe = /(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g;
74
+ while ((m = italicRe.exec(text)) !== null) {
75
+ matches.push({
76
+ type: "italic",
77
+ start: m.index,
78
+ end: m.index + m[0].length,
79
+ groups: [m[1]],
80
+ });
81
+ }
82
+ // Remove overlapping matches — earlier match wins, then higher priority
83
+ matches.sort((a, b) => a.start - b.start || a.end - b.end);
84
+ const filtered = [];
85
+ let lastEnd = 0;
86
+ for (const entry of matches) {
87
+ if (entry.start >= lastEnd) {
88
+ filtered.push(entry);
89
+ lastEnd = entry.end;
90
+ }
91
+ }
92
+ // Build nodes from filtered matches + plain text gaps
93
+ const nodes = [];
94
+ let cursor = 0;
95
+ for (const entry of filtered) {
96
+ // Plain text before this match
97
+ if (entry.start > cursor) {
98
+ nodes.push({ type: "text", text: text.slice(cursor, entry.start) });
99
+ }
100
+ switch (entry.type) {
101
+ case "relMention":
102
+ nodes.push({
103
+ type: "unifiedRelationshipMention",
104
+ attrs: {
105
+ displayId: entry.groups[0],
106
+ title: entry.groups[1] || entry.groups[0],
107
+ relationshipType: entry.groups[2],
108
+ relationshipLabel: entry.groups[2],
109
+ mentionType: "relationship",
110
+ },
111
+ });
112
+ break;
113
+ case "mention":
114
+ nodes.push({
115
+ type: "unifiedRelationshipMention",
116
+ attrs: {
117
+ displayId: entry.groups[0],
118
+ title: entry.groups[1] || entry.groups[0],
119
+ relationshipType: "references",
120
+ relationshipLabel: "references",
121
+ mentionType: "relationship",
122
+ },
123
+ });
124
+ break;
125
+ case "code":
126
+ nodes.push({
127
+ type: "text",
128
+ text: entry.groups[0],
129
+ marks: [{ type: "code" }],
130
+ });
131
+ break;
132
+ case "boldItalic":
133
+ nodes.push({
134
+ type: "text",
135
+ text: entry.groups[0],
136
+ marks: [{ type: "bold" }, { type: "italic" }],
137
+ });
138
+ break;
139
+ case "bold":
140
+ nodes.push({
141
+ type: "text",
142
+ text: entry.groups[0],
143
+ marks: [{ type: "bold" }],
144
+ });
145
+ break;
146
+ case "italic":
147
+ nodes.push({
148
+ type: "text",
149
+ text: entry.groups[0],
150
+ marks: [{ type: "italic" }],
151
+ });
152
+ break;
153
+ }
154
+ cursor = entry.end;
155
+ }
156
+ // Trailing plain text
157
+ if (cursor < text.length) {
158
+ nodes.push({ type: "text", text: text.slice(cursor) });
159
+ }
160
+ return nodes.length > 0 ? nodes : [{ type: "text", text }];
161
+ }
162
+ function parseLine(line) {
163
+ // Empty line
164
+ if (line.trim() === "")
165
+ return null;
166
+ // Headings
167
+ const headingMatch = line.match(/^(#{1,6})\s+(.+)$/);
168
+ if (headingMatch) {
169
+ const level = headingMatch[1].length;
170
+ return {
171
+ type: "heading",
172
+ attrs: { level },
173
+ content: parseInlineMarks(headingMatch[2]),
174
+ };
175
+ }
176
+ // Bullet list item (will be grouped later)
177
+ const bulletMatch = line.match(/^[-*+]\s+(.+)$/);
178
+ if (bulletMatch) {
179
+ return {
180
+ type: "listItem",
181
+ content: [
182
+ {
183
+ type: "paragraph",
184
+ content: parseInlineMarks(bulletMatch[1]),
185
+ },
186
+ ],
187
+ };
188
+ }
189
+ // Regular paragraph
190
+ return {
191
+ type: "paragraph",
192
+ content: parseInlineMarks(line),
193
+ };
194
+ }
195
+ export function markdownToTiptap(markdown) {
196
+ const lines = markdown.split("\n");
197
+ const content = [];
198
+ let currentList = [];
199
+ function flushList() {
200
+ if (currentList.length > 0) {
201
+ content.push({
202
+ type: "bulletList",
203
+ content: currentList,
204
+ });
205
+ currentList = [];
206
+ }
207
+ }
208
+ for (const line of lines) {
209
+ const node = parseLine(line);
210
+ if (!node) {
211
+ flushList();
212
+ continue;
213
+ }
214
+ if (node.type === "listItem") {
215
+ currentList.push(node);
216
+ }
217
+ else {
218
+ flushList();
219
+ content.push(node);
220
+ }
221
+ }
222
+ flushList();
223
+ return {
224
+ type: "doc",
225
+ content: content.length > 0 ? content : [{ type: "paragraph", content: [] }],
226
+ };
227
+ }
228
+ //# sourceMappingURL=markdown-to-tiptap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-to-tiptap.js","sourceRoot":"","sources":["../../src/lib/markdown-to-tiptap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Output formatting utilities.
3
+ *
4
+ * JSON mode: raw API response.
5
+ * Human mode: formatted tables/text.
6
+ * Quiet mode: minimal output (IDs only).
7
+ */
8
+ export declare function outputJson(data: unknown): void;
9
+ export declare function outputQuiet(value: string): void;
10
+ /**
11
+ * Print a simple table with aligned columns.
12
+ */
13
+ export declare function outputTable(headers: string[], rows: string[][]): void;
14
+ /**
15
+ * Format a timestamp as relative time (e.g., "2h ago", "3d ago").
16
+ */
17
+ export declare function timeAgo(timestamp: number | string): string;
18
+ /**
19
+ * Truncate a string to a max length with ellipsis.
20
+ */
21
+ export declare function truncate(str: string, max: number): string;
22
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,GACf,IAAI,CAeN;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAa1D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGzD"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Output formatting utilities.
3
+ *
4
+ * JSON mode: raw API response.
5
+ * Human mode: formatted tables/text.
6
+ * Quiet mode: minimal output (IDs only).
7
+ */
8
+ export function outputJson(data) {
9
+ console.log(JSON.stringify(data, null, 2));
10
+ }
11
+ export function outputQuiet(value) {
12
+ console.log(value);
13
+ }
14
+ /**
15
+ * Print a simple table with aligned columns.
16
+ */
17
+ export function outputTable(headers, rows) {
18
+ const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] || "").length)));
19
+ const headerLine = headers
20
+ .map((h, i) => h.padEnd(widths[i]))
21
+ .join(" ");
22
+ const separator = widths.map((w) => "-".repeat(w)).join(" ");
23
+ console.log(headerLine);
24
+ console.log(separator);
25
+ for (const row of rows) {
26
+ console.log(row.map((c, i) => (c || "").padEnd(widths[i])).join(" "));
27
+ }
28
+ }
29
+ /**
30
+ * Format a timestamp as relative time (e.g., "2h ago", "3d ago").
31
+ */
32
+ export function timeAgo(timestamp) {
33
+ const ms = typeof timestamp === "string" ? new Date(timestamp).getTime() : timestamp;
34
+ const now = Date.now();
35
+ const diff = now - ms;
36
+ const seconds = Math.floor(diff / 1000);
37
+ const minutes = Math.floor(seconds / 60);
38
+ const hours = Math.floor(minutes / 60);
39
+ const days = Math.floor(hours / 24);
40
+ if (days > 0)
41
+ return `${days}d ago`;
42
+ if (hours > 0)
43
+ return `${hours}h ago`;
44
+ if (minutes > 0)
45
+ return `${minutes}m ago`;
46
+ return "just now";
47
+ }
48
+ /**
49
+ * Truncate a string to a max length with ellipsis.
50
+ */
51
+ export function truncate(str, max) {
52
+ if (str.length <= max)
53
+ return str;
54
+ return str.slice(0, max - 1) + "\u2026";
55
+ }
56
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ApiClient } from "./api-client.js";
2
+ /**
3
+ * Resolve a display ID (e.g., "MEETING-12") to a Convex note ID.
4
+ * Falls back to treating the input as a Convex ID directly.
5
+ */
6
+ export declare function resolveNoteId(api: ApiClient, workspaceId: string, idOrDisplayId: string): Promise<string>;
7
+ //# sourceMappingURL=resolve-note.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-note.d.ts","sourceRoot":"","sources":["../../src/lib/resolve-note.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;GAGG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,EACd,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Resolve a display ID (e.g., "MEETING-12") to a Convex note ID.
3
+ * Falls back to treating the input as a Convex ID directly.
4
+ */
5
+ export async function resolveNoteId(api, workspaceId, idOrDisplayId) {
6
+ // If it looks like a Convex ID (no dash with letters), use directly
7
+ if (!idOrDisplayId.match(/^[A-Z]+-\d+$/)) {
8
+ return idOrDisplayId;
9
+ }
10
+ // Resolve display ID
11
+ const notesList = await api.get("/api/notes", {
12
+ workspaceId,
13
+ exact_id: idOrDisplayId,
14
+ excludeContent: "true",
15
+ });
16
+ const note = Array.isArray(notesList) ? notesList[0] : null;
17
+ if (!note) {
18
+ throw new Error(`Note not found: ${idOrDisplayId}`);
19
+ }
20
+ return String(note._id || note.id);
21
+ }
22
+ //# sourceMappingURL=resolve-note.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-note.js","sourceRoot":"","sources":["../../src/lib/resolve-note.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAc,EACd,WAAmB,EACnB,aAAqB;IAErB,oEAAoE;IACpE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QACzC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,qBAAqB;IACrB,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,GAAG,CAAiC,YAAY,EAAE;QAC5E,WAAW;QACX,QAAQ,EAAE,aAAa;QACvB,cAAc,EAAE,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Read all data from stdin as a UTF-8 string.
3
+ */
4
+ export declare function readStdin(): Promise<string>;
5
+ //# sourceMappingURL=stdin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.d.ts","sourceRoot":"","sources":["../../src/lib/stdin.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAMjD"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Read all data from stdin as a UTF-8 string.
3
+ */
4
+ export async function readStdin() {
5
+ const chunks = [];
6
+ for await (const chunk of process.stdin) {
7
+ chunks.push(chunk);
8
+ }
9
+ return Buffer.concat(chunks).toString("utf-8");
10
+ }
11
+ //# sourceMappingURL=stdin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.js","sourceRoot":"","sources":["../../src/lib/stdin.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC"}