@mesh-tech/mesh-cli 0.36.0 → 0.38.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/assets/docs-preview.css +1599 -0
- package/dist/bin/mesh.auth-preflight-AQJ5TQES.js +48 -0
- package/dist/bin/mesh.auth-preflight-AQJ5TQES.js.map +6 -0
- package/dist/bin/mesh.capture-history-A4IAVVIR.js +38 -0
- package/dist/bin/mesh.capture-history-A4IAVVIR.js.map +6 -0
- package/dist/bin/mesh.chunk-2QIVBQX5.js +647 -0
- package/dist/bin/mesh.chunk-2QIVBQX5.js.map +6 -0
- package/dist/bin/mesh.chunk-2YRWJH5X.js +1747 -0
- package/dist/bin/mesh.chunk-2YRWJH5X.js.map +6 -0
- package/dist/bin/mesh.chunk-BF2SH6XT.js +303 -0
- package/dist/bin/mesh.chunk-BF2SH6XT.js.map +6 -0
- package/dist/bin/mesh.chunk-F4654EPX.js +383 -0
- package/dist/bin/mesh.chunk-F4654EPX.js.map +6 -0
- package/dist/bin/mesh.chunk-HPYZWPRM.js +1146 -0
- package/dist/bin/mesh.chunk-HPYZWPRM.js.map +6 -0
- package/dist/bin/mesh.chunk-I6NXLXGC.js +7715 -0
- package/dist/bin/mesh.chunk-I6NXLXGC.js.map +6 -0
- package/dist/bin/mesh.chunk-IQOBTL42.js +60 -0
- package/dist/bin/mesh.chunk-IQOBTL42.js.map +6 -0
- package/dist/bin/mesh.chunk-IU2IWH6O.js +835 -0
- package/dist/bin/mesh.chunk-IU2IWH6O.js.map +6 -0
- package/dist/bin/mesh.chunk-KN4BZOYH.js +187 -0
- package/dist/bin/mesh.chunk-KN4BZOYH.js.map +6 -0
- package/dist/bin/mesh.chunk-LMYPTJ2F.js +10092 -0
- package/dist/bin/mesh.chunk-LMYPTJ2F.js.map +6 -0
- package/dist/bin/mesh.chunk-MCBMHWXP.js +837 -0
- package/dist/bin/mesh.chunk-MCBMHWXP.js.map +6 -0
- package/dist/bin/mesh.chunk-OW5EMVG5.js +507 -0
- package/dist/bin/mesh.chunk-OW5EMVG5.js.map +6 -0
- package/dist/bin/mesh.chunk-TZAGJTKU.js +217 -0
- package/dist/bin/mesh.chunk-TZAGJTKU.js.map +6 -0
- package/dist/bin/mesh.chunk-WFFDF346.js +59 -0
- package/dist/bin/mesh.chunk-WFFDF346.js.map +6 -0
- package/dist/bin/mesh.cli-reference-H3TOPIET.js +158 -0
- package/dist/bin/mesh.cli-reference-H3TOPIET.js.map +6 -0
- package/dist/bin/mesh.convert-7N2H2SVK.js +274 -0
- package/dist/bin/mesh.convert-7N2H2SVK.js.map +6 -0
- package/dist/bin/mesh.create-app-NGXACFAU.js +39 -0
- package/dist/bin/mesh.create-app-NGXACFAU.js.map +6 -0
- package/dist/bin/mesh.dev-token-server-YP2VBP2S.js +61 -0
- package/dist/bin/mesh.dev-token-server-YP2VBP2S.js.map +6 -0
- package/dist/bin/mesh.js +20 -26418
- package/dist/bin/mesh.js.map +3 -3
- package/dist/bin/mesh.login-7SIAKFXJ.js +91 -0
- package/dist/bin/mesh.login-7SIAKFXJ.js.map +6 -0
- package/dist/bin/mesh.platform-setup-CJXE3BCP.js +37 -0
- package/dist/bin/mesh.platform-setup-CJXE3BCP.js.map +6 -0
- package/dist/bin/mesh.preview-RJGTCTY3.js +2410 -0
- package/dist/bin/mesh.preview-RJGTCTY3.js.map +6 -0
- package/dist/bin/mesh.program-BIDQBSSI.js +23 -0
- package/dist/bin/mesh.program-BIDQBSSI.js.map +6 -0
- package/dist/bin/mesh.registry-7P4MGXEK.js +47 -0
- package/dist/bin/mesh.registry-7P4MGXEK.js.map +6 -0
- package/dist/bin/mesh.registry-identity-JW4KO7N7.js +42 -0
- package/dist/bin/mesh.registry-identity-JW4KO7N7.js.map +6 -0
- package/dist/bin/mesh.skills-MNDSMBIE.js +23 -0
- package/dist/bin/mesh.skills-MNDSMBIE.js.map +6 -0
- package/dist/bin/mesh.src-5D5DFSLX.js +1302 -0
- package/dist/bin/mesh.src-5D5DFSLX.js.map +6 -0
- package/dist/bin/mesh.src-G7TJBLNJ.js +40 -0
- package/dist/bin/mesh.src-G7TJBLNJ.js.map +6 -0
- package/dist/bin/mesh.stack-EFTFAOCV.js +64 -0
- package/dist/bin/mesh.stack-EFTFAOCV.js.map +6 -0
- package/dist/bin/mesh.start-MPQFIEMH.js +454 -0
- package/dist/bin/mesh.start-MPQFIEMH.js.map +6 -0
- package/dist/bin/mesh.wizard-ZJE4S6PC.js +500 -0
- package/dist/bin/mesh.wizard-ZJE4S6PC.js.map +6 -0
- package/dist/build-info.json +2 -2
- package/dist/src/commands/app-check.d.ts +2 -1
- package/dist/src/commands/app-check.js +32 -0
- package/dist/src/commands/create-app.d.ts +0 -1
- package/dist/src/commands/create-app.js +0 -4
- package/dist/src/commands/dev.d.ts +6 -0
- package/dist/src/commands/dev.js +152 -3
- package/dist/src/commands/docs.js +33 -0
- package/dist/src/commands/local/act-as-local.d.ts +5 -0
- package/dist/src/commands/local/act-as-local.js +41 -0
- package/dist/src/commands/local/auth-provision.d.ts +1 -0
- package/dist/src/commands/local/auth-provision.js +1 -0
- package/dist/src/commands/local/index.js +4 -0
- package/dist/src/commands/local/local-api-key.d.ts +44 -0
- package/dist/src/commands/local/local-api-key.js +115 -0
- package/dist/src/commands/local/local-spicedb.d.ts +95 -0
- package/dist/src/commands/local/local-spicedb.js +304 -0
- package/dist/src/commands/local/publish-docs.d.ts +81 -0
- package/dist/src/commands/local/publish-docs.js +328 -0
- package/dist/src/commands/local/seed-zitadel.js +2 -0
- package/dist/src/commands/temporal.js +191 -61
- package/dist/src/commands/temporal.js.map +3 -3
- package/dist/src/docs/convert.d.ts +35 -0
- package/dist/src/docs/convert.js +276 -0
- package/dist/src/docs/preview-source.d.ts +13 -0
- package/dist/src/docs/preview-source.js +58 -0
- package/dist/src/docs/preview.d.ts +32 -0
- package/dist/src/docs/preview.js +279 -0
- package/dist/src/utils/scaffold-versions.d.ts +0 -1
- package/dist/src/utils/scaffold-versions.js +0 -1
- package/fragments/agents/AGENTS.md.hbs +27 -27
- package/fragments/base/README.md.hbs +5 -2
- package/fragments/base/index.ts.hbs +19 -33
- package/fragments/base/package.json.hbs +4 -2
- package/fragments/service/api/openapi.json.hbs +1 -1
- package/fragments/service/docs/docs.yaml.hbs +10 -0
- package/fragments/service/docs/pages/getting-started.md.hbs +6 -9
- package/package.json +19 -3
- package/skills/mesh/SKILL.md +2 -2
- 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
|
+
}
|