@agentage/cli 0.0.1

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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +25 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/cli.test.d.ts +2 -0
  8. package/dist/cli.test.d.ts.map +1 -0
  9. package/dist/cli.test.js +58 -0
  10. package/dist/cli.test.js.map +1 -0
  11. package/dist/commands/init.d.ts +2 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/init.js +25 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/init.test.d.ts +2 -0
  16. package/dist/commands/init.test.d.ts.map +1 -0
  17. package/dist/commands/init.test.js +59 -0
  18. package/dist/commands/init.test.js.map +1 -0
  19. package/dist/commands/list.d.ts +2 -0
  20. package/dist/commands/list.d.ts.map +1 -0
  21. package/dist/commands/list.js +41 -0
  22. package/dist/commands/list.js.map +1 -0
  23. package/dist/commands/list.test.d.ts +2 -0
  24. package/dist/commands/list.test.d.ts.map +1 -0
  25. package/dist/commands/list.test.js +91 -0
  26. package/dist/commands/list.test.js.map +1 -0
  27. package/dist/commands/run.d.ts +2 -0
  28. package/dist/commands/run.d.ts.map +1 -0
  29. package/dist/commands/run.js +29 -0
  30. package/dist/commands/run.js.map +1 -0
  31. package/dist/commands/run.test.d.ts +2 -0
  32. package/dist/commands/run.test.d.ts.map +1 -0
  33. package/dist/commands/run.test.js +105 -0
  34. package/dist/commands/run.test.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +3 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/index.test.d.ts +2 -0
  40. package/dist/index.test.d.ts.map +1 -0
  41. package/dist/index.test.js +10 -0
  42. package/dist/index.test.js.map +1 -0
  43. package/dist/schemas/agent.schema.d.ts +10 -0
  44. package/dist/schemas/agent.schema.d.ts.map +1 -0
  45. package/dist/schemas/agent.schema.js +9 -0
  46. package/dist/schemas/agent.schema.js.map +1 -0
  47. package/dist/schemas/agent.schema.test.d.ts +2 -0
  48. package/dist/schemas/agent.schema.test.d.ts.map +1 -0
  49. package/dist/schemas/agent.schema.test.js +80 -0
  50. package/dist/schemas/agent.schema.test.js.map +1 -0
  51. package/eslint.config.js +46 -0
  52. package/package.json +69 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Agentage Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,111 @@
