youmd 0.3.1 → 0.3.3

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 (44) hide show
  1. package/dist/commands/chat.d.ts.map +1 -1
  2. package/dist/commands/chat.js +379 -39
  3. package/dist/commands/chat.js.map +1 -1
  4. package/dist/commands/keys.d.ts +2 -1
  5. package/dist/commands/keys.d.ts.map +1 -1
  6. package/dist/commands/keys.js +176 -40
  7. package/dist/commands/keys.js.map +1 -1
  8. package/dist/commands/link.d.ts +6 -0
  9. package/dist/commands/link.d.ts.map +1 -1
  10. package/dist/commands/link.js +145 -60
  11. package/dist/commands/link.js.map +1 -1
  12. package/dist/commands/login.d.ts +1 -0
  13. package/dist/commands/login.d.ts.map +1 -1
  14. package/dist/commands/login.js +25 -0
  15. package/dist/commands/login.js.map +1 -1
  16. package/dist/commands/memories.d.ts +2 -0
  17. package/dist/commands/memories.d.ts.map +1 -0
  18. package/dist/commands/memories.js +113 -0
  19. package/dist/commands/memories.js.map +1 -0
  20. package/dist/commands/private.d.ts +5 -0
  21. package/dist/commands/private.d.ts.map +1 -0
  22. package/dist/commands/private.js +450 -0
  23. package/dist/commands/private.js.map +1 -0
  24. package/dist/commands/pull.d.ts.map +1 -1
  25. package/dist/commands/pull.js +23 -0
  26. package/dist/commands/pull.js.map +1 -1
  27. package/dist/commands/push.d.ts.map +1 -1
  28. package/dist/commands/push.js +21 -0
  29. package/dist/commands/push.js.map +1 -1
  30. package/dist/index.js +16 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/lib/api.d.ts +85 -0
  33. package/dist/lib/api.d.ts.map +1 -1
  34. package/dist/lib/api.js +83 -0
  35. package/dist/lib/api.js.map +1 -1
  36. package/dist/lib/onboarding.d.ts +2 -1
  37. package/dist/lib/onboarding.d.ts.map +1 -1
  38. package/dist/lib/onboarding.js +18 -11
  39. package/dist/lib/onboarding.js.map +1 -1
  40. package/dist/lib/render.d.ts +71 -0
  41. package/dist/lib/render.d.ts.map +1 -0
  42. package/dist/lib/render.js +286 -0
  43. package/dist/lib/render.js.map +1 -0
  44. package/package.json +1 -1
@@ -38,10 +38,35 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.loginCommand = loginCommand;
40
40
  const readline = __importStar(require("readline"));
41
+ const child_process_1 = require("child_process");
41
42
  const chalk_1 = __importDefault(require("chalk"));
42
43
  const config_1 = require("../lib/config");
43
44
  const api_1 = require("../lib/api");
