@untitled-devs/wasla 0.1.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/LICENSE +21 -0
- package/README.md +431 -0
- package/dist/adapters/base.d.ts +27 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +9 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude.d.ts +31 -0
- package/dist/adapters/claude.d.ts.map +1 -0
- package/dist/adapters/claude.js +96 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/cursor.d.ts +30 -0
- package/dist/adapters/cursor.d.ts.map +1 -0
- package/dist/adapters/cursor.js +60 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/factory.d.ts +5 -0
- package/dist/adapters/factory.d.ts.map +1 -0
- package/dist/adapters/factory.js +40 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/adapters/gemini.d.ts +31 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +99 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/github-copilot-cli.d.ts +30 -0
- package/dist/adapters/github-copilot-cli.d.ts.map +1 -0
- package/dist/adapters/github-copilot-cli.js +65 -0
- package/dist/adapters/github-copilot-cli.js.map +1 -0
- package/dist/adapters/github-copilot.d.ts +32 -0
- package/dist/adapters/github-copilot.d.ts.map +1 -0
- package/dist/adapters/github-copilot.js +86 -0
- package/dist/adapters/github-copilot.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +28 -0
- package/dist/adapters/openclaw.d.ts.map +1 -0
- package/dist/adapters/openclaw.js +62 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/adapters/opencode.d.ts +32 -0
- package/dist/adapters/opencode.d.ts.map +1 -0
- package/dist/adapters/opencode.js +102 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/cli/commands/config.d.ts +7 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +66 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/install.d.ts +2 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +27 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/register.d.ts +6 -0
- package/dist/cli/commands/register.d.ts.map +1 -0
- package/dist/cli/commands/register.js +56 -0
- package/dist/cli/commands/register.js.map +1 -0
- package/dist/cli/commands/status.d.ts +6 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +37 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/sync-to.d.ts +8 -0
- package/dist/cli/commands/sync-to.d.ts.map +1 -0
- package/dist/cli/commands/sync-to.js +35 -0
- package/dist/cli/commands/sync-to.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +6 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +27 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/visualizer.d.ts +11 -0
- package/dist/cli/commands/visualizer.d.ts.map +1 -0
- package/dist/cli/commands/visualizer.js +241 -0
- package/dist/cli/commands/visualizer.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +6 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +86 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +59 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/registry.d.ts +20 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +103 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/scanner.d.ts +17 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +227 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/types.d.ts +78 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/visualizer-types.d.ts +39 -0
- package/dist/core/visualizer-types.d.ts.map +1 -0
- package/dist/core/visualizer-types.js +2 -0
- package/dist/core/visualizer-types.js.map +1 -0
- package/dist/syncer/index.d.ts +31 -0
- package/dist/syncer/index.d.ts.map +1 -0
- package/dist/syncer/index.js +544 -0
- package/dist/syncer/index.js.map +1 -0
- package/dist/utils/cli-output.d.ts +12 -0
- package/dist/utils/cli-output.d.ts.map +1 -0
- package/dist/utils/cli-output.js +45 -0
- package/dist/utils/cli-output.js.map +1 -0
- package/dist/utils/fs.d.ts +14 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +74 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/paths.d.ts +7 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +84 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +122 -0
- package/src/visualizer/dist/assets/index-BRmeXR7T.js +144 -0
- package/src/visualizer/dist/index.html +12 -0
- package/src/visualizer/dist/logo.png +0 -0
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
import { RegistryManager } from '../core/registry.js';
|
|
2
|
+
import { getAdapter } from '../adapters/factory.js';
|
|
3
|
+
import { basename, dirname, join, sep } from 'path';
|
|
4
|
+
import { getRegistryDir } from '../utils/paths.js';
|
|
5
|
+
import { readText, writeText, ensureDir, fileExists, readJSON, writeJSON, removePath, } from '../utils/fs.js';
|
|
6
|
+
import { createHash } from 'crypto';
|
|
7
|
+
export class Syncer {
|
|
8
|
+
constructor(registry, scanner, scope = 'workspace') {
|
|
9
|
+
this.registry = registry;
|
|
10
|
+
this.scanner = scanner;
|
|
11
|
+
this.scope = scope;
|
|
12
|
+
}
|
|
13
|
+
async sync(interactive = true) {
|
|
14
|
+
// Initialize scanner with registry stub information
|
|
15
|
+
await this.scanner.initialize();
|
|
16
|
+
// Ensure registry is loaded
|
|
17
|
+
try {
|
|
18
|
+
this.registry.get();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
await this.registry.load();
|
|
22
|
+
}
|
|
23
|
+
const registryDir = getRegistryDir(this.scope);
|
|
24
|
+
await ensureDir(join(registryDir, 'agents'));
|
|
25
|
+
await ensureDir(join(registryDir, 'skills'));
|
|
26
|
+
await ensureDir(join(registryDir, 'mcp'));
|
|
27
|
+
await ensureDir(join(registryDir, 'context'));
|
|
28
|
+
const discovered = await this.scanner.scanAllTools();
|
|
29
|
+
const grouped = this.groupByNameAndType(discovered);
|
|
30
|
+
const installedTools = await this.scanner.detectInstalledTools();
|
|
31
|
+
let stubsWritten = 0;
|
|
32
|
+
const stubsDeleted = await this.reconcileDeletedAssets(grouped, installedTools);
|
|
33
|
+
const assetsDiscovered = Object.keys(grouped).length;
|
|
34
|
+
for (const key of Object.keys(grouped)) {
|
|
35
|
+
const items = grouped[key];
|
|
36
|
+
const [name, type] = key.split('|');
|
|
37
|
+
// "Latest is Greatest" - sort by modification time
|
|
38
|
+
const sorted = items.sort((a, b) => b.modifiedAt - a.modifiedAt);
|
|
39
|
+
const latest = type === 'skill'
|
|
40
|
+
? sorted.find((item) => item.relativePath.endsWith(`${sep}SKILL.md`) || item.relativePath === 'SKILL.md') || sorted[0]
|
|
41
|
+
: sorted[0];
|
|
42
|
+
// Check if we should prompt the user in interactive mode if there are multiple versions
|
|
43
|
+
if (interactive && sorted.length > 1) {
|
|
44
|
+
// For MVP, we'll just log it or we could implement a real prompt here.
|
|
45
|
+
// The spec says: Prompt user: "Use Gemini version? (Y/n)"
|
|
46
|
+
// Since I'm an AI agent, I'll assume automatic for now or follow the latest mtime.
|
|
47
|
+
console.log(`Syncing ${name} (${type}) using latest version from ${latest.tool}`);
|
|
48
|
+
}
|
|
49
|
+
const content = latest.content ?? (await readText(latest.path));
|
|
50
|
+
const contentHash = this.calculateHash(content);
|
|
51
|
+
// Update or create asset in registry
|
|
52
|
+
let asset = this.registry.findAsset(name, type);
|
|
53
|
+
if (!asset) {
|
|
54
|
+
asset = {
|
|
55
|
+
id: RegistryManager.generateId(),
|
|
56
|
+
name,
|
|
57
|
+
type,
|
|
58
|
+
last_modified_at: latest.modifiedAt,
|
|
59
|
+
last_synced_at: new Date().toISOString(),
|
|
60
|
+
stubs: [],
|
|
61
|
+
};
|
|
62
|
+
this.registry.addAsset(asset);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.registry.updateAsset(asset.id, {
|
|
66
|
+
last_modified_at: latest.modifiedAt,
|
|
67
|
+
last_synced_at: new Date().toISOString(),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// Mirror to all other tool locations
|
|
71
|
+
for (const tool of installedTools) {
|
|
72
|
+
const adapter = getAdapter(tool, this.scope);
|
|
73
|
+
const pathsRecord = adapter.paths;
|
|
74
|
+
const formatsRecord = adapter.formats;
|
|
75
|
+
const typeDir = pathsRecord[type];
|
|
76
|
+
if (!typeDir) {
|
|
77
|
+
// This tool doesn't support this asset type
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const filesToMirror = type === 'skill' && formatsRecord.skill === 'md'
|
|
81
|
+
? items.filter((item) => item.tool === latest.tool)
|
|
82
|
+
: [latest];
|
|
83
|
+
let primaryTargetPath;
|
|
84
|
+
for (const file of filesToMirror) {
|
|
85
|
+
const targetPath = this.getTargetPath(adapter, type, name, file.relativePath);
|
|
86
|
+
if (!targetPath)
|
|
87
|
+
continue;
|
|
88
|
+
if (file.path === latest.path) {
|
|
89
|
+
primaryTargetPath = targetPath;
|
|
90
|
+
}
|
|
91
|
+
// Don't overwrite the latest source if it's already there
|
|
92
|
+
if (tool === latest.tool && file.path === targetPath) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const fileContent = file.content ?? (file.path === latest.path ? content : await readText(file.path));
|
|
96
|
+
// Write the mirrored content (Option B)
|
|
97
|
+
if (await this.writeTarget(adapter, asset, type, name, fileContent, targetPath)) {
|
|
98
|
+
stubsWritten++;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (!primaryTargetPath) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
// Update stub info in registry
|
|
105
|
+
const existingStub = asset.stubs.find((s) => s.tool === tool);
|
|
106
|
+
if (existingStub) {
|
|
107
|
+
existingStub.path = primaryTargetPath;
|
|
108
|
+
existingStub.written_at = new Date().toISOString();
|
|
109
|
+
existingStub.hash = contentHash;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
asset.stubs.push({
|
|
113
|
+
tool,
|
|
114
|
+
path: primaryTargetPath,
|
|
115
|
+
written_at: new Date().toISOString(),
|
|
116
|
+
hash: contentHash,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Also save to canonical registry location
|
|
121
|
+
const registrySubdir = type === 'agent'
|
|
122
|
+
? 'agents'
|
|
123
|
+
: type === 'skill'
|
|
124
|
+
? 'skills'
|
|
125
|
+
: type === 'context'
|
|
126
|
+
? 'context'
|
|
127
|
+
: 'mcp';
|
|
128
|
+
const ext = type === 'mcp' ? '.json' : '.md';
|
|
129
|
+
const canonicalPath = join(registryDir, registrySubdir, `${name}${ext}`);
|
|
130
|
+
await writeText(canonicalPath, content);
|
|
131
|
+
}
|
|
132
|
+
await this.registry.save();
|
|
133
|
+
return {
|
|
134
|
+
stubsWritten,
|
|
135
|
+
stubsDeleted,
|
|
136
|
+
assetsDiscovered,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
groupByNameAndType(discovered) {
|
|
140
|
+
const grouped = {};
|
|
141
|
+
for (const item of discovered) {
|
|
142
|
+
const key = `${item.name}|${item.type}`;
|
|
143
|
+
if (!grouped[key]) {
|
|
144
|
+
grouped[key] = [];
|
|
145
|
+
}
|
|
146
|
+
grouped[key].push(item);
|
|
147
|
+
}
|
|
148
|
+
return grouped;
|
|
149
|
+
}
|
|
150
|
+
async syncToTool(sourceTool, targetTools) {
|
|
151
|
+
// Initialize scanner with registry stub information
|
|
152
|
+
await this.scanner.initialize();
|
|
153
|
+
// Ensure registry is loaded
|
|
154
|
+
try {
|
|
155
|
+
this.registry.get();
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
await this.registry.load();
|
|
159
|
+
}
|
|
160
|
+
const registryDir = getRegistryDir(this.scope);
|
|
161
|
+
await ensureDir(join(registryDir, 'agents'));
|
|
162
|
+
await ensureDir(join(registryDir, 'skills'));
|
|
163
|
+
await ensureDir(join(registryDir, 'mcp'));
|
|
164
|
+
await ensureDir(join(registryDir, 'context'));
|
|
165
|
+
// Scan all asset types from source tool
|
|
166
|
+
const assetTypes = ['agent', 'skill', 'mcp', 'context'];
|
|
167
|
+
const discovered = await this.scanner.scanTool(sourceTool, assetTypes);
|
|
168
|
+
const grouped = this.groupByNameAndType(discovered);
|
|
169
|
+
const deletionScan = [...discovered];
|
|
170
|
+
for (const tool of targetTools.filter((tool) => tool !== sourceTool)) {
|
|
171
|
+
deletionScan.push(...(await this.scanner.scanTool(tool, assetTypes)));
|
|
172
|
+
}
|
|
173
|
+
const deletionGrouped = this.groupByNameAndType(deletionScan);
|
|
174
|
+
let stubsWritten = 0;
|
|
175
|
+
const stubsDeleted = await this.reconcileDeletedAssets(deletionGrouped, [...new Set([sourceTool, ...targetTools])], sourceTool);
|
|
176
|
+
for (const key of Object.keys(grouped)) {
|
|
177
|
+
if (!deletionGrouped[key]) {
|
|
178
|
+
delete grouped[key];
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const assetsDiscovered = Object.keys(grouped).length;
|
|
182
|
+
for (const key of Object.keys(grouped)) {
|
|
183
|
+
const items = grouped[key];
|
|
184
|
+
const [name, type] = key.split('|');
|
|
185
|
+
// For directory-based skills, SKILL.md is the primary definition and
|
|
186
|
+
// sibling files are supporting references that should be mirrored too.
|
|
187
|
+
const sorted = items.sort((a, b) => b.modifiedAt - a.modifiedAt);
|
|
188
|
+
const source = type === 'skill'
|
|
189
|
+
? sorted.find((item) => item.relativePath.endsWith(`${sep}SKILL.md`) || item.relativePath === 'SKILL.md') || sorted[0]
|
|
190
|
+
: sorted[0];
|
|
191
|
+
const content = source.content ?? (await readText(source.path));
|
|
192
|
+
const contentHash = this.calculateHash(content);
|
|
193
|
+
// Update or create asset in registry
|
|
194
|
+
let asset = this.registry.findAsset(name, type);
|
|
195
|
+
if (!asset) {
|
|
196
|
+
asset = {
|
|
197
|
+
id: RegistryManager.generateId(),
|
|
198
|
+
name,
|
|
199
|
+
type,
|
|
200
|
+
last_modified_at: source.modifiedAt,
|
|
201
|
+
last_synced_at: new Date().toISOString(),
|
|
202
|
+
stubs: [],
|
|
203
|
+
};
|
|
204
|
+
this.registry.addAsset(asset);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
this.registry.updateAsset(asset.id, {
|
|
208
|
+
last_modified_at: source.modifiedAt,
|
|
209
|
+
last_synced_at: new Date().toISOString(),
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
this.upsertStub(asset, sourceTool, source.path, contentHash);
|
|
213
|
+
// Write only to target tools
|
|
214
|
+
for (const tool of targetTools) {
|
|
215
|
+
const adapter = getAdapter(tool, this.scope);
|
|
216
|
+
const formatsRecord = adapter.formats;
|
|
217
|
+
const pathsRecord = adapter.paths;
|
|
218
|
+
const typeDir = pathsRecord[type];
|
|
219
|
+
if (!typeDir || !formatsRecord[type]) {
|
|
220
|
+
// This tool doesn't support this asset type
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
const filesToMirror = type === 'skill' && formatsRecord.skill === 'md' ? items : [source];
|
|
224
|
+
let primaryTargetPath;
|
|
225
|
+
for (const file of filesToMirror) {
|
|
226
|
+
const targetPath = this.getTargetPath(adapter, type, name, file.relativePath);
|
|
227
|
+
if (!targetPath)
|
|
228
|
+
continue;
|
|
229
|
+
if (file.path === source.path) {
|
|
230
|
+
primaryTargetPath = targetPath;
|
|
231
|
+
}
|
|
232
|
+
// Don't overwrite the source if it's already there
|
|
233
|
+
if (tool === sourceTool && file.path === targetPath) {
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
const fileContent = file.content ?? (file.path === source.path ? content : await readText(file.path));
|
|
237
|
+
if (await this.writeTarget(adapter, asset, type, name, fileContent, targetPath)) {
|
|
238
|
+
stubsWritten++;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (!primaryTargetPath) {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
// Update stub info in registry
|
|
245
|
+
const existingStub = asset.stubs.find((s) => s.tool === tool);
|
|
246
|
+
if (existingStub) {
|
|
247
|
+
existingStub.path = primaryTargetPath;
|
|
248
|
+
existingStub.written_at = new Date().toISOString();
|
|
249
|
+
existingStub.hash = contentHash;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
asset.stubs.push({
|
|
253
|
+
tool,
|
|
254
|
+
path: primaryTargetPath,
|
|
255
|
+
written_at: new Date().toISOString(),
|
|
256
|
+
hash: contentHash,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// Also save to canonical registry location
|
|
261
|
+
const registrySubdir = type === 'agent'
|
|
262
|
+
? 'agents'
|
|
263
|
+
: type === 'skill'
|
|
264
|
+
? 'skills'
|
|
265
|
+
: type === 'context'
|
|
266
|
+
? 'context'
|
|
267
|
+
: 'mcp';
|
|
268
|
+
const ext = type === 'mcp' ? '.json' : '.md';
|
|
269
|
+
const canonicalPath = join(registryDir, registrySubdir, `${name}${ext}`);
|
|
270
|
+
await writeText(canonicalPath, content);
|
|
271
|
+
}
|
|
272
|
+
await this.registry.save();
|
|
273
|
+
return {
|
|
274
|
+
stubsWritten,
|
|
275
|
+
stubsDeleted,
|
|
276
|
+
assetsDiscovered,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
async attachAssetToTool(name, type, sourceTool, targetTool) {
|
|
280
|
+
await this.scanner.initialize();
|
|
281
|
+
try {
|
|
282
|
+
this.registry.get();
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
await this.registry.load();
|
|
286
|
+
}
|
|
287
|
+
const candidates = sourceTool === 'waslagenie'
|
|
288
|
+
? (await this.scanner.scanAllTools([type])).filter((item) => item.name === name)
|
|
289
|
+
: (await this.scanner.scanTool(sourceTool, [type])).filter((item) => item.name === name);
|
|
290
|
+
const sourceCandidates = candidates.filter((item) => item.tool !== targetTool);
|
|
291
|
+
const items = (sourceCandidates.length > 0 ? sourceCandidates : candidates).sort((a, b) => b.modifiedAt - a.modifiedAt);
|
|
292
|
+
if (items.length === 0) {
|
|
293
|
+
throw new Error(`Cannot find ${type}:${name} in ${sourceTool}`);
|
|
294
|
+
}
|
|
295
|
+
const sourceItems = sourceTool === 'waslagenie' ? items.filter((item) => item.tool === items[0].tool) : items;
|
|
296
|
+
const sorted = sourceItems.sort((a, b) => b.modifiedAt - a.modifiedAt);
|
|
297
|
+
const source = type === 'skill'
|
|
298
|
+
? sorted.find((item) => item.relativePath.endsWith(`${sep}SKILL.md`) || item.relativePath === 'SKILL.md') || sorted[0]
|
|
299
|
+
: sorted[0];
|
|
300
|
+
const content = source.content ?? (await readText(source.path));
|
|
301
|
+
const contentHash = this.calculateHash(content);
|
|
302
|
+
let asset = this.registry.findAsset(name, type);
|
|
303
|
+
if (!asset) {
|
|
304
|
+
asset = {
|
|
305
|
+
id: RegistryManager.generateId(),
|
|
306
|
+
name,
|
|
307
|
+
type,
|
|
308
|
+
last_modified_at: source.modifiedAt,
|
|
309
|
+
last_synced_at: new Date().toISOString(),
|
|
310
|
+
stubs: [],
|
|
311
|
+
};
|
|
312
|
+
this.registry.addAsset(asset);
|
|
313
|
+
}
|
|
314
|
+
this.upsertStub(asset, source.tool, source.path, contentHash);
|
|
315
|
+
const adapter = getAdapter(targetTool, this.scope);
|
|
316
|
+
const formatsRecord = adapter.formats;
|
|
317
|
+
if (!adapter.paths[type] || !formatsRecord[type]) {
|
|
318
|
+
throw new Error(`${targetTool} does not support ${type}`);
|
|
319
|
+
}
|
|
320
|
+
const filesToMirror = type === 'skill' && formatsRecord.skill === 'md' ? sourceItems : [source];
|
|
321
|
+
let written = false;
|
|
322
|
+
let primaryTargetPath;
|
|
323
|
+
for (const file of filesToMirror) {
|
|
324
|
+
const targetPath = this.getTargetPath(adapter, type, name, file.relativePath);
|
|
325
|
+
if (!targetPath)
|
|
326
|
+
continue;
|
|
327
|
+
if (file.path === source.path)
|
|
328
|
+
primaryTargetPath = targetPath;
|
|
329
|
+
const fileContent = file.content ?? (file.path === source.path ? content : await readText(file.path));
|
|
330
|
+
written =
|
|
331
|
+
(await this.writeTarget(adapter, asset, type, name, fileContent, targetPath)) || written;
|
|
332
|
+
}
|
|
333
|
+
if (primaryTargetPath) {
|
|
334
|
+
this.upsertStub(asset, targetTool, primaryTargetPath, contentHash);
|
|
335
|
+
}
|
|
336
|
+
await ensureDir(dirname(this.getCanonicalPath(type, name)));
|
|
337
|
+
await writeText(this.getCanonicalPath(type, name), content);
|
|
338
|
+
await this.registry.save();
|
|
339
|
+
return written;
|
|
340
|
+
}
|
|
341
|
+
async detachAssetFromTool(name, type, tool) {
|
|
342
|
+
await this.scanner.initialize();
|
|
343
|
+
try {
|
|
344
|
+
this.registry.get();
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
await this.registry.load();
|
|
348
|
+
}
|
|
349
|
+
const asset = this.registry.findAsset(name, type);
|
|
350
|
+
const discovered = (await this.scanner.scanTool(tool, [type])).find((item) => item.name === name);
|
|
351
|
+
const path = asset?.stubs.find((stub) => stub.tool === tool)?.path ?? discovered?.path;
|
|
352
|
+
if (!path)
|
|
353
|
+
return false;
|
|
354
|
+
const deletableAsset = asset ?? {
|
|
355
|
+
id: RegistryManager.generateId(),
|
|
356
|
+
name,
|
|
357
|
+
type,
|
|
358
|
+
last_modified_at: Date.now(),
|
|
359
|
+
last_synced_at: new Date().toISOString(),
|
|
360
|
+
stubs: [],
|
|
361
|
+
};
|
|
362
|
+
const deleted = await this.deleteStubTarget(deletableAsset, {
|
|
363
|
+
tool,
|
|
364
|
+
path,
|
|
365
|
+
written_at: new Date().toISOString(),
|
|
366
|
+
hash: '',
|
|
367
|
+
});
|
|
368
|
+
if (asset && deleted) {
|
|
369
|
+
asset.stubs = asset.stubs.filter((stub) => stub.tool !== tool);
|
|
370
|
+
await this.registry.save();
|
|
371
|
+
}
|
|
372
|
+
return deleted > 0;
|
|
373
|
+
}
|
|
374
|
+
calculateHash(content) {
|
|
375
|
+
return createHash('sha256').update(content).digest('hex');
|
|
376
|
+
}
|
|
377
|
+
getTargetPath(adapter, type, name, relativePath) {
|
|
378
|
+
const typeDir = adapter.paths[type];
|
|
379
|
+
const format = adapter.formats[type];
|
|
380
|
+
if (!typeDir || !format)
|
|
381
|
+
return undefined;
|
|
382
|
+
if (type === 'context' || type === 'mcp')
|
|
383
|
+
return typeDir;
|
|
384
|
+
if (format === 'agent.md')
|
|
385
|
+
return join(typeDir, `${name}.agent.md`);
|
|
386
|
+
if (format === 'mdc')
|
|
387
|
+
return join(typeDir, `${name}.mdc`);
|
|
388
|
+
if (format === 'instructions.md')
|
|
389
|
+
return join(typeDir, `${name}.instructions.md`);
|
|
390
|
+
if (type === 'skill' && dirname(relativePath) !== '.')
|
|
391
|
+
return join(typeDir, relativePath);
|
|
392
|
+
return join(typeDir, `${name}.${format}`);
|
|
393
|
+
}
|
|
394
|
+
async writeTarget(adapter, asset, type, name, content, targetPath) {
|
|
395
|
+
if (type === 'context') {
|
|
396
|
+
if ((await fileExists(targetPath)) && (await readText(targetPath)) === content) {
|
|
397
|
+
return false;
|
|
398
|
+
}
|
|
399
|
+
await ensureDir(dirname(targetPath));
|
|
400
|
+
await writeText(targetPath, content);
|
|
401
|
+
return true;
|
|
402
|
+
}
|
|
403
|
+
if (type === 'mcp') {
|
|
404
|
+
return this.writeMcpServer(adapter, name, content, targetPath);
|
|
405
|
+
}
|
|
406
|
+
if ((await fileExists(targetPath)) && (await readText(targetPath)) === content) {
|
|
407
|
+
return false;
|
|
408
|
+
}
|
|
409
|
+
await adapter.writeStub(asset, content, targetPath);
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
async writeMcpServer(adapter, name, content, targetPath) {
|
|
413
|
+
const config = (await fileExists(targetPath))
|
|
414
|
+
? await readJSON(targetPath)
|
|
415
|
+
: {};
|
|
416
|
+
let node = config;
|
|
417
|
+
const keys = adapter.mcpKey.split('.');
|
|
418
|
+
for (const key of keys.slice(0, -1)) {
|
|
419
|
+
const child = node[key];
|
|
420
|
+
if (!child || typeof child !== 'object' || Array.isArray(child)) {
|
|
421
|
+
node[key] = {};
|
|
422
|
+
}
|
|
423
|
+
node = node[key];
|
|
424
|
+
}
|
|
425
|
+
const leaf = keys[keys.length - 1];
|
|
426
|
+
const servers = node[leaf] && typeof node[leaf] === 'object' && !Array.isArray(node[leaf])
|
|
427
|
+
? node[leaf]
|
|
428
|
+
: {};
|
|
429
|
+
const nextServer = adapter.mcpToNative(JSON.parse(content));
|
|
430
|
+
if (JSON.stringify(servers[name]) === JSON.stringify(nextServer)) {
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
servers[name] = nextServer;
|
|
434
|
+
node[leaf] = servers;
|
|
435
|
+
await ensureDir(dirname(targetPath));
|
|
436
|
+
await writeJSON(targetPath, config);
|
|
437
|
+
return true;
|
|
438
|
+
}
|
|
439
|
+
upsertStub(asset, tool, path, hash) {
|
|
440
|
+
const existingStub = asset.stubs.find((stub) => stub.tool === tool);
|
|
441
|
+
if (existingStub) {
|
|
442
|
+
existingStub.path = path;
|
|
443
|
+
existingStub.written_at = new Date().toISOString();
|
|
444
|
+
existingStub.hash = hash;
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
asset.stubs.push({
|
|
448
|
+
tool,
|
|
449
|
+
path,
|
|
450
|
+
written_at: new Date().toISOString(),
|
|
451
|
+
hash,
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
async reconcileDeletedAssets(grouped, tools, requiredDeletedTool) {
|
|
455
|
+
let deleted = 0;
|
|
456
|
+
const trackedTools = new Set(tools);
|
|
457
|
+
for (const asset of [...this.registry.get().assets]) {
|
|
458
|
+
const key = `${asset.name}|${asset.type}`;
|
|
459
|
+
const items = grouped[key] || [];
|
|
460
|
+
const trackedStubs = asset.stubs.filter((stub) => trackedTools.has(stub.tool));
|
|
461
|
+
if (trackedStubs.length === 0)
|
|
462
|
+
continue;
|
|
463
|
+
const itemForStub = (stub) => items.find((item) => item.tool === stub.tool && item.path === stub.path);
|
|
464
|
+
const missing = trackedStubs.filter((stub) => !itemForStub(stub));
|
|
465
|
+
if (missing.length === 0)
|
|
466
|
+
continue;
|
|
467
|
+
if (requiredDeletedTool && !missing.some((stub) => stub.tool === requiredDeletedTool)) {
|
|
468
|
+
continue;
|
|
469
|
+
}
|
|
470
|
+
let survivingEdit = false;
|
|
471
|
+
for (const stub of trackedStubs) {
|
|
472
|
+
const item = itemForStub(stub);
|
|
473
|
+
if (!item)
|
|
474
|
+
continue;
|
|
475
|
+
const content = item.content ?? (await readText(item.path));
|
|
476
|
+
if (this.calculateHash(content) !== stub.hash) {
|
|
477
|
+
survivingEdit = true;
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
if (survivingEdit)
|
|
482
|
+
continue;
|
|
483
|
+
for (const stub of asset.stubs) {
|
|
484
|
+
deleted += await this.deleteStubTarget(asset, stub);
|
|
485
|
+
}
|
|
486
|
+
await removePath(this.getCanonicalPath(asset.type, asset.name));
|
|
487
|
+
this.registry.removeAsset(asset.id);
|
|
488
|
+
delete grouped[key];
|
|
489
|
+
}
|
|
490
|
+
return deleted;
|
|
491
|
+
}
|
|
492
|
+
async deleteStubTarget(asset, stub) {
|
|
493
|
+
let adapter;
|
|
494
|
+
try {
|
|
495
|
+
adapter = getAdapter(stub.tool, this.scope);
|
|
496
|
+
}
|
|
497
|
+
catch {
|
|
498
|
+
return 0;
|
|
499
|
+
}
|
|
500
|
+
if (asset.type === 'mcp') {
|
|
501
|
+
if (!(await fileExists(stub.path)))
|
|
502
|
+
return 0;
|
|
503
|
+
const config = await readJSON(stub.path);
|
|
504
|
+
let node = config;
|
|
505
|
+
const keys = adapter.mcpKey.split('.');
|
|
506
|
+
for (const key of keys.slice(0, -1)) {
|
|
507
|
+
const child = node[key];
|
|
508
|
+
if (!child || typeof child !== 'object' || Array.isArray(child))
|
|
509
|
+
return 0;
|
|
510
|
+
node = child;
|
|
511
|
+
}
|
|
512
|
+
const servers = node[keys[keys.length - 1]];
|
|
513
|
+
if (!servers || typeof servers !== 'object' || Array.isArray(servers))
|
|
514
|
+
return 0;
|
|
515
|
+
if (!(asset.name in servers))
|
|
516
|
+
return 0;
|
|
517
|
+
delete servers[asset.name];
|
|
518
|
+
await writeJSON(stub.path, config);
|
|
519
|
+
return 1;
|
|
520
|
+
}
|
|
521
|
+
if (!(await fileExists(stub.path)))
|
|
522
|
+
return 0;
|
|
523
|
+
if (asset.type === 'skill' &&
|
|
524
|
+
adapter.formats.skill === 'md' &&
|
|
525
|
+
basename(stub.path) === 'SKILL.md') {
|
|
526
|
+
await removePath(dirname(stub.path));
|
|
527
|
+
}
|
|
528
|
+
else {
|
|
529
|
+
await removePath(stub.path);
|
|
530
|
+
}
|
|
531
|
+
return 1;
|
|
532
|
+
}
|
|
533
|
+
getCanonicalPath(type, name) {
|
|
534
|
+
const subdir = type === 'agent'
|
|
535
|
+
? 'agents'
|
|
536
|
+
: type === 'skill'
|
|
537
|
+
? 'skills'
|
|
538
|
+
: type === 'context'
|
|
539
|
+
? 'context'
|
|
540
|
+
: 'mcp';
|
|
541
|
+
return join(getRegistryDir(this.scope), subdir, `${name}${type === 'mcp' ? '.json' : '.md'}`);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/syncer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function success(message: string): void;
|
|
2
|
+
export declare function error(message: string): void;
|
|
3
|
+
export declare function info(message: string): void;
|
|
4
|
+
export declare function warning(message: string): void;
|
|
5
|
+
export declare function highlight(message: string): void;
|
|
6
|
+
export declare function step(title: string): void;
|
|
7
|
+
export declare function section(title: string): void;
|
|
8
|
+
export declare function table(rows: string[][], columnWidths?: number[]): void;
|
|
9
|
+
export declare function spacer(): void;
|
|
10
|
+
export declare function bulletPoint(text: string, indent?: number): void;
|
|
11
|
+
export declare function code(text: string): string;
|
|
12
|
+
//# sourceMappingURL=cli-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-output.d.ts","sourceRoot":"","sources":["../../src/utils/cli-output.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAExC;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAcrE;AAED,wBAAgB,MAAM,IAAI,IAAI,CAE7B;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,IAAI,CAG1D;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export function success(message) {
|
|
2
|
+
console.log(`✔ ${message}`);
|
|
3
|
+
}
|
|
4
|
+
export function error(message) {
|
|
5
|
+
console.error(`✗ ${message}`);
|
|
6
|
+
}
|
|
7
|
+
export function info(message) {
|
|
8
|
+
console.log(`ℹ ${message}`);
|
|
9
|
+
}
|
|
10
|
+
export function warning(message) {
|
|
11
|
+
console.log(`⚠ ${message}`);
|
|
12
|
+
}
|
|
13
|
+
export function highlight(message) {
|
|
14
|
+
console.log(`✨ ${message}`);
|
|
15
|
+
}
|
|
16
|
+
export function step(title) {
|
|
17
|
+
console.log(`\n${title}`);
|
|
18
|
+
}
|
|
19
|
+
export function section(title) {
|
|
20
|
+
console.log(`\n🔍 ${title}`);
|
|
21
|
+
}
|
|
22
|
+
export function table(rows, columnWidths) {
|
|
23
|
+
if (rows.length === 0)
|
|
24
|
+
return;
|
|
25
|
+
// Calculate column widths if not provided
|
|
26
|
+
const widths = columnWidths ||
|
|
27
|
+
rows[0].map((_, i) => {
|
|
28
|
+
return Math.max(...rows.map((row) => (row[i] || '').length));
|
|
29
|
+
});
|
|
30
|
+
rows.forEach((row) => {
|
|
31
|
+
const line = row.map((cell, i) => (cell || '').padEnd(widths[i] || 10)).join(' ');
|
|
32
|
+
console.log(line);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export function spacer() {
|
|
36
|
+
console.log('');
|
|
37
|
+
}
|
|
38
|
+
export function bulletPoint(text, indent = 0) {
|
|
39
|
+
const spaces = ' '.repeat(indent);
|
|
40
|
+
console.log(`${spaces}• ${text}`);
|
|
41
|
+
}
|
|
42
|
+
export function code(text) {
|
|
43
|
+
return `\`${text}\``;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=cli-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../../src/utils/cli-output.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,KAAK,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,KAAa;IAChC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAgB,EAAE,YAAuB;IAC7D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE9B,0CAA0C;IAC1C,MAAM,MAAM,GACV,YAAY;QACZ,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACnB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IAEL,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAM,GAAG,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC"}
|