@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.
Files changed (185) hide show
  1. package/dist/cli/adapters/commander.d.ts +14 -0
  2. package/dist/cli/adapters/commander.d.ts.map +1 -0
  3. package/dist/cli/adapters/commander.js +348 -0
  4. package/dist/cli/adapters/commander.js.map +1 -0
  5. package/dist/cli/adapters/interactive.d.ts +11 -0
  6. package/dist/cli/adapters/interactive.d.ts.map +1 -0
  7. package/dist/cli/adapters/interactive.js +375 -0
  8. package/dist/cli/adapters/interactive.js.map +1 -0
  9. package/dist/cli/command-registry.d.ts +27 -0
  10. package/dist/cli/command-registry.d.ts.map +1 -0
  11. package/dist/cli/command-registry.js +470 -0
  12. package/dist/cli/command-registry.js.map +1 -0
  13. package/dist/cli/contracts.d.ts +122 -0
  14. package/dist/cli/contracts.d.ts.map +1 -0
  15. package/dist/cli/contracts.js +2 -0
  16. package/dist/cli/contracts.js.map +1 -0
  17. package/dist/cli/handlers/apply.d.ts +3 -0
  18. package/dist/cli/handlers/apply.d.ts.map +1 -0
  19. package/dist/cli/handlers/apply.js +17 -0
  20. package/dist/cli/handlers/apply.js.map +1 -0
  21. package/dist/cli/handlers/doctor.d.ts +3 -0
  22. package/dist/cli/handlers/doctor.d.ts.map +1 -0
  23. package/dist/cli/handlers/doctor.js +16 -0
  24. package/dist/cli/handlers/doctor.js.map +1 -0
  25. package/dist/cli/handlers/entities.d.ts +22 -0
  26. package/dist/cli/handlers/entities.d.ts.map +1 -0
  27. package/dist/cli/handlers/entities.js +92 -0
  28. package/dist/cli/handlers/entities.js.map +1 -0
  29. package/dist/cli/handlers/init.d.ts +5 -0
  30. package/dist/cli/handlers/init.d.ts.map +1 -0
  31. package/dist/cli/handlers/init.js +17 -0
  32. package/dist/cli/handlers/init.js.map +1 -0
  33. package/dist/cli/handlers/migrate.d.ts +6 -0
  34. package/dist/cli/handlers/migrate.d.ts.map +1 -0
  35. package/dist/cli/handlers/migrate.js +22 -0
  36. package/dist/cli/handlers/migrate.js.map +1 -0
  37. package/dist/cli/handlers/plan.d.ts +5 -0
  38. package/dist/cli/handlers/plan.d.ts.map +1 -0
  39. package/dist/cli/handlers/plan.js +18 -0
  40. package/dist/cli/handlers/plan.js.map +1 -0
  41. package/dist/cli/handlers/provider.d.ts +8 -0
  42. package/dist/cli/handlers/provider.d.ts.map +1 -0
  43. package/dist/cli/handlers/provider.js +37 -0
  44. package/dist/cli/handlers/provider.js.map +1 -0
  45. package/dist/cli/handlers/registry.d.ts +27 -0
  46. package/dist/cli/handlers/registry.d.ts.map +1 -0
  47. package/dist/cli/handlers/registry.js +133 -0
  48. package/dist/cli/handlers/registry.js.map +1 -0
  49. package/dist/cli/handlers/validate.d.ts +3 -0
  50. package/dist/cli/handlers/validate.d.ts.map +1 -0
  51. package/dist/cli/handlers/validate.js +16 -0
  52. package/dist/cli/handlers/validate.js.map +1 -0
  53. package/dist/cli/handlers/watch.d.ts +6 -0
  54. package/dist/cli/handlers/watch.d.ts.map +1 -0
  55. package/dist/cli/handlers/watch.js +46 -0
  56. package/dist/cli/handlers/watch.js.map +1 -0
  57. package/dist/cli/main.d.ts +6 -0
  58. package/dist/cli/main.d.ts.map +1 -0
  59. package/dist/cli/main.js +90 -0
  60. package/dist/cli/main.js.map +1 -0
  61. package/dist/cli/renderers/json.d.ts +10 -0
  62. package/dist/cli/renderers/json.d.ts.map +1 -0
  63. package/dist/cli/renderers/json.js +17 -0
  64. package/dist/cli/renderers/json.js.map +1 -0
  65. package/dist/cli/renderers/text.d.ts +3 -0
  66. package/dist/cli/renderers/text.d.ts.map +1 -0
  67. package/dist/cli/renderers/text.js +155 -0
  68. package/dist/cli/renderers/text.js.map +1 -0
  69. package/dist/cli/utils/runtime.d.ts +26 -0
  70. package/dist/cli/utils/runtime.d.ts.map +1 -0
  71. package/dist/cli/utils/runtime.js +158 -0
  72. package/dist/cli/utils/runtime.js.map +1 -0
  73. package/dist/cli.d.ts +3 -0
  74. package/dist/cli.d.ts.map +1 -0
  75. package/dist/cli.js +14 -0
  76. package/dist/cli.js.map +1 -0
  77. package/dist/engine/entities.d.ts +33 -0
  78. package/dist/engine/entities.d.ts.map +1 -0
  79. package/dist/engine/entities.js +461 -0
  80. package/dist/engine/entities.js.map +1 -0
  81. package/dist/engine/state.d.ts +19 -0
  82. package/dist/engine/state.d.ts.map +1 -0
  83. package/dist/engine/state.js +70 -0
  84. package/dist/engine/state.js.map +1 -0
  85. package/dist/engine/utils.d.ts +28 -0
  86. package/dist/engine/utils.d.ts.map +1 -0
  87. package/dist/engine/utils.js +157 -0
  88. package/dist/engine/utils.js.map +1 -0
  89. package/dist/engine.d.ts +59 -0
  90. package/dist/engine.d.ts.map +1 -0
  91. package/dist/engine.js +398 -0
  92. package/dist/engine.js.map +1 -0
  93. package/dist/entity-registries.d.ts +40 -0
  94. package/dist/entity-registries.d.ts.map +1 -0
  95. package/dist/entity-registries.js +257 -0
  96. package/dist/entity-registries.js.map +1 -0
  97. package/dist/index.d.ts +19 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +22 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/loader.d.ts +6 -0
  102. package/dist/loader.d.ts.map +1 -0
  103. package/dist/loader.js +552 -0
  104. package/dist/loader.js.map +1 -0
  105. package/dist/paths.d.ts +23 -0
  106. package/dist/paths.d.ts.map +1 -0
  107. package/dist/paths.js +40 -0
  108. package/dist/paths.js.map +1 -0
  109. package/dist/planner.d.ts +5 -0
  110. package/dist/planner.d.ts.map +1 -0
  111. package/dist/planner.js +316 -0
  112. package/dist/planner.js.map +1 -0
  113. package/dist/provider-adapters/claude.d.ts +4 -0
  114. package/dist/provider-adapters/claude.d.ts.map +1 -0
  115. package/dist/provider-adapters/claude.js +36 -0
  116. package/dist/provider-adapters/claude.js.map +1 -0
  117. package/dist/provider-adapters/codex.d.ts +4 -0
  118. package/dist/provider-adapters/codex.d.ts.map +1 -0
  119. package/dist/provider-adapters/codex.js +93 -0
  120. package/dist/provider-adapters/codex.js.map +1 -0
  121. package/dist/provider-adapters/constants.d.ts +21 -0
  122. package/dist/provider-adapters/constants.d.ts.map +1 -0
  123. package/dist/provider-adapters/constants.js +21 -0
  124. package/dist/provider-adapters/constants.js.map +1 -0
  125. package/dist/provider-adapters/copilot.d.ts +4 -0
  126. package/dist/provider-adapters/copilot.d.ts.map +1 -0
  127. package/dist/provider-adapters/copilot.js +37 -0
  128. package/dist/provider-adapters/copilot.js.map +1 -0
  129. package/dist/provider-adapters/create-adapter.d.ts +4 -0
  130. package/dist/provider-adapters/create-adapter.d.ts.map +1 -0
  131. package/dist/provider-adapters/create-adapter.js +67 -0
  132. package/dist/provider-adapters/create-adapter.js.map +1 -0
  133. package/dist/provider-adapters/mcp.d.ts +4 -0
  134. package/dist/provider-adapters/mcp.d.ts.map +1 -0
  135. package/dist/provider-adapters/mcp.js +40 -0
  136. package/dist/provider-adapters/mcp.js.map +1 -0
  137. package/dist/provider-adapters/registry.d.ts +4 -0
  138. package/dist/provider-adapters/registry.d.ts.map +1 -0
  139. package/dist/provider-adapters/registry.js +11 -0
  140. package/dist/provider-adapters/registry.js.map +1 -0
  141. package/dist/provider-adapters/renderers.d.ts +3 -0
  142. package/dist/provider-adapters/renderers.d.ts.map +1 -0
  143. package/dist/provider-adapters/renderers.js +10 -0
  144. package/dist/provider-adapters/renderers.js.map +1 -0
  145. package/dist/provider-adapters/subagents.d.ts +19 -0
  146. package/dist/provider-adapters/subagents.d.ts.map +1 -0
  147. package/dist/provider-adapters/subagents.js +58 -0
  148. package/dist/provider-adapters/subagents.js.map +1 -0
  149. package/dist/provider-adapters/types.d.ts +18 -0
  150. package/dist/provider-adapters/types.d.ts.map +1 -0
  151. package/dist/provider-adapters/types.js +2 -0
  152. package/dist/provider-adapters/types.js.map +1 -0
  153. package/dist/providers.d.ts +6 -0
  154. package/dist/providers.d.ts.map +1 -0
  155. package/dist/providers.js +15 -0
  156. package/dist/providers.js.map +1 -0
  157. package/dist/registry-validator.d.ts +3 -0
  158. package/dist/registry-validator.d.ts.map +1 -0
  159. package/dist/registry-validator.js +222 -0
  160. package/dist/registry-validator.js.map +1 -0
  161. package/dist/repository.d.ts +36 -0
  162. package/dist/repository.d.ts.map +1 -0
  163. package/dist/repository.js +314 -0
  164. package/dist/repository.js.map +1 -0
  165. package/dist/types.d.ts +190 -0
  166. package/dist/types.d.ts.map +1 -0
  167. package/dist/types.js +11 -0
  168. package/dist/types.js.map +1 -0
  169. package/dist/utils.d.ts +16 -0
  170. package/dist/utils.d.ts.map +1 -0
  171. package/dist/utils.js +115 -0
  172. package/dist/utils.js.map +1 -0
  173. package/dist/versioning/doctor.d.ts +6 -0
  174. package/dist/versioning/doctor.d.ts.map +1 -0
  175. package/dist/versioning/doctor.js +284 -0
  176. package/dist/versioning/doctor.js.map +1 -0
  177. package/dist/versioning/migrate.d.ts +9 -0
  178. package/dist/versioning/migrate.d.ts.map +1 -0
  179. package/dist/versioning/migrate.js +362 -0
  180. package/dist/versioning/migrate.js.map +1 -0
  181. package/dist/versioning/registry.d.ts +18 -0
  182. package/dist/versioning/registry.d.ts.map +1 -0
  183. package/dist/versioning/registry.js +63 -0
  184. package/dist/versioning/registry.js.map +1 -0
  185. package/package.json +52 -0
