opencode-agenthub 0.1.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 (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +373 -0
  3. package/dist/composer/bootstrap.js +493 -0
  4. package/dist/composer/builtin-assets.js +139 -0
  5. package/dist/composer/capabilities.js +20 -0
  6. package/dist/composer/compose.js +824 -0
  7. package/dist/composer/defaults.js +10 -0
  8. package/dist/composer/home-transfer.js +288 -0
  9. package/dist/composer/install-home.js +5 -0
  10. package/dist/composer/library/README.md +93 -0
  11. package/dist/composer/library/bundles/auto.json +18 -0
  12. package/dist/composer/library/bundles/build.json +17 -0
  13. package/dist/composer/library/bundles/hr-adapter.json +26 -0
  14. package/dist/composer/library/bundles/hr-cto.json +24 -0
  15. package/dist/composer/library/bundles/hr-evaluator.json +26 -0
  16. package/dist/composer/library/bundles/hr-planner.json +26 -0
  17. package/dist/composer/library/bundles/hr-sourcer.json +24 -0
  18. package/dist/composer/library/bundles/hr-verifier.json +26 -0
  19. package/dist/composer/library/bundles/hr.json +35 -0
  20. package/dist/composer/library/bundles/plan.json +19 -0
  21. package/dist/composer/library/instructions/hr-boundaries.md +38 -0
  22. package/dist/composer/library/instructions/hr-protocol.md +102 -0
  23. package/dist/composer/library/profiles/auto.json +9 -0
  24. package/dist/composer/library/profiles/hr.json +9 -0
  25. package/dist/composer/library/souls/auto.md +29 -0
  26. package/dist/composer/library/souls/build.md +21 -0
  27. package/dist/composer/library/souls/hr-adapter.md +64 -0
  28. package/dist/composer/library/souls/hr-cto.md +57 -0
  29. package/dist/composer/library/souls/hr-evaluator.md +64 -0
  30. package/dist/composer/library/souls/hr-planner.md +48 -0
  31. package/dist/composer/library/souls/hr-sourcer.md +70 -0
  32. package/dist/composer/library/souls/hr-verifier.md +62 -0
  33. package/dist/composer/library/souls/hr.md +186 -0
  34. package/dist/composer/library/souls/plan.md +23 -0
  35. package/dist/composer/library/workflow/auto-mode.json +139 -0
  36. package/dist/composer/model-utils.js +39 -0
  37. package/dist/composer/opencode-profile.js +2299 -0
  38. package/dist/composer/package-manager.js +75 -0
  39. package/dist/composer/package-version.js +20 -0
  40. package/dist/composer/platform.js +48 -0
  41. package/dist/composer/query.js +133 -0
  42. package/dist/composer/settings.js +400 -0
  43. package/dist/plugins/opencode-agenthub.js +310 -0
  44. package/dist/plugins/opencode-question.js +223 -0
  45. package/dist/plugins/plan-guidance.js +263 -0
  46. package/dist/plugins/runtime-config.js +57 -0
  47. package/dist/skills/agenthub-doctor/SKILL.md +238 -0
  48. package/dist/skills/agenthub-doctor/diagnose.js +213 -0
  49. package/dist/skills/agenthub-doctor/fix.js +293 -0
  50. package/dist/skills/agenthub-doctor/index.js +30 -0
  51. package/dist/skills/agenthub-doctor/interactive.js +756 -0
  52. package/dist/skills/hr-assembly/SKILL.md +121 -0
  53. package/dist/skills/hr-final-check/SKILL.md +98 -0
  54. package/dist/skills/hr-review/SKILL.md +100 -0
  55. package/dist/skills/hr-staffing/SKILL.md +85 -0
  56. package/dist/skills/hr-support/bin/sync_sources.py +560 -0
  57. package/dist/skills/hr-support/bin/validate_staged_package.py +290 -0
  58. package/dist/skills/hr-support/bin/vendor_stage_mcps.py +234 -0
  59. package/dist/skills/hr-support/bin/vendor_stage_skills.py +104 -0
  60. package/dist/types.js +11 -0
  61. package/package.json +54 -0
@@ -0,0 +1,10 @@
1
+ const DEFAULT_PROFILE_PLUGINS = [
2
+ "opencode-agenthub"
3
+ ];
4
+ const getDefaultProfilePlugins = () => [
5
+ ...DEFAULT_PROFILE_PLUGINS
6
+ ];
7
+ export {
8
+ DEFAULT_PROFILE_PLUGINS,
9
+ getDefaultProfilePlugins
10
+ };
@@ -0,0 +1,288 @@
1
+ import { cp, mkdir, readdir, readFile, stat, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { defaultAgentHubHome, ensureAgentHubSkeleton } from "./bootstrap.js";
4
+ import { installPackageDependencies } from "./package-manager.js";
5
+ const libraryRootPlaceholder = "${LIBRARY_ROOT}";
6
+ const repoRootPlaceholder = "${REPO_ROOT}";
7
+ const repoSrcRootPlaceholder = "${REPO_SRC_ROOT}";
8
+ const managedDirectories = [
9
+ "souls",
10
+ "instructions",
11
+ "skills",
12
+ "workflow",
13
+ "bundles",
14
+ "profiles",
15
+ "mcp",
16
+ "mcp-servers"
17
+ ];
18
+ const exportManifestFileName = "agenthub-export.json";
19
+ const settingsFileName = "settings.json";
20
+ const installImportedMcpServerDependencies = async (targetRoot, report) => {
21
+ const targetMcpServersRoot = path.join(targetRoot, "mcp-servers");
22
+ if (!await pathExists(targetMcpServersRoot)) return;
23
+ const packageManifest = path.join(targetMcpServersRoot, "package.json");
24
+ if (!await pathExists(packageManifest)) return;
25
+ try {
26
+ await installPackageDependencies(targetMcpServersRoot);
27
+ } catch (error) {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ report.warnings.push(`Failed to install MCP server dependencies: ${message}`);
30
+ }
31
+ };
32
+ const pathExists = async (target) => {
33
+ try {
34
+ await stat(target);
35
+ return true;
36
+ } catch {
37
+ return false;
38
+ }
39
+ };
40
+ const ensureCleanDirectory = async (target) => {
41
+ await mkdir(target, { recursive: true });
42
+ };
43
+ const isAbsolutePathString = (value) => path.isAbsolute(value) || /^[A-Za-z]:[\\/]/.test(value);
44
+ const normalizeMcpValue = (value, sourceRoot, relativeFile, warnings) => {
45
+ if (typeof value === "string") {
46
+ let normalized = value;
47
+ if (normalized.includes(sourceRoot)) {
48
+ normalized = normalized.split(sourceRoot).join(libraryRootPlaceholder);
49
+ }
50
+ if (isAbsolutePathString(normalized) && !normalized.includes(libraryRootPlaceholder) && !normalized.includes(repoRootPlaceholder) && !normalized.includes(repoSrcRootPlaceholder)) {
51
+ warnings.push(
52
+ `MCP entry '${relativeFile}' contains an absolute path that may not be portable: ${value}`
53
+ );
54
+ }
55
+ return normalized;
56
+ }
57
+ if (Array.isArray(value)) {
58
+ return value.map(
59
+ (item) => normalizeMcpValue(item, sourceRoot, relativeFile, warnings)
60
+ );
61
+ }
62
+ if (value && typeof value === "object") {
63
+ return Object.fromEntries(
64
+ Object.entries(value).map(([key, nested]) => [
65
+ key,
66
+ normalizeMcpValue(nested, sourceRoot, relativeFile, warnings)
67
+ ])
68
+ );
69
+ }
70
+ return value;
71
+ };
72
+ const copyManagedTree = async (sourceRoot, targetRoot, name) => {
73
+ const source = path.join(sourceRoot, name);
74
+ if (!await pathExists(source)) return false;
75
+ await cp(source, path.join(targetRoot, name), { recursive: true });
76
+ return true;
77
+ };
78
+ const writeNormalizedMcpEntries = async (sourceRoot, outputRoot, warnings) => {
79
+ const sourceMcpRoot = path.join(sourceRoot, "mcp");
80
+ if (!await pathExists(sourceMcpRoot)) return false;
81
+ const outputMcpRoot = path.join(outputRoot, "mcp");
82
+ await mkdir(outputMcpRoot, { recursive: true });
83
+ for (const entry of await readdir(sourceMcpRoot, { withFileTypes: true })) {
84
+ if (!entry.isFile() || !entry.name.endsWith(".json")) continue;
85
+ const sourceFile = path.join(sourceMcpRoot, entry.name);
86
+ const relativeFile = path.join("mcp", entry.name);
87
+ const parsed = JSON.parse(await readFile(sourceFile, "utf8"));
88
+ const normalized = normalizeMcpValue(parsed, sourceRoot, relativeFile, warnings);
89
+ await writeFile(
90
+ path.join(outputMcpRoot, entry.name),
91
+ `${JSON.stringify(normalized, null, 2)}
92
+ `,
93
+ "utf8"
94
+ );
95
+ }
96
+ return true;
97
+ };
98
+ const detectContents = async (root) => {
99
+ const entries = await Promise.all([
100
+ ...managedDirectories.map((name) => pathExists(path.join(root, name))),
101
+ pathExists(path.join(root, settingsFileName))
102
+ ]);
103
+ return {
104
+ souls: entries[0],
105
+ instructions: entries[1],
106
+ skills: entries[2],
107
+ workflow: entries[3],
108
+ bundles: entries[4],
109
+ profiles: entries[5],
110
+ mcp: entries[6],
111
+ "mcp-servers": entries[7],
112
+ settings: entries[8]
113
+ };
114
+ };
115
+ const isRawImportSource = async (sourceRoot) => {
116
+ const contents = await detectContents(sourceRoot);
117
+ return contents.bundles && contents.profiles;
118
+ };
119
+ const detectImportSourceKind = async (sourceRoot) => {
120
+ if (await pathExists(path.join(sourceRoot, exportManifestFileName))) {
121
+ return "export";
122
+ }
123
+ if (await isRawImportSource(sourceRoot)) {
124
+ return "raw";
125
+ }
126
+ throw new Error(
127
+ `Import source '${sourceRoot}' is neither an export bundle nor a raw Agent Hub home/vault. Expected ${exportManifestFileName} or at least 'bundles/' and 'profiles/'.`
128
+ );
129
+ };
130
+ const readExportManifest = async (sourceRoot) => {
131
+ const manifestPath = path.join(sourceRoot, exportManifestFileName);
132
+ if (!await pathExists(manifestPath)) {
133
+ throw new Error(
134
+ `Export source '${sourceRoot}' is missing ${exportManifestFileName}. Run 'hub-export' first.`
135
+ );
136
+ }
137
+ const manifest = JSON.parse(await readFile(manifestPath, "utf8"));
138
+ if (manifest.formatVersion !== 1) {
139
+ throw new Error(
140
+ `Unsupported export format version '${String(manifest.formatVersion)}'.`
141
+ );
142
+ }
143
+ return manifest;
144
+ };
145
+ const validateAgentHubHome = async (targetRoot) => {
146
+ const contents = await detectContents(targetRoot);
147
+ return contents.souls && contents.skills && contents.bundles && contents.profiles;
148
+ };
149
+ const exportAgentHubHome = async ({
150
+ sourceRoot = defaultAgentHubHome(),
151
+ outputRoot,
152
+ pluginVersion = "0.0.0"
153
+ }) => {
154
+ const resolvedSourceRoot = path.resolve(sourceRoot);
155
+ const resolvedOutputRoot = path.resolve(outputRoot);
156
+ if (!await validateAgentHubHome(resolvedSourceRoot)) {
157
+ throw new Error(
158
+ `Source '${resolvedSourceRoot}' is not an initialized Agent Hub home.`
159
+ );
160
+ }
161
+ await ensureCleanDirectory(resolvedOutputRoot);
162
+ const warnings = [];
163
+ const copied = [];
164
+ for (const name of managedDirectories) {
165
+ if (name === "mcp") continue;
166
+ if (await copyManagedTree(resolvedSourceRoot, resolvedOutputRoot, name)) {
167
+ copied.push(name);
168
+ }
169
+ }
170
+ if (await writeNormalizedMcpEntries(resolvedSourceRoot, resolvedOutputRoot, warnings)) {
171
+ copied.push("mcp");
172
+ }
173
+ const sourceSettings = path.join(resolvedSourceRoot, settingsFileName);
174
+ let settingsAction = "absent";
175
+ if (await pathExists(sourceSettings)) {
176
+ await writeFile(
177
+ path.join(resolvedOutputRoot, settingsFileName),
178
+ await readFile(sourceSettings, "utf8"),
179
+ "utf8"
180
+ );
181
+ copied.push(settingsFileName);
182
+ settingsAction = "copied";
183
+ }
184
+ const contents = await detectContents(resolvedOutputRoot);
185
+ const manifest = {
186
+ formatVersion: 1,
187
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
188
+ pluginVersion,
189
+ sourceRoot: resolvedSourceRoot,
190
+ contents,
191
+ warnings
192
+ };
193
+ await writeFile(
194
+ path.join(resolvedOutputRoot, exportManifestFileName),
195
+ `${JSON.stringify(manifest, null, 2)}
196
+ `,
197
+ "utf8"
198
+ );
199
+ return {
200
+ sourceRoot: resolvedSourceRoot,
201
+ targetRoot: resolvedOutputRoot,
202
+ copied,
203
+ skipped: [],
204
+ overwritten: [],
205
+ warnings,
206
+ settingsAction
207
+ };
208
+ };
209
+ const importDirectoryEntries = async (sourceRoot, targetRoot, overwrite, report) => {
210
+ for (const name of managedDirectories) {
211
+ const source = path.join(sourceRoot, name);
212
+ if (!await pathExists(source)) continue;
213
+ const target = path.join(targetRoot, name);
214
+ await mkdir(target, { recursive: true });
215
+ for (const entry of await readdir(source, { withFileTypes: true })) {
216
+ const sourceEntry = path.join(source, entry.name);
217
+ const targetEntry = path.join(target, entry.name);
218
+ if (await pathExists(targetEntry)) {
219
+ if (!overwrite) {
220
+ report.skipped.push(path.join(name, entry.name));
221
+ continue;
222
+ }
223
+ report.overwritten.push(path.join(name, entry.name));
224
+ } else {
225
+ report.copied.push(path.join(name, entry.name));
226
+ }
227
+ await cp(sourceEntry, targetEntry, { recursive: true, force: overwrite });
228
+ }
229
+ }
230
+ };
231
+ const importSettingsFile = async (sourceRoot, targetRoot, mode, report) => {
232
+ const source = path.join(sourceRoot, settingsFileName);
233
+ if (!await pathExists(source)) {
234
+ report.settingsAction = "absent";
235
+ return;
236
+ }
237
+ const target = path.join(targetRoot, settingsFileName);
238
+ if (await pathExists(target)) {
239
+ if (mode === "preserve") {
240
+ report.settingsAction = "preserved";
241
+ report.skipped.push(settingsFileName);
242
+ return;
243
+ }
244
+ report.settingsAction = "replaced";
245
+ report.overwritten.push(settingsFileName);
246
+ } else {
247
+ report.settingsAction = "copied";
248
+ report.copied.push(settingsFileName);
249
+ }
250
+ await writeFile(target, await readFile(source, "utf8"), "utf8");
251
+ };
252
+ const importAgentHubHome = async ({
253
+ sourceRoot,
254
+ targetRoot = defaultAgentHubHome(),
255
+ overwrite = false,
256
+ settingsMode = "preserve"
257
+ }) => {
258
+ const resolvedSourceRoot = path.resolve(sourceRoot);
259
+ const resolvedTargetRoot = path.resolve(targetRoot);
260
+ const sourceKind = await detectImportSourceKind(resolvedSourceRoot);
261
+ await ensureAgentHubSkeleton(resolvedTargetRoot);
262
+ const report = {
263
+ sourceRoot: resolvedSourceRoot,
264
+ targetRoot: resolvedTargetRoot,
265
+ sourceKind,
266
+ copied: [],
267
+ skipped: [],
268
+ overwritten: [],
269
+ warnings: sourceKind === "export" ? [...(await readExportManifest(resolvedSourceRoot)).warnings] : [
270
+ "Importing from a raw Agent Hub home/vault. Files are copied as-is; no export manifest normalization was applied."
271
+ ],
272
+ settingsAction: "absent"
273
+ };
274
+ await importDirectoryEntries(resolvedSourceRoot, resolvedTargetRoot, overwrite, report);
275
+ await importSettingsFile(
276
+ resolvedSourceRoot,
277
+ resolvedTargetRoot,
278
+ settingsMode,
279
+ report
280
+ );
281
+ await installImportedMcpServerDependencies(resolvedTargetRoot, report);
282
+ return report;
283
+ };
284
+ export {
285
+ exportAgentHubHome,
286
+ importAgentHubHome,
287
+ validateAgentHubHome
288
+ };
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { installAgentHubHome } from "./bootstrap.js";
3
+ const targetRoot = await installAgentHubHome();
4
+ process.stdout.write(`${targetRoot}
5
+ `);
@@ -0,0 +1,93 @@
1
+ # opencode-agenthub library
2
+
3
+ This directory is the built-in library shipped with the package. When you run `agenthub setup auto`, the coding assets here are installed into your Agent Hub Home (`~/.config/opencode-agenthub/` by default).
4
+
5
+ Examples below use the short CLI command `agenthub`. `opencode-agenthub` remains a compatibility alias.
6
+
7
+ ## Asset layers
8
+
9
+ Core layers:
10
+
11
+ - `souls/` — agent identity files (system prompts). One file per agent.
12
+ - `bundles/` — bundle definitions (JSON). Each bundle maps one or more agents to a soul, skills, model, and tools.
13
+ - `profiles/` — profile definitions (JSON). A profile selects which bundles to activate in a workspace.
14
+ - `skills/` — skill directories. Each skill has a `SKILL.md` that opencode can load at runtime.
15
+
16
+ Advanced / optional layers:
17
+
18
+ - `instructions/` — shared instruction documents referenced by bundles.
19
+ - `mcp/` — MCP server registration JSONs.
20
+ - `mcp-servers/` — MCP server scripts referenced by `mcp/*.json`.
21
+
22
+ `setup auto` keeps the initial home small. Optional directories such as `instructions/`, `mcp/`, and `mcp-servers/` are created when you actually use them.
23
+
24
+ ## Built-in profiles
25
+
26
+ | Profile | Bundles included |
27
+ |---|---|
28
+ | `auto` | `auto`, `plan`, `build` |
29
+ | `hr` | `hr`, `hr-sourcer`, `hr-evaluator`, `hr-cto`, `hr-adapter`, `hr-verifier`, `auto`, `plan`, `build` |
30
+
31
+ ## Asset model
32
+
33
+ ```
34
+ agent = soul + bundle + skills + runtime + policy
35
+ ```
36
+
37
+ - **soul** — system prompt / behavioral identity (`souls/<name>.md`)
38
+ - **bundle** — agent definition: soul ref, model, skills, MCP, tool policy (`bundles/<name>.json`)
39
+ - **profile** — workspace composition: which bundles + which plugin + default agent (`profiles/<name>.json`)
40
+ - **skill** — injectable capability loaded on demand (`skills/<name>/SKILL.md`)
41
+
42
+ ## MCP servers
43
+
44
+ To add a custom MCP server:
45
+
46
+ 1. Put the server implementation in `mcp-servers/my-tool.ts`
47
+ 2. Put the registration JSON in `mcp/my-tool.json`
48
+ 3. Reference the MCP name in a bundle's `mcp` array
49
+
50
+ If you stage or export a team that depends on MCP tools, both directories matter:
51
+
52
+ - `mcp/` contains the registration JSONs
53
+ - `mcp-servers/` contains the runnable server implementations (and optionally `package.json` for dependencies)
54
+
55
+ Shipping only `mcp/*.json` without the referenced `mcp-servers/` files is incomplete and will fail at runtime.
56
+
57
+ Example `mcp/my-tool.json`:
58
+
59
+ ```json
60
+ {
61
+ "type": "local",
62
+ "command": ["bun", "${LIBRARY_ROOT}/mcp-servers/my-tool.ts"],
63
+ "timeout": 30000
64
+ }
65
+ ```
66
+
67
+ Available path tokens inside MCP JSON values: `${LIBRARY_ROOT}`, `${REPO_SRC_ROOT}`, `${REPO_ROOT}`.
68
+
69
+ ## Hub Home resolution order
70
+
71
+ 1. `OPENCODE_AGENTHUB_HOME` environment variable
72
+ 2. `~/.config/opencode-agenthub`
73
+ 3. Built-in repo fallback under `src/composer/library`
74
+
75
+ ## Example commands
76
+
77
+ ```bash
78
+ agenthub setup auto
79
+ agenthub start
80
+ agenthub hr
81
+ agenthub hr recruiter-team
82
+ agenthub new bundle my-bundle
83
+ agenthub new profile my-profile
84
+ agenthub backup --output ./agenthub-backup
85
+ agenthub restore --source ./agenthub-backup --overwrite
86
+ ```
87
+
88
+ ## Restore / import behavior
89
+
90
+ - Skips colliding files by default and reports them
91
+ - `--overwrite` replaces colliding files
92
+ - `--settings replace` replaces the target `settings.json` (default: `preserve`)
93
+ - `hub-import` remains available for advanced import into a chosen target home
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "auto",
3
+ "runtime": "native",
4
+ "soul": "auto",
5
+ "skills": [],
6
+ "mcp": [],
7
+ "guards": ["no_omo"],
8
+ "agent": {
9
+ "name": "auto",
10
+ "mode": "primary",
11
+ "hidden": false,
12
+ "model": "github-copilot/claude-sonnet-4.5",
13
+ "description": "Default coding agent with OMO-style intent detection and native build/edit/test workflow",
14
+ "permission": {
15
+ "*": "allow"
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "build",
3
+ "runtime": "native",
4
+ "soul": "build",
5
+ "skills": [],
6
+ "mcp": [],
7
+ "agent": {
8
+ "name": "build",
9
+ "mode": "primary",
10
+ "hidden": false,
11
+ "model": "github-copilot/gpt-5",
12
+ "description": "Execution-focused coding agent with strong completion and verification discipline",
13
+ "permission": {
14
+ "*": "allow"
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "hr-adapter",
3
+ "runtime": "native",
4
+ "soul": "hr-adapter",
5
+ "instructions": [
6
+ "hr-boundaries"
7
+ ],
8
+ "skills": [
9
+ "hr-assembly"
10
+ ],
11
+ "mcp": [],
12
+ "guards": [
13
+ "no_task",
14
+ "no_omo"
15
+ ],
16
+ "agent": {
17
+ "name": "hr-adapter",
18
+ "mode": "subagent",
19
+ "hidden": true,
20
+ "model": "github-copilot/gpt-5",
21
+ "description": "Adapts approved candidates into staged Agent Hub packages without mutating the imported home.",
22
+ "permission": {
23
+ "*": "allow"
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "hr-cto",
3
+ "runtime": "native",
4
+ "soul": "hr-cto",
5
+ "instructions": [
6
+ "hr-boundaries"
7
+ ],
8
+ "skills": [],
9
+ "mcp": [],
10
+ "guards": [
11
+ "no_task",
12
+ "no_omo"
13
+ ],
14
+ "agent": {
15
+ "name": "hr-cto",
16
+ "mode": "subagent",
17
+ "hidden": true,
18
+ "model": "github-copilot/gpt-5",
19
+ "description": "CTO-style architecture reviewer for staffing structure, role overlap, and downstream composition choices.",
20
+ "permission": {
21
+ "*": "allow"
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "hr-evaluator",
3
+ "runtime": "native",
4
+ "soul": "hr-evaluator",
5
+ "instructions": [
6
+ "hr-boundaries"
7
+ ],
8
+ "skills": [
9
+ "hr-review"
10
+ ],
11
+ "mcp": [],
12
+ "guards": [
13
+ "no_task",
14
+ "no_omo"
15
+ ],
16
+ "agent": {
17
+ "name": "hr-evaluator",
18
+ "mode": "subagent",
19
+ "hidden": true,
20
+ "model": "github-copilot/claude-opus-4.6",
21
+ "description": "Reviews local inventory candidates for risk, compatibility, testing readiness, and description clarity.",
22
+ "permission": {
23
+ "*": "allow"
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "hr-planner",
3
+ "runtime": "native",
4
+ "soul": "hr-planner",
5
+ "instructions": [
6
+ "hr-boundaries"
7
+ ],
8
+ "skills": [
9
+ "hr-staffing"
10
+ ],
11
+ "mcp": [],
12
+ "guards": [
13
+ "no_task",
14
+ "no_omo"
15
+ ],
16
+ "agent": {
17
+ "name": "hr-planner",
18
+ "mode": "subagent",
19
+ "hidden": true,
20
+ "model": "github-copilot/gpt-5",
21
+ "description": "Builds the staffing-plan deliverable after requirements are confirmed, including options, draft naming, and initial model recommendations.",
22
+ "permission": {
23
+ "*": "allow"
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "hr-sourcer",
3
+ "runtime": "native",
4
+ "soul": "hr-sourcer",
5
+ "instructions": [
6
+ "hr-boundaries"
7
+ ],
8
+ "skills": [],
9
+ "mcp": [],
10
+ "guards": [
11
+ "no_task",
12
+ "no_omo"
13
+ ],
14
+ "agent": {
15
+ "name": "hr-sourcer",
16
+ "mode": "subagent",
17
+ "hidden": true,
18
+ "model": "github-copilot/gpt-5",
19
+ "description": "Scans configured GitHub repos, refreshes local inventory worker cards, and classifies discovered agents and skills.",
20
+ "permission": {
21
+ "*": "allow"
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "hr-verifier",
3
+ "runtime": "native",
4
+ "soul": "hr-verifier",
5
+ "instructions": [
6
+ "hr-boundaries"
7
+ ],
8
+ "skills": [
9
+ "hr-final-check"
10
+ ],
11
+ "mcp": [],
12
+ "guards": [
13
+ "no_task",
14
+ "no_omo"
15
+ ],
16
+ "agent": {
17
+ "name": "hr-verifier",
18
+ "mode": "subagent",
19
+ "hidden": true,
20
+ "model": "github-copilot/claude-sonnet-4.6",
21
+ "description": "Runs final package QA for clarity, safety, and import readiness before human confirmation.",
22
+ "permission": {
23
+ "*": "allow"
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "hr",
3
+ "runtime": "native",
4
+ "soul": "hr",
5
+ "instructions": [
6
+ "hr-boundaries",
7
+ "hr-protocol"
8
+ ],
9
+ "skills": [],
10
+ "mcp": [],
11
+ "guards": [
12
+ "read_only",
13
+ "no_omo"
14
+ ],
15
+ "agent": {
16
+ "name": "hr",
17
+ "mode": "primary",
18
+ "hidden": false,
19
+ "steps": 3,
20
+ "model": "github-copilot/gpt-5",
21
+ "description": "Primary HR orchestration console that gathers requirements, keeps stage gates, dispatches hidden HR workers, and reports important decisions back to the user.",
22
+ "permission": {
23
+ "*": "allow",
24
+ "task": {
25
+ "*": "deny",
26
+ "hr-planner": "allow",
27
+ "hr-sourcer": "allow",
28
+ "hr-evaluator": "allow",
29
+ "hr-cto": "allow",
30
+ "hr-adapter": "allow",
31
+ "hr-verifier": "allow"
32
+ }
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "plan",
3
+ "runtime": "native",
4
+ "soul": "plan",
5
+ "skills": [],
6
+ "mcp": [],
7
+ "agent": {
8
+ "name": "plan",
9
+ "mode": "primary",
10
+ "hidden": false,
11
+ "model": "github-copilot/claude-sonnet-4.5",
12
+ "description": "Read-only planning agent for repo-grounded implementation plans",
13
+ "permission": {
14
+ "*": "allow",
15
+ "edit": "ask",
16
+ "bash": "ask"
17
+ }
18
+ }
19
+ }