@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,447 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for repository validator
|
|
3
|
+
*
|
|
4
|
+
* Uses real file I/O with temporary directories to test validation logic.
|
|
5
|
+
*/
|
|
6
|
+
import { mkdir, mkdtemp, 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 { DOCKER_NETWORK_NONE, INVALID_AGENT_YAML, INVALID_HERDCTL_JSON, JSON_PARSE_ERROR, MISSING_AGENT_YAML, MISSING_CLAUDE_MD, MISSING_HERDCTL_JSON, MISSING_README, NAME_MISMATCH, validateRepository, YAML_PARSE_ERROR, } from "../repository-validator.js";
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// Test Setup
|
|
13
|
+
// =============================================================================
|
|
14
|
+
describe("validateRepository", () => {
|
|
15
|
+
let tempDir;
|
|
16
|
+
beforeEach(async () => {
|
|
17
|
+
// Create a fresh temp directory for each test
|
|
18
|
+
tempDir = await mkdtemp(join(tmpdir(), "herdctl-validator-test-"));
|
|
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
|
+
* Minimal valid agent.yaml content
|
|
29
|
+
*/
|
|
30
|
+
const minimalAgentYaml = `
|
|
31
|
+
name: test-agent
|
|
32
|
+
runtime: cli
|
|
33
|
+
`;
|
|
34
|
+
/**
|
|
35
|
+
* Valid agent.yaml with docker enabled (no network field - that's fleet-level)
|
|
36
|
+
*/
|
|
37
|
+
const agentYamlWithDocker = `
|
|
38
|
+
name: test-agent
|
|
39
|
+
runtime: cli
|
|
40
|
+
docker:
|
|
41
|
+
enabled: true
|
|
42
|
+
memory: 2g
|
|
43
|
+
`;
|
|
44
|
+
/**
|
|
45
|
+
* Agent.yaml with docker.network: none (invalid - also network field is not allowed in agent.yaml)
|
|
46
|
+
*/
|
|
47
|
+
const agentYamlWithNetworkNone = `
|
|
48
|
+
name: test-agent
|
|
49
|
+
runtime: cli
|
|
50
|
+
docker:
|
|
51
|
+
enabled: true
|
|
52
|
+
network: none
|
|
53
|
+
`;
|
|
54
|
+
/**
|
|
55
|
+
* Minimal valid herdctl.json content
|
|
56
|
+
*/
|
|
57
|
+
const minimalHerdctlJson = JSON.stringify({
|
|
58
|
+
name: "test-agent",
|
|
59
|
+
version: "1.0.0",
|
|
60
|
+
description: "A test agent",
|
|
61
|
+
author: "Test Author",
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* herdctl.json with different name than agent.yaml
|
|
65
|
+
*/
|
|
66
|
+
const herdctlJsonDifferentName = JSON.stringify({
|
|
67
|
+
name: "different-name",
|
|
68
|
+
version: "1.0.0",
|
|
69
|
+
description: "A test agent",
|
|
70
|
+
author: "Test Author",
|
|
71
|
+
});
|
|
72
|
+
// ===========================================================================
|
|
73
|
+
// Valid Repository Tests
|
|
74
|
+
// ===========================================================================
|
|
75
|
+
describe("valid repositories", () => {
|
|
76
|
+
it("validates a minimal repo with only agent.yaml", async () => {
|
|
77
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml);
|
|
78
|
+
const result = await validateRepository(tempDir);
|
|
79
|
+
expect(result.valid).toBe(true);
|
|
80
|
+
expect(result.agentName).toBe("test-agent");
|
|
81
|
+
expect(result.agentConfig).not.toBeNull();
|
|
82
|
+
expect(result.agentConfig?.name).toBe("test-agent");
|
|
83
|
+
expect(result.agentConfig?.runtime).toBe("cli");
|
|
84
|
+
expect(result.errors).toHaveLength(0);
|
|
85
|
+
// Should have warnings for missing optional files
|
|
86
|
+
expect(result.warnings.some((w) => w.code === MISSING_HERDCTL_JSON)).toBe(true);
|
|
87
|
+
expect(result.warnings.some((w) => w.code === MISSING_CLAUDE_MD)).toBe(true);
|
|
88
|
+
expect(result.warnings.some((w) => w.code === MISSING_README)).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
it("validates a repo with agent.yaml and herdctl.json", async () => {
|
|
91
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml);
|
|
92
|
+
await writeFile(join(tempDir, "herdctl.json"), minimalHerdctlJson);
|
|
93
|
+
const result = await validateRepository(tempDir);
|
|
94
|
+
expect(result.valid).toBe(true);
|
|
95
|
+
expect(result.agentName).toBe("test-agent");
|
|
96
|
+
expect(result.repoMetadata).not.toBeNull();
|
|
97
|
+
expect(result.repoMetadata?.name).toBe("test-agent");
|
|
98
|
+
expect(result.repoMetadata?.version).toBe("1.0.0");
|
|
99
|
+
expect(result.errors).toHaveLength(0);
|
|
100
|
+
// Should not have warning for missing herdctl.json
|
|
101
|
+
expect(result.warnings.some((w) => w.code === MISSING_HERDCTL_JSON)).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
it("validates a repo with all recommended files", async () => {
|
|
104
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml);
|
|
105
|
+
await writeFile(join(tempDir, "herdctl.json"), minimalHerdctlJson);
|
|
106
|
+
await writeFile(join(tempDir, "CLAUDE.md"), "# Test Agent\n\nYou are a test agent.");
|
|
107
|
+
await writeFile(join(tempDir, "README.md"), "# Test Agent\n\nA test agent.");
|
|
108
|
+
const result = await validateRepository(tempDir);
|
|
109
|
+
expect(result.valid).toBe(true);
|
|
110
|
+
expect(result.errors).toHaveLength(0);
|
|
111
|
+
// Should have no warnings for missing files
|
|
112
|
+
expect(result.warnings.some((w) => w.code === MISSING_HERDCTL_JSON)).toBe(false);
|
|
113
|
+
expect(result.warnings.some((w) => w.code === MISSING_CLAUDE_MD)).toBe(false);
|
|
114
|
+
expect(result.warnings.some((w) => w.code === MISSING_README)).toBe(false);
|
|
115
|
+
});
|
|
116
|
+
it("validates a repo with docker enabled", async () => {
|
|
117
|
+
await writeFile(join(tempDir, "agent.yaml"), agentYamlWithDocker);
|
|
118
|
+
const result = await validateRepository(tempDir);
|
|
119
|
+
expect(result.valid).toBe(true);
|
|
120
|
+
expect(result.agentConfig?.docker?.enabled).toBe(true);
|
|
121
|
+
expect(result.agentConfig?.docker?.memory).toBe("2g");
|
|
122
|
+
expect(result.errors).toHaveLength(0);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
// ===========================================================================
|
|
126
|
+
// Missing agent.yaml Tests
|
|
127
|
+
// ===========================================================================
|
|
128
|
+
describe("missing agent.yaml", () => {
|
|
129
|
+
it("reports error when agent.yaml is missing", async () => {
|
|
130
|
+
// Empty directory - no files
|
|
131
|
+
const result = await validateRepository(tempDir);
|
|
132
|
+
expect(result.valid).toBe(false);
|
|
133
|
+
expect(result.agentName).toBeNull();
|
|
134
|
+
expect(result.agentConfig).toBeNull();
|
|
135
|
+
expect(result.errors).toHaveLength(1);
|
|
136
|
+
expect(result.errors[0].code).toBe(MISSING_AGENT_YAML);
|
|
137
|
+
expect(result.errors[0].path).toBe("agent.yaml");
|
|
138
|
+
expect(result.errors[0].message).toContain("Required file agent.yaml not found");
|
|
139
|
+
});
|
|
140
|
+
it("reports error even if herdctl.json exists without agent.yaml", async () => {
|
|
141
|
+
await writeFile(join(tempDir, "herdctl.json"), minimalHerdctlJson);
|
|
142
|
+
const result = await validateRepository(tempDir);
|
|
143
|
+
expect(result.valid).toBe(false);
|
|
144
|
+
expect(result.errors.some((e) => e.code === MISSING_AGENT_YAML)).toBe(true);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
// ===========================================================================
|
|
148
|
+
// Invalid YAML Tests
|
|
149
|
+
// ===========================================================================
|
|
150
|
+
describe("invalid YAML in agent.yaml", () => {
|
|
151
|
+
it("reports error for invalid YAML syntax", async () => {
|
|
152
|
+
const invalidYaml = `
|
|
153
|
+
name: test-agent
|
|
154
|
+
bad-indent: this is wrong
|
|
155
|
+
nested: invalid
|
|
156
|
+
`;
|
|
157
|
+
await writeFile(join(tempDir, "agent.yaml"), invalidYaml);
|
|
158
|
+
const result = await validateRepository(tempDir);
|
|
159
|
+
expect(result.valid).toBe(false);
|
|
160
|
+
expect(result.agentName).toBeNull();
|
|
161
|
+
expect(result.agentConfig).toBeNull();
|
|
162
|
+
expect(result.errors.some((e) => e.code === YAML_PARSE_ERROR)).toBe(true);
|
|
163
|
+
expect(result.errors[0].path).toBe("agent.yaml");
|
|
164
|
+
expect(result.errors[0].message).toContain("Invalid YAML syntax");
|
|
165
|
+
});
|
|
166
|
+
it("reports error for truncated YAML", async () => {
|
|
167
|
+
const truncatedYaml = `name: test
|
|
168
|
+
schedules:
|
|
169
|
+
check:
|
|
170
|
+
type: cron
|
|
171
|
+
cron: "* * * * *
|
|
172
|
+
`; // Missing closing quote
|
|
173
|
+
await writeFile(join(tempDir, "agent.yaml"), truncatedYaml);
|
|
174
|
+
const result = await validateRepository(tempDir);
|
|
175
|
+
expect(result.valid).toBe(false);
|
|
176
|
+
expect(result.errors.some((e) => e.code === YAML_PARSE_ERROR)).toBe(true);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
// ===========================================================================
|
|
180
|
+
// Schema Validation Tests
|
|
181
|
+
// ===========================================================================
|
|
182
|
+
describe("agent.yaml schema validation", () => {
|
|
183
|
+
it("reports error when required fields are missing", async () => {
|
|
184
|
+
// Missing 'name' field
|
|
185
|
+
const missingName = `
|
|
186
|
+
description: A test agent
|
|
187
|
+
`;
|
|
188
|
+
await writeFile(join(tempDir, "agent.yaml"), missingName);
|
|
189
|
+
const result = await validateRepository(tempDir);
|
|
190
|
+
expect(result.valid).toBe(false);
|
|
191
|
+
expect(result.errors.some((e) => e.code === INVALID_AGENT_YAML)).toBe(true);
|
|
192
|
+
expect(result.errors[0].message).toContain("validation failed");
|
|
193
|
+
});
|
|
194
|
+
it("reports error for invalid agent name format", async () => {
|
|
195
|
+
const invalidName = `
|
|
196
|
+
name: "invalid name with spaces"
|
|
197
|
+
runtime: cli
|
|
198
|
+
`;
|
|
199
|
+
await writeFile(join(tempDir, "agent.yaml"), invalidName);
|
|
200
|
+
const result = await validateRepository(tempDir);
|
|
201
|
+
expect(result.valid).toBe(false);
|
|
202
|
+
expect(result.errors.some((e) => e.code === INVALID_AGENT_YAML)).toBe(true);
|
|
203
|
+
});
|
|
204
|
+
it("reports error for unknown fields (strict schema)", async () => {
|
|
205
|
+
const unknownField = `
|
|
206
|
+
name: test-agent
|
|
207
|
+
runtime: cli
|
|
208
|
+
unknown_field: should fail
|
|
209
|
+
`;
|
|
210
|
+
await writeFile(join(tempDir, "agent.yaml"), unknownField);
|
|
211
|
+
const result = await validateRepository(tempDir);
|
|
212
|
+
expect(result.valid).toBe(false);
|
|
213
|
+
expect(result.errors.some((e) => e.code === INVALID_AGENT_YAML)).toBe(true);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
// ===========================================================================
|
|
217
|
+
// Docker Network None Tests
|
|
218
|
+
// ===========================================================================
|
|
219
|
+
describe("docker.network: none validation", () => {
|
|
220
|
+
it("reports error when docker.network is none", async () => {
|
|
221
|
+
await writeFile(join(tempDir, "agent.yaml"), agentYamlWithNetworkNone);
|
|
222
|
+
const result = await validateRepository(tempDir);
|
|
223
|
+
expect(result.valid).toBe(false);
|
|
224
|
+
expect(result.errors.some((e) => e.code === DOCKER_NETWORK_NONE)).toBe(true);
|
|
225
|
+
const networkError = result.errors.find((e) => e.code === DOCKER_NETWORK_NONE);
|
|
226
|
+
expect(networkError?.message).toContain("Anthropic APIs");
|
|
227
|
+
expect(networkError?.message).toContain("bridge");
|
|
228
|
+
// Also gets schema validation error since network is not allowed in agent.yaml
|
|
229
|
+
expect(result.errors.some((e) => e.code === INVALID_AGENT_YAML)).toBe(true);
|
|
230
|
+
});
|
|
231
|
+
it("reports error when docker.network is any value (network is fleet-level only)", async () => {
|
|
232
|
+
// The 'network' field is not allowed in agent.yaml (it's a fleet-level setting)
|
|
233
|
+
// This will get a schema validation error
|
|
234
|
+
const withNetwork = `
|
|
235
|
+
name: test-agent
|
|
236
|
+
runtime: cli
|
|
237
|
+
docker:
|
|
238
|
+
enabled: true
|
|
239
|
+
network: bridge
|
|
240
|
+
`;
|
|
241
|
+
await writeFile(join(tempDir, "agent.yaml"), withNetwork);
|
|
242
|
+
const result = await validateRepository(tempDir);
|
|
243
|
+
// Will fail due to unrecognized 'network' key in AgentDockerSchema
|
|
244
|
+
expect(result.valid).toBe(false);
|
|
245
|
+
expect(result.errors.some((e) => e.code === INVALID_AGENT_YAML)).toBe(true);
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
// ===========================================================================
|
|
249
|
+
// herdctl.json Validation Tests
|
|
250
|
+
// ===========================================================================
|
|
251
|
+
describe("herdctl.json validation", () => {
|
|
252
|
+
it("reports error for invalid JSON syntax", async () => {
|
|
253
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml);
|
|
254
|
+
await writeFile(join(tempDir, "herdctl.json"), "{ invalid json");
|
|
255
|
+
const result = await validateRepository(tempDir);
|
|
256
|
+
expect(result.valid).toBe(false);
|
|
257
|
+
expect(result.repoMetadata).toBeNull();
|
|
258
|
+
expect(result.errors.some((e) => e.code === JSON_PARSE_ERROR)).toBe(true);
|
|
259
|
+
const jsonError = result.errors.find((e) => e.code === JSON_PARSE_ERROR);
|
|
260
|
+
expect(jsonError?.path).toBe("herdctl.json");
|
|
261
|
+
});
|
|
262
|
+
it("reports error when herdctl.json fails schema validation", async () => {
|
|
263
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml);
|
|
264
|
+
// Missing required fields (version, description, author)
|
|
265
|
+
const invalidMetadata = JSON.stringify({ name: "test-agent" });
|
|
266
|
+
await writeFile(join(tempDir, "herdctl.json"), invalidMetadata);
|
|
267
|
+
const result = await validateRepository(tempDir);
|
|
268
|
+
expect(result.valid).toBe(false);
|
|
269
|
+
expect(result.repoMetadata).toBeNull();
|
|
270
|
+
expect(result.errors.some((e) => e.code === INVALID_HERDCTL_JSON)).toBe(true);
|
|
271
|
+
const schemaError = result.errors.find((e) => e.code === INVALID_HERDCTL_JSON);
|
|
272
|
+
expect(schemaError?.message).toContain("validation failed");
|
|
273
|
+
});
|
|
274
|
+
it("reports error for invalid version format in herdctl.json", async () => {
|
|
275
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml);
|
|
276
|
+
const badVersion = JSON.stringify({
|
|
277
|
+
name: "test-agent",
|
|
278
|
+
version: "not-a-semver",
|
|
279
|
+
description: "Test",
|
|
280
|
+
author: "Test",
|
|
281
|
+
});
|
|
282
|
+
await writeFile(join(tempDir, "herdctl.json"), badVersion);
|
|
283
|
+
const result = await validateRepository(tempDir);
|
|
284
|
+
expect(result.valid).toBe(false);
|
|
285
|
+
expect(result.errors.some((e) => e.code === INVALID_HERDCTL_JSON)).toBe(true);
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
// ===========================================================================
|
|
289
|
+
// Name Mismatch Tests
|
|
290
|
+
// ===========================================================================
|
|
291
|
+
describe("name mismatch warning", () => {
|
|
292
|
+
it("warns when agent.yaml and herdctl.json have different names", async () => {
|
|
293
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml); // name: test-agent
|
|
294
|
+
await writeFile(join(tempDir, "herdctl.json"), herdctlJsonDifferentName); // name: different-name
|
|
295
|
+
const result = await validateRepository(tempDir);
|
|
296
|
+
expect(result.valid).toBe(true); // Warning, not error
|
|
297
|
+
expect(result.agentName).toBe("test-agent"); // Uses agent.yaml name
|
|
298
|
+
expect(result.warnings.some((w) => w.code === NAME_MISMATCH)).toBe(true);
|
|
299
|
+
const nameWarning = result.warnings.find((w) => w.code === NAME_MISMATCH);
|
|
300
|
+
expect(nameWarning?.message).toContain("test-agent");
|
|
301
|
+
expect(nameWarning?.message).toContain("different-name");
|
|
302
|
+
expect(nameWarning?.message).toContain("agent.yaml will be used");
|
|
303
|
+
});
|
|
304
|
+
it("does not warn when names match", async () => {
|
|
305
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml);
|
|
306
|
+
await writeFile(join(tempDir, "herdctl.json"), minimalHerdctlJson);
|
|
307
|
+
const result = await validateRepository(tempDir);
|
|
308
|
+
expect(result.valid).toBe(true);
|
|
309
|
+
expect(result.warnings.some((w) => w.code === NAME_MISMATCH)).toBe(false);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
// ===========================================================================
|
|
313
|
+
// Optional File Warnings
|
|
314
|
+
// ===========================================================================
|
|
315
|
+
describe("optional file warnings", () => {
|
|
316
|
+
it("warns when CLAUDE.md is missing", async () => {
|
|
317
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml);
|
|
318
|
+
const result = await validateRepository(tempDir);
|
|
319
|
+
expect(result.valid).toBe(true);
|
|
320
|
+
expect(result.warnings.some((w) => w.code === MISSING_CLAUDE_MD)).toBe(true);
|
|
321
|
+
const claudeWarning = result.warnings.find((w) => w.code === MISSING_CLAUDE_MD);
|
|
322
|
+
expect(claudeWarning?.message).toContain("agent identity");
|
|
323
|
+
});
|
|
324
|
+
it("warns when README.md is missing", async () => {
|
|
325
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml);
|
|
326
|
+
const result = await validateRepository(tempDir);
|
|
327
|
+
expect(result.valid).toBe(true);
|
|
328
|
+
expect(result.warnings.some((w) => w.code === MISSING_README)).toBe(true);
|
|
329
|
+
const readmeWarning = result.warnings.find((w) => w.code === MISSING_README);
|
|
330
|
+
expect(readmeWarning?.message).toContain("documentation");
|
|
331
|
+
});
|
|
332
|
+
it("does not warn when CLAUDE.md exists", async () => {
|
|
333
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml);
|
|
334
|
+
await writeFile(join(tempDir, "CLAUDE.md"), "# Agent Identity");
|
|
335
|
+
const result = await validateRepository(tempDir);
|
|
336
|
+
expect(result.warnings.some((w) => w.code === MISSING_CLAUDE_MD)).toBe(false);
|
|
337
|
+
});
|
|
338
|
+
it("does not warn when README.md exists", async () => {
|
|
339
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml);
|
|
340
|
+
await writeFile(join(tempDir, "README.md"), "# Documentation");
|
|
341
|
+
const result = await validateRepository(tempDir);
|
|
342
|
+
expect(result.warnings.some((w) => w.code === MISSING_README)).toBe(false);
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
// ===========================================================================
|
|
346
|
+
// Complex Scenarios
|
|
347
|
+
// ===========================================================================
|
|
348
|
+
describe("complex scenarios", () => {
|
|
349
|
+
it("handles multiple errors at once", async () => {
|
|
350
|
+
// Invalid YAML in agent.yaml and invalid JSON in herdctl.json
|
|
351
|
+
await writeFile(join(tempDir, "agent.yaml"), "invalid: yaml: syntax:");
|
|
352
|
+
await writeFile(join(tempDir, "herdctl.json"), "not valid json");
|
|
353
|
+
const result = await validateRepository(tempDir);
|
|
354
|
+
expect(result.valid).toBe(false);
|
|
355
|
+
expect(result.errors.length).toBeGreaterThanOrEqual(2);
|
|
356
|
+
});
|
|
357
|
+
it("validates a realistic agent repository", async () => {
|
|
358
|
+
const realisticAgent = `
|
|
359
|
+
name: website-monitor
|
|
360
|
+
description: "Website uptime monitor"
|
|
361
|
+
runtime: cli
|
|
362
|
+
working_directory: ./workspace
|
|
363
|
+
setting_sources:
|
|
364
|
+
- project
|
|
365
|
+
schedules:
|
|
366
|
+
check-websites:
|
|
367
|
+
type: cron
|
|
368
|
+
cron: "*/5 * * * *"
|
|
369
|
+
prompt: "Check website uptime"
|
|
370
|
+
permission_mode: acceptEdits
|
|
371
|
+
allowed_tools:
|
|
372
|
+
- Read
|
|
373
|
+
- Write
|
|
374
|
+
- WebFetch
|
|
375
|
+
docker:
|
|
376
|
+
enabled: true
|
|
377
|
+
memory: 2g
|
|
378
|
+
`;
|
|
379
|
+
const realisticMetadata = JSON.stringify({
|
|
380
|
+
name: "website-monitor",
|
|
381
|
+
version: "1.0.0",
|
|
382
|
+
description: "Monitor website uptime and send Discord alerts",
|
|
383
|
+
author: "herdctl-examples",
|
|
384
|
+
repository: "github:herdctl-examples/website-monitor-agent",
|
|
385
|
+
license: "MIT",
|
|
386
|
+
keywords: ["monitoring", "uptime", "alerts"],
|
|
387
|
+
requires: {
|
|
388
|
+
herdctl: ">=0.1.0",
|
|
389
|
+
runtime: "cli",
|
|
390
|
+
env: ["WEBSITES", "DISCORD_WEBHOOK_URL"],
|
|
391
|
+
workspace: true,
|
|
392
|
+
},
|
|
393
|
+
category: "operations",
|
|
394
|
+
tags: ["monitoring", "automation"],
|
|
395
|
+
});
|
|
396
|
+
await writeFile(join(tempDir, "agent.yaml"), realisticAgent);
|
|
397
|
+
await writeFile(join(tempDir, "herdctl.json"), realisticMetadata);
|
|
398
|
+
await writeFile(join(tempDir, "CLAUDE.md"), "# Website Monitor\n\nYou monitor websites.");
|
|
399
|
+
await writeFile(join(tempDir, "README.md"), "# Website Monitor Agent\n\nUsage docs here.");
|
|
400
|
+
await mkdir(join(tempDir, "knowledge"), { recursive: true });
|
|
401
|
+
await writeFile(join(tempDir, "knowledge", "monitoring-guide.md"), "# Monitoring Guide");
|
|
402
|
+
const result = await validateRepository(tempDir);
|
|
403
|
+
expect(result.valid).toBe(true);
|
|
404
|
+
expect(result.agentName).toBe("website-monitor");
|
|
405
|
+
expect(result.agentConfig?.schedules?.["check-websites"]).toBeDefined();
|
|
406
|
+
expect(result.repoMetadata?.version).toBe("1.0.0");
|
|
407
|
+
expect(result.repoMetadata?.keywords).toContain("monitoring");
|
|
408
|
+
expect(result.errors).toHaveLength(0);
|
|
409
|
+
// Should have no warnings for missing files
|
|
410
|
+
expect(result.warnings.some((w) => w.code === MISSING_HERDCTL_JSON)).toBe(false);
|
|
411
|
+
expect(result.warnings.some((w) => w.code === MISSING_CLAUDE_MD)).toBe(false);
|
|
412
|
+
expect(result.warnings.some((w) => w.code === MISSING_README)).toBe(false);
|
|
413
|
+
});
|
|
414
|
+
});
|
|
415
|
+
// ===========================================================================
|
|
416
|
+
// Edge Cases
|
|
417
|
+
// ===========================================================================
|
|
418
|
+
describe("edge cases", () => {
|
|
419
|
+
it("handles empty agent.yaml file", async () => {
|
|
420
|
+
await writeFile(join(tempDir, "agent.yaml"), "");
|
|
421
|
+
const result = await validateRepository(tempDir);
|
|
422
|
+
expect(result.valid).toBe(false);
|
|
423
|
+
// Empty YAML parses to null/undefined, which fails schema validation
|
|
424
|
+
expect(result.errors.some((e) => e.code === INVALID_AGENT_YAML)).toBe(true);
|
|
425
|
+
});
|
|
426
|
+
it("handles agent.yaml with only comments", async () => {
|
|
427
|
+
await writeFile(join(tempDir, "agent.yaml"), "# Just a comment\n# Another comment");
|
|
428
|
+
const result = await validateRepository(tempDir);
|
|
429
|
+
expect(result.valid).toBe(false);
|
|
430
|
+
expect(result.errors.some((e) => e.code === INVALID_AGENT_YAML)).toBe(true);
|
|
431
|
+
});
|
|
432
|
+
it("handles empty herdctl.json object", async () => {
|
|
433
|
+
await writeFile(join(tempDir, "agent.yaml"), minimalAgentYaml);
|
|
434
|
+
await writeFile(join(tempDir, "herdctl.json"), "{}");
|
|
435
|
+
const result = await validateRepository(tempDir);
|
|
436
|
+
expect(result.valid).toBe(false);
|
|
437
|
+
expect(result.errors.some((e) => e.code === INVALID_HERDCTL_JSON)).toBe(true);
|
|
438
|
+
});
|
|
439
|
+
it("handles whitespace-only agent.yaml", async () => {
|
|
440
|
+
await writeFile(join(tempDir, "agent.yaml"), " \n\n \t\t\n ");
|
|
441
|
+
const result = await validateRepository(tempDir);
|
|
442
|
+
expect(result.valid).toBe(false);
|
|
443
|
+
expect(result.errors.some((e) => e.code === INVALID_AGENT_YAML)).toBe(true);
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
//# sourceMappingURL=repository-validator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-validator.test.js","sourceRoot":"","sources":["../../../src/distribution/__tests__/repository-validator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-specifier.test.d.ts","sourceRoot":"","sources":["../../../src/distribution/__tests__/source-specifier.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|