@agntn/harnesses 0.3.0 → 0.4.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.
Files changed (50) hide show
  1. package/README.md +35 -5
  2. package/dist/_chunks/agents.mjs +5 -3
  3. package/dist/_chunks/agents.mjs.map +1 -1
  4. package/dist/_chunks/mcp-servers.mjs +5 -3
  5. package/dist/_chunks/mcp-servers.mjs.map +1 -1
  6. package/dist/_chunks/mcp.mjs +10 -1
  7. package/dist/_chunks/mcp.mjs.map +1 -1
  8. package/dist/_chunks/output.mjs +7 -1
  9. package/dist/_chunks/output.mjs.map +1 -1
  10. package/dist/_chunks/prompts.mjs +4 -2
  11. package/dist/_chunks/prompts.mjs.map +1 -1
  12. package/dist/_chunks/{prompt-sync.d.mts → skills-sync.d.mts} +111 -53
  13. package/dist/_chunks/skills-sync.d.mts.map +1 -0
  14. package/dist/_chunks/{prompt-sync.mjs → skills-sync.mjs} +392 -100
  15. package/dist/_chunks/skills-sync.mjs.map +1 -0
  16. package/dist/_chunks/skills.mjs +30 -0
  17. package/dist/_chunks/skills.mjs.map +1 -0
  18. package/dist/_chunks/tool-operations.mjs +36 -8
  19. package/dist/_chunks/tool-operations.mjs.map +1 -1
  20. package/dist/_chunks/tool-schemas.d.mts +21 -13
  21. package/dist/_chunks/tool-schemas.d.mts.map +1 -1
  22. package/dist/_chunks/tool-schemas.mjs +7 -1
  23. package/dist/_chunks/tool-schemas.mjs.map +1 -1
  24. package/dist/_chunks/types.mjs +5 -2
  25. package/dist/_chunks/types.mjs.map +1 -1
  26. package/dist/cli.mjs +9 -3
  27. package/dist/cli.mjs.map +1 -1
  28. package/dist/index.d.mts +16 -2
  29. package/dist/index.d.mts.map +1 -1
  30. package/dist/index.mjs +5 -3
  31. package/dist/index.mjs.map +1 -1
  32. package/dist/mcp.d.mts +2 -0
  33. package/dist/mcp.d.mts.map +1 -1
  34. package/dist/mcp.mjs +6256 -3
  35. package/dist/mcp.mjs.map +1 -1
  36. package/dist/tool-operations.d.mts +14 -3
  37. package/dist/tool-operations.d.mts.map +1 -1
  38. package/dist/tool-operations.mjs +3 -3
  39. package/dist/tool-schemas.d.mts +2 -2
  40. package/dist/tool-schemas.mjs +1 -1
  41. package/dist/typebox.LICENSE +23 -0
  42. package/package.json +19 -19
  43. package/packages/omp/extensions/harnesses.ts +27 -40
  44. package/packages/pi/extensions/harnesses.ts +26 -45
  45. package/packages/shared/tui.ts +13 -0
  46. package/dist/THIRD-PARTY-LICENSES.md +0 -36
  47. package/dist/_chunks/libs/typebox.mjs +0 -5439
  48. package/dist/_chunks/libs/typebox.mjs.map +0 -1
  49. package/dist/_chunks/prompt-sync.d.mts.map +0 -1
  50. package/dist/_chunks/prompt-sync.mjs.map +0 -1
@@ -1,5 +1,6 @@
1
- import { AgentsSyncReport, AvailableModel, EnvOverride, HarnessCapabilities, HarnessDetection, HarnessId, HarnessInvocationModes, McpConfigListing, McpServerConfig, PathCandidate, PromptSyncReport, PromptTemplateSyncTarget, ResolvedPaths, StorageDescriptor, SyncReport } from "./_chunks/prompt-sync.mjs";
2
- import { HARNESS_INFO_MAX_ITEMS } from "./_chunks/tool-schemas.mjs";
1
+ import { $ as StorageDescriptor, F as HarnessDetection, G as McpServerConfig, I as HarnessId, K as PathCandidate, M as EnvOverride, P as HarnessCapabilities, Q as SkillsSyncTarget, R as HarnessInvocationModes, Y as PromptTemplateSyncTarget, Z as ResolvedPaths, _ as McpConfigListing, b as SyncReport, j as AvailableModel, n as SkillsSyncReport, o as PromptSyncReport, p as AgentsSyncReport } from "./_chunks/skills-sync.mjs";
2
+ import { n as HARNESS_INFO_MAX_ITEMS } from "./_chunks/tool-schemas.mjs";
3
+ //#region src/tool-operations.d.ts
3
4
  /** Text for the model plus details for the harness, shared by every tool surface. */
