suzi-cli 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.
- package/README.md +1 -0
- package/dist/commands/accounts.d.ts +3 -0
- package/dist/commands/accounts.d.ts.map +1 -0
- package/dist/commands/accounts.js +310 -0
- package/dist/commands/accounts.js.map +1 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +148 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/list-tools.d.ts.map +1 -1
- package/dist/commands/list-tools.js +187 -138
- package/dist/commands/list-tools.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +2 -422
- package/dist/commands/skills.js.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +8 -12
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/suzi-guide.d.ts +2 -0
- package/dist/lib/suzi-guide.d.ts.map +1 -0
- package/dist/lib/suzi-guide.js +427 -0
- package/dist/lib/suzi-guide.js.map +1 -0
- package/package.json +12 -3
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# suzi
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/commands/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsFpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+P9D"}
|
|
@@ -0,0 +1,310 @@
|
|
|
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.registerAccountsCommand = registerAccountsCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
10
|
+
const config_1 = require("../lib/config");
|
|
11
|
+
const api_1 = require("../lib/api");
|
|
12
|
+
const ui_1 = require("../utils/ui");
|
|
13
|
+
// Name match takes priority over ID prefix match
|
|
14
|
+
function resolveAccount(nameOrId, accounts) {
|
|
15
|
+
if (!nameOrId.trim())
|
|
16
|
+
return null;
|
|
17
|
+
const exactName = accounts.filter(a => a.name.toLowerCase() === nameOrId.toLowerCase());
|
|
18
|
+
if (exactName.length === 1)
|
|
19
|
+
return exactName[0];
|
|
20
|
+
if (exactName.length > 1)
|
|
21
|
+
return exactName;
|
|
22
|
+
const idPrefix = accounts.filter(a => a.id.toLowerCase().startsWith(nameOrId.toLowerCase()));
|
|
23
|
+
if (idPrefix.length === 1)
|
|
24
|
+
return idPrefix[0];
|
|
25
|
+
if (idPrefix.length > 1)
|
|
26
|
+
return idPrefix;
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
async function pickAccount(matches, action) {
|
|
30
|
+
const { picked } = await inquirer_1.default.prompt([
|
|
31
|
+
{
|
|
32
|
+
type: 'list',
|
|
33
|
+
name: 'picked',
|
|
34
|
+
message: `Multiple accounts match. Which one do you want to ${action}?`,
|
|
35
|
+
choices: matches.map(a => ({ name: `${a.name} (${(0, ui_1.truncateAddress)(a.evmWalletAddress, 4)})`, value: a })),
|
|
36
|
+
},
|
|
37
|
+
]);
|
|
38
|
+
return picked;
|
|
39
|
+
}
|
|
40
|
+
async function resolveOrPick(nameOrId, accounts, action) {
|
|
41
|
+
const match = resolveAccount(nameOrId, accounts);
|
|
42
|
+
if (!match) {
|
|
43
|
+
(0, ui_1.error)(`No account matching "${nameOrId}".`);
|
|
44
|
+
(0, ui_1.info)('Run `suzi accounts` to see available accounts.');
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
if (Array.isArray(match)) {
|
|
48
|
+
return pickAccount(match, action);
|
|
49
|
+
}
|
|
50
|
+
return match;
|
|
51
|
+
}
|
|
52
|
+
async function fetchAccounts() {
|
|
53
|
+
const resp = await (0, api_1.get)('/api/accounts');
|
|
54
|
+
if (!resp.ok) {
|
|
55
|
+
(0, ui_1.error)(`Failed to fetch accounts: ${resp.data?.error || resp.status}`);
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const accounts = resp.data.accounts || [];
|
|
59
|
+
const config = (0, config_1.getConfig)();
|
|
60
|
+
(0, config_1.setAccounts)(accounts);
|
|
61
|
+
return { accounts, activeAccountId: config.activeAccountId };
|
|
62
|
+
}
|
|
63
|
+
async function refreshAccountCache() {
|
|
64
|
+
const result = await fetchAccounts();
|
|
65
|
+
if (!result) {
|
|
66
|
+
(0, ui_1.info)('Warning: could not refresh local account cache. Run `suzi accounts` to sync.');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function validateName(name) {
|
|
70
|
+
const trimmed = name.trim();
|
|
71
|
+
if (trimmed.length < 1 || trimmed.length > 64) {
|
|
72
|
+
return 'Account name must be between 1 and 64 characters.';
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
function withSpinner(spinner, fn) {
|
|
77
|
+
return fn().catch((err) => {
|
|
78
|
+
spinner.fail();
|
|
79
|
+
(0, ui_1.error)(err.message || 'An unexpected error occurred.');
|
|
80
|
+
throw err;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
function registerAccountsCommand(program) {
|
|
84
|
+
const accounts = program
|
|
85
|
+
.command('accounts')
|
|
86
|
+
.description('Manage accounts (wallets)');
|
|
87
|
+
// suzi accounts / suzi accounts list -- list all accounts
|
|
88
|
+
const listAction = async () => {
|
|
89
|
+
if (!(0, ui_1.requireAuth)())
|
|
90
|
+
return;
|
|
91
|
+
const spinner = (0, ora_1.default)('Fetching accounts...').start();
|
|
92
|
+
try {
|
|
93
|
+
const result = await withSpinner(spinner, fetchAccounts);
|
|
94
|
+
spinner.stop();
|
|
95
|
+
if (!result)
|
|
96
|
+
return;
|
|
97
|
+
const { accounts: accts, activeAccountId } = result;
|
|
98
|
+
if (accts.length === 0) {
|
|
99
|
+
(0, ui_1.info)('No accounts found. Create one with `suzi accounts create <name>`.');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
(0, ui_1.header)('Accounts');
|
|
103
|
+
console.log();
|
|
104
|
+
for (const acct of accts) {
|
|
105
|
+
const isActive = acct.id === activeAccountId;
|
|
106
|
+
const marker = isActive ? chalk_1.default.green('●') : chalk_1.default.gray('○');
|
|
107
|
+
const name = isActive ? chalk_1.default.bold(acct.name) : acct.name;
|
|
108
|
+
const tag = isActive ? ui_1.colors.primary(' (active)') : '';
|
|
109
|
+
console.log(` ${marker} ${name}${tag}`);
|
|
110
|
+
(0, ui_1.label)(' EVM', (0, ui_1.truncateAddress)(acct.evmWalletAddress));
|
|
111
|
+
(0, ui_1.label)(' SOL', (0, ui_1.truncateAddress)(acct.svmWalletAddress));
|
|
112
|
+
console.log();
|
|
113
|
+
}
|
|
114
|
+
(0, ui_1.divider)();
|
|
115
|
+
(0, ui_1.info)(`${accts.length} account${accts.length === 1 ? '' : 's'} total.`);
|
|
116
|
+
(0, ui_1.info)('Use `suzi accounts switch <name>` to change active account.');
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Error already displayed by withSpinner
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
accounts.action(listAction);
|
|
123
|
+
accounts.command('list').description('List all accounts').action(listAction);
|
|
124
|
+
// suzi accounts switch <name>
|
|
125
|
+
accounts
|
|
126
|
+
.command('switch <name>')
|
|
127
|
+
.description('Switch active account')
|
|
128
|
+
.action(async (name) => {
|
|
129
|
+
if (!(0, ui_1.requireAuth)())
|
|
130
|
+
return;
|
|
131
|
+
const spinner = (0, ora_1.default)('Fetching accounts...').start();
|
|
132
|
+
try {
|
|
133
|
+
const result = await withSpinner(spinner, fetchAccounts);
|
|
134
|
+
spinner.stop();
|
|
135
|
+
if (!result)
|
|
136
|
+
return;
|
|
137
|
+
const { accounts: accts, activeAccountId } = result;
|
|
138
|
+
const account = await resolveOrPick(name, accts, 'switch to');
|
|
139
|
+
if (!account)
|
|
140
|
+
return;
|
|
141
|
+
if (account.id === activeAccountId) {
|
|
142
|
+
(0, ui_1.info)(`"${account.name}" is already the active account.`);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const switchSpinner = (0, ora_1.default)(`Switching to "${account.name}"...`).start();
|
|
146
|
+
const resp = await withSpinner(switchSpinner, () => (0, api_1.post)(`/api/accounts/${account.id}/switch`));
|
|
147
|
+
switchSpinner.stop();
|
|
148
|
+
if (!resp.ok) {
|
|
149
|
+
(0, ui_1.error)(`Failed to switch: ${resp.data?.error || resp.status}`);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const switched = resp.data.account;
|
|
153
|
+
(0, config_1.setToken)(resp.data.accessToken);
|
|
154
|
+
(0, config_1.setActiveAccountId)(switched.id);
|
|
155
|
+
await refreshAccountCache();
|
|
156
|
+
(0, ui_1.success)(`Switched to "${switched.name}"`);
|
|
157
|
+
(0, ui_1.label)(' EVM', (0, ui_1.truncateAddress)(switched.evmWalletAddress));
|
|
158
|
+
(0, ui_1.label)(' SOL', (0, ui_1.truncateAddress)(switched.svmWalletAddress));
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Error already displayed by withSpinner
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
// suzi accounts create <name>
|
|
165
|
+
accounts
|
|
166
|
+
.command('create <name>')
|
|
167
|
+
.description('Create a new account')
|
|
168
|
+
.action(async (name) => {
|
|
169
|
+
if (!(0, ui_1.requireAuth)())
|
|
170
|
+
return;
|
|
171
|
+
const nameErr = validateName(name);
|
|
172
|
+
if (nameErr) {
|
|
173
|
+
(0, ui_1.error)(nameErr);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const spinner = (0, ora_1.default)(`Creating account "${name.trim()}"...`).start();
|
|
177
|
+
try {
|
|
178
|
+
const resp = await withSpinner(spinner, () => (0, api_1.post)('/api/accounts', { name: name.trim() }));
|
|
179
|
+
spinner.stop();
|
|
180
|
+
if (!resp.ok) {
|
|
181
|
+
(0, ui_1.error)(`Failed to create account: ${resp.data?.error || resp.status}`);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const created = resp.data.account;
|
|
185
|
+
(0, ui_1.success)(`Created account "${created.name}"`);
|
|
186
|
+
(0, ui_1.label)(' EVM', (0, ui_1.truncateAddress)(created.evmWalletAddress));
|
|
187
|
+
(0, ui_1.label)(' SOL', (0, ui_1.truncateAddress)(created.svmWalletAddress));
|
|
188
|
+
console.log();
|
|
189
|
+
const { shouldSwitch } = await inquirer_1.default.prompt([
|
|
190
|
+
{
|
|
191
|
+
type: 'confirm',
|
|
192
|
+
name: 'shouldSwitch',
|
|
193
|
+
message: `Switch to "${created.name}" now?`,
|
|
194
|
+
default: true,
|
|
195
|
+
},
|
|
196
|
+
]);
|
|
197
|
+
if (shouldSwitch) {
|
|
198
|
+
const switchSpinner = (0, ora_1.default)('Switching...').start();
|
|
199
|
+
const switchResp = await withSpinner(switchSpinner, () => (0, api_1.post)(`/api/accounts/${created.id}/switch`));
|
|
200
|
+
switchSpinner.stop();
|
|
201
|
+
if (!switchResp.ok) {
|
|
202
|
+
(0, ui_1.error)(`Failed to switch: ${switchResp.data?.error || switchResp.status}`);
|
|
203
|
+
// fall through to refreshAccountCache below
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
(0, config_1.setToken)(switchResp.data.accessToken);
|
|
207
|
+
(0, config_1.setActiveAccountId)(switchResp.data.account.id);
|
|
208
|
+
(0, ui_1.success)(`Switched to "${switchResp.data.account.name}"`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
await refreshAccountCache();
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// Error already displayed by withSpinner
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
// suzi accounts rename <name> <newName>
|
|
218
|
+
accounts
|
|
219
|
+
.command('rename <name> <newName>')
|
|
220
|
+
.description('Rename an account')
|
|
221
|
+
.action(async (name, newName) => {
|
|
222
|
+
if (!(0, ui_1.requireAuth)())
|
|
223
|
+
return;
|
|
224
|
+
const nameErr = validateName(newName);
|
|
225
|
+
if (nameErr) {
|
|
226
|
+
(0, ui_1.error)(nameErr);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const spinner = (0, ora_1.default)('Fetching accounts...').start();
|
|
230
|
+
try {
|
|
231
|
+
const result = await withSpinner(spinner, fetchAccounts);
|
|
232
|
+
spinner.stop();
|
|
233
|
+
if (!result)
|
|
234
|
+
return;
|
|
235
|
+
const { accounts: accts } = result;
|
|
236
|
+
const account = await resolveOrPick(name, accts, 'rename');
|
|
237
|
+
if (!account)
|
|
238
|
+
return;
|
|
239
|
+
const renameSpinner = (0, ora_1.default)(`Renaming to "${newName.trim()}"...`).start();
|
|
240
|
+
const resp = await withSpinner(renameSpinner, () => (0, api_1.put)(`/api/accounts/${account.id}`, { name: newName.trim() }));
|
|
241
|
+
renameSpinner.stop();
|
|
242
|
+
if (!resp.ok) {
|
|
243
|
+
(0, ui_1.error)(`Failed to rename: ${resp.data?.error || resp.status}`);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
await refreshAccountCache();
|
|
247
|
+
(0, ui_1.success)(`Renamed "${account.name}" → "${resp.data.account.name}"`);
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// Error already displayed by withSpinner
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
// suzi accounts delete <name>
|
|
254
|
+
accounts
|
|
255
|
+
.command('delete <name>')
|
|
256
|
+
.description('Delete an account')
|
|
257
|
+
.option('-f, --force', 'Skip confirmation')
|
|
258
|
+
.action(async (name, opts) => {
|
|
259
|
+
if (!(0, ui_1.requireAuth)())
|
|
260
|
+
return;
|
|
261
|
+
const spinner = (0, ora_1.default)('Fetching accounts...').start();
|
|
262
|
+
try {
|
|
263
|
+
const result = await withSpinner(spinner, fetchAccounts);
|
|
264
|
+
spinner.stop();
|
|
265
|
+
if (!result)
|
|
266
|
+
return;
|
|
267
|
+
const { accounts: accts, activeAccountId } = result;
|
|
268
|
+
if (accts.length === 1) {
|
|
269
|
+
(0, ui_1.error)('Cannot delete your only account. Create another account first.');
|
|
270
|
+
(0, ui_1.info)('Use `suzi accounts create <name>` to create a new account.');
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const account = await resolveOrPick(name, accts, 'delete');
|
|
274
|
+
if (!account)
|
|
275
|
+
return;
|
|
276
|
+
if (account.id === activeAccountId) {
|
|
277
|
+
(0, ui_1.error)('Cannot delete the active account. Switch to another account first.');
|
|
278
|
+
(0, ui_1.info)('Use `suzi accounts switch <name>` to change accounts.');
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
if (!opts.force) {
|
|
282
|
+
const { confirmed } = await inquirer_1.default.prompt([
|
|
283
|
+
{
|
|
284
|
+
type: 'confirm',
|
|
285
|
+
name: 'confirmed',
|
|
286
|
+
message: `Delete account "${account.name}"? This cannot be undone.`,
|
|
287
|
+
default: false,
|
|
288
|
+
},
|
|
289
|
+
]);
|
|
290
|
+
if (!confirmed) {
|
|
291
|
+
(0, ui_1.info)('Cancelled.');
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const deleteSpinner = (0, ora_1.default)(`Deleting "${account.name}"...`).start();
|
|
296
|
+
const resp = await withSpinner(deleteSpinner, () => (0, api_1.del)(`/api/accounts/${account.id}`));
|
|
297
|
+
deleteSpinner.stop();
|
|
298
|
+
if (!resp.ok) {
|
|
299
|
+
(0, ui_1.error)(`Failed to delete: ${resp.data?.error || resp.status}`);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
await refreshAccountCache();
|
|
303
|
+
(0, ui_1.success)(`Deleted account "${account.name}".`);
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
// Error already displayed by withSpinner
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/commands/accounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0EpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8E5D"}
|
|
@@ -0,0 +1,148 @@
|
|
|
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.registerCreateCommand = registerCreateCommand;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const ui_1 = require("../utils/ui");
|
|
12
|
+
const suzi_guide_1 = require("../lib/suzi-guide");
|
|
13
|
+
const AGENT_TS_TEMPLATE = `export default defineAgent({
|
|
14
|
+
meta: {
|
|
15
|
+
name: 'My Agent',
|
|
16
|
+
version: '0.1.0',
|
|
17
|
+
},
|
|
18
|
+
resources: {
|
|
19
|
+
wallet: resource.wallet('evm'),
|
|
20
|
+
},
|
|
21
|
+
lifecycle: {
|
|
22
|
+
onActivate: async (ctx) => {
|
|
23
|
+
await ctx.actions.suzi.log({ message: 'Agent activated' });
|
|
24
|
+
},
|
|
25
|
+
onDeactivate: async (ctx) => {
|
|
26
|
+
await ctx.actions.suzi.log({ message: 'Agent deactivated' });
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
triggers: {
|
|
30
|
+
manual: on.suzi.manual(async (ctx, input) => {
|
|
31
|
+
await ctx.actions.suzi.log({ message: 'Agent executed manually' });
|
|
32
|
+
return { ok: true };
|
|
33
|
+
}),
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
`;
|
|
37
|
+
function buildSuziSystemPrompt() {
|
|
38
|
+
return `<suzi-agent-creator>
|
|
39
|
+
You are helping the user create a Suzi autonomous agent. You have full knowledge of the Suzi platform, its CLI, and the agent DSL. Your job is to help the user write an agent.ts file that implements their desired strategy or automation.
|
|
40
|
+
|
|
41
|
+
The working directory contains an agent.ts template file. Help the user modify it to match their needs.
|
|
42
|
+
|
|
43
|
+
<suzi-guide>
|
|
44
|
+
${suzi_guide_1.SUZI_GUIDE_CONTENT}
|
|
45
|
+
</suzi-guide>
|
|
46
|
+
|
|
47
|
+
<rules>
|
|
48
|
+
- Agent code MUST default-export defineAgent({...})
|
|
49
|
+
- No imports allowed — agent code is self-contained
|
|
50
|
+
- The runtime provides defineAgent, on, resource, config, requirement as globals
|
|
51
|
+
- Use ctx.actions.<protocol>.<action>() for all external calls
|
|
52
|
+
- Always include at least one trigger
|
|
53
|
+
- Use ctx.actions.suzi.log() for debugging
|
|
54
|
+
- To discover available protocols and actions, run: suzi list-tools --verbose
|
|
55
|
+
- To discover actions for a specific protocol, run: suzi list-tools --protocol <name>
|
|
56
|
+
</rules>
|
|
57
|
+
|
|
58
|
+
<workflow>
|
|
59
|
+
After the agent.ts file is ready, instruct the user to:
|
|
60
|
+
1. suzi deploy ./agent.ts — deploy the agent to Suzi
|
|
61
|
+
2. suzi agents activate <id> — activate it (the deploy output shows the agent ID)
|
|
62
|
+
3. suzi agents execute <id> — test it with a manual execution
|
|
63
|
+
4. suzi agents logs <id> — check the execution logs
|
|
64
|
+
</workflow>
|
|
65
|
+
</suzi-agent-creator>`;
|
|
66
|
+
}
|
|
67
|
+
function isClaudeAvailable() {
|
|
68
|
+
try {
|
|
69
|
+
const cmd = process.platform === 'win32' ? 'where claude' : 'which claude';
|
|
70
|
+
(0, child_process_1.execSync)(cmd, { stdio: 'ignore' });
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function registerCreateCommand(program) {
|
|
78
|
+
program
|
|
79
|
+
.command('create [dir]')
|
|
80
|
+
.description('Create an agent with AI assistance (launches Claude Code)')
|
|
81
|
+
.option('--no-scaffold', 'Skip agent.ts template creation')
|
|
82
|
+
.action(async (dir, opts) => {
|
|
83
|
+
const workingDir = path_1.default.resolve(process.cwd(), dir || './my-agent');
|
|
84
|
+
const shouldScaffold = opts?.scaffold !== false;
|
|
85
|
+
// Check that claude CLI is available
|
|
86
|
+
if (!isClaudeAvailable()) {
|
|
87
|
+
console.log();
|
|
88
|
+
(0, ui_1.error)('Claude Code is required but not found in PATH.');
|
|
89
|
+
console.log();
|
|
90
|
+
console.log(` Install it with:`);
|
|
91
|
+
console.log(` ${ui_1.colors.primary('$')} ${chalk_1.default.white('npm install -g @anthropic-ai/claude-code')}`);
|
|
92
|
+
console.log();
|
|
93
|
+
(0, ui_1.info)('Learn more: https://docs.anthropic.com/en/docs/claude-code');
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
// Ensure working directory exists
|
|
97
|
+
if (!fs_1.default.existsSync(workingDir)) {
|
|
98
|
+
fs_1.default.mkdirSync(workingDir, { recursive: true });
|
|
99
|
+
}
|
|
100
|
+
const agentPath = path_1.default.join(workingDir, 'agent.ts');
|
|
101
|
+
const agentExists = fs_1.default.existsSync(agentPath);
|
|
102
|
+
// Scaffold agent.ts template
|
|
103
|
+
if (shouldScaffold && !agentExists) {
|
|
104
|
+
fs_1.default.writeFileSync(agentPath, AGENT_TS_TEMPLATE);
|
|
105
|
+
(0, ui_1.success)(`Created agent.ts template at ${path_1.default.relative(process.cwd(), agentPath)}`);
|
|
106
|
+
}
|
|
107
|
+
else if (agentExists) {
|
|
108
|
+
(0, ui_1.info)(`Using existing agent.ts at ${path_1.default.relative(process.cwd(), agentPath)}`);
|
|
109
|
+
}
|
|
110
|
+
console.log();
|
|
111
|
+
(0, ui_1.divider)();
|
|
112
|
+
console.log();
|
|
113
|
+
console.log(` ${chalk_1.default.bold('Starting AI-assisted agent creation...')}`);
|
|
114
|
+
console.log(` ${ui_1.colors.muted(`Working directory: ${workingDir}`)}`);
|
|
115
|
+
console.log(` ${ui_1.colors.muted('Type your agent idea and Claude will build it for you.')}`);
|
|
116
|
+
console.log(` ${ui_1.colors.muted('Press Ctrl+C to exit at any time.')}`);
|
|
117
|
+
console.log();
|
|
118
|
+
// Spawn claude with suzi context appended to system prompt
|
|
119
|
+
const args = [
|
|
120
|
+
'--append-system-prompt',
|
|
121
|
+
buildSuziSystemPrompt(),
|
|
122
|
+
];
|
|
123
|
+
const child = (0, child_process_1.spawn)('claude', args, {
|
|
124
|
+
stdio: 'inherit',
|
|
125
|
+
cwd: workingDir,
|
|
126
|
+
env: { ...process.env },
|
|
127
|
+
});
|
|
128
|
+
child.on('error', (err) => {
|
|
129
|
+
(0, ui_1.error)(`Failed to start Claude Code: ${err.message}`);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
});
|
|
132
|
+
child.on('exit', (code) => {
|
|
133
|
+
console.log();
|
|
134
|
+
if (fs_1.default.existsSync(agentPath)) {
|
|
135
|
+
(0, ui_1.divider)();
|
|
136
|
+
console.log();
|
|
137
|
+
console.log(chalk_1.default.bold(' Next steps:'));
|
|
138
|
+
console.log();
|
|
139
|
+
console.log(` ${ui_1.colors.primary('$')} ${chalk_1.default.white(`suzi deploy ${path_1.default.relative(process.cwd(), agentPath)}`)}`);
|
|
140
|
+
console.log(` ${ui_1.colors.primary('$')} ${chalk_1.default.white('suzi agents activate <id>')}`);
|
|
141
|
+
console.log(` ${ui_1.colors.primary('$')} ${chalk_1.default.white('suzi agents execute <id>')}`);
|
|
142
|
+
console.log();
|
|
143
|
+
}
|
|
144
|
+
process.exit(code ?? 0);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-tools.d.ts","sourceRoot":"","sources":["../../src/commands/list-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"list-tools.d.ts","sourceRoot":"","sources":["../../src/commands/list-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0GpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqI/D"}
|