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.
Files changed (179) hide show
  1. package/dist/__tests__/api.test.d.ts +2 -0
  2. package/dist/__tests__/api.test.d.ts.map +1 -0
  3. package/dist/__tests__/api.test.js +84 -0
  4. package/dist/__tests__/api.test.js.map +1 -0
  5. package/dist/__tests__/compiler.test.d.ts +2 -0
  6. package/dist/__tests__/compiler.test.d.ts.map +1 -0
  7. package/dist/__tests__/compiler.test.js +127 -0
  8. package/dist/__tests__/compiler.test.js.map +1 -0
  9. package/dist/__tests__/config.test.d.ts +2 -0
  10. package/dist/__tests__/config.test.d.ts.map +1 -0
  11. package/dist/__tests__/config.test.js +79 -0
  12. package/dist/__tests__/config.test.js.map +1 -0
  13. package/dist/__tests__/decompile.test.d.ts +2 -0
  14. package/dist/__tests__/decompile.test.d.ts.map +1 -0
  15. package/dist/__tests__/decompile.test.js +102 -0
  16. package/dist/__tests__/decompile.test.js.map +1 -0
  17. package/dist/__tests__/hash.test.d.ts +2 -0
  18. package/dist/__tests__/hash.test.d.ts.map +1 -0
  19. package/dist/__tests__/hash.test.js +44 -0
  20. package/dist/__tests__/hash.test.js.map +1 -0
  21. package/dist/__tests__/integration.test.d.ts +2 -0
  22. package/dist/__tests__/integration.test.d.ts.map +1 -0
  23. package/dist/__tests__/integration.test.js +277 -0
  24. package/dist/__tests__/integration.test.js.map +1 -0
  25. package/dist/__tests__/skill-renderer.test.d.ts +2 -0
  26. package/dist/__tests__/skill-renderer.test.d.ts.map +1 -0
  27. package/dist/__tests__/skill-renderer.test.js +68 -0
  28. package/dist/__tests__/skill-renderer.test.js.map +1 -0
  29. package/dist/commands/add.d.ts.map +1 -1
  30. package/dist/commands/add.js +6 -3
  31. package/dist/commands/add.js.map +1 -1
  32. package/dist/commands/agents.d.ts +2 -0
  33. package/dist/commands/agents.d.ts.map +1 -0
  34. package/dist/commands/agents.js +93 -0
  35. package/dist/commands/agents.js.map +1 -0
  36. package/dist/commands/build.d.ts.map +1 -1
  37. package/dist/commands/build.js +96 -21
  38. package/dist/commands/build.js.map +1 -1
  39. package/dist/commands/chat.d.ts.map +1 -1
  40. package/dist/commands/chat.js +110 -11
  41. package/dist/commands/chat.js.map +1 -1
  42. package/dist/commands/diff.d.ts +1 -1
  43. package/dist/commands/diff.d.ts.map +1 -1
  44. package/dist/commands/diff.js +402 -16
  45. package/dist/commands/diff.js.map +1 -1
  46. package/dist/commands/export.js +1 -1
  47. package/dist/commands/export.js.map +1 -1
  48. package/dist/commands/init.d.ts +1 -0
  49. package/dist/commands/init.d.ts.map +1 -1
  50. package/dist/commands/init.js +138 -0
  51. package/dist/commands/init.js.map +1 -1
  52. package/dist/commands/link.d.ts +1 -0
  53. package/dist/commands/link.d.ts.map +1 -1
  54. package/dist/commands/link.js +77 -13
  55. package/dist/commands/link.js.map +1 -1
  56. package/dist/commands/login.d.ts.map +1 -1
  57. package/dist/commands/login.js +48 -27
  58. package/dist/commands/login.js.map +1 -1
  59. package/dist/commands/logs.d.ts +7 -0
  60. package/dist/commands/logs.d.ts.map +1 -0
  61. package/dist/commands/logs.js +115 -0
  62. package/dist/commands/logs.js.map +1 -0
  63. package/dist/commands/mcp.d.ts +6 -0
  64. package/dist/commands/mcp.d.ts.map +1 -0
  65. package/dist/commands/mcp.js +258 -0
  66. package/dist/commands/mcp.js.map +1 -0
  67. package/dist/commands/preview.d.ts.map +1 -1
  68. package/dist/commands/preview.js +191 -7
  69. package/dist/commands/preview.js.map +1 -1
  70. package/dist/commands/private.d.ts.map +1 -1
  71. package/dist/commands/private.js +248 -0
  72. package/dist/commands/private.js.map +1 -1
  73. package/dist/commands/prompts.d.ts +12 -0
  74. package/dist/commands/prompts.d.ts.map +1 -0
  75. package/dist/commands/prompts.js +245 -0
  76. package/dist/commands/prompts.js.map +1 -0
  77. package/dist/commands/publish.d.ts.map +1 -1
  78. package/dist/commands/publish.js +69 -6
  79. package/dist/commands/publish.js.map +1 -1
  80. package/dist/commands/pull.d.ts.map +1 -1
  81. package/dist/commands/pull.js +110 -137
  82. package/dist/commands/pull.js.map +1 -1
  83. package/dist/commands/push.d.ts +1 -0
  84. package/dist/commands/push.d.ts.map +1 -1
  85. package/dist/commands/push.js +236 -38
  86. package/dist/commands/push.js.map +1 -1
  87. package/dist/commands/register.d.ts.map +1 -1
  88. package/dist/commands/register.js +40 -84
  89. package/dist/commands/register.js.map +1 -1
  90. package/dist/commands/skill.d.ts +8 -0
  91. package/dist/commands/skill.d.ts.map +1 -0
  92. package/dist/commands/skill.js +1226 -0
  93. package/dist/commands/skill.js.map +1 -0
  94. package/dist/commands/status.d.ts.map +1 -1
  95. package/dist/commands/status.js +221 -69
  96. package/dist/commands/status.js.map +1 -1
  97. package/dist/commands/sync.d.ts.map +1 -1
  98. package/dist/commands/sync.js +12 -0
  99. package/dist/commands/sync.js.map +1 -1
  100. package/dist/commands/whoami.d.ts.map +1 -1
  101. package/dist/commands/whoami.js +62 -33
  102. package/dist/commands/whoami.js.map +1 -1
  103. package/dist/index.js +187 -6
  104. package/dist/index.js.map +1 -1
  105. package/dist/lib/api.d.ts +169 -12
  106. package/dist/lib/api.d.ts.map +1 -1
  107. package/dist/lib/api.js +183 -33
  108. package/dist/lib/api.js.map +1 -1
  109. package/dist/lib/ascii.d.ts.map +1 -1
  110. package/dist/lib/ascii.js +20 -48
  111. package/dist/lib/ascii.js.map +1 -1
  112. package/dist/lib/compiler.d.ts +16 -33
  113. package/dist/lib/compiler.d.ts.map +1 -1
  114. package/dist/lib/compiler.js +499 -84
  115. package/dist/lib/compiler.js.map +1 -1
  116. package/dist/lib/config.d.ts +27 -0
  117. package/dist/lib/config.d.ts.map +1 -1
  118. package/dist/lib/config.js +50 -0
  119. package/dist/lib/config.js.map +1 -1
  120. package/dist/lib/decompile.d.ts +21 -0
  121. package/dist/lib/decompile.d.ts.map +1 -0
  122. package/dist/lib/decompile.js +304 -0
  123. package/dist/lib/decompile.js.map +1 -0
  124. package/dist/lib/hash.d.ts +3 -0
  125. package/dist/lib/hash.d.ts.map +1 -0
  126. package/dist/lib/hash.js +31 -0
  127. package/dist/lib/hash.js.map +1 -0
  128. package/dist/lib/onboarding.d.ts +4 -4
  129. package/dist/lib/onboarding.d.ts.map +1 -1
  130. package/dist/lib/onboarding.js +228 -81
  131. package/dist/lib/onboarding.js.map +1 -1
  132. package/dist/lib/skill-catalog.d.ts +57 -0
  133. package/dist/lib/skill-catalog.d.ts.map +1 -0
  134. package/dist/lib/skill-catalog.js +245 -0
  135. package/dist/lib/skill-catalog.js.map +1 -0
  136. package/dist/lib/skill-renderer.d.ts +55 -0
  137. package/dist/lib/skill-renderer.d.ts.map +1 -0
  138. package/dist/lib/skill-renderer.js +382 -0
  139. package/dist/lib/skill-renderer.js.map +1 -0
  140. package/dist/lib/skills.d.ts +130 -0
  141. package/dist/lib/skills.d.ts.map +1 -0
  142. package/dist/lib/skills.js +876 -0
  143. package/dist/lib/skills.js.map +1 -0
  144. package/dist/lib/vault.d.ts +40 -0
  145. package/dist/lib/vault.d.ts.map +1 -0
  146. package/dist/lib/vault.js +187 -0
  147. package/dist/lib/vault.js.map +1 -0
  148. package/dist/mcp/server.d.ts +21 -0
  149. package/dist/mcp/server.d.ts.map +1 -0
  150. package/dist/mcp/server.js +1283 -0
  151. package/dist/mcp/server.js.map +1 -0
  152. package/examples/houston/directives/agent.md +13 -0
  153. package/examples/houston/preferences/agent.md +14 -0
  154. package/examples/houston/profile/about.md +15 -0
  155. package/examples/houston/profile/links.md +10 -0
  156. package/examples/houston/profile/projects.md +37 -0
  157. package/examples/houston/profile/values.md +9 -0
  158. package/examples/houston/voice/voice.md +13 -0
  159. package/examples/jordan/directives/agent.md +13 -0
  160. package/examples/jordan/preferences/agent.md +16 -0
  161. package/examples/jordan/profile/about.md +15 -0
  162. package/examples/jordan/profile/links.md +10 -0
  163. package/examples/jordan/profile/projects.md +29 -0
  164. package/examples/jordan/profile/values.md +9 -0
  165. package/examples/jordan/voice/voice.md +12 -0
  166. package/examples/priya/directives/agent.md +13 -0
  167. package/examples/priya/preferences/agent.md +15 -0
  168. package/examples/priya/profile/about.md +15 -0
  169. package/examples/priya/profile/links.md +9 -0
  170. package/examples/priya/profile/projects.md +28 -0
  171. package/examples/priya/profile/values.md +9 -0
  172. package/examples/priya/voice/voice.md +12 -0
  173. package/package.json +15 -6
  174. package/skills/claude-md-generator.md +91 -0
  175. package/skills/meta-improve.md +84 -0
  176. package/skills/proactive-context-fill.md +52 -0
  177. package/skills/project-context-init.md +77 -0
  178. package/skills/voice-sync.md +89 -0
  179. 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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"}