44
45
  async function loginCommand(options) {
46
+ if (options.web) {
47
+ console.log("");
48
+ console.log("opening you.md dashboard in your browser...");
49
+ console.log("");
50
+ const url = "https://you.md/dashboard";
51
+ const platform = process.platform;
52
+ const cmd = platform === "darwin"
53
+ ? `open ${url}`
54
+ : platform === "win32"
55
+ ? `start ${url}`
56
+ : `xdg-open ${url}`;
57
+ (0, child_process_1.exec)(cmd, (err) => {
58
+ if (err) {
59
+ console.log(chalk_1.default.yellow("could not open browser") +
60
+ " -- visit " +
61
+ chalk_1.default.cyan(url) +
62
+ " manually");
63
+ }
64
+ });
65
+ console.log("create an API key in the /tokens tab, then run: " +
66
+ chalk_1.default.cyan("youmd login -k YOUR_KEY"));
67
+ console.log("");
68
+ return;
69
+ }
45
70
  if (options.key) {
46
71
  await loginWithKey(options.key);
47
72
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,oCAkCC;AAvCD,mDAAqC;AACrC,kDAA0B;AAC1B,0CAAoE;AACpE,oCAAmC;AAE5B,KAAK,UAAU,YAAY,CAAC,OAAyB;IAC1D,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,qBAAqB;IACrB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CACT,+BAA+B;QAC7B,eAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC;QACzC,mBAAmB,CACtB,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC1C,EAAE,CAAC,KAAK,EAAE,CAAC;QAEX,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,qBAAqB;IACrB,MAAM,MAAM,GAAG,IAAA,yBAAgB,GAAE,CAAC;IAClC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;IACnB,MAAM,CAAC,MAAM,GAAG,0CAA0C,CAAC;IAC3D,IAAA,0BAAiB,EAAC,MAAM,CAAC,CAAC;IAE1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,kDAAkD;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,WAAK,GAAE,CAAC;QAE1B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,MAAM,CAAC,SAAS,CAAC;gBACrB,oDAAoD,CACvD,CAAC;YACF,OAAO,CAAC,GAAG,CACT,iCAAiC,GAAG,GAAG,CAAC,MAAM,CAC/C,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,2CAA2C;gBACzC,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC;gBAC1B,2BAA2B,CAC9B,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QACpB,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC;QAC9B,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;QACxB,IAAA,0BAAiB,EAAC,MAAM,CAAC,CAAC;QAE1B,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,eAAe,CAAC;YAC1B,MAAM;YACN,eAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAC1B,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,WAAW,CAAC;YACtB,0BAA0B,CAC7B,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YAClB,kDAAkD,CACrD,CAAC;QACF,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function memoriesCommand(subcommand?: string, ...args: string[]): Promise<void>;
2
+ //# sourceMappingURL=memories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memories.d.ts","sourceRoot":"","sources":["../../src/commands/memories.ts"],"names":[],"mappings":"AAMA,wBAAsB,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,iBAsH3E"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.memoriesCommand = memoriesCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const config_1 = require("../lib/config");
9
+ const api_1 = require("../lib/api");
10
+ const CATEGORIES = ["fact", "insight", "decision", "preference", "context", "goal", "relationship"];
11
+ async function memoriesCommand(subcommand, ...args) {
12
+ if (!(0, config_1.isAuthenticated)()) {
13
+ console.log(chalk_1.default.red("not authenticated. run `youmd login` first."));
14
+ process.exit(1);
15
+ }
16
+ const cmd = subcommand || "list";
17
+ switch (cmd) {
18
+ case "list":
19
+ case "ls": {
20
+ const categoryArg = args.find((a) => CATEGORIES.includes(a));
21
+ const limitArg = args.find((a) => /^\d+$/.test(a));
22
+ const res = await (0, api_1.listMemories)({
23
+ category: categoryArg,
24
+ limit: limitArg ? parseInt(limitArg) : 50,
25
+ });
26
+ if (!res.ok) {
27
+ console.log(chalk_1.default.red(`failed to fetch memories: ${JSON.stringify(res.data)}`));
28
+ process.exit(1);
29
+ }
30
+ const { memories, count } = res.data;
31
+ if (count === 0) {
32
+ console.log(chalk_1.default.gray("no memories yet. chat with the agent to start building context."));
33
+ return;
34
+ }
35
+ console.log(chalk_1.default.gray(`${count} memories${categoryArg ? ` (${categoryArg})` : ""}\n`));
36
+ // Group by category
37
+ const grouped = new Map();
38
+ for (const m of memories) {
39
+ if (!grouped.has(m.category))
40
+ grouped.set(m.category, []);
41
+ grouped.get(m.category).push(m);
42
+ }
43
+ for (const [cat, mems] of grouped) {
44
+ console.log(chalk_1.default.hex("#C46A3A")(` ${cat}s (${mems.length})`));
45
+ for (const m of mems.slice(0, 10)) {
46
+ const date = new Date(m.createdAt).toISOString().split("T")[0];
47
+ const source = m.source !== "you-agent" ? chalk_1.default.gray(` via ${m.sourceAgent || m.source}`) : "";
48
+ const tags = m.tags?.length ? chalk_1.default.gray(` [${m.tags.join(", ")}]`) : "";
49
+ console.log(` ${chalk_1.default.white(m.content)}${tags}${source} ${chalk_1.default.gray(date)}`);
50
+ }
51
+ console.log();
52
+ }
53
+ break;
54
+ }
55
+ case "add": {
56
+ // youmd memories add <category> <content> [--tags tag1,tag2]
57
+ const category = args[0];
58
+ if (!category || !CATEGORIES.includes(category)) {
59
+ console.log(chalk_1.default.red(`category must be one of: ${CATEGORIES.join(", ")}`));
60
+ process.exit(1);
61
+ }
62
+ const tagsIdx = args.indexOf("--tags");
63
+ let tags;
64
+ let contentArgs;
65
+ if (tagsIdx > 0) {
66
+ tags = args[tagsIdx + 1]?.split(",").map((t) => t.trim());
67
+ contentArgs = args.slice(1, tagsIdx);
68
+ }
69
+ else {
70
+ contentArgs = args.slice(1);
71
+ }
72
+ const content = contentArgs.join(" ");
73
+ if (!content) {
74
+ console.log(chalk_1.default.red("usage: youmd memories add <category> <content> [--tags tag1,tag2]"));
75
+ process.exit(1);
76
+ }
77
+ const res = await (0, api_1.saveMemories)([{ category, content, tags }], "cli");
78
+ if (!res.ok) {
79
+ console.log(chalk_1.default.red(`failed to save memory: ${JSON.stringify(res.data)}`));
80
+ process.exit(1);
81
+ }
82
+ console.log(chalk_1.default.hex("#C46A3A")(`saved [${category}] ${content}`));
83
+ break;
84
+ }
85
+ case "stats": {
86
+ const res = await (0, api_1.listMemories)();
87
+ if (!res.ok) {
88
+ console.log(chalk_1.default.red("failed to fetch memories"));
89
+ process.exit(1);
90
+ }
91
+ const { memories, count } = res.data;
92
+ const byCategory = new Map();
93
+ for (const m of memories) {
94
+ byCategory.set(m.category, (byCategory.get(m.category) || 0) + 1);
95
+ }
96
+ console.log(chalk_1.default.gray(`memory stats: ${count} total\n`));
97
+ for (const cat of CATEGORIES) {
98
+ const c = byCategory.get(cat) || 0;
99
+ if (c > 0)
100
+ console.log(` ${chalk_1.default.hex("#C46A3A")(cat + "s")}: ${c}`);
101
+ }
102
+ break;
103
+ }
104
+ default:
105
+ console.log(chalk_1.default.gray("usage:"));
106
+ console.log(" youmd memories list [category] [limit]");
107
+ console.log(" youmd memories add <category> <content> [--tags tag1,tag2]");
108
+ console.log(" youmd memories stats");
109
+ console.log(chalk_1.default.gray(`\ncategories: ${CATEGORIES.join(", ")}`));
110
+ break;
111
+ }
112
+ }
113
+ //# sourceMappingURL=memories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memories.js","sourceRoot":"","sources":["../../src/commands/memories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { PrivateContext } from "../lib/api";
2
+ export declare function privateCommand(subcommand?: string, ...args: string[]): Promise<void>;
3
+ export declare function writePrivateContextToLocal(bundleDir: string, ctx: PrivateContext): number;
4
+ export declare function readPrivateContextFromLocal(bundleDir: string): Partial<PrivateContext>;
5
+ //# sourceMappingURL=private.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../../src/commands/private.ts"],"names":[],"mappings":"AAKA,OAAO,EAA2C,cAAc,EAAE,MAAM,YAAY,CAAC;AAKrF,wBAAsB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,iBA0F1E;AA+SD,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,MAAM,CA6BzF;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoCtF"}
@@ -0,0 +1,450 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.privateCommand = privateCommand;
40
+ exports.writePrivateContextToLocal = writePrivateContextToLocal;
41
+ exports.readPrivateContextFromLocal = readPrivateContextFromLocal;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const readline = __importStar(require("readline"));
45
+ const chalk_1 = __importDefault(require("chalk"));
46
+ const config_1 = require("../lib/config");
47
+ const api_1 = require("../lib/api");
48
+ const render_1 = require("../lib/render");
49
+ const ACCENT = chalk_1.default.hex("#C46A3A");
50
+ async function privateCommand(subcommand, ...args) {
51
+ if (!(0, config_1.isAuthenticated)()) {
52
+ console.log(chalk_1.default.red("not authenticated. run `youmd login` first."));
53
+ process.exit(1);
54
+ }
55
+ const cmd = subcommand || "show";
56
+ switch (cmd) {
57
+ case "show": {
58
+ await showAll();
59
+ break;
60
+ }
61
+ case "notes": {
62
+ const notesSub = args[0];
63
+ if (!notesSub) {
64
+ await showNotes();
65
+ }
66
+ else if (notesSub === "set") {
67
+ await setNotes();
68
+ }
69
+ else if (notesSub === "append") {
70
+ const text = args.slice(1).join(" ");
71
+ if (!text) {
72
+ console.log(chalk_1.default.red("usage: youmd private notes append \"text to append\""));
73
+ process.exit(1);
74
+ }
75
+ await appendNotes(text);
76
+ }
77
+ else {
78
+ console.log(chalk_1.default.red(`unknown notes subcommand: ${notesSub}`));
79
+ printUsage();
80
+ }
81
+ break;
82
+ }
83
+ case "links": {
84
+ const linksSub = args[0];
85
+ if (!linksSub) {
86
+ await showLinks();
87
+ }
88
+ else if (linksSub === "add") {
89
+ const label = args[1];
90
+ const url = args[2];
91
+ if (!label || !url) {
92
+ console.log(chalk_1.default.red("usage: youmd private links add <label> <url>"));
93
+ process.exit(1);
94
+ }
95
+ await addLink(label, url);
96
+ }
97
+ else if (linksSub === "remove") {
98
+ const label = args[1];
99
+ if (!label) {
100
+ console.log(chalk_1.default.red("usage: youmd private links remove <label>"));
101
+ process.exit(1);
102
+ }
103
+ await removeLink(label);
104
+ }
105
+ else {
106
+ console.log(chalk_1.default.red(`unknown links subcommand: ${linksSub}`));
107
+ printUsage();
108
+ }
109
+ break;
110
+ }
111
+ case "projects": {
112
+ const projectsSub = args[0];
113
+ if (!projectsSub) {
114
+ await showProjects();
115
+ }
116
+ else if (projectsSub === "add") {
117
+ const name = args[1];
118
+ if (!name) {
119
+ console.log(chalk_1.default.red("usage: youmd private projects add <name> [description]"));
120
+ process.exit(1);
121
+ }
122
+ const description = args.slice(2).join(" ") || "";
123
+ await addProject(name, description);
124
+ }
125
+ else if (projectsSub === "remove") {
126
+ const name = args[1];
127
+ if (!name) {
128
+ console.log(chalk_1.default.red("usage: youmd private projects remove <name>"));
129
+ process.exit(1);
130
+ }
131
+ await removeProject(name);
132
+ }
133
+ else {
134
+ console.log(chalk_1.default.red(`unknown projects subcommand: ${projectsSub}`));
135
+ printUsage();
136
+ }
137
+ break;
138
+ }
139
+ default:
140
+ printUsage();
141
+ break;
142
+ }
143
+ }
144
+ function printUsage() {
145
+ console.log(chalk_1.default.dim("usage:"));
146
+ console.log(" youmd private show all private context");
147
+ console.log(" youmd private notes show private notes");
148
+ console.log(" youmd private notes set set notes (stdin or prompt)");
149
+ console.log(" youmd private notes append \"text\" append to notes");
150
+ console.log(" youmd private links list private links");
151
+ console.log(" youmd private links add <label> <url> add a link");
152
+ console.log(" youmd private links remove <label> remove a link");
153
+ console.log(" youmd private projects list private projects");
154
+ console.log(" youmd private projects add <name> [desc] add a project");
155
+ console.log(" youmd private projects remove <name> remove a project");
156
+ }
157
+ // ── Fetch helper ──────────────────────────────────────────────
158
+ async function fetchPrivateContext() {
159
+ const spinner = new render_1.BrailleSpinner("fetching private context");
160
+ spinner.start();
161
+ const res = await (0, api_1.getPrivateContext)();
162
+ if (!res.ok) {
163
+ spinner.fail("failed to fetch private context");
164
+ console.log(chalk_1.default.red(` ${JSON.stringify(res.data)}`));
165
+ process.exit(1);
166
+ }
167
+ spinner.stop();
168
+ return res.data || {};
169
+ }
170
+ // ── Show all ──────────────────────────────────────────────────
171
+ async function showAll() {
172
+ const ctx = await fetchPrivateContext();
173
+ const hasNotes = !!ctx.privateNotes;
174
+ const hasLinks = ctx.internalLinks && Object.keys(ctx.internalLinks).length > 0;
175
+ const hasProjects = ctx.privateProjects && ctx.privateProjects.length > 0;
176
+ if (!hasNotes && !hasLinks && !hasProjects) {
177
+ console.log(chalk_1.default.dim(" no private context yet."));
178
+ console.log(chalk_1.default.dim(" use `youmd private notes set`, `youmd private links add`, or `youmd private projects add` to get started."));
179
+ return;
180
+ }
181
+ if (hasNotes) {
182
+ console.log(ACCENT(" notes"));
183
+ for (const line of ctx.privateNotes.split("\n")) {
184
+ console.log(chalk_1.default.white(` ${line}`));
185
+ }
186
+ console.log();
187
+ }
188
+ if (hasLinks) {
189
+ console.log(ACCENT(" links"));
190
+ for (const [label, url] of Object.entries(ctx.internalLinks)) {
191
+ console.log(` ${chalk_1.default.white(label)} ${chalk_1.default.dim(url)}`);
192
+ }
193
+ console.log();
194
+ }
195
+ if (hasProjects) {
196
+ console.log(ACCENT(" projects"));
197
+ for (const p of ctx.privateProjects) {
198
+ const status = p.status ? chalk_1.default.dim(` [${p.status}]`) : "";
199
+ const desc = p.description ? chalk_1.default.dim(` - ${p.description}`) : "";
200
+ console.log(` ${chalk_1.default.white(p.name)}${status}${desc}`);
201
+ }
202
+ console.log();
203
+ }
204
+ }
205
+ // ── Notes ─────────────────────────────────────────────────────
206
+ async function showNotes() {
207
+ const ctx = await fetchPrivateContext();
208
+ if (!ctx.privateNotes) {
209
+ console.log(chalk_1.default.dim(" no private notes set."));
210
+ console.log(chalk_1.default.dim(" use `youmd private notes set` to add notes."));
211
+ return;
212
+ }
213
+ console.log(ACCENT(" notes"));
214
+ for (const line of ctx.privateNotes.split("\n")) {
215
+ console.log(chalk_1.default.white(` ${line}`));
216
+ }
217
+ }
218
+ async function setNotes() {
219
+ let text;
220
+ // Check if stdin has data piped in
221
+ if (!process.stdin.isTTY) {
222
+ text = await readStdin();
223
+ }
224
+ else {
225
+ // Interactive prompt
226
+ const rl = readline.createInterface({
227
+ input: process.stdin,
228
+ output: process.stdout,
229
+ });
230
+ text = await new Promise((resolve) => {
231
+ console.log(chalk_1.default.dim(" enter your private notes (press Ctrl+D when done):"));
232
+ const lines = [];
233
+ rl.on("line", (line) => lines.push(line));
234
+ rl.on("close", () => resolve(lines.join("\n")));
235
+ });
236
+ }
237
+ if (!text.trim()) {
238
+ console.log(chalk_1.default.red(" empty input, notes not updated."));
239
+ return;
240
+ }
241
+ const spinner = new render_1.BrailleSpinner("saving notes");
242
+ spinner.start();
243
+ const res = await (0, api_1.updatePrivateContext)({ privateNotes: text });
244
+ if (!res.ok) {
245
+ spinner.fail("failed to save notes");
246
+ console.log(chalk_1.default.red(` ${JSON.stringify(res.data)}`));
247
+ process.exit(1);
248
+ }
249
+ spinner.stop();
250
+ console.log(chalk_1.default.green(" notes saved."));
251
+ }
252
+ async function appendNotes(text) {
253
+ const ctx = await fetchPrivateContext();
254
+ const existing = ctx.privateNotes || "";
255
+ const updated = existing ? `${existing}\n${text}` : text;
256
+ const spinner = new render_1.BrailleSpinner("appending to notes");
257
+ spinner.start();
258
+ const res = await (0, api_1.updatePrivateContext)({ privateNotes: updated });
259
+ if (!res.ok) {
260
+ spinner.fail("failed to append notes");
261
+ console.log(chalk_1.default.red(` ${JSON.stringify(res.data)}`));
262
+ process.exit(1);
263
+ }
264
+ spinner.stop();
265
+ console.log(chalk_1.default.green(" appended to notes."));
266
+ }
267
+ // ── Links ─────────────────────────────────────────────────────
268
+ async function showLinks() {
269
+ const ctx = await fetchPrivateContext();
270
+ const links = ctx.internalLinks || {};
271
+ const entries = Object.entries(links);
272
+ if (entries.length === 0) {
273
+ console.log(chalk_1.default.dim(" no private links."));
274
+ console.log(chalk_1.default.dim(" use `youmd private links add <label> <url>` to add one."));
275
+ return;
276
+ }
277
+ console.log(ACCENT(` links (${entries.length})`));
278
+ for (const [label, url] of entries) {
279
+ console.log(` ${chalk_1.default.white(label)} ${chalk_1.default.dim(url)}`);
280
+ }
281
+ }
282
+ async function addLink(label, url) {
283
+ const ctx = await fetchPrivateContext();
284
+ const links = ctx.internalLinks || {};
285
+ links[label] = url;
286
+ const spinner = new render_1.BrailleSpinner("adding link");
287
+ spinner.start();
288
+ const res = await (0, api_1.updatePrivateContext)({ internalLinks: links });
289
+ if (!res.ok) {
290
+ spinner.fail("failed to add link");
291
+ console.log(chalk_1.default.red(` ${JSON.stringify(res.data)}`));
292
+ process.exit(1);
293
+ }
294
+ spinner.stop();
295
+ console.log(ACCENT(` added [${label}] ${url}`));
296
+ }
297
+ async function removeLink(label) {
298
+ const ctx = await fetchPrivateContext();
299
+ const links = ctx.internalLinks || {};
300
+ if (!(label in links)) {
301
+ console.log(chalk_1.default.red(` link "${label}" not found.`));
302
+ const keys = Object.keys(links);
303
+ if (keys.length > 0) {
304
+ console.log(chalk_1.default.dim(` available: ${keys.join(", ")}`));
305
+ }
306
+ return;
307
+ }
308
+ delete links[label];
309
+ const spinner = new render_1.BrailleSpinner("removing link");
310
+ spinner.start();
311
+ const res = await (0, api_1.updatePrivateContext)({ internalLinks: links });
312
+ if (!res.ok) {
313
+ spinner.fail("failed to remove link");
314
+ console.log(chalk_1.default.red(` ${JSON.stringify(res.data)}`));
315
+ process.exit(1);
316
+ }
317
+ spinner.stop();
318
+ console.log(chalk_1.default.green(` removed link "${label}".`));
319
+ }
320
+ // ── Projects ──────────────────────────────────────────────────
321
+ async function showProjects() {
322
+ const ctx = await fetchPrivateContext();
323
+ const projects = ctx.privateProjects || [];
324
+ if (projects.length === 0) {
325
+ console.log(chalk_1.default.dim(" no private projects."));
326
+ console.log(chalk_1.default.dim(" use `youmd private projects add <name> [description]` to add one."));
327
+ return;
328
+ }
329
+ console.log(ACCENT(` projects (${projects.length})`));
330
+ for (const p of projects) {
331
+ const status = p.status ? chalk_1.default.dim(` [${p.status}]`) : "";
332
+ const desc = p.description ? chalk_1.default.dim(` - ${p.description}`) : "";
333
+ console.log(` ${chalk_1.default.white(p.name)}${status}${desc}`);
334
+ }
335
+ }
336
+ async function addProject(name, description) {
337
+ const ctx = await fetchPrivateContext();
338
+ const projects = ctx.privateProjects || [];
339
+ const existing = projects.find((p) => p.name === name);
340
+ if (existing) {
341
+ console.log(chalk_1.default.red(` project "${name}" already exists. remove it first to update.`));
342
+ return;
343
+ }
344
+ projects.push({ name, description, status: "active" });
345
+ const spinner = new render_1.BrailleSpinner("adding project");
346
+ spinner.start();
347
+ const res = await (0, api_1.updatePrivateContext)({ privateProjects: projects });
348
+ if (!res.ok) {
349
+ spinner.fail("failed to add project");
350
+ console.log(chalk_1.default.red(` ${JSON.stringify(res.data)}`));
351
+ process.exit(1);
352
+ }
353
+ spinner.stop();
354
+ const desc = description ? chalk_1.default.dim(` - ${description}`) : "";
355
+ console.log(ACCENT(` added project: ${name}${desc}`));
356
+ }
357
+ async function removeProject(name) {
358
+ const ctx = await fetchPrivateContext();
359
+ const projects = ctx.privateProjects || [];
360
+ const idx = projects.findIndex((p) => p.name === name);
361
+ if (idx === -1) {
362
+ console.log(chalk_1.default.red(` project "${name}" not found.`));
363
+ if (projects.length > 0) {
364
+ console.log(chalk_1.default.dim(` available: ${projects.map((p) => p.name).join(", ")}`));
365
+ }
366
+ return;
367
+ }
368
+ projects.splice(idx, 1);
369
+ const spinner = new render_1.BrailleSpinner("removing project");
370
+ spinner.start();
371
+ const res = await (0, api_1.updatePrivateContext)({ privateProjects: projects });
372
+ if (!res.ok) {
373
+ spinner.fail("failed to remove project");
374
+ console.log(chalk_1.default.red(` ${JSON.stringify(res.data)}`));
375
+ process.exit(1);
376
+ }
377
+ spinner.stop();
378
+ console.log(chalk_1.default.green(` removed project "${name}".`));
379
+ }
380
+ // ── Local file I/O (for pull/push integration) ───────────────
381
+ function writePrivateContextToLocal(bundleDir, ctx) {
382
+ const privateDir = path.join(bundleDir, "private");
383
+ fs.mkdirSync(privateDir, { recursive: true });
384
+ let filesWritten = 0;
385
+ // Write notes
386
+ if (ctx.privateNotes) {
387
+ fs.writeFileSync(path.join(privateDir, "notes.md"), ctx.privateNotes);
388
+ filesWritten++;
389
+ }
390
+ // Write links
391
+ const links = ctx.internalLinks || {};
392
+ const linkEntries = Object.entries(links);
393
+ if (linkEntries.length > 0) {
394
+ const linksArray = linkEntries.map(([label, url]) => ({ label, url }));
395
+ fs.writeFileSync(path.join(privateDir, "links.json"), JSON.stringify(linksArray, null, 2) + "\n");
396
+ filesWritten++;
397
+ }
398
+ // Write projects
399
+ const projects = ctx.privateProjects || [];
400
+ if (projects.length > 0) {
401
+ fs.writeFileSync(path.join(privateDir, "projects.json"), JSON.stringify(projects, null, 2) + "\n");
402
+ filesWritten++;
403
+ }
404
+ return filesWritten;
405
+ }
406
+ function readPrivateContextFromLocal(bundleDir) {
407
+ const privateDir = path.join(bundleDir, "private");
408
+ const updates = {};
409
+ // Read notes
410
+ const notesPath = path.join(privateDir, "notes.md");
411
+ if (fs.existsSync(notesPath)) {
412
+ updates.privateNotes = fs.readFileSync(notesPath, "utf-8");
413
+ }
414
+ // Read links
415
+ const linksPath = path.join(privateDir, "links.json");
416
+ if (fs.existsSync(linksPath)) {
417
+ try {
418
+ const linksArray = JSON.parse(fs.readFileSync(linksPath, "utf-8"));
419
+ const linksRecord = {};
420
+ for (const { label, url } of linksArray) {
421
+ linksRecord[label] = url;
422
+ }
423
+ updates.internalLinks = linksRecord;
424
+ }
425
+ catch {
426
+ // skip malformed links.json
427
+ }
428
+ }
429
+ // Read projects
430
+ const projectsPath = path.join(privateDir, "projects.json");
431
+ if (fs.existsSync(projectsPath)) {
432
+ try {
433
+ updates.privateProjects = JSON.parse(fs.readFileSync(projectsPath, "utf-8"));
434
+ }
435
+ catch {
436
+ // skip malformed projects.json
437
+ }
438
+ }
439
+ return updates;
440
+ }
441
+ // ── Helpers ───────────────────────────────────────────────────
442
+ function readStdin() {
443
+ return new Promise((resolve) => {
444
+ let data = "";
445
+ process.stdin.setEncoding("utf-8");
446
+ process.stdin.on("data", (chunk) => (data += chunk));
447
+ process.stdin.on("end", () => resolve(data));
448
+ });
449
+ }
450
+ //# sourceMappingURL=private.js.map