@untitled-devs/wasla 0.1.1 → 0.1.3

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/README.md +20 -15
  2. package/dist/adapters/base.d.ts +0 -1
  3. package/dist/adapters/base.js +0 -1
  4. package/dist/adapters/claude.d.ts +0 -1
  5. package/dist/adapters/claude.js +0 -1
  6. package/dist/adapters/cursor.d.ts +0 -1
  7. package/dist/adapters/cursor.js +0 -1
  8. package/dist/adapters/factory.d.ts +0 -1
  9. package/dist/adapters/factory.js +0 -1
  10. package/dist/adapters/gemini.d.ts +0 -1
  11. package/dist/adapters/gemini.js +0 -1
  12. package/dist/adapters/github-copilot-cli.d.ts +0 -1
  13. package/dist/adapters/github-copilot-cli.js +0 -1
  14. package/dist/adapters/github-copilot.d.ts +0 -1
  15. package/dist/adapters/github-copilot.js +0 -1
  16. package/dist/adapters/openclaw.d.ts +0 -1
  17. package/dist/adapters/openclaw.js +0 -1
  18. package/dist/adapters/opencode.d.ts +0 -1
  19. package/dist/adapters/opencode.js +0 -1
  20. package/dist/cli/commands/config.d.ts +1 -2
  21. package/dist/cli/commands/config.js +38 -42
  22. package/dist/cli/commands/install.d.ts +0 -1
  23. package/dist/cli/commands/install.js +10 -6
  24. package/dist/cli/commands/register.d.ts +0 -1
  25. package/dist/cli/commands/register.js +4 -3
  26. package/dist/cli/commands/status.d.ts +1 -6
  27. package/dist/cli/commands/status.js +15 -13
  28. package/dist/cli/commands/sync-to.d.ts +0 -2
  29. package/dist/cli/commands/sync-to.js +3 -3
  30. package/dist/cli/commands/sync.d.ts +2 -3
  31. package/dist/cli/commands/sync.js +33 -11
  32. package/dist/cli/commands/visualizer.d.ts +0 -2
  33. package/dist/cli/commands/visualizer.js +2 -2
  34. package/dist/cli/commands/watch.d.ts +1 -6
  35. package/dist/cli/commands/watch.js +3 -3
  36. package/dist/cli/index.d.ts +0 -1
  37. package/dist/cli/index.js +11 -14
  38. package/dist/core/registry.d.ts +0 -1
  39. package/dist/core/registry.js +0 -1
  40. package/dist/core/scanner.d.ts +0 -1
  41. package/dist/core/scanner.js +8 -4
  42. package/dist/core/types.d.ts +0 -2
  43. package/dist/core/types.js +0 -1
  44. package/dist/core/visualizer-types.d.ts +0 -1
  45. package/dist/core/visualizer-types.js +0 -1
  46. package/dist/syncer/index.d.ts +0 -1
  47. package/dist/syncer/index.js +0 -1
  48. package/dist/utils/cli-output.d.ts +4 -1
  49. package/dist/utils/cli-output.js +60 -7
  50. package/dist/utils/config.d.ts +6 -0
  51. package/dist/utils/config.js +34 -0
  52. package/dist/utils/fs.d.ts +0 -1
  53. package/dist/utils/fs.js +13 -8
  54. package/dist/utils/paths.d.ts +0 -1
  55. package/dist/utils/paths.js +0 -1
  56. package/package.json +50 -46
  57. package/src/visualizer/dist/assets/{index-BRmeXR7T.js → index-C6aJB2Yl.js} +1 -1
  58. package/src/visualizer/dist/index.html +1 -1
  59. package/dist/adapters/base.d.ts.map +0 -1
  60. package/dist/adapters/base.js.map +0 -1
  61. package/dist/adapters/claude.d.ts.map +0 -1
  62. package/dist/adapters/claude.js.map +0 -1
  63. package/dist/adapters/cursor.d.ts.map +0 -1
  64. package/dist/adapters/cursor.js.map +0 -1
  65. package/dist/adapters/factory.d.ts.map +0 -1
  66. package/dist/adapters/factory.js.map +0 -1
  67. package/dist/adapters/gemini.d.ts.map +0 -1
  68. package/dist/adapters/gemini.js.map +0 -1
  69. package/dist/adapters/github-copilot-cli.d.ts.map +0 -1
  70. package/dist/adapters/github-copilot-cli.js.map +0 -1
  71. package/dist/adapters/github-copilot.d.ts.map +0 -1
  72. package/dist/adapters/github-copilot.js.map +0 -1
  73. package/dist/adapters/openclaw.d.ts.map +0 -1
  74. package/dist/adapters/openclaw.js.map +0 -1
  75. package/dist/adapters/opencode.d.ts.map +0 -1
  76. package/dist/adapters/opencode.js.map +0 -1
  77. package/dist/cli/commands/config.d.ts.map +0 -1
  78. package/dist/cli/commands/config.js.map +0 -1
  79. package/dist/cli/commands/install.d.ts.map +0 -1
  80. package/dist/cli/commands/install.js.map +0 -1
  81. package/dist/cli/commands/register.d.ts.map +0 -1
  82. package/dist/cli/commands/register.js.map +0 -1
  83. package/dist/cli/commands/status.d.ts.map +0 -1
  84. package/dist/cli/commands/status.js.map +0 -1
  85. package/dist/cli/commands/sync-to.d.ts.map +0 -1
  86. package/dist/cli/commands/sync-to.js.map +0 -1
  87. package/dist/cli/commands/sync.d.ts.map +0 -1
  88. package/dist/cli/commands/sync.js.map +0 -1
  89. package/dist/cli/commands/visualizer.d.ts.map +0 -1
  90. package/dist/cli/commands/visualizer.js.map +0 -1
  91. package/dist/cli/commands/watch.d.ts.map +0 -1
  92. package/dist/cli/commands/watch.js.map +0 -1
  93. package/dist/cli/index.d.ts.map +0 -1
  94. package/dist/cli/index.js.map +0 -1
  95. package/dist/core/registry.d.ts.map +0 -1
  96. package/dist/core/registry.js.map +0 -1
  97. package/dist/core/scanner.d.ts.map +0 -1
  98. package/dist/core/scanner.js.map +0 -1
  99. package/dist/core/types.d.ts.map +0 -1
  100. package/dist/core/types.js.map +0 -1
  101. package/dist/core/visualizer-types.d.ts.map +0 -1
  102. package/dist/core/visualizer-types.js.map +0 -1
  103. package/dist/syncer/index.d.ts.map +0 -1
  104. package/dist/syncer/index.js.map +0 -1
  105. package/dist/utils/cli-output.d.ts.map +0 -1
  106. package/dist/utils/cli-output.js.map +0 -1
  107. package/dist/utils/fs.d.ts.map +0 -1
  108. package/dist/utils/fs.js.map +0 -1
  109. package/dist/utils/paths.d.ts.map +0 -1
  110. package/dist/utils/paths.js.map +0 -1
