@madebywild/agent-harness-framework 0.9.1
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/cli/adapters/commander.d.ts +14 -0
- package/dist/cli/adapters/commander.d.ts.map +1 -0
- package/dist/cli/adapters/commander.js +348 -0
- package/dist/cli/adapters/commander.js.map +1 -0
- package/dist/cli/adapters/interactive.d.ts +11 -0
- package/dist/cli/adapters/interactive.d.ts.map +1 -0
- package/dist/cli/adapters/interactive.js +375 -0
- package/dist/cli/adapters/interactive.js.map +1 -0
- package/dist/cli/command-registry.d.ts +27 -0
- package/dist/cli/command-registry.d.ts.map +1 -0
- package/dist/cli/command-registry.js +470 -0
- package/dist/cli/command-registry.js.map +1 -0
- package/dist/cli/contracts.d.ts +122 -0
- package/dist/cli/contracts.d.ts.map +1 -0
- package/dist/cli/contracts.js +2 -0
- package/dist/cli/contracts.js.map +1 -0
- package/dist/cli/handlers/apply.d.ts +3 -0
- package/dist/cli/handlers/apply.d.ts.map +1 -0
- package/dist/cli/handlers/apply.js +17 -0
- package/dist/cli/handlers/apply.js.map +1 -0
- package/dist/cli/handlers/doctor.d.ts +3 -0
- package/dist/cli/handlers/doctor.d.ts.map +1 -0
- package/dist/cli/handlers/doctor.js +16 -0
- package/dist/cli/handlers/doctor.js.map +1 -0
- package/dist/cli/handlers/entities.d.ts +22 -0
- package/dist/cli/handlers/entities.d.ts.map +1 -0
- package/dist/cli/handlers/entities.js +92 -0
- package/dist/cli/handlers/entities.js.map +1 -0
- package/dist/cli/handlers/init.d.ts +5 -0
- package/dist/cli/handlers/init.d.ts.map +1 -0
- package/dist/cli/handlers/init.js +17 -0
- package/dist/cli/handlers/init.js.map +1 -0
- package/dist/cli/handlers/migrate.d.ts +6 -0
- package/dist/cli/handlers/migrate.d.ts.map +1 -0
- package/dist/cli/handlers/migrate.js +22 -0
- package/dist/cli/handlers/migrate.js.map +1 -0
- package/dist/cli/handlers/plan.d.ts +5 -0
- package/dist/cli/handlers/plan.d.ts.map +1 -0
- package/dist/cli/handlers/plan.js +18 -0
- package/dist/cli/handlers/plan.js.map +1 -0
- package/dist/cli/handlers/provider.d.ts +8 -0
- package/dist/cli/handlers/provider.d.ts.map +1 -0
- package/dist/cli/handlers/provider.js +37 -0
- package/dist/cli/handlers/provider.js.map +1 -0
- package/dist/cli/handlers/registry.d.ts +27 -0
- package/dist/cli/handlers/registry.d.ts.map +1 -0
- package/dist/cli/handlers/registry.js +133 -0
- package/dist/cli/handlers/registry.js.map +1 -0
- package/dist/cli/handlers/validate.d.ts +3 -0
- package/dist/cli/handlers/validate.d.ts.map +1 -0
- package/dist/cli/handlers/validate.js +16 -0
- package/dist/cli/handlers/validate.js.map +1 -0
- package/dist/cli/handlers/watch.d.ts +6 -0
- package/dist/cli/handlers/watch.d.ts.map +1 -0
- package/dist/cli/handlers/watch.js +46 -0
- package/dist/cli/handlers/watch.js.map +1 -0
- package/dist/cli/main.d.ts +6 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +90 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/renderers/json.d.ts +10 -0
- package/dist/cli/renderers/json.d.ts.map +1 -0
- package/dist/cli/renderers/json.js +17 -0
- package/dist/cli/renderers/json.js.map +1 -0
- package/dist/cli/renderers/text.d.ts +3 -0
- package/dist/cli/renderers/text.d.ts.map +1 -0
- package/dist/cli/renderers/text.js +155 -0
- package/dist/cli/renderers/text.js.map +1 -0
- package/dist/cli/utils/runtime.d.ts +26 -0
- package/dist/cli/utils/runtime.d.ts.map +1 -0
- package/dist/cli/utils/runtime.js +158 -0
- package/dist/cli/utils/runtime.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -0
- package/dist/engine/entities.d.ts +33 -0
- package/dist/engine/entities.d.ts.map +1 -0
- package/dist/engine/entities.js +461 -0
- package/dist/engine/entities.js.map +1 -0
- package/dist/engine/state.d.ts +19 -0
- package/dist/engine/state.d.ts.map +1 -0
- package/dist/engine/state.js +70 -0
- package/dist/engine/state.js.map +1 -0
- package/dist/engine/utils.d.ts +28 -0
- package/dist/engine/utils.d.ts.map +1 -0
- package/dist/engine/utils.js +157 -0
- package/dist/engine/utils.js.map +1 -0
- package/dist/engine.d.ts +59 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +398 -0
- package/dist/engine.js.map +1 -0
- package/dist/entity-registries.d.ts +40 -0
- package/dist/entity-registries.d.ts.map +1 -0
- package/dist/entity-registries.js +257 -0
- package/dist/entity-registries.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +6 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +552 -0
- package/dist/loader.js.map +1 -0
- package/dist/paths.d.ts +23 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +40 -0
- package/dist/paths.js.map +1 -0
- package/dist/planner.d.ts +5 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +316 -0
- package/dist/planner.js.map +1 -0
- package/dist/provider-adapters/claude.d.ts +4 -0
- package/dist/provider-adapters/claude.d.ts.map +1 -0
- package/dist/provider-adapters/claude.js +36 -0
- package/dist/provider-adapters/claude.js.map +1 -0
- package/dist/provider-adapters/codex.d.ts +4 -0
- package/dist/provider-adapters/codex.d.ts.map +1 -0
- package/dist/provider-adapters/codex.js +93 -0
- package/dist/provider-adapters/codex.js.map +1 -0
- package/dist/provider-adapters/constants.d.ts +21 -0
- package/dist/provider-adapters/constants.d.ts.map +1 -0
- package/dist/provider-adapters/constants.js +21 -0
- package/dist/provider-adapters/constants.js.map +1 -0
- package/dist/provider-adapters/copilot.d.ts +4 -0
- package/dist/provider-adapters/copilot.d.ts.map +1 -0
- package/dist/provider-adapters/copilot.js +37 -0
- package/dist/provider-adapters/copilot.js.map +1 -0
- package/dist/provider-adapters/create-adapter.d.ts +4 -0
- package/dist/provider-adapters/create-adapter.d.ts.map +1 -0
- package/dist/provider-adapters/create-adapter.js +67 -0
- package/dist/provider-adapters/create-adapter.js.map +1 -0
- package/dist/provider-adapters/mcp.d.ts +4 -0
- package/dist/provider-adapters/mcp.d.ts.map +1 -0
- package/dist/provider-adapters/mcp.js +40 -0
- package/dist/provider-adapters/mcp.js.map +1 -0
- package/dist/provider-adapters/registry.d.ts +4 -0
- package/dist/provider-adapters/registry.d.ts.map +1 -0
- package/dist/provider-adapters/registry.js +11 -0
- package/dist/provider-adapters/registry.js.map +1 -0
- package/dist/provider-adapters/renderers.d.ts +3 -0
- package/dist/provider-adapters/renderers.d.ts.map +1 -0
- package/dist/provider-adapters/renderers.js +10 -0
- package/dist/provider-adapters/renderers.js.map +1 -0
- package/dist/provider-adapters/subagents.d.ts +19 -0
- package/dist/provider-adapters/subagents.d.ts.map +1 -0
- package/dist/provider-adapters/subagents.js +58 -0
- package/dist/provider-adapters/subagents.js.map +1 -0
- package/dist/provider-adapters/types.d.ts +18 -0
- package/dist/provider-adapters/types.d.ts.map +1 -0
- package/dist/provider-adapters/types.js +2 -0
- package/dist/provider-adapters/types.js.map +1 -0
- package/dist/providers.d.ts +6 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +15 -0
- package/dist/providers.js.map +1 -0
- package/dist/registry-validator.d.ts +3 -0
- package/dist/registry-validator.d.ts.map +1 -0
- package/dist/registry-validator.js +222 -0
- package/dist/registry-validator.js.map +1 -0
- package/dist/repository.d.ts +36 -0
- package/dist/repository.d.ts.map +1 -0
- package/dist/repository.js +314 -0
- package/dist/repository.js.map +1 -0
- package/dist/types.d.ts +190 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +16 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +115 -0
- package/dist/utils.js.map +1 -0
- package/dist/versioning/doctor.d.ts +6 -0
- package/dist/versioning/doctor.d.ts.map +1 -0
- package/dist/versioning/doctor.js +284 -0
- package/dist/versioning/doctor.js.map +1 -0
- package/dist/versioning/migrate.d.ts +9 -0
- package/dist/versioning/migrate.d.ts.map +1 -0
- package/dist/versioning/migrate.js +362 -0
- package/dist/versioning/migrate.js.map +1 -0
- package/dist/versioning/registry.d.ts +18 -0
- package/dist/versioning/registry.d.ts.map +1 -0
- package/dist/versioning/registry.js +63 -0
- package/dist/versioning/registry.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { agentsManifestSchema, DEFAULT_REGISTRY_ID, managedIndexSchema, manifestLockSchema, } from "@madebywild/agent-harness-manifest";
|
|
4
|
+
import { sha256, stableStringify } from "../utils.js";
|
|
5
|
+
export function sortEntities(entities) {
|
|
6
|
+
const order = {
|
|
7
|
+
prompt: 0,
|
|
8
|
+
skill: 1,
|
|
9
|
+
mcp_config: 2,
|
|
10
|
+
subagent: 3,
|
|
11
|
+
};
|
|
12
|
+
return [...entities].sort((left, right) => {
|
|
13
|
+
const typeOrder = order[left.type] - order[right.type];
|
|
14
|
+
if (typeOrder !== 0) {
|
|
15
|
+
return typeOrder;
|
|
16
|
+
}
|
|
17
|
+
return left.id.localeCompare(right.id);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function validateEntityId(id, type) {
|
|
21
|
+
if (!/^[a-zA-Z0-9._-]+$/u.test(id)) {
|
|
22
|
+
throw new Error(`Invalid ${type} id '${id}'. Allowed characters: letters, digits, '.', '_', '-'`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function validateRegistryId(id) {
|
|
26
|
+
if (!/^[a-zA-Z0-9._-]+$/u.test(id)) {
|
|
27
|
+
throw new Error(`Invalid registry id '${id}'. Allowed characters: letters, digits, '.', '_', '-'`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function registryIdFromInput(value) {
|
|
31
|
+
validateRegistryId(value);
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
export function resolveEntityRegistrySelection(manifest, explicitRegistry) {
|
|
35
|
+
const registryId = explicitRegistry
|
|
36
|
+
? registryIdFromInput(explicitRegistry)
|
|
37
|
+
: manifest.registries.default || DEFAULT_REGISTRY_ID;
|
|
38
|
+
const definition = manifest.registries.entries[registryId];
|
|
39
|
+
if (!definition) {
|
|
40
|
+
throw new Error(`REGISTRY_NOT_FOUND: registry '${registryId}' is not configured`);
|
|
41
|
+
}
|
|
42
|
+
return { id: registryId, definition };
|
|
43
|
+
}
|
|
44
|
+
export function manifestEntityTypeToCliEntityType(type) {
|
|
45
|
+
switch (type) {
|
|
46
|
+
case "prompt":
|
|
47
|
+
return "prompt";
|
|
48
|
+
case "skill":
|
|
49
|
+
return "skill";
|
|
50
|
+
case "mcp_config":
|
|
51
|
+
return "mcp";
|
|
52
|
+
case "subagent":
|
|
53
|
+
return "subagent";
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function isSkillOverrideFile(relativePath) {
|
|
57
|
+
return /^OVERRIDES\.[^.]+\.ya?ml$/u.test(path.basename(relativePath));
|
|
58
|
+
}
|
|
59
|
+
export function computeSkillSourceSha(files) {
|
|
60
|
+
const normalized = files
|
|
61
|
+
.map((file) => ({ path: file.path, sha256: file.sha256 }))
|
|
62
|
+
.sort((left, right) => left.path.localeCompare(right.path));
|
|
63
|
+
return sha256(stableStringify(normalized));
|
|
64
|
+
}
|
|
65
|
+
export function resolveRemoveTargetId(entityType, id) {
|
|
66
|
+
if (entityType !== "prompt") {
|
|
67
|
+
return id;
|
|
68
|
+
}
|
|
69
|
+
if (id !== "system") {
|
|
70
|
+
throw new Error(`Prompt entity id must be 'system', received '${id}'`);
|
|
71
|
+
}
|
|
72
|
+
return "system";
|
|
73
|
+
}
|
|
74
|
+
export function printDiagnostics(diagnostics) {
|
|
75
|
+
if (diagnostics.length === 0) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
for (const diagnostic of diagnostics) {
|
|
79
|
+
const suffix = diagnostic.path ? ` (${diagnostic.path})` : "";
|
|
80
|
+
console.error(`[${diagnostic.severity}] ${diagnostic.code}: ${diagnostic.message}${suffix}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function printApplySummary(writtenArtifacts, prunedArtifacts) {
|
|
84
|
+
if (writtenArtifacts.length > 0) {
|
|
85
|
+
console.log(`[harness] wrote ${writtenArtifacts.length} artifact(s)`);
|
|
86
|
+
}
|
|
87
|
+
if (prunedArtifacts.length > 0) {
|
|
88
|
+
console.log(`[harness] removed ${prunedArtifacts.length} stale artifact(s)`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export function preflightDiagnosticsFromDoctor(doctorDiagnostics, fileDiagnostics) {
|
|
92
|
+
if (doctorDiagnostics.length === 0) {
|
|
93
|
+
return doctorDiagnostics;
|
|
94
|
+
}
|
|
95
|
+
const fileCodes = new Set(fileDiagnostics.map((status) => status.code));
|
|
96
|
+
const filtered = doctorDiagnostics.filter((diagnostic) => fileCodes.has(diagnostic.code));
|
|
97
|
+
return filtered.length > 0 ? filtered : doctorDiagnostics;
|
|
98
|
+
}
|
|
99
|
+
export function isMissingWorkspaceCode(code) {
|
|
100
|
+
return code === "MANIFEST_NOT_FOUND" || code === "WORKSPACE_NOT_INITIALIZED";
|
|
101
|
+
}
|
|
102
|
+
export async function loadConfig(pathValue) {
|
|
103
|
+
const configPath = pathValue ? path.resolve(pathValue) : path.resolve(process.cwd(), ".harness/manifest.json");
|
|
104
|
+
const text = await fs.readFile(configPath, "utf8");
|
|
105
|
+
return agentsManifestSchema.parse(JSON.parse(text));
|
|
106
|
+
}
|
|
107
|
+
export function validateConfig(config) {
|
|
108
|
+
const result = agentsManifestSchema.safeParse(config);
|
|
109
|
+
if (result.success) {
|
|
110
|
+
return { valid: true, diagnostics: [] };
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
valid: false,
|
|
114
|
+
diagnostics: result.error.issues.map((issue) => ({
|
|
115
|
+
code: "MANIFEST_INVALID",
|
|
116
|
+
severity: "error",
|
|
117
|
+
message: issue.message,
|
|
118
|
+
path: issue.path.join("."),
|
|
119
|
+
})),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export function validateLock(lock) {
|
|
123
|
+
const result = manifestLockSchema.safeParse(lock);
|
|
124
|
+
if (result.success) {
|
|
125
|
+
return { valid: true, diagnostics: [] };
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
valid: false,
|
|
129
|
+
diagnostics: result.error.issues.map((issue) => ({
|
|
130
|
+
code: "LOCK_INVALID",
|
|
131
|
+
severity: "error",
|
|
132
|
+
message: issue.message,
|
|
133
|
+
path: issue.path.join("."),
|
|
134
|
+
})),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
export function validateManagedIndex(index) {
|
|
138
|
+
const result = managedIndexSchema.safeParse(index);
|
|
139
|
+
if (result.success) {
|
|
140
|
+
return { valid: true, diagnostics: [] };
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
valid: false,
|
|
144
|
+
diagnostics: result.error.issues.map((issue) => ({
|
|
145
|
+
code: "MANAGED_INDEX_INVALID",
|
|
146
|
+
severity: "error",
|
|
147
|
+
message: issue.message,
|
|
148
|
+
path: issue.path.join("."),
|
|
149
|
+
})),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
export async function loadOverride(pathValue) {
|
|
153
|
+
const text = await fs.readFile(pathValue, "utf8");
|
|
154
|
+
const YAML = await import("yaml");
|
|
155
|
+
return (await import("@madebywild/agent-harness-manifest")).parseProviderOverride(YAML.parse(text));
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/engine/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { ProviderId } from "@madebywild/agent-harness-manifest";
|
|
2
|
+
import type { ApplyResult, CliEntityType, DoctorResult, MigrationResult, PlanResult, RegistryListEntry, RegistryPullResult, RemoveResult, ValidationResult } from "./types.js";
|
|
3
|
+
export declare class HarnessEngine {
|
|
4
|
+
private readonly cwd;
|
|
5
|
+
constructor(cwd?: string);
|
|
6
|
+
init(options?: {
|
|
7
|
+
force?: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
enableProvider(provider: ProviderId): Promise<void>;
|
|
10
|
+
disableProvider(provider: ProviderId): Promise<void>;
|
|
11
|
+
listRegistries(): Promise<RegistryListEntry[]>;
|
|
12
|
+
addRegistry(name: string, options: {
|
|
13
|
+
gitUrl: string;
|
|
14
|
+
ref?: string;
|
|
15
|
+
rootPath?: string;
|
|
16
|
+
tokenEnvVar?: string;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
removeRegistry(name: string): Promise<void>;
|
|
19
|
+
setDefaultRegistry(name: string): Promise<void>;
|
|
20
|
+
getDefaultRegistry(): Promise<string>;
|
|
21
|
+
addPrompt(options?: {
|
|
22
|
+
registry?: string;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
addSkill(skillId: string, options?: {
|
|
25
|
+
registry?: string;
|
|
26
|
+
}): Promise<void>;
|
|
27
|
+
addMcp(configId: string, options?: {
|
|
28
|
+
registry?: string;
|
|
29
|
+
}): Promise<void>;
|
|
30
|
+
addSubagent(subagentId: string, options?: {
|
|
31
|
+
registry?: string;
|
|
32
|
+
}): Promise<void>;
|
|
33
|
+
pullRegistry(options?: {
|
|
34
|
+
entityType?: CliEntityType;
|
|
35
|
+
id?: string;
|
|
36
|
+
registry?: string;
|
|
37
|
+
force?: boolean;
|
|
38
|
+
}): Promise<RegistryPullResult>;
|
|
39
|
+
remove(entityTypeArg: CliEntityType, id: string, deleteSource: boolean): Promise<RemoveResult>;
|
|
40
|
+
validate(): Promise<ValidationResult>;
|
|
41
|
+
plan(): Promise<PlanResult>;
|
|
42
|
+
apply(): Promise<ApplyResult>;
|
|
43
|
+
watch(debounceMs?: number, options?: {
|
|
44
|
+
onReady?: () => void;
|
|
45
|
+
}): Promise<void>;
|
|
46
|
+
doctor(_options?: {
|
|
47
|
+
json?: boolean;
|
|
48
|
+
}): Promise<DoctorResult>;
|
|
49
|
+
migrate(options?: {
|
|
50
|
+
to?: "latest";
|
|
51
|
+
dryRun?: boolean;
|
|
52
|
+
json?: boolean;
|
|
53
|
+
}): Promise<MigrationResult>;
|
|
54
|
+
private planInternal;
|
|
55
|
+
private assertWorkspaceVersionCurrent;
|
|
56
|
+
private versionPreflightDiagnostics;
|
|
57
|
+
private workspaceInitializationDiagnostics;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.js
ADDED
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { DEFAULT_REGISTRY_ID, LATEST_VERSION_BY_KIND } from "@madebywild/agent-harness-manifest";
|
|
4
|
+
import chokidar from "chokidar";
|
|
5
|
+
import { addMcpEntity, addPromptEntity, addSkillEntity, addSubagentEntity, pullRegistryEntities, removeEntity, } from "./engine/entities.js";
|
|
6
|
+
import { readManifestOrThrow } from "./engine/state.js";
|
|
7
|
+
import { isMissingWorkspaceCode, preflightDiagnosticsFromDoctor, printApplySummary, printDiagnostics, validateRegistryId, } from "./engine/utils.js";
|
|
8
|
+
import { loadCanonicalState } from "./loader.js";
|
|
9
|
+
import { resolveHarnessPaths } from "./paths.js";
|
|
10
|
+
import { buildPlan } from "./planner.js";
|
|
11
|
+
import { emptyManagedIndex, loadLock, loadManagedIndex, loadManifest, removeIfExists, writeLock, writeManagedIndex, writeManifest, } from "./repository.js";
|
|
12
|
+
import { ensureParentDir, exists, normalizeRelativePath, nowIso, readTextIfExists, sha256, stableStringify, uniqSorted, } from "./utils.js";
|
|
13
|
+
import { buildVersionPreflightDiagnostics, hasVersionBlockers, runDoctor } from "./versioning/doctor.js";
|
|
14
|
+
import { runMigration } from "./versioning/migrate.js";
|
|
15
|
+
export class HarnessEngine {
|
|
16
|
+
cwd;
|
|
17
|
+
constructor(cwd = process.cwd()) {
|
|
18
|
+
this.cwd = cwd;
|
|
19
|
+
}
|
|
20
|
+
async init(options) {
|
|
21
|
+
const paths = resolveHarnessPaths(this.cwd);
|
|
22
|
+
const force = options?.force === true;
|
|
23
|
+
if (await exists(paths.agentsDir)) {
|
|
24
|
+
await this.assertWorkspaceVersionCurrent({ allowMissingManifest: true });
|
|
25
|
+
}
|
|
26
|
+
if (await exists(paths.agentsDir)) {
|
|
27
|
+
if (!force) {
|
|
28
|
+
throw new Error("Harness workspace already exists at '.harness'. Use 'harness init --force' to overwrite.");
|
|
29
|
+
}
|
|
30
|
+
await fs.rm(paths.agentsDir, { recursive: true, force: true });
|
|
31
|
+
}
|
|
32
|
+
await fs.mkdir(paths.promptDir, { recursive: true });
|
|
33
|
+
await fs.mkdir(paths.skillDir, { recursive: true });
|
|
34
|
+
await fs.mkdir(paths.mcpDir, { recursive: true });
|
|
35
|
+
await fs.mkdir(paths.subagentDir, { recursive: true });
|
|
36
|
+
const manifest = {
|
|
37
|
+
version: LATEST_VERSION_BY_KIND.manifest,
|
|
38
|
+
providers: {
|
|
39
|
+
enabled: [],
|
|
40
|
+
},
|
|
41
|
+
registries: {
|
|
42
|
+
default: DEFAULT_REGISTRY_ID,
|
|
43
|
+
entries: {
|
|
44
|
+
[DEFAULT_REGISTRY_ID]: { type: "local" },
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
entities: [],
|
|
48
|
+
};
|
|
49
|
+
const lock = {
|
|
50
|
+
version: LATEST_VERSION_BY_KIND.lock,
|
|
51
|
+
generatedAt: nowIso(),
|
|
52
|
+
manifestFingerprint: sha256(JSON.stringify(manifest)),
|
|
53
|
+
entities: [],
|
|
54
|
+
outputs: [],
|
|
55
|
+
};
|
|
56
|
+
const managedIndex = emptyManagedIndex();
|
|
57
|
+
await writeManifest(paths, manifest);
|
|
58
|
+
await writeLock(paths, lock);
|
|
59
|
+
await writeManagedIndex(paths, managedIndex);
|
|
60
|
+
}
|
|
61
|
+
async enableProvider(provider) {
|
|
62
|
+
await this.assertWorkspaceVersionCurrent();
|
|
63
|
+
const manifest = await readManifestOrThrow(resolveHarnessPaths(this.cwd));
|
|
64
|
+
if (!manifest.providers.enabled.includes(provider)) {
|
|
65
|
+
manifest.providers.enabled = uniqSorted([...manifest.providers.enabled, provider]);
|
|
66
|
+
await writeManifest(resolveHarnessPaths(this.cwd), manifest);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async disableProvider(provider) {
|
|
70
|
+
await this.assertWorkspaceVersionCurrent();
|
|
71
|
+
const manifest = await readManifestOrThrow(resolveHarnessPaths(this.cwd));
|
|
72
|
+
manifest.providers.enabled = manifest.providers.enabled.filter((entry) => entry !== provider);
|
|
73
|
+
await writeManifest(resolveHarnessPaths(this.cwd), manifest);
|
|
74
|
+
}
|
|
75
|
+
async listRegistries() {
|
|
76
|
+
await this.assertWorkspaceVersionCurrent();
|
|
77
|
+
const manifest = await readManifestOrThrow(resolveHarnessPaths(this.cwd));
|
|
78
|
+
return Object.entries(manifest.registries.entries)
|
|
79
|
+
.map(([id, definition]) => ({
|
|
80
|
+
id,
|
|
81
|
+
definition,
|
|
82
|
+
isDefault: id === manifest.registries.default,
|
|
83
|
+
}))
|
|
84
|
+
.sort((left, right) => left.id.localeCompare(right.id));
|
|
85
|
+
}
|
|
86
|
+
async addRegistry(name, options) {
|
|
87
|
+
await this.assertWorkspaceVersionCurrent();
|
|
88
|
+
validateRegistryId(name);
|
|
89
|
+
const manifest = await readManifestOrThrow(resolveHarnessPaths(this.cwd));
|
|
90
|
+
if (manifest.registries.entries[name]) {
|
|
91
|
+
throw new Error(`Registry '${name}' already exists`);
|
|
92
|
+
}
|
|
93
|
+
manifest.registries.entries[name] = {
|
|
94
|
+
type: "git",
|
|
95
|
+
url: options.gitUrl,
|
|
96
|
+
ref: options.ref ?? "main",
|
|
97
|
+
rootPath: options.rootPath === "." || options.rootPath === "./"
|
|
98
|
+
? undefined
|
|
99
|
+
: options.rootPath
|
|
100
|
+
? normalizeRelativePath(options.rootPath)
|
|
101
|
+
: undefined,
|
|
102
|
+
tokenEnvVar: options.tokenEnvVar,
|
|
103
|
+
};
|
|
104
|
+
await writeManifest(resolveHarnessPaths(this.cwd), manifest);
|
|
105
|
+
}
|
|
106
|
+
async removeRegistry(name) {
|
|
107
|
+
await this.assertWorkspaceVersionCurrent();
|
|
108
|
+
validateRegistryId(name);
|
|
109
|
+
const paths = resolveHarnessPaths(this.cwd);
|
|
110
|
+
const manifest = await readManifestOrThrow(resolveHarnessPaths(this.cwd));
|
|
111
|
+
if (name === DEFAULT_REGISTRY_ID) {
|
|
112
|
+
throw new Error("REGISTRY_LOCAL_IMMUTABLE: built-in 'local' registry cannot be removed");
|
|
113
|
+
}
|
|
114
|
+
if (!manifest.registries.entries[name]) {
|
|
115
|
+
throw new Error(`Registry '${name}' does not exist`);
|
|
116
|
+
}
|
|
117
|
+
if (manifest.registries.default === name) {
|
|
118
|
+
throw new Error(`Cannot remove registry '${name}' while it is default. Set a new default first.`);
|
|
119
|
+
}
|
|
120
|
+
if (manifest.entities.some((entity) => entity.registry === name)) {
|
|
121
|
+
throw new Error(`Cannot remove registry '${name}' because it is used by one or more entities`);
|
|
122
|
+
}
|
|
123
|
+
delete manifest.registries.entries[name];
|
|
124
|
+
await writeManifest(paths, manifest);
|
|
125
|
+
}
|
|
126
|
+
async setDefaultRegistry(name) {
|
|
127
|
+
await this.assertWorkspaceVersionCurrent();
|
|
128
|
+
validateRegistryId(name);
|
|
129
|
+
const manifest = await readManifestOrThrow(resolveHarnessPaths(this.cwd));
|
|
130
|
+
if (!manifest.registries.entries[name]) {
|
|
131
|
+
throw new Error(`REGISTRY_NOT_FOUND: registry '${name}' is not configured`);
|
|
132
|
+
}
|
|
133
|
+
manifest.registries.default = name;
|
|
134
|
+
await writeManifest(resolveHarnessPaths(this.cwd), manifest);
|
|
135
|
+
}
|
|
136
|
+
async getDefaultRegistry() {
|
|
137
|
+
await this.assertWorkspaceVersionCurrent();
|
|
138
|
+
const manifest = await readManifestOrThrow(resolveHarnessPaths(this.cwd));
|
|
139
|
+
return manifest.registries.default;
|
|
140
|
+
}
|
|
141
|
+
async addPrompt(options) {
|
|
142
|
+
await this.assertWorkspaceVersionCurrent();
|
|
143
|
+
await addPromptEntity(this.cwd, options);
|
|
144
|
+
}
|
|
145
|
+
async addSkill(skillId, options) {
|
|
146
|
+
await this.assertWorkspaceVersionCurrent();
|
|
147
|
+
await addSkillEntity(this.cwd, skillId, options);
|
|
148
|
+
}
|
|
149
|
+
async addMcp(configId, options) {
|
|
150
|
+
await this.assertWorkspaceVersionCurrent();
|
|
151
|
+
await addMcpEntity(this.cwd, configId, options);
|
|
152
|
+
}
|
|
153
|
+
async addSubagent(subagentId, options) {
|
|
154
|
+
await this.assertWorkspaceVersionCurrent();
|
|
155
|
+
await addSubagentEntity(this.cwd, subagentId, options);
|
|
156
|
+
}
|
|
157
|
+
async pullRegistry(options) {
|
|
158
|
+
await this.assertWorkspaceVersionCurrent();
|
|
159
|
+
return pullRegistryEntities(this.cwd, options);
|
|
160
|
+
}
|
|
161
|
+
async remove(entityTypeArg, id, deleteSource) {
|
|
162
|
+
await this.assertWorkspaceVersionCurrent();
|
|
163
|
+
return removeEntity(this.cwd, entityTypeArg, id, deleteSource);
|
|
164
|
+
}
|
|
165
|
+
async validate() {
|
|
166
|
+
const result = await this.planInternal();
|
|
167
|
+
return {
|
|
168
|
+
valid: !result.diagnostics.some((diagnostic) => diagnostic.severity === "error"),
|
|
169
|
+
diagnostics: result.diagnostics,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
async plan() {
|
|
173
|
+
const result = await this.planInternal();
|
|
174
|
+
return {
|
|
175
|
+
operations: result.operations,
|
|
176
|
+
diagnostics: result.diagnostics,
|
|
177
|
+
nextLock: result.nextLock,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
async apply() {
|
|
181
|
+
const planResult = await this.planInternal();
|
|
182
|
+
const diagnostics = planResult.diagnostics;
|
|
183
|
+
if (diagnostics.some((diagnostic) => diagnostic.severity === "error")) {
|
|
184
|
+
return {
|
|
185
|
+
...planResult,
|
|
186
|
+
writtenArtifacts: [],
|
|
187
|
+
prunedArtifacts: [],
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
const paths = resolveHarnessPaths(this.cwd);
|
|
191
|
+
const writtenArtifacts = [];
|
|
192
|
+
const prunedArtifacts = [];
|
|
193
|
+
for (const operation of planResult.operations) {
|
|
194
|
+
const absolutePath = path.join(this.cwd, operation.path);
|
|
195
|
+
if (operation.type === "create" || operation.type === "update") {
|
|
196
|
+
const artifact = planResult.artifactsByPath.get(operation.path);
|
|
197
|
+
if (!artifact) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
await ensureParentDir(absolutePath);
|
|
201
|
+
await fs.writeFile(absolutePath, artifact.content, "utf8");
|
|
202
|
+
writtenArtifacts.push(operation.path);
|
|
203
|
+
}
|
|
204
|
+
if (operation.type === "delete") {
|
|
205
|
+
await removeIfExists(absolutePath);
|
|
206
|
+
prunedArtifacts.push(operation.path);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const currentLockRaw = await readTextIfExists(paths.lockFile);
|
|
210
|
+
const nextLockRaw = stableStringify(planResult.nextLock);
|
|
211
|
+
if (currentLockRaw !== nextLockRaw) {
|
|
212
|
+
await writeLock(paths, planResult.nextLock);
|
|
213
|
+
}
|
|
214
|
+
const currentManagedIndexRaw = await readTextIfExists(paths.managedIndexFile);
|
|
215
|
+
const nextManagedIndexRaw = stableStringify(planResult.nextManagedIndex);
|
|
216
|
+
if (currentManagedIndexRaw !== nextManagedIndexRaw) {
|
|
217
|
+
await writeManagedIndex(paths, planResult.nextManagedIndex);
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
operations: planResult.operations,
|
|
221
|
+
diagnostics,
|
|
222
|
+
nextLock: planResult.nextLock,
|
|
223
|
+
writtenArtifacts: writtenArtifacts.sort((left, right) => left.localeCompare(right)),
|
|
224
|
+
prunedArtifacts: prunedArtifacts.sort((left, right) => left.localeCompare(right)),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
async watch(debounceMs = 250, options) {
|
|
228
|
+
await this.assertWorkspaceVersionCurrent();
|
|
229
|
+
const runApply = async () => {
|
|
230
|
+
const result = await this.apply();
|
|
231
|
+
printDiagnostics(result.diagnostics);
|
|
232
|
+
printApplySummary(result.writtenArtifacts, result.prunedArtifacts);
|
|
233
|
+
};
|
|
234
|
+
await runApply();
|
|
235
|
+
const base = resolveHarnessPaths(this.cwd).agentsDir;
|
|
236
|
+
const watcher = chokidar.watch([
|
|
237
|
+
path.join(base, "manifest.json"),
|
|
238
|
+
path.join(base, "src/**/*.md"),
|
|
239
|
+
path.join(base, "src/**/*.json"),
|
|
240
|
+
path.join(base, "src/**/*.overrides.*.yaml"),
|
|
241
|
+
path.join(base, "src/**/OVERRIDES.*.yaml"),
|
|
242
|
+
], {
|
|
243
|
+
ignoreInitial: true,
|
|
244
|
+
awaitWriteFinish: {
|
|
245
|
+
stabilityThreshold: 100,
|
|
246
|
+
pollInterval: 20,
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
let running = false;
|
|
250
|
+
let rerun = false;
|
|
251
|
+
let timeout = null;
|
|
252
|
+
const schedule = () => {
|
|
253
|
+
if (timeout !== null) {
|
|
254
|
+
clearTimeout(timeout);
|
|
255
|
+
}
|
|
256
|
+
timeout = setTimeout(async () => {
|
|
257
|
+
if (running) {
|
|
258
|
+
rerun = true;
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
running = true;
|
|
262
|
+
do {
|
|
263
|
+
rerun = false;
|
|
264
|
+
try {
|
|
265
|
+
await runApply();
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
const message = error instanceof Error ? error.message : "unknown watch error";
|
|
269
|
+
console.error(`[harness] watch apply failed: ${message}`);
|
|
270
|
+
}
|
|
271
|
+
} while (rerun);
|
|
272
|
+
running = false;
|
|
273
|
+
}, debounceMs);
|
|
274
|
+
};
|
|
275
|
+
watcher.on("add", schedule);
|
|
276
|
+
watcher.on("change", schedule);
|
|
277
|
+
watcher.on("unlink", schedule);
|
|
278
|
+
watcher.on("error", (error) => {
|
|
279
|
+
console.error(`[harness] watcher error: ${String(error)}`);
|
|
280
|
+
});
|
|
281
|
+
options?.onReady?.();
|
|
282
|
+
process.stdin.resume();
|
|
283
|
+
await new Promise(() => {
|
|
284
|
+
// intentional never-resolve to keep foreground watch alive
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
async doctor(_options) {
|
|
288
|
+
return runDoctor(resolveHarnessPaths(this.cwd));
|
|
289
|
+
}
|
|
290
|
+
async migrate(options) {
|
|
291
|
+
return runMigration(resolveHarnessPaths(this.cwd), {
|
|
292
|
+
to: options?.to,
|
|
293
|
+
dryRun: options?.dryRun,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
async planInternal() {
|
|
297
|
+
const paths = resolveHarnessPaths(this.cwd);
|
|
298
|
+
const versionDiagnostics = await this.versionPreflightDiagnostics();
|
|
299
|
+
if (versionDiagnostics.length > 0) {
|
|
300
|
+
return {
|
|
301
|
+
operations: [],
|
|
302
|
+
diagnostics: versionDiagnostics,
|
|
303
|
+
nextLock: {
|
|
304
|
+
version: LATEST_VERSION_BY_KIND.lock,
|
|
305
|
+
generatedAt: nowIso(),
|
|
306
|
+
manifestFingerprint: sha256("{}"),
|
|
307
|
+
entities: [],
|
|
308
|
+
outputs: [],
|
|
309
|
+
},
|
|
310
|
+
artifactsByPath: new Map(),
|
|
311
|
+
nextManagedIndex: emptyManagedIndex(),
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
const manifestResult = await loadManifest(paths);
|
|
315
|
+
const lockResult = await loadLock(paths);
|
|
316
|
+
const managedIndexResult = await loadManagedIndex(paths);
|
|
317
|
+
const diagnostics = [
|
|
318
|
+
...manifestResult.diagnostics,
|
|
319
|
+
...lockResult.diagnostics,
|
|
320
|
+
...managedIndexResult.diagnostics,
|
|
321
|
+
];
|
|
322
|
+
if (manifestResult.manifest === null) {
|
|
323
|
+
return {
|
|
324
|
+
operations: [],
|
|
325
|
+
diagnostics,
|
|
326
|
+
nextLock: {
|
|
327
|
+
version: LATEST_VERSION_BY_KIND.lock,
|
|
328
|
+
generatedAt: nowIso(),
|
|
329
|
+
manifestFingerprint: sha256("{}"),
|
|
330
|
+
entities: [],
|
|
331
|
+
outputs: [],
|
|
332
|
+
},
|
|
333
|
+
artifactsByPath: new Map(),
|
|
334
|
+
nextManagedIndex: managedIndexResult.managedIndex,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
const loaded = await loadCanonicalState(paths, manifestResult.manifest);
|
|
338
|
+
const planResult = await buildPlan(paths, {
|
|
339
|
+
...loaded,
|
|
340
|
+
diagnostics: [...diagnostics, ...loaded.diagnostics],
|
|
341
|
+
}, managedIndexResult.managedIndex, lockResult.lock);
|
|
342
|
+
return planResult;
|
|
343
|
+
}
|
|
344
|
+
async assertWorkspaceVersionCurrent(options) {
|
|
345
|
+
const diagnostics = await this.versionPreflightDiagnostics(options);
|
|
346
|
+
if (diagnostics.length === 0) {
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
const hasNewerThanCli = diagnostics.some((diagnostic) => diagnostic.code.includes("NEWER_THAN_CLI"));
|
|
350
|
+
const hasMissingWorkspace = diagnostics.some((diagnostic) => isMissingWorkspaceCode(diagnostic.code));
|
|
351
|
+
const details = diagnostics.map((diagnostic) => `${diagnostic.code}: ${diagnostic.message}`).join("\n");
|
|
352
|
+
const hint = hasMissingWorkspace
|
|
353
|
+
? "Run 'harness init' first."
|
|
354
|
+
: hasNewerThanCli
|
|
355
|
+
? "Install a newer harness CLI, then run 'harness doctor'."
|
|
356
|
+
: "Run 'harness doctor' then 'harness migrate'.";
|
|
357
|
+
throw new Error(`${details}\n${hint}`);
|
|
358
|
+
}
|
|
359
|
+
async versionPreflightDiagnostics(options) {
|
|
360
|
+
const missingWorkspace = await this.workspaceInitializationDiagnostics(options);
|
|
361
|
+
if (missingWorkspace.length > 0) {
|
|
362
|
+
return missingWorkspace;
|
|
363
|
+
}
|
|
364
|
+
const doctor = await runDoctor(resolveHarnessPaths(this.cwd));
|
|
365
|
+
let diagnostics = doctor.files.filter((status) => status.status !== "current");
|
|
366
|
+
if (options?.allowMissingManifest) {
|
|
367
|
+
diagnostics = diagnostics.filter((status) => status.code !== "MANIFEST_NOT_FOUND");
|
|
368
|
+
}
|
|
369
|
+
if (diagnostics.length === 0 || !hasVersionBlockers({ ...doctor, files: diagnostics })) {
|
|
370
|
+
return [];
|
|
371
|
+
}
|
|
372
|
+
const preflightDoctor = {
|
|
373
|
+
...doctor,
|
|
374
|
+
files: diagnostics,
|
|
375
|
+
diagnostics: preflightDiagnosticsFromDoctor(doctor.diagnostics, diagnostics),
|
|
376
|
+
};
|
|
377
|
+
return buildVersionPreflightDiagnostics(preflightDoctor);
|
|
378
|
+
}
|
|
379
|
+
async workspaceInitializationDiagnostics(options) {
|
|
380
|
+
if (options?.allowMissingManifest) {
|
|
381
|
+
return [];
|
|
382
|
+
}
|
|
383
|
+
const paths = resolveHarnessPaths(this.cwd);
|
|
384
|
+
if (await exists(paths.agentsDir)) {
|
|
385
|
+
return [];
|
|
386
|
+
}
|
|
387
|
+
return [
|
|
388
|
+
{
|
|
389
|
+
code: "WORKSPACE_NOT_INITIALIZED",
|
|
390
|
+
severity: "error",
|
|
391
|
+
message: "Harness workspace directory '.harness' does not exist. Run 'harness init' first.",
|
|
392
|
+
path: ".harness",
|
|
393
|
+
hint: "Run 'harness init' first.",
|
|
394
|
+
},
|
|
395
|
+
];
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|