@trikhub/cli 0.15.0 → 0.16.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.
- package/README.md +70 -0
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/create-agent.d.ts +7 -0
- package/dist/commands/create-agent.d.ts.map +1 -0
- package/dist/commands/create-agent.js +166 -0
- package/dist/commands/create-agent.js.map +1 -0
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +7 -2
- package/dist/commands/lint.js.map +1 -1
- package/dist/templates/agent-python.d.ts +14 -0
- package/dist/templates/agent-python.d.ts.map +1 -0
- package/dist/templates/agent-python.js +185 -0
- package/dist/templates/agent-python.js.map +1 -0
- package/dist/templates/agent-typescript.d.ts +18 -0
- package/dist/templates/agent-typescript.d.ts.map +1 -0
- package/dist/templates/agent-typescript.js +209 -0
- package/dist/templates/agent-typescript.js.map +1 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -15,6 +15,10 @@ npm install -g @trikhub/cli
|
|
|
15
15
|
trik init ts # TypeScript
|
|
16
16
|
trik init py # Python
|
|
17
17
|
|
|
18
|
+
# Scaffold an agent that consumes triks
|
|
19
|
+
trik create-agent ts # TypeScript
|
|
20
|
+
trik create-agent py # Python
|
|
21
|
+
|
|
18
22
|
# Search for triks
|
|
19
23
|
trik search article
|
|
20
24
|
|
|
@@ -116,6 +120,72 @@ pip install -e .
|
|
|
116
120
|
trik lint .
|
|
117
121
|
```
|
|
118
122
|
|
|
123
|
+
### `trik create-agent <language>`
|
|
124
|
+
|
|
125
|
+
Scaffold a minimal agent project that can immediately consume triks. This is the counterpart to `trik init` — it creates the _consuming agent_, not a trik.
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# Create a TypeScript agent
|
|
129
|
+
trik create-agent ts
|
|
130
|
+
|
|
131
|
+
# Create a Python agent
|
|
132
|
+
trik create-agent py
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
The interactive wizard prompts for:
|
|
136
|
+
|
|
137
|
+
- **Project name** - lowercase, alphanumeric + dashes (e.g., `my-agent`)
|
|
138
|
+
- **LLM Provider** - OpenAI, Anthropic, or Google
|
|
139
|
+
- **Location** - Where to create the project
|
|
140
|
+
|
|
141
|
+
#### Generated Structure
|
|
142
|
+
|
|
143
|
+
**TypeScript:**
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
my-agent/
|
|
147
|
+
├── package.json # Only the selected provider's LangChain pkg
|
|
148
|
+
├── tsconfig.json
|
|
149
|
+
├── .env.example # Single env var for selected provider
|
|
150
|
+
├── .gitignore
|
|
151
|
+
├── .trikhub/
|
|
152
|
+
│ └── config.json # Empty triks array
|
|
153
|
+
└── src/
|
|
154
|
+
├── agent.ts # TrikGateway + enhance() + createReactAgent
|
|
155
|
+
└── cli.ts # readline loop with processMessage()
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Python:**
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
my-agent/
|
|
162
|
+
├── pyproject.toml # Only the selected provider's langchain pkg
|
|
163
|
+
├── .env.example
|
|
164
|
+
├── .gitignore
|
|
165
|
+
├── .trikhub/
|
|
166
|
+
│ └── config.json
|
|
167
|
+
├── agent.py # TrikGateway + enhance() + create_react_agent
|
|
168
|
+
└── cli.py # asyncio CLI loop
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
#### Running Your Agent
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
cd my-agent
|
|
175
|
+
cp .env.example .env
|
|
176
|
+
# Add your API key to .env
|
|
177
|
+
|
|
178
|
+
# TypeScript
|
|
179
|
+
npm run dev
|
|
180
|
+
|
|
181
|
+
# Python
|
|
182
|
+
python -m venv .venv && source .venv/bin/activate
|
|
183
|
+
pip install -e .
|
|
184
|
+
python cli.py
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Then install triks with `trik install @scope/trik-name` and restart the agent.
|
|
188
|
+
|
|
119
189
|
### `trik lint <path>`
|
|
120
190
|
|
|
121
191
|
Validate a trik's manifest and source files. Shows errors and warnings.
|
package/dist/cli.js
CHANGED
|
@@ -17,6 +17,7 @@ import { unpublishCommand } from './commands/unpublish.js';
|
|
|
17
17
|
import { upgradeCommand, upgradeAllCommand } from './commands/upgrade.js';
|
|
18
18
|
import { syncCommand } from './commands/sync.js';
|
|
19
19
|
import { initCommand } from './commands/init.js';
|
|
20
|
+
import { createAgentCommand } from './commands/create-agent.js';
|
|
20
21
|
import { lintCommand } from './commands/lint.js';
|
|
21
22
|
import { mcpCommand } from './commands/mcp.js';
|
|
22
23
|
// Read version from package.json
|
|
@@ -124,6 +125,11 @@ program
|
|
|
124
125
|
.command('init <language>')
|
|
125
126
|
.description('Initialize a new trik project (ts or py)')
|
|
126
127
|
.action(initCommand);
|
|
128
|
+
// Create-agent command
|
|
129
|
+
program
|
|
130
|
+
.command('create-agent <language>')
|
|
131
|
+
.description('Scaffold a minimal agent project ready to consume triks')
|
|
132
|
+
.action(createAgentCommand);
|
|
127
133
|
// Lint command
|
|
128
134
|
program
|
|
129
135
|
.command('lint <path>')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,iCAAiC;AACjC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEvC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,qCAAqC,CAAC;KAClD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,OAAO,EAAE,2CAA2C,CAAC;KAC5D,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IACtB,+DAA+D;IAC/D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAC;IACvC,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,yBAAyB,EAAE,4BAA4B,CAAC;KAC/D,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,oBAAoB;AACpB,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,KAAK,CAAC,IAAI,CAAC;KACX,KAAK,CAAC,QAAQ,CAAC;KACf,WAAW,CAAC,kBAAkB,CAAC;KAC/B,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,KAAK,CAAC,IAAI,CAAC;KACX,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;KACtC,MAAM,CAAC,yBAAyB,EAAE,iCAAiC,CAAC;KACpE,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,KAAK,CAAC,GAAG,CAAC;KACV,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;KACtC,MAAM,CAAC,sBAAsB,EAAE,eAAe,EAAE,IAAI,CAAC;KACrD,MAAM,CAAC,yBAAyB,EAAE,iCAAiC,CAAC;KACpE,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;KACtC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,gBAAgB;AAChB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,wBAAwB,EAAE,2BAA2B,EAAE,GAAG,CAAC;KAClE,MAAM,CAAC,qBAAqB,EAAE,sCAAsC,CAAC;KACrE,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,oBAAoB;AACpB,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,KAAK,CAAC,IAAI,CAAC;KACX,WAAW,CAAC,4DAA4D,CAAC;KACzE,MAAM,CAAC,aAAa,EAAE,oCAAoC,CAAC;KAC3D,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,OAA4B,EAAE,EAAE;IACvE,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,0CAA0C;AAC1C,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,eAAe,EAAE,oDAAoD,CAAC;KAC7E,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;KACtC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,uBAAuB;AACvB,OAAO;KACJ,OAAO,CAAC,yBAAyB,CAAC;KAClC,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE9B,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,sBAAsB,EAAE,0BAA0B,CAAC;KAC1D,MAAM,CAAC,eAAe,EAAE,wCAAwC,EAAE,CAAC,GAAG,EAAE,IAAc,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;KAC9G,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,cAAc;AACd,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,SAAS,EAAE,mCAAmC,CAAC;KACtD,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,0BAA0B;AAC1B,uEAAuE;AAEvE,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-agent.d.ts","sourceRoot":"","sources":["../../src/commands/create-agent.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4CH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwI3E"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* trik create-agent command
|
|
3
|
+
*
|
|
4
|
+
* Scaffolds a minimal agent project ready to consume triks.
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync } from 'node:fs';
|
|
7
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
8
|
+
import { join, resolve } from 'node:path';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import ora from 'ora';
|
|
11
|
+
import { input, select } from '@inquirer/prompts';
|
|
12
|
+
import { generateAgentTypescriptProject } from '../templates/agent-typescript.js';
|
|
13
|
+
import { generateAgentPythonProject } from '../templates/agent-python.js';
|
|
14
|
+
/**
|
|
15
|
+
* Validate project name — same rules as trik init.
|
|
16
|
+
*/
|
|
17
|
+
function validateProjectName(name) {
|
|
18
|
+
if (name.length < 2 || name.length > 50) {
|
|
19
|
+
return 'Name must be 2-50 characters';
|
|
20
|
+
}
|
|
21
|
+
if (!/^[a-z]/.test(name)) {
|
|
22
|
+
return 'Name must start with a letter';
|
|
23
|
+
}
|
|
24
|
+
if (!/^[a-z][a-z0-9-]*$/.test(name)) {
|
|
25
|
+
return 'Name must be lowercase, alphanumeric + dashes only';
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parse and normalize language argument.
|
|
31
|
+
*/
|
|
32
|
+
function parseLanguage(lang) {
|
|
33
|
+
const normalized = lang.toLowerCase();
|
|
34
|
+
if (normalized === 'ts' || normalized === 'typescript') {
|
|
35
|
+
return 'ts';
|
|
36
|
+
}
|
|
37
|
+
if (normalized === 'py' || normalized === 'python') {
|
|
38
|
+
return 'py';
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
export async function createAgentCommand(languageArg) {
|
|
43
|
+
const spinner = ora();
|
|
44
|
+
try {
|
|
45
|
+
// Validate language
|
|
46
|
+
const language = parseLanguage(languageArg);
|
|
47
|
+
if (!language) {
|
|
48
|
+
console.log(chalk.red(`Invalid language: ${languageArg}`));
|
|
49
|
+
console.log(chalk.dim('Supported languages: ts (TypeScript) or py (Python)'));
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
console.log();
|
|
53
|
+
console.log(chalk.bold(' Create a new Agent'));
|
|
54
|
+
console.log();
|
|
55
|
+
// Interactive prompts
|
|
56
|
+
const name = await input({
|
|
57
|
+
message: 'Project name:',
|
|
58
|
+
default: 'my-agent',
|
|
59
|
+
validate: validateProjectName,
|
|
60
|
+
transformer: (value) => value.toLowerCase(),
|
|
61
|
+
});
|
|
62
|
+
const provider = await select({
|
|
63
|
+
message: 'LLM Provider:',
|
|
64
|
+
choices: [
|
|
65
|
+
{ value: 'openai', name: 'OpenAI (gpt-4o-mini)' },
|
|
66
|
+
{ value: 'anthropic', name: 'Anthropic (claude-sonnet)' },
|
|
67
|
+
{ value: 'google', name: 'Google (gemini-2.0-flash)' },
|
|
68
|
+
],
|
|
69
|
+
default: 'openai',
|
|
70
|
+
});
|
|
71
|
+
// Path selection
|
|
72
|
+
const pathChoice = await select({
|
|
73
|
+
message: 'Where to create the project?',
|
|
74
|
+
choices: [
|
|
75
|
+
{ value: 'current', name: `Current folder (./${name})` },
|
|
76
|
+
{ value: 'other', name: 'Other location...' },
|
|
77
|
+
],
|
|
78
|
+
});
|
|
79
|
+
let targetDir;
|
|
80
|
+
if (pathChoice === 'current') {
|
|
81
|
+
targetDir = resolve(process.cwd(), name);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
const customPath = await input({
|
|
85
|
+
message: 'Enter path:',
|
|
86
|
+
default: `./${name}`,
|
|
87
|
+
});
|
|
88
|
+
targetDir = resolve(process.cwd(), customPath);
|
|
89
|
+
}
|
|
90
|
+
// Check if directory exists
|
|
91
|
+
if (existsSync(targetDir)) {
|
|
92
|
+
console.log();
|
|
93
|
+
console.log(chalk.red(`Directory already exists: ${targetDir}`));
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
console.log();
|
|
97
|
+
spinner.start('Creating agent project...');
|
|
98
|
+
// Build config
|
|
99
|
+
const config = { name, provider };
|
|
100
|
+
// Generate project files
|
|
101
|
+
const files = language === 'ts'
|
|
102
|
+
? generateAgentTypescriptProject(config)
|
|
103
|
+
: generateAgentPythonProject(config);
|
|
104
|
+
// Create target directory and write all files
|
|
105
|
+
await mkdir(targetDir, { recursive: true });
|
|
106
|
+
for (const [relativePath, content] of Object.entries(files)) {
|
|
107
|
+
const filePath = join(targetDir, relativePath);
|
|
108
|
+
const fileDir = join(filePath, '..');
|
|
109
|
+
await mkdir(fileDir, { recursive: true });
|
|
110
|
+
await writeFile(filePath, content, 'utf-8');
|
|
111
|
+
}
|
|
112
|
+
spinner.succeed('Agent project created');
|
|
113
|
+
// Install dependencies (TypeScript only)
|
|
114
|
+
let packageManager = 'npm';
|
|
115
|
+
if (language === 'ts') {
|
|
116
|
+
const { execSync } = await import('node:child_process');
|
|
117
|
+
try {
|
|
118
|
+
execSync('pnpm --version', { stdio: 'ignore' });
|
|
119
|
+
packageManager = 'pnpm';
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// pnpm not available, use npm
|
|
123
|
+
}
|
|
124
|
+
spinner.start(`Installing dependencies with ${packageManager}...`);
|
|
125
|
+
try {
|
|
126
|
+
execSync(`${packageManager} install`, { cwd: targetDir, stdio: 'ignore' });
|
|
127
|
+
spinner.succeed('Dependencies installed');
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
spinner.warn(`Failed to install dependencies. Run \`${packageManager} install\` manually.`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Show success message
|
|
134
|
+
console.log();
|
|
135
|
+
console.log(chalk.green.bold(' Your agent is ready!'));
|
|
136
|
+
console.log();
|
|
137
|
+
console.log(chalk.dim(' Next steps:'));
|
|
138
|
+
console.log(` cd ${name}`);
|
|
139
|
+
console.log(' cp .env.example .env');
|
|
140
|
+
console.log(' # Add your API key to .env');
|
|
141
|
+
if (language === 'py') {
|
|
142
|
+
console.log(' python -m venv .venv && source .venv/bin/activate');
|
|
143
|
+
console.log(' pip install -e .');
|
|
144
|
+
console.log(' python cli.py');
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.log(` ${packageManager === 'pnpm' ? 'pnpm' : 'npm run'} dev`);
|
|
148
|
+
}
|
|
149
|
+
console.log();
|
|
150
|
+
console.log(chalk.dim(' Install triks:'));
|
|
151
|
+
console.log(' trik install @scope/trik-name');
|
|
152
|
+
console.log();
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
spinner.fail('Failed to create agent project');
|
|
156
|
+
if (error instanceof Error) {
|
|
157
|
+
// Handle user cancellation gracefully
|
|
158
|
+
if (error.message.includes('User force closed')) {
|
|
159
|
+
process.exit(0);
|
|
160
|
+
}
|
|
161
|
+
console.error(chalk.red(error.message));
|
|
162
|
+
}
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=create-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-agent.js","sourceRoot":"","sources":["../../src/commands/create-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,UAAU,WAAW;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,UAAU,WAAW;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvF"}
|
package/dist/commands/lint.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { resolve } from 'node:path';
|
|
8
8
|
import chalk from 'chalk';
|
|
9
|
-
import { TrikLinter } from '@trikhub/linter';
|
|
9
|
+
import { TrikLinter, formatScanResult } from '@trikhub/linter';
|
|
10
10
|
export async function lintCommand(trikPath, options) {
|
|
11
11
|
const resolvedPath = resolve(trikPath);
|
|
12
12
|
console.log(`Linting trik at: ${resolvedPath}\n`);
|
|
@@ -15,7 +15,12 @@ export async function lintCommand(trikPath, options) {
|
|
|
15
15
|
skipRules: options.skip,
|
|
16
16
|
});
|
|
17
17
|
try {
|
|
18
|
-
const results = await linter.lint(resolvedPath);
|
|
18
|
+
const { results, scan } = await linter.lint(resolvedPath);
|
|
19
|
+
// Security tier
|
|
20
|
+
console.log(formatScanResult(scan));
|
|
21
|
+
console.log('');
|
|
22
|
+
// Manifest validation
|
|
23
|
+
console.log(chalk.bold('Manifest validation:'));
|
|
19
24
|
console.log(linter.formatResults(results));
|
|
20
25
|
if (linter.hasErrors(results)) {
|
|
21
26
|
process.exit(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/commands/lint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAO/D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,OAAoB;IACtE,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEvC,OAAO,CAAC,GAAG,CAAC,oBAAoB,YAAY,IAAI,CAAC,CAAC;IAElD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC;QAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,SAAS,EAAE,OAAO,CAAC,IAAI;KACxB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE1D,gBAAgB;QAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,sBAAsB;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QAE3C,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python agent scaffold template.
|
|
3
|
+
*
|
|
4
|
+
* Generates a minimal Python agent project ready to consume triks via TrikGateway.
|
|
5
|
+
* Mirrors agent-typescript.ts but targets a Python environment.
|
|
6
|
+
*/
|
|
7
|
+
import type { CreateAgentConfig } from './agent-typescript.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate a complete Python agent project ready to consume triks.
|
|
10
|
+
*
|
|
11
|
+
* @returns Map of { relativePath: fileContent } for all project files.
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateAgentPythonProject(config: CreateAgentConfig): Record<string, string>;
|
|
14
|
+
//# sourceMappingURL=agent-python.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-python.d.ts","sourceRoot":"","sources":["../../src/templates/agent-python.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AA0L/D;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAW5F"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python agent scaffold template.
|
|
3
|
+
*
|
|
4
|
+
* Generates a minimal Python agent project ready to consume triks via TrikGateway.
|
|
5
|
+
* Mirrors agent-typescript.ts but targets a Python environment.
|
|
6
|
+
*/
|
|
7
|
+
const PROVIDERS = {
|
|
8
|
+
openai: {
|
|
9
|
+
importPath: 'langchain_openai',
|
|
10
|
+
className: 'ChatOpenAI',
|
|
11
|
+
pipPackage: 'langchain-openai',
|
|
12
|
+
defaultModel: 'gpt-4o-mini',
|
|
13
|
+
envVar: 'OPENAI_API_KEY',
|
|
14
|
+
},
|
|
15
|
+
anthropic: {
|
|
16
|
+
importPath: 'langchain_anthropic',
|
|
17
|
+
className: 'ChatAnthropic',
|
|
18
|
+
pipPackage: 'langchain-anthropic',
|
|
19
|
+
defaultModel: 'claude-sonnet-4-20250514',
|
|
20
|
+
envVar: 'ANTHROPIC_API_KEY',
|
|
21
|
+
},
|
|
22
|
+
google: {
|
|
23
|
+
importPath: 'langchain_google_genai',
|
|
24
|
+
className: 'ChatGoogleGenerativeAI',
|
|
25
|
+
pipPackage: 'langchain-google-genai',
|
|
26
|
+
defaultModel: 'gemini-2.0-flash',
|
|
27
|
+
envVar: 'GOOGLE_API_KEY',
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// File generators
|
|
32
|
+
// ============================================================================
|
|
33
|
+
function generatePyprojectToml(config) {
|
|
34
|
+
const provider = PROVIDERS[config.provider];
|
|
35
|
+
return `[build-system]
|
|
36
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
37
|
+
build-backend = "setuptools.build_meta"
|
|
38
|
+
|
|
39
|
+
[project]
|
|
40
|
+
name = "${config.name}"
|
|
41
|
+
version = "0.1.0"
|
|
42
|
+
description = "AI agent powered by TrikHub"
|
|
43
|
+
requires-python = ">=3.10"
|
|
44
|
+
|
|
45
|
+
dependencies = [
|
|
46
|
+
"${provider.pipPackage}>=1.0.0",
|
|
47
|
+
"langchain-core>=0.3.0",
|
|
48
|
+
"langgraph>=0.2.0",
|
|
49
|
+
"trikhub>=0.6.0",
|
|
50
|
+
"python-dotenv>=1.0.0",
|
|
51
|
+
]
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
function generateEnvExample(config) {
|
|
55
|
+
const provider = PROVIDERS[config.provider];
|
|
56
|
+
return `${provider.envVar}=your-api-key-here\n`;
|
|
57
|
+
}
|
|
58
|
+
function generateGitignore() {
|
|
59
|
+
return `__pycache__/
|
|
60
|
+
*.pyc
|
|
61
|
+
*.egg-info/
|
|
62
|
+
dist/
|
|
63
|
+
build/
|
|
64
|
+
.venv/
|
|
65
|
+
.env
|
|
66
|
+
`;
|
|
67
|
+
}
|
|
68
|
+
function generateTrikhubConfig() {
|
|
69
|
+
return JSON.stringify({ triks: [] }, null, 2);
|
|
70
|
+
}
|
|
71
|
+
function generateAgentPy(config) {
|
|
72
|
+
const provider = PROVIDERS[config.provider];
|
|
73
|
+
return `"""AI agent with TrikHub integration."""
|
|
74
|
+
|
|
75
|
+
from __future__ import annotations
|
|
76
|
+
|
|
77
|
+
from ${provider.importPath} import ${provider.className}
|
|
78
|
+
from langgraph.prebuilt import create_react_agent
|
|
79
|
+
|
|
80
|
+
from trikhub.gateway import TrikGateway
|
|
81
|
+
from trikhub.langchain import enhance, get_handoff_tools_for_agent, get_exposed_tools_for_agent
|
|
82
|
+
|
|
83
|
+
SYSTEM_PROMPT = """You are a helpful assistant.
|
|
84
|
+
When a trik can handle the user's request, use the appropriate tool."""
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
async def initialize_agent():
|
|
88
|
+
model = ${provider.className}(model="${provider.defaultModel}")
|
|
89
|
+
|
|
90
|
+
gateway = TrikGateway()
|
|
91
|
+
await gateway.initialize()
|
|
92
|
+
await gateway.load_triks_from_config()
|
|
93
|
+
|
|
94
|
+
handoff_tools = get_handoff_tools_for_agent(gateway)
|
|
95
|
+
exposed_tools = get_exposed_tools_for_agent(gateway)
|
|
96
|
+
|
|
97
|
+
agent = create_react_agent(
|
|
98
|
+
model=model,
|
|
99
|
+
tools=[*handoff_tools, *exposed_tools],
|
|
100
|
+
prompt=SYSTEM_PROMPT,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
app = await enhance(agent, gateway_instance=gateway)
|
|
104
|
+
|
|
105
|
+
return app, handoff_tools, exposed_tools
|
|
106
|
+
`;
|
|
107
|
+
}
|
|
108
|
+
function generateCliPy() {
|
|
109
|
+
return `#!/usr/bin/env python3
|
|
110
|
+
"""CLI for the TrikHub-powered agent."""
|
|
111
|
+
|
|
112
|
+
from __future__ import annotations
|
|
113
|
+
|
|
114
|
+
import asyncio
|
|
115
|
+
|
|
116
|
+
from dotenv import load_dotenv
|
|
117
|
+
|
|
118
|
+
load_dotenv()
|
|
119
|
+
|
|
120
|
+
from agent import initialize_agent
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
async def main() -> None:
|
|
124
|
+
print("Loading agent...\\n")
|
|
125
|
+
|
|
126
|
+
app, handoff_tools, exposed_tools = await initialize_agent()
|
|
127
|
+
|
|
128
|
+
if handoff_tools:
|
|
129
|
+
print(f"Handoff triks: {', '.join(t.name for t in handoff_tools)}")
|
|
130
|
+
if exposed_tools:
|
|
131
|
+
print(f"Tool-mode triks: {', '.join(t.name for t in exposed_tools)}")
|
|
132
|
+
print('Type "/back" to return from a trik handoff, "exit" to quit.\\n')
|
|
133
|
+
|
|
134
|
+
session_id = f"cli-{id(app)}"
|
|
135
|
+
|
|
136
|
+
while True:
|
|
137
|
+
try:
|
|
138
|
+
user_input = input("You: ").strip()
|
|
139
|
+
except (KeyboardInterrupt, EOFError):
|
|
140
|
+
print("\\n\\nGoodbye!")
|
|
141
|
+
break
|
|
142
|
+
|
|
143
|
+
if not user_input:
|
|
144
|
+
continue
|
|
145
|
+
if user_input.lower() in ("exit", "quit"):
|
|
146
|
+
print("\\nGoodbye!")
|
|
147
|
+
break
|
|
148
|
+
|
|
149
|
+
try:
|
|
150
|
+
result = await app.process_message(user_input, session_id)
|
|
151
|
+
|
|
152
|
+
if result.source == "system":
|
|
153
|
+
print(f"\\n\\033[2m{result.message}\\033[0m\\n")
|
|
154
|
+
elif result.source != "main":
|
|
155
|
+
print(f"\\n[{result.source}] {result.message}\\n")
|
|
156
|
+
else:
|
|
157
|
+
print(f"\\nAssistant: {result.message}\\n")
|
|
158
|
+
except Exception as e:
|
|
159
|
+
print(f"\\nError: {e}")
|
|
160
|
+
print("Please try again.\\n")
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
if __name__ == "__main__":
|
|
164
|
+
asyncio.run(main())
|
|
165
|
+
`;
|
|
166
|
+
}
|
|
167
|
+
// ============================================================================
|
|
168
|
+
// Public API
|
|
169
|
+
// ============================================================================
|
|
170
|
+
/**
|
|
171
|
+
* Generate a complete Python agent project ready to consume triks.
|
|
172
|
+
*
|
|
173
|
+
* @returns Map of { relativePath: fileContent } for all project files.
|
|
174
|
+
*/
|
|
175
|
+
export function generateAgentPythonProject(config) {
|
|
176
|
+
const files = {};
|
|
177
|
+
files['pyproject.toml'] = generatePyprojectToml(config);
|
|
178
|
+
files['.env.example'] = generateEnvExample(config);
|
|
179
|
+
files['.gitignore'] = generateGitignore();
|
|
180
|
+
files['.trikhub/config.json'] = generateTrikhubConfig();
|
|
181
|
+
files['agent.py'] = generateAgentPy(config);
|
|
182
|
+
files['cli.py'] = generateCliPy();
|
|
183
|
+
return files;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=agent-python.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-python.js","sourceRoot":"","sources":["../../src/templates/agent-python.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,MAAM,SAAS,GAAiC;IAC9C,MAAM,EAAE;QACN,UAAU,EAAE,kBAAkB;QAC9B,SAAS,EAAE,YAAY;QACvB,UAAU,EAAE,kBAAkB;QAC9B,YAAY,EAAE,aAAa;QAC3B,MAAM,EAAE,gBAAgB;KACzB;IACD,SAAS,EAAE;QACT,UAAU,EAAE,qBAAqB;QACjC,SAAS,EAAE,eAAe;QAC1B,UAAU,EAAE,qBAAqB;QACjC,YAAY,EAAE,0BAA0B;QACxC,MAAM,EAAE,mBAAmB;KAC5B;IACD,MAAM,EAAE;QACN,UAAU,EAAE,wBAAwB;QACpC,SAAS,EAAE,wBAAwB;QACnC,UAAU,EAAE,wBAAwB;QACpC,YAAY,EAAE,kBAAkB;QAChC,MAAM,EAAE,gBAAgB;KACzB;CACF,CAAC;AAEF,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,SAAS,qBAAqB,CAAC,MAAyB;IACtD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO;;;;;UAKC,MAAM,CAAC,IAAI;;;;;;OAMd,QAAQ,CAAC,UAAU;;;;;;CAMzB,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAyB;IACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,GAAG,QAAQ,CAAC,MAAM,sBAAsB,CAAC;AAClD,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO;;;;;;;CAOR,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,eAAe,CAAC,MAAyB;IAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO;;;;OAIF,QAAQ,CAAC,UAAU,WAAW,QAAQ,CAAC,SAAS;;;;;;;;;;;cAWzC,QAAQ,CAAC,SAAS,WAAW,QAAQ,CAAC,YAAY;;;;;;;;;;;;;;;;;;CAkB/D,CAAC;AACF,CAAC;AAED,SAAS,aAAa;IACpB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDR,CAAC;AACF,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAyB;IAClE,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,KAAK,CAAC,gBAAgB,CAAC,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACxD,KAAK,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACnD,KAAK,CAAC,YAAY,CAAC,GAAG,iBAAiB,EAAE,CAAC;IAC1C,KAAK,CAAC,sBAAsB,CAAC,GAAG,qBAAqB,EAAE,CAAC;IACxD,KAAK,CAAC,UAAU,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,CAAC,QAAQ,CAAC,GAAG,aAAa,EAAE,CAAC;IAElC,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript agent scaffold template.
|
|
3
|
+
*
|
|
4
|
+
* Generates a minimal agent project ready to consume triks via TrikGateway.
|
|
5
|
+
* This is the counterpart to `trik init` — it scaffolds the consuming agent,
|
|
6
|
+
* not a trik itself.
|
|
7
|
+
*/
|
|
8
|
+
export interface CreateAgentConfig {
|
|
9
|
+
name: string;
|
|
10
|
+
provider: 'openai' | 'anthropic' | 'google';
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate a complete TypeScript agent project ready to consume triks.
|
|
14
|
+
*
|
|
15
|
+
* @returns Map of { relativePath: fileContent } for all project files.
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateAgentTypescriptProject(config: CreateAgentConfig): Record<string, string>;
|
|
18
|
+
//# sourceMappingURL=agent-typescript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-typescript.d.ts","sourceRoot":"","sources":["../../src/templates/agent-typescript.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;CAC7C;AA+MD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYhG"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript agent scaffold template.
|
|
3
|
+
*
|
|
4
|
+
* Generates a minimal agent project ready to consume triks via TrikGateway.
|
|
5
|
+
* This is the counterpart to `trik init` — it scaffolds the consuming agent,
|
|
6
|
+
* not a trik itself.
|
|
7
|
+
*/
|
|
8
|
+
const PROVIDERS = {
|
|
9
|
+
openai: {
|
|
10
|
+
importPath: '@langchain/openai',
|
|
11
|
+
className: 'ChatOpenAI',
|
|
12
|
+
npmPackage: '@langchain/openai',
|
|
13
|
+
defaultModel: 'gpt-4o-mini',
|
|
14
|
+
envVar: 'OPENAI_API_KEY',
|
|
15
|
+
},
|
|
16
|
+
anthropic: {
|
|
17
|
+
importPath: '@langchain/anthropic',
|
|
18
|
+
className: 'ChatAnthropic',
|
|
19
|
+
npmPackage: '@langchain/anthropic',
|
|
20
|
+
defaultModel: 'claude-sonnet-4-20250514',
|
|
21
|
+
envVar: 'ANTHROPIC_API_KEY',
|
|
22
|
+
},
|
|
23
|
+
google: {
|
|
24
|
+
importPath: '@langchain/google-genai',
|
|
25
|
+
className: 'ChatGoogleGenerativeAI',
|
|
26
|
+
npmPackage: '@langchain/google-genai',
|
|
27
|
+
defaultModel: 'gemini-2.0-flash',
|
|
28
|
+
envVar: 'GOOGLE_API_KEY',
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
// ============================================================================
|
|
32
|
+
// File generators
|
|
33
|
+
// ============================================================================
|
|
34
|
+
function generatePackageJson(config) {
|
|
35
|
+
const provider = PROVIDERS[config.provider];
|
|
36
|
+
const pkg = {
|
|
37
|
+
name: config.name,
|
|
38
|
+
version: '0.1.0',
|
|
39
|
+
description: 'AI agent powered by TrikHub',
|
|
40
|
+
type: 'module',
|
|
41
|
+
scripts: {
|
|
42
|
+
dev: 'node --import tsx src/cli.ts',
|
|
43
|
+
build: 'tsc',
|
|
44
|
+
},
|
|
45
|
+
dependencies: {
|
|
46
|
+
[provider.npmPackage]: '^1.0.0',
|
|
47
|
+
'@langchain/core': '^1.0.0',
|
|
48
|
+
'@langchain/langgraph': '^1.0.0',
|
|
49
|
+
'@trikhub/gateway': 'latest',
|
|
50
|
+
dotenv: '^16.4.0',
|
|
51
|
+
},
|
|
52
|
+
devDependencies: {
|
|
53
|
+
tsx: '^4.19.0',
|
|
54
|
+
typescript: '^5.7.0',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
return JSON.stringify(pkg, null, 2);
|
|
58
|
+
}
|
|
59
|
+
function generateTsConfig() {
|
|
60
|
+
const tsconfig = {
|
|
61
|
+
compilerOptions: {
|
|
62
|
+
target: 'ES2022',
|
|
63
|
+
module: 'NodeNext',
|
|
64
|
+
moduleResolution: 'nodenext',
|
|
65
|
+
outDir: './dist',
|
|
66
|
+
rootDir: './src',
|
|
67
|
+
strict: true,
|
|
68
|
+
esModuleInterop: true,
|
|
69
|
+
skipLibCheck: true,
|
|
70
|
+
declaration: true,
|
|
71
|
+
sourceMap: true,
|
|
72
|
+
},
|
|
73
|
+
include: ['src/**/*'],
|
|
74
|
+
};
|
|
75
|
+
return JSON.stringify(tsconfig, null, 2);
|
|
76
|
+
}
|
|
77
|
+
function generateEnvExample(config) {
|
|
78
|
+
const provider = PROVIDERS[config.provider];
|
|
79
|
+
return `${provider.envVar}=your-api-key-here\n`;
|
|
80
|
+
}
|
|
81
|
+
function generateGitignore() {
|
|
82
|
+
return `node_modules/
|
|
83
|
+
dist/
|
|
84
|
+
*.tsbuildinfo
|
|
85
|
+
.env
|
|
86
|
+
`;
|
|
87
|
+
}
|
|
88
|
+
function generateTrikhubConfig() {
|
|
89
|
+
return JSON.stringify({ triks: [] }, null, 2);
|
|
90
|
+
}
|
|
91
|
+
function generateAgentTs(config) {
|
|
92
|
+
const provider = PROVIDERS[config.provider];
|
|
93
|
+
// Anthropic uses modelName, others use model
|
|
94
|
+
const modelParam = config.provider === 'anthropic' ? 'modelName' : 'model';
|
|
95
|
+
return `import { ${provider.className} } from '${provider.importPath}';
|
|
96
|
+
import { createReactAgent } from '@langchain/langgraph/prebuilt';
|
|
97
|
+
import { TrikGateway } from '@trikhub/gateway';
|
|
98
|
+
import { enhance, getHandoffToolsForAgent, getExposedToolsForAgent } from '@trikhub/gateway/langchain';
|
|
99
|
+
|
|
100
|
+
const SYSTEM_PROMPT = \`You are a helpful assistant.
|
|
101
|
+
When a trik can handle the user's request, use the appropriate tool.\`;
|
|
102
|
+
|
|
103
|
+
export async function initializeAgent() {
|
|
104
|
+
const model = new ${provider.className}({ ${modelParam}: '${provider.defaultModel}' });
|
|
105
|
+
|
|
106
|
+
const gateway = new TrikGateway();
|
|
107
|
+
await gateway.initialize();
|
|
108
|
+
await gateway.loadTriksFromConfig();
|
|
109
|
+
|
|
110
|
+
const handoffTools = getHandoffToolsForAgent(gateway);
|
|
111
|
+
const exposedTools = getExposedToolsForAgent(gateway);
|
|
112
|
+
|
|
113
|
+
const agent = createReactAgent({
|
|
114
|
+
llm: model,
|
|
115
|
+
tools: [...handoffTools, ...exposedTools] as any,
|
|
116
|
+
messageModifier: SYSTEM_PROMPT,
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const app = await enhance(agent as any, { gatewayInstance: gateway });
|
|
120
|
+
|
|
121
|
+
return { app, handoffTools, exposedTools };
|
|
122
|
+
}
|
|
123
|
+
`;
|
|
124
|
+
}
|
|
125
|
+
function generateCliTs() {
|
|
126
|
+
return `import 'dotenv/config';
|
|
127
|
+
import * as readline from 'readline';
|
|
128
|
+
import { initializeAgent } from './agent.js';
|
|
129
|
+
|
|
130
|
+
const rl = readline.createInterface({
|
|
131
|
+
input: process.stdin,
|
|
132
|
+
output: process.stdout,
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
function prompt(question: string): Promise<string> {
|
|
136
|
+
return new Promise((resolve) => {
|
|
137
|
+
rl.question(question, resolve);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async function main() {
|
|
142
|
+
console.log('Loading agent...\\n');
|
|
143
|
+
|
|
144
|
+
const { app, handoffTools, exposedTools } = await initializeAgent();
|
|
145
|
+
|
|
146
|
+
if (handoffTools.length > 0) {
|
|
147
|
+
console.log(\`Handoff triks: \${handoffTools.map((t) => t.name).join(', ')}\`);
|
|
148
|
+
}
|
|
149
|
+
if (exposedTools.length > 0) {
|
|
150
|
+
console.log(\`Tool-mode triks: \${exposedTools.map((t) => t.name).join(', ')}\`);
|
|
151
|
+
}
|
|
152
|
+
console.log('Type "/back" to return from a trik handoff, "exit" to quit.\\n');
|
|
153
|
+
|
|
154
|
+
const sessionId = \`cli-\${Date.now()}\`;
|
|
155
|
+
|
|
156
|
+
while (true) {
|
|
157
|
+
const userInput = await prompt('You: ');
|
|
158
|
+
|
|
159
|
+
if (!userInput.trim()) continue;
|
|
160
|
+
if (userInput.toLowerCase() === 'exit' || userInput.toLowerCase() === 'quit') {
|
|
161
|
+
console.log('\\nGoodbye!');
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
const result = await app.processMessage(userInput, sessionId);
|
|
167
|
+
|
|
168
|
+
if (result.source === 'system') {
|
|
169
|
+
console.log(\`\\n\\x1b[2m\${result.message}\\x1b[0m\\n\`);
|
|
170
|
+
} else if (result.source !== 'main') {
|
|
171
|
+
console.log(\`\\n[\${result.source}] \${result.message}\\n\`);
|
|
172
|
+
} else {
|
|
173
|
+
console.log(\`\\nAssistant: \${result.message}\\n\`);
|
|
174
|
+
}
|
|
175
|
+
} catch (error) {
|
|
176
|
+
console.error('\\nError:', error);
|
|
177
|
+
console.log('Please try again.\\n');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
rl.close();
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
main().catch((error) => {
|
|
185
|
+
console.error(error);
|
|
186
|
+
rl.close();
|
|
187
|
+
});
|
|
188
|
+
`;
|
|
189
|
+
}
|
|
190
|
+
// ============================================================================
|
|
191
|
+
// Public API
|
|
192
|
+
// ============================================================================
|
|
193
|
+
/**
|
|
194
|
+
* Generate a complete TypeScript agent project ready to consume triks.
|
|
195
|
+
*
|
|
196
|
+
* @returns Map of { relativePath: fileContent } for all project files.
|
|
197
|
+
*/
|
|
198
|
+
export function generateAgentTypescriptProject(config) {
|
|
199
|
+
const files = {};
|
|
200
|
+
files['package.json'] = generatePackageJson(config);
|
|
201
|
+
files['tsconfig.json'] = generateTsConfig();
|
|
202
|
+
files['.env.example'] = generateEnvExample(config);
|
|
203
|
+
files['.gitignore'] = generateGitignore();
|
|
204
|
+
files['.trikhub/config.json'] = generateTrikhubConfig();
|
|
205
|
+
files['src/agent.ts'] = generateAgentTs(config);
|
|
206
|
+
files['src/cli.ts'] = generateCliTs();
|
|
207
|
+
return files;
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=agent-typescript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-typescript.js","sourceRoot":"","sources":["../../src/templates/agent-typescript.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trikhub/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "CLI for TrikHub - Teaching AI new triks",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"commander": "^12.1.0",
|
|
26
26
|
"ora": "^8.0.1",
|
|
27
27
|
"semver": "^7.6.3",
|
|
28
|
-
"@trikhub/linter": "0.
|
|
29
|
-
"@trikhub/manifest": "0.
|
|
28
|
+
"@trikhub/linter": "0.16.0",
|
|
29
|
+
"@trikhub/manifest": "0.16.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/node": "^20.14.0",
|