@agentage/cli 0.1.10 → 0.1.12

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/cli.js +47 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/cli.test.js +2 -2
  4. package/dist/cli.test.js.map +1 -1
  5. package/dist/commands/install.d.ts +8 -0
  6. package/dist/commands/install.d.ts.map +1 -0
  7. package/dist/commands/install.js +90 -0
  8. package/dist/commands/install.js.map +1 -0
  9. package/dist/commands/install.test.d.ts +2 -0
  10. package/dist/commands/install.test.d.ts.map +1 -0
  11. package/dist/commands/install.test.js +172 -0
  12. package/dist/commands/install.test.js.map +1 -0
  13. package/dist/commands/list.js +1 -1
  14. package/dist/commands/list.js.map +1 -1
  15. package/dist/commands/list.test.js +6 -0
  16. package/dist/commands/list.test.js.map +1 -1
  17. package/dist/commands/publish.d.ts +10 -0
  18. package/dist/commands/publish.d.ts.map +1 -0
  19. package/dist/commands/publish.js +138 -0
  20. package/dist/commands/publish.js.map +1 -0
  21. package/dist/commands/publish.test.d.ts +2 -0
  22. package/dist/commands/publish.test.d.ts.map +1 -0
  23. package/dist/commands/publish.test.js +307 -0
  24. package/dist/commands/publish.test.js.map +1 -0
  25. package/dist/commands/search.d.ts +8 -0
  26. package/dist/commands/search.d.ts.map +1 -0
  27. package/dist/commands/search.js +41 -0
  28. package/dist/commands/search.js.map +1 -0
  29. package/dist/commands/search.test.d.ts +2 -0
  30. package/dist/commands/search.test.d.ts.map +1 -0
  31. package/dist/commands/search.test.js +138 -0
  32. package/dist/commands/search.test.js.map +1 -0
  33. package/dist/commands/whoami.d.ts.map +1 -1
  34. package/dist/commands/whoami.js +6 -1
  35. package/dist/commands/whoami.js.map +1 -1
  36. package/dist/commands/whoami.test.js +10 -0
  37. package/dist/commands/whoami.test.js.map +1 -1
  38. package/dist/schemas/agent.schema.d.ts +2 -2
  39. package/dist/services/registry.service.d.ts +13 -0
  40. package/dist/services/registry.service.d.ts.map +1 -0
  41. package/dist/services/registry.service.js +74 -0
  42. package/dist/services/registry.service.js.map +1 -0
  43. package/dist/services/registry.service.test.d.ts +2 -0
  44. package/dist/services/registry.service.test.d.ts.map +1 -0
  45. package/dist/services/registry.service.test.js +222 -0
  46. package/dist/services/registry.service.test.js.map +1 -0
  47. package/dist/types/registry.types.d.ts +65 -0
  48. package/dist/types/registry.types.d.ts.map +1 -0
  49. package/dist/types/registry.types.js +2 -0
  50. package/dist/types/registry.types.js.map +1 -0
  51. package/dist/utils/agent-parser.d.ts +26 -0
  52. package/dist/utils/agent-parser.d.ts.map +1 -0
  53. package/dist/utils/agent-parser.js +45 -0
  54. package/dist/utils/agent-parser.js.map +1 -0
  55. package/dist/utils/agent-parser.test.d.ts +2 -0
  56. package/dist/utils/agent-parser.test.d.ts.map +1 -0
  57. package/dist/utils/agent-parser.test.js +102 -0
  58. package/dist/utils/agent-parser.test.js.map +1 -0
  59. package/dist/utils/config.d.ts +10 -0
  60. package/dist/utils/config.d.ts.map +1 -1
  61. package/dist/utils/config.js +28 -1
  62. package/dist/utils/config.js.map +1 -1
  63. package/dist/utils/config.test.js +66 -1
  64. package/dist/utils/config.test.js.map +1 -1
  65. package/package.json +1 -1
