@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.
Files changed (110) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +431 -0
  3. package/dist/adapters/base.d.ts +27 -0
  4. package/dist/adapters/base.d.ts.map +1 -0
  5. package/dist/adapters/base.js +9 -0
  6. package/dist/adapters/base.js.map +1 -0
  7. package/dist/adapters/claude.d.ts +31 -0
  8. package/dist/adapters/claude.d.ts.map +1 -0
  9. package/dist/adapters/claude.js +96 -0
  10. package/dist/adapters/claude.js.map +1 -0
  11. package/dist/adapters/cursor.d.ts +30 -0
  12. package/dist/adapters/cursor.d.ts.map +1 -0
  13. package/dist/adapters/cursor.js +60 -0
  14. package/dist/adapters/cursor.js.map +1 -0
  15. package/dist/adapters/factory.d.ts +5 -0
  16. package/dist/adapters/factory.d.ts.map +1 -0
  17. package/dist/adapters/factory.js +40 -0
  18. package/dist/adapters/factory.js.map +1 -0
  19. package/dist/adapters/gemini.d.ts +31 -0
  20. package/dist/adapters/gemini.d.ts.map +1 -0
  21. package/dist/adapters/gemini.js +99 -0
  22. package/dist/adapters/gemini.js.map +1 -0
  23. package/dist/adapters/github-copilot-cli.d.ts +30 -0
  24. package/dist/adapters/github-copilot-cli.d.ts.map +1 -0
  25. package/dist/adapters/github-copilot-cli.js +65 -0
  26. package/dist/adapters/github-copilot-cli.js.map +1 -0
  27. package/dist/adapters/github-copilot.d.ts +32 -0
  28. package/dist/adapters/github-copilot.d.ts.map +1 -0
  29. package/dist/adapters/github-copilot.js +86 -0
  30. package/dist/adapters/github-copilot.js.map +1 -0
  31. package/dist/adapters/openclaw.d.ts +28 -0
  32. package/dist/adapters/openclaw.d.ts.map +1 -0
  33. package/dist/adapters/openclaw.js +62 -0
  34. package/dist/adapters/openclaw.js.map +1 -0
  35. package/dist/adapters/opencode.d.ts +32 -0
  36. package/dist/adapters/opencode.d.ts.map +1 -0
  37. package/dist/adapters/opencode.js +102 -0
  38. package/dist/adapters/opencode.js.map +1 -0
  39. package/dist/cli/commands/config.d.ts +7 -0
  40. package/dist/cli/commands/config.d.ts.map +1 -0
  41. package/dist/cli/commands/config.js +66 -0
  42. package/dist/cli/commands/config.js.map +1 -0
  43. package/dist/cli/commands/install.d.ts +2 -0
  44. package/dist/cli/commands/install.d.ts.map +1 -0
  45. package/dist/cli/commands/install.js +27 -0
  46. package/dist/cli/commands/install.js.map +1 -0
  47. package/dist/cli/commands/register.d.ts +6 -0
  48. package/dist/cli/commands/register.d.ts.map +1 -0
  49. package/dist/cli/commands/register.js +56 -0
  50. package/dist/cli/commands/register.js.map +1 -0
  51. package/dist/cli/commands/status.d.ts +6 -0
  52. package/dist/cli/commands/status.d.ts.map +1 -0
  53. package/dist/cli/commands/status.js +37 -0
  54. package/dist/cli/commands/status.js.map +1 -0
  55. package/dist/cli/commands/sync-to.d.ts +8 -0
  56. package/dist/cli/commands/sync-to.d.ts.map +1 -0
  57. package/dist/cli/commands/sync-to.js +35 -0
  58. package/dist/cli/commands/sync-to.js.map +1 -0
  59. package/dist/cli/commands/sync.d.ts +6 -0
  60. package/dist/cli/commands/sync.d.ts.map +1 -0
  61. package/dist/cli/commands/sync.js +27 -0
  62. package/dist/cli/commands/sync.js.map +1 -0
  63. package/dist/cli/commands/visualizer.d.ts +11 -0
  64. package/dist/cli/commands/visualizer.d.ts.map +1 -0
  65. package/dist/cli/commands/visualizer.js +241 -0
  66. package/dist/cli/commands/visualizer.js.map +1 -0
  67. package/dist/cli/commands/watch.d.ts +6 -0
  68. package/dist/cli/commands/watch.d.ts.map +1 -0
  69. package/dist/cli/commands/watch.js +86 -0
  70. package/dist/cli/commands/watch.js.map +1 -0
  71. package/dist/cli/index.d.ts +3 -0
  72. package/dist/cli/index.d.ts.map +1 -0
  73. package/dist/cli/index.js +59 -0
  74. package/dist/cli/index.js.map +1 -0
  75. package/dist/core/registry.d.ts +20 -0
  76. package/dist/core/registry.d.ts.map +1 -0
  77. package/dist/core/registry.js +103 -0
  78. package/dist/core/registry.js.map +1 -0
  79. package/dist/core/scanner.d.ts +17 -0
  80. package/dist/core/scanner.d.ts.map +1 -0
  81. package/dist/core/scanner.js +227 -0
  82. package/dist/core/scanner.js.map +1 -0
  83. package/dist/core/types.d.ts +78 -0
  84. package/dist/core/types.d.ts.map +1 -0
  85. package/dist/core/types.js +2 -0
  86. package/dist/core/types.js.map +1 -0
  87. package/dist/core/visualizer-types.d.ts +39 -0
  88. package/dist/core/visualizer-types.d.ts.map +1 -0
  89. package/dist/core/visualizer-types.js +2 -0
  90. package/dist/core/visualizer-types.js.map +1 -0
  91. package/dist/syncer/index.d.ts +31 -0
  92. package/dist/syncer/index.d.ts.map +1 -0
  93. package/dist/syncer/index.js +544 -0
  94. package/dist/syncer/index.js.map +1 -0
  95. package/dist/utils/cli-output.d.ts +12 -0
  96. package/dist/utils/cli-output.d.ts.map +1 -0
  97. package/dist/utils/cli-output.js +45 -0
  98. package/dist/utils/cli-output.js.map +1 -0
  99. package/dist/utils/fs.d.ts +14 -0
  100. package/dist/utils/fs.d.ts.map +1 -0
  101. package/dist/utils/fs.js +74 -0
  102. package/dist/utils/fs.js.map +1 -0
  103. package/dist/utils/paths.d.ts +7 -0
  104. package/dist/utils/paths.d.ts.map +1 -0
  105. package/dist/utils/paths.js +84 -0
  106. package/dist/utils/paths.js.map +1 -0
  107. package/package.json +122 -0
  108. package/src/visualizer/dist/assets/index-BRmeXR7T.js +144 -0
  109. package/src/visualizer/dist/index.html +12 -0
  110. package/src/visualizer/dist/logo.png +0 -0