4
5
  export interface ToolResult<Details> {
5
6
  content: Array<{
@@ -34,6 +35,7 @@ export interface HarnessMetadata {
34
35
  sessions: PathCandidate[];
35
36
  instructions: PathCandidate[];
36
37
  skills: PathCandidate[];
38
+ skillsSyncTarget: SkillsSyncTarget | null;
37
39
  commands: PathCandidate[];
38
40
  promptTemplates: PathCandidate[];
39
41
  promptTemplateSyncTarget: PromptTemplateSyncTarget | null;
@@ -244,5 +246,14 @@ export declare function agentsSync(id?: string, check?: boolean): ToolResult<Age
244
246
  * @returns {ToolResult<PromptSyncReport | RunFailure>} The sync report or failure.
245
247
  */
246
248
  export declare function promptsSync(id?: string, check?: boolean): ToolResult<PromptSyncReport | RunFailure>;
247
- export { type AgentsSyncReport, HARNESS_INFO_MAX_ITEMS, type HarnessInvocationModes, type PromptSyncReport, type SyncReport };
249
+ /**
250
+ * Links harness skills directories to the canonical skills directory.
251
+ *
252
+ * @param id - Optional harness id; omission targets every harness.
253
+ * @param check - Report intended changes without writing them.
254
+ * @returns {ToolResult<SkillsSyncReport | RunFailure>} The sync report or failure.
255
+ */
256
+ export declare function skillsSync(id?: string, check?: boolean): ToolResult<SkillsSyncReport | RunFailure>;
257
+ //#endregion
258
+ export { type AgentsSyncReport, HARNESS_INFO_MAX_ITEMS, type HarnessInvocationModes, type PromptSyncReport, type SkillsSyncReport, type SyncReport };
248
259
  //# sourceMappingURL=tool-operations.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-operations.d.mts","names":[],"sources":["../src/tool-operations.ts"],"mappings":";;;iBA6CiB,WAAW;EAC1B,SAAS;IAAQ;IAAc;;EAC/B,SAAS;;EAET;;;iBAIe;EACf,IAAI;EACJ;EACA;EACA;;;iBAIe;EACf,WAAW;;;iBAII;EACf,IAAI;EACJ;EACA;EACA,cAAc;EACd,iBAAiB;EACjB;EACA;EACA,QAAQ;EACR,UAAU;EACV,cAAc;EACd,QAAQ;EACR,UAAU;EACV,iBAAiB;EACjB,0BAA0B;EAC1B,OAAO;EACP,MAAM;EACN,cAAc;EACd,aAAa;EACb,WAAW;EACX,UAAU;;;iBAIK;EACf;EACA,OAAO;;;iBAIQ;EACf;;;YAIU,oBAAoB,kBAAkB;;YAGtC,qBAAqB,oBAAoB,sBAAsB;;qBAM9D;;qBAGA;;;;;;wBAoKG,mBAAmB,WAAW;;wBAuG9B,YAAY,aAAa,WAAW;;wBAEpC,YACd,yBACC,WAAW,sBAAsB;wBACpB,YAAY,oCAAoC,WAAW;;iBA2B1D;EACf;EACA;;EAEA;;EAEA,SAAS;;;iBAIM;EACf,IAAI;EACJ;EACA;EACA;EACA,QAAQ;EACR;EACA;EACA;;EAEA;EACA;;;;;;;;;wBAUoB,kBACpB,YACA,UAAS,gBACR,QAAQ,WAAW,gBAAgB;;iBAsDrB;EACf;;EAEA;;EAEA;;EAEA,SAAS;;EAET;;EAEA;;EAEA;;;iBAIe;EACf,IAAI;EACJ;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;;;iBAIe;EACf;EACA,QAAQ;;EAER,kBAAkB;;EAElB;IAAU;IAAmB;;IAAsB;;;;;;;;;;;;;;;;;wBAyB/B,WACpB,YACA,gBACA,UAAS,aACR,QAAQ,WAAW,aAAa;;iBAkClB;EACf,WAAW;IAAQ,IAAI;IAAW,SAAS;;;;iBAY5B;EACf,IAAI;EACJ;EACA;;;iBAIe;EACf;EACA,YAAY;EACZ;EACA;EACA,MAAM;EACN;EACA,UAAU;;;;;;;;wBASI,kBAAkB,QAAQ,kBAAkB;;;;;;;wBAmB5C,QAAQ,cAAc,WAAW,aAAa;;;;;;;;;wBAgD9C,OACd,YACA,QAAQ,iBACR,6BACC,WAAW,cAAc;;;;;;;;;wBAeZ,UACd,YACA,cACA,6BACC,WAAW,cAAc;;;;;;;wBAaZ,QAAQ,cAAc,WAAW,aAAa;;;;;;;;wBA+B9C,WAAW,aAAa,kBAAgB,WAAW,mBAAmB;;;;;;;;wBAgCtE,YAAY,aAAa,kBAAgB,WAAW,mBAAmB"}
1
+ {"version":3,"file":"tool-operations.d.mts","names":[],"sources":["../src/tool-operations.ts"],"mappings":";;;;iBAiDiB,WAAW;EAC1B,SAAS;IAAQ;IAAc;;EAC/B,SAAS;;EAET;;;iBAIe;EACf,IAAI;EACJ;EACA;EACA;;;iBAIe;EACf,WAAW;;;iBAII;EACf,IAAI;EACJ;EACA;EACA,cAAc;EACd,iBAAiB;EACjB;EACA;EACA,QAAQ;EACR,UAAU;EACV,cAAc;EACd,QAAQ;EACR,kBAAkB;EAClB,UAAU;EACV,iBAAiB;EACjB,0BAA0B;EAC1B,OAAO;EACP,MAAM;EACN,cAAc;EACd,aAAa;EACb,WAAW;EACX,UAAU;;;iBAIK;EACf;EACA,OAAO;;;iBAIQ;EACf;;;YAIU,oBAAoB,kBAAkB;;YAGtC,qBAAqB,oBAAoB,sBAAsB;;qBAM9D;;qBAGA;;;;;;wBA2KG,mBAAmB,WAAW;;wBAyG9B,YAAY,aAAa,WAAW;;wBAEpC,YACd,yBACC,WAAW,sBAAsB;wBACpB,YAAY,oCAAoC,WAAW;;iBA2B1D;EACf;EACA;;EAEA;;EAEA,SAAS;;;iBAIM;EACf,IAAI;EACJ;EACA;EACA;EACA,QAAQ;EACR;EACA;EACA;;EAEA;EACA;;;;;;;;;wBAUoB,kBACpB,YACA,UAAS,gBACR,QAAQ,WAAW,gBAAgB;;iBAqDrB;EACf;;EAEA;;EAEA;;EAEA,SAAS;;EAET;;EAEA;;EAEA;;;iBAIe;EACf,IAAI;EACJ;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;;;iBAIe;EACf;EACA,QAAQ;;EAER,kBAAkB;;EAElB;IAAU;IAAmB;;IAAsB;;;;;;;;;;;;;;;;;wBAyB/B,WACpB,YACA,gBACA,UAAS,aACR,QAAQ,WAAW,aAAa;;iBAkClB;EACf,WAAW;IAAQ,IAAI;IAAW,SAAS;;;;iBAY5B;EACf,IAAI;EACJ;EACA;;;iBAIe;EACf;EACA,YAAY;EACZ;EACA;EACA,MAAM;EACN;EACA,UAAU;;;;;;;;wBASI,kBAAkB,QAAQ,kBAAkB;;;;;;;wBAmB5C,QAAQ,cAAc,WAAW,aAAa;;;;;;;;;wBAgD9C,OACd,YACA,QAAQ,iBACR,6BACC,WAAW,cAAc;;;;;;;;;wBAeZ,UACd,YACA,cACA,6BACC,WAAW,cAAc;;;;;;;wBAaZ,QAAQ,cAAc,WAAW,aAAa;;;;;;;;wBA+B9C,WAAW,aAAa,kBAAgB,WAAW,mBAAmB;;;;;;;;wBAgCtE,YAAY,aAAa,kBAAgB,WAAW,mBAAmB;;;;;;;;wBAsBvE,WAAW,aAAa,kBAAgB,WAAW,mBAAmB"}
@@ -1,3 +1,3 @@
1
- import { HARNESS_INFO_MAX_ITEMS } from "./_chunks/tool-schemas.mjs";
2
- import { RUN_DEFAULT_TIMEOUT_SECONDS, RUN_MAX_OUTPUT_CHARS, agentsSync, detectHarnesses, harnessInfo, listHarnessModels, mcpAdd, mcpList, mcpRemove, mcpSync, promptsSync, runHarness, toMcpServerConfig } from "./_chunks/tool-operations.mjs";
3
- export { HARNESS_INFO_MAX_ITEMS, RUN_DEFAULT_TIMEOUT_SECONDS, RUN_MAX_OUTPUT_CHARS, agentsSync, detectHarnesses, harnessInfo, listHarnessModels, mcpAdd, mcpList, mcpRemove, mcpSync, promptsSync, runHarness, toMcpServerConfig };
1
+ import { t as HARNESS_INFO_MAX_ITEMS } from "./_chunks/tool-schemas.mjs";
2
+ import { a as harnessInfo, c as mcpList, d as promptsSync, f as runHarness, i as detectHarnesses, l as mcpRemove, m as toMcpServerConfig, n as RUN_MAX_OUTPUT_CHARS, o as listHarnessModels, p as skillsSync, r as agentsSync, s as mcpAdd, t as RUN_DEFAULT_TIMEOUT_SECONDS, u as mcpSync } from "./_chunks/tool-operations.mjs";
3
+ export { HARNESS_INFO_MAX_ITEMS, RUN_DEFAULT_TIMEOUT_SECONDS, RUN_MAX_OUTPUT_CHARS, agentsSync, detectHarnesses, harnessInfo, listHarnessModels, mcpAdd, mcpList, mcpRemove, mcpSync, promptsSync, runHarness, skillsSync, toMcpServerConfig };
@@ -1,2 +1,2 @@
1
- import { AgentsSyncParams, HARNESS_INFO_MAX_ITEMS, InfoParams, McpAddParams, McpListParams, McpRemoveParams, McpSchemaBuilder, McpSyncParams, ModelsParams, PromptsSyncParams, RUN_TIMEOUT_DEFAULT_SECONDS, RunParams, harnessToolSchemas } from "./_chunks/tool-schemas.mjs";
2
- export { AgentsSyncParams, HARNESS_INFO_MAX_ITEMS, InfoParams, McpAddParams, McpListParams, McpRemoveParams, McpSchemaBuilder, McpSyncParams, ModelsParams, PromptsSyncParams, RUN_TIMEOUT_DEFAULT_SECONDS, RunParams, harnessToolSchemas };
1
+ import { a as McpListParams, c as McpSyncParams, d as RUN_TIMEOUT_DEFAULT_SECONDS, f as RunParams, i as McpAddParams, l as ModelsParams, m as harnessToolSchemas, n as HARNESS_INFO_MAX_ITEMS, o as McpRemoveParams, p as SkillsSyncParams, r as InfoParams, s as McpSchemaBuilder, t as AgentsSyncParams, u as PromptsSyncParams } from "./_chunks/tool-schemas.mjs";
2
+ export { AgentsSyncParams, HARNESS_INFO_MAX_ITEMS, InfoParams, McpAddParams, McpListParams, McpRemoveParams, McpSchemaBuilder, McpSyncParams, ModelsParams, PromptsSyncParams, RUN_TIMEOUT_DEFAULT_SECONDS, RunParams, SkillsSyncParams, harnessToolSchemas };
@@ -1,2 +1,2 @@
1
- import { HARNESS_INFO_MAX_ITEMS, RUN_TIMEOUT_DEFAULT_SECONDS, harnessToolSchemas } from "./_chunks/tool-schemas.mjs";
1
+ import { n as RUN_TIMEOUT_DEFAULT_SECONDS, r as harnessToolSchemas, t as HARNESS_INFO_MAX_ITEMS } from "./_chunks/tool-schemas.mjs";
2
2
  export { HARNESS_INFO_MAX_ITEMS, RUN_TIMEOUT_DEFAULT_SECONDS, harnessToolSchemas };
@@ -0,0 +1,23 @@
1
+ TypeBox
2
+
3
+ The MIT License (MIT)
4
+
5
+ Copyright (c) 2017-2026 Haydn Paterson
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ of this software and associated documentation files (the "Software"), to deal
9
+ in the Software without restriction, including without limitation the rights
10
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the Software is
12
+ furnished to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in
15
+ all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ THE SOFTWARE.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agntn/harnesses",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Metadata registry for AI coding harnesses: binaries, configs, sessions, and capabilities.",
5
5
  "homepage": "https://harnesses.agntn.dev",
6
6
  "bugs": "https://github.com/agntn/harnesses/issues",
@@ -37,35 +37,32 @@
37
37
  "access": "public"
38
38
  },
39
39
  "dependencies": {
40
- "@modelcontextprotocol/sdk": "1.30.0",
40
+ "@modelcontextprotocol/sdk": "1.30.1",
41
41
  "@toon-format/toon": "4.1.1",
42
42
  "citty": "0.2.2",
43
43
  "consola": "3.4.2",
44
44
  "smol-toml": "1.8.0",
45
- "typebox": "1.3.34",
46
45
  "yaml": "2.9.1"
47
46
  },
48
47
  "devDependencies": {
49
48
  "@agntn/ox": "0.1.0",
50
- "@earendil-works/pi-coding-agent": "0.85.1",
51
- "@earendil-works/pi-tui": "0.85.1",
49
+ "@earendil-works/pi-coding-agent": "0.99.1",
50
+ "@earendil-works/pi-tui": "0.99.1",
52
51
  "@oh-my-pi/omptype": "18.2.5",
53
52
  "@oh-my-pi/pi-ai": "18.2.5",
54
53
  "@oh-my-pi/pi-coding-agent": "18.2.5",
55
54
  "@types/node": "latest",
56
55
  "@typescript/native-preview": "latest",
57
56
  "changelogen": "0.6.2",
58
- "obuild": "0.4.40",
59
- "oxfmt": "0.68.0",
60
- "oxlint": "1.83.0",
61
- "oxlint-tsgolint": "7.0.2002",
57
+ "typebox": "1.3.34",
62
58
  "typescript": "6.0.3",
63
- "vitest": "5.0.1"
59
+ "vite-plus": "1.0.0"
64
60
  },
65
61
  "peerDependencies": {
66
- "@earendil-works/pi-coding-agent": ">=0.84.2 <1",
62
+ "@earendil-works/pi-coding-agent": ">=0.99.0 <1",
67
63
  "@earendil-works/pi-tui": ">=0.84.2 <1",
68
- "@oh-my-pi/pi-coding-agent": ">=18.0.0 <19"
64
+ "@oh-my-pi/pi-coding-agent": ">=18.0.0 <19",
65
+ "typebox": "*"
69
66
  },
70
67
  "peerDependenciesMeta": {
71
68
  "@earendil-works/pi-coding-agent": {
@@ -76,10 +73,13 @@
76
73
  },
77
74
  "@oh-my-pi/pi-coding-agent": {
78
75
  "optional": true
76
+ },
77
+ "typebox": {
78
+ "optional": true
79
79
  }
80
80
  },
81
81
  "engines": {
82
- "node": ">=24"
82
+ "node": ">=26"
83
83
  },
84
84
  "omp": {
85
85
  "extensions": [
@@ -93,14 +93,14 @@
93
93
  "image": "https://harnesses.agntn.dev/image.png"
94
94
  },
95
95
  "scripts": {
96
- "build": "obuild",
97
- "dev": "obuild --stub",
96
+ "build": "vp pack",
97
+ "dev": "vp pack --watch",
98
98
  "docs": "pnpm --dir docs dev",
99
- "lint": "pnpm build && oxlint . && oxfmt --check .",
100
- "lint:fix": "pnpm build && oxlint . --fix && oxfmt . && pnpm build",
99
+ "lint": "pnpm build && vp lint && vp fmt --check",
100
+ "lint:fix": "pnpm build && vp lint --fix && vp fmt && pnpm build",
101
101
  "typecheck": "tsgo --noEmit --skipLibCheck && pnpm build && tsgo --noEmit --skipLibCheck -p tsconfig.extensions.json",
102
- "test": "vitest",
103
- "test:run": "vitest --run",
102
+ "test": "vp test watch",
103
+ "test:run": "vp test run",
104
104
  "release": "pnpm test:run && pnpm build && changelogen --release --push"
105
105
  }
106
106
  }
@@ -72,8 +72,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
72
72
  approval: HARNESS_TOOL_APPROVALS.harnesses_detect,
73
73
  async execute(_toolCallId, _params): Promise<AgentToolResult<HarnessTools.HarnessListing>> {
74
74
  const { detectHarnesses } = await loadToolOperations();
75
- const { content, details } = detectHarnesses();
76
- return { content, details };
75
+ return detectHarnesses();
77
76
  },
78
77
  ...statusRenderers("harnesses_detect"),
79
78
  });
