youmd 0.4.9 → 0.6.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.
- 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 +96 -21
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +110 -11
- 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 +138 -0
- 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 +77 -13
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +48 -27
- 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 +69 -6
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +110 -137
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.d.ts +1 -0
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +236 -38
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +40 -84
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/skill.d.ts +8 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +1226 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +221 -69
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +12 -0
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +62 -33
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.js +187 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +169 -12
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +183 -33
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/ascii.d.ts.map +1 -1
- package/dist/lib/ascii.js +20 -48
- package/dist/lib/ascii.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 +27 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +50 -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/hash.d.ts +3 -0
- package/dist/lib/hash.d.ts.map +1 -0
- package/dist/lib/hash.js +31 -0
- package/dist/lib/hash.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 +228 -81
- package/dist/lib/onboarding.js.map +1 -1
- package/dist/lib/skill-catalog.d.ts +57 -0
- package/dist/lib/skill-catalog.d.ts.map +1 -0
- package/dist/lib/skill-catalog.js +245 -0
- package/dist/lib/skill-catalog.js.map +1 -0
- package/dist/lib/skill-renderer.d.ts +55 -0
- package/dist/lib/skill-renderer.d.ts.map +1 -0
- package/dist/lib/skill-renderer.js +382 -0
- package/dist/lib/skill-renderer.js.map +1 -0
- package/dist/lib/skills.d.ts +130 -0
- package/dist/lib/skills.d.ts.map +1 -0
- package/dist/lib/skills.js +876 -0
- package/dist/lib/skills.js.map +1 -0
- 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 +15 -6
- package/skills/claude-md-generator.md +91 -0
- package/skills/meta-improve.md +84 -0
- package/skills/proactive-context-fill.md +52 -0
- package/skills/project-context-init.md +77 -0
- package/skills/voice-sync.md +89 -0
- package/skills/you-logs.md +71 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Skill renderer — identity-aware template interpolation.
|
|
4
|
+
*
|
|
5
|
+
* Resolves {{var}} template variables in skill markdown against
|
|
6
|
+
* the user's live identity context data.
|
|
7
|
+
*
|
|
8
|
+
* Variable paths use dot notation:
|
|
9
|
+
* {{voice.overall}} → preferences/voice.md or profile section
|
|
10
|
+
* {{preferences.agent}} → preferences/agent.md content
|
|
11
|
+
* {{directives.agent}} → preferences/directives.md or agent section
|
|
12
|
+
* {{profile.about}} → profile/about.md content
|
|
13
|
+
* {{project_name}} → detected project name
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
32
|
+
var ownKeys = function(o) {
|
|
33
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
34
|
+
var ar = [];
|
|
35
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
36
|
+
return ar;
|
|
37
|
+
};
|
|
38
|
+
return ownKeys(o);
|
|
39
|
+
};
|
|
40
|
+
return function (mod) {
|
|
41
|
+
if (mod && mod.__esModule) return mod;
|
|
42
|
+
var result = {};
|
|
43
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
44
|
+
__setModuleDefault(result, mod);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
})();
|
|
48
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
49
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
50
|
+
};
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.loadIdentityData = loadIdentityData;
|
|
53
|
+
exports.resolveVariable = resolveVariable;
|
|
54
|
+
exports.renderSkillTemplate = renderSkillTemplate;
|
|
55
|
+
exports.extractTemplateVars = extractTemplateVars;
|
|
56
|
+
exports.checkTemplateReadiness = checkTemplateReadiness;
|
|
57
|
+
const fs = __importStar(require("fs"));
|
|
58
|
+
const path = __importStar(require("path"));
|
|
59
|
+
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
60
|
+
const config_1 = require("./config");
|
|
61
|
+
/**
|
|
62
|
+
* Load identity data from the local .youmd/ bundle.
|
|
63
|
+
* Reads profile/ and preferences/ directories, plus you.json if available.
|
|
64
|
+
*/
|
|
65
|
+
function loadIdentityData() {
|
|
66
|
+
const data = {
|
|
67
|
+
profile: {},
|
|
68
|
+
preferences: {},
|
|
69
|
+
voice: {},
|
|
70
|
+
directives: {},
|
|
71
|
+
project_name: "",
|
|
72
|
+
username: "",
|
|
73
|
+
};
|
|
74
|
+
// Try to detect project name
|
|
75
|
+
const project = (0, config_1.detectProjectContext)();
|
|
76
|
+
if (project) {
|
|
77
|
+
data.project_name = project.name;
|
|
78
|
+
}
|
|
79
|
+
if (!(0, config_1.localBundleExists)()) {
|
|
80
|
+
return data;
|
|
81
|
+
}
|
|
82
|
+
const bundleDir = (0, config_1.getLocalBundleDir)();
|
|
83
|
+
// Read username from config
|
|
84
|
+
const configPath = path.join(require("os").homedir(), ".youmd", "config.json");
|
|
85
|
+
if (fs.existsSync(configPath)) {
|
|
86
|
+
try {
|
|
87
|
+
const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
88
|
+
data.username = config.username || "";
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// skip
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Read profile sections
|
|
95
|
+
const profileDir = path.join(bundleDir, "profile");
|
|
96
|
+
if (fs.existsSync(profileDir)) {
|
|
97
|
+
for (const file of fs.readdirSync(profileDir).filter((f) => f.endsWith(".md"))) {
|
|
98
|
+
const slug = path.basename(file, ".md");
|
|
99
|
+
const raw = fs.readFileSync(path.join(profileDir, file), "utf-8");
|
|
100
|
+
const { content } = (0, gray_matter_1.default)(raw);
|
|
101
|
+
data.profile[slug] = content.trim();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Read preference sections
|
|
105
|
+
const prefsDir = path.join(bundleDir, "preferences");
|
|
106
|
+
if (fs.existsSync(prefsDir)) {
|
|
107
|
+
for (const file of fs.readdirSync(prefsDir).filter((f) => f.endsWith(".md"))) {
|
|
108
|
+
const slug = path.basename(file, ".md");
|
|
109
|
+
const raw = fs.readFileSync(path.join(prefsDir, file), "utf-8");
|
|
110
|
+
const { content } = (0, gray_matter_1.default)(raw);
|
|
111
|
+
const text = content.trim();
|
|
112
|
+
data.preferences[slug] = text;
|
|
113
|
+
// Also map to voice/directives if the slug matches
|
|
114
|
+
if (slug === "voice" || slug.startsWith("voice-")) {
|
|
115
|
+
const voiceKey = slug === "voice" ? "overall" : slug.replace("voice-", "");
|
|
116
|
+
data.voice[voiceKey] = text;
|
|
117
|
+
}
|
|
118
|
+
if (slug === "directives" || slug.startsWith("directives-")) {
|
|
119
|
+
const dirKey = slug === "directives" ? "agent" : slug.replace("directives-", "");
|
|
120
|
+
data.directives[dirKey] = text;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Read voice/ directory (pull creates voice/voice.md, voice/voice.linkedin.md, etc.)
|
|
125
|
+
const voiceDir = path.join(bundleDir, "voice");
|
|
126
|
+
if (fs.existsSync(voiceDir)) {
|
|
127
|
+
for (const file of fs.readdirSync(voiceDir).filter((f) => f.endsWith(".md"))) {
|
|
128
|
+
const raw = fs.readFileSync(path.join(voiceDir, file), "utf-8");
|
|
129
|
+
const { content } = (0, gray_matter_1.default)(raw);
|
|
130
|
+
const text = content.trim();
|
|
131
|
+
if (file === "voice.md") {
|
|
132
|
+
if (!data.voice.overall)
|
|
133
|
+
data.voice.overall = text;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
// voice.linkedin.md → voice.linkedin, voice.writing.md → voice.writing
|
|
137
|
+
const key = path.basename(file, ".md").replace("voice.", "");
|
|
138
|
+
if (!data.voice[key])
|
|
139
|
+
data.voice[key] = text;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Read from you.json — handles both compiled bundle format AND API/pull format
|
|
144
|
+
const youJsonPath = path.join(bundleDir, "you.json");
|
|
145
|
+
if (fs.existsSync(youJsonPath)) {
|
|
146
|
+
try {
|
|
147
|
+
const youJson = JSON.parse(fs.readFileSync(youJsonPath, "utf-8"));
|
|
148
|
+
extractFromYouJson(youJson, data);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// skip
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return data;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Extract identity data from a you.json object.
|
|
158
|
+
* Handles both formats:
|
|
159
|
+
* - Compiled bundle: { profile: [{slug, content}], preferences: [{slug, content}] }
|
|
160
|
+
* - API/pull format: { identity: {bio: {long}}, preferences: {agent: {tone}}, voice: {overall} }
|
|
161
|
+
*/
|
|
162
|
+
function extractFromYouJson(youJson, data) {
|
|
163
|
+
// Format 1: Compiled bundle (array-based sections)
|
|
164
|
+
if (Array.isArray(youJson.preferences)) {
|
|
165
|
+
for (const pref of youJson.preferences) {
|
|
166
|
+
if (typeof pref !== "object" || pref === null)
|
|
167
|
+
continue;
|
|
168
|
+
const p = pref;
|
|
169
|
+
if (typeof p.slug === "string" && typeof p.content === "string" && !data.preferences[p.slug]) {
|
|
170
|
+
data.preferences[p.slug] = p.content;
|
|
171
|
+
}
|
|
172
|
+
if (typeof p.slug === "string" && (p.slug === "voice" || p.slug.startsWith("voice"))) {
|
|
173
|
+
const key = p.slug === "voice" ? "overall" : p.slug.replace(/^voice[-_]?/, "");
|
|
174
|
+
if (typeof p.content === "string" && !data.voice[key])
|
|
175
|
+
data.voice[key] = p.content;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (Array.isArray(youJson.profile)) {
|
|
180
|
+
for (const section of youJson.profile) {
|
|
181
|
+
if (typeof section !== "object" || section === null)
|
|
182
|
+
continue;
|
|
183
|
+
const s = section;
|
|
184
|
+
if (typeof s.slug === "string" && typeof s.content === "string" && !data.profile[s.slug]) {
|
|
185
|
+
data.profile[s.slug] = s.content;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Format 2: API/pull nested structure
|
|
190
|
+
const identity = youJson.identity;
|
|
191
|
+
if (identity) {
|
|
192
|
+
const bio = identity.bio;
|
|
193
|
+
if (bio) {
|
|
194
|
+
const aboutText = bio.long || bio.medium || bio.short || "";
|
|
195
|
+
if (aboutText && !data.profile.about) {
|
|
196
|
+
const name = identity.name || data.username;
|
|
197
|
+
data.profile.about = name ? `# ${name}\n\n${aboutText}` : aboutText;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (identity.name && !data.profile.name) {
|
|
201
|
+
data.profile.name = identity.name;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// API preferences: { agent: { tone, formality, avoid }, writing: { style, format } }
|
|
205
|
+
const apiPrefs = youJson.preferences;
|
|
206
|
+
if (apiPrefs && !Array.isArray(apiPrefs)) {
|
|
207
|
+
if (apiPrefs.agent && typeof apiPrefs.agent === "object" && !data.preferences.agent) {
|
|
208
|
+
const agent = apiPrefs.agent;
|
|
209
|
+
const parts = [];
|
|
210
|
+
if (agent.tone)
|
|
211
|
+
parts.push(`Tone: ${agent.tone}`);
|
|
212
|
+
if (agent.formality)
|
|
213
|
+
parts.push(`Formality: ${agent.formality}`);
|
|
214
|
+
if (Array.isArray(agent.avoid) && agent.avoid.length)
|
|
215
|
+
parts.push(`Avoid: ${agent.avoid.join(", ")}`);
|
|
216
|
+
if (agent.custom_instructions)
|
|
217
|
+
parts.push(`\n${agent.custom_instructions}`);
|
|
218
|
+
if (parts.length)
|
|
219
|
+
data.preferences.agent = parts.join("\n");
|
|
220
|
+
}
|
|
221
|
+
if (apiPrefs.writing && typeof apiPrefs.writing === "object" && !data.preferences.writing) {
|
|
222
|
+
const writing = apiPrefs.writing;
|
|
223
|
+
const parts = [];
|
|
224
|
+
if (writing.style)
|
|
225
|
+
parts.push(`Style: ${writing.style}`);
|
|
226
|
+
if (writing.format)
|
|
227
|
+
parts.push(`Format: ${writing.format}`);
|
|
228
|
+
if (parts.length)
|
|
229
|
+
data.preferences.writing = parts.join("\n");
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// API voice: { overall, platforms: { linkedin, twitter } }
|
|
233
|
+
const apiVoice = youJson.voice;
|
|
234
|
+
if (apiVoice) {
|
|
235
|
+
if (typeof apiVoice.overall === "string" && !data.voice.overall) {
|
|
236
|
+
data.voice.overall = apiVoice.overall;
|
|
237
|
+
}
|
|
238
|
+
if (typeof apiVoice.writing === "string" && !data.voice.writing) {
|
|
239
|
+
data.voice.writing = apiVoice.writing;
|
|
240
|
+
}
|
|
241
|
+
if (typeof apiVoice.speaking === "string" && !data.voice.speaking) {
|
|
242
|
+
data.voice.speaking = apiVoice.speaking;
|
|
243
|
+
}
|
|
244
|
+
const platforms = apiVoice.platforms;
|
|
245
|
+
if (platforms) {
|
|
246
|
+
for (const [platform, content] of Object.entries(platforms)) {
|
|
247
|
+
if (content && !data.voice[platform]) {
|
|
248
|
+
data.voice[platform] = content;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// API analysis: { voice_summary }
|
|
254
|
+
const analysis = youJson.analysis;
|
|
255
|
+
if (analysis) {
|
|
256
|
+
if (typeof analysis.voice_summary === "string" && !data.voice.overall) {
|
|
257
|
+
data.voice.overall = analysis.voice_summary;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// API projects
|
|
261
|
+
const projects = youJson.projects;
|
|
262
|
+
if (Array.isArray(projects) && projects.length > 0 && !data.profile.projects) {
|
|
263
|
+
data.profile.projects = projects
|
|
264
|
+
.map((p) => `- **${p.name}**: ${p.description || ""} (${p.status || "active"})`)
|
|
265
|
+
.join("\n");
|
|
266
|
+
}
|
|
267
|
+
// API values
|
|
268
|
+
const values = youJson.values;
|
|
269
|
+
if (Array.isArray(values) && values.length > 0 && !data.profile.values) {
|
|
270
|
+
data.profile.values = values.map((v) => `- ${v}`).join("\n");
|
|
271
|
+
}
|
|
272
|
+
// API now/focus
|
|
273
|
+
const now = youJson.now;
|
|
274
|
+
if (now) {
|
|
275
|
+
const focus = now.focus;
|
|
276
|
+
if (Array.isArray(focus) && focus.length > 0 && !data.profile.now) {
|
|
277
|
+
data.profile.now = focus.map((f) => `- ${f}`).join("\n");
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// API directives (if stored as a top-level field)
|
|
281
|
+
const directives = youJson.directives;
|
|
282
|
+
if (directives) {
|
|
283
|
+
for (const [key, val] of Object.entries(directives)) {
|
|
284
|
+
if (val && !data.directives[key])
|
|
285
|
+
data.directives[key] = val;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// Nested format: agent_directives (underscore convention from compile.ts)
|
|
289
|
+
const agentDir = youJson.agent_directives;
|
|
290
|
+
if (agentDir && !data.directives.agent) {
|
|
291
|
+
const parts = [];
|
|
292
|
+
if (agentDir.communication_style)
|
|
293
|
+
parts.push(`Communication Style: ${agentDir.communication_style}`);
|
|
294
|
+
const negPrompts = agentDir.negative_prompts;
|
|
295
|
+
if (negPrompts?.length)
|
|
296
|
+
parts.push(`Never: ${negPrompts.join(". ")}`);
|
|
297
|
+
if (agentDir.default_stack)
|
|
298
|
+
parts.push(`Default Stack: ${agentDir.default_stack}`);
|
|
299
|
+
if (agentDir.decision_framework)
|
|
300
|
+
parts.push(`Decision Framework: ${agentDir.decision_framework}`);
|
|
301
|
+
if (agentDir.current_goal)
|
|
302
|
+
parts.push(`Current Goal: ${agentDir.current_goal}`);
|
|
303
|
+
if (parts.length > 0)
|
|
304
|
+
data.directives.agent = parts.join("\n");
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Resolve a dot-path variable against identity data.
|
|
309
|
+
*
|
|
310
|
+
* Examples:
|
|
311
|
+
* "voice.overall" → data.voice.overall
|
|
312
|
+
* "preferences.agent" → data.preferences.agent
|
|
313
|
+
* "profile.about" → data.profile.about
|
|
314
|
+
* "project_name" → data.project_name
|
|
315
|
+
* "username" → data.username
|
|
316
|
+
*/
|
|
317
|
+
function resolveVariable(varPath, data) {
|
|
318
|
+
const parts = varPath.split(".");
|
|
319
|
+
if (parts.length === 1) {
|
|
320
|
+
// Top-level: project_name, username
|
|
321
|
+
const key = parts[0];
|
|
322
|
+
const val = data[key];
|
|
323
|
+
if (typeof val === "string")
|
|
324
|
+
return val;
|
|
325
|
+
return "";
|
|
326
|
+
}
|
|
327
|
+
if (parts.length === 2) {
|
|
328
|
+
const [namespace, key] = parts;
|
|
329
|
+
const ns = data[namespace];
|
|
330
|
+
if (typeof ns === "object" && ns !== null && !Array.isArray(ns)) {
|
|
331
|
+
return ns[key] || "";
|
|
332
|
+
}
|
|
333
|
+
return "";
|
|
334
|
+
}
|
|
335
|
+
return "";
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Render a skill template by interpolating all {{var}} placeholders.
|
|
339
|
+
*/
|
|
340
|
+
function renderSkillTemplate(template, data) {
|
|
341
|
+
const identity = data || loadIdentityData();
|
|
342
|
+
return template.replace(/\{\{([^}]+)\}\}/g, (_match, varPath) => {
|
|
343
|
+
const resolved = resolveVariable(varPath.trim(), identity);
|
|
344
|
+
return resolved || `(not set: ${varPath.trim()})`;
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Extract all {{var}} references from a skill template.
|
|
349
|
+
*/
|
|
350
|
+
function extractTemplateVars(template) {
|
|
351
|
+
const vars = [];
|
|
352
|
+
const regex = /\{\{([^}]+)\}\}/g;
|
|
353
|
+
let match;
|
|
354
|
+
while ((match = regex.exec(template)) !== null) {
|
|
355
|
+
const v = match[1].trim();
|
|
356
|
+
if (!vars.includes(v)) {
|
|
357
|
+
vars.push(v);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return vars;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Check which identity fields a skill template references
|
|
364
|
+
* and which ones have actual data.
|
|
365
|
+
*/
|
|
366
|
+
function checkTemplateReadiness(template, data) {
|
|
367
|
+
const identity = data || loadIdentityData();
|
|
368
|
+
const vars = extractTemplateVars(template);
|
|
369
|
+
const missing = [];
|
|
370
|
+
for (const v of vars) {
|
|
371
|
+
const resolved = resolveVariable(v, identity);
|
|
372
|
+
if (!resolved) {
|
|
373
|
+
missing.push(v);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return {
|
|
377
|
+
total: vars.length,
|
|
378
|
+
filled: vars.length - missing.length,
|
|
379
|
+
missing,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=skill-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-renderer.js","sourceRoot":"","sources":["../../src/lib/skill-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill engine — install, remove, resolve, sync, link.
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of skills from the catalog to the filesystem.
|
|
5
|
+
* Skills are SKILL.md files with identity-aware template variables.
|
|
6
|
+
*/
|
|
7
|
+
import { checkTemplateReadiness } from "./skill-renderer";
|
|
8
|
+
/**
|
|
9
|
+
* Get the directory for an installed skill.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getSkillDir(skillName: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Get the SKILL.md path for an installed skill.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getSkillPath(skillName: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Read a skill's SKILL.md content and frontmatter.
|
|
18
|
+
*/
|
|
19
|
+
export declare function readSkillFile(skillName: string): {
|
|
20
|
+
content: string;
|
|
21
|
+
metadata: Record<string, unknown>;
|
|
22
|
+
} | null;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve a skill source to its raw markdown content.
|
|
25
|
+
*
|
|
26
|
+
* Supported sources:
|
|
27
|
+
* bundled:path/to/file.md — relative to repo root
|
|
28
|
+
* local:/absolute/path.md — local filesystem
|
|
29
|
+
* github:owner/repo/path — (future) GitHub raw content
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveSkillSource(source: string): string | null;
|
|
32
|
+
/**
|
|
33
|
+
* Async source resolver — handles remote sources (GitHub).
|
|
34
|
+
*
|
|
35
|
+
* github:owner/repo/path → https://raw.githubusercontent.com/owner/repo/main/path
|
|
36
|
+
* Also supports full https:// URLs to raw markdown files.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveSkillSourceAsync(source: string): Promise<string | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Install a skill from its source to ~/.youmd/skills/<name>/SKILL.md.
|
|
41
|
+
* Uses sync resolution for local/bundled, falls back to async for remote.
|
|
42
|
+
*/
|
|
43
|
+
export declare function installSkill(skillName: string): {
|
|
44
|
+
ok: boolean;
|
|
45
|
+
error?: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Async install — handles remote sources (GitHub, HTTPS URLs).
|
|
49
|
+
*/
|
|
50
|
+
export declare function installSkillAsync(skillName: string): Promise<{
|
|
51
|
+
ok: boolean;
|
|
52
|
+
error?: string;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Remove an installed skill.
|
|
56
|
+
*/
|
|
57
|
+
export declare function removeSkill(skillName: string): {
|
|
58
|
+
ok: boolean;
|
|
59
|
+
error?: string;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Use a skill — render it with current identity data.
|
|
63
|
+
* Returns the rendered content.
|
|
64
|
+
*/
|
|
65
|
+
export declare function useSkill(skillName: string): {
|
|
66
|
+
ok: boolean;
|
|
67
|
+
content?: string;
|
|
68
|
+
readiness?: ReturnType<typeof checkTemplateReadiness>;
|
|
69
|
+
error?: string;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Re-interpolate all installed skills against current identity data.
|
|
73
|
+
*/
|
|
74
|
+
export declare function syncAllSkills(): {
|
|
75
|
+
synced: string[];
|
|
76
|
+
errors: string[];
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Sync only skills affected by specific identity field changes.
|
|
80
|
+
*/
|
|
81
|
+
export declare function syncAffectedSkills(changedFields: string[]): {
|
|
82
|
+
synced: string[];
|
|
83
|
+
errors: string[];
|
|
84
|
+
};
|
|
85
|
+
export type AgentTarget = "claude" | "cursor" | "codex";
|
|
86
|
+
export type InitProjectMode = "auto" | "additive" | "zero-touch" | "scaffold";
|
|
87
|
+
export interface InitProjectOptions {
|
|
88
|
+
mode?: InitProjectMode;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Link installed skills to an agent's directory.
|
|
92
|
+
*
|
|
93
|
+
* claude → .claude/skills/youmd/
|
|
94
|
+
* cursor → .cursor/rules/youmd.md (single file concatenation)
|
|
95
|
+
* codex → .codex/skills/youmd/
|
|
96
|
+
*/
|
|
97
|
+
export declare function linkToAgent(target: AgentTarget): {
|
|
98
|
+
ok: boolean;
|
|
99
|
+
path?: string;
|
|
100
|
+
error?: string;
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Initialize a project with additive agent bootstrap files, scaffolded
|
|
104
|
+
* project-context docs, a generated .you layer, and host-linked skills.
|
|
105
|
+
*/
|
|
106
|
+
export declare function initProject(options?: InitProjectOptions): {
|
|
107
|
+
ok: boolean;
|
|
108
|
+
mode: Exclude<InitProjectMode, "auto">;
|
|
109
|
+
steps: Array<{
|
|
110
|
+
name: string;
|
|
111
|
+
ok: boolean;
|
|
112
|
+
detail?: string;
|
|
113
|
+
}>;
|
|
114
|
+
};
|
|
115
|
+
interface SkillMetrics {
|
|
116
|
+
skills: Record<string, {
|
|
117
|
+
uses: number;
|
|
118
|
+
installs: number;
|
|
119
|
+
lastUsed: string;
|
|
120
|
+
lastInstalled?: string;
|
|
121
|
+
}>;
|
|
122
|
+
identityFields: Record<string, {
|
|
123
|
+
references: number;
|
|
124
|
+
}>;
|
|
125
|
+
lastUpdated: string;
|
|
126
|
+
}
|
|
127
|
+
export declare function trackSkillEvent(skillName: string, event: "use" | "install" | "remove"): void;
|
|
128
|
+
export declare function getMetrics(): SkillMetrics;
|
|
129
|
+
export {};
|
|
130
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"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"}
|