youmd 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/api.test.d.ts +2 -0
- package/dist/__tests__/api.test.d.ts.map +1 -0
- package/dist/__tests__/api.test.js +84 -0
- package/dist/__tests__/api.test.js.map +1 -0
- package/dist/__tests__/compiler.test.d.ts +2 -0
- package/dist/__tests__/compiler.test.d.ts.map +1 -0
- package/dist/__tests__/compiler.test.js +127 -0
- package/dist/__tests__/compiler.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +79 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/decompile.test.d.ts +2 -0
- package/dist/__tests__/decompile.test.d.ts.map +1 -0
- package/dist/__tests__/decompile.test.js +102 -0
- package/dist/__tests__/decompile.test.js.map +1 -0
- package/dist/__tests__/hash.test.d.ts +2 -0
- package/dist/__tests__/hash.test.d.ts.map +1 -0
- package/dist/__tests__/hash.test.js +44 -0
- package/dist/__tests__/hash.test.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +2 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +277 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/__tests__/skill-renderer.test.d.ts +2 -0
- package/dist/__tests__/skill-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/skill-renderer.test.js +68 -0
- package/dist/__tests__/skill-renderer.test.js.map +1 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +6 -3
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/agents.d.ts +2 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +93 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +73 -20
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +63 -4
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/diff.d.ts +1 -1
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +402 -16
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/export.js +1 -1
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +131 -23
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/link.d.ts +1 -0
- package/dist/commands/link.d.ts.map +1 -1
- package/dist/commands/link.js +76 -12
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +76 -59
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.d.ts +7 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +115 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/mcp.d.ts +6 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +258 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/preview.d.ts.map +1 -1
- package/dist/commands/preview.js +191 -7
- package/dist/commands/preview.js.map +1 -1
- package/dist/commands/private.d.ts.map +1 -1
- package/dist/commands/private.js +248 -0
- package/dist/commands/private.js.map +1 -1
- package/dist/commands/prompts.d.ts +12 -0
- package/dist/commands/prompts.d.ts.map +1 -0
- package/dist/commands/prompts.js +245 -0
- package/dist/commands/prompts.js.map +1 -0
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +3 -2
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +42 -133
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +146 -38
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +39 -83
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +95 -19
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +132 -96
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +53 -29
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.js +177 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +93 -7
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +143 -38
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/compiler.d.ts +16 -33
- package/dist/lib/compiler.d.ts.map +1 -1
- package/dist/lib/compiler.js +499 -84
- package/dist/lib/compiler.js.map +1 -1
- package/dist/lib/config.d.ts +3 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +10 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/decompile.d.ts +21 -0
- package/dist/lib/decompile.d.ts.map +1 -0
- package/dist/lib/decompile.js +304 -0
- package/dist/lib/decompile.js.map +1 -0
- package/dist/lib/onboarding.d.ts +4 -4
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +116 -25
- package/dist/lib/onboarding.js.map +1 -1
- package/dist/lib/skill-catalog.d.ts.map +1 -1
- package/dist/lib/skill-catalog.js +57 -8
- package/dist/lib/skill-catalog.js.map +1 -1
- package/dist/lib/skill-renderer.d.ts.map +1 -1
- package/dist/lib/skill-renderer.js +18 -0
- package/dist/lib/skill-renderer.js.map +1 -1
- package/dist/lib/skills.d.ts +8 -3
- package/dist/lib/skills.d.ts.map +1 -1
- package/dist/lib/skills.js +281 -82
- package/dist/lib/skills.js.map +1 -1
- package/dist/lib/vault.d.ts +40 -0
- package/dist/lib/vault.d.ts.map +1 -0
- package/dist/lib/vault.js +187 -0
- package/dist/lib/vault.js.map +1 -0
- package/dist/mcp/server.d.ts +21 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +1283 -0
- package/dist/mcp/server.js.map +1 -0
- package/examples/houston/directives/agent.md +13 -0
- package/examples/houston/preferences/agent.md +14 -0
- package/examples/houston/profile/about.md +15 -0
- package/examples/houston/profile/links.md +10 -0
- package/examples/houston/profile/projects.md +37 -0
- package/examples/houston/profile/values.md +9 -0
- package/examples/houston/voice/voice.md +13 -0
- package/examples/jordan/directives/agent.md +13 -0
- package/examples/jordan/preferences/agent.md +16 -0
- package/examples/jordan/profile/about.md +15 -0
- package/examples/jordan/profile/links.md +10 -0
- package/examples/jordan/profile/projects.md +29 -0
- package/examples/jordan/profile/values.md +9 -0
- package/examples/jordan/voice/voice.md +12 -0
- package/examples/priya/directives/agent.md +13 -0
- package/examples/priya/preferences/agent.md +15 -0
- package/examples/priya/profile/about.md +15 -0
- package/examples/priya/profile/links.md +9 -0
- package/examples/priya/profile/projects.md +28 -0
- package/examples/priya/profile/values.md +9 -0
- package/examples/priya/voice/voice.md +12 -0
- package/package.json +11 -5
- package/skills/claude-md-generator.md +25 -0
- package/skills/meta-improve.md +27 -0
- package/skills/proactive-context-fill.md +52 -0
- package/skills/project-context-init.md +26 -0
- package/skills/voice-sync.md +48 -0
- package/skills/you-logs.md +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"AASA,wBAAgB,cAAc,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgH/D"}
|
package/dist/commands/preview.js
CHANGED
|
@@ -1,13 +1,51 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
39
|
exports.previewCommand = previewCommand;
|
|
40
|
+
const http = __importStar(require("http"));
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
7
43
|
const chalk_1 = __importDefault(require("chalk"));
|
|
8
44
|
const config_1 = require("../lib/config");
|
|
45
|
+
const compiler_1 = require("../lib/compiler");
|
|
46
|
+
const ACCENT = chalk_1.default.hex("#C46A3A");
|
|
9
47
|
function previewCommand(options) {
|
|
10
|
-
const port = options.port || "3333";
|
|
48
|
+
const port = parseInt(options.port || "3333", 10);
|
|
11
49
|
console.log("");
|
|
12
50
|
if (!(0, config_1.localBundleExists)()) {
|
|
13
51
|
console.log(chalk_1.default.yellow("no .youmd/ directory found"));
|
|
@@ -16,11 +54,157 @@ function previewCommand(options) {
|
|
|
16
54
|
console.log("");
|
|
17
55
|
return;
|
|
18
56
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
57
|
+
const bundleDir = (0, config_1.getLocalBundleDir)();
|
|
58
|
+
// Compile fresh bundle
|
|
59
|
+
let youJson = {};
|
|
60
|
+
let youMd = "";
|
|
61
|
+
const youJsonPath = path.join(bundleDir, "you.json");
|
|
62
|
+
const youMdPath = path.join(bundleDir, "you.md");
|
|
63
|
+
try {
|
|
64
|
+
const result = (0, compiler_1.compileBundle)(bundleDir);
|
|
65
|
+
youJson = result.youJson;
|
|
66
|
+
youMd = result.markdown;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Fall back to reading existing files
|
|
70
|
+
if (fs.existsSync(youJsonPath)) {
|
|
71
|
+
youJson = JSON.parse(fs.readFileSync(youJsonPath, "utf-8"));
|
|
72
|
+
}
|
|
73
|
+
if (fs.existsSync(youMdPath)) {
|
|
74
|
+
youMd = fs.readFileSync(youMdPath, "utf-8");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const identity = (youJson.identity || {});
|
|
78
|
+
const name = identity.name || "you.md";
|
|
79
|
+
const server = http.createServer((req, res) => {
|
|
80
|
+
const url = req.url || "/";
|
|
81
|
+
// CORS headers for agent access
|
|
82
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
83
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS");
|
|
84
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
|
|
85
|
+
if (req.method === "OPTIONS") {
|
|
86
|
+
res.writeHead(204);
|
|
87
|
+
res.end();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const accept = req.headers.accept || "";
|
|
91
|
+
if (url === "/you.json" || url === "/identity.json") {
|
|
92
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
93
|
+
res.end(JSON.stringify(youJson, null, 2));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (url === "/you.md" || url === "/you.txt" || url === "/identity.md") {
|
|
97
|
+
res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
|
|
98
|
+
res.end(youMd);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (url === "/" || url === "/index.html") {
|
|
102
|
+
// Content negotiation — agents get plain text, browsers get HTML
|
|
103
|
+
if (accept.includes("application/json")) {
|
|
104
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
105
|
+
res.end(JSON.stringify(youJson, null, 2));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (accept.includes("text/plain") || accept.includes("text/markdown")) {
|
|
109
|
+
res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
|
|
110
|
+
res.end(youMd);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// HTML preview for browsers
|
|
114
|
+
const html = buildPreviewHtml(youJson, youMd, name, port);
|
|
115
|
+
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
116
|
+
res.end(html);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
120
|
+
res.end("not found");
|
|
121
|
+
});
|
|
122
|
+
server.listen(port, () => {
|
|
123
|
+
console.log(ACCENT(" you.md preview"));
|
|
124
|
+
console.log("");
|
|
125
|
+
console.log(` serving ${chalk_1.default.dim(name)} on:`);
|
|
126
|
+
console.log("");
|
|
127
|
+
console.log(` ${chalk_1.default.cyan(`http://localhost:${port}`)} ${chalk_1.default.dim("html preview")}`);
|
|
128
|
+
console.log(` ${chalk_1.default.cyan(`http://localhost:${port}/you.json`)} ${chalk_1.default.dim("machine-readable")}`);
|
|
129
|
+
console.log(` ${chalk_1.default.cyan(`http://localhost:${port}/you.md`)} ${chalk_1.default.dim("agent-readable")}`);
|
|
130
|
+
console.log("");
|
|
131
|
+
console.log(chalk_1.default.dim(" press ctrl+c to stop"));
|
|
132
|
+
console.log("");
|
|
133
|
+
});
|
|
134
|
+
// Graceful shutdown
|
|
135
|
+
process.on("SIGINT", () => {
|
|
136
|
+
server.close();
|
|
137
|
+
console.log("");
|
|
138
|
+
console.log(chalk_1.default.dim(" preview stopped"));
|
|
139
|
+
console.log("");
|
|
140
|
+
process.exit(0);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
function buildPreviewHtml(youJson, youMd, name, port) {
|
|
144
|
+
const identity = (youJson.identity || {});
|
|
145
|
+
const bio = identity.bio || {};
|
|
146
|
+
const tagline = identity.tagline || "";
|
|
147
|
+
const location = identity.location || "";
|
|
148
|
+
const projects = (youJson.projects || []);
|
|
149
|
+
const values = (youJson.values || []);
|
|
150
|
+
const links = (youJson.links || {});
|
|
151
|
+
const preferences = (youJson.preferences || {});
|
|
152
|
+
const agent = (preferences.agent || {});
|
|
153
|
+
const projectsHtml = projects.map((p) => `<div class="project">
|
|
154
|
+
<span class="label">${p.name || "untitled"}</span>
|
|
155
|
+
<span class="dim"> -- ${p.role || ""} (${p.status || ""})</span>
|
|
156
|
+
${p.description ? `<div class="dim">${p.description}</div>` : ""}
|
|
157
|
+
</div>`).join("");
|
|
158
|
+
const valuesHtml = values.map((v) => `<li>${v}</li>`).join("");
|
|
159
|
+
const linksHtml = Object.entries(links).map(([k, v]) => `<li><span class="label">${k}:</span> <a href="${v}">${v}</a></li>`).join("");
|
|
160
|
+
return `<!DOCTYPE html>
|
|
161
|
+
<html lang="en">
|
|
162
|
+
<head>
|
|
163
|
+
<meta charset="utf-8">
|
|
164
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
165
|
+
<title>${name} -- you.md preview</title>
|
|
166
|
+
<style>
|
|
167
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
168
|
+
body { background: #0D0D0D; color: #EAE6E1; font-family: 'JetBrains Mono', monospace; padding: 2rem; max-width: 800px; margin: 0 auto; line-height: 1.6; }
|
|
169
|
+
h1 { color: #C46A3A; font-size: 1.5rem; margin-bottom: 0.25rem; }
|
|
170
|
+
h2 { color: #C46A3A; font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.1em; margin: 2rem 0 0.5rem; opacity: 0.8; }
|
|
171
|
+
.dim { opacity: 0.6; }
|
|
172
|
+
.label { color: #C46A3A; }
|
|
173
|
+
.tagline { font-size: 1rem; opacity: 0.8; margin-bottom: 0.5rem; }
|
|
174
|
+
.bio { margin: 1rem 0; opacity: 0.9; }
|
|
175
|
+
.project { margin: 0.5rem 0; }
|
|
176
|
+
ul { list-style: none; padding: 0; }
|
|
177
|
+
li { padding: 0.2rem 0; }
|
|
178
|
+
li::before { content: "-- "; opacity: 0.4; }
|
|
179
|
+
a { color: #C46A3A; text-decoration: none; }
|
|
180
|
+
a:hover { text-decoration: underline; }
|
|
181
|
+
.endpoints { margin-top: 2rem; padding: 1rem; border: 1px solid rgba(234,230,225,0.1); border-radius: 2px; }
|
|
182
|
+
.endpoints code { color: #C46A3A; }
|
|
183
|
+
pre { background: rgba(255,255,255,0.03); padding: 0.5rem; border-radius: 2px; overflow-x: auto; font-size: 0.85rem; margin: 0.5rem 0; }
|
|
184
|
+
</style>
|
|
185
|
+
</head>
|
|
186
|
+
<body>
|
|
187
|
+
<h1>${name}</h1>
|
|
188
|
+
<div class="tagline">${tagline}</div>
|
|
189
|
+
${location ? `<div class="dim">${location}</div>` : ""}
|
|
190
|
+
${bio.medium ? `<div class="bio">${bio.medium}</div>` : bio.short ? `<div class="bio">${bio.short}</div>` : ""}
|
|
191
|
+
|
|
192
|
+
${projects.length ? `<h2>── projects ──</h2>${projectsHtml}` : ""}
|
|
193
|
+
${values.length ? `<h2>── values ──</h2><ul>${valuesHtml}</ul>` : ""}
|
|
194
|
+
${Object.keys(links).length ? `<h2>── links ──</h2><ul>${linksHtml}</ul>` : ""}
|
|
195
|
+
${agent.tone ? `<h2>── agent preferences ──</h2><div class="dim">tone: ${agent.tone}</div>` : ""}
|
|
196
|
+
|
|
197
|
+
<div class="endpoints">
|
|
198
|
+
<h2>── endpoints ──</h2>
|
|
199
|
+
<ul>
|
|
200
|
+
<li><code>GET /you.json</code> <span class="dim">machine-readable identity</span></li>
|
|
201
|
+
<li><code>GET /you.md</code> <span class="dim">agent-readable markdown</span></li>
|
|
202
|
+
<li><code>GET /</code> <span class="dim">content-negotiated (Accept header)</span></li>
|
|
203
|
+
</ul>
|
|
204
|
+
<pre>curl http://localhost:${port}/you.json
|
|
205
|
+
curl -H "Accept: text/plain" http://localhost:${port}/</pre>
|
|
206
|
+
</div>
|
|
207
|
+
</body>
|
|
208
|
+
</html>`;
|
|
25
209
|
}
|
|
26
210
|
//# sourceMappingURL=preview.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../../src/commands/private.ts"],"names":[],"mappings":"AAWA,OAAO,EAA2C,cAAc,
|
|
1
|
+
{"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../../src/commands/private.ts"],"names":[],"mappings":"AAWA,OAAO,EAA2C,cAAc,EAA0D,MAAM,YAAY,CAAC;AA0B7I,wBAAsB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,iBA4H1E;AA6YD,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"}
|
package/dist/commands/private.js
CHANGED
|
@@ -46,6 +46,7 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
46
46
|
const config_1 = require("../lib/config");
|
|
47
47
|
const api_1 = require("../lib/api");
|
|
48
48
|
const render_1 = require("../lib/render");
|
|
49
|
+
const vault_1 = require("../lib/vault");
|
|
49
50
|
const ACCENT = chalk_1.default.hex("#C46A3A");
|
|
50
51
|
/**
|
|
51
52
|
* Check if --global flag is present in args and strip it.
|
|
@@ -156,6 +157,32 @@ async function privateCommand(subcommand, ...args) {
|
|
|
156
157
|
}
|
|
157
158
|
break;
|
|
158
159
|
}
|
|
160
|
+
case "vault": {
|
|
161
|
+
const vaultSub = cleanArgs[0] || "status";
|
|
162
|
+
if (vaultSub === "init") {
|
|
163
|
+
await vaultInit();
|
|
164
|
+
}
|
|
165
|
+
else if (vaultSub === "status") {
|
|
166
|
+
await vaultStatus();
|
|
167
|
+
}
|
|
168
|
+
else if (vaultSub === "save") {
|
|
169
|
+
const mdPath = cleanArgs[1];
|
|
170
|
+
const jsonPath = cleanArgs[2];
|
|
171
|
+
if (!mdPath || !jsonPath) {
|
|
172
|
+
console.log(chalk_1.default.red("usage: youmd private vault save <md-file> <json-file>"));
|
|
173
|
+
process.exit(1);
|
|
174
|
+
}
|
|
175
|
+
await vaultSave(mdPath, jsonPath);
|
|
176
|
+
}
|
|
177
|
+
else if (vaultSub === "read") {
|
|
178
|
+
await vaultRead();
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
console.log(chalk_1.default.red(`unknown vault subcommand: ${vaultSub}`));
|
|
182
|
+
printUsage();
|
|
183
|
+
}
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
159
186
|
default:
|
|
160
187
|
printUsage();
|
|
161
188
|
break;
|
|
@@ -174,6 +201,12 @@ function printUsage() {
|
|
|
174
201
|
console.log(" youmd private projects add <name> [desc] add a project");
|
|
175
202
|
console.log(" youmd private projects remove <name> remove a project");
|
|
176
203
|
console.log("");
|
|
204
|
+
console.log(chalk_1.default.dim(" encrypted vault:"));
|
|
205
|
+
console.log(" youmd private vault show vault status");
|
|
206
|
+
console.log(" youmd private vault init create vault (set passphrase)");
|
|
207
|
+
console.log(" youmd private vault save <md> <json> encrypt and store files");
|
|
208
|
+
console.log(" youmd private vault read decrypt and display vault");
|
|
209
|
+
console.log("");
|
|
177
210
|
console.log(chalk_1.default.dim(" in a project directory, notes are project-scoped by default."));
|
|
178
211
|
console.log(chalk_1.default.dim(" use --global to target global private context instead."));
|
|
179
212
|
}
|
|
@@ -542,6 +575,221 @@ function readPrivateContextFromLocal(bundleDir) {
|
|
|
542
575
|
}
|
|
543
576
|
return updates;
|
|
544
577
|
}
|
|
578
|
+
// ── Vault commands ────────────────────────────────────────────
|
|
579
|
+
function promptPassphrase(prompt) {
|
|
580
|
+
return new Promise((resolve) => {
|
|
581
|
+
const rl = readline.createInterface({
|
|
582
|
+
input: process.stdin,
|
|
583
|
+
output: process.stdout,
|
|
584
|
+
});
|
|
585
|
+
// Note: passphrase will be visible in terminal. For true hidden input
|
|
586
|
+
// a library like `read` would be needed, but this keeps deps minimal.
|
|
587
|
+
rl.question(chalk_1.default.dim(` ${prompt}: `), (answer) => {
|
|
588
|
+
rl.close();
|
|
589
|
+
resolve(answer);
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
async function vaultInit() {
|
|
594
|
+
if ((0, vault_1.isVaultInitialized)()) {
|
|
595
|
+
console.log(chalk_1.default.yellow(" vault already initialized locally."));
|
|
596
|
+
console.log(chalk_1.default.dim(" to re-initialize, delete ~/.youmd/vault-key.enc first."));
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
console.log(ACCENT(" initializing private vault"));
|
|
600
|
+
console.log(chalk_1.default.dim(" choose a passphrase to protect your vault key."));
|
|
601
|
+
console.log(chalk_1.default.dim(" this passphrase encrypts your vault key — if you lose it, your vault data is unrecoverable."));
|
|
602
|
+
console.log();
|
|
603
|
+
const passphrase = await promptPassphrase("vault passphrase");
|
|
604
|
+
if (!passphrase || passphrase.length < 8) {
|
|
605
|
+
console.log(chalk_1.default.red(" passphrase must be at least 8 characters."));
|
|
606
|
+
process.exit(1);
|
|
607
|
+
}
|
|
608
|
+
const confirm = await promptPassphrase("confirm passphrase");
|
|
609
|
+
if (passphrase !== confirm) {
|
|
610
|
+
console.log(chalk_1.default.red(" passphrases do not match."));
|
|
611
|
+
process.exit(1);
|
|
612
|
+
}
|
|
613
|
+
const spinner = new render_1.BrailleSpinner("generating vault key");
|
|
614
|
+
spinner.start();
|
|
615
|
+
// Generate random vault key
|
|
616
|
+
const vaultKey = (0, vault_1.generateVaultKey)();
|
|
617
|
+
// Wrap it with the passphrase
|
|
618
|
+
const wrapped = (0, vault_1.encryptVaultKey)(vaultKey, passphrase);
|
|
619
|
+
// Save locally
|
|
620
|
+
(0, vault_1.saveVaultKey)(wrapped);
|
|
621
|
+
// Also push wrapped key to server for web recovery
|
|
622
|
+
const res = await (0, api_1.initVault)({
|
|
623
|
+
wrappedVaultKey: (0, vault_1.toBase64)(wrapped.encrypted),
|
|
624
|
+
vaultSalt: (0, vault_1.toBase64)(wrapped.salt),
|
|
625
|
+
vaultKeyIv: (0, vault_1.toBase64)(wrapped.iv),
|
|
626
|
+
});
|
|
627
|
+
if (!res.ok) {
|
|
628
|
+
spinner.fail("failed to sync vault key to server");
|
|
629
|
+
console.log(chalk_1.default.red(` ${JSON.stringify(res.data)}`));
|
|
630
|
+
// Local key is still saved, so vault works locally
|
|
631
|
+
console.log(chalk_1.default.yellow(" vault key saved locally but not synced to server."));
|
|
632
|
+
return;
|
|
633
|
+
}
|
|
634
|
+
spinner.stop();
|
|
635
|
+
console.log(chalk_1.default.green(" vault initialized."));
|
|
636
|
+
console.log(chalk_1.default.dim(" vault key saved to ~/.youmd/vault-key.enc"));
|
|
637
|
+
console.log(chalk_1.default.dim(" wrapped key synced to server for recovery."));
|
|
638
|
+
}
|
|
639
|
+
async function vaultStatus() {
|
|
640
|
+
const local = (0, vault_1.isVaultInitialized)();
|
|
641
|
+
console.log(ACCENT(" vault status"));
|
|
642
|
+
console.log(` local key: ${local ? chalk_1.default.green("initialized") : chalk_1.default.dim("not initialized")}`);
|
|
643
|
+
if (!local) {
|
|
644
|
+
console.log(chalk_1.default.dim(" run `youmd private vault init` to set up the vault."));
|
|
645
|
+
return;
|
|
646
|
+
}
|
|
647
|
+
const spinner = new render_1.BrailleSpinner("checking remote vault");
|
|
648
|
+
spinner.start();
|
|
649
|
+
const res = await (0, api_1.getVaultData)();
|
|
650
|
+
spinner.stop();
|
|
651
|
+
if (!res.ok) {
|
|
652
|
+
console.log(` remote: ${chalk_1.default.red("error fetching")}`);
|
|
653
|
+
return;
|
|
654
|
+
}
|
|
655
|
+
const data = res.data;
|
|
656
|
+
console.log(` remote: ${data.initialized ? chalk_1.default.green("initialized") : chalk_1.default.dim("not initialized")}`);
|
|
657
|
+
if (data.initialized && data.encryptedMd) {
|
|
658
|
+
console.log(` has data: ${chalk_1.default.green("yes")}`);
|
|
659
|
+
if (data.updatedAt) {
|
|
660
|
+
console.log(` updated: ${chalk_1.default.dim(new Date(data.updatedAt).toISOString())}`);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
else if (data.initialized) {
|
|
664
|
+
console.log(` has data: ${chalk_1.default.dim("no (vault key stored, no encrypted data yet)")}`);
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
async function vaultSave(mdPath, jsonPath) {
|
|
668
|
+
if (!(0, vault_1.isVaultInitialized)()) {
|
|
669
|
+
console.log(chalk_1.default.red(" vault not initialized. run `youmd private vault init` first."));
|
|
670
|
+
process.exit(1);
|
|
671
|
+
}
|
|
672
|
+
// Read the files
|
|
673
|
+
const resolvedMd = path.resolve(mdPath);
|
|
674
|
+
const resolvedJson = path.resolve(jsonPath);
|
|
675
|
+
if (!fs.existsSync(resolvedMd)) {
|
|
676
|
+
console.log(chalk_1.default.red(` file not found: ${resolvedMd}`));
|
|
677
|
+
process.exit(1);
|
|
678
|
+
}
|
|
679
|
+
if (!fs.existsSync(resolvedJson)) {
|
|
680
|
+
console.log(chalk_1.default.red(` file not found: ${resolvedJson}`));
|
|
681
|
+
process.exit(1);
|
|
682
|
+
}
|
|
683
|
+
const mdContent = fs.readFileSync(resolvedMd, "utf-8");
|
|
684
|
+
const jsonContent = fs.readFileSync(resolvedJson, "utf-8");
|
|
685
|
+
// Prompt for passphrase to decrypt vault key
|
|
686
|
+
const passphrase = await promptPassphrase("vault passphrase");
|
|
687
|
+
const spinner = new render_1.BrailleSpinner("encrypting vault data");
|
|
688
|
+
spinner.start();
|
|
689
|
+
// Load and decrypt vault key
|
|
690
|
+
const wrapped = (0, vault_1.loadVaultKey)();
|
|
691
|
+
if (!wrapped) {
|
|
692
|
+
spinner.fail("vault key file missing");
|
|
693
|
+
process.exit(1);
|
|
694
|
+
}
|
|
695
|
+
let vaultKey;
|
|
696
|
+
try {
|
|
697
|
+
vaultKey = (0, vault_1.decryptVaultKey)(wrapped.encrypted, passphrase, wrapped.salt, wrapped.iv);
|
|
698
|
+
}
|
|
699
|
+
catch {
|
|
700
|
+
spinner.fail("wrong passphrase");
|
|
701
|
+
process.exit(1);
|
|
702
|
+
}
|
|
703
|
+
// Encrypt the data
|
|
704
|
+
const encMd = (0, vault_1.encryptData)(mdContent, vaultKey);
|
|
705
|
+
const encJson = (0, vault_1.encryptData)(jsonContent, vaultKey);
|
|
706
|
+
// Push to server
|
|
707
|
+
const res = await (0, api_1.saveVaultData)({
|
|
708
|
+
encryptedMd: (0, vault_1.toBase64)(encMd.ciphertext),
|
|
709
|
+
encryptedJson: (0, vault_1.toBase64)(encJson.ciphertext),
|
|
710
|
+
// We store both IVs concatenated: first 12 bytes for md, next 12 for json
|
|
711
|
+
iv: (0, vault_1.toBase64)(new Uint8Array([...encMd.iv, ...encJson.iv])),
|
|
712
|
+
});
|
|
713
|
+
if (!res.ok) {
|
|
714
|
+
spinner.fail("failed to save vault data");
|
|
715
|
+
console.log(chalk_1.default.red(` ${JSON.stringify(res.data)}`));
|
|
716
|
+
process.exit(1);
|
|
717
|
+
}
|
|
718
|
+
spinner.stop();
|
|
719
|
+
console.log(chalk_1.default.green(" vault data encrypted and saved."));
|
|
720
|
+
console.log(chalk_1.default.dim(` md: ${mdContent.length} chars -> ${encMd.ciphertext.length} bytes encrypted`));
|
|
721
|
+
console.log(chalk_1.default.dim(` json: ${jsonContent.length} chars -> ${encJson.ciphertext.length} bytes encrypted`));
|
|
722
|
+
}
|
|
723
|
+
async function vaultRead() {
|
|
724
|
+
if (!(0, vault_1.isVaultInitialized)()) {
|
|
725
|
+
console.log(chalk_1.default.red(" vault not initialized. run `youmd private vault init` first."));
|
|
726
|
+
process.exit(1);
|
|
727
|
+
}
|
|
728
|
+
// Prompt for passphrase
|
|
729
|
+
const passphrase = await promptPassphrase("vault passphrase");
|
|
730
|
+
const spinner = new render_1.BrailleSpinner("fetching vault data");
|
|
731
|
+
spinner.start();
|
|
732
|
+
// Load and decrypt vault key
|
|
733
|
+
const wrapped = (0, vault_1.loadVaultKey)();
|
|
734
|
+
if (!wrapped) {
|
|
735
|
+
spinner.fail("vault key file missing");
|
|
736
|
+
process.exit(1);
|
|
737
|
+
}
|
|
738
|
+
let vaultKey;
|
|
739
|
+
try {
|
|
740
|
+
vaultKey = (0, vault_1.decryptVaultKey)(wrapped.encrypted, passphrase, wrapped.salt, wrapped.iv);
|
|
741
|
+
}
|
|
742
|
+
catch {
|
|
743
|
+
spinner.fail("wrong passphrase");
|
|
744
|
+
process.exit(1);
|
|
745
|
+
}
|
|
746
|
+
// Fetch encrypted data from server
|
|
747
|
+
const res = await (0, api_1.getVaultData)();
|
|
748
|
+
if (!res.ok) {
|
|
749
|
+
spinner.fail("failed to fetch vault data");
|
|
750
|
+
process.exit(1);
|
|
751
|
+
}
|
|
752
|
+
const data = res.data;
|
|
753
|
+
if (!data.initialized || !data.encryptedMd || !data.iv) {
|
|
754
|
+
spinner.stop();
|
|
755
|
+
console.log(chalk_1.default.dim(" vault is empty. use `youmd private vault save` to add data."));
|
|
756
|
+
return;
|
|
757
|
+
}
|
|
758
|
+
// Parse the combined IV (12 bytes md + 12 bytes json)
|
|
759
|
+
const combinedIv = (0, vault_1.fromBase64)(data.iv);
|
|
760
|
+
const mdIv = combinedIv.slice(0, 12);
|
|
761
|
+
const jsonIv = combinedIv.slice(12, 24);
|
|
762
|
+
try {
|
|
763
|
+
const mdPlain = (0, vault_1.decryptData)((0, vault_1.fromBase64)(data.encryptedMd), mdIv, vaultKey);
|
|
764
|
+
spinner.stop();
|
|
765
|
+
console.log(ACCENT(" vault markdown:"));
|
|
766
|
+
for (const line of mdPlain.split("\n")) {
|
|
767
|
+
console.log(chalk_1.default.white(` ${line}`));
|
|
768
|
+
}
|
|
769
|
+
console.log();
|
|
770
|
+
if (data.encryptedJson) {
|
|
771
|
+
const jsonPlain = (0, vault_1.decryptData)((0, vault_1.fromBase64)(data.encryptedJson), jsonIv, vaultKey);
|
|
772
|
+
console.log(ACCENT(" vault json:"));
|
|
773
|
+
// Pretty-print JSON
|
|
774
|
+
try {
|
|
775
|
+
const parsed = JSON.parse(jsonPlain);
|
|
776
|
+
for (const line of JSON.stringify(parsed, null, 2).split("\n")) {
|
|
777
|
+
console.log(chalk_1.default.white(` ${line}`));
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
catch {
|
|
781
|
+
// Not valid JSON, just print raw
|
|
782
|
+
for (const line of jsonPlain.split("\n")) {
|
|
783
|
+
console.log(chalk_1.default.white(` ${line}`));
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
catch {
|
|
789
|
+
spinner.fail("decryption failed — data may be corrupted");
|
|
790
|
+
process.exit(1);
|
|
791
|
+
}
|
|
792
|
+
}
|
|
545
793
|
// ── Helpers ───────────────────────────────────────────────────
|
|
546
794
|
function readStdin() {
|
|
547
795
|
return new Promise((resolve) => {
|