@@ -90,8 +89,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
90
89
  params: HarnessSchemas.InfoParams,
91
90
  ): Promise<AgentToolResult<HarnessTools.HarnessInfoDetails>> {
92
91
  const { harnessInfo } = await loadToolOperations();
93
- const { content, details } = harnessInfo(params.id);
94
- return { content, details };
92
+ return harnessInfo(params.id);
95
93
  },
96
94
  ...statusRenderers("harnesses_info"),
97
95
  });
@@ -109,24 +107,12 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
109
107
  signal,
110
108
  ): Promise<AgentToolResult<HarnessTools.ModelsOutcome | HarnessTools.RunFailure>> {
111
109
  const { listHarnessModels } = await loadToolOperations();
112
- const { content, details, isError } = await listHarnessModels(params.id, {
110
+ return listHarnessModels(params.id, {
113
111
  search: params.search,
114
112
  cwd: params.cwd,
115
113
  timeoutSeconds: params.timeoutSeconds,
116
114
  signal,
117
115
  });
118
- if (isError) {
119
- const message =
120
- "error" in details
121
- ? details.error
122
- : details.aborted
123
- ? `Harness ${details.id} model listing aborted`
124
- : details.timedOut
125
- ? `Harness ${details.id} model listing timed out`
126
- : details.stderr || `Harness ${details.id} exited with code ${details.exitCode}`;
127
- throw new Error(message);
128
- }
129
- return { content, details };
130
116
  },
131
117
  ...statusRenderers("harnesses_models"),
132
118
  });