package/README.md CHANGED
@@ -121,15 +121,18 @@ The same pattern applies across every asset type:
121
121
  WaslaGenie is cross-platform via `npx` — no global install required:
122
122
 
123
123
  ```bash
124
+ npx @untitled-devs/wasla config --scope workspace
124
125
  npx @untitled-devs/wasla sync
125
126
  ```
126
127
 
127
- This runs the CLI directly. It does not register helper skills inside Claude, Gemini, or other tools.
128
+ Choose `workspace` or `user` once before running operational commands. This runs the CLI directly.
129
+ It does not register helper skills inside Claude, Gemini, or other tools.
128
130
 
129
131
  **Or install globally:**
130
132
 
131
133
  ```bash
132
134
  npm install -g @untitled-devs/wasla
135
+ waslagenie config --scope workspace
133
136
  waslagenie sync
134
137
  ```
135
138
 
@@ -178,10 +181,10 @@ npx @untitled-devs/wasla visualizer
178
181
  ### You (developing this repo)
179
182
 
180
183
  ```bash
181
- # Build + run sync (workspace scope) using your local source
184
+ # Build + run sync using your configured scope
182
185
  npm run sync
183
186
 
184
- # Build + run watch (workspace scope)
187
+ # Build + run watch using your configured scope
185
188
  npm run watch
186
189
  ```
187
190
 
@@ -257,14 +260,18 @@ No restart. No manual trigger. The moment something changes — it's everywhere.
257
260
 
