suzi-cli 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 (65) hide show
  1. package/dist/commands/agents.d.ts +3 -0
  2. package/dist/commands/agents.d.ts.map +1 -0
  3. package/dist/commands/agents.js +274 -0
  4. package/dist/commands/agents.js.map +1 -0
  5. package/dist/commands/deploy.d.ts +3 -0
  6. package/dist/commands/deploy.d.ts.map +1 -0
  7. package/dist/commands/deploy.js +149 -0
  8. package/dist/commands/deploy.js.map +1 -0
  9. package/dist/commands/import.d.ts +3 -0
  10. package/dist/commands/import.d.ts.map +1 -0
  11. package/dist/commands/import.js +70 -0
  12. package/dist/commands/import.js.map +1 -0
  13. package/dist/commands/list-tools.d.ts +3 -0
  14. package/dist/commands/list-tools.d.ts.map +1 -0
  15. package/dist/commands/list-tools.js +163 -0
  16. package/dist/commands/list-tools.js.map +1 -0
  17. package/dist/commands/login.d.ts +13 -0
  18. package/dist/commands/login.d.ts.map +1 -0
  19. package/dist/commands/login.js +311 -0
  20. package/dist/commands/login.js.map +1 -0
  21. package/dist/commands/portfolio.d.ts +3 -0
  22. package/dist/commands/portfolio.d.ts.map +1 -0
  23. package/dist/commands/portfolio.js +170 -0
  24. package/dist/commands/portfolio.js.map +1 -0
  25. package/dist/commands/preferences.d.ts +3 -0
  26. package/dist/commands/preferences.d.ts.map +1 -0
  27. package/dist/commands/preferences.js +121 -0
  28. package/dist/commands/preferences.js.map +1 -0
  29. package/dist/commands/prompt-suggestions.d.ts +3 -0
  30. package/dist/commands/prompt-suggestions.d.ts.map +1 -0
  31. package/dist/commands/prompt-suggestions.js +148 -0
  32. package/dist/commands/prompt-suggestions.js.map +1 -0
  33. package/dist/commands/skills.d.ts +3 -0
  34. package/dist/commands/skills.d.ts.map +1 -0
  35. package/dist/commands/skills.js +571 -0
  36. package/dist/commands/skills.js.map +1 -0
  37. package/dist/commands/subagents.d.ts +3 -0
  38. package/dist/commands/subagents.d.ts.map +1 -0
  39. package/dist/commands/subagents.js +194 -0
  40. package/dist/commands/subagents.js.map +1 -0
  41. package/dist/commands/transactions.d.ts +3 -0
  42. package/dist/commands/transactions.d.ts.map +1 -0
  43. package/dist/commands/transactions.js +153 -0
  44. package/dist/commands/transactions.js.map +1 -0
  45. package/dist/commands/wallet.d.ts +3 -0
  46. package/dist/commands/wallet.d.ts.map +1 -0
  47. package/dist/commands/wallet.js +183 -0
  48. package/dist/commands/wallet.js.map +1 -0
  49. package/dist/index.d.ts +3 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +95 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/lib/api.d.ts +12 -0
  54. package/dist/lib/api.d.ts.map +1 -0
  55. package/dist/lib/api.js +82 -0
  56. package/dist/lib/api.js.map +1 -0
  57. package/dist/lib/config.d.ts +42 -0
  58. package/dist/lib/config.d.ts.map +1 -0
  59. package/dist/lib/config.js +85 -0
  60. package/dist/lib/config.js.map +1 -0
  61. package/dist/utils/ui.d.ts +26 -0
  62. package/dist/utils/ui.d.ts.map +1 -0
  63. package/dist/utils/ui.js +111 -0
  64. package/dist/utils/ui.js.map +1 -0
  65. package/package.json +46 -0