@@ -144,7 +130,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
144
130
  signal,
145
131
  ): Promise<AgentToolResult<HarnessTools.RunOutcome | HarnessTools.RunFailure>> {
146
132
  const { runHarness } = await loadToolOperations();
147
- const { content, details, isError } = await runHarness(params.id, params.prompt, {
133
+ return runHarness(params.id, params.prompt, {
148
134
  cwd: params.cwd,
149
135
  model: params.model,
150
136
  timeoutSeconds: params.timeoutSeconds,
@@ -153,16 +139,6 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
153
139
  tools: params.tools,
154
140
  readOnly: params.readOnly,
155
141
  });
156
- if (isError) {
157
- if ("error" in details) throw new Error(details.error);
158
- const message =
159
- content[0]?.text ??
160
- (details.timedOut
161
- ? `Harness ${details.id} timed out`
162
- : details.stderr || `Harness ${details.id} exited with code ${details.exitCode}`);
163
- throw new Error(message);
164
- }
165
- return { content, details };
166
142
  },
167
143
  ...statusRenderers("harnesses_run"),
168
144
  });
@@ -179,8 +155,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
179
155
  params: HarnessSchemas.McpListParams,
180
156
  ): Promise<AgentToolResult<HarnessTools.McpListing | HarnessTools.UnknownHarness>> {
181
157
  const { mcpList } = await loadToolOperations();
182
- const { content, details } = mcpList(params.id);
183
- return { content, details };
158
+ return mcpList(params.id);
184
159
  },