1
+ # @agentage/cli
2
+
3
+ > CLI tool for creating and running AI agents locally
4
+
5
+ **Status**: MVP Phase - Core functionality only
6
+
7
+ ## About
8
+
9
+ AgentKit CLI lets you define AI agents in simple configuration files and run them from your terminal. Create specialized agents for code review, documentation, testing, or any task—then execute them with a single command.
10
+
11
+ Each agent is just a file (YAML, JSON, or Markdown) with a name, model, and instructions. No complex setup, no boilerplate code.
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install -g @agentage/cli
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ ### Create an agent
22
+
23
+ ```bash
24
+ agentkit init my-agent
25
+ ```
26
+
27
+ ### Run an agent
28
+
29
+ ```bash
30
+ agentkit run my-agent "Your prompt here"
31
+ ```
32
+
33
+ ### List local agents
34
+
35
+ ```bash
36
+ agentkit list
37
+ ```
38
+
39
+ ## Agent Definition
40
+
41
+ Agents can be defined in multiple formats. All require three fields: **name**, **description**, and **model**.
42
+
43
+ **YAML** (`agent.yml`):
44
+
45
+ ```yaml
46
+ name: my-agent
47
+ description: A helpful assistant for code review
48
+ model: gpt-4
49
+ instructions: |
50
+ You are a helpful assistant that...
51
+ ```
52
+
53
+ **JSON** (`agent.json`):
54
+
55
+ ```json
56
+ {
57
+ "name": "my-agent",
58
+ "description": "A helpful assistant for code review",
59
+ "model": "gpt-4",
60
+ "instructions": "You are a helpful assistant that..."
61
+ }
62
+ ```
63
+
64
+ **Markdown** (`agent.md`):
65
+
66
+ ```markdown
67
+ ---
68
+ name: "my-agent"
69
+ description: "A helpful assistant for code review"
70
+ model: "gpt-4"
71
+ ---
72
+
73
+ # Agent
74
+
75
+ You are a helpful assistant that...
76
+ ```
77
+
78
+ ## Requirements
79
+
80
+ - Node.js 20+
81
+ - npm 10+
82
+ - OpenAI API key (set `OPENAI_API_KEY` environment variable)
83
+
84
+ ## Development
85
+
86
+ ```bash
87
+ # Install dependencies
88
+ npm install
89
+
90
+ # Build
91
+ npm run build
92
+
93
+ # Test
94
+ npm run test
95
+
96
+ # Lint
97
+ npm run lint
98
+
99
+ # Type check
100
+ npm run type-check
101
+
102
+ # Verify all
103
+ npm run verify
104
+
105
+ # Clean
106
+ npm run clean
107
+ ```
108
+
109
+ ## License
110
+
111
+ MIT
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { initCommand } from './commands/init.js';
4
+ import { listCommand } from './commands/list.js';
5
+ import { runCommand } from './commands/run.js';
6
+ import { version } from './index';
7
+ const program = new Command();
8
+ program
9
+ .name('agentkit')
10
+ .description('CLI tool for creating and running AI agents locally')
11
+ .version(version);
12
+ program
13
+ .command('init')
14
+ .description('Initialize a new agent')
15
+ .argument('[name]', 'Agent name')
16
+ .action(initCommand);
17
+ program
18
+ .command('run')
19
+ .description('Run an agent')
20
+ .argument('<name>', 'Agent name')
21
+ .argument('[prompt]', 'Prompt to send to the agent')
22
+ .action(runCommand);
23
+ program.command('list').description('List all agents').action(listCommand);
24
+ program.parse();
25
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wBAAwB,CAAC;KACrC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;KAChC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,cAAc,CAAC;KAC3B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;KAChC,QAAQ,CAAC,UAAU,EAAE,6BAA6B,CAAC;KACnD,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAE3E,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.d.ts","sourceRoot":"","sources":["../src/cli.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import { execSync } from 'child_process';
2
+ import { existsSync, rmSync, unlinkSync } from 'fs';
3
+ import { join } from 'path';
4
+ const CLI_PATH = join(__dirname, 'cli.ts');
5
+ describe('CLI Commands', () => {
6
+ afterEach(() => {
7
+ const testFiles = ['test-agent.agent.yml', 'my-agent.agent.yml'];
8
+ testFiles.forEach((file) => {
9
+ if (existsSync(file)) {
10
+ unlinkSync(file);
11
+ }
12
+ });
13
+ if (existsSync('agents')) {
14
+ rmSync('agents', { recursive: true, force: true });
15
+ }
16
+ });
17
+ test('CLI shows version', () => {
18
+ const output = execSync(`tsx ${CLI_PATH} --version`, {
19
+ encoding: 'utf-8',
20
+ });
21
+ expect(output.trim()).toBe('0.0.1');
22
+ });
23
+ test('CLI shows help', () => {
24
+ const output = execSync(`tsx ${CLI_PATH} --help`, {
25
+ encoding: 'utf-8',
26
+ });
27
+ expect(output).toContain('CLI tool for creating and running AI agents locally');
28
+ expect(output).toContain('init');
29
+ expect(output).toContain('run');
30
+ expect(output).toContain('list');
31
+ });
32
+ test('init command creates agent file', () => {
33
+ const output = execSync(`tsx ${CLI_PATH} init test-agent`, {
34
+ encoding: 'utf-8',
35
+ });
36
+ expect(output).toContain('✅ Created agents/test-agent.yml');
37
+ expect(existsSync('agents/test-agent.yml')).toBe(true);
38
+ });
39
+ test('run command requires agent file', () => {
40
+ try {
41
+ execSync(`tsx ${CLI_PATH} run my-agent "hello"`, {
42
+ encoding: 'utf-8',
43
+ });
44
+ fail('Should have thrown an error');
45
+ }
46
+ catch (error) {
47
+ const err = error;
48
+ expect(err.stderr || err.stdout || err.message).toContain('Failed');
49
+ }
50
+ });
51
+ test('list command shows no agents message', () => {
52
+ const output = execSync(`tsx ${CLI_PATH} list`, {
53
+ encoding: 'utf-8',
54
+ });
55
+ expect(output).toContain('No agents found');
56
+ });
57
+ });
58
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../src/cli.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const initCommand: (name?: string) => Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,IAAI,CAwB7D,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { mkdir, writeFile } from 'fs/promises';
2
+ import { join } from 'path';
3
+ export const initCommand = async (name) => {
4
+ const agentName = name || 'my-agent';
5
+ const agentsDir = 'agents';
6
+ const filePath = join(agentsDir, `${agentName}.yml`);
7
+ const template = `name: ${agentName}
8
+ model: gpt-4
9
+ instructions: |
10
+ You are a helpful AI assistant.
11
+ Respond clearly and concisely.
12
+ tools: []
13
+ variables: {}
14
+ `;
15
+ try {
16
+ await mkdir(agentsDir, { recursive: true });
17
+ await writeFile(filePath, template, 'utf-8');
18
+ console.log(`✅ Created ${filePath}`);
19
+ }
20
+ catch (error) {
21
+ console.error(`❌ Failed: ${error.message}`);
22
+ process.exit(1);
23
+ }
24
+ };
25
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,IAAa,EAAiB,EAAE;IAChE,MAAM,SAAS,GAAG,IAAI,IAAI,UAAU,CAAC;IACrC,MAAM,SAAS,GAAG,QAAQ,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,SAAS,MAAM,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,SAAS,SAAS;;;;;;;CAOpC,CAAC;IAEA,IAAI,CAAC;QAEH,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,aAAc,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=init.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.d.ts","sourceRoot":"","sources":["../../src/commands/init.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import { existsSync, mkdirSync, readFileSync, rmSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { initCommand } from './init.js';
4
+ describe('initCommand', () => {
5
+ const testAgentsDir = 'test-agents';
6
+ beforeEach(() => {
7
+ if (existsSync(testAgentsDir)) {
8
+ rmSync(testAgentsDir, { recursive: true });
9
+ }
10
+ mkdirSync(testAgentsDir);
11
+ process.chdir(testAgentsDir);
12
+ });
13
+ afterEach(() => {
14
+ process.chdir('..');
15
+ if (existsSync(testAgentsDir)) {
16
+ rmSync(testAgentsDir, { recursive: true });
17
+ }
18
+ });
19
+ test('creates agent file with default name', async () => {
20
+ await initCommand();
21
+ const filePath = join('agents', 'my-agent.yml');
22
+ expect(existsSync(filePath)).toBe(true);
23
+ const content = readFileSync(filePath, 'utf-8');
24
+ expect(content).toContain('name: my-agent');
25
+ expect(content).toContain('model: gpt-4');
26
+ expect(content).toContain('You are a helpful AI assistant');
27
+ });
28
+ test('creates agent file with custom name', async () => {
29
+ await initCommand('custom-agent');
30
+ const filePath = join('agents', 'custom-agent.yml');
31
+ expect(existsSync(filePath)).toBe(true);
32
+ const content = readFileSync(filePath, 'utf-8');
33
+ expect(content).toContain('name: custom-agent');
34
+ });
35
+ test('creates agents directory if it does not exist', async () => {
36
+ expect(existsSync('agents')).toBe(false);
37
+ await initCommand('test-agent');
38
+ expect(existsSync('agents')).toBe(true);
39
+ expect(existsSync(join('agents', 'test-agent.yml'))).toBe(true);
40
+ });
41
+ test('handles errors gracefully', async () => {
42
+ const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {
43
+ throw new Error('process.exit called');
44
+ });
45
+ const consoleError = jest.spyOn(console, 'error').mockImplementation();
46
+ mkdirSync('agents');
47
+ const originalWriteFile = require('fs/promises').writeFile;
48
+ jest
49
+ .spyOn(require('fs/promises'), 'writeFile')
50
+ .mockRejectedValue(new Error('Write failed'));
51
+ await expect(initCommand('test')).rejects.toThrow('process.exit called');
52
+ expect(consoleError).toHaveBeenCalledWith(expect.stringContaining('❌ Failed: Write failed'));
53
+ expect(mockExit).toHaveBeenCalledWith(1);
54
+ require('fs/promises').writeFile = originalWriteFile;
55
+ mockExit.mockRestore();
56
+ consoleError.mockRestore();
57
+ });
58
+ });
59
+ //# sourceMappingURL=init.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/commands/init.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const listCommand: () => Promise<void>;
2
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAqChD,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { readdir, readFile } from 'fs/promises';
2
+ import { join } from 'path';
3
+ import { parse } from 'yaml';
4
+ import { agentYamlSchema } from '../schemas/agent.schema.js';
5
+ export const listCommand = async () => {
6
+ try {
7
+ const agentsDir = 'agents';
8
+ let files;
9
+ try {
10
+ files = (await readdir(agentsDir)).filter((f) => f.endsWith('.yml'));
11
+ }
12
+ catch {
13
+ console.log('No agents found. Run `agentkit init` to create one.');
14
+ return;
15
+ }
16
+ if (files.length === 0) {
17
+ console.log('No agents found. Run `agentkit init` to create one.');
18
+ return;
19
+ }
20
+ console.log('\n📋 Available Agents:\n');
21
+ for (const file of files) {
22
+ const filePath = join(agentsDir, file);
23
+ try {
24
+ const content = await readFile(filePath, 'utf-8');
25
+ const yaml = parse(content);
26
+ const validated = agentYamlSchema.parse(yaml);
27
+ console.log(` ✅ ${validated.name} (${validated.model})`);
28
+ }
29
+ catch (error) {
30
+ const name = file.replace('.yml', '');
31
+ const errorMsg = error instanceof Error ? error.message : 'Invalid YAML';
32
+ console.log(` ❌ ${name} - ${errorMsg}`);
33
+ }
34
+ }
35
+ console.log();
36
+ }
37
+ catch (error) {
38
+ console.error(`❌ Failed: ${error.message}`);
39
+ }
40
+ };
41
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,CAAC;QAC3B,IAAI,KAAe,CAAC;QAEpB,IAAI,CAAC;YACH,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,OAAO,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACtC,MAAM,QAAQ,GACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,aAAc,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=list.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../src/commands/list.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { listCommand } from './list.js';
4
+ describe('listCommand', () => {
5
+ const testAgentsDir = 'test-agents';
6
+ beforeEach(() => {
7
+ if (existsSync(testAgentsDir)) {
8
+ rmSync(testAgentsDir, { recursive: true });
9
+ }
10
+ mkdirSync(testAgentsDir);
11
+ process.chdir(testAgentsDir);
12
+ });
13
+ afterEach(() => {
14
+ process.chdir('..');
15
+ if (existsSync(testAgentsDir)) {
16
+ rmSync(testAgentsDir, { recursive: true });
17
+ }
18
+ });
19
+ test('shows message when no agents directory exists', async () => {
20
+ const consoleLog = jest.spyOn(console, 'log').mockImplementation();
21
+ await listCommand();
22
+ expect(consoleLog).toHaveBeenCalledWith('No agents found. Run `agentkit init` to create one.');
23
+ consoleLog.mockRestore();
24
+ });
25
+ test('shows message when agents directory is empty', async () => {
26
+ mkdirSync('agents');
27
+ const consoleLog = jest.spyOn(console, 'log').mockImplementation();
28
+ await listCommand();
29
+ expect(consoleLog).toHaveBeenCalledWith('No agents found. Run `agentkit init` to create one.');
30
+ consoleLog.mockRestore();
31
+ });
32
+ test('lists valid agent files', async () => {
33
+ mkdirSync('agents');
34
+ const validAgent = `name: test-agent
35
+ model: gpt-4
36
+ instructions: Test instructions
37
+ tools: []
38
+ variables: {}`;
39
+ writeFileSync(join('agents', 'test-agent.yml'), validAgent);
40
+ const consoleLog = jest.spyOn(console, 'log').mockImplementation();
41
+ await listCommand();
42
+ expect(consoleLog).toHaveBeenCalledWith('\n📋 Available Agents:\n');
43
+ expect(consoleLog).toHaveBeenCalledWith(' ✅ test-agent (gpt-4)');
44
+ consoleLog.mockRestore();
45
+ });
46
+ test('shows validation errors for invalid agent files', async () => {
47
+ mkdirSync('agents');
48
+ const invalidAgent = `invalid: yaml
49
+ content: here`;
50
+ writeFileSync(join('agents', 'invalid-agent.yml'), invalidAgent);
51
+ const consoleLog = jest.spyOn(console, 'log').mockImplementation();
52
+ await listCommand();
53
+ expect(consoleLog).toHaveBeenCalledWith('\n📋 Available Agents:\n');
54
+ expect(consoleLog).toHaveBeenCalledWith(expect.stringContaining('❌ invalid-agent -'));
55
+ consoleLog.mockRestore();
56
+ });
57
+ test('lists both valid and invalid agents', async () => {
58
+ mkdirSync('agents');
59
+ const validAgent = `name: valid-agent
60
+ model: gpt-4
61
+ instructions: Test instructions
62
+ tools: []
63
+ variables: {}`;
64
+ writeFileSync(join('agents', 'valid-agent.yml'), validAgent);
65
+ const invalidAgent = `name: missing-instructions
66
+ model: gpt-4`;
67
+ writeFileSync(join('agents', 'invalid-agent.yml'), invalidAgent);
68
+ const consoleLog = jest.spyOn(console, 'log').mockImplementation();
69
+ await listCommand();
70
+ expect(consoleLog).toHaveBeenCalledWith(' ✅ valid-agent (gpt-4)');
71
+ expect(consoleLog).toHaveBeenCalledWith(expect.stringContaining('❌ invalid-agent -'));
72
+ consoleLog.mockRestore();
73
+ });
74
+ test('handles errors gracefully', async () => {
75
+ mkdirSync('agents');
76
+ const consoleError = jest.spyOn(console, 'error').mockImplementation();
77
+ const originalReaddir = require('fs/promises').readdir;
78
+ let callCount = 0;
79
+ jest.spyOn(require('fs/promises'), 'readdir').mockImplementation(() => {
80
+ callCount++;
81
+ if (callCount === 1) {
82
+ return Promise.resolve(['test.yml']);
83
+ }
84
+ throw new Error('Read error');
85
+ });
86
+ await listCommand();
87
+ require('fs/promises').readdir = originalReaddir;
88
+ consoleError.mockRestore();
89
+ });
90
+ });
91
+ //# sourceMappingURL=list.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.test.js","sourceRoot":"","sources":["../../src/commands/list.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const runCommand: (name: string, prompt?: string) => Promise<void>;
2
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,SAAS,MAAM,KACd,OAAO,CAAC,IAAI,CAyBd,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { agent } from '@agentage/sdk';
2
+ import { readFile } from 'fs/promises';
3
+ import { join } from 'path';
4
+ import { parse } from 'yaml';
5
+ import { agentYamlSchema } from '../schemas/agent.schema.js';
6
+ export const runCommand = async (name, prompt) => {
7
+ try {
8
+ const agentsDir = 'agents';
9
+ const filename = join(agentsDir, `${name}.yml`);
10
+ const content = await readFile(filename, 'utf-8');
11
+ const yaml = parse(content);
12
+ const validated = agentYamlSchema.parse(yaml);
13
+ const assistant = agent(validated.name)
14
+ .model(validated.model)
15
+ .instructions(validated.instructions)
16
+ .config([
17
+ { key: 'OPENAI_API_KEY', value: process.env.OPENAI_API_KEY || '' },
18
+ ]);
19
+ const userPrompt = prompt || 'Hello!';
20
+ console.log(`\n🤖 Running ${validated.name}...\n`);
21
+ const response = await assistant.send(userPrompt);
22
+ console.log(`💬 ${response.content}\n`);
23
+ }
24
+ catch (error) {
25
+ console.error(`❌ Failed: ${error.message}`);
26
+ process.exit(1);
27
+ }
28
+ };
29
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,IAAY,EACZ,MAAe,EACA,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5B,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE9C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;aACpC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;aACtB,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC;aACpC,MAAM,CAAC;YACN,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,EAAE;SACnE,CAAC,CAAC;QAEL,MAAM,UAAU,GAAG,MAAM,IAAI,QAAQ,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,CAAC,IAAI,OAAO,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,aAAc,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.test.d.ts","sourceRoot":"","sources":["../../src/commands/run.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,105 @@
1
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { runCommand } from './run.js';
4
+ jest.mock('@agentage/sdk', () => ({
5
+ agent: jest.fn(() => ({
6
+ model: jest.fn().mockReturnThis(),
7
+ instructions: jest.fn().mockReturnThis(),
8
+ config: jest.fn().mockReturnThis(),
9
+ send: jest.fn().mockResolvedValue({ content: 'Mock response' }),
10
+ })),
11
+ }));
12
+ describe('runCommand', () => {
13
+ const testAgentsDir = 'test-agents';
14
+ beforeEach(() => {
15
+ if (existsSync(testAgentsDir)) {
16
+ rmSync(testAgentsDir, { recursive: true });
17
+ }
18
+ mkdirSync(testAgentsDir);
19
+ process.chdir(testAgentsDir);
20
+ jest.clearAllMocks();
21
+ });
22
+ afterEach(() => {
23
+ process.chdir('..');
24
+ if (existsSync(testAgentsDir)) {
25
+ rmSync(testAgentsDir, { recursive: true });
26
+ }
27
+ });
28
+ test('runs agent with valid config', async () => {
29
+ mkdirSync('agents');
30
+ const validAgent = `name: test-agent
31
+ model: gpt-4
32
+ instructions: Test instructions
33
+ tools: []
34
+ variables: {}`;
35
+ writeFileSync(join('agents', 'test-agent.yml'), validAgent);
36
+ const consoleLog = jest.spyOn(console, 'log').mockImplementation();
37
+ await runCommand('test-agent', 'Hello');
38
+ expect(consoleLog).toHaveBeenCalledWith('\n🤖 Running test-agent...\n');
39
+ expect(consoleLog).toHaveBeenCalledWith('💬 Mock response\n');
40
+ consoleLog.mockRestore();
41
+ });
42
+ test('uses default prompt when none provided', async () => {
43
+ mkdirSync('agents');
44
+ const validAgent = `name: test-agent
45
+ model: gpt-4
46
+ instructions: Test instructions
47
+ tools: []
48
+ variables: {}`;
49
+ writeFileSync(join('agents', 'test-agent.yml'), validAgent);
50
+ const consoleLog = jest.spyOn(console, 'log').mockImplementation();
51
+ await runCommand('test-agent');
52
+ expect(consoleLog).toHaveBeenCalledWith('\n🤖 Running test-agent...\n');
53
+ consoleLog.mockRestore();
54
+ });
55
+ test('handles missing agent file', async () => {
56
+ const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {
57
+ throw new Error('process.exit called');
58
+ });
59
+ const consoleError = jest.spyOn(console, 'error').mockImplementation();
60
+ await expect(runCommand('nonexistent')).rejects.toThrow('process.exit called');
61
+ expect(consoleError).toHaveBeenCalledWith(expect.stringContaining('❌ Failed:'));
62
+ expect(mockExit).toHaveBeenCalledWith(1);
63
+ mockExit.mockRestore();
64
+ consoleError.mockRestore();
65
+ });
66
+ test('handles invalid agent YAML', async () => {
67
+ mkdirSync('agents');
68
+ const invalidAgent = `name: test-agent
69
+ model: gpt-4`;
70
+ writeFileSync(join('agents', 'invalid.yml'), invalidAgent);
71
+ const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {
72
+ throw new Error('process.exit called');
73
+ });
74
+ const consoleError = jest.spyOn(console, 'error').mockImplementation();
75
+ await expect(runCommand('invalid')).rejects.toThrow('process.exit called');
76
+ expect(consoleError).toHaveBeenCalledWith(expect.stringContaining('❌ Failed:'));
77
+ mockExit.mockRestore();
78
+ consoleError.mockRestore();
79
+ });
80
+ test('handles agent execution errors', async () => {
81
+ mkdirSync('agents');
82
+ const validAgent = `name: test-agent
83
+ model: gpt-4
84
+ instructions: Test instructions
85
+ tools: []
86
+ variables: {}`;
87
+ writeFileSync(join('agents', 'test-agent.yml'), validAgent);
88
+ const { agent } = require('@agentage/sdk');
89
+ agent.mockImplementation(() => ({
90
+ model: jest.fn().mockReturnThis(),
91
+ instructions: jest.fn().mockReturnThis(),
92
+ config: jest.fn().mockReturnThis(),
93
+ send: jest.fn().mockRejectedValue(new Error('API Error')),
94
+ }));
95
+ const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {
96
+ throw new Error('process.exit called');
97
+ });
98
+ const consoleError = jest.spyOn(console, 'error').mockImplementation();
99
+ await expect(runCommand('test-agent')).rejects.toThrow('process.exit called');
100
+ expect(consoleError).toHaveBeenCalledWith('❌ Failed: API Error');
101
+ mockExit.mockRestore();
102
+ consoleError.mockRestore();
103
+ });
104
+ });
105
+ //# sourceMappingURL=run.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.test.js","sourceRoot":"","sources":["../../src/commands/run.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const version = "0.0.1";
2
+ export declare const greet: () => string;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,eAAO,MAAM,KAAK,QAAO,MAAoC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export const version = '0.0.1';
2
+ export const greet = () => 'Hello from AgentKit CLI!';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,MAAM,CAAC,MAAM,KAAK,GAAG,GAAW,EAAE,CAAC,0BAA0B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { greet, version } from './index.js';
2
+ describe('CLI Package', () => {
3
+ test('version is defined', () => {
4
+ expect(version).toBe('0.0.1');
5
+ });
6
+ test('greet returns correct message', () => {
7
+ expect(greet()).toBe('Hello from AgentKit CLI!');
8
+ });
9
+ });
10
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ export declare const agentYamlSchema: z.ZodObject<{
3
+ name: z.ZodString;
4
+ model: z.ZodDefault<z.ZodString>;
5
+ instructions: z.ZodString;
6
+ tools: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
7
+ variables: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
8
+ }, z.core.$strip>;
9
+ export type AgentYaml = z.infer<typeof agentYamlSchema>;
10
+ //# sourceMappingURL=agent.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/agent.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;;;;iBAM1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod';
2
+ export const agentYamlSchema = z.object({
3
+ name: z.string().min(1),
4
+ model: z.string().default('gpt-4'),
5
+ instructions: z.string().min(1),
6
+ tools: z.array(z.string()).optional().default([]),
7
+ variables: z.record(z.string(), z.string()).optional().default({}),
8
+ });
9
+ //# sourceMappingURL=agent.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.schema.js","sourceRoot":"","sources":["../../src/schemas/agent.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAClC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACjD,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CACnE,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent.schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.schema.test.d.ts","sourceRoot":"","sources":["../../src/schemas/agent.schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import { agentYamlSchema } from './agent.schema.js';
2
+ describe('agentYamlSchema', () => {
3
+ test('validates correct agent configuration', () => {
4
+ const validConfig = {
5
+ name: 'test-agent',
6
+ model: 'gpt-4',
7
+ instructions: 'You are helpful',
8
+ tools: ['tool1', 'tool2'],
9
+ variables: { key1: 'value1', key2: 'value2' },
10
+ };
11
+ const result = agentYamlSchema.parse(validConfig);
12
+ expect(result).toEqual(validConfig);
13
+ });
14
+ test('applies default values', () => {
15
+ const minimalConfig = {
16
+ name: 'test-agent',
17
+ instructions: 'You are helpful',
18
+ };
19
+ const result = agentYamlSchema.parse(minimalConfig);
20
+ expect(result.model).toBe('gpt-4');
21
+ expect(result.tools).toEqual([]);
22
+ expect(result.variables).toEqual({});
23
+ });
24
+ test('rejects empty name', () => {
25
+ const invalidConfig = {
26
+ name: '',
27
+ instructions: 'You are helpful',
28
+ };
29
+ expect(() => agentYamlSchema.parse(invalidConfig)).toThrow();
30
+ });
31
+ test('rejects missing name', () => {
32
+ const invalidConfig = {
33
+ instructions: 'You are helpful',
34
+ };
35
+ expect(() => agentYamlSchema.parse(invalidConfig)).toThrow();
36
+ });
37
+ test('rejects empty instructions', () => {
38
+ const invalidConfig = {
39
+ name: 'test-agent',
40
+ instructions: '',
41
+ };
42
+ expect(() => agentYamlSchema.parse(invalidConfig)).toThrow();
43
+ });
44
+ test('rejects missing instructions', () => {
45
+ const invalidConfig = {
46
+ name: 'test-agent',
47
+ };
48
+ expect(() => agentYamlSchema.parse(invalidConfig)).toThrow();
49
+ });
50
+ test('accepts optional tools array', () => {
51
+ const config = {
52
+ name: 'test-agent',
53
+ instructions: 'You are helpful',
54
+ tools: ['tool1'],
55
+ };
56
+ const result = agentYamlSchema.parse(config);
57
+ expect(result.tools).toEqual(['tool1']);
58
+ });
59
+ test('accepts optional variables object', () => {
60
+ const config = {
61
+ name: 'test-agent',
62
+ instructions: 'You are helpful',
63
+ variables: { foo: 'bar' },
64
+ };
65
+ const result = agentYamlSchema.parse(config);
66
+ expect(result.variables).toEqual({ foo: 'bar' });
67
+ });
68
+ test('type inference works correctly', () => {
69
+ const config = {
70
+ name: 'test-agent',
71
+ model: 'gpt-4',
72
+ instructions: 'You are helpful',
73
+ tools: [],
74
+ variables: {},
75
+ };
76
+ expect(config.name).toBe('test-agent');
77
+ expect(config.model).toBe('gpt-4');
78
+ });
79
+ });
80
+ //# sourceMappingURL=agent.schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.schema.test.js","sourceRoot":"","sources":["../../src/schemas/agent.schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import typescriptEslint from '@typescript-eslint/eslint-plugin';
2
+ import tsParser from '@typescript-eslint/parser';
3
+
4
+ export default [
5
+ {
6
+ files: ['**/*.ts'],
7
+ languageOptions: {
8
+ parser: tsParser,
9
+ parserOptions: {
10
+ ecmaVersion: 2022,
11
+ sourceType: 'module',
12
+ project: './tsconfig.json',
13
+ },
14
+ },
15
+ plugins: {
16
+ '@typescript-eslint': typescriptEslint,
17
+ },
18
+ rules: {
19
+ '@typescript-eslint/no-explicit-any': 'error',
20
+ '@typescript-eslint/explicit-function-return-type': 'warn',
21
+ '@typescript-eslint/no-unused-vars': [
22
+ 'error',
23
+ { argsIgnorePattern: '^_' },
24
+ ],
25
+ '@typescript-eslint/naming-convention': [
26
+ 'error',
27
+ {
28
+ selector: 'interface',
29
+ format: ['PascalCase'],
30
+ custom: {
31
+ regex: '^[A-Z]',
32
+ match: true,
33
+ },
34
+ },
35
+ {
36
+ selector: 'typeAlias',
37
+ format: ['PascalCase'],
38
+ },
39
+ ],
40
+ 'prefer-const': 'error',
41
+ 'prefer-arrow-callback': 'error',
42
+ 'arrow-body-style': ['error', 'as-needed'],
43
+ 'no-var': 'error',
44
+ },
45
+ },
46
+ ];
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@agentage/cli",
3
+ "version": "0.0.1",
4
+ "description": "CLI tool for creating and running AI agents locally",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "agentkit": "./dist/cli.js"
9
+ },
10
+ "scripts": {
11
+ "dev": "tsx src/cli.ts",
12
+ "build": "tsc",
13
+ "type-check": "tsc --noEmit",
14
+ "lint": "eslint src --ext .ts",
15
+ "lint:fix": "eslint src --ext .ts --fix",
16
+ "test": "jest",
17
+ "test:watch": "jest --watch",
18
+ "test:coverage": "jest --coverage",
19
+ "verify": "npm run type-check && npm run lint && npm run build && npm run test",
20
+ "clean": "rm -rf dist coverage",
21
+ "prepublishOnly": "npm run verify"
22
+ },
23
+ "keywords": [
24
+ "cli",
25
+ "ai",
26
+ "agent",
27
+ "agentkit",
28
+ "typescript"
29
+ ],
30
+ "author": "Agentage",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/agentage/agentkit.git",
35
+ "directory": "packages/cli"
36
+ },
37
+ "bugs": {
38
+ "url": "https://github.com/agentage/agentkit/issues"
39
+ },
40
+ "homepage": "https://github.com/agentage/agentkit/tree/master/packages/cli#readme",
41
+ "engines": {
42
+ "node": ">=20.0.0",
43
+ "npm": ">=10.0.0"
44
+ },
45
+ "dependencies": {
46
+ "@agentage/core": "^0.0.1",
47
+ "@agentage/sdk": "^0.0.1",
48
+ "chalk": "^5.6.2",
49
+ "commander": "^14.0.2",
50
+ "gray-matter": "^4.0.3",
51
+ "inquirer": "^12.10.0",
52
+ "js-yaml": "^4.1.0",
53
+ "yaml": "^2.8.1",
54
+ "zod": "^4.1.12"
55
+ },
56
+ "devDependencies": {
57
+ "@types/inquirer": "^9.0.9",
58
+ "@types/jest": "^30.0.0",
59
+ "@types/js-yaml": "^4.0.9",
60
+ "@types/node": "^22.8.6",
61
+ "@typescript-eslint/eslint-plugin": "^8.46.3",
62
+ "@typescript-eslint/parser": "^8.46.3",
63
+ "eslint": "^9.39.1",
64
+ "jest": "^30.2.0",
65
+ "ts-jest": "^29.4.5",
66
+ "tsx": "^4.20.6",
67
+ "typescript": "^5.9.3"
68
+ }
69
+ }