youmd 0.6.13 → 0.6.21
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/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +595 -96
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/skill.js +2 -2
- package/dist/commands/skill.js.map +1 -1
- package/dist/index.js +79 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/ascii.d.ts +5 -0
- package/dist/lib/ascii.d.ts.map +1 -1
- package/dist/lib/ascii.js +34 -2
- package/dist/lib/ascii.js.map +1 -1
- package/dist/lib/first-run.d.ts +14 -0
- package/dist/lib/first-run.d.ts.map +1 -0
- package/dist/lib/first-run.js +97 -0
- package/dist/lib/first-run.js.map +1 -0
- package/dist/lib/onboarding.js +1 -1
- package/dist/lib/onboarding.js.map +1 -1
- package/dist/lib/project.d.ts +2 -0
- package/dist/lib/project.d.ts.map +1 -1
- package/dist/lib/project.js +173 -22
- package/dist/lib/project.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/you.js +1 -1
- package/dist/you.js.map +1 -1
- package/package.json +1 -1
- package/dist/__tests__/api.test.d.ts +0 -2
- package/dist/__tests__/api.test.d.ts.map +0 -1
- package/dist/__tests__/api.test.js +0 -84
- package/dist/__tests__/api.test.js.map +0 -1
- package/dist/__tests__/compiler.test.d.ts +0 -2
- package/dist/__tests__/compiler.test.d.ts.map +0 -1
- package/dist/__tests__/compiler.test.js +0 -127
- package/dist/__tests__/compiler.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -79
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/decompile.test.d.ts +0 -2
- package/dist/__tests__/decompile.test.d.ts.map +0 -1
- package/dist/__tests__/decompile.test.js +0 -102
- package/dist/__tests__/decompile.test.js.map +0 -1
- package/dist/__tests__/hash.test.d.ts +0 -2
- package/dist/__tests__/hash.test.d.ts.map +0 -1
- package/dist/__tests__/hash.test.js +0 -44
- package/dist/__tests__/hash.test.js.map +0 -1
- package/dist/__tests__/integration.test.d.ts +0 -2
- package/dist/__tests__/integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration.test.js +0 -277
- package/dist/__tests__/integration.test.js.map +0 -1
- package/dist/__tests__/skill-renderer.test.d.ts +0 -2
- package/dist/__tests__/skill-renderer.test.d.ts.map +0 -1
- package/dist/__tests__/skill-renderer.test.js +0 -68
- package/dist/__tests__/skill-renderer.test.js.map +0 -1
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const hash_1 = require("../lib/hash");
|
|
5
|
-
(0, vitest_1.describe)("hash", () => {
|
|
6
|
-
(0, vitest_1.describe)("computeContentHash", () => {
|
|
7
|
-
(0, vitest_1.it)("returns a 64-char hex string (SHA-256)", () => {
|
|
8
|
-
const hash = (0, hash_1.computeContentHash)({ test: true }, "# test");
|
|
9
|
-
(0, vitest_1.expect)(hash).toMatch(/^[0-9a-f]{64}$/);
|
|
10
|
-
});
|
|
11
|
-
(0, vitest_1.it)("is deterministic — same input produces same hash", () => {
|
|
12
|
-
const a = (0, hash_1.computeContentHash)({ x: 1, y: "hello" }, "markdown");
|
|
13
|
-
const b = (0, hash_1.computeContentHash)({ x: 1, y: "hello" }, "markdown");
|
|
14
|
-
(0, vitest_1.expect)(a).toBe(b);
|
|
15
|
-
});
|
|
16
|
-
(0, vitest_1.it)("is order-independent for object keys", () => {
|
|
17
|
-
const a = (0, hash_1.computeContentHash)({ z: 1, a: 2 }, "md");
|
|
18
|
-
const b = (0, hash_1.computeContentHash)({ a: 2, z: 1 }, "md");
|
|
19
|
-
(0, vitest_1.expect)(a).toBe(b);
|
|
20
|
-
});
|
|
21
|
-
(0, vitest_1.it)("is sensitive to JSON changes", () => {
|
|
22
|
-
const a = (0, hash_1.computeContentHash)({ x: 1 }, "same");
|
|
23
|
-
const b = (0, hash_1.computeContentHash)({ x: 2 }, "same");
|
|
24
|
-
(0, vitest_1.expect)(a).not.toBe(b);
|
|
25
|
-
});
|
|
26
|
-
(0, vitest_1.it)("is sensitive to markdown changes", () => {
|
|
27
|
-
const a = (0, hash_1.computeContentHash)({ x: 1 }, "hello");
|
|
28
|
-
const b = (0, hash_1.computeContentHash)({ x: 1 }, "hello world");
|
|
29
|
-
(0, vitest_1.expect)(a).not.toBe(b);
|
|
30
|
-
});
|
|
31
|
-
(0, vitest_1.it)("handles empty objects", () => {
|
|
32
|
-
const hash = (0, hash_1.computeContentHash)({}, "");
|
|
33
|
-
(0, vitest_1.expect)(hash).toMatch(/^[0-9a-f]{64}$/);
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
(0, vitest_1.describe)("shortHash", () => {
|
|
37
|
-
(0, vitest_1.it)("returns first 12 characters", () => {
|
|
38
|
-
const hash = "abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890";
|
|
39
|
-
(0, vitest_1.expect)((0, hash_1.shortHash)(hash)).toBe("abcdef123456");
|
|
40
|
-
(0, vitest_1.expect)((0, hash_1.shortHash)(hash)).toHaveLength(12);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
//# sourceMappingURL=hash.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hash.test.js","sourceRoot":"","sources":["../../src/__tests__/hash.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,277 +0,0 @@
|
|
|
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
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
const vitest_1 = require("vitest");
|
|
37
|
-
const fs = __importStar(require("fs"));
|
|
38
|
-
const path = __importStar(require("path"));
|
|
39
|
-
const os = __importStar(require("os"));
|
|
40
|
-
const compiler_1 = require("../lib/compiler");
|
|
41
|
-
const hash_1 = require("../lib/hash");
|
|
42
|
-
(0, vitest_1.describe)("integration: bundle round-trip", () => {
|
|
43
|
-
let tmpDir;
|
|
44
|
-
(0, vitest_1.beforeEach)(() => {
|
|
45
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "youmd-integration-"));
|
|
46
|
-
// Create a realistic bundle structure
|
|
47
|
-
for (const dir of ["profile", "preferences", "voice", "directives"]) {
|
|
48
|
-
fs.mkdirSync(path.join(tmpDir, dir), { recursive: true });
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
(0, vitest_1.afterEach)(() => {
|
|
52
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
53
|
-
});
|
|
54
|
-
(0, vitest_1.it)("full compile → write → re-read produces consistent hash", () => {
|
|
55
|
-
// Write realistic profile data
|
|
56
|
-
fs.writeFileSync(path.join(tmpDir, "profile", "about.md"), `---
|
|
57
|
-
title: About
|
|
58
|
-
---
|
|
59
|
-
# Test User
|
|
60
|
-
|
|
61
|
-
**Tagline:** Building something cool
|
|
62
|
-
|
|
63
|
-
**Location:** Austin, TX
|
|
64
|
-
|
|
65
|
-
Serial entrepreneur and developer. Building dev tools.`);
|
|
66
|
-
fs.writeFileSync(path.join(tmpDir, "profile", "projects.md"), `---
|
|
67
|
-
title: Projects
|
|
68
|
-
---
|
|
69
|
-
## Project Alpha
|
|
70
|
-
- **Role:** Founder
|
|
71
|
-
- **Status:** building
|
|
72
|
-
- **Description:** An amazing project.
|
|
73
|
-
- **URL:** https://alpha.dev
|
|
74
|
-
|
|
75
|
-
## Project Beta
|
|
76
|
-
- **Role:** Contributor
|
|
77
|
-
- **Status:** active
|
|
78
|
-
- **Description:** Open source contribution.`);
|
|
79
|
-
fs.writeFileSync(path.join(tmpDir, "profile", "values.md"), `---
|
|
80
|
-
title: Values
|
|
81
|
-
---
|
|
82
|
-
- Ship fast
|
|
83
|
-
- Build in public
|
|
84
|
-
- Help others grow`);
|
|
85
|
-
fs.writeFileSync(path.join(tmpDir, "preferences", "agent.md"), `---
|
|
86
|
-
title: Agent Preferences
|
|
87
|
-
---
|
|
88
|
-
**Tone:** direct, no fluff
|
|
89
|
-
**Formality:** casual-professional
|
|
90
|
-
**Avoid:** corporate speak, emoji, verbose explanations`);
|
|
91
|
-
fs.writeFileSync(path.join(tmpDir, "voice", "voice.md"), `---
|
|
92
|
-
title: Voice
|
|
93
|
-
---
|
|
94
|
-
Direct, builder energy. Short sentences. Technical but approachable.`);
|
|
95
|
-
// Compile
|
|
96
|
-
const result = (0, compiler_1.compileBundle)(tmpDir);
|
|
97
|
-
// Verify structure
|
|
98
|
-
(0, vitest_1.expect)(result.youJson.schema).toBe("you-md/v1");
|
|
99
|
-
(0, vitest_1.expect)(result.youJson.identity).toBeDefined();
|
|
100
|
-
(0, vitest_1.expect)(result.youJson.identity.name).toBe("Test User");
|
|
101
|
-
(0, vitest_1.expect)(result.youJson.projects).toBeDefined();
|
|
102
|
-
(0, vitest_1.expect)(result.youJson.projects.length).toBe(2);
|
|
103
|
-
(0, vitest_1.expect)(result.youJson.values).toBeDefined();
|
|
104
|
-
(0, vitest_1.expect)(result.youJson.preferences).toBeDefined();
|
|
105
|
-
// Verify markdown output
|
|
106
|
-
(0, vitest_1.expect)(result.markdown).toContain("Test User");
|
|
107
|
-
(0, vitest_1.expect)(result.markdown).toContain("you-md/v1");
|
|
108
|
-
// Write to disk
|
|
109
|
-
(0, compiler_1.writeBundle)(tmpDir, result);
|
|
110
|
-
// Verify files exist
|
|
111
|
-
(0, vitest_1.expect)(fs.existsSync(path.join(tmpDir, "you.json"))).toBe(true);
|
|
112
|
-
(0, vitest_1.expect)(fs.existsSync(path.join(tmpDir, "you.md"))).toBe(true);
|
|
113
|
-
(0, vitest_1.expect)(fs.existsSync(path.join(tmpDir, "manifest.json"))).toBe(true);
|
|
114
|
-
// Re-read and verify JSON round-trip
|
|
115
|
-
const reReadJson = JSON.parse(fs.readFileSync(path.join(tmpDir, "you.json"), "utf-8"));
|
|
116
|
-
(0, vitest_1.expect)(reReadJson.schema).toBe("you-md/v1");
|
|
117
|
-
(0, vitest_1.expect)(reReadJson.identity.name).toBe("Test User");
|
|
118
|
-
// Verify hash is deterministic
|
|
119
|
-
const hash1 = (0, hash_1.computeContentHash)(result.youJson, result.markdown);
|
|
120
|
-
const hash2 = (0, hash_1.computeContentHash)(reReadJson, fs.readFileSync(path.join(tmpDir, "you.md"), "utf-8"));
|
|
121
|
-
(0, vitest_1.expect)(hash1).toBe(hash2);
|
|
122
|
-
});
|
|
123
|
-
(0, vitest_1.it)("compile → decompile → recompile produces equivalent bundle", async () => {
|
|
124
|
-
// Write a profile
|
|
125
|
-
fs.writeFileSync(path.join(tmpDir, "profile", "about.md"), `---
|
|
126
|
-
title: About
|
|
127
|
-
---
|
|
128
|
-
# Round Trip Test
|
|
129
|
-
|
|
130
|
-
**Tagline:** Testing round trips
|
|
131
|
-
|
|
132
|
-
**Location:** Nowhere
|
|
133
|
-
|
|
134
|
-
A test bio.`);
|
|
135
|
-
fs.writeFileSync(path.join(tmpDir, "profile", "values.md"), `- Value One\n- Value Two`);
|
|
136
|
-
// Compile first
|
|
137
|
-
const first = (0, compiler_1.compileBundle)(tmpDir);
|
|
138
|
-
(0, compiler_1.writeBundle)(tmpDir, first);
|
|
139
|
-
// Decompile (simulated: read you.json, write back to files)
|
|
140
|
-
const { decompileToFilesystem } = await Promise.resolve().then(() => __importStar(require("../lib/decompile")));
|
|
141
|
-
const youJson = JSON.parse(fs.readFileSync(path.join(tmpDir, "you.json"), "utf-8"));
|
|
142
|
-
// Create a fresh dir for decompilation
|
|
143
|
-
const decompDir = fs.mkdtempSync(path.join(os.tmpdir(), "youmd-decomp-"));
|
|
144
|
-
for (const dir of ["profile", "preferences", "voice", "directives"]) {
|
|
145
|
-
fs.mkdirSync(path.join(decompDir, dir), { recursive: true });
|
|
146
|
-
}
|
|
147
|
-
decompileToFilesystem(decompDir, youJson);
|
|
148
|
-
// Verify decompiled files exist
|
|
149
|
-
(0, vitest_1.expect)(fs.existsSync(path.join(decompDir, "profile", "about.md"))).toBe(true);
|
|
150
|
-
// Recompile from decompiled
|
|
151
|
-
const second = (0, compiler_1.compileBundle)(decompDir);
|
|
152
|
-
// Core identity should survive round-trip
|
|
153
|
-
const id1 = first.youJson.identity;
|
|
154
|
-
const id2 = second.youJson.identity;
|
|
155
|
-
(0, vitest_1.expect)(id2.name).toBe(id1.name);
|
|
156
|
-
// Clean up
|
|
157
|
-
fs.rmSync(decompDir, { recursive: true, force: true });
|
|
158
|
-
});
|
|
159
|
-
});
|
|
160
|
-
(0, vitest_1.describe)("integration: vault encryption round-trip", () => {
|
|
161
|
-
(0, vitest_1.it)("encrypt → decrypt produces original data", async () => {
|
|
162
|
-
const { generateVaultKey, encryptData, decryptData } = await Promise.resolve().then(() => __importStar(require("../lib/vault")));
|
|
163
|
-
const vaultKey = generateVaultKey();
|
|
164
|
-
const original = "this is my private vault data with sensitive info";
|
|
165
|
-
const { ciphertext, iv } = encryptData(original, vaultKey);
|
|
166
|
-
const decrypted = decryptData(ciphertext, iv, vaultKey);
|
|
167
|
-
(0, vitest_1.expect)(decrypted).toBe(original);
|
|
168
|
-
});
|
|
169
|
-
(0, vitest_1.it)("vault key wrap → unwrap produces original key", async () => {
|
|
170
|
-
const { generateVaultKey, encryptVaultKey, decryptVaultKey } = await Promise.resolve().then(() => __importStar(require("../lib/vault")));
|
|
171
|
-
const vaultKey = generateVaultKey();
|
|
172
|
-
const passphrase = "my-secret-passphrase-123";
|
|
173
|
-
const wrapped = encryptVaultKey(vaultKey, passphrase);
|
|
174
|
-
const unwrapped = decryptVaultKey(wrapped.encrypted, passphrase, wrapped.salt, wrapped.iv);
|
|
175
|
-
(0, vitest_1.expect)(Buffer.from(unwrapped).equals(Buffer.from(vaultKey))).toBe(true);
|
|
176
|
-
});
|
|
177
|
-
(0, vitest_1.it)("wrong passphrase fails to decrypt", async () => {
|
|
178
|
-
const { generateVaultKey, encryptVaultKey, decryptVaultKey } = await Promise.resolve().then(() => __importStar(require("../lib/vault")));
|
|
179
|
-
const vaultKey = generateVaultKey();
|
|
180
|
-
const wrapped = encryptVaultKey(vaultKey, "correct-password");
|
|
181
|
-
(0, vitest_1.expect)(() => {
|
|
182
|
-
decryptVaultKey(wrapped.encrypted, "wrong-password", wrapped.salt, wrapped.iv);
|
|
183
|
-
}).toThrow();
|
|
184
|
-
});
|
|
185
|
-
(0, vitest_1.it)("handles unicode and long text", async () => {
|
|
186
|
-
const { generateVaultKey, encryptData, decryptData } = await Promise.resolve().then(() => __importStar(require("../lib/vault")));
|
|
187
|
-
const vaultKey = generateVaultKey();
|
|
188
|
-
const original = "Unicode test: Hello World\n" + "A".repeat(10000);
|
|
189
|
-
const { ciphertext, iv } = encryptData(original, vaultKey);
|
|
190
|
-
const decrypted = decryptData(ciphertext, iv, vaultKey);
|
|
191
|
-
(0, vitest_1.expect)(decrypted).toBe(original);
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
(0, vitest_1.describe)("integration: API endpoint contract", () => {
|
|
195
|
-
async function getLivePublicUsernames(limit = 3) {
|
|
196
|
-
const res = await fetch("https://kindly-cassowary-600.convex.site/api/v1/profiles", { signal: AbortSignal.timeout(10000) });
|
|
197
|
-
(0, vitest_1.expect)(res.ok).toBe(true);
|
|
198
|
-
const data = await res.json();
|
|
199
|
-
const candidates = data
|
|
200
|
-
.map((entry) => entry.username)
|
|
201
|
-
.filter((username) => Boolean(username))
|
|
202
|
-
.slice(0, 20);
|
|
203
|
-
const confirmed = [];
|
|
204
|
-
for (const username of candidates) {
|
|
205
|
-
const profileRes = await fetch(`https://kindly-cassowary-600.convex.site/api/v1/profiles?username=${username}`, { signal: AbortSignal.timeout(10000) });
|
|
206
|
-
if (profileRes.ok) {
|
|
207
|
-
confirmed.push(username);
|
|
208
|
-
}
|
|
209
|
-
if (confirmed.length >= limit) {
|
|
210
|
-
break;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return confirmed;
|
|
214
|
-
}
|
|
215
|
-
(0, vitest_1.it)("profile endpoint returns you-md/v1 schema", async () => {
|
|
216
|
-
const res = await fetch("https://kindly-cassowary-600.convex.site/api/v1/profiles?username=houstongolden", { signal: AbortSignal.timeout(10000) });
|
|
217
|
-
(0, vitest_1.expect)(res.ok).toBe(true);
|
|
218
|
-
const data = await res.json();
|
|
219
|
-
(0, vitest_1.expect)(data.schema).toBe("you-md/v1");
|
|
220
|
-
(0, vitest_1.expect)(data.identity).toBeDefined();
|
|
221
|
-
(0, vitest_1.expect)(data.preferences).toBeDefined();
|
|
222
|
-
});
|
|
223
|
-
(0, vitest_1.it)("profile text endpoint returns non-empty plain text for a known public profile", async () => {
|
|
224
|
-
const res = await fetch("https://kindly-cassowary-600.convex.site/api/v1/profiles?username=houstongolden", {
|
|
225
|
-
headers: { Accept: "text/plain" },
|
|
226
|
-
signal: AbortSignal.timeout(10000),
|
|
227
|
-
});
|
|
228
|
-
(0, vitest_1.expect)(res.ok).toBe(true);
|
|
229
|
-
const text = await res.text();
|
|
230
|
-
// Should contain identity data in some format (markdown frontmatter or JSON)
|
|
231
|
-
(0, vitest_1.expect)(text.trim().length).toBeGreaterThan(20);
|
|
232
|
-
});
|
|
233
|
-
(0, vitest_1.it)("profile list returns array of profiles", async () => {
|
|
234
|
-
const res = await fetch("https://kindly-cassowary-600.convex.site/api/v1/profiles", { signal: AbortSignal.timeout(10000) });
|
|
235
|
-
(0, vitest_1.expect)(res.ok).toBe(true);
|
|
236
|
-
const data = await res.json();
|
|
237
|
-
(0, vitest_1.expect)(Array.isArray(data)).toBe(true);
|
|
238
|
-
(0, vitest_1.expect)(data.length).toBeGreaterThan(0);
|
|
239
|
-
});
|
|
240
|
-
(0, vitest_1.it)("auth endpoints properly gate without token", async () => {
|
|
241
|
-
const res = await fetch("https://kindly-cassowary-600.convex.site/api/v1/me", { signal: AbortSignal.timeout(10000) });
|
|
242
|
-
(0, vitest_1.expect)(res.status).toBe(401);
|
|
243
|
-
});
|
|
244
|
-
(0, vitest_1.it)("skills registry returns published skills", async () => {
|
|
245
|
-
const res = await fetch("https://kindly-cassowary-600.convex.site/api/v1/skills", { signal: AbortSignal.timeout(10000) });
|
|
246
|
-
(0, vitest_1.expect)(res.ok).toBe(true);
|
|
247
|
-
const data = await res.json();
|
|
248
|
-
const skills = data.skills;
|
|
249
|
-
(0, vitest_1.expect)(skills.length).toBeGreaterThanOrEqual(4);
|
|
250
|
-
});
|
|
251
|
-
(0, vitest_1.it)("CORS headers present on OPTIONS", async () => {
|
|
252
|
-
const res = await fetch("https://kindly-cassowary-600.convex.site/api/v1/profiles", {
|
|
253
|
-
method: "OPTIONS",
|
|
254
|
-
signal: AbortSignal.timeout(10000),
|
|
255
|
-
});
|
|
256
|
-
(0, vitest_1.expect)(res.headers.get("access-control-allow-origin")).toBe("*");
|
|
257
|
-
});
|
|
258
|
-
(0, vitest_1.it)("public profiles expose usable identity data", async () => {
|
|
259
|
-
const usernames = await getLivePublicUsernames(3);
|
|
260
|
-
(0, vitest_1.expect)(usernames.length).toBeGreaterThan(0);
|
|
261
|
-
for (const username of usernames) {
|
|
262
|
-
const res = await fetch(`https://kindly-cassowary-600.convex.site/api/v1/profiles?username=${username}`, { signal: AbortSignal.timeout(10000) });
|
|
263
|
-
(0, vitest_1.expect)(res.ok).toBe(true);
|
|
264
|
-
const data = await res.json();
|
|
265
|
-
const identity = data.identity;
|
|
266
|
-
(0, vitest_1.expect)(identity).toBeDefined();
|
|
267
|
-
const bio = identity.bio;
|
|
268
|
-
(0, vitest_1.expect)(Boolean(identity.name) ||
|
|
269
|
-
Boolean(identity.tagline) ||
|
|
270
|
-
Boolean(bio?.short) ||
|
|
271
|
-
Boolean(bio?.medium)).toBe(true);
|
|
272
|
-
const projects = data.projects;
|
|
273
|
-
(0, vitest_1.expect)(Array.isArray(projects)).toBe(true);
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
//# sourceMappingURL=integration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../src/__tests__/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skill-renderer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/skill-renderer.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const skill_renderer_1 = require("../lib/skill-renderer");
|
|
5
|
-
(0, vitest_1.describe)("skill-renderer", () => {
|
|
6
|
-
const mockIdentity = {
|
|
7
|
-
profile: {
|
|
8
|
-
about: "Houston Golden. Founder of You.md.",
|
|
9
|
-
projects: "You.md, BAMF Media",
|
|
10
|
-
now: "Building identity protocol",
|
|
11
|
-
values: "Ship fast, build in public",
|
|
12
|
-
links: "https://you.md",
|
|
13
|
-
},
|
|
14
|
-
preferences: {
|
|
15
|
-
agent: "Direct, no fluff, terminal-native",
|
|
16
|
-
writing: "Short paragraphs, punchy sentences",
|
|
17
|
-
},
|
|
18
|
-
voice: {
|
|
19
|
-
overall: "Direct, high-energy, founder-coded",
|
|
20
|
-
writing: "Concise and opinionated",
|
|
21
|
-
},
|
|
22
|
-
directives: {
|
|
23
|
-
agent: "No emoji. No forms. No corporate speak.",
|
|
24
|
-
},
|
|
25
|
-
project_name: "youmd",
|
|
26
|
-
username: "houstongolden",
|
|
27
|
-
};
|
|
28
|
-
(0, vitest_1.describe)("renderSkillTemplate", () => {
|
|
29
|
-
(0, vitest_1.it)("interpolates {{var}} placeholders", () => {
|
|
30
|
-
const template = "Hello {{username}}, your voice is: {{voice.overall}}";
|
|
31
|
-
const result = (0, skill_renderer_1.renderSkillTemplate)(template, mockIdentity);
|
|
32
|
-
(0, vitest_1.expect)(result).toContain("houstongolden");
|
|
33
|
-
(0, vitest_1.expect)(result).toContain("Direct, high-energy");
|
|
34
|
-
});
|
|
35
|
-
(0, vitest_1.it)("preserves text without placeholders", () => {
|
|
36
|
-
const template = "No variables here, just text.";
|
|
37
|
-
const result = (0, skill_renderer_1.renderSkillTemplate)(template, mockIdentity);
|
|
38
|
-
(0, vitest_1.expect)(result).toBe("No variables here, just text.");
|
|
39
|
-
});
|
|
40
|
-
(0, vitest_1.it)("handles missing variables gracefully", () => {
|
|
41
|
-
const template = "Name: {{profile.about}}, Missing: {{nonexistent.field}}";
|
|
42
|
-
const result = (0, skill_renderer_1.renderSkillTemplate)(template, mockIdentity);
|
|
43
|
-
(0, vitest_1.expect)(result).toContain("Houston Golden");
|
|
44
|
-
// Missing vars should remain as placeholder or empty
|
|
45
|
-
(0, vitest_1.expect)(result).toBeDefined();
|
|
46
|
-
});
|
|
47
|
-
(0, vitest_1.it)("handles nested dot notation", () => {
|
|
48
|
-
const template = "Prefs: {{preferences.agent}}";
|
|
49
|
-
const result = (0, skill_renderer_1.renderSkillTemplate)(template, mockIdentity);
|
|
50
|
-
(0, vitest_1.expect)(result).toContain("Direct, no fluff");
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
(0, vitest_1.describe)("checkTemplateReadiness", () => {
|
|
54
|
-
(0, vitest_1.it)("reports all filled when identity is complete", () => {
|
|
55
|
-
const template = "{{profile.about}} {{voice.overall}} {{username}}";
|
|
56
|
-
const readiness = (0, skill_renderer_1.checkTemplateReadiness)(template, mockIdentity);
|
|
57
|
-
(0, vitest_1.expect)(readiness.total).toBe(3);
|
|
58
|
-
(0, vitest_1.expect)(readiness.filled).toBe(3);
|
|
59
|
-
(0, vitest_1.expect)(readiness.missing).toHaveLength(0);
|
|
60
|
-
});
|
|
61
|
-
(0, vitest_1.it)("reports missing fields", () => {
|
|
62
|
-
const template = "{{profile.about}} {{nonexistent.thing}}";
|
|
63
|
-
const readiness = (0, skill_renderer_1.checkTemplateReadiness)(template, mockIdentity);
|
|
64
|
-
(0, vitest_1.expect)(readiness.missing.length).toBeGreaterThan(0);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
//# sourceMappingURL=skill-renderer.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skill-renderer.test.js","sourceRoot":"","sources":["../../src/__tests__/skill-renderer.test.ts"],"names":[],"mappings":"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"}
|