@oharness/engine 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/skills.d.ts +16 -3
- package/dist/agent/skills.js +36 -2
- package/dist/agent/skills.js.map +1 -1
- package/dist/agent/subagent.d.ts +15 -2
- package/dist/agent/subagent.js +70 -16
- package/dist/agent/subagent.js.map +1 -1
- package/dist/config.d.ts +9 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/foreign.d.ts +81 -0
- package/dist/foreign.js +198 -0
- package/dist/foreign.js.map +1 -0
- package/dist/harness.d.ts +27 -0
- package/dist/harness.js +128 -5
- package/dist/harness.js.map +1 -1
- package/dist/mcp/registry.d.ts +2 -0
- package/dist/mcp/registry.js +1 -0
- package/dist/mcp/registry.js.map +1 -1
- package/dist/mcp/registry.json +394 -1
- package/dist/paths.d.ts +19 -0
- package/dist/paths.js +38 -0
- package/dist/paths.js.map +1 -1
- package/dist/plugin-market.d.ts +57 -0
- package/dist/plugin-market.js +229 -0
- package/dist/plugin-market.js.map +1 -0
- package/dist/plugin-market.json +1246 -0
- package/dist/plugins.d.ts +49 -2
- package/dist/plugins.js +252 -10
- package/dist/plugins.js.map +1 -1
- package/dist/util/toml.d.ts +22 -0
- package/dist/util/toml.js +305 -0
- package/dist/util/toml.js.map +1 -0
- package/package.json +2 -2
package/dist/agent/skills.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ImportConfig } from "../foreign.ts";
|
|
1
2
|
import type { Logger } from "../util/logger.ts";
|
|
2
3
|
/**
|
|
3
4
|
* Skills: packaged instructions loaded on demand.
|
|
@@ -15,8 +16,11 @@ export interface Skill {
|
|
|
15
16
|
body: string;
|
|
16
17
|
/** Directory holding SKILL.md, so the body can reference scripts/ etc. */
|
|
17
18
|
directory?: string;
|
|
18
|
-
/**
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Where it came from, for `/skills`. `claude` and `codex` are those tools'
|
|
21
|
+
* own skill directories, read where they lie — see `foreign.ts`.
|
|
22
|
+
*/
|
|
23
|
+
source: "builtin" | "project" | "user" | "config" | "runtime" | "claude" | "codex";
|
|
20
24
|
}
|
|
21
25
|
/** In-memory skill contributed by a trusted RuntimePlugin. */
|
|
22
26
|
export type RuntimeSkill = Pick<Skill, "name" | "description" | "body"> & {
|
|
@@ -26,6 +30,11 @@ export type RuntimeSkill = Pick<Skill, "name" | "description" | "body"> & {
|
|
|
26
30
|
export declare class SkillRegistry {
|
|
27
31
|
private readonly skills;
|
|
28
32
|
private readonly runtimeSkills;
|
|
33
|
+
/**
|
|
34
|
+
* Names switched off by the user. Kept out of `get`, `list` and the prompt,
|
|
35
|
+
* but still known, so the list that switched one off can switch it back.
|
|
36
|
+
*/
|
|
37
|
+
private disabled;
|
|
29
38
|
private readonly logger;
|
|
30
39
|
constructor(logger?: Logger);
|
|
31
40
|
register(skill: Skill): this;
|
|
@@ -33,12 +42,16 @@ export declare class SkillRegistry {
|
|
|
33
42
|
registerScoped(skill: RuntimeSkill): () => void;
|
|
34
43
|
get(name: string): Skill | undefined;
|
|
35
44
|
list(): Skill[];
|
|
45
|
+
/** Every skill found, switched off or not, for the list that toggles them. */
|
|
46
|
+
listAll(): Skill[];
|
|
47
|
+
isDisabled(name: string): boolean;
|
|
48
|
+
setDisabled(names: Iterable<string>): void;
|
|
36
49
|
get size(): number;
|
|
37
50
|
/**
|
|
38
51
|
* Discover skills from the conventional locations. Project skills override
|
|
39
52
|
* user skills of the same name, so a repo can pin its own version.
|
|
40
53
|
*/
|
|
41
|
-
discover(cwd: string, extraDirs?: string[]): Promise<void>;
|
|
54
|
+
discover(cwd: string, extraDirs?: string[], imports?: ImportConfig): Promise<void>;
|
|
42
55
|
/**
|
|
43
56
|
* The block injected into the system prompt: names and descriptions only.
|
|
44
57
|
* Returns undefined when there is nothing to advertise, so the prompt does
|
package/dist/agent/skills.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { foreignSkillRoots } from "../foreign.js";
|
|
1
2
|
import { userPath } from "../paths.js";
|
|
2
3
|
import { readFile, readdir, stat } from "node:fs/promises";
|
|
3
4
|
import path from "node:path";
|
|
@@ -33,6 +34,11 @@ const MAX_LISTED_FILES = 20;
|
|
|
33
34
|
export class SkillRegistry {
|
|
34
35
|
skills = new Map();
|
|
35
36
|
runtimeSkills = new Map();
|
|
37
|
+
/**
|
|
38
|
+
* Names switched off by the user. Kept out of `get`, `list` and the prompt,
|
|
39
|
+
* but still known, so the list that switched one off can switch it back.
|
|
40
|
+
*/
|
|
41
|
+
disabled = new Set();
|
|
36
42
|
logger;
|
|
37
43
|
constructor(logger) {
|
|
38
44
|
this.logger = (logger ?? createLogger("skills")).child("registry");
|
|
@@ -54,14 +60,26 @@ export class SkillRegistry {
|
|
|
54
60
|
};
|
|
55
61
|
}
|
|
56
62
|
get(name) {
|
|
63
|
+
if (this.disabled.has(name))
|
|
64
|
+
return undefined;
|
|
57
65
|
return this.runtimeSkills.get(name) ?? this.skills.get(name);
|
|
58
66
|
}
|
|
59
67
|
list() {
|
|
68
|
+
return this.listAll().filter((skill) => !this.disabled.has(skill.name));
|
|
69
|
+
}
|
|
70
|
+
/** Every skill found, switched off or not, for the list that toggles them. */
|
|
71
|
+
listAll() {
|
|
60
72
|
const merged = new Map(this.skills);
|
|
61
73
|
for (const [name, skill] of this.runtimeSkills)
|
|
62
74
|
merged.set(name, skill);
|
|
63
75
|
return [...merged.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
64
76
|
}
|
|
77
|
+
isDisabled(name) {
|
|
78
|
+
return this.disabled.has(name);
|
|
79
|
+
}
|
|
80
|
+
setDisabled(names) {
|
|
81
|
+
this.disabled = new Set(names);
|
|
82
|
+
}
|
|
65
83
|
get size() {
|
|
66
84
|
return this.skills.size;
|
|
67
85
|
}
|
|
@@ -69,12 +87,20 @@ export class SkillRegistry {
|
|
|
69
87
|
* Discover skills from the conventional locations. Project skills override
|
|
70
88
|
* user skills of the same name, so a repo can pin its own version.
|
|
71
89
|
*/
|
|
72
|
-
async discover(cwd, extraDirs = []) {
|
|
90
|
+
async discover(cwd, extraDirs = [], imports) {
|
|
91
|
+
// Claude Code's and Codex's, each beneath ours at the same level: a skill
|
|
92
|
+
// someone put in `~/.oharness/skills` was put there for this harness, and
|
|
93
|
+
// wins over one of the same name written for another. Only read when the
|
|
94
|
+
// caller asks — a registry built in a test should not find the skills of
|
|
95
|
+
// whoever is running it.
|
|
96
|
+
const foreign = imports ? foreignSkillRoots(cwd, imports) : { user: [], project: [] };
|
|
73
97
|
const roots = [
|
|
74
98
|
// First, so everything else can override one by name. A user who
|
|
75
99
|
// disagrees with a built-in replaces it rather than being stuck with it.
|
|
76
100
|
{ dir: builtinSkillsDir(), source: "builtin" },
|
|
101
|
+
...foreign.user,
|
|
77
102
|
{ dir: userPath("skills"), source: "user" },
|
|
103
|
+
...foreign.project,
|
|
78
104
|
{ dir: path.join(cwd, ".oharness", "skills"), source: "project" },
|
|
79
105
|
...extraDirs.map((dir) => ({ dir: path.resolve(cwd, dir), source: "config" })),
|
|
80
106
|
];
|
|
@@ -157,6 +183,10 @@ async function scanDirectory(root, source, logger) {
|
|
|
157
183
|
for (const entry of entries) {
|
|
158
184
|
if (!entry.isDirectory() && !entry.isSymbolicLink())
|
|
159
185
|
continue;
|
|
186
|
+
// Bookkeeping, not skills: Codex keeps its own bundled ones in `.system`,
|
|
187
|
+
// written for Codex's tools and nobody else's.
|
|
188
|
+
if (entry.name.startsWith("."))
|
|
189
|
+
continue;
|
|
160
190
|
const directory = path.join(root, entry.name);
|
|
161
191
|
const file = path.join(directory, SKILL_FILE);
|
|
162
192
|
let raw;
|
|
@@ -204,7 +234,11 @@ export function splitFrontmatter(raw) {
|
|
|
204
234
|
const match = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(line);
|
|
205
235
|
if (match) {
|
|
206
236
|
currentKey = match[1];
|
|
207
|
-
|
|
237
|
+
const value = match[2].trim();
|
|
238
|
+
// A YAML block scalar — `description: >-` and the text on the lines
|
|
239
|
+
// below — is common in skills written for Claude Code. The indicator is
|
|
240
|
+
// syntax, not text; the continuation lines below fill the value in.
|
|
241
|
+
frontmatter[currentKey] = /^[>|][+-]?$/.test(value) ? "" : stripQuotes(value);
|
|
208
242
|
continue;
|
|
209
243
|
}
|
|
210
244
|
// Continuation of a folded value, e.g. a description wrapped over lines.
|
package/dist/agent/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/agent/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/agent/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/subagent.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AcpRuntime } from "../acp/runner.ts";
|
|
2
|
+
import type { ImportConfig } from "../foreign.ts";
|
|
2
3
|
import type { ToolFilter } from "../tools/registry.ts";
|
|
3
4
|
/**
|
|
4
5
|
* A named subagent configuration. Subagents exist to keep expensive
|
|
@@ -52,6 +53,15 @@ export declare class SubagentRegistry {
|
|
|
52
53
|
isolation?: "worktree";
|
|
53
54
|
}>;
|
|
54
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* A directory of agent files, and whose files they are. `claude` means they
|
|
58
|
+
* were written for Claude Code — its own `agents/`, or a Claude Code plugin's
|
|
59
|
+
* — and name tools and models in its vocabulary. See `parseAgentMarkdown`.
|
|
60
|
+
*/
|
|
61
|
+
export interface AgentRoot {
|
|
62
|
+
dir: string;
|
|
63
|
+
dialect?: "claude";
|
|
64
|
+
}
|
|
55
65
|
/**
|
|
56
66
|
* Load subagents from `agents/**/*.md`, the convention opencode uses:
|
|
57
67
|
* YAML frontmatter is the configuration, the body is the system prompt.
|
|
@@ -59,7 +69,10 @@ export declare class SubagentRegistry {
|
|
|
59
69
|
* A markdown file is a better home for a subagent than a JSON config field —
|
|
60
70
|
* the prompt is the bulk of the definition, and prompts do not survive being
|
|
61
71
|
* escaped into JSON strings with any readability.
|
|
72
|
+
*
|
|
73
|
+
* `imports` adds Claude Code's agent directories, each beneath ours at the
|
|
74
|
+
* same level, so a definition written for this harness wins by name.
|
|
62
75
|
*/
|
|
63
|
-
export declare function loadMarkdownSubagents(cwd: string, extraDirs?: string
|
|
76
|
+
export declare function loadMarkdownSubagents(cwd: string, extraDirs?: Array<string | AgentRoot>, imports?: ImportConfig): Promise<SubagentDefinition[]>;
|
|
64
77
|
/** Parse one agent markdown file. Returns undefined if it cannot be selected. */
|
|
65
|
-
export declare function parseAgentMarkdown(raw: string, fallbackName: string, prefix?: string): SubagentDefinition | undefined;
|
|
78
|
+
export declare function parseAgentMarkdown(raw: string, fallbackName: string, prefix?: string, dialect?: "claude"): SubagentDefinition | undefined;
|
package/dist/agent/subagent.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { foreignAgentRoots } from "../foreign.js";
|
|
1
2
|
import { userPath } from "../paths.js";
|
|
2
3
|
import { readFile, readdir } from "node:fs/promises";
|
|
3
4
|
import path from "node:path";
|
|
@@ -55,9 +56,6 @@ export class SubagentRegistry {
|
|
|
55
56
|
}));
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
|
-
// ---------------------------------------------------------------------------
|
|
59
|
-
// Markdown-defined subagents
|
|
60
|
-
// ---------------------------------------------------------------------------
|
|
61
59
|
/**
|
|
62
60
|
* Load subagents from `agents/**/*.md`, the convention opencode uses:
|
|
63
61
|
* YAML frontmatter is the configuration, the body is the system prompt.
|
|
@@ -65,23 +63,29 @@ export class SubagentRegistry {
|
|
|
65
63
|
* A markdown file is a better home for a subagent than a JSON config field —
|
|
66
64
|
* the prompt is the bulk of the definition, and prompts do not survive being
|
|
67
65
|
* escaped into JSON strings with any readability.
|
|
66
|
+
*
|
|
67
|
+
* `imports` adds Claude Code's agent directories, each beneath ours at the
|
|
68
|
+
* same level, so a definition written for this harness wins by name.
|
|
68
69
|
*/
|
|
69
|
-
export async function loadMarkdownSubagents(cwd, extraDirs = []) {
|
|
70
|
+
export async function loadMarkdownSubagents(cwd, extraDirs = [], imports) {
|
|
71
|
+
const foreign = imports ? foreignAgentRoots(cwd, imports) : { user: [], project: [] };
|
|
70
72
|
const roots = [
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
...
|
|
73
|
+
...foreign.user.map(({ dir }) => ({ dir, dialect: "claude" })),
|
|
74
|
+
{ dir: userPath("agents") },
|
|
75
|
+
...foreign.project.map(({ dir }) => ({ dir, dialect: "claude" })),
|
|
76
|
+
{ dir: path.join(cwd, ".oharness", "agents") },
|
|
77
|
+
...extraDirs.map((one) => (typeof one === "string" ? { dir: path.resolve(cwd, one) } : { ...one, dir: path.resolve(cwd, one.dir) })),
|
|
74
78
|
];
|
|
75
79
|
// Keyed by name so a project definition shadows a user one.
|
|
76
80
|
const byName = new Map();
|
|
77
81
|
for (const root of roots) {
|
|
78
|
-
for (const definition of await scanAgentDir(root)) {
|
|
82
|
+
for (const definition of await scanAgentDir(root.dir, "", root.dialect)) {
|
|
79
83
|
byName.set(definition.name, definition);
|
|
80
84
|
}
|
|
81
85
|
}
|
|
82
86
|
return [...byName.values()];
|
|
83
87
|
}
|
|
84
|
-
async function scanAgentDir(root, prefix = "") {
|
|
88
|
+
async function scanAgentDir(root, prefix = "", dialect) {
|
|
85
89
|
let entries;
|
|
86
90
|
try {
|
|
87
91
|
entries = await readdir(root, { withFileTypes: true });
|
|
@@ -93,7 +97,7 @@ async function scanAgentDir(root, prefix = "") {
|
|
|
93
97
|
for (const entry of entries) {
|
|
94
98
|
const full = path.join(root, entry.name);
|
|
95
99
|
if (entry.isDirectory()) {
|
|
96
|
-
out.push(...(await scanAgentDir(full, prefix ? `${prefix}/${entry.name}` : entry.name)));
|
|
100
|
+
out.push(...(await scanAgentDir(full, prefix ? `${prefix}/${entry.name}` : entry.name, dialect)));
|
|
97
101
|
continue;
|
|
98
102
|
}
|
|
99
103
|
if (!entry.name.endsWith(".md"))
|
|
@@ -105,14 +109,14 @@ async function scanAgentDir(root, prefix = "") {
|
|
|
105
109
|
catch {
|
|
106
110
|
continue;
|
|
107
111
|
}
|
|
108
|
-
const parsed = parseAgentMarkdown(raw, entry.name.replace(/\.md$/, ""), prefix);
|
|
112
|
+
const parsed = parseAgentMarkdown(raw, entry.name.replace(/\.md$/, ""), prefix, dialect);
|
|
109
113
|
if (parsed)
|
|
110
114
|
out.push(parsed);
|
|
111
115
|
}
|
|
112
116
|
return out;
|
|
113
117
|
}
|
|
114
118
|
/** Parse one agent markdown file. Returns undefined if it cannot be selected. */
|
|
115
|
-
export function parseAgentMarkdown(raw, fallbackName, prefix = "") {
|
|
119
|
+
export function parseAgentMarkdown(raw, fallbackName, prefix = "", dialect) {
|
|
116
120
|
const { frontmatter, body } = splitFrontmatter(raw);
|
|
117
121
|
const name = frontmatter["name"]?.trim() || (prefix ? `${prefix}/${fallbackName}` : fallbackName);
|
|
118
122
|
const description = frontmatter["description"]?.trim();
|
|
@@ -122,8 +126,16 @@ export function parseAgentMarkdown(raw, fallbackName, prefix = "") {
|
|
|
122
126
|
if (!description || !systemPrompt)
|
|
123
127
|
return undefined;
|
|
124
128
|
const definition = { name, description, systemPrompt };
|
|
125
|
-
|
|
126
|
-
|
|
129
|
+
const model = frontmatter["model"]?.trim();
|
|
130
|
+
if (model) {
|
|
131
|
+
// `inherit` is Claude Code's word for what leaving it out means here. In
|
|
132
|
+
// a Claude Code file, a bare name — `sonnet`, `opus` — is a Claude model
|
|
133
|
+
// picked for Claude Code's account; this harness may not be signed in to
|
|
134
|
+
// Anthropic at all, and a subagent that fails to start is worse than one
|
|
135
|
+
// on the parent's model. A `provider/model` id is explicit, so it stays.
|
|
136
|
+
if (model !== "inherit" && (dialect !== "claude" || model.includes("/")))
|
|
137
|
+
definition.model = model;
|
|
138
|
+
}
|
|
127
139
|
if (frontmatter["isolation"]?.trim() === "worktree")
|
|
128
140
|
definition.isolation = "worktree";
|
|
129
141
|
if (frontmatter["readOnly"]?.trim() === "true" || frontmatter["read_only"]?.trim() === "true")
|
|
@@ -131,8 +143,14 @@ export function parseAgentMarkdown(raw, fallbackName, prefix = "") {
|
|
|
131
143
|
const maxTurns = Number(frontmatter["maxTurns"] ?? frontmatter["max_turns"]);
|
|
132
144
|
if (Number.isInteger(maxTurns) && maxTurns > 0)
|
|
133
145
|
definition.maxTurns = maxTurns;
|
|
134
|
-
const
|
|
135
|
-
const
|
|
146
|
+
const listed = splitList(frontmatter["tools"] ?? frontmatter["allowedTools"]);
|
|
147
|
+
const allow = translateTools(listed, dialect);
|
|
148
|
+
const deny = translateTools(splitList(frontmatter["denyTools"] ?? frontmatter["disallowedTools"]), dialect);
|
|
149
|
+
// Every tool it named is one this harness lacks. An empty allow-list means
|
|
150
|
+
// everything, which is the opposite of what a short list asked for, so it
|
|
151
|
+
// gets the read-only core instead: enough to look, nothing to change.
|
|
152
|
+
if (listed.length && !allow.length)
|
|
153
|
+
allow.push("read", "list", "glob", "grep");
|
|
136
154
|
if (allow.length || deny.length) {
|
|
137
155
|
definition.tools = {
|
|
138
156
|
...(allow.length ? { allow } : {}),
|
|
@@ -151,4 +169,40 @@ function splitList(value) {
|
|
|
151
169
|
.map((item) => item.trim().replace(/^["']|["']$/g, ""))
|
|
152
170
|
.filter((item) => item !== "");
|
|
153
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* Claude Code's tool names, in this harness's spelling.
|
|
174
|
+
*
|
|
175
|
+
* Its agent files say `tools: Read, Grep, Bash`, and the filter matches names
|
|
176
|
+
* literally, so without this every such list would allow nothing that exists
|
|
177
|
+
* and the agent would start with no tools at all. MCP tools are named the same
|
|
178
|
+
* way in both (`mcp__server__tool`) and pass through. Anything else is a tool
|
|
179
|
+
* this harness does not have, and is dropped rather than kept as a name that
|
|
180
|
+
* can never match — in a Claude Code file only; in one of ours an unfamiliar
|
|
181
|
+
* name may be a tool a plugin registers, and is left alone.
|
|
182
|
+
*/
|
|
183
|
+
const CLAUDE_TOOLS = {
|
|
184
|
+
read: "read",
|
|
185
|
+
write: "write",
|
|
186
|
+
edit: "edit",
|
|
187
|
+
multiedit: "edit",
|
|
188
|
+
bash: "bash",
|
|
189
|
+
glob: "glob",
|
|
190
|
+
grep: "grep",
|
|
191
|
+
ls: "list",
|
|
192
|
+
task: "task",
|
|
193
|
+
agent: "task",
|
|
194
|
+
todowrite: "todo_write",
|
|
195
|
+
skill: "skill",
|
|
196
|
+
};
|
|
197
|
+
function translateTools(names, dialect) {
|
|
198
|
+
const out = [];
|
|
199
|
+
for (const name of names) {
|
|
200
|
+
const mapped = CLAUDE_TOOLS[name.toLowerCase()];
|
|
201
|
+
if (mapped)
|
|
202
|
+
out.push(mapped);
|
|
203
|
+
else if (dialect !== "claude" || name === "*" || name.startsWith("mcp__"))
|
|
204
|
+
out.push(name);
|
|
205
|
+
}
|
|
206
|
+
return [...new Set(out)];
|
|
207
|
+
}
|
|
154
208
|
//# sourceMappingURL=subagent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/agent/subagent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAsC/C,MAAM,CAAC,MAAM,aAAa,GAAuB;IAC/C,IAAI,EAAE,SAAS;IACf,WAAW,EACT,0IAA0I;IAC5I,YAAY,EAAE;;;;yPAIyO;IACvP,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;IAC3F,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,IAAI;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAuB;IAC/C,IAAI,EAAE,SAAS;IACf,WAAW,EACT,oGAAoG;IACtG,YAAY,EAAE;;8OAE8N;IAC5O,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,+BAA+B;IAC1D,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAyB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAEtF,MAAM,OAAO,gBAAgB;IACV,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEhE,YAAY,cAAoC,iBAAiB;QAC/D,KAAK,MAAM,GAAG,IAAI,WAAW;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,QAAQ,CAAC,GAAuB;QAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAC7E,UAAU,CAAC,GAAuB;QAChC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC;QACpD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YACtE,IAAI;YACJ,WAAW;YACX,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpC,CAAC,CAAC,CAAC;IACN,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/agent/subagent.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ import type { LogLevel } from "./util/logger.ts";
|
|
|
11
11
|
import type { PluginConfig } from "./plugins.ts";
|
|
12
12
|
import type { RuntimePluginConfig } from "./runtime-plugins/types.ts";
|
|
13
13
|
import type { MemoryConfig } from "./agent/memory-limits.ts";
|
|
14
|
+
import type { ImportConfig } from "./foreign.ts";
|
|
14
15
|
export interface HarnessConfig {
|
|
15
16
|
/** Default model alias, e.g. "sonnet" or "openai/gpt-4.1". */
|
|
16
17
|
model?: string;
|
|
@@ -76,6 +77,14 @@ export interface HarnessConfig {
|
|
|
76
77
|
skillDirs?: string[];
|
|
77
78
|
/** Extra directories to scan for markdown subagent definitions. */
|
|
78
79
|
agentDirs?: string[];
|
|
80
|
+
/**
|
|
81
|
+
* Read Claude Code's and Codex's own skills and agents where they lie, and
|
|
82
|
+
* offer their MCP servers in the connector list. Both on unless set to
|
|
83
|
+
* false. See `foreign.ts`.
|
|
84
|
+
*/
|
|
85
|
+
imports?: ImportConfig;
|
|
86
|
+
/** Skills switched off by name, wherever they were found. */
|
|
87
|
+
disabledSkills?: string[];
|
|
79
88
|
/** Recurring prompts, run on a cron schedule. */
|
|
80
89
|
schedules?: ScheduleDefinition[];
|
|
81
90
|
/**
|
package/dist/config.js
CHANGED
|
@@ -138,6 +138,8 @@ export function mergeConfig(base, override) {
|
|
|
138
138
|
subagents: [...(base.subagents ?? []), ...(override.subagents ?? [])],
|
|
139
139
|
skillDirs: [...(base.skillDirs ?? []), ...(override.skillDirs ?? [])],
|
|
140
140
|
agentDirs: [...(base.agentDirs ?? []), ...(override.agentDirs ?? [])],
|
|
141
|
+
imports: { ...base.imports, ...override.imports },
|
|
142
|
+
disabledSkills: [...new Set([...(base.disabledSkills ?? []), ...(override.disabledSkills ?? [])])],
|
|
141
143
|
schedules: [...(base.schedules ?? []), ...(override.schedules ?? [])],
|
|
142
144
|
writableRoots: [...(base.writableRoots ?? []), ...(override.writableRoots ?? [])],
|
|
143
145
|
readableRoots: [...(base.readableRoots ?? []), ...(override.readableRoots ?? [])],
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAU/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { McpServerConfig } from "./mcp/client.ts";
|
|
2
|
+
import type { PluginDefinition, UntranslatableReason } from "./plugins.ts";
|
|
3
|
+
/**
|
|
4
|
+
* What Claude Code and Codex already have on this machine.
|
|
5
|
+
*
|
|
6
|
+
* Someone arriving here from either has spent time collecting skills, agents
|
|
7
|
+
* and MCP servers, and an empty list beside directories full of them reads as
|
|
8
|
+
* a harness that cannot see what is in front of it. So this reads them where
|
|
9
|
+
* they lie — nothing is copied, converted or written back.
|
|
10
|
+
*
|
|
11
|
+
* The two kinds are treated differently, on the same line `plugins.ts` draws.
|
|
12
|
+
* Skills and agents are text the model reads when it chooses to, so they are
|
|
13
|
+
* loaded as found. A server is a process started at launch, often holding a
|
|
14
|
+
* token, so a server found here is only *offered*: it reaches the connector
|
|
15
|
+
* list, and starts when somebody adds it.
|
|
16
|
+
*/
|
|
17
|
+
export type ForeignSource = "claude" | "codex";
|
|
18
|
+
/** Which of the two to read. Both on unless set to false. */
|
|
19
|
+
export interface ImportConfig {
|
|
20
|
+
claudeCode?: boolean;
|
|
21
|
+
codex?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface ForeignRoot {
|
|
24
|
+
dir: string;
|
|
25
|
+
source: ForeignSource;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Skill directories, split by level so each can sit beneath this harness's
|
|
29
|
+
* own directory at the same level: a skill in `~/.oharness/skills` overrides
|
|
30
|
+
* one of the same name in `~/.claude/skills`, and a project's own beats both.
|
|
31
|
+
*/
|
|
32
|
+
export declare function foreignSkillRoots(cwd: string, config?: ImportConfig): {
|
|
33
|
+
user: ForeignRoot[];
|
|
34
|
+
project: ForeignRoot[];
|
|
35
|
+
};
|
|
36
|
+
/** Agent directories, on the same terms. Codex has no agent files to read. */
|
|
37
|
+
export declare function foreignAgentRoots(cwd: string, config?: ImportConfig): {
|
|
38
|
+
user: ForeignRoot[];
|
|
39
|
+
project: ForeignRoot[];
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* One server declared in Claude Code's or Codex's configuration.
|
|
43
|
+
*
|
|
44
|
+
* `scope` is where it was declared: `user` for everywhere, `local` for this
|
|
45
|
+
* project but only on this machine (Claude Code's per-project entries in its
|
|
46
|
+
* state file), `project` for a file checked into the repository, `plugin`
|
|
47
|
+
* for one of their installed plugins.
|
|
48
|
+
*/
|
|
49
|
+
export interface ForeignServer {
|
|
50
|
+
name: string;
|
|
51
|
+
source: ForeignSource;
|
|
52
|
+
scope: "user" | "local" | "project" | "plugin";
|
|
53
|
+
/** For `plugin`: which one, by name, and what it is called on screen. */
|
|
54
|
+
plugin?: string;
|
|
55
|
+
pluginTitle?: string;
|
|
56
|
+
/** The file it was read from, for the row that offers it. */
|
|
57
|
+
file: string;
|
|
58
|
+
/** Absent when it cannot be used here; `reason` then says why. */
|
|
59
|
+
config?: McpServerConfig;
|
|
60
|
+
reason?: UntranslatableReason;
|
|
61
|
+
/**
|
|
62
|
+
* The declaration carries a credential written out in full rather than a
|
|
63
|
+
* reference to one. Adding it copies that value into this harness's own
|
|
64
|
+
* config, which is worth saying before the click.
|
|
65
|
+
*/
|
|
66
|
+
inlineSecret?: boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Every server Claude Code and Codex declare for this project, in that order,
|
|
70
|
+
* then those inside their plugins. A plugin from either is loaded for its
|
|
71
|
+
* skills and agents, but its servers are never started on their own — see
|
|
72
|
+
* `pluginContributions` — so they are offered here like any other.
|
|
73
|
+
*/
|
|
74
|
+
export declare function foreignMcpServers(cwd: string, config?: ImportConfig, plugins?: PluginDefinition[]): Promise<ForeignServer[]>;
|
|
75
|
+
/** Find one by the key the connector list sends back. */
|
|
76
|
+
export declare function findForeignServer(cwd: string, key: {
|
|
77
|
+
source: string;
|
|
78
|
+
scope: string;
|
|
79
|
+
name: string;
|
|
80
|
+
plugin?: string;
|
|
81
|
+
}, config?: ImportConfig, plugins?: PluginDefinition[]): Promise<ForeignServer | undefined>;
|