agent-nuvira 1.14.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/LICENSE +21 -0
- package/README.md +891 -0
- package/dist/agent-sdk/src/agent.d.ts +118 -0
- package/dist/agent-sdk/src/agent.d.ts.map +1 -0
- package/dist/agent-sdk/src/agent.js +88 -0
- package/dist/agent-sdk/src/agent.js.map +1 -0
- package/dist/agent-sdk/src/index.d.ts +33 -0
- package/dist/agent-sdk/src/index.d.ts.map +1 -0
- package/dist/agent-sdk/src/index.js +32 -0
- package/dist/agent-sdk/src/index.js.map +1 -0
- package/dist/agent-sdk/src/register.d.ts +70 -0
- package/dist/agent-sdk/src/register.d.ts.map +1 -0
- package/dist/agent-sdk/src/register.js +181 -0
- package/dist/agent-sdk/src/register.js.map +1 -0
- package/dist/agent-sdk/src/scaffold.d.ts +50 -0
- package/dist/agent-sdk/src/scaffold.d.ts.map +1 -0
- package/dist/agent-sdk/src/scaffold.js +291 -0
- package/dist/agent-sdk/src/scaffold.js.map +1 -0
- package/dist/agent-sdk/src/testing.d.ts +187 -0
- package/dist/agent-sdk/src/testing.d.ts.map +1 -0
- package/dist/agent-sdk/src/testing.js +243 -0
- package/dist/agent-sdk/src/testing.js.map +1 -0
- package/dist/agent-sdk/src/types.d.ts +202 -0
- package/dist/agent-sdk/src/types.d.ts.map +1 -0
- package/dist/agent-sdk/src/types.js +11 -0
- package/dist/agent-sdk/src/types.js.map +1 -0
- package/dist/agents/agent.d.ts +132 -0
- package/dist/agents/agent.d.ts.map +1 -0
- package/dist/agents/agent.js +19 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/agents/context-gatherer.d.ts +42 -0
- package/dist/agents/agents/context-gatherer.d.ts.map +1 -0
- package/dist/agents/agents/context-gatherer.js +366 -0
- package/dist/agents/agents/context-gatherer.js.map +1 -0
- package/dist/agents/agents/debugger.d.ts +58 -0
- package/dist/agents/agents/debugger.d.ts.map +1 -0
- package/dist/agents/agents/debugger.js +257 -0
- package/dist/agents/agents/debugger.js.map +1 -0
- package/dist/agents/agents/git-agent.d.ts +34 -0
- package/dist/agents/agents/git-agent.d.ts.map +1 -0
- package/dist/agents/agents/git-agent.js +200 -0
- package/dist/agents/agents/git-agent.js.map +1 -0
- package/dist/agents/agents/github-release-agent.d.ts +65 -0
- package/dist/agents/agents/github-release-agent.d.ts.map +1 -0
- package/dist/agents/agents/github-release-agent.js +439 -0
- package/dist/agents/agents/github-release-agent.js.map +1 -0
- package/dist/agents/agents/package-agent.d.ts +33 -0
- package/dist/agents/agents/package-agent.d.ts.map +1 -0
- package/dist/agents/agents/package-agent.js +233 -0
- package/dist/agents/agents/package-agent.js.map +1 -0
- package/dist/agents/agents/planner.d.ts +26 -0
- package/dist/agents/agents/planner.d.ts.map +1 -0
- package/dist/agents/agents/planner.js +222 -0
- package/dist/agents/agents/planner.js.map +1 -0
- package/dist/agents/agents/reviewer.d.ts +34 -0
- package/dist/agents/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/agents/reviewer.js +159 -0
- package/dist/agents/agents/reviewer.js.map +1 -0
- package/dist/agents/agents/runner.d.ts +73 -0
- package/dist/agents/agents/runner.d.ts.map +1 -0
- package/dist/agents/agents/runner.js +299 -0
- package/dist/agents/agents/runner.js.map +1 -0
- package/dist/agents/agents/security-agent.d.ts +33 -0
- package/dist/agents/agents/security-agent.d.ts.map +1 -0
- package/dist/agents/agents/security-agent.js +184 -0
- package/dist/agents/agents/security-agent.js.map +1 -0
- package/dist/agents/agents/tester.d.ts +96 -0
- package/dist/agents/agents/tester.d.ts.map +1 -0
- package/dist/agents/agents/tester.js +410 -0
- package/dist/agents/agents/tester.js.map +1 -0
- package/dist/agents/agents/writer.d.ts +51 -0
- package/dist/agents/agents/writer.d.ts.map +1 -0
- package/dist/agents/agents/writer.js +384 -0
- package/dist/agents/agents/writer.js.map +1 -0
- package/dist/agents/context-vault.d.ts +49 -0
- package/dist/agents/context-vault.d.ts.map +1 -0
- package/dist/agents/context-vault.js +134 -0
- package/dist/agents/context-vault.js.map +1 -0
- package/dist/agents/orchestrator.d.ts +97 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +696 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/utils/file-tree.d.ts +28 -0
- package/dist/agents/utils/file-tree.d.ts.map +1 -0
- package/dist/agents/utils/file-tree.js +93 -0
- package/dist/agents/utils/file-tree.js.map +1 -0
- package/dist/cli/agent.d.ts +25 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +374 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/benchmark.d.ts +24 -0
- package/dist/cli/benchmark.d.ts.map +1 -0
- package/dist/cli/benchmark.js +235 -0
- package/dist/cli/benchmark.js.map +1 -0
- package/dist/cli/cache.d.ts +12 -0
- package/dist/cli/cache.d.ts.map +1 -0
- package/dist/cli/cache.js +58 -0
- package/dist/cli/cache.js.map +1 -0
- package/dist/cli/chat.d.ts +37 -0
- package/dist/cli/chat.d.ts.map +1 -0
- package/dist/cli/chat.js +393 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/commands.d.ts +24 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +18 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/config.d.ts +19 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +162 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/dashboard.d.ts +34 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +126 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/doctor.d.ts +68 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +585 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/edit.d.ts +11 -0
- package/dist/cli/edit.d.ts.map +1 -0
- package/dist/cli/edit.js +86 -0
- package/dist/cli/edit.js.map +1 -0
- package/dist/cli/execute.d.ts +25 -0
- package/dist/cli/execute.d.ts.map +1 -0
- package/dist/cli/execute.js +186 -0
- package/dist/cli/execute.js.map +1 -0
- package/dist/cli/federation.d.ts +31 -0
- package/dist/cli/federation.d.ts.map +1 -0
- package/dist/cli/federation.js +387 -0
- package/dist/cli/federation.js.map +1 -0
- package/dist/cli/history.d.ts +22 -0
- package/dist/cli/history.d.ts.map +1 -0
- package/dist/cli/history.js +140 -0
- package/dist/cli/history.js.map +1 -0
- package/dist/cli/init.d.ts +49 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +423 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/learn.d.ts +31 -0
- package/dist/cli/learn.d.ts.map +1 -0
- package/dist/cli/learn.js +320 -0
- package/dist/cli/learn.js.map +1 -0
- package/dist/cli/memory.d.ts +38 -0
- package/dist/cli/memory.d.ts.map +1 -0
- package/dist/cli/memory.js +295 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/model-picker.d.ts +18 -0
- package/dist/cli/model-picker.d.ts.map +1 -0
- package/dist/cli/model-picker.js +225 -0
- package/dist/cli/model-picker.js.map +1 -0
- package/dist/cli/models.d.ts +11 -0
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/cli/models.js +132 -0
- package/dist/cli/models.js.map +1 -0
- package/dist/cli/plan.d.ts +11 -0
- package/dist/cli/plan.d.ts.map +1 -0
- package/dist/cli/plan.js +94 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/plugins.d.ts +15 -0
- package/dist/cli/plugins.d.ts.map +1 -0
- package/dist/cli/plugins.js +123 -0
- package/dist/cli/plugins.js.map +1 -0
- package/dist/cli/router.d.ts +20 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +142 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/run.d.ts +22 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +110 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/sandbox.d.ts +27 -0
- package/dist/cli/sandbox.d.ts.map +1 -0
- package/dist/cli/sandbox.js +264 -0
- package/dist/cli/sandbox.js.map +1 -0
- package/dist/cli/sdk.d.ts +27 -0
- package/dist/cli/sdk.d.ts.map +1 -0
- package/dist/cli/sdk.js +204 -0
- package/dist/cli/sdk.js.map +1 -0
- package/dist/cli/stats.d.ts +18 -0
- package/dist/cli/stats.d.ts.map +1 -0
- package/dist/cli/stats.js +78 -0
- package/dist/cli/stats.js.map +1 -0
- package/dist/cli/team.d.ts +42 -0
- package/dist/cli/team.d.ts.map +1 -0
- package/dist/cli/team.js +473 -0
- package/dist/cli/team.js.map +1 -0
- package/dist/cli/workflow.d.ts +27 -0
- package/dist/cli/workflow.d.ts.map +1 -0
- package/dist/cli/workflow.js +347 -0
- package/dist/cli/workflow.js.map +1 -0
- package/dist/config/manager.d.ts +37 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +147 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +53 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/context/cache.d.ts +27 -0
- package/dist/context/cache.d.ts.map +1 -0
- package/dist/context/cache.js +116 -0
- package/dist/context/cache.js.map +1 -0
- package/dist/context/history.d.ts +87 -0
- package/dist/context/history.d.ts.map +1 -0
- package/dist/context/history.js +249 -0
- package/dist/context/history.js.map +1 -0
- package/dist/context/parser.d.ts +61 -0
- package/dist/context/parser.d.ts.map +1 -0
- package/dist/context/parser.js +194 -0
- package/dist/context/parser.js.map +1 -0
- package/dist/federation/client.d.ts +49 -0
- package/dist/federation/client.d.ts.map +1 -0
- package/dist/federation/client.js +239 -0
- package/dist/federation/client.js.map +1 -0
- package/dist/federation/protocol.d.ts +155 -0
- package/dist/federation/protocol.d.ts.map +1 -0
- package/dist/federation/protocol.js +57 -0
- package/dist/federation/protocol.js.map +1 -0
- package/dist/federation/server.d.ts +25 -0
- package/dist/federation/server.d.ts.map +1 -0
- package/dist/federation/server.js +401 -0
- package/dist/federation/server.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/inference/factory.d.ts +20 -0
- package/dist/inference/factory.d.ts.map +1 -0
- package/dist/inference/factory.js +46 -0
- package/dist/inference/factory.js.map +1 -0
- package/dist/inference/gemini-adapter.d.ts +17 -0
- package/dist/inference/gemini-adapter.d.ts.map +1 -0
- package/dist/inference/gemini-adapter.js +176 -0
- package/dist/inference/gemini-adapter.js.map +1 -0
- package/dist/inference/groq-adapter.d.ts +17 -0
- package/dist/inference/groq-adapter.d.ts.map +1 -0
- package/dist/inference/groq-adapter.js +103 -0
- package/dist/inference/groq-adapter.js.map +1 -0
- package/dist/inference/interface.d.ts +49 -0
- package/dist/inference/interface.d.ts.map +1 -0
- package/dist/inference/interface.js +2 -0
- package/dist/inference/interface.js.map +1 -0
- package/dist/inference/local-adapter.d.ts +35 -0
- package/dist/inference/local-adapter.d.ts.map +1 -0
- package/dist/inference/local-adapter.js +311 -0
- package/dist/inference/local-adapter.js.map +1 -0
- package/dist/inference/model-catalog.d.ts +53 -0
- package/dist/inference/model-catalog.d.ts.map +1 -0
- package/dist/inference/model-catalog.js +306 -0
- package/dist/inference/model-catalog.js.map +1 -0
- package/dist/inference/nim-adapter.d.ts +17 -0
- package/dist/inference/nim-adapter.d.ts.map +1 -0
- package/dist/inference/nim-adapter.js +103 -0
- package/dist/inference/nim-adapter.js.map +1 -0
- package/dist/inference/openrouter-adapter.d.ts +17 -0
- package/dist/inference/openrouter-adapter.d.ts.map +1 -0
- package/dist/inference/openrouter-adapter.js +105 -0
- package/dist/inference/openrouter-adapter.js.map +1 -0
- package/dist/inference/sse.d.ts +20 -0
- package/dist/inference/sse.d.ts.map +1 -0
- package/dist/inference/sse.js +91 -0
- package/dist/inference/sse.js.map +1 -0
- package/dist/learning/agent-stats.d.ts +109 -0
- package/dist/learning/agent-stats.d.ts.map +1 -0
- package/dist/learning/agent-stats.js +240 -0
- package/dist/learning/agent-stats.js.map +1 -0
- package/dist/learning/benchmark.d.ts +161 -0
- package/dist/learning/benchmark.d.ts.map +1 -0
- package/dist/learning/benchmark.js +589 -0
- package/dist/learning/benchmark.js.map +1 -0
- package/dist/learning/cost-tracker.d.ts +101 -0
- package/dist/learning/cost-tracker.d.ts.map +1 -0
- package/dist/learning/cost-tracker.js +224 -0
- package/dist/learning/cost-tracker.js.map +1 -0
- package/dist/learning/feedback.d.ts +88 -0
- package/dist/learning/feedback.d.ts.map +1 -0
- package/dist/learning/feedback.js +169 -0
- package/dist/learning/feedback.js.map +1 -0
- package/dist/learning/hybrid-router.d.ts +201 -0
- package/dist/learning/hybrid-router.d.ts.map +1 -0
- package/dist/learning/hybrid-router.js +450 -0
- package/dist/learning/hybrid-router.js.map +1 -0
- package/dist/learning/model-compare.d.ts +76 -0
- package/dist/learning/model-compare.d.ts.map +1 -0
- package/dist/learning/model-compare.js +252 -0
- package/dist/learning/model-compare.js.map +1 -0
- package/dist/learning/model-router.d.ts +68 -0
- package/dist/learning/model-router.d.ts.map +1 -0
- package/dist/learning/model-router.js +140 -0
- package/dist/learning/model-router.js.map +1 -0
- package/dist/learning/pattern-extractor.d.ts +99 -0
- package/dist/learning/pattern-extractor.d.ts.map +1 -0
- package/dist/learning/pattern-extractor.js +310 -0
- package/dist/learning/pattern-extractor.js.map +1 -0
- package/dist/learning/scorer.d.ts +51 -0
- package/dist/learning/scorer.d.ts.map +1 -0
- package/dist/learning/scorer.js +64 -0
- package/dist/learning/scorer.js.map +1 -0
- package/dist/learning/self-improver.d.ts +48 -0
- package/dist/learning/self-improver.d.ts.map +1 -0
- package/dist/learning/self-improver.js +161 -0
- package/dist/learning/self-improver.js.map +1 -0
- package/dist/memory/embedder.d.ts +65 -0
- package/dist/memory/embedder.d.ts.map +1 -0
- package/dist/memory/embedder.js +424 -0
- package/dist/memory/embedder.js.map +1 -0
- package/dist/memory/memory-integration.d.ts +56 -0
- package/dist/memory/memory-integration.d.ts.map +1 -0
- package/dist/memory/memory-integration.js +95 -0
- package/dist/memory/memory-integration.js.map +1 -0
- package/dist/memory/trajectory-store.d.ts +149 -0
- package/dist/memory/trajectory-store.d.ts.map +1 -0
- package/dist/memory/trajectory-store.js +476 -0
- package/dist/memory/trajectory-store.js.map +1 -0
- package/dist/memory/vector-store.d.ts +78 -0
- package/dist/memory/vector-store.d.ts.map +1 -0
- package/dist/memory/vector-store.js +186 -0
- package/dist/memory/vector-store.js.map +1 -0
- package/dist/plugins/agent-plugin.d.ts +73 -0
- package/dist/plugins/agent-plugin.d.ts.map +1 -0
- package/dist/plugins/agent-plugin.js +199 -0
- package/dist/plugins/agent-plugin.js.map +1 -0
- package/dist/plugins/registry.d.ts +61 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +67 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/sandbox/images.d.ts +31 -0
- package/dist/sandbox/images.d.ts.map +1 -0
- package/dist/sandbox/images.js +129 -0
- package/dist/sandbox/images.js.map +1 -0
- package/dist/sandbox/manager.d.ts +134 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +470 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/types.d.ts +113 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +107 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/security/scanner.d.ts +53 -0
- package/dist/security/scanner.d.ts.map +1 -0
- package/dist/security/scanner.js +271 -0
- package/dist/security/scanner.js.map +1 -0
- package/dist/team/config.d.ts +50 -0
- package/dist/team/config.d.ts.map +1 -0
- package/dist/team/config.js +108 -0
- package/dist/team/config.js.map +1 -0
- package/dist/team/memory.d.ts +63 -0
- package/dist/team/memory.d.ts.map +1 -0
- package/dist/team/memory.js +282 -0
- package/dist/team/memory.js.map +1 -0
- package/dist/team/review.d.ts +123 -0
- package/dist/team/review.d.ts.map +1 -0
- package/dist/team/review.js +293 -0
- package/dist/team/review.js.map +1 -0
- package/dist/utils/env.d.ts +19 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +250 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +45 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/web-dashboard/server.d.ts +59 -0
- package/dist/web-dashboard/server.d.ts.map +1 -0
- package/dist/web-dashboard/server.js +418 -0
- package/dist/web-dashboard/server.js.map +1 -0
- package/dist/workflow/registry.d.ts +127 -0
- package/dist/workflow/registry.d.ts.map +1 -0
- package/dist/workflow/registry.js +482 -0
- package/dist/workflow/registry.js.map +1 -0
- package/dist/workflow/templates.d.ts +93 -0
- package/dist/workflow/templates.d.ts.map +1 -0
- package/dist/workflow/templates.js +481 -0
- package/dist/workflow/templates.js.map +1 -0
- package/package.json +78 -0
- package/src/web-dashboard/public/assets/index-B08nDkSB.css +1 -0
- package/src/web-dashboard/public/assets/index-BKL8YOFD.js +135 -0
- package/src/web-dashboard/public/assets/index-BKL8YOFD.js.map +1 -0
- package/src/web-dashboard/public/index.html +13 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @agent-nuvira/sdk/scaffold — Scaffolding command for creating custom agent projects.
|
|
3
|
+
*
|
|
4
|
+
* Generates a complete, ready-to-extend agent package with:
|
|
5
|
+
* - TypeScript configuration
|
|
6
|
+
* - A custom agent class extending {@link Agent}
|
|
7
|
+
* - Unit tests using the {@link testing} utilities
|
|
8
|
+
* - Package.json with build/test scripts
|
|
9
|
+
*
|
|
10
|
+
* @module @agent-nuvira/sdk/scaffold
|
|
11
|
+
*/
|
|
12
|
+
import { mkdirSync, writeFileSync, existsSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
// ─── Agent Name Helpers ─────────────────────────────────────────────────────
|
|
15
|
+
/** Convert PascalCase to kebab-case (e.g. "CodeFormatter" → "code-formatter") */
|
|
16
|
+
function toKebabCase(pascal) {
|
|
17
|
+
return pascal
|
|
18
|
+
.replace(/([A-Z])/g, '-$1')
|
|
19
|
+
.toLowerCase()
|
|
20
|
+
.replace(/^-/, '');
|
|
21
|
+
}
|
|
22
|
+
/** Convert PascalCase to camelCase (e.g. "CodeFormatter" → "codeFormatter") */
|
|
23
|
+
function toCamelCase(pascal) {
|
|
24
|
+
return pascal.charAt(0).toLowerCase() + pascal.slice(1);
|
|
25
|
+
}
|
|
26
|
+
// ─── Templates ──────────────────────────────────────────────────────────────
|
|
27
|
+
const PACKAGE_JSON_TEMPLATE = (opts) => `{
|
|
28
|
+
"name": "${toKebabCase(opts.agentName)}-agent",
|
|
29
|
+
"version": "0.1.0",
|
|
30
|
+
"description": "${opts.description}",
|
|
31
|
+
"type": "module",
|
|
32
|
+
"main": "dist/index.js",
|
|
33
|
+
"types": "dist/index.d.ts",
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc",
|
|
36
|
+
"dev": "tsc --watch",
|
|
37
|
+
"test": "vitest run",
|
|
38
|
+
"test:watch": "vitest"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@agent-nuvira/sdk": "^1.0.0"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"typescript": "^5.3.0",
|
|
45
|
+
"vitest": "^1.0.0"
|
|
46
|
+
}
|
|
47
|
+
}`;
|
|
48
|
+
const TS_CONFIG_TEMPLATE = `{
|
|
49
|
+
"compilerOptions": {
|
|
50
|
+
"target": "ES2022",
|
|
51
|
+
"module": "NodeNext",
|
|
52
|
+
"moduleResolution": "NodeNext",
|
|
53
|
+
"declaration": true,
|
|
54
|
+
"outDir": "dist",
|
|
55
|
+
"rootDir": "src",
|
|
56
|
+
"strict": true,
|
|
57
|
+
"esModuleInterop": true,
|
|
58
|
+
"skipLibCheck": true,
|
|
59
|
+
"forceConsistentCasingInFileNames": true
|
|
60
|
+
},
|
|
61
|
+
"include": ["src/**/*.ts"],
|
|
62
|
+
"exclude": ["node_modules", "dist"]
|
|
63
|
+
}`;
|
|
64
|
+
const AGENT_SRC_TEMPLATE = (opts) => {
|
|
65
|
+
const agentType = opts.agentType || toKebabCase(opts.agentName);
|
|
66
|
+
return `/**
|
|
67
|
+
* ${opts.agentName} — ${opts.description}
|
|
68
|
+
*
|
|
69
|
+
* Generated by \`buff sdk scaffold\`
|
|
70
|
+
*/
|
|
71
|
+
|
|
72
|
+
import { Agent, type AgentContext, type AgentResult, type LLMCallFn } from '@agent-nuvira/sdk';
|
|
73
|
+
|
|
74
|
+
export class ${opts.agentName} extends Agent {
|
|
75
|
+
readonly name = '${opts.agentName}';
|
|
76
|
+
readonly description = '${opts.description}';
|
|
77
|
+
|
|
78
|
+
async execute(context: AgentContext, callLLM: LLMCallFn): Promise<AgentResult> {
|
|
79
|
+
// ── Read inputs from context ───────────────────────────────────────
|
|
80
|
+
const goal = context.goal;
|
|
81
|
+
const files = context.artifacts;
|
|
82
|
+
|
|
83
|
+
// ── Build a prompt for the LLM ─────────────────────────────────────
|
|
84
|
+
const prompt = \`You are the ${opts.agentName} agent.
|
|
85
|
+
Goal: \${goal}
|
|
86
|
+
|
|
87
|
+
Files:
|
|
88
|
+
\${files.map(f => \`- \${f.path}: \${f.description}\`).join('\\\\n') || '(No files provided)'}
|
|
89
|
+
|
|
90
|
+
Please complete the task described in the goal.\`;
|
|
91
|
+
|
|
92
|
+
// ── Call the LLM ───────────────────────────────────────────────────
|
|
93
|
+
const response = await callLLM(prompt, {
|
|
94
|
+
temperature: 0.3,
|
|
95
|
+
maxTokens: 2048,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// ── Process and return results ─────────────────────────────────────
|
|
99
|
+
return {
|
|
100
|
+
success: true,
|
|
101
|
+
summary: \`\${this.name} completed: \${goal.slice(0, 60)}\`,
|
|
102
|
+
details: response,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Agent descriptor for registering this agent in the system.
|
|
109
|
+
* Export this to allow automatic registration.
|
|
110
|
+
*/
|
|
111
|
+
export const agentDescriptor = {
|
|
112
|
+
AgentClass: ${opts.agentName},
|
|
113
|
+
name: '${opts.agentName}',
|
|
114
|
+
description: '${opts.description}',
|
|
115
|
+
agentType: '${agentType}',
|
|
116
|
+
tags: 'custom',
|
|
117
|
+
};
|
|
118
|
+
`;
|
|
119
|
+
};
|
|
120
|
+
const AGENT_INDEX_TEMPLATE = (opts) => `/**
|
|
121
|
+
* ${opts.agentName} — Agent entry point.
|
|
122
|
+
* Generated by \`buff sdk scaffold\`
|
|
123
|
+
*/
|
|
124
|
+
|
|
125
|
+
export { ${opts.agentName}, agentDescriptor } from './${toCamelCase(opts.agentName)}.js';
|
|
126
|
+
`;
|
|
127
|
+
const VITEST_CONFIG_TEMPLATE = `import { defineConfig } from 'vitest/config';
|
|
128
|
+
|
|
129
|
+
export default defineConfig({
|
|
130
|
+
test: {
|
|
131
|
+
globals: true,
|
|
132
|
+
environment: 'node',
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
`;
|
|
136
|
+
const AGENT_TEST_TEMPLATE = (opts) => `/**
|
|
137
|
+
* ${opts.agentName} — Unit tests.
|
|
138
|
+
* Generated by \`buff sdk scaffold\`
|
|
139
|
+
*/
|
|
140
|
+
|
|
141
|
+
import { describe, it, expect } from 'vitest';
|
|
142
|
+
import { ${opts.agentName} } from '../src/${toCamelCase(opts.agentName)}.js';
|
|
143
|
+
import {
|
|
144
|
+
createMockContext,
|
|
145
|
+
createMockLLM,
|
|
146
|
+
createFailingMockLLM,
|
|
147
|
+
runAgentTest,
|
|
148
|
+
assertAgentSuccess,
|
|
149
|
+
assertAgentFailure,
|
|
150
|
+
} from '@agent-nuvira/sdk/testing';
|
|
151
|
+
|
|
152
|
+
describe('${opts.agentName}', () => {
|
|
153
|
+
const agent = new ${opts.agentName}();
|
|
154
|
+
|
|
155
|
+
it('should return success with summary', async () => {
|
|
156
|
+
const context = createMockContext({
|
|
157
|
+
goal: 'Test the agent',
|
|
158
|
+
artifacts: [
|
|
159
|
+
{ path: 'src/index.ts', content: 'console.log("hello")', description: 'Source file' },
|
|
160
|
+
],
|
|
161
|
+
});
|
|
162
|
+
const callLLM = createMockLLM('Task completed successfully');
|
|
163
|
+
|
|
164
|
+
const result = await runAgentTest(agent, context, callLLM);
|
|
165
|
+
|
|
166
|
+
assertAgentSuccess(result);
|
|
167
|
+
expect(result.summary).toBeTruthy();
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('should handle errors gracefully', async () => {
|
|
171
|
+
const context = createMockContext({ goal: 'Test error handling' });
|
|
172
|
+
const callLLM = createFailingMockLLM(new Error('API error'));
|
|
173
|
+
|
|
174
|
+
const result = await runAgentTest(agent, context, callLLM);
|
|
175
|
+
|
|
176
|
+
assertAgentFailure(result);
|
|
177
|
+
expect(result.error).toContain('API error');
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('should pass validation by default', () => {
|
|
181
|
+
const context = createMockContext();
|
|
182
|
+
const validation = agent.validate(context);
|
|
183
|
+
expect(validation).toBe(true);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
`;
|
|
187
|
+
const AGENT_PACK_TEMPLATE = `# Agent Packages
|
|
188
|
+
|
|
189
|
+
This directory contains multiple custom agents that can be registered together.
|
|
190
|
+
Use \`buff sdk register\` to register all agents in a package.
|
|
191
|
+
|
|
192
|
+
## Adding an Agent
|
|
193
|
+
|
|
194
|
+
1. Create a new directory with your agent name
|
|
195
|
+
2. Add the agent source file extending \`Agent\`
|
|
196
|
+
3. Export an \`agentDescriptor\` object
|
|
197
|
+
4. Re-export from this package's \`index.ts\`
|
|
198
|
+
`;
|
|
199
|
+
const AGENT_PACK_INDEX_TEMPLATE = (opts) => `/**
|
|
200
|
+
* ${opts.agentName} — Agent package entry point.
|
|
201
|
+
* Generated by \`buff sdk scaffold\`
|
|
202
|
+
*/
|
|
203
|
+
|
|
204
|
+
// Re-export your custom agents here:
|
|
205
|
+
// export { MyAgent, agentDescriptor as myAgentDescriptor } from './my-agent/index.js';
|
|
206
|
+
// export { AnotherAgent, agentDescriptor as anotherAgentDescriptor } from './another-agent/index.js';
|
|
207
|
+
`;
|
|
208
|
+
// ─── File Writer ────────────────────────────────────────────────────────────
|
|
209
|
+
function writeFile(outDir, filePath, content) {
|
|
210
|
+
const fullPath = join(outDir, filePath);
|
|
211
|
+
mkdirSync(join(outDir, dirname(filePath)), { recursive: true });
|
|
212
|
+
writeFileSync(fullPath, content, 'utf-8');
|
|
213
|
+
return fullPath;
|
|
214
|
+
}
|
|
215
|
+
function dirname(p) {
|
|
216
|
+
const idx = p.lastIndexOf('/');
|
|
217
|
+
return idx >= 0 ? p.slice(0, idx) : '.';
|
|
218
|
+
}
|
|
219
|
+
// ─── Scaffold Command ───────────────────────────────────────────────────────
|
|
220
|
+
/**
|
|
221
|
+
* Scaffold a new custom agent project.
|
|
222
|
+
*
|
|
223
|
+
* @returns An array of file paths that were created.
|
|
224
|
+
*
|
|
225
|
+
* @example
|
|
226
|
+
* ```ts
|
|
227
|
+
* const files = scaffold({
|
|
228
|
+
* outDir: './my-custom-agent',
|
|
229
|
+
* agentName: 'CodeFormatter',
|
|
230
|
+
* description: 'Formats source code according to project conventions',
|
|
231
|
+
* });
|
|
232
|
+
* console.log(\`Created \${files.length} files\`);
|
|
233
|
+
* ```
|
|
234
|
+
*/
|
|
235
|
+
export function scaffold(options) {
|
|
236
|
+
const { outDir, agentName, description, template = 'full-agent', agentType, } = options;
|
|
237
|
+
if (!agentName || !agentName.match(/^[A-Z][a-zA-Z0-9]*$/)) {
|
|
238
|
+
throw new Error(`Invalid agent name "${agentName}". Must be in PascalCase (e.g. "CodeFormatter", "MyAgent").`);
|
|
239
|
+
}
|
|
240
|
+
if (existsSync(outDir)) {
|
|
241
|
+
throw new Error(`Output directory already exists: ${outDir}`);
|
|
242
|
+
}
|
|
243
|
+
const files = [];
|
|
244
|
+
switch (template) {
|
|
245
|
+
case 'basic-agent': {
|
|
246
|
+
files.push(writeFile(outDir, 'package.json', PACKAGE_JSON_TEMPLATE({ ...options, description })));
|
|
247
|
+
files.push(writeFile(outDir, 'tsconfig.json', TS_CONFIG_TEMPLATE));
|
|
248
|
+
files.push(writeFile(outDir, `src/${toCamelCase(agentName)}.ts`, AGENT_SRC_TEMPLATE({ ...options, description })));
|
|
249
|
+
files.push(writeFile(outDir, 'src/index.ts', AGENT_INDEX_TEMPLATE({ ...options, description })));
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
case 'full-agent': {
|
|
253
|
+
files.push(writeFile(outDir, 'package.json', PACKAGE_JSON_TEMPLATE({ ...options, description })));
|
|
254
|
+
files.push(writeFile(outDir, 'tsconfig.json', TS_CONFIG_TEMPLATE));
|
|
255
|
+
files.push(writeFile(outDir, 'vitest.config.ts', VITEST_CONFIG_TEMPLATE));
|
|
256
|
+
files.push(writeFile(outDir, `src/${toCamelCase(agentName)}.ts`, AGENT_SRC_TEMPLATE({ ...options, description })));
|
|
257
|
+
files.push(writeFile(outDir, 'src/index.ts', AGENT_INDEX_TEMPLATE({ ...options, description })));
|
|
258
|
+
files.push(writeFile(outDir, `tests/${toCamelCase(agentName)}.test.ts`, AGENT_TEST_TEMPLATE({ ...options, description })));
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
case 'agent-pack': {
|
|
262
|
+
files.push(writeFile(outDir, 'README.md', AGENT_PACK_TEMPLATE));
|
|
263
|
+
files.push(writeFile(outDir, 'src/index.ts', AGENT_PACK_INDEX_TEMPLATE({ ...options, description })));
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
default: {
|
|
267
|
+
throw new Error(`Unknown template type: ${template}`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return files;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* List available scaffold templates with descriptions.
|
|
274
|
+
*/
|
|
275
|
+
export function listTemplates() {
|
|
276
|
+
return [
|
|
277
|
+
{
|
|
278
|
+
name: 'basic-agent',
|
|
279
|
+
description: 'Minimal agent with package.json, tsconfig, and source file',
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
name: 'full-agent',
|
|
283
|
+
description: 'Complete agent with package.json, tsconfig, vitest, source, and unit tests',
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
name: 'agent-pack',
|
|
287
|
+
description: 'Multi-agent package structure for distributing multiple agents together',
|
|
288
|
+
},
|
|
289
|
+
];
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/agent-sdk/src/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @agent-nuvira/sdk/testing — Testing utilities for building and testing custom agents.
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - {@link createMockContext} — Build a fully typed {@link AgentContext} for tests
|
|
6
|
+
* - {@link createMockLLM} — Create a mock LLM function that returns controlled responses
|
|
7
|
+
* - {@link runAgentTest} — Convenience wrapper for executing an agent in a test
|
|
8
|
+
* - {@link assertAgentSuccess} / {@link assertAgentFailure} — Result assertions
|
|
9
|
+
*
|
|
10
|
+
* ## Example
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { describe, it, expect } from 'vitest';
|
|
14
|
+
* import { MyAgent } from './my-agent.js';
|
|
15
|
+
* import {
|
|
16
|
+
* createMockContext,
|
|
17
|
+
* createMockLLM,
|
|
18
|
+
* runAgentTest,
|
|
19
|
+
* assertAgentSuccess,
|
|
20
|
+
* } from '@agent-nuvira/sdk/testing';
|
|
21
|
+
*
|
|
22
|
+
* describe('MyAgent', () => {
|
|
23
|
+
* it('should process files correctly', async () => {
|
|
24
|
+
* const context = createMockContext({
|
|
25
|
+
* goal: 'Format all TypeScript files',
|
|
26
|
+
* artifacts: [{ path: 'src/index.ts', content: 'const x=1', description: 'Source file' }],
|
|
27
|
+
* });
|
|
28
|
+
* const callLLM = createMockLLM('Formatted code content');
|
|
29
|
+
*
|
|
30
|
+
* const result = await runAgentTest(new MyAgent(), context, callLLM);
|
|
31
|
+
*
|
|
32
|
+
* assertAgentSuccess(result);
|
|
33
|
+
* expect(result.summary).toContain('Formatted');
|
|
34
|
+
* expect(context.fileChanges).toHaveLength(1);
|
|
35
|
+
* });
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @module @agent-nuvira/sdk/testing
|
|
40
|
+
*/
|
|
41
|
+
import type { AgentContext, AgentResult, Artifact, FileChange, InferenceOptions, LLMCallFn, TaskStep, TaskStatus, AgentMessage } from './types.js';
|
|
42
|
+
import type { Agent } from './agent.js';
|
|
43
|
+
/** Options for building a mock context via {@link createMockContext} */
|
|
44
|
+
export interface MockContextOptions {
|
|
45
|
+
/** The user goal / task description (default: "Test goal") */
|
|
46
|
+
goal?: string;
|
|
47
|
+
/** Working directory (default: process.cwd()) */
|
|
48
|
+
workingDirectory?: string;
|
|
49
|
+
/** Pre-populated task plan (default: empty) */
|
|
50
|
+
taskPlan?: TaskStep[];
|
|
51
|
+
/** Pre-populated file artifacts (default: empty) */
|
|
52
|
+
artifacts?: Artifact[];
|
|
53
|
+
/** Pre-populated file changes (default: empty) */
|
|
54
|
+
fileChanges?: FileChange[];
|
|
55
|
+
/** Pre-populated agent messages (default: empty) */
|
|
56
|
+
conversations?: AgentMessage[];
|
|
57
|
+
/** Additional metadata key-value pairs (default: {}) */
|
|
58
|
+
metadata?: Record<string, unknown>;
|
|
59
|
+
/** Whether to set up an onRateLimit callback (default: undefined — not set) */
|
|
60
|
+
onRateLimit?: boolean;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Create a fully typed mock {@link AgentContext} for testing agents.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* const ctx = createMockContext({
|
|
68
|
+
* goal: 'Add error handling to server.ts',
|
|
69
|
+
* artifacts: [{ path: 'server.ts', content: '...', description: 'Main server' }],
|
|
70
|
+
* });
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function createMockContext(options?: MockContextOptions): AgentContext;
|
|
74
|
+
/** Options for {@link createMockLLM} */
|
|
75
|
+
export interface MockLLMOptions {
|
|
76
|
+
/**
|
|
77
|
+
* If true, the mock will track all prompts received.
|
|
78
|
+
* Access them via the returned array's `.prompts` property.
|
|
79
|
+
* @default true
|
|
80
|
+
*/
|
|
81
|
+
trackPrompts?: boolean;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Create a mock LLM function that returns a fixed response.
|
|
85
|
+
* Useful for testing agent logic without making real API calls.
|
|
86
|
+
*
|
|
87
|
+
* Also provides a `prompts` array on the returned function that records all
|
|
88
|
+
* prompts sent to it (when `trackPrompts` is enabled).
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```ts
|
|
92
|
+
* const callLLM = createMockLLM('Some LLM response');
|
|
93
|
+
* const result = await callLLM('Some prompt');
|
|
94
|
+
* // result === 'Some LLM response'
|
|
95
|
+
* // callLLM.prompts[0] === { prompt: 'Some prompt', options: undefined }
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export declare function createMockLLM(response?: string, options?: MockLLMOptions): LLMCallFn & {
|
|
99
|
+
prompts: Array<{
|
|
100
|
+
prompt: string;
|
|
101
|
+
options?: InferenceOptions;
|
|
102
|
+
}>;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Create a mock LLM function that throws an error.
|
|
106
|
+
* Useful for testing error handling in agents.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* const callLLM = createFailingMockLLM(new Error('API rate limit'));
|
|
111
|
+
* await expect(agent.execute(ctx, callLLM)).resolves.toMatchObject({ success: false });
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export declare function createFailingMockLLM(error?: Error): LLMCallFn;
|
|
115
|
+
/**
|
|
116
|
+
* Create a mock LLM function that returns different responses in sequence.
|
|
117
|
+
* Useful for testing agents that need multiple LLM calls.
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```ts
|
|
121
|
+
* const callLLM = createSequentialMockLLM(['First response', 'Second response']);
|
|
122
|
+
* const r1 = await callLLM('prompt 1'); // 'First response'
|
|
123
|
+
* const r2 = await callLLM('prompt 2'); // 'Second response'
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
export declare function createSequentialMockLLM(responses: string[]): LLMCallFn;
|
|
127
|
+
/**
|
|
128
|
+
* Execute an agent in a test context and return the result.
|
|
129
|
+
* Automatically calls `validate()` before execution and `cleanup()` after.
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```ts
|
|
133
|
+
* const result = await runAgentTest(new MyAgent(), context, callLLM);
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
export declare function runAgentTest(agent: Agent, context: AgentContext, callLLM?: LLMCallFn): Promise<AgentResult>;
|
|
137
|
+
/**
|
|
138
|
+
* Assert that an agent result indicates success.
|
|
139
|
+
* Throws a descriptive error if the result is falsy or has `success: false`.
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```ts
|
|
143
|
+
* assertAgentSuccess(result);
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
export declare function assertAgentSuccess(result: AgentResult): asserts result is AgentResult & {
|
|
147
|
+
success: true;
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Assert that an agent result indicates failure with an optional error match.
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```ts
|
|
154
|
+
* assertAgentFailure(result, 'rate limit');
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
export declare function assertAgentFailure(result: AgentResult, expectedErrorSubstring?: string): asserts result is AgentResult & {
|
|
158
|
+
success: false;
|
|
159
|
+
};
|
|
160
|
+
/**
|
|
161
|
+
* Add a file artifact to a context for testing.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```ts
|
|
165
|
+
* addArtifact(ctx, 'src/index.ts', 'console.log("hello")', 'Entry point');
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
export declare function addArtifact(context: AgentContext, path: string, content: string, description: string): void;
|
|
169
|
+
/**
|
|
170
|
+
* Add a task step to a context's task plan.
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```ts
|
|
174
|
+
* addTaskStep(ctx, 'step-1', 'writer', 'Write the main file', []);
|
|
175
|
+
* ```
|
|
176
|
+
*/
|
|
177
|
+
export declare function addTaskStep(context: AgentContext, id: string, agentType: string, description: string, dependsOn?: string[], status?: TaskStatus): void;
|
|
178
|
+
/**
|
|
179
|
+
* Add a file change to a context.
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```ts
|
|
183
|
+
* addFileChange(ctx, 'src/index.ts', 'console.log("hello")', undefined, 'created');
|
|
184
|
+
* ```
|
|
185
|
+
*/
|
|
186
|
+
export declare function addFileChange(context: AgentContext, path: string, newContent: string, originalContent?: string, status?: FileChange['status']): void;
|
|
187
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../src/agent-sdk/src/testing.ts"],"names":[],"mappings":"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"}
|