185
160
  ...statusRenderers("harnesses_mcp_list"),
186
161
  });
@@ -197,8 +172,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
197
172
  params: HarnessSchemas.McpAddParams,
198
173
  ): Promise<AgentToolResult<HarnessTools.McpMutation | HarnessTools.RunFailure>> {
199
174
  const { mcpAdd } = await loadToolOperations();
200
- const { content, details } = mcpAdd(params.id, params, params.scope ?? "user");
201
- return { content, details };
175
+ return mcpAdd(params.id, params, params.scope ?? "user");
202
176
  },
203
177
  ...statusRenderers("harnesses_mcp_add"),
204
178
  });
@@ -215,8 +189,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
215
189
  params: HarnessSchemas.McpSyncParams,
216
190
  ): Promise<AgentToolResult<HarnessTools.SyncReport | HarnessTools.RunFailure>> {
217
191
  const { mcpSync } = await loadToolOperations();
218
- const { content, details } = mcpSync(params.id);
219
- return { content, details };
192
+ return mcpSync(params.id);
220
193
  },
221
194
  ...statusRenderers("harnesses_mcp_sync"),
222
195
  });
@@ -233,8 +206,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
233
206
  params: HarnessSchemas.AgentsSyncParams,
234
207
  ): Promise<AgentToolResult<HarnessTools.AgentsSyncReport | HarnessTools.RunFailure>> {
235
208
  const { agentsSync } = await loadToolOperations();
236
- const { content, details } = agentsSync(params.id, params.check === true);
237
- return { content, details };
209
+ return agentsSync(params.id, params.check === true);
238
210
  },