@@ -0,0 +1,571 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerSkillsCommand = registerSkillsCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const os_1 = __importDefault(require("os"));
11
+ const ui_1 = require("../utils/ui");
12
+ // ─────────────────────────────────────────────────────────────
13
+ // Skill: suzi-guide
14
+ // ─────────────────────────────────────────────────────────────
15
+ const SUZI_GUIDE_SKILL = `---
16
+ name: suzi-guide
17
+ description: >
18
+ Comprehensive guide for the Suzi CLI and agent platform. Use this skill when
19
+ the user asks about Suzi commands, how to create/deploy/manage agents, available
20
+ protocols and actions, agent code patterns, or anything related to the Suzi
21
+ autonomous agent platform for blockchain protocols.
22
+ ---
23
+
24
+ # Suzi CLI & Agent Platform Guide
25
+
26
+ ## IMPORTANT: Always Use the CLI for Live Data
27
+
28
+ **NEVER rely on hardcoded data from this skill for questions about protocols, actions, balances, agents, or any runtime state.** Always run the appropriate \`suzi\` CLI command and use its output. This ensures the user gets up-to-date information.
29
+
30
+ | User asks about... | Run this command |
31
+ |---------------------|-----------------|
32
+ | Available protocols / actions | \`suzi list-tools --verbose\` |
33
+ | Actions for a specific protocol | \`suzi list-tools --protocol <name>\` |
34
+ | Their agents | \`suzi agents\` |
35
+ | Agent details / triggers / config | \`suzi agents view <id>\` |
36
+ | Agent logs | \`suzi agents logs <id>\` |
37
+ | Wallet addresses | \`suzi wallet address\` |
38
+ | Balances | \`suzi wallet balance\` |
39
+ | Portfolio | \`suzi portfolio --all\` |
40
+ | Transactions | \`suzi transactions\` |
41
+ | Current user / auth status | \`suzi whoami\` |
42
+
43
+ **Do NOT answer "what protocols are available?" or "what actions does polymarket have?" from memory. Run the CLI.**
44
+
45
+ ---
46
+
47
+ ## What is Suzi?
48
+
49
+ Suzi is an autonomous agent platform for creating and executing intelligent agents that interact with blockchain protocols. Users write TypeScript agents with triggers (manual, cron, event-based) that execute actions against protocols in a sandboxed environment.
50
+
51
+ ---
52
+
53
+ ## Installing the Suzi CLI
54
+
55
+ \\\`\\\`\\\`bash
56
+ pnpm add suzi
57
+
58
+ # Verify installation
59
+ suzi --version
60
+ \\\`\\\`\\\`
61
+
62
+ ### First-time setup
63
+
64
+ \\\`\\\`\\\`bash
65
+ # 1. Point to the Suzi API (production)
66
+ suzi login --api-url https://api-3ihwe.ondigitalocean.app
67
+
68
+ # 2. Browser opens for Google OAuth sign-in
69
+ # 3. After auth, CLI shows your wallet address + QR code
70
+ # 4. Send SOL to the displayed address to fund your wallet
71
+ # 5. CLI auto-detects the deposit and shows your portfolio
72
+ \\\`\\\`\\\`
73
+
74
+ ### Requirements
75
+
76
+ - Node.js 22.x
77
+ - pnpm 9.15.0
78
+
79
+ ---
80
+
81
+ ## CLI Commands Reference
82
+
83
+ ### Authentication
84
+
85
+ \`\`\`bash
86
+ suzi login # Sign in with Google (OAuth2.0). Shows QR code for wallet funding.
87
+ suzi login --api-url <url> # Override API endpoint
88
+ suzi login --web-url <url> # Override web app URL
89
+ suzi logout # Sign out and clear stored credentials
90
+ suzi whoami # Show current authenticated user, wallet addresses
91
+ \`\`\`
92
+
93
+ ### Wallet Management
94
+
95
+ \`\`\`bash
96
+ suzi wallet # Show wallet overview (SOL + EVM addresses)
97
+ suzi wallet address # Show full wallet addresses (for copying)
98
+ suzi wallet balance # Show balances (ALWAYS run this for balance questions)
99
+ suzi wallet fund # Show deposit instructions with full addresses
100
+ \`\`\`
101
+
102
+ ### Portfolio
103
+
104
+ \`\`\`bash
105
+ suzi portfolio # View SOL + top 3 assets across chains
106
+ suzi portfolio --all # Full portfolio including Hyperliquid perp positions
107
+ \`\`\`
108
+
109
+ ### Agent Management
110
+
111
+ \`\`\`bash
112
+ suzi agents # List all agents (ALWAYS run this for agent questions)
113
+ suzi agents view <id> # View agent details (spec, triggers, resources, config)
114
+ suzi agents activate <id> # Activate agent (allocates wallets, registers triggers)
115
+ suzi agents deactivate <id> # Deactivate agent
116
+ suzi agents execute <id> [trigger] # Manually execute a trigger (prompts if multiple)
117
+ suzi agents logs <id> # View agent logs (default: last 20)
118
+ suzi agents logs <id> -n 50 # View more log entries
119
+ suzi agents logs <id> --level error # Filter by level: info|warn|error|debug
120
+ suzi agents delete <id> # Delete agent (with confirmation)
121
+ suzi agents delete <id> -f # Delete without confirmation
122
+ \`\`\`
123
+
124
+ ### Agent Deployment
125
+
126
+ \`\`\`bash
127
+ suzi deploy # Deploy agent (auto-discovers agent.ts, src/agent.ts, index.ts)
128
+ suzi deploy ./path/to/agent.ts # Deploy specific file
129
+ suzi deploy -t "My Agent" # Set title
130
+ suzi deploy -d "Description here" # Set description
131
+ suzi deploy --activate # Activate immediately after deployment
132
+ suzi deploy --update <agentId> # Update existing agent's code
133
+ \`\`\`
134
+
135
+ ### Agent Templates & Validation
136
+
137
+ \`\`\`bash
138
+ suzi subagents # List agent.md and agent.ts files in current directory
139
+ suzi subagents init # Create template agent.md + agent.ts files
140
+ suzi subagents init --dir ./myagent # Create templates in specific directory
141
+ suzi subagents validate # Validate agent.md (checks Meta, Resources, Triggers sections)
142
+ suzi subagents validate ./agent.md # Validate specific file
143
+ \`\`\`
144
+
145
+ ### Agent Import (Sharing)
146
+
147
+ \`\`\`bash
148
+ suzi import <slug> # Clone a shared agent by its share slug
149
+ \`\`\`
150
+
151
+ ### Transactions
152
+
153
+ \`\`\`bash
154
+ suzi transactions # View recent transactions across all agents (alias: suzi txns)
155
+ suzi txns -n 30 # Show more entries
156
+ suzi txns --type order # Filter: order|cancel|transfer|swap|bridge|liquidity
157
+ suzi txns --protocol polymarket # Filter by protocol
158
+ suzi txns --agent <id> # Filter by specific agent
159
+ suzi tx-confirm <agentId> # Show latest execution details (input/output)
160
+ \`\`\`
161
+
162
+ ### Tools & Protocols
163
+
164
+ \`\`\`bash
165
+ suzi list-tools # List all protocols (ALWAYS run for protocol questions)
166
+ suzi list-tools --verbose # Show ALL actions per protocol with descriptions
167
+ suzi list-tools --protocol <name> # Show actions for a specific protocol
168
+ \`\`\`
169
+
170
+ ### Preferences
171
+
172
+ \`\`\`bash
173
+ suzi preferences # View current preferences (alias: suzi prefs)
174
+ suzi prefs set-username [name] # Set display username
175
+ suzi prefs telegram # Connect Telegram for notifications
176
+ suzi prefs api-url <url> # Set API server URL
177
+ \`\`\`
178
+
179
+ ### Help & Suggestions
180
+
181
+ \`\`\`bash
182
+ suzi suggest # Interactive command suggestions (alias: suzi help-me)
183
+ suzi --help # Show all commands
184
+ \`\`\`
185
+
186
+ ### Skills
187
+
188
+ \`\`\`bash
189
+ suzi skills # List available skills
190
+ suzi skills show <name> # Show skill details and sections
191
+ suzi skills add <name> # Install a skill to ~/.claude/skills/
192
+ suzi skills add --all # Install all available skills
193
+ \`\`\`
194
+
195
+ ---
196
+
197
+ ## Creating Agents
198
+
199
+ ### Quick Start
200
+
201
+ \`\`\`bash
202
+ # 1. Initialize a template
203
+ suzi subagents init
204
+
205
+ # 2. Edit agent.ts with your logic
206
+
207
+ # 3. Deploy
208
+ suzi deploy ./agent.ts
209
+
210
+ # 4. Activate
211
+ suzi agents activate <agent-id>
212
+
213
+ # 5. Execute manually
214
+ suzi agents execute <agent-id>
215
+ \`\`\`
216
+
217
+ ### Agent File Structure
218
+
219
+ Agent files must default-export a \`defineAgent()\` call. The file is self-contained — **no imports allowed** (the runtime provides \`defineAgent\`, \`on\`, \`resource\`, \`config\`, \`requirement\` as globals).
220
+
221
+ \`\`\`typescript
222
+ export default defineAgent({
223
+ meta: { ... }, // Required: name, version
224
+ resources: { ... }, // Optional: wallet requirements
225
+ config: { ... }, // Optional: user-configurable parameters
226
+ activationRequirements: { ... }, // Optional: balance checks before activation
227
+ lifecycle: { ... }, // Optional: onActivate, onDeactivate hooks
228
+ triggers: { ... }, // Required: at least one trigger
229
+ });
230
+ \`\`\`
231
+
232
+ ### Minimal Agent
233
+
234
+ \`\`\`typescript
235
+ export default defineAgent({
236
+ meta: {
237
+ name: 'My Agent',
238
+ version: '0.1.0',
239
+ },
240
+ triggers: {
241
+ manual: on.suzi.manual(async (ctx, input) => {
242
+ await ctx.actions.suzi.log({ message: 'Hello from my agent!' });
243
+ return { ok: true };
244
+ }),
245
+ },
246
+ });
247
+ \`\`\`
248
+
249
+ ### Full Agent Template
250
+
251
+ \`\`\`typescript
252
+ export default defineAgent({
253
+ meta: {
254
+ name: 'My Trading Agent',
255
+ version: '0.1.0',
256
+ description: 'Automated trading strategy',
257
+ tags: ['trading', 'solana'],
258
+ },
259
+
260
+ // Wallet resources the agent needs
261
+ resources: {
262
+ svmWallet: resource.wallet('svm'), // Solana wallet
263
+ evmWallet: resource.wallet('evm'), // Ethereum wallet (for Hyperliquid/Polymarket)
264
+ },
265
+
266
+ // User-configurable parameters (set during activation)
267
+ config: {
268
+ capital: config.number({
269
+ description: 'Initial capital in USDC',
270
+ min: 100,
271
+ max: 10000,
272
+ required: true,
273
+ default: 1000,
274
+ }),
275
+ },
276
+
277
+ // Balance checks before agent can activate
278
+ activationRequirements: {
279
+ __min_usdc: requirement.svmTokenBalance({
280
+ token: 'USDC',
281
+ minAmount: { $ref: 'config.capital' }, // References config value
282
+ description: 'Minimum USDC required',
283
+ }),
284
+ __min_sol: requirement.svmNativeBalance({
285
+ minAmount: 0.5,
286
+ description: 'Minimum SOL for transaction fees',
287
+ }),
288
+ },
289
+
290
+ // Lifecycle hooks
291
+ lifecycle: {
292
+ onActivate: async (ctx) => {
293
+ const { capital } = ctx.config as { capital: number };
294
+ await ctx.actions.suzi.log({ message: \`Activating with $\${capital} USDC\` });
295
+ const svmResult = await ctx.actions.suzi.get_svm_address({});
296
+ await ctx.actions.suzi.set_to_store({ key: 'initial_capital', value: capital });
297
+ },
298
+
299
+ onDeactivate: async (ctx) => {
300
+ await ctx.actions.suzi.log({ message: 'Deactivating — closing positions...' });
301
+ },
302
+ },
303
+
304
+ triggers: {
305
+ // Manual trigger — executed from dashboard or CLI
306
+ manual: on.suzi.manual(async (ctx, input) => {
307
+ await ctx.actions.suzi.log({ message: 'Manual execution' });
308
+ return { ok: true };
309
+ }),
310
+
311
+ // Cron trigger — runs on schedule
312
+ rebalance: on.suzi.cron(
313
+ { schedule: '*/5 * * * *' }, // Every 5 minutes (standard cron syntax)
314
+ async (ctx) => {
315
+ await ctx.actions.suzi.log({ message: 'Rebalancing...' });
316
+ return { ok: true, action: 'rebalanced' };
317
+ }
318
+ ),
319
+ },
320
+ });
321
+ \`\`\`
322
+
323
+ ### Agent Context (ctx)
324
+
325
+ Available in all trigger handlers and lifecycle hooks:
326
+
327
+ \`\`\`typescript
328
+ ctx.actions.<protocol>.<action>() // Call any protocol action
329
+ ctx.config // Access config values
330
+ \`\`\`
331
+
332
+ **To see what protocols and actions are available, run \`suzi list-tools --verbose\`.**
333
+ Actions are called as \`ctx.actions.<protocol>.<action_name>({ ...params })\`.
334
+
335
+ ### Validation Rules
336
+
337
+ - Agent **must** default-export via \`defineAgent({})\`
338
+ - **No imports/requires** — agent code must be self-contained
339
+ - \`triggers\` object is **required** with at least one trigger
340
+ - Each trigger must have a \`type\` (e.g., \`suzi.manual\`, \`suzi.cron\`)
341
+ - Config fields need \`type\` and \`description\`
342
+ - The file is transpiled from TypeScript to JavaScript and executed in a VM2 sandbox
343
+
344
+ ### Agent Statuses
345
+
346
+ | Status | Description |
347
+ |--------|-------------|
348
+ | \`draft\` | Created but not activated. No wallets allocated. |
349
+ | \`active\` | Running. Cron triggers fire on schedule, event triggers are subscribed. |
350
+ | \`inactive\` | Deactivated. Triggers stopped. Can be reactivated. |
351
+ | \`deleted\` | Soft-deleted. Not recoverable from CLI. |
352
+
353
+ ---
354
+
355
+ ## Trigger Types
356
+
357
+ | Trigger | Syntax | Description |
358
+ |---------|--------|-------------|
359
+ | Manual | \`on.suzi.manual(handler)\` | Triggered from dashboard or \`suzi agents execute\` |
360
+ | Cron | \`on.suzi.cron({ schedule }, handler)\` | Runs on cron schedule (e.g., \`'*/5 * * * *'\`) |
361
+ | Event | \`on.<protocol>.event(config, handler)\` | Triggered by realtime protocol events |
362
+
363
+ ### Cron Schedule Examples
364
+
365
+ | Schedule | Meaning |
366
+ |----------|---------|
367
+ | \`*/1 * * * *\` | Every minute |
368
+ | \`*/5 * * * *\` | Every 5 minutes |
369
+ | \`0 * * * *\` | Every hour |
370
+ | \`0 */4 * * *\` | Every 4 hours |
371
+ | \`0 0 * * *\` | Daily at midnight |
372
+
373
+ ---
374
+
375
+ ## Common Workflows
376
+
377
+ ### Deploy & Activate in One Command
378
+
379
+ \`\`\`bash
380
+ suzi deploy ./agent.ts --activate
381
+ \`\`\`
382
+
383
+ ### Update Running Agent Code
384
+
385
+ \`\`\`bash
386
+ suzi deploy ./agent.ts --update <agent-id>
387
+ \`\`\`
388
+
389
+ ### Monitor Agent
390
+
391
+ \`\`\`bash
392
+ suzi agents logs <id> # View recent logs
393
+ suzi agents logs <id> --level error # Check for errors
394
+ suzi txns --agent <id> # View transactions
395
+ \`\`\`
396
+
397
+ ### Typical Development Loop
398
+
399
+ \`\`\`bash
400
+ # 1. Create template
401
+ suzi subagents init --dir ./my-agent
402
+
403
+ # 2. Edit agent.ts — write your logic
404
+
405
+ # 3. Deploy as draft
406
+ suzi deploy ./my-agent/agent.ts
407
+
408
+ # 4. Review
409
+ suzi agents view <id>
410
+
411
+ # 5. Activate
412
+ suzi agents activate <id>
413
+
414
+ # 6. Test manually
415
+ suzi agents execute <id>
416
+
417
+ # 7. Check results
418
+ suzi agents logs <id>
419
+
420
+ # 8. Iterate — update code
421
+ suzi deploy ./my-agent/agent.ts --update <id>
422
+ \`\`\`
423
+
424
+ ---
425
+
426
+ ## Tips & Best Practices
427
+
428
+ 1. **Start simple** — begin with a manual trigger, test it, then add cron/event triggers
429
+ 2. **Use \`suzi.log\`** liberally — logs are your debugging tool since agents run in a sandbox
430
+ 3. **Use \`suzi.set_to_store / get_from_store\`** for state that persists across trigger executions
431
+ 4. **Activation requirements** prevent agents from starting without sufficient funds
432
+ 5. **Kill switches** — add a cron trigger that checks drawdown and calls \`request_deactivation\` if needed
433
+ 6. **No imports** — all code must be self-contained. Use \`ctx.actions\` for all external interactions
434
+ 7. **Test with manual triggers first**, then add cron schedules
435
+ 8. **Connect Telegram** (\`suzi prefs telegram\`) for \`suzi.notify\` alerts
436
+ `;
437
+ // ─────────────────────────────────────────────────────────────
438
+ // Registry
439
+ // ─────────────────────────────────────────────────────────────
440
+ const SKILLS = [
441
+ {
442
+ name: 'suzi-guide',
443
+ filename: 'suzi-guide.md',
444
+ description: 'Comprehensive guide for Suzi CLI commands, agent creation, protocols & actions',
445
+ sections: [
446
+ { title: 'CLI-First Data Fetching', description: 'Always use suzi CLI for live data — protocols, balances, agents, etc.' },
447
+ { title: 'Installing the Suzi CLI', description: 'pnpm add suzi, first-time setup, requirements' },
448
+ { title: 'CLI Commands Reference', description: 'All suzi commands: login, wallet, portfolio, agents, deploy, tools, etc.' },
449
+ { title: 'Creating Agents', description: 'Quick start, file structure, minimal agent, full template with all sections' },
450
+ { title: 'Trigger Types', description: 'Manual, cron, and event triggers with schedule syntax' },
451
+ { title: 'Common Workflows', description: 'Deploy+activate, update, monitor, typical dev loop' },
452
+ { title: 'Tips & Best Practices', description: 'Logging, state management, kill switches, testing patterns' },
453
+ ],
454
+ content: SUZI_GUIDE_SKILL,
455
+ },
456
+ ];
457
+ // ─────────────────────────────────────────────────────────────
458
+ // Command
459
+ // ─────────────────────────────────────────────────────────────
460
+ function registerSkillsCommand(program) {
461
+ const skills = program
462
+ .command('skills')
463
+ .description('Manage Claude Code skills for Suzi');
464
+ // suzi skills — list available skills
465
+ skills.action(() => {
466
+ (0, ui_1.header)('Available Skills');
467
+ console.log();
468
+ for (const skill of SKILLS) {
469
+ console.log(` ${ui_1.colors.primary('▸')} ${chalk_1.default.bold(skill.name)}`);
470
+ console.log(` ${ui_1.colors.muted(skill.description)}`);
471
+ console.log(` ${ui_1.colors.muted('Install:')} ${chalk_1.default.cyan(`suzi skills add ${skill.name}`)}`);
472
+ console.log();
473
+ }
474
+ (0, ui_1.divider)();
475
+ (0, ui_1.info)(`${SKILLS.length} skill(s) available.`);
476
+ (0, ui_1.info)('Use `suzi skills add <name>` to install, or `suzi skills add --all` for all.');
477
+ });
478
+ // suzi skills show <name>
479
+ skills
480
+ .command('show <name>')
481
+ .description('Show skill details and contents')
482
+ .option('--full', 'Print the full markdown content')
483
+ .action((name, opts) => {
484
+ const skill = SKILLS.find((s) => s.name === name);
485
+ if (!skill) {
486
+ (0, ui_1.error)(`Skill "${name}" not found.`);
487
+ (0, ui_1.info)(`Available: ${SKILLS.map((s) => s.name).join(', ')}`);
488
+ return;
489
+ }
490
+ (0, ui_1.header)(skill.name);
491
+ console.log();
492
+ (0, ui_1.label)('Path', `~/.claude/skills/${skill.name}/SKILL.md`);
493
+ (0, ui_1.label)('Description', skill.description);
494
+ (0, ui_1.label)('Size', `${skill.content.split('\n').length} lines`);
495
+ console.log();
496
+ // Show sections
497
+ console.log(chalk_1.default.bold(' Sections:'));
498
+ console.log();
499
+ for (let i = 0; i < skill.sections.length; i++) {
500
+ const s = skill.sections[i];
501
+ console.log(` ${ui_1.colors.primary(`${i + 1}.`)} ${chalk_1.default.bold(s.title)}`);
502
+ console.log(` ${ui_1.colors.muted(s.description)}`);
503
+ }
504
+ console.log();
505
+ (0, ui_1.divider)();
506
+ if (opts.full) {
507
+ console.log();
508
+ console.log(skill.content);
509
+ }
510
+ else {
511
+ (0, ui_1.info)(`Use --full to print the entire skill content.`);
512
+ (0, ui_1.info)(`Use \`suzi skills add ${name}\` to install it.`);
513
+ }
514
+ });
515
+ // suzi skills add <name>
516
+ skills
517
+ .command('add [name]')
518
+ .description('Install a skill to .claude/skills/')
519
+ .option('--all', 'Install all available skills')
520
+ .option('--dir <path>', 'Custom output directory (default: ~/.claude/skills/)')
521
+ .action((name, opts) => {
522
+ const targetDir = opts?.dir
523
+ ? path_1.default.resolve(process.cwd(), opts.dir)
524
+ : path_1.default.join(os_1.default.homedir(), '.claude', 'skills');
525
+ // Determine which skills to install
526
+ let toInstall;
527
+ if (opts?.all) {
528
+ toInstall = SKILLS;
529
+ }
530
+ else if (name) {
531
+ const skill = SKILLS.find((s) => s.name === name);
532
+ if (!skill) {
533
+ (0, ui_1.error)(`Skill "${name}" not found.`);
534
+ (0, ui_1.info)(`Available: ${SKILLS.map((s) => s.name).join(', ')}`);
535
+ return;
536
+ }
537
+ toInstall = [skill];
538
+ }
539
+ else {
540
+ (0, ui_1.error)('Specify a skill name or use --all.');
541
+ (0, ui_1.info)(`Available: ${SKILLS.map((s) => s.name).join(', ')}`);
542
+ return;
543
+ }
544
+ // Create directory
545
+ if (!fs_1.default.existsSync(targetDir)) {
546
+ fs_1.default.mkdirSync(targetDir, { recursive: true });
547
+ }
548
+ for (const skill of toInstall) {
549
+ const skillDir = path_1.default.join(targetDir, skill.name);
550
+ const filePath = path_1.default.join(skillDir, 'SKILL.md');
551
+ const exists = fs_1.default.existsSync(filePath);
552
+ if (!fs_1.default.existsSync(skillDir)) {
553
+ fs_1.default.mkdirSync(skillDir, { recursive: true });
554
+ }
555
+ fs_1.default.writeFileSync(filePath, skill.content);
556
+ const displayPath = filePath.startsWith(os_1.default.homedir())
557
+ ? '~' + filePath.slice(os_1.default.homedir().length)
558
+ : path_1.default.relative(process.cwd(), filePath);
559
+ if (exists) {
560
+ (0, ui_1.success)(`Updated ${chalk_1.default.bold(skill.name)} → ${displayPath}`);
561
+ }
562
+ else {
563
+ (0, ui_1.success)(`Installed ${chalk_1.default.bold(skill.name)} → ${displayPath}`);
564
+ }
565
+ }
566
+ console.log();
567
+ (0, ui_1.divider)();
568
+ (0, ui_1.info)('Skills are now available to Claude Code in this project.');
569
+ });
570
+ }
571
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerSubagentsCommand(program: Command): void;
3
+ //# sourceMappingURL=subagents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagents.d.ts","sourceRoot":"","sources":["../../src/commands/subagents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0I/D"}