@mesh-tech/mesh-cli 0.36.0 → 0.37.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 (103) hide show
  1. package/assets/docs-preview.css +1599 -0
  2. package/dist/bin/mesh.auth-preflight-JFKL4Y4X.js +48 -0
  3. package/dist/bin/mesh.auth-preflight-JFKL4Y4X.js.map +6 -0
  4. package/dist/bin/mesh.capture-history-A4IAVVIR.js +38 -0
  5. package/dist/bin/mesh.capture-history-A4IAVVIR.js.map +6 -0
  6. package/dist/bin/mesh.chunk-5A5OFSYR.js +187 -0
  7. package/dist/bin/mesh.chunk-5A5OFSYR.js.map +6 -0
  8. package/dist/bin/mesh.chunk-7DMAFUBQ.js +7715 -0
  9. package/dist/bin/mesh.chunk-7DMAFUBQ.js.map +6 -0
  10. package/dist/bin/mesh.chunk-A4DGMGHF.js +303 -0
  11. package/dist/bin/mesh.chunk-A4DGMGHF.js.map +6 -0
  12. package/dist/bin/mesh.chunk-CQ2IC4OP.js +217 -0
  13. package/dist/bin/mesh.chunk-CQ2IC4OP.js.map +6 -0
  14. package/dist/bin/mesh.chunk-F4654EPX.js +383 -0
  15. package/dist/bin/mesh.chunk-F4654EPX.js.map +6 -0
  16. package/dist/bin/mesh.chunk-IQOBTL42.js +60 -0
  17. package/dist/bin/mesh.chunk-IQOBTL42.js.map +6 -0
  18. package/dist/bin/mesh.chunk-J6DVWKRW.js +647 -0
  19. package/dist/bin/mesh.chunk-J6DVWKRW.js.map +6 -0
  20. package/dist/bin/mesh.chunk-JB7FWYSP.js +1751 -0
  21. package/dist/bin/mesh.chunk-JB7FWYSP.js.map +6 -0
  22. package/dist/bin/mesh.chunk-MCBMHWXP.js +837 -0
  23. package/dist/bin/mesh.chunk-MCBMHWXP.js.map +6 -0
  24. package/dist/bin/mesh.chunk-OW5EMVG5.js +507 -0
  25. package/dist/bin/mesh.chunk-OW5EMVG5.js.map +6 -0
  26. package/dist/bin/mesh.chunk-R5VVTXG4.js +10092 -0
  27. package/dist/bin/mesh.chunk-R5VVTXG4.js.map +6 -0
  28. package/dist/bin/mesh.chunk-VKV6Z3UI.js +1146 -0
  29. package/dist/bin/mesh.chunk-VKV6Z3UI.js.map +6 -0
  30. package/dist/bin/mesh.chunk-WFFDF346.js +59 -0
  31. package/dist/bin/mesh.chunk-WFFDF346.js.map +6 -0
  32. package/dist/bin/mesh.chunk-WOJOTUFZ.js +835 -0
  33. package/dist/bin/mesh.chunk-WOJOTUFZ.js.map +6 -0
  34. package/dist/bin/mesh.cli-reference-H3TOPIET.js +158 -0
  35. package/dist/bin/mesh.cli-reference-H3TOPIET.js.map +6 -0
  36. package/dist/bin/mesh.convert-KK6ZP256.js +274 -0
  37. package/dist/bin/mesh.convert-KK6ZP256.js.map +6 -0
  38. package/dist/bin/mesh.create-app-A5F45PWZ.js +39 -0
  39. package/dist/bin/mesh.create-app-A5F45PWZ.js.map +6 -0
  40. package/dist/bin/mesh.dev-token-server-GYDYPXYH.js +61 -0
  41. package/dist/bin/mesh.dev-token-server-GYDYPXYH.js.map +6 -0
  42. package/dist/bin/mesh.js +20 -26418
  43. package/dist/bin/mesh.js.map +3 -3
  44. package/dist/bin/mesh.login-JNHPVMCT.js +91 -0
  45. package/dist/bin/mesh.login-JNHPVMCT.js.map +6 -0
  46. package/dist/bin/mesh.platform-setup-EB64EFRN.js +37 -0
  47. package/dist/bin/mesh.platform-setup-EB64EFRN.js.map +6 -0
  48. package/dist/bin/mesh.preview-3IP34TDO.js +2410 -0
  49. package/dist/bin/mesh.preview-3IP34TDO.js.map +6 -0
  50. package/dist/bin/mesh.program-DWOKHNMQ.js +23 -0
  51. package/dist/bin/mesh.program-DWOKHNMQ.js.map +6 -0
  52. package/dist/bin/mesh.registry-OXF57OQW.js +47 -0
  53. package/dist/bin/mesh.registry-OXF57OQW.js.map +6 -0
  54. package/dist/bin/mesh.registry-identity-2HSGQGJC.js +42 -0
  55. package/dist/bin/mesh.registry-identity-2HSGQGJC.js.map +6 -0
  56. package/dist/bin/mesh.skills-MNDSMBIE.js +23 -0
  57. package/dist/bin/mesh.skills-MNDSMBIE.js.map +6 -0
  58. package/dist/bin/mesh.src-5D5DFSLX.js +1302 -0
  59. package/dist/bin/mesh.src-5D5DFSLX.js.map +6 -0
  60. package/dist/bin/mesh.src-G7TJBLNJ.js +40 -0
  61. package/dist/bin/mesh.src-G7TJBLNJ.js.map +6 -0
  62. package/dist/bin/mesh.stack-EFTFAOCV.js +64 -0
  63. package/dist/bin/mesh.stack-EFTFAOCV.js.map +6 -0
  64. package/dist/bin/mesh.start-ARIIY6CV.js +454 -0
  65. package/dist/bin/mesh.start-ARIIY6CV.js.map +6 -0
  66. package/dist/bin/mesh.wizard-ROAQAGSF.js +500 -0
  67. package/dist/bin/mesh.wizard-ROAQAGSF.js.map +6 -0
  68. package/dist/build-info.json +2 -2
  69. package/dist/src/commands/app-check.d.ts +2 -1
  70. package/dist/src/commands/app-check.js +32 -0
  71. package/dist/src/commands/dev.d.ts +6 -0
  72. package/dist/src/commands/dev.js +152 -3
  73. package/dist/src/commands/docs.js +33 -0
  74. package/dist/src/commands/local/act-as-local.d.ts +5 -0
  75. package/dist/src/commands/local/act-as-local.js +41 -0
  76. package/dist/src/commands/local/auth-provision.d.ts +1 -0
  77. package/dist/src/commands/local/auth-provision.js +1 -0
  78. package/dist/src/commands/local/index.js +4 -0
  79. package/dist/src/commands/local/local-api-key.d.ts +44 -0
  80. package/dist/src/commands/local/local-api-key.js +115 -0
  81. package/dist/src/commands/local/local-spicedb.d.ts +95 -0
  82. package/dist/src/commands/local/local-spicedb.js +304 -0
  83. package/dist/src/commands/local/publish-docs.d.ts +81 -0
  84. package/dist/src/commands/local/publish-docs.js +328 -0
  85. package/dist/src/commands/local/seed-zitadel.js +2 -0
  86. package/dist/src/commands/temporal.js +191 -61
  87. package/dist/src/commands/temporal.js.map +3 -3
  88. package/dist/src/docs/convert.d.ts +35 -0
  89. package/dist/src/docs/convert.js +276 -0
  90. package/dist/src/docs/preview-source.d.ts +13 -0
  91. package/dist/src/docs/preview-source.js +58 -0
  92. package/dist/src/docs/preview.d.ts +32 -0
  93. package/dist/src/docs/preview.js +279 -0
  94. package/fragments/agents/AGENTS.md.hbs +27 -27
  95. package/fragments/base/README.md.hbs +5 -2
  96. package/fragments/base/index.ts.hbs +17 -30
  97. package/fragments/base/package.json.hbs +4 -1
  98. package/fragments/service/api/openapi.json.hbs +1 -1
  99. package/fragments/service/docs/docs.yaml.hbs +10 -0
  100. package/fragments/service/docs/pages/getting-started.md.hbs +6 -9
  101. package/package.json +19 -3
  102. package/skills/mesh/SKILL.md +2 -2
  103. package/stack/docker-compose.hub.yml +6 -0