258
261
  ### Scope — workspace or user level
259
262
 
263
+ Choose the active scope before running sync, watch, status, or the visualizer:
264
+
260
265
  ```bash
261
- # Sync only within current project workspace
262
- waslagenie sync --scope workspace
266
+ # Use the current project workspace registry
267
+ waslagenie config --scope workspace
263
268
 
264
- # Sync across your entire user space (default)
265
- waslagenie sync --scope user
269
+ # Use the user-level registry across projects
270
+ waslagenie config --scope user
266
271
  ```
267
272
 
273
+ All other commands use the saved scope automatically. They do not accept `--scope`.
274
+
268
275
  ---
269
276
 
270
277
  ### Status — see everything and where it lives
@@ -312,22 +319,19 @@ review-pr command openclaw claude ✔ gemini ✔ codex ✔ her
312
319
 
313
320
  ## 🗃️ Registry Storage
314
321
 
315
- WaslaGenie keeps its own state separately from all orchestrators. You choose the scope at install time:
322
+ WaslaGenie keeps its own state separately from all orchestrators. You choose the active scope explicitly before the first sync:
316
323
 
317
- **User-level** (default — available across all your projects):
324
+ **User-level** (available across all your projects):
318
325
  ```
319
326
  ~/.waslagenie/
320
- ├── registry.json ← every discovered asset + origin tool + stub locations
321
- ├── stubs/ log of every stub written and when
322
- └── config.json ← your scope and preferences
327
+ ├── registry.json ← user-scope assets and stub locations
328
+ └── config.json active scope preference
323
329
  ```
324
330
 
325
331
  **Workspace-level** (scoped to current project only):
326
332
  ```
327
333
  .waslagenie/
328
- ├── registry.json
329
- ├── stubs/
330
- └── config.json
334
+ └── registry.json ← workspace-scope assets and stub locations
331
335
  ```
332
336
 
333
337
  Switch anytime:
@@ -419,6 +423,7 @@ npm run dev
419
423
 
420
424
  - [Contributing Guide](CONTRIBUTING.md)
421
425
  - [Architecture Docs](docs/docs/architecture/index.md)
426
+ - [Release Guide](RELEASING.md)
422
427
 
423
428
  ---
424
429
 
@@ -24,4 +24,3 @@ export declare abstract class BaseAdapter implements WaslaGenieAdapter {
24
24
  abstract installSkill(): Promise<void>;
25
25
  abstract getRootConfigAppend(): string | null;
26
26
  }
27
- //# sourceMappingURL=base.d.ts.map
@@ -6,4 +6,3 @@ export class BaseAdapter {
6
6
  return server;
7
7
  }
8
8
  }
9
- //# sourceMappingURL=base.js.map
@@ -28,4 +28,3 @@ export declare class ClaudeAdapter extends BaseAdapter {
28
28
  installSkill(): Promise<void>;
29
29
  getRootConfigAppend(): string | null;
30
30
  }
31
- //# sourceMappingURL=claude.d.ts.map
@@ -93,4 +93,3 @@ waslagenie watch # Auto-sync on file changes
93
93
  return null;
94
94
  }
95
95
  }
96
- //# sourceMappingURL=claude.js.map
@@ -27,4 +27,3 @@ export declare class CursorAdapter extends BaseAdapter {
27
27
  installSkill(): Promise<void>;
28
28
  getRootConfigAppend(): string | null;
29
29
  }
30
- //# sourceMappingURL=cursor.d.ts.map
@@ -57,4 +57,3 @@ export class CursorAdapter extends BaseAdapter {
57
57
  return null;
58
58
  }
59
59
  }
60
- //# sourceMappingURL=cursor.js.map
@@ -2,4 +2,3 @@ import { WaslaGenieAdapter } from '../core/types.js';
2
2
  export declare function getAdapter(toolName: string, scope?: 'user' | 'workspace'): WaslaGenieAdapter;
3
3
  export declare function getInstalledAdapters(scope?: 'user' | 'workspace'): Promise<WaslaGenieAdapter[]>;
4
4
  export declare function getAllAdapters(scope?: 'user' | 'workspace'): WaslaGenieAdapter[];
