@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,227 @@
1
+ import { fileExists, isDirectory, readJSON } from '../utils/fs.js';
2
+ import { join, relative, sep } from 'path';
3
+ import { getToolMarkers, getRegistryPath } from '../utils/paths.js';
4
+ import { stat, readdir } from 'fs/promises';
5
+ import { getAdapter } from '../adapters/factory.js';
6
+ export class Scanner {
7
+ constructor(scope = 'workspace') {
8
+ this.stubPaths = new Set();
9
+ this.stubTypes = new Map();
10
+ this.scope = scope;
11
+ }
12
+ async initialize() {
13
+ // Load registry to know which files are stubs
14
+ try {
15
+ const registryPath = getRegistryPath(this.scope);
16
+ const registry = await readJSON(registryPath);
17
+ for (const asset of registry.assets) {
18
+ for (const stub of asset.stubs) {
19
+ this.stubPaths.add(stub.path);
20
+ const types = this.stubTypes.get(stub.path) || new Set();
21
+ types.add(asset.type);
22
+ this.stubTypes.set(stub.path, types);
23
+ }
24
+ }
25
+ }
26
+ catch {
27
+ // If no registry exists yet, that's fine - no stubs known yet
28
+ }
29
+ }
30
+ async detectInstalledTools() {
31
+ const markers = getToolMarkers(this.scope);
32
+ const installed = [];
33
+ for (const toolName of Object.keys(markers)) {
34
+ const adapter = getAdapter(toolName, this.scope);
35
+ if (await adapter.isInstalled()) {
36
+ installed.push(toolName);
37
+ }
38
+ }
39
+ return installed;
40
+ }
41
+ async scanTool(toolName, assetTypes) {
42
+ const markers = getToolMarkers(this.scope);
43
+ const toolPath = markers[toolName];
44
+ if (!toolPath) {
45
+ throw new Error(`Unknown tool: ${toolName}`);
46
+ }
47
+ const adapter = getAdapter(toolName, this.scope);
48
+ const discovered = [];
49
+ for (const type of assetTypes) {
50
+ const typePathRecord = adapter.paths;
51
+ const typePath = typePathRecord[type];
52
+ if (type === 'context') {
53
+ let sourcePath = typePath;
54
+ if (sourcePath && !(await fileExists(sourcePath)) && this.scope === 'workspace') {
55
+ const legacyPath = join(toolPath, adapter.contextFile);
56
+ if (await fileExists(legacyPath)) {
57
+ sourcePath = legacyPath;
58
+ }
59
+ }
60
+ if (!sourcePath || !(await fileExists(sourcePath))) {
61
+ continue;
62
+ }
63
+ const stats = await stat(sourcePath);
64
+ discovered.push({
65
+ path: sourcePath,
66
+ relativePath: adapter.contextFile,
67
+ isStub: this.stubPaths.has(sourcePath),
68
+ tool: toolName,
69
+ type,
70
+ name: 'context',
71
+ modifiedAt: stats.mtimeMs,
72
+ });
73
+ continue;
74
+ }
75
+ if (type === 'mcp' && typePath?.endsWith('.json') && (await fileExists(typePath))) {
76
+ const config = await readJSON(typePath);
77
+ const servers = this.readNestedRecord(config, adapter.mcpKey);
78
+ const stats = await stat(typePath);
79
+ for (const [name, server] of Object.entries(servers)) {
80
+ discovered.push({
81
+ path: typePath,
82
+ relativePath: `${name}.json`,
83
+ isStub: this.stubPaths.has(typePath),
84
+ tool: toolName,
85
+ type,
86
+ name,
87
+ modifiedAt: stats.mtimeMs,
88
+ content: JSON.stringify(adapter.mcpFromNative(server), null, 2),
89
+ });
90
+ }
91
+ continue;
92
+ }
93
+ if (!typePath || !(await isDirectory(typePath))) {
94
+ if (process.env.DEBUG_SCANNER) {
95
+ console.log(`[Scanner] Skipping ${type} for ${toolName}: typePath=${typePath}, isDir=${typePath ? await isDirectory(typePath) : 'N/A'}`);
96
+ }
97
+ continue;
98
+ }
99
+ // Recursively find all files in the directory tree
100
+ const files = await this.recursivelyFindFiles(typePath);
101
+ if (process.env.DEBUG_SCANNER) {
102
+ console.log(`[Scanner] Found ${files.length} files for ${type} at ${typePath}`);
103
+ }
104
+ for (const filePath of files) {
105
+ const isStub = this.stubPaths.has(filePath);
106
+ const trackedTypes = this.stubTypes.get(filePath);
107
+ if (isStub && trackedTypes && !trackedTypes.has(type)) {
108
+ continue;
109
+ }
110
+ // Compute relative path from typePath
111
+ const relativePath = relative(typePath, filePath);
112
+ const name = this.extractAssetName(relativePath);
113
+ if (process.env.DEBUG_SCANNER) {
114
+ console.log(`[Scanner] Processing: path=${filePath}, rel=${relativePath}, name=${name}, isStub=${isStub}`);
115
+ }
116
+ if (name.toLowerCase() === 'waslagenie') {
117
+ if (process.env.DEBUG_SCANNER) {
118
+ console.log(`[Scanner] Skipping waslagenie asset`);
119
+ }
120
+ continue;
121
+ }
122
+ const stats = await stat(filePath);
123
+ discovered.push({
124
+ path: filePath,
125
+ relativePath,
126
+ isStub,
127
+ tool: toolName,
128
+ type,
129
+ name,
130
+ modifiedAt: stats.mtimeMs,
131
+ });
132
+ }
133
+ }
134
+ return discovered;
135
+ }
136
+ async recursivelyFindFiles(dirPath) {
137
+ const files = [];
138
+ try {
139
+ const entries = await readdir(dirPath, { withFileTypes: true });
140
+ for (const entry of entries) {
141
+ const fullPath = join(dirPath, entry.name);
142
+ if (entry.isDirectory()) {
143
+ // Recursively search subdirectories
144
+ const subFiles = await this.recursivelyFindFiles(fullPath);
145
+ files.push(...subFiles);
146
+ }
147
+ else if (entry.isFile()) {
148
+ // Include all files
149
+ files.push(fullPath);
150
+ }
151
+ }
152
+ }
153
+ catch {
154
+ // If directory doesn't exist or can't be read, return empty
155
+ return [];
156
+ }
157
+ return files;
158
+ }
159
+ async scanAllTools(assetTypes = ['agent', 'skill', 'mcp', 'context']) {
160
+ const tools = await this.detectInstalledTools();
161
+ const allDiscovered = [];
162
+ for (const tool of tools) {
163
+ const discovered = await this.scanTool(tool, assetTypes);
164
+ allDiscovered.push(...discovered);
165
+ }
166
+ return allDiscovered;
167
+ }
168
+ async detectConflicts(discovered) {
169
+ const conflicts = [];
170
+ const grouped = this.groupByNameAndType(discovered);
171
+ for (const key of Object.keys(grouped)) {
172
+ const items = grouped[key];
173
+ const originals = items.filter((item) => !item.isStub);
174
+ // Only report conflict if we have 2+ originals (not counting stubs)
175
+ if (originals.length > 1) {
176
+ const [name, type] = key.split('|');
177
+ // Sort by modification time - latest first
178
+ const sorted = originals.sort((a, b) => b.modifiedAt - a.modifiedAt);
179
+ conflicts.push({
180
+ asset_name: name,
181
+ type,
182
+ versions: sorted.map((o) => ({
183
+ tool: o.tool,
184
+ path: o.path,
185
+ modified_at: o.modifiedAt,
186
+ })),
187
+ });
188
+ }
189
+ }
190
+ return conflicts;
191
+ }
192
+ groupByNameAndType(discovered) {
193
+ const grouped = {};
194
+ for (const item of discovered) {
195
+ const key = `${item.name}|${item.type}`;
196
+ if (!grouped[key]) {
197
+ grouped[key] = [];
198
+ }
199
+ grouped[key].push(item);
200
+ }
201
+ return grouped;
202
+ }
203
+ extractAssetName(relativePathOrFileName) {
204
+ // For nested paths: waslagenie/SKILL.md -> waslagenie
205
+ // For flat files: researcher.md -> researcher
206
+ const parts = relativePathOrFileName.split(sep);
207
+ if (parts.length > 1) {
208
+ // Nested: return first directory
209
+ return parts[0];
210
+ }
211
+ // Flat: remove extension
212
+ return parts[0].split('.')[0];
213
+ }
214
+ readNestedRecord(config, keyPath) {
215
+ let value = config;
216
+ for (const key of keyPath.split('.')) {
217
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
218
+ return {};
219
+ }
220
+ value = value[key];
221
+ }
222
+ return value && typeof value === 'object' && !Array.isArray(value)
223
+ ? value
224
+ : {};
225
+ }
226
+ }
227
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAcpD,MAAM,OAAO,OAAO;IAKlB,YAAY,QAA8B,WAAW;QAH7C,cAAS,GAAgB,IAAI,GAAG,EAAE,CAAC;QACnC,cAAS,GAAgC,IAAI,GAAG,EAAE,CAAC;QAGzD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,8CAA8C;QAC9C,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAW,YAAY,CAAC,CAAC;YAExD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAa,CAAC;oBACpE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACtB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACjD,IAAI,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;gBAChC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,UAAuB;QACtD,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,cAAc,GAAG,OAAO,CAAC,KAA8C,CAAC;YAC9E,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YAEtC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,UAAU,GAAG,QAAQ,CAAC;gBAC1B,IAAI,UAAU,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;oBAChF,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;oBACvD,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;wBACjC,UAAU,GAAG,UAAU,CAAC;oBAC1B,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;oBACnD,SAAS;gBACX,CAAC;gBAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;gBACrC,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,UAAU;oBAChB,YAAY,EAAE,OAAO,CAAC,WAAW;oBACjC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;oBACtC,IAAI,EAAE,QAAQ;oBACd,IAAI;oBACJ,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE,KAAK,CAAC,OAAO;iBAC1B,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,IAAI,IAAI,KAAK,KAAK,IAAI,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAClF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAA0B,QAAQ,CAAC,CAAC;gBACjE,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC9D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEnC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACrD,UAAU,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,QAAQ;wBACd,YAAY,EAAE,GAAG,IAAI,OAAO;wBAC5B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;wBACpC,IAAI,EAAE,QAAQ;wBACd,IAAI;wBACJ,IAAI;wBACJ,UAAU,EAAE,KAAK,CAAC,OAAO;wBACzB,OAAO,EAAE,IAAI,CAAC,SAAS,CACrB,OAAO,CAAC,aAAa,CAAC,MAAiC,CAAC,EACxD,IAAI,EACJ,CAAC,CACF;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAChD,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;oBAC9B,OAAO,CAAC,GAAG,CACT,sBAAsB,IAAI,QAAQ,QAAQ,cAAc,QAAQ,WAAW,QAAQ,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAC5H,CAAC;gBACJ,CAAC;gBACD,SAAS;YACX,CAAC;YAED,mDAAmD;YACnD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YACxD,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,MAAM,cAAc,IAAI,OAAO,QAAQ,EAAE,CAAC,CAAC;YAClF,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAClD,IAAI,MAAM,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtD,SAAS;gBACX,CAAC;gBAED,sCAAsC;gBACtC,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAClD,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAEjD,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;oBAC9B,OAAO,CAAC,GAAG,CACT,8BAA8B,QAAQ,SAAS,YAAY,UAAU,IAAI,YAAY,MAAM,EAAE,CAC9F,CAAC;gBACJ,CAAC;gBAED,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,YAAY,EAAE,CAAC;oBACxC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;wBAC9B,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;oBACrD,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEnC,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,QAAQ;oBACd,YAAY;oBACZ,MAAM;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI;oBACJ,IAAI;oBACJ,UAAU,EAAE,KAAK,CAAC,OAAO;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,OAAe;QAChD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAEhE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAE3C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,oCAAoC;oBACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;oBAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAC1B,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC1B,oBAAoB;oBACpB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4DAA4D;YAC5D,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,aAA0B,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC;QAE9D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChD,MAAM,aAAa,GAAqB,EAAE,CAAC;QAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACzD,aAAa,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,UAA4B;QAChD,MAAM,SAAS,GAAe,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAEpD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEvD,oEAAoE;YACpE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;gBAC3D,2CAA2C;gBAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;gBAErE,SAAS,CAAC,IAAI,CAAC;oBACb,UAAU,EAAE,IAAI;oBAChB,IAAI;oBACJ,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,WAAW,EAAE,CAAC,CAAC,UAAU;qBAC1B,CAAC,CAAC;iBACJ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,kBAAkB,CAAC,UAA4B;QACrD,MAAM,OAAO,GAAqC,EAAE,CAAC;QAErD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACpB,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,gBAAgB,CAAC,sBAA8B;QACrD,sDAAsD;QACtD,8CAA8C;QAC9C,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,iCAAiC;YACjC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,yBAAyB;QACzB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAEO,gBAAgB,CACtB,MAA+B,EAC/B,OAAe;QAEf,IAAI,KAAK,GAAY,MAAM,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChE,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,KAAK,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAChE,CAAC,CAAE,KAAiC;YACpC,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;CACF"}
@@ -0,0 +1,78 @@
1
+ export type AssetType = 'agent' | 'skill' | 'mcp' | 'context';
2
+ export type AssetFormat = 'md' | 'yaml' | 'json' | 'mdc' | 'agent.md' | 'instructions.md';
3
+ export interface Asset {
4
+ id: string;
5
+ name: string;
6
+ type: AssetType;
7
+ last_modified_at: number;
8
+ last_synced_at: string;
9
+ stubs: Stub[];
10
+ }
11
+ export interface Stub {
12
+ tool: string;
13
+ path: string;
14
+ written_at: string;
15
+ hash: string;
16
+ }
17
+ export interface Conflict {
18
+ asset_name: string;
19
+ type: AssetType;
20
+ versions: {
21
+ tool: string;
22
+ path: string;
23
+ modified_at: number;
24
+ }[];
25
+ resolved_tool?: string;
26
+ }
27
+ export interface Registry {
28
+ assets: Asset[];
29
+ conflicts: Conflict[];
30
+ config: {
31
+ scope: 'user' | 'workspace';
32
+ version: string;
33
+ };
34
+ }
35
+ export interface WaslaGenieAdapter {
36
+ name: string;
37
+ displayName: string;
38
+ paths: {
39
+ agent?: string;
40
+ skill?: string;
41
+ mcp?: string;
42
+ context?: string;
43
+ };
44
+ mcpKey: string;
45
+ contextFile: string;
46
+ skillDirs: string[];
47
+ formats: {
48
+ agent?: AssetFormat;
49
+ skill?: AssetFormat;
50
+ mcp?: AssetFormat;
51
+ context?: AssetFormat;
52
+ };
53
+ isInstalled(): Promise<boolean>;
54
+ mcpFromNative(server: Record<string, unknown>): Record<string, unknown>;
55
+ mcpToNative(server: Record<string, unknown>): Record<string, unknown>;
56
+ writeStub(asset: Asset, content: string, targetPath: string): Promise<void>;
57
+ installSkill(): Promise<void>;
58
+ getRootConfigAppend(): string | null;
59
+ }
60
+ export interface DiscoveredFile {
61
+ path: string;
62
+ relativePath: string;
63
+ isStub: boolean;
64
+ tool: string;
65
+ type: AssetType;
66
+ name: string;
67
+ modifiedAt: number;
68
+ content?: string;
69
+ }
70
+ export interface SyncOptions {
71
+ scope?: 'user' | 'workspace';
72
+ interactive?: boolean;
73
+ }
74
+ export interface ConfigOptions {
75
+ scope?: 'user' | 'workspace';
76
+ show?: boolean;
77
+ }
78
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ export type VisualizerEntityType = 'instruction' | 'agent' | 'skill' | 'mcp';
2
+ export type VisualizerProviderId = string;
3
+ export interface VisualizerEntity {
4
+ id: string;
5
+ name: string;
6
+ type: VisualizerEntityType;
7
+ }
8
+ export interface VisualizerProvider {
9
+ id: VisualizerProviderId;
10
+ title: string;
11
+ iconUrl?: string;
12
+ isHub?: boolean;
13
+ }
14
+ export interface VisualizerConnection {
15
+ entityId: string;
16
+ providerId: VisualizerProviderId;
17
+ }
18
+ export interface VisualizerConfiguration {
19
+ providers: VisualizerProvider[];
20
+ entities: {
21
+ instructions: VisualizerEntity[];
22
+ agents: VisualizerEntity[];
23
+ skills: VisualizerEntity[];
24
+ mcps: VisualizerEntity[];
25
+ };
26
+ connections: VisualizerConnection[];
27
+ websocketUrl?: string;
28
+ }
29
+ export interface ConnectionChangedMessage {
30
+ type: 'CONNECTION_CHANGED';
31
+ payload: {
32
+ sourceEntity: string;
33
+ entityType: VisualizerEntityType;
34
+ sourceProvider: VisualizerProviderId;
35
+ targetProvider: VisualizerProviderId;
36
+ action: 'ATTACH' | 'DETACH';
37
+ };
38
+ }
39
+ //# sourceMappingURL=visualizer-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualizer-types.d.ts","sourceRoot":"","sources":["../../src/core/visualizer-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;AAC7E,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,oBAAoB,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,oBAAoB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,oBAAoB,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,QAAQ,EAAE;QACR,YAAY,EAAE,gBAAgB,EAAE,CAAC;QACjC,MAAM,EAAE,gBAAgB,EAAE,CAAC;QAC3B,MAAM,EAAE,gBAAgB,EAAE,CAAC;QAC3B,IAAI,EAAE,gBAAgB,EAAE,CAAC;KAC1B,CAAC;IACF,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,oBAAoB,CAAC;QACjC,cAAc,EAAE,oBAAoB,CAAC;QACrC,cAAc,EAAE,oBAAoB,CAAC;QACrC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC7B,CAAC;CACH"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=visualizer-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualizer-types.js","sourceRoot":"","sources":["../../src/core/visualizer-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ import { AssetType } from '../core/types.js';
2
+ import { RegistryManager } from '../core/registry.js';
3
+ import { Scanner } from '../core/scanner.js';
4
+ export declare class Syncer {
5
+ private registry;
6
+ private scanner;
7
+ private scope;
8
+ constructor(registry: RegistryManager, scanner: Scanner, scope?: 'user' | 'workspace');
9
+ sync(interactive?: boolean): Promise<{
10
+ stubsWritten: number;
11
+ stubsDeleted: number;
12
+ assetsDiscovered: number;
13
+ }>;
14
+ private groupByNameAndType;
15
+ syncToTool(sourceTool: string, targetTools: string[]): Promise<{
16
+ stubsWritten: number;
17
+ stubsDeleted: number;
18
+ assetsDiscovered: number;
19
+ }>;
20
+ attachAssetToTool(name: string, type: AssetType, sourceTool: string, targetTool: string): Promise<boolean>;
21
+ detachAssetFromTool(name: string, type: AssetType, tool: string): Promise<boolean>;
22
+ private calculateHash;
23
+ private getTargetPath;
24
+ private writeTarget;
25
+ private writeMcpServer;
26
+ private upsertStub;
27
+ private reconcileDeletedAssets;
28
+ private deleteStubTarget;
29
+ private getCanonicalPath;
30
+ }
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/syncer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAA4B,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAe7C,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAuB;gBAGlC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,OAAO,EAChB,KAAK,GAAE,MAAM,GAAG,WAAyB;IAOrC,IAAI,CAAC,WAAW,GAAE,OAAc,GAAG,OAAO,CAAC;QAC/C,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IAwJF,OAAO,CAAC,kBAAkB;IAYpB,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC;QACT,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IA0JI,iBAAiB,CACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC;IAwEb,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmCxF,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,aAAa;YAkBP,WAAW;YA0BX,cAAc;IAoC5B,OAAO,CAAC,UAAU;YAgBJ,sBAAsB;YA6CtB,gBAAgB;IAuC9B,OAAO,CAAC,gBAAgB;CAWzB"}