@@ -0,0 +1,383 @@
1
+ import {
2
+ findPackageRoot
3
+ } from "./mesh.chunk-MCBMHWXP.js";
4
+ import {
5
+ logInfo,
6
+ logSuccess,
7
+ logWarn
8
+ } from "./mesh.chunk-WFFDF346.js";
9
+ import {
10
+ MeshCliError
11
+ } from "./mesh.chunk-IQOBTL42.js";
12
+
13
+ // packages/mesh-cli/src/commands/skills.ts
14
+ import * as fs from "fs";
15
+ import * as path from "path";
16
+ import { execFileSync } from "child_process";
17
+ var MANAGED_MARKER = "<!-- managed-by: mesh skills sync \u2014 edits are overwritten; copy content elsewhere to customize -->";
18
+ var FENCE_START = "<!-- intent-skills:start -->";
19
+ var HOOK_RELATIVE = path.join(".intent", "hooks", "intent-claude-gate.mjs");
20
+ var INTENT_RANGE = "^0.3.6";
21
+ function resolveTargetRoot(startDir = process.cwd()) {
22
+ try {
23
+ return execFileSync("git", ["rev-parse", "--show-toplevel"], {
24
+ cwd: startDir,
25
+ encoding: "utf-8",
26
+ stdio: ["ignore", "pipe", "pipe"]
27
+ }).trim();
28
+ } catch {
29
+ return startDir;
30
+ }
31
+ }
32
+ function cliAsset(...segments) {
33
+ return path.join(findPackageRoot(), ...segments);
34
+ }
35
+ function listBaseSkills() {
36
+ const dir = cliAsset("skills");
37
+ if (!fs.existsSync(dir)) return [];
38
+ return fs.readdirSync(dir, { withFileTypes: true }).filter((entry) => entry.isDirectory() && fs.existsSync(path.join(dir, entry.name, "SKILL.md"))).map((entry) => ({
39
+ name: installedSkillName([entry.name]),
40
+ // The CLI's own skill shipped as `skills/core/` and installed as `mesh-core/`.
41
+ legacyName: entry.name === "mesh" ? "mesh-core" : `mesh-${entry.name}`,
42
+ source: path.join(dir, entry.name, "SKILL.md")
43
+ }));
44
+ }
45
+ function installedSkillName(segments) {
46
+ const parts = ["mesh"];
47
+ for (const segment of segments) {
48
+ if (segment === "core") continue;
49
+ if (segment === parts[parts.length - 1]) continue;
50
+ parts.push(segment);
51
+ }
52
+ return parts.join("-");
53
+ }
54
+ function renderManagedSkill(source, name) {
55
+ const raw = fs.readFileSync(source, "utf-8");
56
+ const frontmatter = raw.match(/^(---\n[\s\S]*?\n---\n)/)?.[1];
57
+ if (!frontmatter) return `---
58
+ name: ${name}
59
+ ---
60
+
61
+ ${MANAGED_MARKER}
62
+
63
+ ${raw}`;
64
+ const named = /^name:.*$/m.test(frontmatter) ? frontmatter.replace(/^name:.*$/m, `name: ${name}`) : frontmatter.replace(/^---\n/, `---
65
+ name: ${name}
66
+ `);
67
+ return `${named}
68
+ ${MANAGED_MARKER}
69
+ ${raw.slice(frontmatter.length)}`;
70
+ }
71
+ var BASE_SKILL_PACKAGE = "mesh-cli";
72
+ function meshTechScopeDirs(root, maxDepth = 6) {
73
+ const scopes = [];
74
+ const walk = (dir, depth) => {
75
+ if (depth > maxDepth) return;
76
+ let entries;
77
+ try {
78
+ entries = fs.readdirSync(dir, { withFileTypes: true });
79
+ } catch {
80
+ return;
81
+ }
82
+ for (const entry of entries) {
83
+ if (!entry.isDirectory()) continue;
84
+ if (entry.name === "node_modules") {
85
+ const scope = path.join(dir, entry.name, "@mesh-tech");
86
+ if (fs.existsSync(scope)) scopes.push(scope);
87
+ continue;
88
+ }
89
+ if (entry.name.startsWith(".")) continue;
90
+ walk(path.join(dir, entry.name), depth + 1);
91
+ }
92
+ };
93
+ walk(root, 0);
94
+ return scopes;
95
+ }
96
+ function listPackageSkills(root) {
97
+ const byName = /* @__PURE__ */ new Map();
98
+ for (const scopeDir of meshTechScopeDirs(root)) {
99
+ for (const pkg of fs.readdirSync(scopeDir, { withFileTypes: true })) {
100
+ if (!pkg.isDirectory() && !pkg.isSymbolicLink()) continue;
101
+ if (pkg.name === BASE_SKILL_PACKAGE) continue;
102
+ const skillsDir = path.join(scopeDir, pkg.name, "skills");
103
+ if (!fs.existsSync(skillsDir)) continue;
104
+ for (const domain of fs.readdirSync(skillsDir, { withFileTypes: true })) {
105
+ const source = path.join(skillsDir, domain.name, "SKILL.md");
106
+ if (!fs.existsSync(source)) continue;
107
+ const name = installedSkillName([pkg.name, domain.name]);
108
+ if (!byName.has(name)) {
109
+ byName.set(name, {
110
+ name,
111
+ legacyName: `mesh-${pkg.name}-${domain.name}`,
112
+ dir: path.join(skillsDir, domain.name),
113
+ source
114
+ });
115
+ }
116
+ }
117
+ }
118
+ }
119
+ return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));
120
+ }
121
+ function extrasInSync(sourceDir, targetDir) {
122
+ for (const entry of fs.readdirSync(sourceDir, { withFileTypes: true, recursive: true })) {
123
+ if (!entry.isFile()) continue;
124
+ const rel = path.relative(sourceDir, path.join(entry.parentPath, entry.name));
125
+ if (rel === "SKILL.md") continue;
126
+ const installed = path.join(targetDir, rel);
127
+ if (!fs.existsSync(installed)) return false;
128
+ if (!fs.readFileSync(installed).equals(fs.readFileSync(path.join(sourceDir, rel)))) return false;
129
+ }
130
+ return true;
131
+ }
132
+ function copySkillExtras(sourceDir, targetDir) {
133
+ for (const entry of fs.readdirSync(sourceDir, { withFileTypes: true })) {
134
+ if (entry.name === "SKILL.md") continue;
135
+ fs.cpSync(path.join(sourceDir, entry.name), path.join(targetDir, entry.name), { recursive: true });
136
+ }
137
+ }
138
+ function seedAppSkill(root, appName, appRelPath) {
139
+ const target = path.join(root, ".claude", "skills", appName, "SKILL.md");
140
+ if (fs.existsSync(target)) return null;
141
+ const template = fs.readFileSync(cliAsset("assets", "app-skill", "SKILL.md"), "utf-8");
142
+ const body = template.replaceAll("__APP_NAME__", appName).replaceAll("__APP_PATH__", appRelPath || ".");
143
+ fs.mkdirSync(path.dirname(target), { recursive: true });
144
+ fs.writeFileSync(target, body);
145
+ return path.relative(root, target);
146
+ }
147
+ function planSync(root) {
148
+ const items = [];
149
+ const baseSkills = listBaseSkills();
150
+ for (const skill of baseSkills) {
151
+ const targetDir = path.join(root, ".claude", "skills", skill.name);
152
+ const target = path.join(targetDir, "SKILL.md");
153
+ const sourceDir = path.dirname(skill.source);
154
+ const desired = renderManagedSkill(skill.source, skill.name);
155
+ const label = `.claude/skills/${skill.name}/SKILL.md (base skill)`;
156
+ if (!fs.existsSync(target)) {
157
+ items.push({
158
+ label,
159
+ state: "write",
160
+ apply: () => {
161
+ fs.mkdirSync(targetDir, { recursive: true });
162
+ fs.writeFileSync(target, desired);
163
+ copySkillExtras(sourceDir, targetDir);
164
+ }
165
+ });
166
+ } else {
167
+ const current = fs.readFileSync(target, "utf-8");
168
+ if (current === desired && extrasInSync(sourceDir, targetDir)) {
169
+ items.push({ label, state: "ok" });
170
+ } else if (current.includes(MANAGED_MARKER)) {
171
+ items.push({
172
+ label,
173
+ state: "write",
174
+ apply: () => {
175
+ fs.writeFileSync(target, desired);
176
+ copySkillExtras(sourceDir, targetDir);
177
+ }
178
+ });
179
+ } else {
180
+ items.push({ label: `${label} \u2014 exists without the managed marker, leaving as-is`, state: "skip" });
181
+ }
182
+ }
183
+ }
184
+ const packageSkills = listPackageSkills(root);
185
+ for (const skill of packageSkills) {
186
+ const targetDir = path.join(root, ".claude", "skills", skill.name);
187
+ const target = path.join(targetDir, "SKILL.md");
188
+ const desired = renderManagedSkill(skill.source, skill.name);
189
+ const label = `.claude/skills/${skill.name}/SKILL.md (platform skill)`;
190
+ if (!fs.existsSync(target)) {
191
+ items.push({
192
+ label,
193
+ state: "write",
194
+ apply: () => {
195
+ fs.mkdirSync(targetDir, { recursive: true });
196
+ fs.writeFileSync(target, desired);
197
+ copySkillExtras(skill.dir, targetDir);
198
+ }
199
+ });
200
+ } else {
201
+ const current = fs.readFileSync(target, "utf-8");
202
+ if (current === desired) {
203
+ items.push({ label, state: "ok" });
204
+ } else if (current.includes(MANAGED_MARKER)) {
205
+ items.push({
206
+ label,
207
+ state: "write",
208
+ apply: () => {
209
+ fs.writeFileSync(target, desired);
210
+ copySkillExtras(skill.dir, targetDir);
211
+ }
212
+ });
213
+ } else {
214
+ items.push({ label: `${label} \u2014 exists without the managed marker, leaving as-is`, state: "skip" });
215
+ }
216
+ }
217
+ }
218
+ if (packageSkills.length === 0 && meshTechScopeDirs(root).length === 0) {
219
+ logInfo("No @mesh-tech packages installed yet \u2014 run `pnpm install`, then `mesh skills sync` again for the platform skills.");
220
+ }
221
+ for (const skill of [...baseSkills, ...packageSkills]) {
222
+ if (skill.legacyName === skill.name) continue;
223
+ const legacyDir = path.join(root, ".claude", "skills", skill.legacyName);
224
+ const legacyFile = path.join(legacyDir, "SKILL.md");
225
+ if (!fs.existsSync(legacyFile)) continue;
226
+ const label = `.claude/skills/${skill.legacyName}/ (renamed to ${skill.name})`;
227
+ if (fs.readFileSync(legacyFile, "utf-8").includes(MANAGED_MARKER)) {
228
+ items.push({
229
+ label: `${label} \u2014 removing the old copy`,
230
+ state: "write",
231
+ apply: () => fs.rmSync(legacyDir, { recursive: true, force: true })
232
+ });
233
+ } else {
234
+ items.push({ label: `${label} \u2014 exists without the managed marker, leaving as-is`, state: "skip" });
235
+ }
236
+ }
237
+ const hookSource = cliAsset("assets", "intent", "intent-claude-gate.mjs");
238
+ const hookTarget = path.join(root, HOOK_RELATIVE);
239
+ const hookDesired = fs.readFileSync(hookSource, "utf-8");
240
+ const hookCurrent = fs.existsSync(hookTarget) ? fs.readFileSync(hookTarget, "utf-8") : null;
241
+ items.push(
242
+ hookCurrent === hookDesired ? { label: `${HOOK_RELATIVE} (Intent gate)`, state: "ok" } : {
243
+ label: `${HOOK_RELATIVE} (Intent gate)`,
244
+ state: "write",
245
+ apply: () => {
246
+ fs.mkdirSync(path.dirname(hookTarget), { recursive: true });
247
+ fs.writeFileSync(hookTarget, hookDesired, { mode: 493 });
248
+ }
249
+ }
250
+ );
251
+ const rootPkgPath = path.join(root, "package.json");
252
+ if (fs.existsSync(rootPkgPath)) {
253
+ let rootPkg = null;
254
+ try {
255
+ rootPkg = JSON.parse(fs.readFileSync(rootPkgPath, "utf-8"));
256
+ } catch {
257
+ rootPkg = null;
258
+ }
259
+ const label = "package.json (@tanstack/intent devDependency)";
260
+ if (!rootPkg) {
261
+ items.push({ label: `${label} \u2014 package.json is unparseable, leaving as-is`, state: "skip" });
262
+ } else if (rootPkg.devDependencies?.["@tanstack/intent"] || rootPkg.dependencies?.["@tanstack/intent"]) {
263
+ items.push({ label, state: "ok" });
264
+ } else {
265
+ items.push({
266
+ label,
267
+ // Writing the dependency does not install it. Bare `mesh skills sync`
268
+ // in an already-installed repo leaves `pnpm exec intent` unresolvable
269
+ // until the next install, so say so rather than reporting success.
270
+ remediation: "Added @tanstack/intent \u2014 run `pnpm install` so `pnpm exec intent` resolves.",
271
+ state: "write",
272
+ apply: () => {
273
+ rootPkg.devDependencies = rootPkg.devDependencies ?? {};
274
+ rootPkg.devDependencies["@tanstack/intent"] = INTENT_RANGE;
275
+ rootPkg.devDependencies = Object.fromEntries(
276
+ Object.entries(rootPkg.devDependencies).sort(([a], [b]) => a.localeCompare(b))
277
+ );
278
+ fs.writeFileSync(rootPkgPath, JSON.stringify(rootPkg, null, 2) + "\n");
279
+ }
280
+ });
281
+ }
282
+ }
283
+ const settingsPath = path.join(root, ".claude", "settings.json");
284
+ let settings = {};
285
+ try {
286
+ settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
287
+ } catch {
288
+ settings = {};
289
+ }
290
+ const sessionStart = settings?.hooks?.SessionStart ?? [];
291
+ const hasHook = sessionStart.some(
292
+ (entry) => (entry?.hooks ?? []).some((h) => JSON.stringify(h?.args ?? h?.command ?? "").includes("intent-claude-gate.mjs"))
293
+ );
294
+ items.push(
295
+ hasHook ? { label: ".claude/settings.json (SessionStart Intent hook)", state: "ok" } : {
296
+ label: ".claude/settings.json (SessionStart Intent hook)",
297
+ state: "write",
298
+ apply: () => {
299
+ settings.hooks = settings.hooks ?? {};
300
+ settings.hooks.SessionStart = settings.hooks.SessionStart ?? [];
301
+ settings.hooks.SessionStart.push({
302
+ matcher: "startup|resume|clear|compact",
303
+ hooks: [
304
+ {
305
+ type: "command",
306
+ command: "node",
307
+ args: ["${CLAUDE_PROJECT_DIR}/.intent/hooks/intent-claude-gate.mjs"],
308
+ timeout: 10,
309
+ statusMessage: "Loading Intent skill catalog"
310
+ }
311
+ ]
312
+ });
313
+ fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
314
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 1) + "\n");
315
+ }
316
+ }
317
+ );
318
+ const agentsPath = path.join(root, "AGENTS.md");
319
+ const fence = fs.readFileSync(cliAsset("assets", "intent", "agents-fence.md"), "utf-8");
320
+ const agentsCurrent = fs.existsSync(agentsPath) ? fs.readFileSync(agentsPath, "utf-8") : null;
321
+ items.push(
322
+ agentsCurrent?.includes(FENCE_START) ? { label: "AGENTS.md (intent-skills fence)", state: "ok" } : {
323
+ label: "AGENTS.md (intent-skills fence)",
324
+ state: "write",
325
+ apply: () => {
326
+ const next = agentsCurrent ? `${fence}
327
+ ${agentsCurrent}` : `${fence}
328
+ # Agent Instructions
329
+ `;
330
+ fs.writeFileSync(agentsPath, next);
331
+ }
332
+ }
333
+ );
334
+ return items;
335
+ }
336
+ function syncSkills(root, opts = {}) {
337
+ const items = planSync(root);
338
+ let dirty = false;
339
+ for (const item of items) {
340
+ if (item.state === "ok") continue;
341
+ if (item.state === "skip") {
342
+ logWarn(item.label);
343
+ continue;
344
+ }
345
+ dirty = true;
346
+ if (opts.check) {
347
+ logWarn(`missing/stale: ${item.label}`);
348
+ } else {
349
+ item.apply?.();
350
+ logSuccess(`synced: ${item.label}`);
351
+ if (item.remediation) logInfo(item.remediation);
352
+ }
353
+ }
354
+ if (!dirty) {
355
+ logInfo(`Agent skills are in sync (${root})`);
356
+ }
357
+ return !dirty;
358
+ }
359
+ function registerSkillsCommands(program) {
360
+ const skills = program.command("skills").description("Agent-skill distribution (base skills + Intent discovery)");
361
+ skills.command("sync").description(
362
+ "Install the base building-with-Mesh skills into .claude/skills/, fetch the platform skills shipped by the repo's installed @mesh-tech/* packages, and wire TanStack-Intent discovery (intent devDependency + hook + settings + AGENTS.md fence)"
363
+ ).option("--check", "verify only (CI/doctor): exit 1 when anything is missing or stale", false).option("--root <path>", "target repo root (default: enclosing git root)").action((opts) => {
364
+ const root = path.resolve(opts.root ?? resolveTargetRoot());
365
+ const ok = syncSkills(root, { check: opts.check });
366
+ if (opts.check && !ok) {
367
+ throw new MeshCliError("Agent skills are missing or stale.", {
368
+ remediation: { command: "mesh skills sync" }
369
+ });
370
+ }
371
+ });
372
+ }
373
+
374
+ export {
375
+ INTENT_RANGE,
376
+ resolveTargetRoot,
377
+ installedSkillName,
378
+ renderManagedSkill,
379
+ listPackageSkills,
380
+ seedAppSkill,
381
+ syncSkills,
382
+ registerSkillsCommands
383
+ };
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/skills.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,60 @@
1
+ // packages/mesh-cli/src/utils/errors.ts
2
+ import chalk from "chalk";
3
+ var MeshCliError = class extends Error {
4
+ remediation;
5
+ exitCode;
6
+ constructor(message, options = {}) {
7
+ super(message, options.cause !== void 0 ? { cause: options.cause } : void 0);
8
+ this.name = "MeshCliError";
9
+ this.remediation = options.remediation;
10
+ this.exitCode = options.exitCode ?? 1;
11
+ }
12
+ };
13
+ function renderErrorBody(err) {
14
+ const message = err instanceof Error ? err.message : String(err);
15
+ if (!(err instanceof MeshCliError)) return message;
16
+ const lines = [message];
17
+ if (err.remediation?.command) {
18
+ lines.push(chalk.cyan(" \u2192 run: ") + err.remediation.command);
19
+ }
20
+ if (err.remediation?.docs) {
21
+ lines.push(chalk.cyan(" \u2192 see: ") + err.remediation.docs);
22
+ }
23
+ return lines.join("\n");
24
+ }
25
+ function renderError(err) {
26
+ return chalk.red("\u2717") + " " + renderErrorBody(err);
27
+ }
28
+ function renderErrorJson(err) {
29
+ if (err instanceof MeshCliError) {
30
+ return JSON.stringify({
31
+ error: err.message,
32
+ ...err.remediation ? { remediation: err.remediation } : {}
33
+ });
34
+ }
35
+ return JSON.stringify({ error: err instanceof Error ? err.message : String(err) });
36
+ }
37
+ var jsonPayloadEmitted = false;
38
+ function emitJsonPayload(payload) {
39
+ console.log(JSON.stringify(payload, null, 2));
40
+ jsonPayloadEmitted = true;
41
+ }
42
+ function hasEmittedJsonPayload() {
43
+ return jsonPayloadEmitted;
44
+ }
45
+ function handleCliError(err) {
46
+ const wantsJson = process.argv.includes("--json");
47
+ if (wantsJson && !hasEmittedJsonPayload()) {
48
+ console.log(renderErrorJson(err));
49
+ } else {
50
+ console.error(renderError(err));
51
+ }
52
+ process.exit(err instanceof MeshCliError ? err.exitCode : 1);
53
+ }
54
+
55
+ export {
56
+ MeshCliError,
57
+ renderErrorBody,
58
+ emitJsonPayload,
59
+ handleCliError
60
+ };
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/errors.ts"],
4
+ "mappings": ";AAQA,OAAO,WAAW;AAkBX,IAAM,eAAN,cAA2B,MAAM;AAAA,EAC7B;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,UAA+B,CAAC,GAAG;AAC9D,UAAM,SAAS,QAAQ,UAAU,SAAY,EAAE,OAAO,QAAQ,MAAM,IAAI,MAAS;AACjF,SAAK,OAAO;AACZ,SAAK,cAAc,QAAQ;AAC3B,SAAK,WAAW,QAAQ,YAAY;AAAA,EACtC;AACF;AAWO,SAAS,gBAAgB,KAAsB;AACpD,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,MAAI,EAAE,eAAe,cAAe,QAAO;AAC3C,QAAM,QAAQ,CAAC,OAAO;AACtB,MAAI,IAAI,aAAa,SAAS;AAC5B,UAAM,KAAK,MAAM,KAAK,gBAAW,IAAI,IAAI,YAAY,OAAO;AAAA,EAC9D;AACA,MAAI,IAAI,aAAa,MAAM;AACzB,UAAM,KAAK,MAAM,KAAK,gBAAW,IAAI,IAAI,YAAY,IAAI;AAAA,EAC3D;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAMO,SAAS,YAAY,KAAsB;AAChD,SAAO,MAAM,IAAI,QAAG,IAAI,MAAM,gBAAgB,GAAG;AACnD;AAMO,SAAS,gBAAgB,KAAsB;AACpD,MAAI,eAAe,cAAc;AAC/B,WAAO,KAAK,UAAU;AAAA,MACpB,OAAO,IAAI;AAAA,MACX,GAAI,IAAI,cAAc,EAAE,aAAa,IAAI,YAAY,IAAI,CAAC;AAAA,IAC5D,CAAC;AAAA,EACH;AACA,SAAO,KAAK,UAAU,EAAE,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC;AACnF;AAEA,IAAI,qBAAqB;AAalB,SAAS,gBAAgB,SAAwB;AACtD,UAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC5C,uBAAqB;AACvB;AAGO,SAAS,wBAAiC;AAC/C,SAAO;AACT;AAkBO,SAAS,eAAe,KAAqB;AAClD,QAAM,YAAY,QAAQ,KAAK,SAAS,QAAQ;AAChD,MAAI,aAAa,CAAC,sBAAsB,GAAG;AACzC,YAAQ,IAAI,gBAAgB,GAAG,CAAC;AAAA,EAClC,OAAO;AACL,YAAQ,MAAM,YAAY,GAAG,CAAC;AAAA,EAChC;AACA,UAAQ,KAAK,eAAe,eAAe,IAAI,WAAW,CAAC;AAC7D;",
5
+ "names": []
6
+ }