5
- //# sourceMappingURL=factory.d.ts.map
@@ -37,4 +37,3 @@ export async function getInstalledAdapters(scope = 'workspace') {
37
37
  export function getAllAdapters(scope = 'workspace') {
38
38
  return Object.values(createAdapters(scope));
39
39
  }
40
- //# sourceMappingURL=factory.js.map
@@ -28,4 +28,3 @@ export declare class GeminiAdapter extends BaseAdapter {
28
28
  installSkill(): Promise<void>;
29
29
  getRootConfigAppend(): string | null;
30
30
  }
31
- //# sourceMappingURL=gemini.d.ts.map
@@ -96,4 +96,3 @@ waslagenie watch # Auto-sync on file changes
96
96
  return null;
97
97
  }
98
98
  }
99
- //# sourceMappingURL=gemini.js.map
@@ -27,4 +27,3 @@ export declare class GithubCopilotCliAdapter extends BaseAdapter {
27
27
  installSkill(): Promise<void>;
28
28
  getRootConfigAppend(): string | null;
29
29
  }
30
- //# sourceMappingURL=github-copilot-cli.d.ts.map
@@ -62,4 +62,3 @@ export class GithubCopilotCliAdapter extends BaseAdapter {
62
62
  return null;
63
63
  }
64
64
  }
65
- //# sourceMappingURL=github-copilot-cli.js.map
@@ -29,4 +29,3 @@ export declare class GithubCopilotAdapter extends BaseAdapter {
29
29
  installSkill(): Promise<void>;
30
30
  getRootConfigAppend(): string | null;
31
31
  }
32
- //# sourceMappingURL=github-copilot.d.ts.map
@@ -83,4 +83,3 @@ export class GithubCopilotAdapter extends BaseAdapter {
83
83
  return null;
84
84
  }
85
85
  }
86
- //# sourceMappingURL=github-copilot.js.map
@@ -25,4 +25,3 @@ export declare class OpenclawAdapter extends BaseAdapter {
25
25
  installSkill(): Promise<void>;
26
26
  getRootConfigAppend(): string | null;
27
27
  }
28
- //# sourceMappingURL=openclaw.d.ts.map
@@ -59,4 +59,3 @@ export class OpenclawAdapter extends BaseAdapter {
59
59
  return null;
60
60
  }
61
61
  }
62
- //# sourceMappingURL=openclaw.js.map
@@ -29,4 +29,3 @@ export declare class OpenCodeAdapter extends BaseAdapter {
29
29
  installSkill(): Promise<void>;
30
30
  getRootConfigAppend(): string | null;
31
31
  }
32
- //# sourceMappingURL=opencode.d.ts.map
@@ -99,4 +99,3 @@ export class OpenCodeAdapter extends BaseAdapter {
99
99
  return null;
100
100
  }
101
101
  }
102
- //# sourceMappingURL=opencode.js.map
@@ -2,6 +2,5 @@ interface ConfigOptions {
2
2
  scope?: string;
3
3
  show?: boolean;
4
4
  }
5
- export declare function configCommand(options: ConfigOptions): Promise<void>;
5
+ export declare function configCommand(options: ConfigOptions): Promise<boolean>;
6
6
  export {};
7
- //# sourceMappingURL=config.d.ts.map
@@ -1,26 +1,16 @@
1
- import { RegistryManager } from '../../core/registry.js';
2
1
  import { section, success, error, spacer, info } from '../../utils/cli-output.js';
