@herdctl/core 5.4.3 → 5.6.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/dist/config/__tests__/schema.test.js +19 -0
- package/dist/config/__tests__/schema.test.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +10 -18
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +4 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/distribution/__tests__/agent-discovery.test.d.ts +7 -0
- package/dist/distribution/__tests__/agent-discovery.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/agent-discovery.test.js +443 -0
- package/dist/distribution/__tests__/agent-discovery.test.js.map +1 -0
- package/dist/distribution/__tests__/agent-info.test.d.ts +7 -0
- package/dist/distribution/__tests__/agent-info.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/agent-info.test.js +568 -0
- package/dist/distribution/__tests__/agent-info.test.js.map +1 -0
- package/dist/distribution/__tests__/agent-remover.test.d.ts +7 -0
- package/dist/distribution/__tests__/agent-remover.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/agent-remover.test.js +498 -0
- package/dist/distribution/__tests__/agent-remover.test.js.map +1 -0
- package/dist/distribution/__tests__/agent-repo-metadata.test.d.ts +5 -0
- package/dist/distribution/__tests__/agent-repo-metadata.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/agent-repo-metadata.test.js +500 -0
- package/dist/distribution/__tests__/agent-repo-metadata.test.js.map +1 -0
- package/dist/distribution/__tests__/env-scanner.test.d.ts +5 -0
- package/dist/distribution/__tests__/env-scanner.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/env-scanner.test.js +576 -0
- package/dist/distribution/__tests__/env-scanner.test.js.map +1 -0
- package/dist/distribution/__tests__/file-installer.test.d.ts +7 -0
- package/dist/distribution/__tests__/file-installer.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/file-installer.test.js +714 -0
- package/dist/distribution/__tests__/file-installer.test.js.map +1 -0
- package/dist/distribution/__tests__/fleet-config-updater.test.d.ts +7 -0
- package/dist/distribution/__tests__/fleet-config-updater.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/fleet-config-updater.test.js +531 -0
- package/dist/distribution/__tests__/fleet-config-updater.test.js.map +1 -0
- package/dist/distribution/__tests__/installation-metadata.test.d.ts +2 -0
- package/dist/distribution/__tests__/installation-metadata.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/installation-metadata.test.js +292 -0
- package/dist/distribution/__tests__/installation-metadata.test.js.map +1 -0
- package/dist/distribution/__tests__/integration.test.d.ts +10 -0
- package/dist/distribution/__tests__/integration.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/integration.test.js +522 -0
- package/dist/distribution/__tests__/integration.test.js.map +1 -0
- package/dist/distribution/__tests__/repository-fetcher.test.d.ts +5 -0
- package/dist/distribution/__tests__/repository-fetcher.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/repository-fetcher.test.js +386 -0
- package/dist/distribution/__tests__/repository-fetcher.test.js.map +1 -0
- package/dist/distribution/__tests__/repository-validator.test.d.ts +7 -0
- package/dist/distribution/__tests__/repository-validator.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/repository-validator.test.js +447 -0
- package/dist/distribution/__tests__/repository-validator.test.js.map +1 -0
- package/dist/distribution/__tests__/source-specifier.test.d.ts +5 -0
- package/dist/distribution/__tests__/source-specifier.test.d.ts.map +1 -0
- package/dist/distribution/__tests__/source-specifier.test.js +533 -0
- package/dist/distribution/__tests__/source-specifier.test.js.map +1 -0
- package/dist/distribution/agent-discovery.d.ts +81 -0
- package/dist/distribution/agent-discovery.d.ts.map +1 -0
- package/dist/distribution/agent-discovery.js +264 -0
- package/dist/distribution/agent-discovery.js.map +1 -0
- package/dist/distribution/agent-info.d.ts +86 -0
- package/dist/distribution/agent-info.d.ts.map +1 -0
- package/dist/distribution/agent-info.js +225 -0
- package/dist/distribution/agent-info.js.map +1 -0
- package/dist/distribution/agent-remover.d.ts +83 -0
- package/dist/distribution/agent-remover.d.ts.map +1 -0
- package/dist/distribution/agent-remover.js +222 -0
- package/dist/distribution/agent-remover.js.map +1 -0
- package/dist/distribution/agent-repo-metadata.d.ts +181 -0
- package/dist/distribution/agent-repo-metadata.d.ts.map +1 -0
- package/dist/distribution/agent-repo-metadata.js +143 -0
- package/dist/distribution/agent-repo-metadata.js.map +1 -0
- package/dist/distribution/env-scanner.d.ts +78 -0
- package/dist/distribution/env-scanner.d.ts.map +1 -0
- package/dist/distribution/env-scanner.js +144 -0
- package/dist/distribution/env-scanner.js.map +1 -0
- package/dist/distribution/file-installer.d.ts +80 -0
- package/dist/distribution/file-installer.d.ts.map +1 -0
- package/dist/distribution/file-installer.js +268 -0
- package/dist/distribution/file-installer.js.map +1 -0
- package/dist/distribution/fleet-config-updater.d.ts +96 -0
- package/dist/distribution/fleet-config-updater.d.ts.map +1 -0
- package/dist/distribution/fleet-config-updater.js +266 -0
- package/dist/distribution/fleet-config-updater.js.map +1 -0
- package/dist/distribution/index.d.ts +23 -0
- package/dist/distribution/index.d.ts.map +1 -0
- package/dist/distribution/index.js +42 -0
- package/dist/distribution/index.js.map +1 -0
- package/dist/distribution/installation-metadata.d.ts +191 -0
- package/dist/distribution/installation-metadata.d.ts.map +1 -0
- package/dist/distribution/installation-metadata.js +100 -0
- package/dist/distribution/installation-metadata.js.map +1 -0
- package/dist/distribution/repository-fetcher.d.ts +104 -0
- package/dist/distribution/repository-fetcher.d.ts.map +1 -0
- package/dist/distribution/repository-fetcher.js +246 -0
- package/dist/distribution/repository-fetcher.js.map +1 -0
- package/dist/distribution/repository-validator.d.ts +86 -0
- package/dist/distribution/repository-validator.d.ts.map +1 -0
- package/dist/distribution/repository-validator.js +296 -0
- package/dist/distribution/repository-validator.js.map +1 -0
- package/dist/distribution/source-specifier.d.ts +106 -0
- package/dist/distribution/source-specifier.d.ts.map +1 -0
- package/dist/distribution/source-specifier.js +247 -0
- package/dist/distribution/source-specifier.js.map +1 -0
- package/dist/fleet-manager/errors.d.ts +15 -0
- package/dist/fleet-manager/errors.d.ts.map +1 -1
- package/dist/fleet-manager/errors.js +16 -0
- package/dist/fleet-manager/errors.js.map +1 -1
- package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.js +32 -9
- package/dist/fleet-manager/fleet-manager.js.map +1 -1
- package/dist/hooks/types.d.ts +2 -3
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/runner/job-executor.js +10 -10
- package/dist/runner/job-executor.js.map +1 -1
- package/dist/runner/message-processor.d.ts.map +1 -1
- package/dist/runner/message-processor.js +7 -2
- package/dist/runner/message-processor.js.map +1 -1
- package/dist/runner/runtime/cli-runtime.d.ts +3 -2
- package/dist/runner/runtime/cli-runtime.d.ts.map +1 -1
- package/dist/runner/runtime/cli-session-path.d.ts +0 -20
- package/dist/runner/runtime/cli-session-path.d.ts.map +1 -1
- package/dist/runner/runtime/cli-session-path.js +1 -1
- package/dist/runner/runtime/cli-session-path.js.map +1 -1
- package/dist/runner/runtime/container-manager.js +1 -1
- package/dist/runner/runtime/container-manager.js.map +1 -1
- package/dist/runner/runtime/container-runner.d.ts.map +1 -1
- package/dist/runner/runtime/container-runner.js +5 -1
- package/dist/runner/runtime/container-runner.js.map +1 -1
- package/dist/runner/runtime/factory.d.ts +2 -1
- package/dist/runner/runtime/factory.d.ts.map +1 -1
- package/dist/runner/runtime/index.d.ts +4 -10
- package/dist/runner/runtime/index.d.ts.map +1 -1
- package/dist/runner/runtime/index.js +4 -13
- package/dist/runner/runtime/index.js.map +1 -1
- package/dist/scheduler/errors.d.ts +15 -0
- package/dist/scheduler/errors.d.ts.map +1 -1
- package/dist/state/schemas/session-info.d.ts +2 -1
- package/dist/state/schemas/session-info.d.ts.map +1 -1
- package/dist/state/schemas/session-info.js +1 -1
- package/dist/state/schemas/session-info.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration Tests for Agent Distribution System
|
|
3
|
+
*
|
|
4
|
+
* These tests exercise the complete installation pipeline: source parsing,
|
|
5
|
+
* file installation, fleet config updating, and env var scanning.
|
|
6
|
+
*
|
|
7
|
+
* Uses real filesystem operations with fixture data, no mocking.
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from "node:fs/promises";
|
|
10
|
+
import * as os from "node:os";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
13
|
+
// Config loader for end-to-end testing
|
|
14
|
+
import { loadConfig } from "../../config/loader.js";
|
|
15
|
+
// Distribution modules
|
|
16
|
+
import { scanEnvVariables } from "../env-scanner.js";
|
|
17
|
+
import { AGENT_ALREADY_EXISTS, AgentInstallError, installAgentFiles } from "../file-installer.js";
|
|
18
|
+
import { addAgentToFleetConfig, CONFIG_NOT_FOUND, FleetConfigError, } from "../fleet-config-updater.js";
|
|
19
|
+
import { fetchRepository } from "../repository-fetcher.js";
|
|
20
|
+
import { validateRepository } from "../repository-validator.js";
|
|
21
|
+
import { isLocalSource, parseSourceSpecifier } from "../source-specifier.js";
|
|
22
|
+
// =============================================================================
|
|
23
|
+
// Test Setup
|
|
24
|
+
// =============================================================================
|
|
25
|
+
const FIXTURE_DIR = path.resolve(__dirname, "fixtures", "sample-agent");
|
|
26
|
+
describe("Agent Distribution Integration", () => {
|
|
27
|
+
let tempDir;
|
|
28
|
+
const originalEnv = {};
|
|
29
|
+
beforeEach(async () => {
|
|
30
|
+
// Create a fresh temp directory for each test
|
|
31
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "herdctl-integration-"));
|
|
32
|
+
// Store original env values
|
|
33
|
+
originalEnv.WEBSITES = process.env.WEBSITES;
|
|
34
|
+
originalEnv.DISCORD_WEBHOOK_URL = process.env.DISCORD_WEBHOOK_URL;
|
|
35
|
+
originalEnv.DOCKER_ENABLED = process.env.DOCKER_ENABLED;
|
|
36
|
+
});
|
|
37
|
+
afterEach(async () => {
|
|
38
|
+
// Clean up temp directory
|
|
39
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
40
|
+
// Restore original env values
|
|
41
|
+
if (originalEnv.WEBSITES !== undefined) {
|
|
42
|
+
process.env.WEBSITES = originalEnv.WEBSITES;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
delete process.env.WEBSITES;
|
|
46
|
+
}
|
|
47
|
+
if (originalEnv.DISCORD_WEBHOOK_URL !== undefined) {
|
|
48
|
+
process.env.DISCORD_WEBHOOK_URL = originalEnv.DISCORD_WEBHOOK_URL;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
delete process.env.DISCORD_WEBHOOK_URL;
|
|
52
|
+
}
|
|
53
|
+
if (originalEnv.DOCKER_ENABLED !== undefined) {
|
|
54
|
+
process.env.DOCKER_ENABLED = originalEnv.DOCKER_ENABLED;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
delete process.env.DOCKER_ENABLED;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
// ===========================================================================
|
|
61
|
+
// Helper Functions
|
|
62
|
+
// ===========================================================================
|
|
63
|
+
/**
|
|
64
|
+
* Creates a minimal valid herdctl.yaml for testing
|
|
65
|
+
*/
|
|
66
|
+
async function createMinimalFleetConfig(dir) {
|
|
67
|
+
const configPath = path.join(dir, "herdctl.yaml");
|
|
68
|
+
const content = `version: 1
|
|
69
|
+
agents: []
|
|
70
|
+
`;
|
|
71
|
+
await fs.writeFile(configPath, content, "utf-8");
|
|
72
|
+
return configPath;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates a fleet config with the installed agent reference
|
|
76
|
+
*/
|
|
77
|
+
async function createFleetConfigWithAgent(dir, agentPath) {
|
|
78
|
+
const configPath = path.join(dir, "herdctl.yaml");
|
|
79
|
+
const content = `version: 1
|
|
80
|
+
agents:
|
|
81
|
+
- path: ${agentPath}
|
|
82
|
+
`;
|
|
83
|
+
await fs.writeFile(configPath, content, "utf-8");
|
|
84
|
+
return configPath;
|
|
85
|
+
}
|
|
86
|
+
// ===========================================================================
|
|
87
|
+
// Test 1: Full Installation Flow from Local Path
|
|
88
|
+
// ===========================================================================
|
|
89
|
+
describe("full installation flow from local path", () => {
|
|
90
|
+
it("completes the entire installation pipeline", async () => {
|
|
91
|
+
// 1. Create project root with minimal herdctl.yaml
|
|
92
|
+
const configPath = await createMinimalFleetConfig(tempDir);
|
|
93
|
+
// 2. Parse source specifier (local path to fixture)
|
|
94
|
+
const source = parseSourceSpecifier(FIXTURE_DIR);
|
|
95
|
+
expect(source.type).toBe("local");
|
|
96
|
+
expect(isLocalSource(source)).toBe(true);
|
|
97
|
+
// 3. Fetch repository (copies local to temp)
|
|
98
|
+
const fetchResult = await fetchRepository(source);
|
|
99
|
+
expect(fetchResult.path).toBeTruthy();
|
|
100
|
+
try {
|
|
101
|
+
// 4. Validate the repository
|
|
102
|
+
const validationResult = await validateRepository(fetchResult.path);
|
|
103
|
+
expect(validationResult.valid).toBe(true);
|
|
104
|
+
expect(validationResult.agentName).toBe("sample-agent");
|
|
105
|
+
expect(validationResult.errors).toHaveLength(0);
|
|
106
|
+
// 5. Install agent files
|
|
107
|
+
const installResult = await installAgentFiles({
|
|
108
|
+
sourceDir: fetchResult.path,
|
|
109
|
+
targetBaseDir: tempDir,
|
|
110
|
+
source: {
|
|
111
|
+
type: "local",
|
|
112
|
+
url: FIXTURE_DIR,
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
expect(installResult.agentName).toBe("sample-agent");
|
|
116
|
+
expect(installResult.installPath).toBe(path.join(tempDir, "agents", "sample-agent"));
|
|
117
|
+
// 6. Verify files were copied
|
|
118
|
+
const agentDir = installResult.installPath;
|
|
119
|
+
// Check agent.yaml exists
|
|
120
|
+
const agentYamlExists = await fs
|
|
121
|
+
.access(path.join(agentDir, "agent.yaml"))
|
|
122
|
+
.then(() => true)
|
|
123
|
+
.catch(() => false);
|
|
124
|
+
expect(agentYamlExists).toBe(true);
|
|
125
|
+
// Check CLAUDE.md exists
|
|
126
|
+
const claudeMdExists = await fs
|
|
127
|
+
.access(path.join(agentDir, "CLAUDE.md"))
|
|
128
|
+
.then(() => true)
|
|
129
|
+
.catch(() => false);
|
|
130
|
+
expect(claudeMdExists).toBe(true);
|
|
131
|
+
// Check herdctl.json exists
|
|
132
|
+
const herdctlJsonExists = await fs
|
|
133
|
+
.access(path.join(agentDir, "herdctl.json"))
|
|
134
|
+
.then(() => true)
|
|
135
|
+
.catch(() => false);
|
|
136
|
+
expect(herdctlJsonExists).toBe(true);
|
|
137
|
+
// Check knowledge/guide.md exists
|
|
138
|
+
const knowledgeExists = await fs
|
|
139
|
+
.access(path.join(agentDir, "knowledge", "guide.md"))
|
|
140
|
+
.then(() => true)
|
|
141
|
+
.catch(() => false);
|
|
142
|
+
expect(knowledgeExists).toBe(true);
|
|
143
|
+
// Check workspace/ directory was created
|
|
144
|
+
const workspaceExists = await fs
|
|
145
|
+
.access(path.join(agentDir, "workspace"))
|
|
146
|
+
.then(() => true)
|
|
147
|
+
.catch(() => false);
|
|
148
|
+
expect(workspaceExists).toBe(true);
|
|
149
|
+
// Check metadata.json was created
|
|
150
|
+
const metadataPath = path.join(agentDir, "metadata.json");
|
|
151
|
+
const metadataContent = await fs.readFile(metadataPath, "utf-8");
|
|
152
|
+
const metadata = JSON.parse(metadataContent);
|
|
153
|
+
expect(metadata.source.type).toBe("local");
|
|
154
|
+
expect(metadata.source.url).toBe(FIXTURE_DIR);
|
|
155
|
+
expect(metadata.installed_at).toBeTruthy();
|
|
156
|
+
expect(metadata.installed_by).toBeTruthy();
|
|
157
|
+
// 7. Update fleet config to add agent reference
|
|
158
|
+
const agentRelPath = "./agents/sample-agent/agent.yaml";
|
|
159
|
+
const updateResult = await addAgentToFleetConfig({
|
|
160
|
+
configPath,
|
|
161
|
+
agentPath: agentRelPath,
|
|
162
|
+
});
|
|
163
|
+
expect(updateResult.modified).toBe(true);
|
|
164
|
+
expect(updateResult.alreadyExists).toBe(false);
|
|
165
|
+
// Verify the herdctl.yaml was updated
|
|
166
|
+
const updatedConfig = await fs.readFile(configPath, "utf-8");
|
|
167
|
+
expect(updatedConfig).toContain(agentRelPath);
|
|
168
|
+
// 8. Scan env variables from installed agent.yaml
|
|
169
|
+
const installedAgentYaml = await fs.readFile(path.join(agentDir, "agent.yaml"), "utf-8");
|
|
170
|
+
const envScan = scanEnvVariables(installedAgentYaml);
|
|
171
|
+
// The fixture uses env vars in string contexts (the prompt field)
|
|
172
|
+
// but not in boolean fields (docker.enabled is a literal false)
|
|
173
|
+
expect(envScan.required).toHaveLength(2);
|
|
174
|
+
expect(envScan.required.map((v) => v.name).sort()).toEqual([
|
|
175
|
+
"DISCORD_WEBHOOK_URL",
|
|
176
|
+
"WEBSITES",
|
|
177
|
+
]);
|
|
178
|
+
// No optional env vars in this fixture (docker.enabled is a literal boolean)
|
|
179
|
+
expect(envScan.optional).toHaveLength(0);
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
await fetchResult.cleanup();
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
// ===========================================================================
|
|
187
|
+
// Test 2: Installed Agent is Loadable by loadConfig()
|
|
188
|
+
// ===========================================================================
|
|
189
|
+
describe("installed agent is loadable by loadConfig()", () => {
|
|
190
|
+
it("loads the installed agent configuration successfully", async () => {
|
|
191
|
+
// Set required env vars for interpolation
|
|
192
|
+
process.env.WEBSITES = "https://example.com";
|
|
193
|
+
process.env.DISCORD_WEBHOOK_URL = "https://discord.com/webhook/test";
|
|
194
|
+
// 1. Fetch and install the agent
|
|
195
|
+
const fetchResult = await fetchRepository({
|
|
196
|
+
type: "local",
|
|
197
|
+
path: FIXTURE_DIR,
|
|
198
|
+
});
|
|
199
|
+
try {
|
|
200
|
+
const installResult = await installAgentFiles({
|
|
201
|
+
sourceDir: fetchResult.path,
|
|
202
|
+
targetBaseDir: tempDir,
|
|
203
|
+
source: {
|
|
204
|
+
type: "local",
|
|
205
|
+
url: FIXTURE_DIR,
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
// 2. Create herdctl.yaml that references the installed agent
|
|
209
|
+
const agentRelPath = "./agents/sample-agent/agent.yaml";
|
|
210
|
+
await createFleetConfigWithAgent(tempDir, agentRelPath);
|
|
211
|
+
// 3. Load the config using the standard loader
|
|
212
|
+
const configPath = path.join(tempDir, "herdctl.yaml");
|
|
213
|
+
const config = await loadConfig(configPath, {
|
|
214
|
+
envFile: false, // Don't auto-load .env
|
|
215
|
+
});
|
|
216
|
+
// 4. Verify the config loaded correctly
|
|
217
|
+
expect(config.agents).toHaveLength(1);
|
|
218
|
+
const agent = config.agents[0];
|
|
219
|
+
expect(agent.name).toBe("sample-agent");
|
|
220
|
+
expect(agent.runtime).toBe("cli");
|
|
221
|
+
expect(agent.permission_mode).toBe("default");
|
|
222
|
+
// Verify interpolation worked in the prompt string
|
|
223
|
+
expect(agent.schedules?.heartbeat?.prompt).toContain("https://example.com");
|
|
224
|
+
expect(agent.schedules?.heartbeat?.prompt).toContain("https://discord.com/webhook/test");
|
|
225
|
+
// Docker.enabled is a literal false in the fixture (not an env var)
|
|
226
|
+
expect(agent.docker?.enabled).toBe(false);
|
|
227
|
+
// Verify qualified name (root-level agent)
|
|
228
|
+
expect(agent.qualifiedName).toBe("sample-agent");
|
|
229
|
+
expect(agent.fleetPath).toEqual([]);
|
|
230
|
+
// Verify configPath is set
|
|
231
|
+
expect(agent.configPath).toBe(path.join(installResult.installPath, "agent.yaml"));
|
|
232
|
+
}
|
|
233
|
+
finally {
|
|
234
|
+
await fetchResult.cleanup();
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
// ===========================================================================
|
|
239
|
+
// Test 3: Installation Rejects Existing Agent Directory
|
|
240
|
+
// ===========================================================================
|
|
241
|
+
describe("installation rejects existing agent directory", () => {
|
|
242
|
+
it("throws AGENT_ALREADY_EXISTS when agent directory exists", async () => {
|
|
243
|
+
// 1. Install once
|
|
244
|
+
const fetchResult = await fetchRepository({
|
|
245
|
+
type: "local",
|
|
246
|
+
path: FIXTURE_DIR,
|
|
247
|
+
});
|
|
248
|
+
try {
|
|
249
|
+
await installAgentFiles({
|
|
250
|
+
sourceDir: fetchResult.path,
|
|
251
|
+
targetBaseDir: tempDir,
|
|
252
|
+
source: {
|
|
253
|
+
type: "local",
|
|
254
|
+
url: FIXTURE_DIR,
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
// 2. Try to install again without force
|
|
258
|
+
await expect(installAgentFiles({
|
|
259
|
+
sourceDir: fetchResult.path,
|
|
260
|
+
targetBaseDir: tempDir,
|
|
261
|
+
source: {
|
|
262
|
+
type: "local",
|
|
263
|
+
url: FIXTURE_DIR,
|
|
264
|
+
},
|
|
265
|
+
force: false, // Explicitly false
|
|
266
|
+
})).rejects.toThrow(AgentInstallError);
|
|
267
|
+
// 3. Verify error code
|
|
268
|
+
try {
|
|
269
|
+
await installAgentFiles({
|
|
270
|
+
sourceDir: fetchResult.path,
|
|
271
|
+
targetBaseDir: tempDir,
|
|
272
|
+
source: {
|
|
273
|
+
type: "local",
|
|
274
|
+
url: FIXTURE_DIR,
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
catch (err) {
|
|
279
|
+
expect(err).toBeInstanceOf(AgentInstallError);
|
|
280
|
+
expect(err.code).toBe(AGENT_ALREADY_EXISTS);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
finally {
|
|
284
|
+
await fetchResult.cleanup();
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
// ===========================================================================
|
|
289
|
+
// Test 4: Installation with --force Overwrites
|
|
290
|
+
// ===========================================================================
|
|
291
|
+
describe("installation with force overwrites", () => {
|
|
292
|
+
it("successfully reinstalls when force is true", async () => {
|
|
293
|
+
// 1. Install once
|
|
294
|
+
const fetchResult1 = await fetchRepository({
|
|
295
|
+
type: "local",
|
|
296
|
+
path: FIXTURE_DIR,
|
|
297
|
+
});
|
|
298
|
+
let firstMetadataTime;
|
|
299
|
+
try {
|
|
300
|
+
const firstInstall = await installAgentFiles({
|
|
301
|
+
sourceDir: fetchResult1.path,
|
|
302
|
+
targetBaseDir: tempDir,
|
|
303
|
+
source: {
|
|
304
|
+
type: "local",
|
|
305
|
+
url: FIXTURE_DIR,
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
// Record the first installation time
|
|
309
|
+
const firstMetadata = JSON.parse(await fs.readFile(path.join(firstInstall.installPath, "metadata.json"), "utf-8"));
|
|
310
|
+
firstMetadataTime = firstMetadata.installed_at;
|
|
311
|
+
}
|
|
312
|
+
finally {
|
|
313
|
+
await fetchResult1.cleanup();
|
|
314
|
+
}
|
|
315
|
+
// Small delay to ensure different timestamps
|
|
316
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
317
|
+
// 2. Install again with force
|
|
318
|
+
const fetchResult2 = await fetchRepository({
|
|
319
|
+
type: "local",
|
|
320
|
+
path: FIXTURE_DIR,
|
|
321
|
+
});
|
|
322
|
+
try {
|
|
323
|
+
const secondInstall = await installAgentFiles({
|
|
324
|
+
sourceDir: fetchResult2.path,
|
|
325
|
+
targetBaseDir: tempDir,
|
|
326
|
+
source: {
|
|
327
|
+
type: "local",
|
|
328
|
+
url: FIXTURE_DIR,
|
|
329
|
+
},
|
|
330
|
+
force: true,
|
|
331
|
+
});
|
|
332
|
+
// 3. Verify installation succeeded
|
|
333
|
+
expect(secondInstall.agentName).toBe("sample-agent");
|
|
334
|
+
// 4. Verify metadata was updated
|
|
335
|
+
const secondMetadata = JSON.parse(await fs.readFile(path.join(secondInstall.installPath, "metadata.json"), "utf-8"));
|
|
336
|
+
expect(secondMetadata.installed_at).not.toBe(firstMetadataTime);
|
|
337
|
+
}
|
|
338
|
+
finally {
|
|
339
|
+
await fetchResult2.cleanup();
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
});
|
|
343
|
+
// ===========================================================================
|
|
344
|
+
// Test 5: Validation Stops Installation on Errors
|
|
345
|
+
// ===========================================================================
|
|
346
|
+
describe("validation stops installation on errors", () => {
|
|
347
|
+
it("validateRepository returns errors for invalid repo", async () => {
|
|
348
|
+
// Create a temp directory with no agent.yaml
|
|
349
|
+
const invalidRepoDir = path.join(tempDir, "invalid-repo");
|
|
350
|
+
await fs.mkdir(invalidRepoDir, { recursive: true });
|
|
351
|
+
await fs.writeFile(path.join(invalidRepoDir, "README.md"), "# Invalid Agent\n\nNo agent.yaml here!");
|
|
352
|
+
// Validation should return errors
|
|
353
|
+
const validationResult = await validateRepository(invalidRepoDir);
|
|
354
|
+
expect(validationResult.valid).toBe(false);
|
|
355
|
+
expect(validationResult.errors.length).toBeGreaterThan(0);
|
|
356
|
+
expect(validationResult.errors.some((e) => e.code === "MISSING_AGENT_YAML")).toBe(true);
|
|
357
|
+
});
|
|
358
|
+
it("installAgentFiles errors on missing agent.yaml", async () => {
|
|
359
|
+
// Create a temp directory with no agent.yaml
|
|
360
|
+
const invalidRepoDir = path.join(tempDir, "invalid-repo");
|
|
361
|
+
await fs.mkdir(invalidRepoDir, { recursive: true });
|
|
362
|
+
await fs.writeFile(path.join(invalidRepoDir, "README.md"), "# Invalid Agent\n\nNo agent.yaml here!");
|
|
363
|
+
// Install should fail
|
|
364
|
+
await expect(installAgentFiles({
|
|
365
|
+
sourceDir: invalidRepoDir,
|
|
366
|
+
targetBaseDir: tempDir,
|
|
367
|
+
source: {
|
|
368
|
+
type: "local",
|
|
369
|
+
url: invalidRepoDir,
|
|
370
|
+
},
|
|
371
|
+
})).rejects.toThrow(AgentInstallError);
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
// ===========================================================================
|
|
375
|
+
// Test 6: Fleet Config Already Has Agent Reference
|
|
376
|
+
// ===========================================================================
|
|
377
|
+
describe("fleet config already has the agent reference", () => {
|
|
378
|
+
it("returns alreadyExists: true when adding duplicate reference", async () => {
|
|
379
|
+
// 1. Create fleet config with agent already referenced
|
|
380
|
+
const agentRelPath = "./agents/sample-agent/agent.yaml";
|
|
381
|
+
const configPath = await createFleetConfigWithAgent(tempDir, agentRelPath);
|
|
382
|
+
// 2. Try to add the same agent reference
|
|
383
|
+
const result = await addAgentToFleetConfig({
|
|
384
|
+
configPath,
|
|
385
|
+
agentPath: agentRelPath,
|
|
386
|
+
});
|
|
387
|
+
// 3. Verify it was not modified
|
|
388
|
+
expect(result.modified).toBe(false);
|
|
389
|
+
expect(result.alreadyExists).toBe(true);
|
|
390
|
+
expect(result.agentPath).toBe(agentRelPath);
|
|
391
|
+
});
|
|
392
|
+
it("does not duplicate agent reference on second add", async () => {
|
|
393
|
+
// 1. Create minimal config
|
|
394
|
+
const configPath = await createMinimalFleetConfig(tempDir);
|
|
395
|
+
// 2. Add agent reference
|
|
396
|
+
const agentRelPath = "./agents/sample-agent/agent.yaml";
|
|
397
|
+
await addAgentToFleetConfig({
|
|
398
|
+
configPath,
|
|
399
|
+
agentPath: agentRelPath,
|
|
400
|
+
});
|
|
401
|
+
// 3. Try to add again
|
|
402
|
+
const result = await addAgentToFleetConfig({
|
|
403
|
+
configPath,
|
|
404
|
+
agentPath: agentRelPath,
|
|
405
|
+
});
|
|
406
|
+
expect(result.modified).toBe(false);
|
|
407
|
+
expect(result.alreadyExists).toBe(true);
|
|
408
|
+
// 4. Verify config only has one reference
|
|
409
|
+
const configContent = await fs.readFile(configPath, "utf-8");
|
|
410
|
+
const matches = configContent.match(/sample-agent/g);
|
|
411
|
+
expect(matches).toHaveLength(1);
|
|
412
|
+
});
|
|
413
|
+
});
|
|
414
|
+
// ===========================================================================
|
|
415
|
+
// Test 7: Env Var Scanner Finds All Variables
|
|
416
|
+
// ===========================================================================
|
|
417
|
+
describe("env var scanner finds all variables", () => {
|
|
418
|
+
it("correctly partitions required and optional variables", async () => {
|
|
419
|
+
// Read the fixture agent.yaml
|
|
420
|
+
const agentYaml = await fs.readFile(path.join(FIXTURE_DIR, "agent.yaml"), "utf-8");
|
|
421
|
+
const result = scanEnvVariables(agentYaml);
|
|
422
|
+
// The fixture has 2 env vars in the prompt string (WEBSITES and DISCORD_WEBHOOK_URL)
|
|
423
|
+
// docker.enabled is a literal boolean (not an env var reference)
|
|
424
|
+
expect(result.variables).toHaveLength(2);
|
|
425
|
+
// Check required variables (no default)
|
|
426
|
+
expect(result.required).toHaveLength(2);
|
|
427
|
+
const requiredNames = result.required.map((v) => v.name).sort();
|
|
428
|
+
expect(requiredNames).toEqual(["DISCORD_WEBHOOK_URL", "WEBSITES"]);
|
|
429
|
+
// Verify required vars have no default
|
|
430
|
+
for (const reqVar of result.required) {
|
|
431
|
+
expect(reqVar.defaultValue).toBeUndefined();
|
|
432
|
+
}
|
|
433
|
+
// No optional variables in this fixture
|
|
434
|
+
// (docker.enabled is a literal false, not ${DOCKER_ENABLED:-false})
|
|
435
|
+
expect(result.optional).toHaveLength(0);
|
|
436
|
+
});
|
|
437
|
+
it("handles YAML content with no env vars", () => {
|
|
438
|
+
const yamlContent = `
|
|
439
|
+
name: simple-agent
|
|
440
|
+
runtime: cli
|
|
441
|
+
description: No environment variables here
|
|
442
|
+
`;
|
|
443
|
+
const result = scanEnvVariables(yamlContent);
|
|
444
|
+
expect(result.variables).toHaveLength(0);
|
|
445
|
+
expect(result.required).toHaveLength(0);
|
|
446
|
+
expect(result.optional).toHaveLength(0);
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
// ===========================================================================
|
|
450
|
+
// Additional Integration Tests
|
|
451
|
+
// ===========================================================================
|
|
452
|
+
describe("end-to-end error handling", () => {
|
|
453
|
+
it("addAgentToFleetConfig throws when config file is missing", async () => {
|
|
454
|
+
const nonExistentConfig = path.join(tempDir, "non-existent.yaml");
|
|
455
|
+
await expect(addAgentToFleetConfig({
|
|
456
|
+
configPath: nonExistentConfig,
|
|
457
|
+
agentPath: "./agents/test/agent.yaml",
|
|
458
|
+
})).rejects.toThrow(FleetConfigError);
|
|
459
|
+
try {
|
|
460
|
+
await addAgentToFleetConfig({
|
|
461
|
+
configPath: nonExistentConfig,
|
|
462
|
+
agentPath: "./agents/test/agent.yaml",
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
catch (err) {
|
|
466
|
+
expect(err).toBeInstanceOf(FleetConfigError);
|
|
467
|
+
expect(err.code).toBe(CONFIG_NOT_FOUND);
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
it("validates and installs in correct order", async () => {
|
|
471
|
+
// This test verifies the expected workflow: validate THEN install
|
|
472
|
+
const fetchResult = await fetchRepository({
|
|
473
|
+
type: "local",
|
|
474
|
+
path: FIXTURE_DIR,
|
|
475
|
+
});
|
|
476
|
+
try {
|
|
477
|
+
// Step 1: Validate
|
|
478
|
+
const validation = await validateRepository(fetchResult.path);
|
|
479
|
+
expect(validation.valid).toBe(true);
|
|
480
|
+
// Only proceed if validation passes
|
|
481
|
+
if (!validation.valid) {
|
|
482
|
+
throw new Error("Validation failed unexpectedly");
|
|
483
|
+
}
|
|
484
|
+
// Step 2: Install
|
|
485
|
+
const install = await installAgentFiles({
|
|
486
|
+
sourceDir: fetchResult.path,
|
|
487
|
+
targetBaseDir: tempDir,
|
|
488
|
+
source: {
|
|
489
|
+
type: "local",
|
|
490
|
+
url: FIXTURE_DIR,
|
|
491
|
+
},
|
|
492
|
+
});
|
|
493
|
+
// Step 3: Verify the agent name matches
|
|
494
|
+
expect(install.agentName).toBe(validation.agentName);
|
|
495
|
+
}
|
|
496
|
+
finally {
|
|
497
|
+
await fetchResult.cleanup();
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
});
|
|
501
|
+
describe("repository fetcher integration", () => {
|
|
502
|
+
it("local source fetch copies all files correctly", async () => {
|
|
503
|
+
const source = parseSourceSpecifier(FIXTURE_DIR);
|
|
504
|
+
expect(isLocalSource(source)).toBe(true);
|
|
505
|
+
const fetchResult = await fetchRepository(source);
|
|
506
|
+
try {
|
|
507
|
+
// Verify the temp directory contains the expected files
|
|
508
|
+
const files = await fs.readdir(fetchResult.path, { recursive: true });
|
|
509
|
+
// Should have agent.yaml, CLAUDE.md, herdctl.json, knowledge/guide.md
|
|
510
|
+
expect(files).toContain("agent.yaml");
|
|
511
|
+
expect(files).toContain("CLAUDE.md");
|
|
512
|
+
expect(files).toContain("herdctl.json");
|
|
513
|
+
// Note: readdir with recursive returns relative paths with path separators
|
|
514
|
+
expect(files.some((f) => f.includes("guide.md"))).toBe(true);
|
|
515
|
+
}
|
|
516
|
+
finally {
|
|
517
|
+
await fetchResult.cleanup();
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
});
|
|
521
|
+
});
|
|
522
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../../src/distribution/__tests__/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-fetcher.test.d.ts","sourceRoot":"","sources":["../../../src/distribution/__tests__/repository-fetcher.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|