@herdctl/core 5.5.0 → 5.7.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__/merge.test.js +1 -1
- package/dist/config/__tests__/merge.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 -2
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +6 -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 +31 -9
- package/dist/fleet-manager/fleet-manager.js.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/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/container-manager.js +1 -1
- package/dist/runner/runtime/container-manager.js.map +1 -1
- package/dist/scheduler/errors.d.ts +15 -0
- package/dist/scheduler/errors.d.ts.map +1 -1
- package/dist/scheduler/schedule-runner.d.ts.map +1 -1
- package/dist/scheduler/schedule-runner.js +6 -5
- package/dist/scheduler/schedule-runner.js.map +1 -1
- package/dist/state/__tests__/jsonl-parser.test.d.ts +5 -0
- package/dist/state/__tests__/jsonl-parser.test.d.ts.map +1 -0
- package/dist/state/__tests__/jsonl-parser.test.js +307 -0
- package/dist/state/__tests__/jsonl-parser.test.js.map +1 -0
- package/dist/state/__tests__/session-attribution.test.d.ts +2 -0
- package/dist/state/__tests__/session-attribution.test.d.ts.map +1 -0
- package/dist/state/__tests__/session-attribution.test.js +567 -0
- package/dist/state/__tests__/session-attribution.test.js.map +1 -0
- package/dist/state/__tests__/session-discovery.test.d.ts +2 -0
- package/dist/state/__tests__/session-discovery.test.d.ts.map +1 -0
- package/dist/state/__tests__/session-discovery.test.js +941 -0
- package/dist/state/__tests__/session-discovery.test.js.map +1 -0
- package/dist/state/__tests__/session-metadata.test.d.ts +2 -0
- package/dist/state/__tests__/session-metadata.test.d.ts.map +1 -0
- package/dist/state/__tests__/session-metadata.test.js +422 -0
- package/dist/state/__tests__/session-metadata.test.js.map +1 -0
- package/dist/state/__tests__/tool-parsing.test.d.ts +5 -0
- package/dist/state/__tests__/tool-parsing.test.d.ts.map +1 -0
- package/dist/state/__tests__/tool-parsing.test.js +315 -0
- package/dist/state/__tests__/tool-parsing.test.js.map +1 -0
- package/dist/state/index.d.ts +5 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +10 -0
- package/dist/state/index.js.map +1 -1
- package/dist/state/jsonl-parser.d.ts +115 -0
- package/dist/state/jsonl-parser.d.ts.map +1 -0
- package/dist/state/jsonl-parser.js +437 -0
- package/dist/state/jsonl-parser.js.map +1 -0
- package/dist/state/session-attribution.d.ts +35 -0
- package/dist/state/session-attribution.d.ts.map +1 -0
- package/dist/state/session-attribution.js +179 -0
- package/dist/state/session-attribution.js.map +1 -0
- package/dist/state/session-discovery.d.ts +188 -0
- package/dist/state/session-discovery.d.ts.map +1 -0
- package/dist/state/session-discovery.js +513 -0
- package/dist/state/session-discovery.js.map +1 -0
- package/dist/state/session-metadata.d.ts +186 -0
- package/dist/state/session-metadata.d.ts.map +1 -0
- package/dist/state/session-metadata.js +297 -0
- package/dist/state/session-metadata.js.map +1 -0
- package/dist/state/tool-parsing.d.ts +88 -0
- package/dist/state/tool-parsing.d.ts.map +1 -0
- package/dist/state/tool-parsing.js +199 -0
- package/dist/state/tool-parsing.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for agent remover
|
|
3
|
+
*
|
|
4
|
+
* Uses real file I/O with temporary directories to test removal logic.
|
|
5
|
+
*/
|
|
6
|
+
import { mkdir, mkdtemp, readdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
7
|
+
import { tmpdir } from "node:os";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
10
|
+
import { AGENT_NOT_FOUND, AgentRemoveError, removeAgent } from "../agent-remover.js";
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// Test Setup
|
|
13
|
+
// =============================================================================
|
|
14
|
+
describe("removeAgent", () => {
|
|
15
|
+
let tempDir;
|
|
16
|
+
beforeEach(async () => {
|
|
17
|
+
// Create fresh temp directory for each test
|
|
18
|
+
tempDir = await mkdtemp(join(tmpdir(), "herdctl-remover-"));
|
|
19
|
+
});
|
|
20
|
+
afterEach(async () => {
|
|
21
|
+
// Clean up temp directory
|
|
22
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
23
|
+
});
|
|
24
|
+
// ===========================================================================
|
|
25
|
+
// Helper Functions
|
|
26
|
+
// ===========================================================================
|
|
27
|
+
/**
|
|
28
|
+
* Create a minimal herdctl.yaml fleet config
|
|
29
|
+
*/
|
|
30
|
+
async function createFleetConfig(agentPaths = [], options = {}) {
|
|
31
|
+
const { name = "test-fleet" } = options;
|
|
32
|
+
const agentsYaml = agentPaths.length > 0 ? agentPaths.map((p) => ` - path: ${p}`).join("\n") : "";
|
|
33
|
+
const content = `version: 1
|
|
34
|
+
|
|
35
|
+
fleet:
|
|
36
|
+
name: ${name}
|
|
37
|
+
|
|
38
|
+
agents:
|
|
39
|
+
${agentsYaml}
|
|
40
|
+
`;
|
|
41
|
+
const configPath = join(tempDir, "herdctl.yaml");
|
|
42
|
+
await writeFile(configPath, content, "utf-8");
|
|
43
|
+
return configPath;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Read the fleet config and return its content
|
|
47
|
+
*/
|
|
48
|
+
async function readFleetConfig(configPath) {
|
|
49
|
+
return await readFile(configPath, "utf-8");
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create an agent directory with agent.yaml
|
|
53
|
+
*/
|
|
54
|
+
async function createAgent(name, options = {}) {
|
|
55
|
+
const agentDir = join(tempDir, "agents", name);
|
|
56
|
+
await mkdir(agentDir, { recursive: true });
|
|
57
|
+
// Build agent.yaml content with optional env vars
|
|
58
|
+
let agentYaml = `name: ${name}
|
|
59
|
+
permission_mode: default
|
|
60
|
+
runtime: sdk
|
|
61
|
+
`;
|
|
62
|
+
if (options.description) {
|
|
63
|
+
agentYaml += `description: "${options.description}"\n`;
|
|
64
|
+
}
|
|
65
|
+
// Add env vars to agent.yaml if requested
|
|
66
|
+
if (options.envVars && options.envVars.length > 0) {
|
|
67
|
+
agentYaml += `env:\n`;
|
|
68
|
+
for (const envVar of options.envVars) {
|
|
69
|
+
if (envVar.defaultValue !== undefined) {
|
|
70
|
+
agentYaml += ` ${envVar.name.toLowerCase()}: \${${envVar.name}:-${envVar.defaultValue}}\n`;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
agentYaml += ` ${envVar.name.toLowerCase()}: \${${envVar.name}}\n`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
await writeFile(join(agentDir, "agent.yaml"), agentYaml, "utf-8");
|
|
78
|
+
// Create CLAUDE.md
|
|
79
|
+
await writeFile(join(agentDir, "CLAUDE.md"), "# Agent Instructions\n", "utf-8");
|
|
80
|
+
// Create metadata.json if requested
|
|
81
|
+
if (options.withMetadata) {
|
|
82
|
+
const metadata = {
|
|
83
|
+
source: {
|
|
84
|
+
type: "github",
|
|
85
|
+
url: "https://github.com/user/repo",
|
|
86
|
+
ref: "v1.0.0",
|
|
87
|
+
version: options.metadata?.source?.version ?? "1.0.0",
|
|
88
|
+
...options.metadata?.source,
|
|
89
|
+
},
|
|
90
|
+
installed_at: options.metadata?.installed_at ?? new Date().toISOString(),
|
|
91
|
+
installed_by: options.metadata?.installed_by ?? "herdctl@0.5.0",
|
|
92
|
+
...options.metadata,
|
|
93
|
+
};
|
|
94
|
+
await writeFile(join(agentDir, "metadata.json"), JSON.stringify(metadata, null, 2), "utf-8");
|
|
95
|
+
}
|
|
96
|
+
// Create workspace/ directory if requested
|
|
97
|
+
if (options.withWorkspace) {
|
|
98
|
+
const workspaceDir = join(agentDir, "workspace");
|
|
99
|
+
await mkdir(workspaceDir, { recursive: true });
|
|
100
|
+
// Add workspace files if specified
|
|
101
|
+
if (options.workspaceFiles && options.workspaceFiles.length > 0) {
|
|
102
|
+
for (const file of options.workspaceFiles) {
|
|
103
|
+
await writeFile(join(workspaceDir, file), `content of ${file}`, "utf-8");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Create extra files if requested
|
|
108
|
+
if (options.extraFiles && options.extraFiles.length > 0) {
|
|
109
|
+
for (const file of options.extraFiles) {
|
|
110
|
+
const filePath = join(agentDir, file);
|
|
111
|
+
const dir = filePath.substring(0, filePath.lastIndexOf("/"));
|
|
112
|
+
if (dir !== agentDir) {
|
|
113
|
+
await mkdir(dir, { recursive: true });
|
|
114
|
+
}
|
|
115
|
+
await writeFile(filePath, `content of ${file}`, "utf-8");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return agentDir;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if a path exists
|
|
122
|
+
*/
|
|
123
|
+
async function pathExists(filePath) {
|
|
124
|
+
try {
|
|
125
|
+
await readFile(filePath);
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
try {
|
|
130
|
+
await readdir(filePath);
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// ===========================================================================
|
|
139
|
+
// Successful Removal Tests
|
|
140
|
+
// ===========================================================================
|
|
141
|
+
describe("successful removal", () => {
|
|
142
|
+
it("removes installed agent and updates config", async () => {
|
|
143
|
+
const agentDir = await createAgent("my-agent", { withMetadata: true });
|
|
144
|
+
const configPath = await createFleetConfig(["./agents/my-agent/agent.yaml"]);
|
|
145
|
+
const result = await removeAgent({
|
|
146
|
+
name: "my-agent",
|
|
147
|
+
configPath,
|
|
148
|
+
});
|
|
149
|
+
// Check result
|
|
150
|
+
expect(result.agentName).toBe("my-agent");
|
|
151
|
+
expect(result.removedPath).toBe(agentDir);
|
|
152
|
+
expect(result.filesRemoved).toBe(true);
|
|
153
|
+
expect(result.configUpdated).toBe(true);
|
|
154
|
+
expect(result.workspacePreserved).toBe(false);
|
|
155
|
+
// Verify directory is gone
|
|
156
|
+
expect(await pathExists(agentDir)).toBe(false);
|
|
157
|
+
// Verify config is updated
|
|
158
|
+
const configContent = await readFleetConfig(configPath);
|
|
159
|
+
expect(configContent).not.toContain("my-agent");
|
|
160
|
+
});
|
|
161
|
+
it("removes manual agent without metadata", async () => {
|
|
162
|
+
const agentDir = await createAgent("manual-agent", { withMetadata: false });
|
|
163
|
+
const configPath = await createFleetConfig(["./agents/manual-agent/agent.yaml"]);
|
|
164
|
+
const result = await removeAgent({
|
|
165
|
+
name: "manual-agent",
|
|
166
|
+
configPath,
|
|
167
|
+
});
|
|
168
|
+
expect(result.agentName).toBe("manual-agent");
|
|
169
|
+
expect(result.filesRemoved).toBe(true);
|
|
170
|
+
expect(result.configUpdated).toBe(true);
|
|
171
|
+
expect(await pathExists(agentDir)).toBe(false);
|
|
172
|
+
});
|
|
173
|
+
it("removes agent with extra files and subdirectories", async () => {
|
|
174
|
+
const agentDir = await createAgent("complex-agent", {
|
|
175
|
+
withMetadata: true,
|
|
176
|
+
extraFiles: ["knowledge/guide.md", "knowledge/faq.md", "scripts/run.sh"],
|
|
177
|
+
});
|
|
178
|
+
const configPath = await createFleetConfig(["./agents/complex-agent/agent.yaml"]);
|
|
179
|
+
const result = await removeAgent({
|
|
180
|
+
name: "complex-agent",
|
|
181
|
+
configPath,
|
|
182
|
+
});
|
|
183
|
+
expect(result.filesRemoved).toBe(true);
|
|
184
|
+
expect(await pathExists(agentDir)).toBe(false);
|
|
185
|
+
expect(await pathExists(join(agentDir, "knowledge"))).toBe(false);
|
|
186
|
+
expect(await pathExists(join(agentDir, "scripts"))).toBe(false);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
// ===========================================================================
|
|
190
|
+
// Keep Workspace Tests
|
|
191
|
+
// ===========================================================================
|
|
192
|
+
describe("keep workspace option", () => {
|
|
193
|
+
it("preserves workspace directory when keepWorkspace is true", async () => {
|
|
194
|
+
const agentDir = await createAgent("workspace-agent", {
|
|
195
|
+
withMetadata: true,
|
|
196
|
+
withWorkspace: true,
|
|
197
|
+
workspaceFiles: ["output.txt", "data.json"],
|
|
198
|
+
});
|
|
199
|
+
const configPath = await createFleetConfig(["./agents/workspace-agent/agent.yaml"]);
|
|
200
|
+
const result = await removeAgent({
|
|
201
|
+
name: "workspace-agent",
|
|
202
|
+
configPath,
|
|
203
|
+
keepWorkspace: true,
|
|
204
|
+
});
|
|
205
|
+
expect(result.workspacePreserved).toBe(true);
|
|
206
|
+
expect(result.filesRemoved).toBe(true);
|
|
207
|
+
// Workspace should still exist
|
|
208
|
+
expect(await pathExists(join(agentDir, "workspace"))).toBe(true);
|
|
209
|
+
expect(await pathExists(join(agentDir, "workspace", "output.txt"))).toBe(true);
|
|
210
|
+
expect(await pathExists(join(agentDir, "workspace", "data.json"))).toBe(true);
|
|
211
|
+
// Other files should be gone
|
|
212
|
+
expect(await pathExists(join(agentDir, "agent.yaml"))).toBe(false);
|
|
213
|
+
expect(await pathExists(join(agentDir, "CLAUDE.md"))).toBe(false);
|
|
214
|
+
expect(await pathExists(join(agentDir, "metadata.json"))).toBe(false);
|
|
215
|
+
});
|
|
216
|
+
it("deletes everything including workspace when keepWorkspace is false", async () => {
|
|
217
|
+
const agentDir = await createAgent("full-delete-agent", {
|
|
218
|
+
withMetadata: true,
|
|
219
|
+
withWorkspace: true,
|
|
220
|
+
workspaceFiles: ["data.txt"],
|
|
221
|
+
});
|
|
222
|
+
const configPath = await createFleetConfig(["./agents/full-delete-agent/agent.yaml"]);
|
|
223
|
+
const result = await removeAgent({
|
|
224
|
+
name: "full-delete-agent",
|
|
225
|
+
configPath,
|
|
226
|
+
keepWorkspace: false,
|
|
227
|
+
});
|
|
228
|
+
expect(result.workspacePreserved).toBe(false);
|
|
229
|
+
expect(result.filesRemoved).toBe(true);
|
|
230
|
+
expect(await pathExists(agentDir)).toBe(false);
|
|
231
|
+
});
|
|
232
|
+
it("handles keepWorkspace when workspace does not exist", async () => {
|
|
233
|
+
const agentDir = await createAgent("no-workspace-agent", {
|
|
234
|
+
withMetadata: true,
|
|
235
|
+
withWorkspace: false,
|
|
236
|
+
});
|
|
237
|
+
const configPath = await createFleetConfig(["./agents/no-workspace-agent/agent.yaml"]);
|
|
238
|
+
const result = await removeAgent({
|
|
239
|
+
name: "no-workspace-agent",
|
|
240
|
+
configPath,
|
|
241
|
+
keepWorkspace: true,
|
|
242
|
+
});
|
|
243
|
+
// Should still work, just deletes everything
|
|
244
|
+
expect(result.filesRemoved).toBe(true);
|
|
245
|
+
expect(result.workspacePreserved).toBe(false);
|
|
246
|
+
expect(await pathExists(agentDir)).toBe(false);
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
// ===========================================================================
|
|
250
|
+
// Environment Variables Tests
|
|
251
|
+
// ===========================================================================
|
|
252
|
+
describe("environment variables", () => {
|
|
253
|
+
it("reports required env variables", async () => {
|
|
254
|
+
await createAgent("env-agent", {
|
|
255
|
+
withMetadata: true,
|
|
256
|
+
envVars: [{ name: "DISCORD_WEBHOOK_URL" }, { name: "WEBSITES" }],
|
|
257
|
+
});
|
|
258
|
+
const configPath = await createFleetConfig(["./agents/env-agent/agent.yaml"]);
|
|
259
|
+
const result = await removeAgent({
|
|
260
|
+
name: "env-agent",
|
|
261
|
+
configPath,
|
|
262
|
+
});
|
|
263
|
+
expect(result.envVariables).toBeDefined();
|
|
264
|
+
expect(result.envVariables.required.length).toBe(2);
|
|
265
|
+
expect(result.envVariables.required.map((v) => v.name)).toContain("DISCORD_WEBHOOK_URL");
|
|
266
|
+
expect(result.envVariables.required.map((v) => v.name)).toContain("WEBSITES");
|
|
267
|
+
});
|
|
268
|
+
it("reports optional env variables with defaults", async () => {
|
|
269
|
+
await createAgent("optional-env-agent", {
|
|
270
|
+
withMetadata: true,
|
|
271
|
+
envVars: [
|
|
272
|
+
{ name: "CRON_SCHEDULE", defaultValue: "*/5 * * * *" },
|
|
273
|
+
{ name: "TIMEOUT", defaultValue: "30" },
|
|
274
|
+
],
|
|
275
|
+
});
|
|
276
|
+
const configPath = await createFleetConfig(["./agents/optional-env-agent/agent.yaml"]);
|
|
277
|
+
const result = await removeAgent({
|
|
278
|
+
name: "optional-env-agent",
|
|
279
|
+
configPath,
|
|
280
|
+
});
|
|
281
|
+
expect(result.envVariables).toBeDefined();
|
|
282
|
+
expect(result.envVariables.optional.length).toBe(2);
|
|
283
|
+
expect(result.envVariables.optional.find((v) => v.name === "CRON_SCHEDULE")?.defaultValue).toBe("*/5 * * * *");
|
|
284
|
+
});
|
|
285
|
+
it("reports both required and optional env variables", async () => {
|
|
286
|
+
await createAgent("mixed-env-agent", {
|
|
287
|
+
withMetadata: true,
|
|
288
|
+
envVars: [{ name: "API_KEY" }, { name: "DEBUG", defaultValue: "false" }],
|
|
289
|
+
});
|
|
290
|
+
const configPath = await createFleetConfig(["./agents/mixed-env-agent/agent.yaml"]);
|
|
291
|
+
const result = await removeAgent({
|
|
292
|
+
name: "mixed-env-agent",
|
|
293
|
+
configPath,
|
|
294
|
+
});
|
|
295
|
+
expect(result.envVariables).toBeDefined();
|
|
296
|
+
expect(result.envVariables.required.length).toBe(1);
|
|
297
|
+
expect(result.envVariables.optional.length).toBe(1);
|
|
298
|
+
expect(result.envVariables.required[0].name).toBe("API_KEY");
|
|
299
|
+
expect(result.envVariables.optional[0].name).toBe("DEBUG");
|
|
300
|
+
});
|
|
301
|
+
it("returns empty env variables when agent has none", async () => {
|
|
302
|
+
await createAgent("no-env-agent", {
|
|
303
|
+
withMetadata: true,
|
|
304
|
+
});
|
|
305
|
+
const configPath = await createFleetConfig(["./agents/no-env-agent/agent.yaml"]);
|
|
306
|
+
const result = await removeAgent({
|
|
307
|
+
name: "no-env-agent",
|
|
308
|
+
configPath,
|
|
309
|
+
});
|
|
310
|
+
expect(result.envVariables).toBeDefined();
|
|
311
|
+
expect(result.envVariables.variables.length).toBe(0);
|
|
312
|
+
expect(result.envVariables.required.length).toBe(0);
|
|
313
|
+
expect(result.envVariables.optional.length).toBe(0);
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
// ===========================================================================
|
|
317
|
+
// Error Handling Tests
|
|
318
|
+
// ===========================================================================
|
|
319
|
+
describe("error handling", () => {
|
|
320
|
+
it("throws when agent is not found", async () => {
|
|
321
|
+
const configPath = await createFleetConfig([]);
|
|
322
|
+
await expect(removeAgent({
|
|
323
|
+
name: "nonexistent-agent",
|
|
324
|
+
configPath,
|
|
325
|
+
})).rejects.toThrow(AgentRemoveError);
|
|
326
|
+
try {
|
|
327
|
+
await removeAgent({
|
|
328
|
+
name: "nonexistent-agent",
|
|
329
|
+
configPath,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
catch (err) {
|
|
333
|
+
const error = err;
|
|
334
|
+
expect(error.code).toBe(AGENT_NOT_FOUND);
|
|
335
|
+
expect(error.message).toContain("nonexistent-agent");
|
|
336
|
+
expect(error.message).toContain("not found");
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
it("still removes from config when agent directory is missing", async () => {
|
|
340
|
+
// Create agent in config but don't create the directory
|
|
341
|
+
const configPath = join(tempDir, "herdctl.yaml");
|
|
342
|
+
await writeFile(configPath, `version: 1
|
|
343
|
+
|
|
344
|
+
fleet:
|
|
345
|
+
name: test-fleet
|
|
346
|
+
|
|
347
|
+
agents:
|
|
348
|
+
- path: ./agents/missing-dir-agent/agent.yaml
|
|
349
|
+
`, "utf-8");
|
|
350
|
+
// Create the agent directory so discovery finds it
|
|
351
|
+
const agentDir = join(tempDir, "agents", "missing-dir-agent");
|
|
352
|
+
await mkdir(agentDir, { recursive: true });
|
|
353
|
+
await writeFile(join(agentDir, "agent.yaml"), "name: missing-dir-agent\n", "utf-8");
|
|
354
|
+
// Now delete the directory but keep config
|
|
355
|
+
await rm(agentDir, { recursive: true, force: true });
|
|
356
|
+
// This should fail because discovery won't find the agent anymore
|
|
357
|
+
await expect(removeAgent({
|
|
358
|
+
name: "missing-dir-agent",
|
|
359
|
+
configPath,
|
|
360
|
+
})).rejects.toThrow(AgentRemoveError);
|
|
361
|
+
});
|
|
362
|
+
it("still returns success when directory is gone but config update works", async () => {
|
|
363
|
+
// Create agent and config
|
|
364
|
+
const agentDir = await createAgent("dir-test-agent", { withMetadata: true });
|
|
365
|
+
const configPath = await createFleetConfig(["./agents/dir-test-agent/agent.yaml"]);
|
|
366
|
+
// Remove the agent normally
|
|
367
|
+
const result = await removeAgent({
|
|
368
|
+
name: "dir-test-agent",
|
|
369
|
+
configPath,
|
|
370
|
+
});
|
|
371
|
+
expect(result.filesRemoved).toBe(true);
|
|
372
|
+
expect(result.configUpdated).toBe(true);
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
// ===========================================================================
|
|
376
|
+
// Multiple Agents Tests
|
|
377
|
+
// ===========================================================================
|
|
378
|
+
describe("multiple agents", () => {
|
|
379
|
+
it("removes only the specified agent", async () => {
|
|
380
|
+
const agent1Dir = await createAgent("agent-1", { withMetadata: true });
|
|
381
|
+
const agent2Dir = await createAgent("agent-2", { withMetadata: true });
|
|
382
|
+
const agent3Dir = await createAgent("agent-3", { withMetadata: true });
|
|
383
|
+
const configPath = await createFleetConfig([
|
|
384
|
+
"./agents/agent-1/agent.yaml",
|
|
385
|
+
"./agents/agent-2/agent.yaml",
|
|
386
|
+
"./agents/agent-3/agent.yaml",
|
|
387
|
+
]);
|
|
388
|
+
const result = await removeAgent({
|
|
389
|
+
name: "agent-2",
|
|
390
|
+
configPath,
|
|
391
|
+
});
|
|
392
|
+
expect(result.agentName).toBe("agent-2");
|
|
393
|
+
// Only agent-2 should be removed
|
|
394
|
+
expect(await pathExists(agent1Dir)).toBe(true);
|
|
395
|
+
expect(await pathExists(agent2Dir)).toBe(false);
|
|
396
|
+
expect(await pathExists(agent3Dir)).toBe(true);
|
|
397
|
+
// Config should still have agent-1 and agent-3
|
|
398
|
+
const configContent = await readFleetConfig(configPath);
|
|
399
|
+
expect(configContent).toContain("agent-1");
|
|
400
|
+
expect(configContent).not.toContain("agent-2");
|
|
401
|
+
expect(configContent).toContain("agent-3");
|
|
402
|
+
});
|
|
403
|
+
it("can remove agents one by one", async () => {
|
|
404
|
+
await createAgent("first-agent", { withMetadata: true });
|
|
405
|
+
await createAgent("second-agent", { withMetadata: true });
|
|
406
|
+
const configPath = await createFleetConfig([
|
|
407
|
+
"./agents/first-agent/agent.yaml",
|
|
408
|
+
"./agents/second-agent/agent.yaml",
|
|
409
|
+
]);
|
|
410
|
+
// Remove first agent
|
|
411
|
+
await removeAgent({
|
|
412
|
+
name: "first-agent",
|
|
413
|
+
configPath,
|
|
414
|
+
});
|
|
415
|
+
let configContent = await readFleetConfig(configPath);
|
|
416
|
+
expect(configContent).not.toContain("first-agent");
|
|
417
|
+
expect(configContent).toContain("second-agent");
|
|
418
|
+
// Remove second agent
|
|
419
|
+
await removeAgent({
|
|
420
|
+
name: "second-agent",
|
|
421
|
+
configPath,
|
|
422
|
+
});
|
|
423
|
+
configContent = await readFleetConfig(configPath);
|
|
424
|
+
expect(configContent).not.toContain("first-agent");
|
|
425
|
+
expect(configContent).not.toContain("second-agent");
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
// ===========================================================================
|
|
429
|
+
// Base Directory Tests
|
|
430
|
+
// ===========================================================================
|
|
431
|
+
describe("base directory handling", () => {
|
|
432
|
+
it("uses custom baseDir when provided", async () => {
|
|
433
|
+
// Create agent in a different base directory
|
|
434
|
+
const customBase = join(tempDir, "custom-base");
|
|
435
|
+
const agentDir = join(customBase, "agents", "custom-agent");
|
|
436
|
+
await mkdir(agentDir, { recursive: true });
|
|
437
|
+
await writeFile(join(agentDir, "agent.yaml"), "name: custom-agent\nruntime: sdk\n", "utf-8");
|
|
438
|
+
// Config is in tempDir but baseDir is customBase
|
|
439
|
+
const configPath = await createFleetConfig(["./agents/custom-agent/agent.yaml"]);
|
|
440
|
+
const result = await removeAgent({
|
|
441
|
+
name: "custom-agent",
|
|
442
|
+
configPath,
|
|
443
|
+
baseDir: customBase,
|
|
444
|
+
});
|
|
445
|
+
expect(result.filesRemoved).toBe(true);
|
|
446
|
+
expect(await pathExists(agentDir)).toBe(false);
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
// ===========================================================================
|
|
450
|
+
// Edge Cases
|
|
451
|
+
// ===========================================================================
|
|
452
|
+
describe("edge cases", () => {
|
|
453
|
+
it("handles agent with empty workspace", async () => {
|
|
454
|
+
const agentDir = await createAgent("empty-workspace-agent", {
|
|
455
|
+
withMetadata: true,
|
|
456
|
+
withWorkspace: true,
|
|
457
|
+
workspaceFiles: [],
|
|
458
|
+
});
|
|
459
|
+
const configPath = await createFleetConfig(["./agents/empty-workspace-agent/agent.yaml"]);
|
|
460
|
+
const result = await removeAgent({
|
|
461
|
+
name: "empty-workspace-agent",
|
|
462
|
+
configPath,
|
|
463
|
+
keepWorkspace: true,
|
|
464
|
+
});
|
|
465
|
+
expect(result.workspacePreserved).toBe(true);
|
|
466
|
+
expect(await pathExists(join(agentDir, "workspace"))).toBe(true);
|
|
467
|
+
});
|
|
468
|
+
it("handles agent name with special characters (hyphens)", async () => {
|
|
469
|
+
await createAgent("my-special-agent-name", { withMetadata: true });
|
|
470
|
+
const configPath = await createFleetConfig(["./agents/my-special-agent-name/agent.yaml"]);
|
|
471
|
+
const result = await removeAgent({
|
|
472
|
+
name: "my-special-agent-name",
|
|
473
|
+
configPath,
|
|
474
|
+
});
|
|
475
|
+
expect(result.agentName).toBe("my-special-agent-name");
|
|
476
|
+
expect(result.filesRemoved).toBe(true);
|
|
477
|
+
});
|
|
478
|
+
it("leaves no orphaned files when removing without keepWorkspace", async () => {
|
|
479
|
+
const agentDir = await createAgent("clean-remove-agent", {
|
|
480
|
+
withMetadata: true,
|
|
481
|
+
withWorkspace: true,
|
|
482
|
+
workspaceFiles: ["file1.txt", "file2.txt"],
|
|
483
|
+
extraFiles: ["knowledge/doc.md"],
|
|
484
|
+
});
|
|
485
|
+
const configPath = await createFleetConfig(["./agents/clean-remove-agent/agent.yaml"]);
|
|
486
|
+
await removeAgent({
|
|
487
|
+
name: "clean-remove-agent",
|
|
488
|
+
configPath,
|
|
489
|
+
keepWorkspace: false,
|
|
490
|
+
});
|
|
491
|
+
// The entire agent directory should be gone
|
|
492
|
+
expect(await pathExists(agentDir)).toBe(false);
|
|
493
|
+
// But the agents/ parent directory should still exist
|
|
494
|
+
expect(await pathExists(join(tempDir, "agents"))).toBe(true);
|
|
495
|
+
});
|
|
496
|
+
});
|
|
497
|
+
});
|
|
498
|
+
//# sourceMappingURL=agent-remover.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-remover.test.js","sourceRoot":"","sources":["../../../src/distribution/__tests__/agent-remover.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-repo-metadata.test.d.ts","sourceRoot":"","sources":["../../../src/distribution/__tests__/agent-repo-metadata.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|