3
- import { getRegistryPath } from '../../utils/paths.js';
4
- import { fileExists } from '../../utils/fs.js';
2
+ import prompts from 'prompts';
3
+ import { getConfigPath, getConfiguredRegistryPath, readConfiguredScope, writeConfiguredScope, } from '../../utils/config.js';
5
4
  export async function configCommand(options) {
6
5
  try {
7
- // Determine current scope
8
- const userPath = getRegistryPath('user');
9
- const workspacePath = getRegistryPath('workspace');
10
- const userExists = await fileExists(userPath);
11
- const workspaceExists = await fileExists(workspacePath);
12
- let currentScope = 'user';
13
- if (workspaceExists && !userExists) {
14
- currentScope = 'workspace';
15
- }
6
+ const currentScope = await readConfiguredScope();
16
7
  // Show current config
17
8
  if (options.show) {
18
9
  section('Current Configuration');
19
10
  spacer();
20
- info(`Scope: ${currentScope}`);
21
- info(`Registry: ${getRegistryPath(currentScope)}`);
11
+ showConfig(currentScope);
22
12
  spacer();
23
- return;
13
+ return true;
24
14
  }
25
15
  // Change scope if requested
26
16
  if (options.scope) {
@@ -29,38 +19,44 @@ export async function configCommand(options) {
29
19
  error('Invalid scope. Use: user or workspace');
30
20
  process.exit(1);
31
21
  }
32
- const registry = new RegistryManager(currentScope);
33
- // Load existing registry if it exists, otherwise it will be created on first sync
34
- if ((currentScope === 'user' && userExists) ||
35
- (currentScope === 'workspace' && workspaceExists)) {
36
- await registry.load();
37
- }
38
- else {
39
- // Create empty registry
40
- await registry.load();
41
- }
42
- // Change scope and save
43
- registry.setScope(newScope);
44
- await registry.save();
45
- success(`Scope changed to: ${newScope}`);
46
- info(`Registry: ${getRegistryPath(newScope)}`);
47
- spacer();
48
- return;
22
+ await saveScope(newScope);
23
+ return true;
49
24
  }
50
- // If no option provided, show current config
51
- section('Current Configuration');
25
+ section('Configure Scope');
52
26
  spacer();
53
- info(`Scope: ${currentScope}`);
54
- info(`Registry: ${getRegistryPath(currentScope)}`);
55
- spacer();
56
- console.log('Usage:');
57
- console.log(' waslagenie config --scope user # Store registry in ~/.waslagenie/');
58
- console.log(' waslagenie config --scope workspace # Store registry in .waslagenie/');
59
- console.log(' waslagenie config --show # Show current config');
27
+ const response = await prompts({
28
+ type: 'select',
29
+ name: 'scope',
30
+ message: 'Where should WaslaGenie store and sync assets?',
31
+ choices: [
32
+ { title: 'Workspace - current project only', value: 'workspace' },
33
+ { title: 'User - available across all projects', value: 'user' },
34
+ ],
35
+ initial: currentScope === 'user' ? 1 : 0,
36
+ });
37
+ const scope = response.scope;
38
+ if (!scope) {
39
+ info('Configuration cancelled');
40
+ return false;
41
+ }
42
+ await saveScope(scope);
43
+ return true;
60
44
  }
61
45
  catch (err) {
62
46
  error(`Config failed: ${err}`);
63
47
  process.exit(1);
64
48
  }
65
49
  }
66
- //# sourceMappingURL=config.js.map
50
+ async function saveScope(scope) {
51
+ await writeConfiguredScope(scope);
52
+ success(`Scope changed to: ${scope}`);
53
+ info(`Config: ${getConfigPath()}`);
54
+ info(`Registry: ${getConfiguredRegistryPath(scope)}`);
55
+ spacer();
56
+ }
57
+ function showConfig(scope) {
58
+ info(`Scope: ${scope ?? 'not configured'}`);
59
+ info(`Config: ${getConfigPath()}`);
60
+ if (scope)
61
+ info(`Registry: ${getConfiguredRegistryPath(scope)}`);
62
+ }
@@ -1,2 +1 @@
1
1
  export declare function installCommand(): Promise<void>;
2
- //# sourceMappingURL=install.d.ts.map
@@ -1,13 +1,18 @@
1
1
  import { section, success, error, highlight, spacer } from '../../utils/cli-output.js';