@@ -0,0 +1,241 @@
1
+ import { createServer } from 'http';
2
+ import { dirname, extname, join, resolve } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import { readFile } from 'fs/promises';
5
+ import { existsSync } from 'fs';
6
+ import { exec } from 'child_process';
7
+ import { WebSocketServer } from 'ws';
8
+ import { Scanner } from '../../core/scanner.js';
9
+ import { RegistryManager } from '../../core/registry.js';
10
+ import { getInstalledAdapters } from '../../adapters/factory.js';
11
+ import { error, highlight, info, section, spacer } from '../../utils/cli-output.js';
12
+ import { Syncer } from '../../syncer/index.js';
13
+ export function resolveVisualizerDist(moduleUrl) {
14
+ return resolve(dirname(fileURLToPath(moduleUrl)), '../../../src/visualizer/dist');
15
+ }
16
+ async function getEntityContent(scope, type, name) {
17
+ const scanner = new Scanner(scope);
18
+ await scanner.initialize();
19
+ const discovered = await scanner.scanAllTools();
20
+ const target = discovered.find((item) => mapType(item.type) === type && item.name === name);
21
+ if (!target)
22
+ return null;
23
+ if (target.content)
24
+ return target.content;
25
+ try {
26
+ return await readFile(target.path, 'utf-8');
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ function mapType(type) {
33
+ if (type === 'context')
34
+ return 'instruction';
35
+ return type;
36
+ }
37
+ function mapEntityType(type) {
38
+ if (type === 'instruction')
39
+ return 'context';
40
+ return type;
41
+ }
42
+ function mimeType(file) {
43
+ const ext = extname(file);
44
+ if (ext === '.html')
45
+ return 'text/html; charset=utf-8';
46
+ if (ext === '.js')
47
+ return 'application/javascript; charset=utf-8';
48
+ if (ext === '.css')
49
+ return 'text/css; charset=utf-8';
50
+ if (ext === '.json')
51
+ return 'application/json; charset=utf-8';
52
+ if (ext === '.svg')
53
+ return 'image/svg+xml';
54
+ if (ext === '.png')
55
+ return 'image/png';
56
+ if (ext === '.ico')
57
+ return 'image/x-icon';
58
+ return 'text/plain; charset=utf-8';
59
+ }
60
+ function openBrowser(url) {
61
+ const platform = process.platform;
62
+ if (platform === 'darwin') {
63
+ exec(`open "${url}"`);
64
+ return;
65
+ }
66
+ if (platform === 'win32') {
67
+ exec(`start "" "${url}"`);
68
+ return;
69
+ }
70
+ exec(`xdg-open "${url}"`);
71
+ }
72
+ export const PROVIDER_ICONS = {
73
+ waslagenie: '/logo.png',
74
+ claude: 'https://cdn.simpleicons.org/claude',
75
+ gemini: 'https://cdn.simpleicons.org/googlegemini',
76
+ cursor: 'https://cdn.simpleicons.org/cursor',
77
+ opencode: 'https://cdn.simpleicons.org/openai',
78
+ openclaw: 'https://cdn.simpleicons.org/anthropic',
79
+ 'github-copilot': 'https://cdn.simpleicons.org/githubcopilot',
80
+ 'github-copilot-cli': 'https://cdn.simpleicons.org/github',
81
+ };
82
+ async function buildConfig(scope) {
83
+ const scanner = new Scanner(scope);
84
+ await scanner.initialize();
85
+ const discovered = await scanner.scanAllTools();
86
+ const installed = await getInstalledAdapters(scope);
87
+ const providers = [
88
+ { id: 'waslagenie', title: 'WaslaGenie', iconUrl: PROVIDER_ICONS.waslagenie, isHub: true },
89
+ ...installed.map((adapter) => ({
90
+ id: adapter.name,
91
+ title: adapter.displayName,
92
+ iconUrl: PROVIDER_ICONS[adapter.name],
93
+ })),
94
+ ];
95
+ const entityMap = new Map();
96
+ for (const file of discovered) {
97
+ const type = mapType(file.type);
98
+ const id = `${type}:${file.name}`;
99
+ if (!entityMap.has(id)) {
100
+ entityMap.set(id, { id, name: file.name, type });
101
+ }
102
+ }
103
+ const entities = Array.from(entityMap.values());
104
+ const grouped = {
105
+ instructions: entities.filter((e) => e.type === 'instruction'),
106
+ agents: entities.filter((e) => e.type === 'agent'),
107
+ skills: entities.filter((e) => e.type === 'skill'),
108
+ mcps: entities.filter((e) => e.type === 'mcp'),
109
+ };
110
+ const registry = new RegistryManager(scope);
111
+ await registry.load();
112
+ const reg = registry.get();
113
+ const connectionMap = new Map();
114
+ const addConnection = (entityId, providerId) => {
115
+ connectionMap.set(`${entityId}|${providerId}`, { entityId, providerId });
116
+ };
117
+ for (const file of discovered) {
118
+ addConnection(`${mapType(file.type)}:${file.name}`, file.tool);
119
+ }
120
+ for (const asset of reg.assets) {
121
+ const entityType = mapType(asset.type);
122
+ const entityId = `${entityType}:${asset.name}`;
123
+ for (const stub of asset.stubs) {
124
+ addConnection(entityId, stub.tool);
125
+ }
126
+ }
127
+ return {
128
+ providers,
129
+ entities: grouped,
130
+ connections: Array.from(connectionMap.values()),
131
+ websocketUrl: '',
132
+ };
133
+ }
134
+ function sendJson(res, statusCode, body) {
135
+ const text = JSON.stringify(body);
136
+ res.writeHead(statusCode, { 'Content-Type': 'application/json; charset=utf-8' });
137
+ res.end(text);
138
+ }
139
+ export async function visualizerCommand(options) {
140
+ try {
141
+ const scope = (options.scope || 'workspace');
142
+ const host = options.host || '127.0.0.1';
143
+ const port = Number(options.port || 4072);
144
+ const shouldOpen = options.noOpen !== true;
145
+ section('Starting visualizer...');
146
+ spacer();
147
+ const visualizerDist = resolveVisualizerDist(import.meta.url);
148
+ if (!existsSync(visualizerDist)) {
149
+ error('Visualizer assets not found. Build first with: npm run visualizer:build');
150
+ process.exit(1);
151
+ }
152
+ const registry = new RegistryManager(scope);
153
+ await registry.load();
154
+ const scanner = new Scanner(scope);
155
+ const syncer = new Syncer(registry, scanner, scope);
156
+ const shutdown = () => {
157
+ wss.close();
158
+ server.close();
159
+ setTimeout(() => process.exit(0), 100).unref();
160
+ };
161
+ const server = createServer(async (req, res) => {
162
+ const url = req.url || '/';
163
+ if (req.method === 'GET' && url === '/api/config') {
164
+ const freshConfig = await buildConfig(scope);
165
+ freshConfig.websocketUrl = `ws://${host}:${port}`;
166
+ sendJson(res, 200, freshConfig);
167
+ return;
168
+ }
169
+ if (req.method === 'GET' && url.startsWith('/api/entity-content')) {
170
+ const parsed = new URL(`http://${host}:${port}${url}`);
171
+ const type = parsed.searchParams.get('type');
172
+ const name = parsed.searchParams.get('name');
173
+ if (!type || !name) {
174
+ sendJson(res, 400, { error: 'type and name are required' });
175
+ return;
176
+ }
177
+ const content = await getEntityContent(scope, type, name);
178
+ sendJson(res, 200, { content: content ?? '' });
179
+ return;
180
+ }
181
+ if (req.method === 'POST' && url === '/api/shutdown') {
182
+ sendJson(res, 200, { ok: true });
183
+ setTimeout(shutdown, 50);
184
+ return;
185
+ }
186
+ if (url === '/' || url === '/index.html') {
187
+ const html = await readFile(join(visualizerDist, 'index.html'));
188
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
189
+ res.end(html);
190
+ return;
191
+ }
192
+ const staticPath = join(visualizerDist, url.replace(/^\//, ''));
193
+ if (!staticPath.startsWith(visualizerDist) || !existsSync(staticPath)) {
194
+ res.writeHead(404);
195
+ res.end('Not Found');
196
+ return;
197
+ }
198
+ const payload = await readFile(staticPath);
199
+ res.writeHead(200, { 'Content-Type': mimeType(staticPath) });
200
+ res.end(payload);
201
+ });
202
+ const wss = new WebSocketServer({ server });
203
+ wss.on('connection', (socket) => {
204
+ socket.on('message', async (raw) => {
205
+ try {
206
+ const data = JSON.parse(raw.toString());
207
+ if (data.type !== 'CONNECTION_CHANGED' || !data.payload)
208
+ return;
209
+ const { sourceEntity, entityType, sourceProvider, targetProvider, action } = data.payload;
210
+ if (!sourceEntity || !entityType || !sourceProvider || !targetProvider || !action) {
211
+ return;
212
+ }
213
+ info(`[Visualizer] ${action} ${entityType}:${sourceEntity} ${action === 'ATTACH' ? 'to' : 'from'} ${targetProvider}`);
214
+ if (action === 'ATTACH') {
215
+ await syncer.attachAssetToTool(sourceEntity, mapEntityType(entityType), sourceProvider, targetProvider);
216
+ }
217
+ else {
218
+ await syncer.detachAssetFromTool(sourceEntity, mapEntityType(entityType), targetProvider);
219
+ }
220
+ }
221
+ catch {
222
+ // Ignore invalid websocket messages from the client.
223
+ }
224
+ });
225
+ });
226
+ server.listen(port, host, () => {
227
+ const url = `http://${host}:${port}`;
228
+ highlight(`Visualizer available at ${url}`);
229
+ console.log(' Press Ctrl+C to stop');
230
+ if (shouldOpen) {
231
+ openBrowser(url);
232
+ }
233
+ });
234
+ process.once('SIGINT', shutdown);
235
+ }
236
+ catch (err) {
237
+ error(`Visualizer failed: ${err}`);
238
+ process.exit(1);
239
+ }
240
+ }
241
+ //# sourceMappingURL=visualizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualizer.js","sourceRoot":"","sources":["../../../src/cli/commands/visualizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface WatchOptions {
2
+ scope?: string;
3
+ }
4
+ export declare function watchCommand(options: WatchOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAOA,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4FvE"}
@@ -0,0 +1,86 @@
1
+ import chokidar from 'chokidar';
2
+ import { RegistryManager } from '../../core/registry.js';
3
+ import { Scanner } from '../../core/scanner.js';
4
+ import { Syncer } from '../../syncer/index.js';
5
+ import { getAllAdapters } from '../../adapters/factory.js';
6
+ import { section, success, error, info, spacer } from '../../utils/cli-output.js';
7
+ export async function watchCommand(options) {
8
+ try {
9
+ const scope = (options.scope || 'workspace');
10
+ section('Watching for changes...');
11
+ spacer();
12
+ const registry = new RegistryManager(scope);
13
+ await registry.load();
14
+ const scanner = new Scanner(scope);
15
+ const syncer = new Syncer(registry, scanner, scope);
16
+ const watchDirs = [
17
+ ...new Set(getAllAdapters(scope).flatMap((adapter) => Object.values(adapter.paths).filter((path) => Boolean(path)))),
18
+ ];
19
+ info(`Watching: ${watchDirs.join(', ')}`);
20
+ spacer();
21
+ // Create watcher
22
+ const watcher = chokidar.watch(watchDirs, {
23
+ ignored: [
24
+ /(^|[\/\\])node_modules([\/\\]|$)/,
25
+ /(^|[\/\\])\.git([\/\\]|$)/,
26
+ /(^|[\/\\])\.waslagenie([\/\\]|$)/,
27
+ /(^|[\/\\])dist([\/\\]|$)/,
28
+ /(^|[\/\\])output([\/\\]|$)/,
29
+ ],
30
+ persistent: true,
31
+ awaitWriteFinish: {
32
+ stabilityThreshold: 1000,
33
+ pollInterval: 100,
34
+ },
35
+ });
36
+ let isRunningSync = false;
37
+ let pendingSync = false;
38
+ const performSync = async () => {
39
+ if (isRunningSync) {
40
+ pendingSync = true;
41
+ return;
42
+ }
43
+ isRunningSync = true;
44
+ try {
45
+ do {
46
+ pendingSync = false;
47
+ const result = await syncer.sync(false);
48
+ const now = new Date().toLocaleTimeString();
49
+ console.log(`[${now}] Synced: ${result.stubsWritten} written, ${result.stubsDeleted} deleted`);
50
+ } while (pendingSync);
51
+ }
52
+ catch (err) {
53
+ error(`Sync failed: ${err}`);
54
+ }
55
+ finally {
56
+ isRunningSync = false;
57
+ }
58
+ };
59
+ watcher
60
+ .on('add', (path) => {
61
+ console.log(`[added] ${path}`);
62
+ performSync();
63
+ })
64
+ .on('change', (path) => {
65
+ console.log(`[changed] ${path}`);
66
+ performSync();
67
+ })
68
+ .on('unlink', (path) => {
69
+ console.log(`[deleted] ${path}`);
70
+ performSync();
71
+ });
72
+ // Handle graceful shutdown
73
+ process.on('SIGINT', async () => {
74
+ console.log('\n');
75
+ info('Stopping watcher...');
76
+ await watcher.close();
77
+ success('Watcher stopped');
78
+ process.exit(0);
79
+ });
80
+ }
81
+ catch (err) {
82
+ error(`Watch failed: ${err}`);
83
+ process.exit(1);
84
+ }
85
+ }
86
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { installCommand } from './commands/install.js';
4
+ import { registerCommand } from './commands/register.js';
5
+ import { syncCommand } from './commands/sync.js';
6
+ import { syncToCommand } from './commands/sync-to.js';
7
+ import { statusCommand } from './commands/status.js';
8
+ import { configCommand } from './commands/config.js';
9
+ import { watchCommand } from './commands/watch.js';
10
+ import { visualizerCommand } from './commands/visualizer.js';
11
+ const program = new Command();
12
+ program
13
+ .name('waslagenie')
14
+ .description('Universal synchronization layer for AI agent orchestrators')
15
+ .version('0.1.0');
16
+ program.addCommand(new Command('install').description('Prepare WaslaGenie CLI state').action(installCommand));
17
+ program.addCommand(new Command('register')
18
+ .option('--to <targets>', 'Target provider(s), comma-separated. Example: claude,gemini')
19
+ .description('Register WaslaGenie helper skills inside installed AI tools')
20
+ .action((options) => registerCommand(options)));
21
+ program.addCommand(new Command('sync')
22
+ .option('--scope <scope>', 'user or workspace', 'workspace')
23
+ .description('Scan and sync agents/MCPs across tools')
24
+ .action((options) => syncCommand(options)));
25
+ program.addCommand(new Command('sync-to')
26
+ .option('--from <source>', 'Source tool (gemini, claude, etc.)')
27
+ .option('--to <targets>', 'Target tool(s), comma-separated')
28
+ .option('--scope <scope>', 'user or workspace', 'workspace')
29
+ .description('Sync agents/MCPs from one tool to specific target(s)')
30
+ .action((options) => syncToCommand(options)));
31
+ program.addCommand(new Command('status')
32
+ .option('--scope <scope>', 'user or workspace', 'workspace')
33
+ .description('Show all discovered assets and their sync state')
34
+ .action((options) => statusCommand(options)));
35
+ program.addCommand(new Command('config')
36
+ .option('--scope <scope>', 'Set scope to user or workspace')
37
+ .option('--show', 'Show current config')
38
+ .description('Configure WaslaGenie settings')
39
+ .action((options) => configCommand(options)));
40
+ program.addCommand(new Command('watch')
41
+ .option('--scope <scope>', 'user or workspace', 'workspace')
42
+ .description('Watch for changes and auto-sync')
43
+ .action((options) => watchCommand(options)));
44
+ program.addCommand(new Command('visualizer')
45
+ .option('--scope <scope>', 'user or workspace', 'workspace')
46
+ .option('--host <host>', 'Host to bind', '127.0.0.1')
47
+ .option('--port <port>', 'Port to bind', '4072')
48
+ .option('--no-open', 'Do not open browser automatically')
49
+ .description('Open interactive sync visualizer with built-in backend')
50
+ .action((options) => visualizerCommand(options)));
51
+ program.addCommand(new Command('ui')
52
+ .option('--scope <scope>', 'user or workspace', 'workspace')
53
+ .option('--host <host>', 'Host to bind', '127.0.0.1')
54
+ .option('--port <port>', 'Port to bind', '4072')
55
+ .option('--no-open', 'Do not open browser automatically')
56
+ .description('Alias for `visualizer`')
57
+ .action((options) => visualizerCommand(options)));
58
+ program.parse(process.argv);
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Registry, Asset, Conflict } from '../core/types.js';
2
+ export declare class RegistryManager {
3
+ private scope;
4
+ private registry;
5
+ constructor(scope?: 'user' | 'workspace');
6
+ load(): Promise<Registry>;
7
+ save(): Promise<void>;
8
+ get(): Registry;
9
+ findAsset(name: string, type: string): Asset | undefined;
10
+ addAsset(asset: Asset): void;
11
+ updateAsset(id: string, updates: Partial<Asset>): void;
12
+ removeAsset(id: string): void;
13
+ findConflict(assetName: string, type: string): Conflict | undefined;
14
+ addConflict(conflict: Conflict): void;
15
+ removeConflict(assetName: string, type: string): void;
16
+ setScope(scope: 'user' | 'workspace'): void;
17
+ static generateId(): string;
18
+ private createDefaultRegistry;
19
+ }
20
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAK7D,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,KAAK,GAAE,MAAM,GAAG,WAAyB;IAI/C,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC;IAiBzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,GAAG,IAAI,QAAQ;IAOf,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAKxD,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAO5B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI;IAUtD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAO7B,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAKnE,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAOrC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IASrD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAO3C,MAAM,CAAC,UAAU,IAAI,MAAM;IAI3B,OAAO,CAAC,qBAAqB;CAU9B"}
@@ -0,0 +1,103 @@
1
+ import { readJSON, writeJSON, fileExists, ensureDir } from '../utils/fs.js';
2
+ import { getRegistryPath, getRegistryDir } from '../utils/paths.js';
3
+ import { randomUUID } from 'crypto';
4
+ export class RegistryManager {
5
+ constructor(scope = 'workspace') {
6
+ this.registry = null;
7
+ this.scope = scope;
8
+ }
9
+ async load() {
10
+ const path = getRegistryPath(this.scope);
11
+ if (await fileExists(path)) {
12
+ try {
13
+ this.registry = await readJSON(path);
14
+ }
15
+ catch (err) {
16
+ // If file is empty or invalid, fallback to empty registry
17
+ this.registry = this.createDefaultRegistry();
18
+ }
19
+ }
20
+ else {
21
+ this.registry = this.createDefaultRegistry();
22
+ }
23
+ return this.registry;
24
+ }
25
+ async save() {
26
+ if (!this.registry) {
27
+ throw new Error('Registry not loaded');
28
+ }
29
+ const dir = getRegistryDir(this.scope);
30
+ await ensureDir(dir);
31
+ const path = getRegistryPath(this.scope);
32
+ await writeJSON(path, this.registry);
33
+ }
34
+ get() {
35
+ if (!this.registry) {
36
+ throw new Error('Registry not loaded');
37
+ }
38
+ return this.registry;
39
+ }
40
+ findAsset(name, type) {
41
+ if (!this.registry)
42
+ return undefined;
43
+ return this.registry.assets.find((a) => a.name === name && a.type === type);
44
+ }
45
+ addAsset(asset) {
46
+ if (!this.registry) {
47
+ throw new Error('Registry not loaded');
48
+ }
49
+ this.registry.assets.push(asset);
50
+ }
51
+ updateAsset(id, updates) {
52
+ if (!this.registry) {
53
+ throw new Error('Registry not loaded');
54
+ }
55
+ const asset = this.registry.assets.find((a) => a.id === id);
56
+ if (asset) {
57
+ Object.assign(asset, updates);
58
+ }
59
+ }
60
+ removeAsset(id) {
61
+ if (!this.registry) {
62
+ throw new Error('Registry not loaded');
63
+ }
64
+ this.registry.assets = this.registry.assets.filter((a) => a.id !== id);
65
+ }
66
+ findConflict(assetName, type) {
67
+ if (!this.registry)
68
+ return undefined;
69
+ return this.registry.conflicts.find((c) => c.asset_name === assetName && c.type === type);
70
+ }
71
+ addConflict(conflict) {
72
+ if (!this.registry) {
73
+ throw new Error('Registry not loaded');
74
+ }
75
+ this.registry.conflicts.push(conflict);
76
+ }
77
+ removeConflict(assetName, type) {
78
+ if (!this.registry) {
79
+ throw new Error('Registry not loaded');
80
+ }
81
+ this.registry.conflicts = this.registry.conflicts.filter((c) => !(c.asset_name === assetName && c.type === type));
82
+ }
83
+ setScope(scope) {
84
+ this.scope = scope;
85
+ if (this.registry) {
86
+ this.registry.config.scope = scope;
87
+ }
88
+ }
89
+ static generateId() {
90
+ return randomUUID();
91
+ }
92
+ createDefaultRegistry() {
93
+ return {
94
+ assets: [],
95
+ conflicts: [],
96
+ config: {
97
+ scope: this.scope,
98
+ version: '0.1.0',
99
+ },
100
+ };
101
+ }
102
+ }
103
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { AssetType, DiscoveredFile, Conflict } from '../core/types.js';
2
+ export declare class Scanner {
3
+ private scope;
4
+ private stubPaths;
5
+ private stubTypes;
6
+ constructor(scope?: 'user' | 'workspace');
7
+ initialize(): Promise<void>;
8
+ detectInstalledTools(): Promise<string[]>;
9
+ scanTool(toolName: string, assetTypes: AssetType[]): Promise<DiscoveredFile[]>;
10
+ private recursivelyFindFiles;
11
+ scanAllTools(assetTypes?: AssetType[]): Promise<DiscoveredFile[]>;
12
+ detectConflicts(discovered: DiscoveredFile[]): Promise<Conflict[]>;
13
+ private groupByNameAndType;
14
+ private extractAssetName;
15
+ private readNestedRecord;
16
+ }
17
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAmBvE,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,SAAS,CAA0C;gBAE/C,KAAK,GAAE,MAAM,GAAG,WAAyB;IAI/C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B,oBAAoB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAczC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAyHtE,oBAAoB;IA0B5B,YAAY,CAChB,UAAU,GAAE,SAAS,EAAyC,GAC7D,OAAO,CAAC,cAAc,EAAE,CAAC;IAYtB,eAAe,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA6BxE,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,gBAAgB;CAezB"}