239
211
  ...statusRenderers("harnesses_agents_sync"),
240
212
  });
@@ -251,12 +223,28 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
251
223
  params: Readonly<HarnessSchemas.PromptsSyncParams>,
252
224
  ): Promise<AgentToolResult<HarnessTools.PromptSyncReport | HarnessTools.RunFailure>> {
253
225
  const { promptsSync } = await loadToolOperations();
254
- const { content, details, isError } = promptsSync(params.id, params.check === true);
255
- return { content, details, isError };
226
+ return promptsSync(params.id, params.check === true);
256
227
  },
257
228
  ...statusRenderers("harnesses_prompts_sync"),
258
229
  });
259
230
 
231
+ pi.registerTool({
232
+ name: "harnesses_skills_sync",
233
+ label: HARNESS_TOOL_LABELS.harnesses_skills_sync,
234
+ description:
235
+ "Link supported harness skills directories to the canonical skills directory in the agntn XDG data directory. Links to single skills are replaced; anything else is backed up. Pass check to only report",
236
+ parameters: schemas.skillsSync,
237
+ approval: HARNESS_TOOL_APPROVALS.harnesses_skills_sync,
238
+ async execute(
239
+ _toolCallId,
240
+ params: Readonly<HarnessSchemas.SkillsSyncParams>,
241
+ ): Promise<AgentToolResult<HarnessTools.SkillsSyncReport | HarnessTools.RunFailure>> {
242
+ const { skillsSync } = await loadToolOperations();
243
+ return skillsSync(params.id, params.check === true);
244
+ },
245
+ ...statusRenderers("harnesses_skills_sync"),
246
+ });
247
+
260
248
  pi.registerTool({
261
249
  name: "harnesses_mcp_remove",
262
250
  label: HARNESS_TOOL_LABELS.harnesses_mcp_remove,
@@ -269,8 +257,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
269
257
  params: HarnessSchemas.McpRemoveParams,
270
258
  ): Promise<AgentToolResult<HarnessTools.McpMutation | HarnessTools.RunFailure>> {
271
259
  const { mcpRemove } = await loadToolOperations();
272
- const { content, details } = mcpRemove(params.id, params.name, params.scope ?? "user");
273
- return { content, details };
260
+ return mcpRemove(params.id, params.name, params.scope ?? "user");
274
261
  },
275
262
  ...statusRenderers("harnesses_mcp_remove"),
276
263
  });
@@ -88,8 +88,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
88
88
  ...statusRenderers("harnesses_detect"),
89
89
  async execute(_toolCallId, _params): Promise<AgentToolResult<HarnessTools.HarnessListing>> {
90
90
  const { detectHarnesses } = await loadToolOperations();
91
- const { content, details } = detectHarnesses();
92
- return { content, details };
91
+ return detectHarnesses();
93
92
  },
94
93
  });
95
94
 
@@ -111,8 +110,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
111
110
  params: HarnessSchemas.InfoParams,
112
111
  ): Promise<AgentToolResult<HarnessTools.HarnessInfoDetails>> {
113
112
  const { harnessInfo } = await loadToolOperations();
114
- const { content, details } = harnessInfo(params.id);
115
- return { content, details };
113
+ return harnessInfo(params.id);
116
114
  },