2
- import { getRegistryDir } from '../../utils/paths.js';
3
- import { ensureDir } from '../../utils/fs.js';
2
+ import { readConfiguredScope } from '../../utils/config.js';
4
3
  export async function installCommand() {
5
4
  try {
6
5
  section('Preparing WaslaGenie CLI...');
7
6
  spacer();
8
- // Ensure registry directory exists
9
- await ensureDir(getRegistryDir('user'));
10
- success('Registry directory ready');
7
+ const scope = await readConfiguredScope();
8
+ if (scope) {
9
+ success(`Scope configured: ${scope}`);
10
+ }
11
+ else {
12
+ console.log('Choose a scope before running sync:');
13
+ console.log(' waslagenie config --scope user');
14
+ console.log(' waslagenie config --scope workspace');
15
+ }
11
16
  spacer();
12
17
  highlight('CLI setup complete!');
13
18
  console.log('');
@@ -24,4 +29,3 @@ export async function installCommand() {
24
29
  process.exit(1);
25
30
  }
26
31
  }
27
- //# sourceMappingURL=install.js.map
@@ -3,4 +3,3 @@ interface RegisterOptions {
3
3
  }
4
4
  export declare function registerCommand(options?: RegisterOptions): Promise<void>;
5
5
  export {};
6
- //# sourceMappingURL=register.d.ts.map
@@ -2,11 +2,13 @@ import { getInstalledAdapters } from '../../adapters/factory.js';
2
2
  import { section, success, error, warning, highlight, spacer } from '../../utils/cli-output.js';
3
3
  import { getRegistryDir } from '../../utils/paths.js';
4
4
  import { ensureDir } from '../../utils/fs.js';
5
+ import { requireConfiguredScope } from '../../utils/config.js';
5
6
  export async function registerCommand(options = {}) {
6
7
  try {
7
8
  section('Detecting installed orchestrators...');
8
9
  spacer();
9
- const adapters = await getInstalledAdapters();
10
+ const scope = await requireConfiguredScope();
11
+ const adapters = await getInstalledAdapters(scope);
10
12
  if (adapters.length === 0) {
11
13
  error('No supported orchestrators found');
12
14
  warning('Please install Claude Code, Gemini CLI, or OpenCode first');
@@ -35,7 +37,7 @@ export async function registerCommand(options = {}) {
35
37
  spacer();
36
38
  section('Registering WaslaGenie helper skills...');
37
39
  spacer();
38
- await ensureDir(getRegistryDir('user'));
40
+ await ensureDir(getRegistryDir(scope));
39
41
  for (const adapter of targets) {
40
42
  try {
41
43
  await adapter.installSkill();
@@ -53,4 +55,3 @@ export async function registerCommand(options = {}) {
53
55
  process.exit(1);
54
56
  }
55
57
  }
56
- //# sourceMappingURL=register.js.map
@@ -1,6 +1 @@
1
- interface StatusOptions {
2
- scope?: string;
3
- }
4
- export declare function statusCommand(options: StatusOptions): Promise<void>;
5
- export {};
6
- //# sourceMappingURL=status.d.ts.map
1
+ export declare function statusCommand(): Promise<void>;
@@ -1,10 +1,12 @@
1
1
  import { RegistryManager } from '../../core/registry.js';
2
- import { section, error, spacer, table } from '../../utils/cli-output.js';
2
+ import { Scanner } from '../../core/scanner.js';
3
+ import { assetList, section, error, info, metric, spacer } from '../../utils/cli-output.js';
3
4
  import { fileExists } from '../../utils/fs.js';
4
5
  import { getRegistryPath } from '../../utils/paths.js';
5
- export async function statusCommand(options) {
6
+ import { requireConfiguredScope } from '../../utils/config.js';
7
+ export async function statusCommand() {
6
8
  try {
7
- const scope = (options.scope || 'workspace');
9
+ const scope = await requireConfiguredScope();
8
10
  const registryPath = getRegistryPath(scope);
9
11
  if (!(await fileExists(registryPath))) {
10
12
  error('Registry not found. Run: waslagenie sync');
@@ -13,25 +15,25 @@ export async function statusCommand(options) {
13
15
  const registry = new RegistryManager(scope);
14
16
  await registry.load();
15
17
  const registryData = registry.get();
18
+ const installedTools = await new Scanner(scope).detectInstalledTools();
19
+ section('Registry status');
20
+ info(`Scope: ${scope}`);
21
+ info(`Registry: ${registryPath}`);
22
+ spacer();
23
+ metric('Assets', registryData.assets.length);
24
+ metric('Conflicts', registryData.conflicts.length);
16
25
  if (registryData.assets.length === 0) {
26
+ spacer();
17
27
  section('No assets synced yet');
18
28
  spacer();
19
29
  return;
20
30
  }
21
- section('Synced Assets');
22
- spacer();
23
- const rows = registryData.assets.map((asset) => [
24
- asset.name,
25
- asset.type,
26
- asset.stubs.map((s) => s.tool).join(', ') || 'none',
27
- new Date(asset.last_modified_at).toLocaleString(),
28
- ]);
29
- table([['ASSET', 'TYPE', 'STUBS', 'LAST MODIFIED'], ...rows.map((row) => row.map(String))], [20, 8, 20, 24]);
31
+ section('Synced assets');
30
32
  spacer();
33
+ assetList(registryData.assets, true, installedTools);
31
34
  }
32
35
  catch (err) {
33
36
  error(`Status check failed: ${err}`);
34
37
  process.exit(1);
35
38
  }
36
39
  }
37
- //# sourceMappingURL=status.js.map
@@ -1,8 +1,6 @@
1
1
  interface SyncToOptions {
2
- scope?: string;
3
2
  from?: string;
4
3
  to?: string;
5
4
  }
6
5
  export declare function syncToCommand(options: SyncToOptions): Promise<void>;
7
6
  export {};
8
- //# sourceMappingURL=sync-to.d.ts.map
@@ -2,14 +2,15 @@ import { RegistryManager } from '../../core/registry.js';
2
2
  import { Scanner } from '../../core/scanner.js';
3
3
  import { Syncer } from '../../syncer/index.js';
4
4
  import { section, error, highlight, spacer } from '../../utils/cli-output.js';
5
+ import { requireConfiguredScope } from '../../utils/config.js';
5
6
  export async function syncToCommand(options) {
6
7
  try {
7
- const scope = (options.scope || 'workspace');
8
+ const scope = await requireConfiguredScope();
8
9
  const from = options.from;
9
10
  const to = options.to;
10
11
  if (!from || !to) {
11
12
  error('Error: --from and --to are required');
12
- console.log('Usage: waslagenie sync-to --from <source> --to <target> [--scope workspace|user]');
13
+ console.log('Usage: waslagenie sync-to --from <source> --to <target>');
13
14
  console.log('Example: waslagenie sync-to --from gemini --to claude');
14
15
  process.exit(1);
15
16
  }
@@ -32,4 +33,3 @@ export async function syncToCommand(options) {
32
33
  process.exit(1);
33
34
  }
34
35
  }
35
- //# sourceMappingURL=sync-to.js.map
@@ -1,6 +1,5 @@
1
1
  interface SyncOptions {
2
- scope?: string;
2
+ promptForScope?: boolean;
3
3
  }
4
- export declare function syncCommand(options: SyncOptions): Promise<void>;
4
+ export declare function syncCommand(options?: SyncOptions): Promise<void>;
5
5
  export {};
6
- //# sourceMappingURL=sync.d.ts.map
@@ -1,27 +1,49 @@
1
1
  import { RegistryManager } from '../../core/registry.js';
2
2
  import { Scanner } from '../../core/scanner.js';
3
3
  import { Syncer } from '../../syncer/index.js';
4
- import { section, error, highlight, spacer } from '../../utils/cli-output.js';
5
- export async function syncCommand(options) {
4
+ import { assetList, bulletPoint, section, error, highlight, info, metric, spacer, } from '../../utils/cli-output.js';
5
+ import { getConfiguredRegistryPath, requireConfiguredScope } from '../../utils/config.js';
6
+ import { configCommand } from './config.js';
7
+ export async function syncCommand(options = {}) {
6
8
  try {
7
- const scope = (options.scope || 'workspace');
8
- section('Scanning...');
9
+ if (options.promptForScope !== false && !(await configCommand({}))) {
10
+ return;
11
+ }
12
+ const scope = await requireConfiguredScope();
13
+ section('Syncing assets');
14
+ info(`Scope: ${scope}`);
15
+ info(`Registry: ${getConfiguredRegistryPath(scope)}`);
9
16
  spacer();
17
+ section('Scanning providers');
10
18
  const registry = new RegistryManager(scope);
11
19
  await registry.load();
12
20
  const scanner = new Scanner(scope);
21
+ const installedTools = await scanner.detectInstalledTools();
22
+ info(`${installedTools.length} providers detected`);
23
+ for (const tool of installedTools) {
24
+ bulletPoint(tool, 1);
25
+ }
26
+ spacer();
13
27
  const syncer = new Syncer(registry, scanner, scope);
14
- const result = await syncer.sync(true);
28
+ const result = await syncer.sync(false);
29
+ spacer();
30
+ highlight('Sync complete');
31
+ spacer();
32
+ metric('Assets discovered', result.assetsDiscovered);
33
+ metric('Stubs written', result.stubsWritten);
34
+ metric('Stubs deleted', result.stubsDeleted);
15
35
  spacer();
16
- highlight('Sync complete!');
17
- console.log(' Note: sync only mirrors assets. It does not install helper skills.');
18
- console.log(` ${result.assetsDiscovered} assets discovered`);
19
- console.log(` ${result.stubsWritten} stubs written`);
20
- console.log(` ${result.stubsDeleted} stubs deleted`);
36
+ if (registry.get().assets.length === 0) {
37
+ info('No assets discovered');
38
+ }
39
+ else {
40
+ section('Discovered assets');
41
+ spacer();
42
+ assetList(registry.get().assets, false, installedTools);
43
+ }
21
44
  }
22
45
  catch (err) {
23
46
  error(`Sync failed: ${err}`);
24
47
  process.exit(1);
25
48
  }
26
49
  }
27
- //# sourceMappingURL=sync.js.map
@@ -1,6 +1,5 @@
1
1
  export declare function resolveVisualizerDist(moduleUrl: string): string;
2
2
  interface VisualizerOptions {
3
- scope?: string;
4
3
  port?: string;
5
4
  host?: string;
6
5
  noOpen?: boolean;
@@ -8,4 +7,3 @@ interface VisualizerOptions {
8
7
  export declare const PROVIDER_ICONS: Record<string, string>;
9
8
  export declare function visualizerCommand(options: VisualizerOptions): Promise<void>;
10
9
  export {};
11
- //# sourceMappingURL=visualizer.d.ts.map
@@ -10,6 +10,7 @@ import { RegistryManager } from '../../core/registry.js';
10
10
  import { getInstalledAdapters } from '../../adapters/factory.js';
11
11
  import { error, highlight, info, section, spacer } from '../../utils/cli-output.js';
12
12
  import { Syncer } from '../../syncer/index.js';
13
+ import { requireConfiguredScope } from '../../utils/config.js';
13
14
  export function resolveVisualizerDist(moduleUrl) {
14
15
  return resolve(dirname(fileURLToPath(moduleUrl)), '../../../src/visualizer/dist');
15
16
  }
@@ -138,7 +139,7 @@ function sendJson(res, statusCode, body) {
138
139
  }
139
140
  export async function visualizerCommand(options) {
140
141
  try {
141
- const scope = (options.scope || 'workspace');
142
+ const scope = await requireConfiguredScope();
142
143
  const host = options.host || '127.0.0.1';
143
144
  const port = Number(options.port || 4072);
144
145
  const shouldOpen = options.noOpen !== true;
@@ -238,4 +239,3 @@ export async function visualizerCommand(options) {
238
239
  process.exit(1);
239
240
  }
240
241
  }
241
- //# sourceMappingURL=visualizer.js.map
@@ -1,6 +1 @@
1
- interface WatchOptions {
2
- scope?: string;
3
- }
4
- export declare function watchCommand(options: WatchOptions): Promise<void>;
5
- export {};
6
- //# sourceMappingURL=watch.d.ts.map
1
+ export declare function watchCommand(): Promise<void>;
@@ -4,9 +4,10 @@ import { Scanner } from '../../core/scanner.js';
4
4
  import { Syncer } from '../../syncer/index.js';
5
5
  import { getAllAdapters } from '../../adapters/factory.js';
6
6
  import { section, success, error, info, spacer } from '../../utils/cli-output.js';
7
- export async function watchCommand(options) {
7
+ import { requireConfiguredScope } from '../../utils/config.js';
8
+ export async function watchCommand() {
8
9
  try {
9
- const scope = (options.scope || 'workspace');
10
+ const scope = await requireConfiguredScope();
10
11
  section('Watching for changes...');
11
12
  spacer();
12
13
  const registry = new RegistryManager(scope);
@@ -83,4 +84,3 @@ export async function watchCommand(options) {
83
84
  process.exit(1);
84
85
  }
85
86
  }
86
- //# sourceMappingURL=watch.js.map
@@ -1,3 +1,2 @@
1
1
  #!/usr/bin/env node
2
2
  export {};
3
- //# sourceMappingURL=index.d.ts.map