@@ -0,0 +1,138 @@
1
+ import chalk from 'chalk';
2
+ import { existsSync } from 'fs';
3
+ import { readdir } from 'fs/promises';
4
+ import { join } from 'path';
5
+ import { publishAgent, RegistryApiError, } from '../services/registry.service.js';
6
+ import { generateDateVersion, isValidAgentName, readAgentFile, } from '../utils/agent-parser.js';
7
+ import { getAuthStatus } from '../utils/config.js';
8
+ const resolveAgentPath = async (pathArg) => {
9
+ if (pathArg) {
10
+ if (existsSync(pathArg)) {
11
+ return pathArg;
12
+ }
13
+ const withExt = pathArg.endsWith('.agent.md')
14
+ ? pathArg
15
+ : `${pathArg}.agent.md`;
16
+ if (existsSync(withExt)) {
17
+ return withExt;
18
+ }
19
+ const inAgentsDir = join('agents', withExt);
20
+ if (existsSync(inAgentsDir)) {
21
+ return inAgentsDir;
22
+ }
23
+ return null;
24
+ }
25
+ const currentDirFiles = await readdir('.').catch(() => []);
26
+ const agentFiles = currentDirFiles.filter((f) => f.endsWith('.agent.md'));
27
+ if (agentFiles.length === 1) {
28
+ return agentFiles[0];
29
+ }
30
+ if (agentFiles.length > 1) {
31
+ console.log(chalk.yellow('Multiple agent files found. Please specify one:'));
32
+ for (const file of agentFiles) {
33
+ console.log(` - ${file}`);
34
+ }
35
+ return null;
36
+ }
37
+ if (existsSync('agents')) {
38
+ const agentsDir = await readdir('agents').catch(() => []);
39
+ const agentMdFiles = agentsDir.filter((f) => f.endsWith('.agent.md'));
40
+ if (agentMdFiles.length === 1) {
41
+ return join('agents', agentMdFiles[0]);
42
+ }
43
+ if (agentMdFiles.length > 1) {
44
+ console.log(chalk.yellow('Multiple agent files found. Please specify one:'));
45
+ for (const file of agentMdFiles) {
46
+ console.log(` - agents/${file}`);
47
+ }
48
+ return null;
49
+ }
50
+ }
51
+ return null;
52
+ };
53
+ export const publishCommand = async (pathArg, options = {}) => {
54
+ try {
55
+ const authStatus = await getAuthStatus();
56
+ if (authStatus.status === 'expired') {
57
+ console.error(chalk.red('❌ Session expired.'));
58
+ console.log('Run', chalk.cyan('agent login'), 'to authenticate again.');
59
+ process.exit(1);
60
+ }
61
+ if (authStatus.status === 'not_authenticated') {
62
+ console.error(chalk.red('❌ Not logged in.'));
63
+ console.log('Run', chalk.cyan('agent login'), 'to authenticate.');
64
+ process.exit(1);
65
+ }
66
+ const agentPath = await resolveAgentPath(pathArg);
67
+ if (!agentPath) {
68
+ console.error(chalk.red('❌ No agent file found.'));
69
+ console.log('Specify a path or run from a directory with a .agent.md file.');
70
+ process.exit(1);
71
+ }
72
+ console.log(chalk.gray(`Reading ${agentPath}...`));
73
+ const { frontmatter, content } = await readAgentFile(agentPath);
74
+ if (!frontmatter.name) {
75
+ console.error(chalk.red('❌ Agent must have a name in frontmatter.'));
76
+ console.log(chalk.gray('Add "name: your-agent-name" to the YAML frontmatter.'));
77
+ process.exit(1);
78
+ }
79
+ if (!isValidAgentName(frontmatter.name)) {
80
+ console.error(chalk.red('❌ Invalid agent name.'));
81
+ console.log(chalk.gray('Name must be lowercase alphanumeric with hyphens (e.g., my-agent).'));
82
+ process.exit(1);
83
+ }
84
+ const version = options.version || frontmatter.version || generateDateVersion();
85
+ const visibility = options.visibility || 'public';
86
+ if (options.dryRun) {
87
+ console.log();
88
+ console.log(chalk.cyan('📋 Dry run - would publish:'));
89
+ console.log(` Name: ${chalk.bold(frontmatter.name)}`);
90
+ console.log(` Version: ${chalk.bold(version)}`);
91
+ console.log(` Visibility: ${chalk.bold(visibility)}`);
92
+ if (frontmatter.description) {
93
+ console.log(` Description: ${frontmatter.description}`);
94
+ }
95
+ if (options.tag && options.tag.length > 0) {
96
+ console.log(` Tags: ${options.tag.join(', ')}`);
97
+ }
98
+ if (options.changelog) {
99
+ console.log(` Changelog: ${options.changelog}`);
100
+ }
101
+ console.log();
102
+ return;
103
+ }
104
+ console.log(chalk.cyan(`📤 Publishing ${frontmatter.name}@${version}...`));
105
+ const result = await publishAgent({
106
+ name: frontmatter.name,
107
+ description: frontmatter.description,
108
+ visibility,
109
+ version,
110
+ content,
111
+ contentType: 'markdown',
112
+ tags: options.tag,
113
+ changelog: options.changelog,
114
+ });
115
+ console.log();
116
+ console.log(chalk.green(`✅ Published ${result.owner}/${result.name}@${result.version}`));
117
+ console.log(chalk.gray(` Install with: agent install ${result.owner}/${result.name}`));
118
+ console.log();
119
+ }
120
+ catch (error) {
121
+ if (error instanceof RegistryApiError) {
122
+ console.error(chalk.red(`❌ ${error.message}`));
123
+ if (error.details) {
124
+ for (const [field, msg] of Object.entries(error.details)) {
125
+ console.error(chalk.gray(` ${field}: ${msg}`));
126
+ }
127
+ }
128
+ if (error.code === 'version_exists') {
129
+ console.log(chalk.gray(' Use --version to specify a newer version.'));
130
+ }
131
+ }
132
+ else {
133
+ console.error(chalk.red(`❌ Failed: ${error.message}`));
134
+ }
135
+ process.exit(1);
136
+ }
137
+ };
138
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=publish.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.test.d.ts","sourceRoot":"","sources":["../../src/commands/publish.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,307 @@
1
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from 'fs';
2
+ import { publishCommand } from './publish.js';
3
+ jest.mock('../utils/config.js', () => ({
4
+ getAuthStatus: jest.fn(),
5
+ getRegistryUrl: jest.fn().mockResolvedValue('https://dev.agentage.io'),
6
+ }));
7
+ jest.mock('../services/registry.service.js', () => ({
8
+ publishAgent: jest.fn(),
9
+ RegistryApiError: class extends Error {
10
+ code;
11
+ statusCode;
12
+ constructor(message, code, statusCode) {
13
+ super(message);
14
+ this.code = code;
15
+ this.statusCode = statusCode;
16
+ }
17
+ },
18
+ }));
19
+ describe('publishCommand', () => {
20
+ const testDir = 'test-publish-workspace';
21
+ const originalCwd = process.cwd();
22
+ beforeEach(() => {
23
+ process.chdir(originalCwd);
24
+ if (existsSync(testDir)) {
25
+ rmSync(testDir, { recursive: true, force: true });
26
+ }
27
+ mkdirSync(testDir, { recursive: true });
28
+ process.chdir(testDir);
29
+ jest.clearAllMocks();
30
+ });
31
+ afterEach(() => {
32
+ process.chdir(originalCwd);
33
+ if (existsSync(testDir)) {
34
+ rmSync(testDir, { recursive: true, force: true });
35
+ }
36
+ });
37
+ test('requires authentication', async () => {
38
+ const { getAuthStatus } = require('../utils/config.js');
39
+ getAuthStatus.mockResolvedValue({ status: 'not_authenticated' });
40
+ const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {
41
+ throw new Error('process.exit');
42
+ });
43
+ const mockConsoleError = jest.spyOn(console, 'error').mockImplementation();
44
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
45
+ await expect(publishCommand()).rejects.toThrow('process.exit');
46
+ expect(mockConsoleError).toHaveBeenCalledWith(expect.stringContaining('Not logged in'));
47
+ mockExit.mockRestore();
48
+ mockConsoleError.mockRestore();
49
+ mockConsoleLog.mockRestore();
50
+ });
51
+ test('shows expired session message', async () => {
52
+ const { getAuthStatus } = require('../utils/config.js');
53
+ getAuthStatus.mockResolvedValue({ status: 'expired' });
54
+ const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {
55
+ throw new Error('process.exit');
56
+ });
57
+ const mockConsoleError = jest.spyOn(console, 'error').mockImplementation();
58
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
59
+ await expect(publishCommand()).rejects.toThrow('process.exit');
60
+ expect(mockConsoleError).toHaveBeenCalledWith(expect.stringContaining('Session expired'));
61
+ mockExit.mockRestore();
62
+ mockConsoleError.mockRestore();
63
+ mockConsoleLog.mockRestore();
64
+ });
65
+ test('finds agent file in current directory', async () => {
66
+ const { getAuthStatus } = require('../utils/config.js');
67
+ const { publishAgent } = require('../services/registry.service.js');
68
+ getAuthStatus.mockResolvedValue({
69
+ status: 'authenticated',
70
+ token: 'test-token',
71
+ });
72
+ publishAgent.mockResolvedValue({
73
+ name: 'my-agent',
74
+ owner: 'testuser',
75
+ version: '2025-11-30',
76
+ });
77
+ const agentContent = `---
78
+ name: my-agent
79
+ description: Test agent
80
+ ---
81
+ You are helpful.`;
82
+ writeFileSync('my-agent.agent.md', agentContent);
83
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
84
+ await publishCommand();
85
+ expect(publishAgent).toHaveBeenCalledWith(expect.objectContaining({
86
+ name: 'my-agent',
87
+ visibility: 'public',
88
+ }));
89
+ expect(mockConsoleLog).toHaveBeenCalledWith(expect.stringContaining('Published'));
90
+ mockConsoleLog.mockRestore();
91
+ });
92
+ test('supports dry run', async () => {
93
+ const { getAuthStatus } = require('../utils/config.js');
94
+ const { publishAgent } = require('../services/registry.service.js');
95
+ getAuthStatus.mockResolvedValue({
96
+ status: 'authenticated',
97
+ token: 'test-token',
98
+ });
99
+ const agentContent = `---
100
+ name: my-agent
101
+ description: Test agent
102
+ ---
103
+ You are helpful.`;
104
+ writeFileSync('my-agent.agent.md', agentContent);
105
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
106
+ await publishCommand(undefined, { dryRun: true });
107
+ expect(publishAgent).not.toHaveBeenCalled();
108
+ expect(mockConsoleLog).toHaveBeenCalledWith(expect.stringContaining('Dry run'));
109
+ mockConsoleLog.mockRestore();
110
+ });
111
+ test('validates agent name', async () => {
112
+ const { getAuthStatus } = require('../utils/config.js');
113
+ getAuthStatus.mockResolvedValue({
114
+ status: 'authenticated',
115
+ token: 'test-token',
116
+ });
117
+ const agentContent = `---
118
+ name: Invalid-Name
119
+ ---
120
+ Content`;
121
+ writeFileSync('agent.agent.md', agentContent);
122
+ const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {
123
+ throw new Error('process.exit');
124
+ });
125
+ const mockConsoleError = jest.spyOn(console, 'error').mockImplementation();
126
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
127
+ await expect(publishCommand()).rejects.toThrow('process.exit');
128
+ expect(mockConsoleError).toHaveBeenCalledWith(expect.stringContaining('Invalid agent name'));
129
+ mockExit.mockRestore();
130
+ mockConsoleError.mockRestore();
131
+ mockConsoleLog.mockRestore();
132
+ });
133
+ test('finds agent with explicit path', async () => {
134
+ const { getAuthStatus } = require('../utils/config.js');
135
+ const { publishAgent } = require('../services/registry.service.js');
136
+ getAuthStatus.mockResolvedValue({
137
+ status: 'authenticated',
138
+ token: 'test-token',
139
+ });
140
+ publishAgent.mockResolvedValue({
141
+ name: 'my-agent',
142
+ owner: 'testuser',
143
+ version: '2025-11-30',
144
+ });
145
+ const agentContent = `---
146
+ name: my-agent
147
+ description: Test agent
148
+ ---
149
+ You are helpful.`;
150
+ writeFileSync('my-agent.agent.md', agentContent);
151
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
152
+ await publishCommand('my-agent.agent.md');
153
+ expect(publishAgent).toHaveBeenCalled();
154
+ mockConsoleLog.mockRestore();
155
+ });
156
+ test('finds agent with name without extension', async () => {
157
+ const { getAuthStatus } = require('../utils/config.js');
158
+ const { publishAgent } = require('../services/registry.service.js');
159
+ getAuthStatus.mockResolvedValue({
160
+ status: 'authenticated',
161
+ token: 'test-token',
162
+ });
163
+ publishAgent.mockResolvedValue({
164
+ name: 'my-agent',
165
+ owner: 'testuser',
166
+ version: '2025-11-30',
167
+ });
168
+ const agentContent = `---
169
+ name: my-agent
170
+ ---
171
+ Content`;
172
+ writeFileSync('my-agent.agent.md', agentContent);
173
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
174
+ await publishCommand('my-agent');
175
+ expect(publishAgent).toHaveBeenCalled();
176
+ mockConsoleLog.mockRestore();
177
+ });
178
+ test('finds agent in agents directory', async () => {
179
+ const { getAuthStatus } = require('../utils/config.js');
180
+ const { publishAgent } = require('../services/registry.service.js');
181
+ getAuthStatus.mockResolvedValue({
182
+ status: 'authenticated',
183
+ token: 'test-token',
184
+ });
185
+ publishAgent.mockResolvedValue({
186
+ name: 'my-agent',
187
+ owner: 'testuser',
188
+ version: '2025-11-30',
189
+ });
190
+ mkdirSync('agents');
191
+ const agentContent = `---
192
+ name: my-agent
193
+ ---
194
+ Content`;
195
+ writeFileSync('agents/my-agent.agent.md', agentContent);
196
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
197
+ await publishCommand('my-agent');
198
+ expect(publishAgent).toHaveBeenCalled();
199
+ mockConsoleLog.mockRestore();
200
+ });
201
+ test('fails when no agent file found', async () => {
202
+ const { getAuthStatus } = require('../utils/config.js');
203
+ getAuthStatus.mockResolvedValue({
204
+ status: 'authenticated',
205
+ token: 'test-token',
206
+ });
207
+ const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {
208
+ throw new Error('process.exit');
209
+ });
210
+ const mockConsoleError = jest.spyOn(console, 'error').mockImplementation();
211
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
212
+ await expect(publishCommand('nonexistent')).rejects.toThrow('process.exit');
213
+ expect(mockConsoleError).toHaveBeenCalledWith(expect.stringContaining('No agent file found'));
214
+ mockExit.mockRestore();
215
+ mockConsoleError.mockRestore();
216
+ mockConsoleLog.mockRestore();
217
+ });
218
+ test('fails when agent has no name', async () => {
219
+ const { getAuthStatus } = require('../utils/config.js');
220
+ getAuthStatus.mockResolvedValue({
221
+ status: 'authenticated',
222
+ token: 'test-token',
223
+ });
224
+ const agentContent = `---
225
+ description: No name agent
226
+ ---
227
+ Content`;
228
+ writeFileSync('agent.agent.md', agentContent);
229
+ const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {
230
+ throw new Error('process.exit');
231
+ });
232
+ const mockConsoleError = jest.spyOn(console, 'error').mockImplementation();
233
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
234
+ await expect(publishCommand()).rejects.toThrow('process.exit');
235
+ expect(mockConsoleError).toHaveBeenCalledWith(expect.stringContaining('must have a name'));
236
+ mockExit.mockRestore();
237
+ mockConsoleError.mockRestore();
238
+ mockConsoleLog.mockRestore();
239
+ });
240
+ test('shows multiple agent files warning', async () => {
241
+ const { getAuthStatus } = require('../utils/config.js');
242
+ getAuthStatus.mockResolvedValue({
243
+ status: 'authenticated',
244
+ token: 'test-token',
245
+ });
246
+ writeFileSync('agent1.agent.md', '---\nname: a1\n---\n');
247
+ writeFileSync('agent2.agent.md', '---\nname: a2\n---\n');
248
+ const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {
249
+ throw new Error('process.exit');
250
+ });
251
+ const mockConsoleError = jest.spyOn(console, 'error').mockImplementation();
252
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
253
+ await expect(publishCommand()).rejects.toThrow('process.exit');
254
+ expect(mockConsoleLog).toHaveBeenCalledWith(expect.stringContaining('Multiple agent files found'));
255
+ mockExit.mockRestore();
256
+ mockConsoleError.mockRestore();
257
+ mockConsoleLog.mockRestore();
258
+ });
259
+ test('handles RegistryApiError', async () => {
260
+ const { getAuthStatus } = require('../utils/config.js');
261
+ const { publishAgent, RegistryApiError, } = require('../services/registry.service.js');
262
+ getAuthStatus.mockResolvedValue({
263
+ status: 'authenticated',
264
+ token: 'test-token',
265
+ });
266
+ publishAgent.mockRejectedValue(new RegistryApiError('Version exists', 'version_exists', 409));
267
+ const agentContent = `---
268
+ name: my-agent
269
+ ---
270
+ Content`;
271
+ writeFileSync('my-agent.agent.md', agentContent);
272
+ const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {
273
+ throw new Error('process.exit');
274
+ });
275
+ const mockConsoleError = jest.spyOn(console, 'error').mockImplementation();
276
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
277
+ await expect(publishCommand()).rejects.toThrow('process.exit');
278
+ expect(mockConsoleError).toHaveBeenCalledWith(expect.stringContaining('Version exists'));
279
+ mockExit.mockRestore();
280
+ mockConsoleError.mockRestore();
281
+ mockConsoleLog.mockRestore();
282
+ });
283
+ test('dry run shows all options', async () => {
284
+ const { getAuthStatus } = require('../utils/config.js');
285
+ getAuthStatus.mockResolvedValue({
286
+ status: 'authenticated',
287
+ token: 'test-token',
288
+ });
289
+ const agentContent = `---
290
+ name: my-agent
291
+ description: A test agent
292
+ version: 1.0.0
293
+ ---
294
+ Content`;
295
+ writeFileSync('my-agent.agent.md', agentContent);
296
+ const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
297
+ await publishCommand(undefined, {
298
+ dryRun: true,
299
+ tag: ['ai', 'test'],
300
+ changelog: 'Initial release',
301
+ });
302
+ expect(mockConsoleLog).toHaveBeenCalledWith(expect.stringContaining('Tags'));
303
+ expect(mockConsoleLog).toHaveBeenCalledWith(expect.stringContaining('Changelog'));
304
+ mockConsoleLog.mockRestore();
305
+ });
306
+ });
307
+ //# sourceMappingURL=publish.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.test.js","sourceRoot":"","sources":["../../src/commands/publish.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface SearchOptions {
2
+ limit?: string;
3
+ page?: string;
4
+ json?: boolean;
5
+ }
6
+ export declare const searchCommand: (query: string, options?: SearchOptions) => Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAMA,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAKD,eAAO,MAAM,aAAa,GACxB,OAAO,MAAM,EACb,UAAS,aAAkB,KAC1B,OAAO,CAAC,IAAI,CA4Dd,CAAC"}
@@ -0,0 +1,41 @@
1
+ import chalk from 'chalk';
2
+ import { RegistryApiError, searchAgents, } from '../services/registry.service.js';
3
+ export const searchCommand = async (query, options = {}) => {
4
+ try {
5
+ const limit = options.limit ? parseInt(options.limit, 10) : 10;
6
+ const page = options.page ? parseInt(options.page, 10) : 1;
7
+ console.log(chalk.cyan(`🔍 Searching for "${query}"...\n`));
8
+ const result = await searchAgents(query, page, limit);
9
+ if (options.json) {
10
+ console.log(JSON.stringify(result, null, 2));
11
+ return;
12
+ }
13
+ if (result.agents.length === 0) {
14
+ console.log(chalk.yellow('No agents found.'));
15
+ return;
16
+ }
17
+ console.log(chalk.white.bold(`Found ${result.total} agent${result.total !== 1 ? 's' : ''}:\n`));
18
+ for (const agent of result.agents) {
19
+ console.log(chalk.cyan.bold(` ${agent.owner}/${agent.name}`));
20
+ console.log(chalk.gray(` ${agent.description || 'No description'}`));
21
+ console.log(chalk.gray(` v${agent.latestVersion} • ${agent.totalDownloads} downloads`));
22
+ if (agent.tags && agent.tags.length > 0) {
23
+ console.log(chalk.gray(` Tags: ${agent.tags.join(', ')}`));
24
+ }
25
+ console.log();
26
+ }
27
+ if (result.hasMore) {
28
+ console.log(chalk.gray(`Showing ${result.agents.length} of ${result.total}. Use --page ${page + 1} for more.`));
29
+ }
30
+ }
31
+ catch (error) {
32
+ if (error instanceof RegistryApiError) {
33
+ console.error(chalk.red(`❌ ${error.message}`));
34
+ }
35
+ else {
36
+ console.error(chalk.red(`❌ Failed: ${error.message}`));
37
+ }
38
+ process.exit(1);
39
+ }
40
+ };
41
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.test.d.ts","sourceRoot":"","sources":["../../src/commands/search.test.ts"],"names":[],"mappings":""}