package/dist/loader.js ADDED
@@ -0,0 +1,552 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { DEFAULT_REGISTRY_ID, providerIdSchema } from "@madebywild/agent-harness-manifest";
4
+ import matter from "gray-matter";
5
+ import { DEFAULT_PROMPT_SOURCE_PATH, defaultMcpOverridePath, defaultPromptOverridePath, defaultSkillOverridePath, defaultSubagentOverridePath, } from "./paths.js";
6
+ import { collectManagedSourcePaths, collectSourceCandidates, listFilesRecursively, readProviderOverrideFile, } from "./repository.js";
7
+ import { normalizeRelativePath, sha256, stableStringify, toPosixRelative } from "./utils.js";
8
+ export async function loadCanonicalState(paths, manifest) {
9
+ const diagnostics = [];
10
+ diagnostics.push(...validateManifestSemantics(manifest));
11
+ diagnostics.push(...buildProviderEnablementDiagnostics(manifest));
12
+ const candidates = await collectSourceCandidates(paths);
13
+ const registeredSourcePaths = new Set(collectManagedSourcePaths(manifest));
14
+ for (const candidate of candidates) {
15
+ if (!registeredSourcePaths.has(candidate)) {
16
+ diagnostics.push({
17
+ code: "SOURCE_UNREGISTERED",
18
+ severity: "error",
19
+ message: `Source file '${candidate}' was not created through the CLI and is not registered in manifest`,
20
+ hint: "Use 'harness add ...' to create entities, or remove the unmanaged file.",
21
+ path: candidate,
22
+ });
23
+ }
24
+ }
25
+ const promptEntities = manifest.entities.filter((entity) => entity.type === "prompt" && entity.enabled !== false);
26
+ let prompt;
27
+ if (promptEntities.length === 1) {
28
+ const promptEntity = promptEntities[0];
29
+ if (promptEntity) {
30
+ const loadedPrompt = await loadPrompt(paths, promptEntity);
31
+ diagnostics.push(...loadedPrompt.diagnostics);
32
+ prompt = loadedPrompt.prompt;
33
+ }
34
+ }
35
+ const skillEntities = manifest.entities.filter((entity) => entity.type === "skill" && entity.enabled !== false);
36
+ const skills = [];
37
+ for (const skillEntity of skillEntities) {
38
+ const loadedSkill = await loadSkill(paths, skillEntity);
39
+ diagnostics.push(...loadedSkill.diagnostics);
40
+ if (loadedSkill.skill) {
41
+ skills.push(loadedSkill.skill);
42
+ }
43
+ }
44
+ const mcpEntities = manifest.entities.filter((entity) => entity.type === "mcp_config" && entity.enabled !== false);
45
+ const mcps = [];
46
+ for (const mcpEntity of mcpEntities) {
47
+ const loadedMcp = await loadMcp(paths, mcpEntity);
48
+ diagnostics.push(...loadedMcp.diagnostics);
49
+ if (loadedMcp.mcp) {
50
+ mcps.push(loadedMcp.mcp);
51
+ }
52
+ }
53
+ const subagentEntities = manifest.entities.filter((entity) => entity.type === "subagent" && entity.enabled !== false);
54
+ const subagents = [];
55
+ for (const subagentEntity of subagentEntities) {
56
+ const loadedSubagent = await loadSubagent(paths, subagentEntity);
57
+ diagnostics.push(...loadedSubagent.diagnostics);
58
+ if (loadedSubagent.subagent) {
59
+ subagents.push(loadedSubagent.subagent);
60
+ }
61
+ }
62
+ return {
63
+ manifest,
64
+ diagnostics,
65
+ prompt,
66
+ skills: skills.sort((left, right) => left.entity.id.localeCompare(right.entity.id)),
67
+ mcps: mcps.sort((left, right) => left.entity.id.localeCompare(right.entity.id)),
68
+ subagents: subagents.sort((left, right) => left.entity.id.localeCompare(right.entity.id)),
69
+ };
70
+ }
71
+ function buildProviderEnablementDiagnostics(manifest) {
72
+ const hasEnabledEntities = manifest.entities.some((entity) => entity.enabled !== false);
73
+ if (!hasEnabledEntities || manifest.providers.enabled.length > 0) {
74
+ return [];
75
+ }
76
+ return [
77
+ {
78
+ code: "NO_PROVIDERS_ENABLED",
79
+ severity: "warning",
80
+ message: "No providers are enabled, so apply will not generate any artifacts.",
81
+ path: ".harness/manifest.json",
82
+ hint: "Run 'harness provider enable <codex|claude|copilot>' before running apply.",
83
+ },
84
+ ];
85
+ }
86
+ export function validateManifestSemantics(manifest) {
87
+ const diagnostics = [];
88
+ const registryEntries = manifest.registries.entries;
89
+ const providerSet = new Set();
90
+ for (const provider of manifest.providers.enabled) {
91
+ if (providerSet.has(provider)) {
92
+ diagnostics.push({
93
+ code: "PROVIDER_DUPLICATE",
94
+ severity: "error",
95
+ message: `Provider '${provider}' is listed multiple times in providers.enabled`,
96
+ path: ".harness/manifest.json",
97
+ });
98
+ }
99
+ providerSet.add(provider);
100
+ }
101
+ const localRegistry = registryEntries[DEFAULT_REGISTRY_ID];
102
+ if (!localRegistry || localRegistry.type !== "local") {
103
+ diagnostics.push({
104
+ code: "REGISTRY_NOT_FOUND",
105
+ severity: "error",
106
+ message: "Manifest registries.entries must include built-in 'local' registry with type 'local'",
107
+ path: ".harness/manifest.json",
108
+ });
109
+ }
110
+ if (!registryEntries[manifest.registries.default]) {
111
+ diagnostics.push({
112
+ code: "REGISTRY_DEFAULT_INVALID",
113
+ severity: "error",
114
+ message: `Default registry '${manifest.registries.default}' is not defined in registries.entries`,
115
+ path: ".harness/manifest.json",
116
+ });
117
+ }
118
+ const registryIds = new Set(Object.keys(registryEntries));
119
+ const gitRegistryEntries = Object.entries(registryEntries).filter(([, entry]) => entry.type === "git");
120
+ for (const [registryId, definition] of gitRegistryEntries) {
121
+ validateGitRegistryEntry(registryId, definition, diagnostics);
122
+ }
123
+ const entityIdSet = new Set();
124
+ let promptCount = 0;
125
+ for (const entity of manifest.entities) {
126
+ if (entityIdSet.has(entity.id)) {
127
+ diagnostics.push({
128
+ code: "ENTITY_ID_DUPLICATE",
129
+ severity: "error",
130
+ message: `Entity id '${entity.id}' appears multiple times in manifest`,
131
+ path: ".harness/manifest.json",
132
+ entityId: entity.id,
133
+ });
134
+ }
135
+ entityIdSet.add(entity.id);
136
+ if (!registryIds.has(entity.registry)) {
137
+ diagnostics.push({
138
+ code: "REGISTRY_NOT_FOUND",
139
+ severity: "error",
140
+ message: `Entity '${entity.id}' references unknown registry '${entity.registry}'`,
141
+ path: ".harness/manifest.json",
142
+ entityId: entity.id,
143
+ });
144
+ }
145
+ const sourcePath = normalizeRelativePath(entity.sourcePath);
146
+ if (entity.type === "prompt") {
147
+ promptCount += 1;
148
+ if (entity.id !== "system") {
149
+ diagnostics.push({
150
+ code: "PROMPT_ID_INVALID",
151
+ severity: "error",
152
+ message: `Prompt entity id must be 'system' in v1, found '${entity.id}'`,
153
+ path: sourcePath,
154
+ entityId: entity.id,
155
+ });
156
+ }
157
+ if (sourcePath !== DEFAULT_PROMPT_SOURCE_PATH) {
158
+ diagnostics.push({
159
+ code: "PROMPT_SOURCE_INVALID",
160
+ severity: "error",
161
+ message: `Prompt sourcePath must be '${DEFAULT_PROMPT_SOURCE_PATH}' in v1`,
162
+ path: sourcePath,
163
+ entityId: entity.id,
164
+ });
165
+ }
166
+ }
167
+ if (entity.type === "skill") {
168
+ const expectedPath = `.harness/src/skills/${entity.id}/SKILL.md`;
169
+ if (sourcePath !== expectedPath) {
170
+ diagnostics.push({
171
+ code: "SKILL_SOURCE_INVALID",
172
+ severity: "error",
173
+ message: `Skill '${entity.id}' sourcePath must be '${expectedPath}'`,
174
+ path: sourcePath,
175
+ entityId: entity.id,
176
+ });
177
+ }
178
+ }
179
+ if (entity.type === "mcp_config") {
180
+ const expectedPath = `.harness/src/mcp/${entity.id}.json`;
181
+ if (sourcePath !== expectedPath) {
182
+ diagnostics.push({
183
+ code: "MCP_SOURCE_INVALID",
184
+ severity: "error",
185
+ message: `MCP config '${entity.id}' sourcePath must be '${expectedPath}'`,
186
+ path: sourcePath,
187
+ entityId: entity.id,
188
+ });
189
+ }
190
+ }
191
+ if (entity.type === "subagent") {
192
+ const expectedPath = `.harness/src/subagents/${entity.id}.md`;
193
+ if (sourcePath !== expectedPath) {
194
+ diagnostics.push({
195
+ code: "SUBAGENT_SOURCE_INVALID",
196
+ severity: "error",
197
+ message: `Subagent '${entity.id}' sourcePath must be '${expectedPath}'`,
198
+ path: sourcePath,
199
+ entityId: entity.id,
200
+ });
201
+ }
202
+ }
203
+ }
204
+ if (promptCount > 1) {
205
+ diagnostics.push({
206
+ code: "PROMPT_COUNT_INVALID",
207
+ severity: "error",
208
+ message: "v1 supports exactly zero or one prompt entity",
209
+ path: ".harness/manifest.json",
210
+ });
211
+ }
212
+ return diagnostics;
213
+ }
214
+ function validateGitRegistryEntry(registryId, definition, diagnostics) {
215
+ if (definition.type !== "git") {
216
+ return;
217
+ }
218
+ if (definition.tokenEnvVar && !/^[A-Z_][A-Z0-9_]*$/u.test(definition.tokenEnvVar)) {
219
+ diagnostics.push({
220
+ code: "REGISTRY_INVALID",
221
+ severity: "error",
222
+ message: `Registry '${registryId}' tokenEnvVar must be a valid environment variable name`,
223
+ path: ".harness/manifest.json",
224
+ });
225
+ }
226
+ }
227
+ async function loadPrompt(paths, entity) {
228
+ const diagnostics = [];
229
+ const sourcePath = normalizeRelativePath(entity.sourcePath);
230
+ const sourceAbs = path.join(paths.root, sourcePath);
231
+ let text;
232
+ try {
233
+ text = await fs.readFile(sourceAbs, "utf8");
234
+ }
235
+ catch (error) {
236
+ diagnostics.push({
237
+ code: "PROMPT_SOURCE_MISSING",
238
+ severity: "error",
239
+ message: `Prompt source file '${sourcePath}' could not be read`,
240
+ path: sourcePath,
241
+ entityId: entity.id,
242
+ hint: error instanceof Error ? error.message : undefined,
243
+ });
244
+ return { diagnostics };
245
+ }
246
+ const parsed = matter(text);
247
+ const body = parsed.content.trim();
248
+ if (!body) {
249
+ diagnostics.push({
250
+ code: "PROMPT_EMPTY",
251
+ severity: "error",
252
+ message: `Prompt '${entity.id}' cannot be empty`,
253
+ path: sourcePath,
254
+ entityId: entity.id,
255
+ });
256
+ }
257
+ const overrideByProvider = new Map();
258
+ const overrideShaByProvider = {};
259
+ for (const provider of providerIdSchema.options) {
260
+ const parsedOverride = await parseOverride(paths, provider, entity, entity.overrides?.[provider] ?? defaultPromptOverridePath(provider));
261
+ diagnostics.push(...parsedOverride.diagnostics);
262
+ overrideByProvider.set(provider, parsedOverride.override);
263
+ if (parsedOverride.sha256) {
264
+ overrideShaByProvider[provider] = parsedOverride.sha256;
265
+ }
266
+ }
267
+ return {
268
+ diagnostics,
269
+ prompt: {
270
+ entity,
271
+ canonical: {
272
+ id: entity.id,
273
+ body,
274
+ frontmatter: parsed.data ?? {},
275
+ },
276
+ sourceSha256: sha256(text),
277
+ overrideByProvider,
278
+ overrideShaByProvider,
279
+ },
280
+ };
281
+ }
282
+ async function loadSkill(paths, entity) {
283
+ const diagnostics = [];
284
+ const sourcePath = normalizeRelativePath(entity.sourcePath);
285
+ const sourceAbs = path.join(paths.root, sourcePath);
286
+ const sourceDir = path.dirname(sourceAbs);
287
+ const sourceExists = await fs
288
+ .stat(sourceAbs)
289
+ .then((stat) => stat.isFile())
290
+ .catch(() => false);
291
+ if (!sourceExists) {
292
+ diagnostics.push({
293
+ code: "SKILL_SOURCE_MISSING",
294
+ severity: "error",
295
+ message: `Skill source '${sourcePath}' could not be read`,
296
+ path: sourcePath,
297
+ entityId: entity.id,
298
+ });
299
+ return { diagnostics };
300
+ }
301
+ const filesInDir = await listFilesRecursively(sourceDir);
302
+ const filesWithContent = [];
303
+ for (const absolutePath of filesInDir) {
304
+ const relativeFromRoot = toPosixRelative(absolutePath, paths.root);
305
+ if (/\.ya?ml$/u.test(relativeFromRoot) && /OVERRIDES\.[a-z]+\.yaml$/u.test(path.basename(relativeFromRoot))) {
306
+ continue;
307
+ }
308
+ const relativeInSkill = normalizeRelativePath(path.relative(sourceDir, absolutePath).replace(/\\/g, "/"));
309
+ const content = await fs.readFile(absolutePath, "utf8");
310
+ filesWithContent.push({
311
+ path: relativeInSkill,
312
+ sha256: sha256(content),
313
+ content,
314
+ });
315
+ }
316
+ const hasSkillMd = filesWithContent.some((file) => file.path === "SKILL.md");
317
+ if (!hasSkillMd) {
318
+ diagnostics.push({
319
+ code: "SKILL_MARKDOWN_MISSING",
320
+ severity: "error",
321
+ message: `Skill '${entity.id}' must contain SKILL.md`,
322
+ path: sourcePath,
323
+ entityId: entity.id,
324
+ });
325
+ }
326
+ const overrideByProvider = new Map();
327
+ const overrideShaByProvider = {};
328
+ for (const provider of providerIdSchema.options) {
329
+ const parsedOverride = await parseOverride(paths, provider, entity, entity.overrides?.[provider] ?? defaultSkillOverridePath(entity.id, provider));
330
+ diagnostics.push(...parsedOverride.diagnostics);
331
+ overrideByProvider.set(provider, parsedOverride.override);
332
+ if (parsedOverride.sha256) {
333
+ overrideShaByProvider[provider] = parsedOverride.sha256;
334
+ }
335
+ }
336
+ const normalizedFiles = filesWithContent
337
+ .map((file) => ({ path: file.path, sha256: file.sha256 }))
338
+ .sort((left, right) => left.path.localeCompare(right.path));
339
+ return {
340
+ diagnostics,
341
+ skill: {
342
+ entity,
343
+ canonical: {
344
+ id: entity.id,
345
+ files: normalizedFiles,
346
+ },
347
+ filesWithContent: filesWithContent.sort((left, right) => left.path.localeCompare(right.path)),
348
+ sourceSha256: sha256(stableStringify(normalizedFiles)),
349
+ overrideByProvider,
350
+ overrideShaByProvider,
351
+ },
352
+ };
353
+ }
354
+ async function loadMcp(paths, entity) {
355
+ const diagnostics = [];
356
+ const sourcePath = normalizeRelativePath(entity.sourcePath);
357
+ const sourceAbs = path.join(paths.root, sourcePath);
358
+ let text;
359
+ try {
360
+ text = await fs.readFile(sourceAbs, "utf8");
361
+ }
362
+ catch {
363
+ diagnostics.push({
364
+ code: "MCP_SOURCE_MISSING",
365
+ severity: "error",
366
+ message: `MCP source '${sourcePath}' could not be read`,
367
+ path: sourcePath,
368
+ entityId: entity.id,
369
+ });
370
+ return { diagnostics };
371
+ }
372
+ let json;
373
+ try {
374
+ const parsed = JSON.parse(text);
375
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
376
+ throw new Error("MCP config must be a JSON object");
377
+ }
378
+ json = parsed;
379
+ }
380
+ catch (error) {
381
+ diagnostics.push({
382
+ code: "MCP_JSON_INVALID",
383
+ severity: "error",
384
+ message: `MCP config '${entity.id}' is not valid JSON object: ${error instanceof Error ? error.message : "unknown error"}`,
385
+ path: sourcePath,
386
+ entityId: entity.id,
387
+ });
388
+ return { diagnostics };
389
+ }
390
+ const overrideByProvider = new Map();
391
+ const overrideShaByProvider = {};
392
+ for (const provider of providerIdSchema.options) {
393
+ const parsedOverride = await parseOverride(paths, provider, entity, entity.overrides?.[provider] ?? defaultMcpOverridePath(entity.id, provider));
394
+ diagnostics.push(...parsedOverride.diagnostics);
395
+ overrideByProvider.set(provider, parsedOverride.override);
396
+ if (parsedOverride.sha256) {
397
+ overrideShaByProvider[provider] = parsedOverride.sha256;
398
+ }
399
+ }
400
+ return {
401
+ diagnostics,
402
+ mcp: {
403
+ entity,
404
+ canonical: {
405
+ id: entity.id,
406
+ json,
407
+ },
408
+ sourceSha256: sha256(stableStringify(json)),
409
+ overrideByProvider,
410
+ overrideShaByProvider,
411
+ },
412
+ };
413
+ }
414
+ async function loadSubagent(paths, entity) {
415
+ const diagnostics = [];
416
+ const sourcePath = normalizeRelativePath(entity.sourcePath);
417
+ const sourceAbs = path.join(paths.root, sourcePath);
418
+ let text;
419
+ try {
420
+ text = await fs.readFile(sourceAbs, "utf8");
421
+ }
422
+ catch {
423
+ diagnostics.push({
424
+ code: "SUBAGENT_SOURCE_MISSING",
425
+ severity: "error",
426
+ message: `Subagent source '${sourcePath}' could not be read`,
427
+ path: sourcePath,
428
+ entityId: entity.id,
429
+ });
430
+ return { diagnostics };
431
+ }
432
+ let parsed;
433
+ try {
434
+ parsed = matter(text);
435
+ }
436
+ catch (error) {
437
+ diagnostics.push({
438
+ code: "SUBAGENT_FRONTMATTER_INVALID",
439
+ severity: "error",
440
+ message: `Subagent '${entity.id}' frontmatter is invalid: ${error instanceof Error ? error.message : "unknown error"}`,
441
+ path: sourcePath,
442
+ entityId: entity.id,
443
+ });
444
+ return { diagnostics };
445
+ }
446
+ if (!parsed.data || typeof parsed.data !== "object" || Array.isArray(parsed.data)) {
447
+ diagnostics.push({
448
+ code: "SUBAGENT_FRONTMATTER_INVALID",
449
+ severity: "error",
450
+ message: `Subagent '${entity.id}' frontmatter must be a YAML object`,
451
+ path: sourcePath,
452
+ entityId: entity.id,
453
+ });
454
+ return { diagnostics };
455
+ }
456
+ const frontmatter = parsed.data;
457
+ const name = typeof frontmatter.name === "string" ? frontmatter.name.trim() : "";
458
+ const description = typeof frontmatter.description === "string" ? frontmatter.description.trim() : "";
459
+ const body = parsed.content.trim();
460
+ if (!name) {
461
+ diagnostics.push({
462
+ code: "SUBAGENT_NAME_REQUIRED",
463
+ severity: "error",
464
+ message: `Subagent '${entity.id}' requires a non-empty frontmatter name`,
465
+ path: sourcePath,
466
+ entityId: entity.id,
467
+ });
468
+ }
469
+ if (!description) {
470
+ diagnostics.push({
471
+ code: "SUBAGENT_DESCRIPTION_REQUIRED",
472
+ severity: "error",
473
+ message: `Subagent '${entity.id}' requires a non-empty frontmatter description`,
474
+ path: sourcePath,
475
+ entityId: entity.id,
476
+ });
477
+ }
478
+ if (!body) {
479
+ diagnostics.push({
480
+ code: "SUBAGENT_EMPTY",
481
+ severity: "error",
482
+ message: `Subagent '${entity.id}' cannot be empty`,
483
+ path: sourcePath,
484
+ entityId: entity.id,
485
+ });
486
+ }
487
+ const metadata = Object.fromEntries(Object.entries(frontmatter).filter(([key]) => key !== "name" && key !== "description"));
488
+ const overrideByProvider = new Map();
489
+ const overrideShaByProvider = {};
490
+ for (const provider of providerIdSchema.options) {
491
+ const overridePath = entity.overrides?.[provider] ?? defaultSubagentOverridePath(entity.id, provider);
492
+ const parsedOverride = await parseOverride(paths, provider, entity, overridePath);
493
+ diagnostics.push(...parsedOverride.diagnostics);
494
+ diagnostics.push(...validateSubagentOverrideOptions(entity.id, provider, parsedOverride.override, overridePath));
495
+ overrideByProvider.set(provider, parsedOverride.override);
496
+ if (parsedOverride.sha256) {
497
+ overrideShaByProvider[provider] = parsedOverride.sha256;
498
+ }
499
+ }
500
+ return {
501
+ diagnostics,
502
+ subagent: {
503
+ entity,
504
+ canonical: {
505
+ id: entity.id,
506
+ name: name || entity.id,
507
+ description,
508
+ body,
509
+ metadata,
510
+ },
511
+ sourceSha256: sha256(text),
512
+ overrideByProvider,
513
+ overrideShaByProvider,
514
+ },
515
+ };
516
+ }
517
+ async function parseOverride(paths, provider, entity, pathValue) {
518
+ return readProviderOverrideFile(paths.root, provider, pathValue).then((result) => ({
519
+ ...result,
520
+ diagnostics: result.diagnostics.map((diagnostic) => ({
521
+ ...diagnostic,
522
+ entityId: diagnostic.entityId ?? entity.id,
523
+ })),
524
+ }));
525
+ }
526
+ function validateSubagentOverrideOptions(entityId, provider, override, overridePath) {
527
+ const options = override?.options;
528
+ if (!options || typeof options !== "object" || Array.isArray(options)) {
529
+ return [];
530
+ }
531
+ const allowed = new Set(provider === "codex"
532
+ ? ["model", "tools"]
533
+ : provider === "claude"
534
+ ? ["model", "tools"]
535
+ : ["model", "tools", "handoffs"]);
536
+ const unknown = Object.keys(options).filter((key) => !allowed.has(key));
537
+ if (unknown.length === 0) {
538
+ return [];
539
+ }
540
+ return [
541
+ {
542
+ code: "SUBAGENT_OPTIONS_UNKNOWN",
543
+ severity: "warning",
544
+ message: `Subagent '${entityId}' has unknown ${provider} override option(s): ${unknown.sort().join(", ")}`,
545
+ path: normalizeRelativePath(overridePath),
546
+ entityId,
547
+ provider,
548
+ hint: "Unknown keys are ignored.",
549
+ },
550
+ ];
551
+ }
552
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ProviderId } from "./types.js";
2
+ export interface HarnessPaths {
3
+ root: string;
4
+ agentsDir: string;
5
+ srcDir: string;
6
+ manifestFile: string;
7
+ lockFile: string;
8
+ managedIndexFile: string;
9
+ promptDir: string;
10
+ skillDir: string;
11
+ mcpDir: string;
12
+ subagentDir: string;
13
+ }
14
+ export declare function resolveHarnessPaths(rootDir: string): HarnessPaths;
15
+ export declare const DEFAULT_PROMPT_SOURCE_PATH = ".harness/src/prompts/system.md";
16
+ export declare function defaultPromptOverridePath(provider: ProviderId): string;
17
+ export declare function defaultSkillSourcePath(skillId: string): string;
18
+ export declare function defaultSkillOverridePath(skillId: string, provider: ProviderId): string;
19
+ export declare function defaultMcpSourcePath(id: string): string;
20
+ export declare function defaultMcpOverridePath(id: string, provider: ProviderId): string;
21
+ export declare function defaultSubagentSourcePath(id: string): string;
22
+ export declare function defaultSubagentOverridePath(id: string, provider: ProviderId): string;
23
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAejE;AAED,eAAO,MAAM,0BAA0B,mCAAmC,CAAC;AAE3E,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAEtE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,CAEtF;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,CAE/E;AAED,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,CAEpF"}
package/dist/paths.js ADDED
@@ -0,0 +1,40 @@
1
+ import path from "node:path";
2
+ export function resolveHarnessPaths(rootDir) {
3
+ const harnessDir = path.join(rootDir, ".harness");
4
+ const srcDir = path.join(harnessDir, "src");
5
+ return {
6
+ root: rootDir,
7
+ agentsDir: harnessDir,
8
+ srcDir,
9
+ manifestFile: path.join(harnessDir, "manifest.json"),
10
+ lockFile: path.join(harnessDir, "manifest.lock.json"),
11
+ managedIndexFile: path.join(harnessDir, "managed-index.json"),
12
+ promptDir: path.join(srcDir, "prompts"),
13
+ skillDir: path.join(srcDir, "skills"),
14
+ mcpDir: path.join(srcDir, "mcp"),
15
+ subagentDir: path.join(srcDir, "subagents"),
16
+ };
17
+ }
18
+ export const DEFAULT_PROMPT_SOURCE_PATH = ".harness/src/prompts/system.md";
19
+ export function defaultPromptOverridePath(provider) {
20
+ return `.harness/src/prompts/system.overrides.${provider}.yaml`;
21
+ }
22
+ export function defaultSkillSourcePath(skillId) {
23
+ return `.harness/src/skills/${skillId}/SKILL.md`;
24
+ }
25
+ export function defaultSkillOverridePath(skillId, provider) {
26
+ return `.harness/src/skills/${skillId}/OVERRIDES.${provider}.yaml`;
27
+ }
28
+ export function defaultMcpSourcePath(id) {
29
+ return `.harness/src/mcp/${id}.json`;
30
+ }
31
+ export function defaultMcpOverridePath(id, provider) {
32
+ return `.harness/src/mcp/${id}.overrides.${provider}.yaml`;
33
+ }
34
+ export function defaultSubagentSourcePath(id) {
35
+ return `.harness/src/subagents/${id}.md`;
36
+ }
37
+ export function defaultSubagentOverridePath(id, provider) {
38
+ return `.harness/src/subagents/${id}.overrides.${provider}.yaml`;
39
+ }
40
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAgB7B,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO;QACL,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,UAAU;QACrB,MAAM;QACN,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC;QACpD,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC;QACrD,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC;QAC7D,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;QACvC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;QACrC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;QAChC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,gCAAgC,CAAC;AAE3E,MAAM,UAAU,yBAAyB,CAAC,QAAoB;IAC5D,OAAO,yCAAyC,QAAQ,OAAO,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,OAAO,uBAAuB,OAAO,WAAW,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAe,EAAE,QAAoB;IAC5E,OAAO,uBAAuB,OAAO,cAAc,QAAQ,OAAO,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAU;IAC7C,OAAO,oBAAoB,EAAE,OAAO,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,EAAU,EAAE,QAAoB;IACrE,OAAO,oBAAoB,EAAE,cAAc,QAAQ,OAAO,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,EAAU;IAClD,OAAO,0BAA0B,EAAE,KAAK,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,EAAU,EAAE,QAAoB;IAC1E,OAAO,0BAA0B,EAAE,cAAc,QAAQ,OAAO,CAAC;AACnE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ManagedIndex, ManifestLock } from "@madebywild/agent-harness-manifest";
2
+ import type { HarnessPaths } from "./paths.js";
3
+ import type { InternalPlanResult, LoadResult } from "./types.js";
4
+ export declare function buildPlan(paths: HarnessPaths, loaded: LoadResult, managedIndex: ManagedIndex, previousLock: ManifestLock | null): Promise<InternalPlanResult>;
5
+ //# sourceMappingURL=planner.d.ts.map