117
115
  });
118
116
 
@@ -135,24 +133,12 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
135
133
  signal,
136
134
  ): Promise<AgentToolResult<HarnessTools.ModelsOutcome | HarnessTools.RunFailure>> {
137
135
  const { listHarnessModels } = await loadToolOperations();
138
- const { content, details, isError } = await listHarnessModels(params.id, {
136
+ return listHarnessModels(params.id, {
139
137
  search: params.search,
140
138
  cwd: params.cwd,
141
139
  timeoutSeconds: params.timeoutSeconds,
142
140
  signal,
143
141
  });
144
- if (isError) {
145
- const message =
146
- "error" in details
147
- ? details.error
148
- : details.aborted
149
- ? `Harness ${details.id} model listing aborted`
150
- : details.timedOut
151
- ? `Harness ${details.id} model listing timed out`
152
- : details.stderr || `Harness ${details.id} exited with code ${details.exitCode}`;
153
- throw new Error(message);
154
- }
155
- return { content, details };
156
142
  },
157
143
  });
158
144
 
@@ -177,7 +163,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
177
163
  signal,
178
164
  ): Promise<AgentToolResult<HarnessTools.RunOutcome | HarnessTools.RunFailure>> {
179
165
  const { runHarness } = await loadToolOperations();
180
- const { content, details, isError } = await runHarness(params.id, params.prompt, {
166
+ return runHarness(params.id, params.prompt, {
181
167
  cwd: params.cwd,
182
168
  model: params.model,
183
169
  timeoutSeconds: params.timeoutSeconds,
@@ -186,16 +172,6 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
186
172
  tools: params.tools,
187
173
  readOnly: params.readOnly,
188
174
  });
189
- if (isError) {
190
- if ("error" in details) throw new Error(details.error);
191
- const message =
192
- content[0]?.text ??
193
- (details.timedOut
194
- ? `Harness ${details.id} timed out`
195
- : details.stderr || `Harness ${details.id} exited with code ${details.exitCode}`);
196
- throw new Error(message);
197
- }
198
- return { content, details };
199
175
  },
200
176
  });
201
177
 
@@ -214,8 +190,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
214
190
  params: HarnessSchemas.McpListParams,
215
191
  ): Promise<AgentToolResult<HarnessTools.McpListing | HarnessTools.UnknownHarness>> {
216
192
  const { mcpList } = await loadToolOperations();
217
- const { content, details } = mcpList(params.id);
218
- return { content, details };
193
+ return mcpList(params.id);
219
194
  },
220
195
  });
221
196
 
@@ -231,8 +206,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
231
206
  params: HarnessSchemas.McpAddParams,
232
207
  ): Promise<AgentToolResult<HarnessTools.McpMutation | HarnessTools.RunFailure>> {
233
208
  const { mcpAdd } = await loadToolOperations();
234
- const { content, details } = mcpAdd(params.id, params, params.scope ?? "user");
235
- return { content, details };
209
+ return mcpAdd(params.id, params, params.scope ?? "user");
236
210
  },
237
211
  });
238
212
 
@@ -248,8 +222,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
248
222
  params: HarnessSchemas.McpSyncParams,
249
223
  ): Promise<AgentToolResult<HarnessTools.SyncReport | HarnessTools.RunFailure>> {
250
224
  const { mcpSync } = await loadToolOperations();
251
- const { content, details } = mcpSync(params.id);
252
- return { content, details };
225
+ return mcpSync(params.id);
253
226
  },
254
227
  });
255
228
 
@@ -265,8 +238,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
265
238
  params: HarnessSchemas.AgentsSyncParams,
266
239
  ): Promise<AgentToolResult<HarnessTools.AgentsSyncReport | HarnessTools.RunFailure>> {
267
240
  const { agentsSync } = await loadToolOperations();
268
- const { content, details } = agentsSync(params.id, params.check === true);
269
- return { content, details };
241
+ return agentsSync(params.id, params.check === true);
270
242
  },
271
243
  });
272
244
 
@@ -282,13 +254,23 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
282
254
  params: Readonly<HarnessSchemas.PromptsSyncParams>,
283
255
  ): Promise<AgentToolResult<HarnessTools.PromptSyncReport | HarnessTools.RunFailure>> {
284
256
  const { promptsSync } = await loadToolOperations();
285
- const { content, details, isError } = promptsSync(params.id, params.check === true);
286
- if (isError) {
287
- throw new Error(
288
- "error" in details ? details.error : (content[0]?.text ?? "Prompt sync failed"),
289
- );
290
- }
291
- return { content, details };
257
+ return promptsSync(params.id, params.check === true);
258
+ },
259
+ });
260
+
261
+ pi.registerTool({
262
+ name: "harnesses_skills_sync",
263
+ label: HARNESS_TOOL_LABELS.harnesses_skills_sync,
264
+ description:
265
+ "Link supported harness skills directories to the canonical skills directory in the agntn XDG data directory. Links to single skills are replaced; anything else is backed up. Pass check to only report",
266
+ parameters: schemas.skillsSync,
267
+ ...statusRenderers("harnesses_skills_sync"),
268
+ async execute(
269
+ _toolCallId,
270
+ params: Readonly<HarnessSchemas.SkillsSyncParams>,
271
+ ): Promise<AgentToolResult<HarnessTools.SkillsSyncReport | HarnessTools.RunFailure>> {
272
+ const { skillsSync } = await loadToolOperations();
273
+ return skillsSync(params.id, params.check === true);
292
274
  },
293
275
  });
294
276
 
@@ -304,8 +286,7 @@ export default function harnessesExtension(pi: ExtensionAPI): void {
304
286
  params: HarnessSchemas.McpRemoveParams,
305
287
  ): Promise<AgentToolResult<HarnessTools.McpMutation | HarnessTools.RunFailure>> {
306
288
  const { mcpRemove } = await loadToolOperations();
307
- const { content, details } = mcpRemove(params.id, params.name, params.scope ?? "user");
308
- return { content, details };
289
+ return mcpRemove(params.id, params.name, params.scope ?? "user");
309
290
  },
310
291
  });
311
292
  }
@@ -10,6 +10,7 @@ export const HARNESS_TOOL_LABELS = {
10
10
  harnesses_mcp_sync: "Harnesses MCP Sync",
11
11
  harnesses_agents_sync: "Harnesses Agents Sync",
12
12
  harnesses_prompts_sync: "Harnesses Prompts Sync",
13
+ harnesses_skills_sync: "Harnesses Skills Sync",
13
14
  harnesses_mcp_remove: "Harnesses MCP Remove",
14
15
  } as const;
15
16
 
@@ -25,6 +26,7 @@ export const HARNESS_TOOL_APPROVALS: Record<HarnessToolName, "read" | "exec" | "
25
26
  harnesses_mcp_sync: "write",
26
27
  harnesses_agents_sync: "write",
27
28
  harnesses_prompts_sync: "write",
29
+ harnesses_skills_sync: "write",
28
30
  harnesses_mcp_remove: "write",
29
31
  };
30
32
 
@@ -161,6 +163,7 @@ const CALL_DESCRIPTIONS: Record<HarnessToolName, CallDescriptionRenderer> = {
161
163
  harnesses_mcp_sync: idDescription,
162
164
  harnesses_agents_sync: agentsDescription,
163
165
  harnesses_prompts_sync: agentsDescription,
166
+ harnesses_skills_sync: agentsDescription,
164
167
  harnesses_mcp_remove: mutationDescription,
165
168
  };
166
169
 
@@ -287,6 +290,15 @@ function promptsSyncMeta(details: ResultDetails): string[] {
287
290
  ]);
288
291
  }
289
292
 
293
+ function skillsSyncMeta(details: ResultDetails): string[] {
294
+ const skills = listLength(details, "skills");
295
+ const targets = listLength(details, "targets");
296
+ return compactStrings([
297
+ skills === undefined ? undefined : `${skills} skills`,
298
+ targets === undefined ? undefined : `${targets} harnesses`,
299
+ ]);
300
+ }
301
+
290
302
  const RESULT_META: Record<HarnessToolName, ResultMetaRenderer> = {
291
303
  harnesses_detect: detectMeta,
292
304
  harnesses_info: infoMeta,
@@ -297,6 +309,7 @@ const RESULT_META: Record<HarnessToolName, ResultMetaRenderer> = {
297
309
  harnesses_mcp_sync: mcpSyncMeta,
298
310
  harnesses_agents_sync: agentsSyncMeta,
299
311
  harnesses_prompts_sync: promptsSyncMeta,
312
+ harnesses_skills_sync: skillsSyncMeta,
300
313
  harnesses_mcp_remove: mutationMeta,
301
314
  };
302
315
 
@@ -1,36 +0,0 @@
1
- # Licenses of Bundled Dependencies
2
-
3
- The published artifact additionally contains code with the following licenses:
4
- MIT
5
-
6
- # Bundled Dependencies
7
-
8
- ## typebox
9
-
10
- License: MIT
11
- By: sinclairzx81
12
- Repository: https://github.com/sinclairzx81/typebox
13
-
14
- > TypeBox
15
- >
16
- > The MIT License (MIT)
17
- >
18
- > Copyright (c) 2017-2026 Haydn Paterson
19
- >
20
- > Permission is hereby granted, free of charge, to any person obtaining a copy
21
- > of this software and associated documentation files (the "Software"), to deal
22
- > in the Software without restriction, including without limitation the rights
23
- > to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
24
- > copies of the Software, and to permit persons to whom the Software is
25
- > furnished to do so, subject to the following conditions:
26
- >
27
- > The above copyright notice and this permission notice shall be included in
28
- > all copies or substantial portions of the Software.
29
- >
30
- > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
31
- > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
32
- > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
33
- > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
34
- > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
35
- > OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
36
- > THE SOFTWARE.