agenticros 0.3.1 → 0.3.3
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/README.md +8 -3
- package/dist/__tests__/hermes-config.test.d.ts +2 -0
- package/dist/__tests__/hermes-config.test.d.ts.map +1 -0
- package/dist/__tests__/hermes-config.test.js +88 -0
- package/dist/__tests__/hermes-config.test.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +13 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/hermes.d.ts +14 -0
- package/dist/commands/hermes.d.ts.map +1 -0
- package/dist/commands/hermes.js +84 -0
- package/dist/commands/hermes.js.map +1 -0
- package/dist/commands/init.d.ts +2 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +21 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/util/hermes-config.d.ts +51 -0
- package/dist/util/hermes-config.d.ts.map +1 -0
- package/dist/util/hermes-config.js +277 -0
- package/dist/util/hermes-config.js.map +1 -0
- package/package.json +2 -1
- package/runtime/BUNDLE.json +1 -1
- package/runtime/README.md +87 -10
- package/runtime/docs/cli.md +49 -2
- package/runtime/packages/agenticros-claude-code/README.md +35 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read/write helpers for Hermes Agent MCP config (`~/.hermes/config.yaml`).
|
|
3
|
+
*
|
|
4
|
+
* Hermes stores MCP servers under `mcp_servers.<name>` in YAML. We only
|
|
5
|
+
* manage the `agenticros` entry — other servers are preserved.
|
|
6
|
+
*/
|
|
7
|
+
export interface HermesAgenticrosConfig {
|
|
8
|
+
configPath: string;
|
|
9
|
+
exists: boolean;
|
|
10
|
+
command?: string;
|
|
11
|
+
args?: string[];
|
|
12
|
+
env?: Record<string, string>;
|
|
13
|
+
connectTimeout?: number;
|
|
14
|
+
timeout?: number;
|
|
15
|
+
enabled?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface HermesConfigIssue {
|
|
18
|
+
severity: "red" | "yellow";
|
|
19
|
+
message: string;
|
|
20
|
+
hint?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface HermesConfigValidation {
|
|
23
|
+
ok: boolean;
|
|
24
|
+
issues: HermesConfigIssue[];
|
|
25
|
+
}
|
|
26
|
+
/** Global Hermes config: `~/.hermes/config.yaml`. */
|
|
27
|
+
export declare function globalHermesConfigPath(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Build the YAML block for the AgenticROS MCP server. Uses an absolute path
|
|
30
|
+
* to index.js (required by Hermes stdio transport) and leaves namespace empty
|
|
31
|
+
* so `~/.agenticros/config.json` / `agenticros mode` drives the active robot.
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildAgenticrosMcpYamlBlock(mcpEntryAbs: string, namespace?: string): string;
|
|
34
|
+
/** Insert or replace the agenticros MCP block, preserving other YAML content. */
|
|
35
|
+
export declare function upsertAgenticrosBlock(existingContent: string | null, block: string): string;
|
|
36
|
+
/** Parse the agenticros MCP section from a Hermes config.yaml file. */
|
|
37
|
+
export declare function readHermesAgenticrosConfig(configPath: string): HermesAgenticrosConfig;
|
|
38
|
+
export declare function writeHermesAgenticrosConfig(configPath: string, mcpEntryAbs: string, options?: {
|
|
39
|
+
namespace?: string;
|
|
40
|
+
}): void;
|
|
41
|
+
/** Validate Hermes agenticros MCP config against expected MCP binary path. */
|
|
42
|
+
export declare function validateHermesAgenticrosConfig(cfg: HermesAgenticrosConfig, mcpEntryExpected?: string): HermesConfigValidation;
|
|
43
|
+
/** Doctor check entries for Hermes MCP config (used by `agenticros doctor`). */
|
|
44
|
+
export declare function buildHermesDoctorChecks(mcpEntryExpected: string | undefined): Array<{
|
|
45
|
+
id: string;
|
|
46
|
+
label: string;
|
|
47
|
+
severity: "green" | "yellow" | "red";
|
|
48
|
+
hint?: string;
|
|
49
|
+
detail?: string;
|
|
50
|
+
}>;
|
|
51
|
+
//# sourceMappingURL=hermes-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes-config.d.ts","sourceRoot":"","sources":["../../src/util/hermes-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAKD,qDAAqD;AACrD,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,MAAM,CAYvF;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA+B3F;AAED,uEAAuE;AACvE,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,sBAAsB,CA4BrF;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,IAAI,CAON;AAED,8EAA8E;AAC9E,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,sBAAsB,EAC3B,gBAAgB,CAAC,EAAE,MAAM,GACxB,sBAAsB,CAyExB;AAED,gFAAgF;AAChF,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyC5G"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read/write helpers for Hermes Agent MCP config (`~/.hermes/config.yaml`).
|
|
3
|
+
*
|
|
4
|
+
* Hermes stores MCP servers under `mcp_servers.<name>` in YAML. We only
|
|
5
|
+
* manage the `agenticros` entry — other servers are preserved.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { homedir } from "node:os";
|
|
9
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
10
|
+
const MCP_SERVERS_KEY = "mcp_servers:";
|
|
11
|
+
const AGENTICROS_KEY = "agenticros:";
|
|
12
|
+
/** Global Hermes config: `~/.hermes/config.yaml`. */
|
|
13
|
+
export function globalHermesConfigPath() {
|
|
14
|
+
return join(homedir(), ".hermes", "config.yaml");
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build the YAML block for the AgenticROS MCP server. Uses an absolute path
|
|
18
|
+
* to index.js (required by Hermes stdio transport) and leaves namespace empty
|
|
19
|
+
* so `~/.agenticros/config.json` / `agenticros mode` drives the active robot.
|
|
20
|
+
*/
|
|
21
|
+
export function buildAgenticrosMcpYamlBlock(mcpEntryAbs, namespace = "") {
|
|
22
|
+
const escaped = mcpEntryAbs.replace(/\\/g, "\\\\");
|
|
23
|
+
const nsYaml = namespace.replace(/"/g, '\\"');
|
|
24
|
+
return `${MCP_SERVERS_KEY}
|
|
25
|
+
${AGENTICROS_KEY}
|
|
26
|
+
command: "node"
|
|
27
|
+
args: ["${escaped}"]
|
|
28
|
+
env:
|
|
29
|
+
AGENTICROS_ROBOT_NAMESPACE: "${nsYaml}"
|
|
30
|
+
connect_timeout: 60
|
|
31
|
+
timeout: 120
|
|
32
|
+
`;
|
|
33
|
+
}
|
|
34
|
+
/** Insert or replace the agenticros MCP block, preserving other YAML content. */
|
|
35
|
+
export function upsertAgenticrosBlock(existingContent, block) {
|
|
36
|
+
const trimmedBlock = block.trimEnd() + "\n";
|
|
37
|
+
if (!existingContent?.trim()) {
|
|
38
|
+
return trimmedBlock;
|
|
39
|
+
}
|
|
40
|
+
const lines = existingContent.split("\n");
|
|
41
|
+
const mcpIdx = lines.findIndex((l) => l.trim() === MCP_SERVERS_KEY);
|
|
42
|
+
if (mcpIdx < 0) {
|
|
43
|
+
const sep = lines.length > 0 && lines[lines.length - 1]?.trim() !== "" ? "\n" : "";
|
|
44
|
+
return lines.join("\n") + sep + trimmedBlock;
|
|
45
|
+
}
|
|
46
|
+
const agentIdx = findAgenticrosLineIndex(lines, mcpIdx);
|
|
47
|
+
if (agentIdx < 0) {
|
|
48
|
+
const insertAt = findMcpServersInsertPoint(lines, mcpIdx);
|
|
49
|
+
const agentLines = trimmedBlock
|
|
50
|
+
.split("\n")
|
|
51
|
+
.slice(1)
|
|
52
|
+
.filter((l) => l.trim().length > 0);
|
|
53
|
+
const out = [...lines.slice(0, insertAt), ...agentLines, ...lines.slice(insertAt)];
|
|
54
|
+
return out.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
|
|
55
|
+
}
|
|
56
|
+
const endIdx = findAgenticrosEndIndex(lines, agentIdx);
|
|
57
|
+
const agentLines = trimmedBlock
|
|
58
|
+
.split("\n")
|
|
59
|
+
.slice(1)
|
|
60
|
+
.filter((l) => l.startsWith(" "));
|
|
61
|
+
const out = [...lines.slice(0, agentIdx), ...agentLines, ...lines.slice(endIdx)];
|
|
62
|
+
return out.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
|
|
63
|
+
}
|
|
64
|
+
/** Parse the agenticros MCP section from a Hermes config.yaml file. */
|
|
65
|
+
export function readHermesAgenticrosConfig(configPath) {
|
|
66
|
+
const base = { configPath, exists: existsSync(configPath) };
|
|
67
|
+
if (!base.exists)
|
|
68
|
+
return base;
|
|
69
|
+
let content;
|
|
70
|
+
try {
|
|
71
|
+
content = readFileSync(configPath, "utf8");
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return base;
|
|
75
|
+
}
|
|
76
|
+
const lines = content.split("\n");
|
|
77
|
+
const mcpIdx = lines.findIndex((l) => l.trim() === MCP_SERVERS_KEY);
|
|
78
|
+
if (mcpIdx < 0)
|
|
79
|
+
return base;
|
|
80
|
+
const agentIdx = findAgenticrosLineIndex(lines, mcpIdx);
|
|
81
|
+
if (agentIdx < 0)
|
|
82
|
+
return base;
|
|
83
|
+
const endIdx = findAgenticrosEndIndex(lines, agentIdx);
|
|
84
|
+
const section = lines.slice(agentIdx, endIdx).join("\n");
|
|
85
|
+
base.command = parseYamlString(section, "command");
|
|
86
|
+
base.args = parseYamlStringArray(section, "args");
|
|
87
|
+
base.env = parseYamlEnvBlock(section);
|
|
88
|
+
base.connectTimeout = parseYamlNumber(section, "connect_timeout");
|
|
89
|
+
base.timeout = parseYamlNumber(section, "timeout");
|
|
90
|
+
base.enabled = parseYamlBoolean(section, "enabled");
|
|
91
|
+
return base;
|
|
92
|
+
}
|
|
93
|
+
export function writeHermesAgenticrosConfig(configPath, mcpEntryAbs, options) {
|
|
94
|
+
const abs = resolve(mcpEntryAbs);
|
|
95
|
+
const block = buildAgenticrosMcpYamlBlock(abs, options?.namespace ?? "");
|
|
96
|
+
const existing = existsSync(configPath) ? readFileSync(configPath, "utf8") : null;
|
|
97
|
+
const merged = upsertAgenticrosBlock(existing, block);
|
|
98
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
99
|
+
writeFileSync(configPath, merged, "utf8");
|
|
100
|
+
}
|
|
101
|
+
/** Validate Hermes agenticros MCP config against expected MCP binary path. */
|
|
102
|
+
export function validateHermesAgenticrosConfig(cfg, mcpEntryExpected) {
|
|
103
|
+
const issues = [];
|
|
104
|
+
if (!cfg.exists) {
|
|
105
|
+
issues.push({
|
|
106
|
+
severity: "yellow",
|
|
107
|
+
message: `Hermes config missing (${cfg.configPath})`,
|
|
108
|
+
hint: "Run `agenticros hermes setup` to register the AgenticROS MCP server.",
|
|
109
|
+
});
|
|
110
|
+
return { ok: false, issues };
|
|
111
|
+
}
|
|
112
|
+
if (!cfg.command && (!cfg.args || cfg.args.length === 0)) {
|
|
113
|
+
issues.push({
|
|
114
|
+
severity: "red",
|
|
115
|
+
message: "Hermes mcp_servers.agenticros has no command or args",
|
|
116
|
+
hint: "Run `agenticros hermes setup` to repair the entry.",
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
const mcpPath = cfg.args?.[0];
|
|
120
|
+
if (mcpPath && !isAbsolute(mcpPath)) {
|
|
121
|
+
issues.push({
|
|
122
|
+
severity: "red",
|
|
123
|
+
message: "Hermes MCP path is relative — Hermes cwd is not the repo root",
|
|
124
|
+
hint: "Run `agenticros hermes setup` to rewrite with an absolute path.",
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
if (mcpEntryExpected && mcpPath) {
|
|
128
|
+
const expected = resolve(mcpEntryExpected);
|
|
129
|
+
const actual = resolve(mcpPath);
|
|
130
|
+
if (actual !== expected && !existsSync(actual)) {
|
|
131
|
+
issues.push({
|
|
132
|
+
severity: "red",
|
|
133
|
+
message: "Hermes MCP path does not point to a built server",
|
|
134
|
+
hint: `Expected ${expected}. Run \`agenticros hermes setup\`.`,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else if (actual !== expected) {
|
|
138
|
+
issues.push({
|
|
139
|
+
severity: "yellow",
|
|
140
|
+
message: "Hermes MCP path differs from the CLI-resolved MCP entry",
|
|
141
|
+
hint: `CLI expects ${expected}. Run \`agenticros hermes setup\` to sync.`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else if (mcpEntryExpected && !mcpPath) {
|
|
146
|
+
issues.push({
|
|
147
|
+
severity: "yellow",
|
|
148
|
+
message: "Could not parse MCP server path from Hermes config",
|
|
149
|
+
hint: "Run `agenticros hermes setup` to rewrite the entry.",
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
const ns = (cfg.env?.["AGENTICROS_ROBOT_NAMESPACE"] ?? "").trim();
|
|
153
|
+
if (ns.length > 0) {
|
|
154
|
+
issues.push({
|
|
155
|
+
severity: "yellow",
|
|
156
|
+
message: `Hermes AGENTICROS_ROBOT_NAMESPACE is hardcoded ('${ns}')`,
|
|
157
|
+
hint: 'Leave it empty in ~/.hermes/config.yaml so `agenticros mode real|sim` drives the namespace (same as Codex).',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
if (cfg.enabled === false) {
|
|
161
|
+
issues.push({
|
|
162
|
+
severity: "yellow",
|
|
163
|
+
message: "Hermes agenticros MCP server is disabled (enabled: false)",
|
|
164
|
+
hint: "Remove enabled: false or re-run `agenticros hermes setup`.",
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
const hasRed = issues.some((i) => i.severity === "red");
|
|
168
|
+
return { ok: !hasRed && issues.length === 0, issues };
|
|
169
|
+
}
|
|
170
|
+
/** Doctor check entries for Hermes MCP config (used by `agenticros doctor`). */
|
|
171
|
+
export function buildHermesDoctorChecks(mcpEntryExpected) {
|
|
172
|
+
const checks = [];
|
|
173
|
+
const configPath = globalHermesConfigPath();
|
|
174
|
+
const cfg = readHermesAgenticrosConfig(configPath);
|
|
175
|
+
if (!cfg.exists) {
|
|
176
|
+
checks.push({
|
|
177
|
+
id: "hermes-config",
|
|
178
|
+
label: "Hermes MCP config missing (~/.hermes/config.yaml)",
|
|
179
|
+
severity: "yellow",
|
|
180
|
+
hint: "Run `agenticros hermes setup` to register the AgenticROS MCP server.",
|
|
181
|
+
});
|
|
182
|
+
return checks;
|
|
183
|
+
}
|
|
184
|
+
const v = validateHermesAgenticrosConfig(cfg, mcpEntryExpected);
|
|
185
|
+
if (v.ok) {
|
|
186
|
+
checks.push({
|
|
187
|
+
id: "hermes-config",
|
|
188
|
+
label: "Hermes MCP config OK",
|
|
189
|
+
severity: "green",
|
|
190
|
+
detail: configPath,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
const worst = v.issues.some((i) => i.severity === "red") ? "red" : "yellow";
|
|
195
|
+
const first = v.issues[0];
|
|
196
|
+
checks.push({
|
|
197
|
+
id: "hermes-config",
|
|
198
|
+
label: `Hermes MCP: ${first.message}`,
|
|
199
|
+
severity: worst,
|
|
200
|
+
hint: first.hint ?? "Run `agenticros hermes setup`.",
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return checks;
|
|
204
|
+
}
|
|
205
|
+
function findAgenticrosLineIndex(lines, mcpIdx) {
|
|
206
|
+
for (let i = mcpIdx + 1; i < lines.length; i++) {
|
|
207
|
+
const trimmed = lines[i]?.trim() ?? "";
|
|
208
|
+
if (/^\S/.test(lines[i] ?? "") && trimmed !== MCP_SERVERS_KEY)
|
|
209
|
+
break;
|
|
210
|
+
if (trimmed === AGENTICROS_KEY)
|
|
211
|
+
return i;
|
|
212
|
+
}
|
|
213
|
+
return -1;
|
|
214
|
+
}
|
|
215
|
+
function findMcpServersInsertPoint(lines, mcpIdx) {
|
|
216
|
+
let insertAt = mcpIdx + 1;
|
|
217
|
+
for (let i = mcpIdx + 1; i < lines.length; i++) {
|
|
218
|
+
const line = lines[i] ?? "";
|
|
219
|
+
if (/^\S/.test(line) && line.trim() !== MCP_SERVERS_KEY)
|
|
220
|
+
break;
|
|
221
|
+
if (/^ \S/.test(line))
|
|
222
|
+
insertAt = i + 1;
|
|
223
|
+
}
|
|
224
|
+
return insertAt;
|
|
225
|
+
}
|
|
226
|
+
function findAgenticrosEndIndex(lines, agentIdx) {
|
|
227
|
+
for (let i = agentIdx + 1; i < lines.length; i++) {
|
|
228
|
+
const line = lines[i] ?? "";
|
|
229
|
+
if (/^ \S/.test(line) && !line.startsWith(" ") && line.trim() !== AGENTICROS_KEY) {
|
|
230
|
+
return i;
|
|
231
|
+
}
|
|
232
|
+
if (/^\S/.test(line))
|
|
233
|
+
return i;
|
|
234
|
+
}
|
|
235
|
+
return lines.length;
|
|
236
|
+
}
|
|
237
|
+
function parseYamlString(section, key) {
|
|
238
|
+
const re = new RegExp(`^\\s*${key}:\\s*"([^"]*)"`, "m");
|
|
239
|
+
const m = section.match(re);
|
|
240
|
+
return m?.[1];
|
|
241
|
+
}
|
|
242
|
+
function parseYamlBoolean(section, key) {
|
|
243
|
+
const re = new RegExp(`^\\s*${key}:\\s*(true|false)`, "m");
|
|
244
|
+
const m = section.match(re);
|
|
245
|
+
if (!m)
|
|
246
|
+
return undefined;
|
|
247
|
+
return m[1] === "true";
|
|
248
|
+
}
|
|
249
|
+
function parseYamlNumber(section, key) {
|
|
250
|
+
const re = new RegExp(`^\\s*${key}:\\s*(\\d+)`, "m");
|
|
251
|
+
const m = section.match(re);
|
|
252
|
+
if (!m)
|
|
253
|
+
return undefined;
|
|
254
|
+
return Number(m[1]);
|
|
255
|
+
}
|
|
256
|
+
function parseYamlStringArray(section, key) {
|
|
257
|
+
const inline = section.match(new RegExp(`^\\s*${key}:\\s*\\[([^\\]]*)\\]`, "m"));
|
|
258
|
+
if (inline?.[1]) {
|
|
259
|
+
return [...inline[1].matchAll(/"((?:\\.|[^"\\])*)"/g)].map((m) => m[1].replace(/\\"/g, '"').replace(/\\\\/g, "\\"));
|
|
260
|
+
}
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
function parseYamlEnvBlock(section) {
|
|
264
|
+
const env = {};
|
|
265
|
+
const envMatch = section.match(/^(\s*)env:\s*$/m);
|
|
266
|
+
if (!envMatch)
|
|
267
|
+
return env;
|
|
268
|
+
const baseIndent = envMatch[1]?.length ?? 0;
|
|
269
|
+
const envKeyIndent = baseIndent + 2;
|
|
270
|
+
for (const line of section.split("\n")) {
|
|
271
|
+
const m = line.match(new RegExp(`^\\s{${envKeyIndent}}([A-Z0-9_]+):\\s*"([^"]*)"`));
|
|
272
|
+
if (m)
|
|
273
|
+
env[m[1]] = m[2];
|
|
274
|
+
}
|
|
275
|
+
return env;
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=hermes-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes-config.js","sourceRoot":"","sources":["../../src/util/hermes-config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agenticros",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AgenticROS - agentic AI for ROS-powered robots. Single CLI to launch real-robot or simulated demos, manage configuration, and inspect status.",
|
|
6
6
|
"keywords": [
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"agent",
|
|
12
12
|
"claude",
|
|
13
13
|
"codex",
|
|
14
|
+
"hermes",
|
|
14
15
|
"openai",
|
|
15
16
|
"openclaw",
|
|
16
17
|
"gazebo",
|
package/runtime/BUNDLE.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"packedAt": "2026-
|
|
2
|
+
"packedAt": "2026-07-04T16:56:29.644Z",
|
|
3
3
|
"repo": "https://github.com/PlaiPin/agenticros",
|
|
4
4
|
"note": "This directory is a snapshot of the agenticros monorepo source. `agenticros init` will copy it to ~/agenticros and run pnpm install + colcon build there.",
|
|
5
5
|
"layout": {
|
package/runtime/README.md
CHANGED
|
@@ -28,6 +28,7 @@ With AgenticROS, your robot can describe what it sees, follow intent ("go check
|
|
|
28
28
|
- **[NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw)** — Run AgenticROS inside NemoClaw's OpenShell sandbox with policy-enforced egress and managed NVIDIA inference; ROS 2, RealSense, and rosbridge stay on the host while the plugin runs sandboxed.
|
|
29
29
|
- **[Anthropic Claude](https://www.anthropic.com/claude)** — A single MCP server powers **Claude Code** (terminal), **Claude Desktop** (macOS / Windows), and **Claude Dispatch** (iOS, paired to your Mac). Ask Claude what your robot sees, and it answers with a live camera snapshot and depth reading.
|
|
30
30
|
- **[OpenAI Codex CLI](https://developers.openai.com/codex/)** — Same MCP server as Claude Code. One command registers Codex: `agenticros codex setup` (writes `~/.codex/config.toml` with an absolute path to the MCP binary). Full tool surface: missions, follow-me, find-object, memory. Setup guide: [docs/codex-setup.md](docs/codex-setup.md).
|
|
31
|
+
- **[Hermes Agent](https://github.com/NousResearch/hermes-agent)** — Model-agnostic agent gateway (OpenRouter, Ollama, 200+ providers) with MCP client support. Same MCP server as Codex: `agenticros hermes setup` writes `~/.hermes/config.yaml`. Setup guide: [docs/hermes-setup.md](docs/hermes-setup.md).
|
|
31
32
|
- **[Google Gemini](https://ai.google.dev/)** — Standalone CLI that uses Gemini function calling against the same ROS 2 tools (no MCP required) — ideal for scripting and headless agents.
|
|
32
33
|
|
|
33
34
|
AgenticROS is built so that new adapters (LangGraph, OpenAI, local models, voice stacks, etc.) can be added without touching the ROS 2 layer. The core transport and tool contract are platform-agnostic; adapters are thin shims that surface those tools to each agent runtime.
|
|
@@ -38,13 +39,14 @@ AgenticROS is built so that new adapters (LangGraph, OpenAI, local models, voice
|
|
|
38
39
|
|
|
39
40
|
- **Core** (`packages/core`): Platform-agnostic ROS2 transport (rosbridge, Zenoh, local, WebRTC), config schema, and shared types. No dependency on any specific AI platform.
|
|
40
41
|
- **Adapters** (`packages/agenticros`, and later others): Implement the contract for each AI platform. The OpenClaw adapter registers tools, commands, and HTTP routes with the OpenClaw gateway and uses the core for all ROS2 communication.
|
|
41
|
-
- `**packages/agenticros-claude-code`** — MCP server for **Claude Code**, **Claude desktop**, **Dispatch**,
|
|
42
|
+
- `**packages/agenticros-claude-code`** — MCP server for **Claude Code**, **Claude desktop**, **Dispatch**, **OpenAI Codex CLI**, and **Hermes Agent**. See [packages/agenticros-claude-code/README.md](packages/agenticros-claude-code/README.md), [docs/codex-setup.md](docs/codex-setup.md), and [docs/hermes-setup.md](docs/hermes-setup.md).
|
|
42
43
|
- `**packages/agenticros-gemini`** — **Gemini CLI**: use Google Gemini to chat with your robot from the terminal (same ROS2 tools, no MCP). See [packages/agenticros-gemini/README.md](packages/agenticros-gemini/README.md).
|
|
43
44
|
|
|
44
45
|
```
|
|
45
46
|
User (messaging app) → OpenClaw Gateway → AgenticROS OpenClaw plugin → Core → ROS2 robots
|
|
46
47
|
Claude (Code / desktop / Dispatch) → agenticros MCP server → Core → ROS2 robots (Zenoh/rosbridge)
|
|
47
48
|
Codex CLI → agenticros MCP server → Core → ROS2 robots (Zenoh/rosbridge)
|
|
49
|
+
Hermes Agent → agenticros MCP server → Core → ROS2 robots (Zenoh/rosbridge)
|
|
48
50
|
Gemini CLI → @agenticros/gemini (function calling) → Core → ROS2 robots
|
|
49
51
|
```
|
|
50
52
|
|
|
@@ -136,7 +138,7 @@ The first run launches the interactive menu:
|
|
|
136
138
|
? What would you like to do?
|
|
137
139
|
Launch with real robot
|
|
138
140
|
❯ Launch with simulation
|
|
139
|
-
First-time setup (workspace + OpenClaw plugin + API key)
|
|
141
|
+
First-time setup (workspace + OpenClaw plugin + Codex MCP + API key)
|
|
140
142
|
Manage skills (2 registered, 0 available, 0 broken)
|
|
141
143
|
Stop everything
|
|
142
144
|
Doctor (health check)
|
|
@@ -144,7 +146,7 @@ The first run launches the interactive menu:
|
|
|
144
146
|
Tail logs
|
|
145
147
|
```
|
|
146
148
|
|
|
147
|
-
Pick **First-time setup** once (workspace + OpenClaw plugin + API key, all
|
|
149
|
+
Pick **First-time setup** once (workspace + OpenClaw plugin + optional Codex MCP + API key, all
|
|
148
150
|
idempotent), then choose how you want to run:
|
|
149
151
|
|
|
150
152
|
| You want to … | Pick |
|
|
@@ -154,14 +156,18 @@ idempotent), then choose how you want to run:
|
|
|
154
156
|
| Demo a **simulated 6-DOF arm** (UR5e-shaped, per-joint position control) | **Launch with simulation → 6-DOF arm** |
|
|
155
157
|
|
|
156
158
|
Once a stack is up, point any of the supported agents — OpenClaw, Claude Code,
|
|
157
|
-
Claude Desktop / Dispatch, or Gemini CLI — at the same robot and start talking
|
|
159
|
+
OpenAI Codex, Hermes Agent, Claude Desktop / Dispatch, or Gemini CLI — at the same robot and start talking
|
|
158
160
|
to it. The CLI tracks what it spawned (pidfiles + logs under `/tmp/agenticros-*`),
|
|
159
161
|
so **Stop everything** cleanly tears the demo down.
|
|
160
162
|
|
|
161
163
|
Prefer scripted invocations? Every menu item maps to a direct command:
|
|
162
164
|
|
|
163
165
|
```bash
|
|
164
|
-
npx agenticros init # one-time workspace + plugin + API key
|
|
166
|
+
npx agenticros init # one-time workspace + plugin + Codex/Hermes MCP + API key
|
|
167
|
+
agenticros codex setup # register AgenticROS MCP for OpenAI Codex CLI
|
|
168
|
+
agenticros codex doctor # validate ~/.codex/config.toml
|
|
169
|
+
agenticros hermes setup # register AgenticROS MCP for Hermes Agent
|
|
170
|
+
agenticros hermes doctor # validate ~/.hermes/config.yaml
|
|
165
171
|
agenticros up real # real robot stack
|
|
166
172
|
agenticros up sim-amr # simulated AMR (Gazebo + RViz, headless on Jetson)
|
|
167
173
|
agenticros up sim-arm # simulated 6-DOF arm
|
|
@@ -296,15 +302,15 @@ Full walkthrough, troubleshooting, and a "full-embed" alternative (ROS / RealSen
|
|
|
296
302
|
|
|
297
303
|
## Claude + AgenticROS (MCP)
|
|
298
304
|
|
|
299
|
-
The
|
|
305
|
+
The **AgenticROS MCP server** (`@agenticros/claude-code`) drives the robot from **Claude Code** (terminal) or from the **Claude desktop app** on macOS (including **Claude Dispatch** on iPhone when paired to Claude on your Mac). **OpenAI Codex CLI** uses the same server — see **[Codex + AgenticROS](#codex--agenticros-mcp)** below. Claude clients use **different config files** than Codex (`.mcp.json` / `claude_desktop_config.json` vs `.codex/config.toml`).
|
|
300
306
|
|
|
301
|
-
Shared setup:
|
|
307
|
+
Shared MCP setup (Claude and Codex):
|
|
302
308
|
|
|
303
309
|
1. **Build** (from repo root): `pnpm install && pnpm build`
|
|
304
310
|
2. **AgenticROS config**: `~/.agenticros/config.json` — set `zenoh.routerEndpoint`, `robot.namespace`, `robot.cameraTopic`, etc. (see [packages/agenticros-claude-code/README.md](packages/agenticros-claude-code/README.md)).
|
|
305
311
|
3. **Zenoh**: Run `zenohd` with the remote-api plugin (e.g. port 10000) — see `scripts/zenohd-agenticros.json5` or [docs/zenoh-agenticros.md](docs/zenoh-agenticros.md).
|
|
306
312
|
|
|
307
|
-
Optional: override `robot.namespace` per MCP launch with env `**AGENTICROS_ROBOT_NAMESPACE
|
|
313
|
+
Optional: override `robot.namespace` per MCP launch with env `**AGENTICROS_ROBOT_NAMESPACE`**. Prefer leaving it empty in MCP/Codex config so `agenticros mode real|sim` drives the active profile (see [docs/codex-setup.md](docs/codex-setup.md)).
|
|
308
314
|
|
|
309
315
|
### Claude Code CLI (terminal)
|
|
310
316
|
|
|
@@ -347,6 +353,77 @@ Example `mcpServers` entry (adjust the path and namespace to your machine):
|
|
|
347
353
|
|
|
348
354
|
Full steps, permissions (`mcp__agenticros`), and troubleshooting are in **[packages/agenticros-claude-code/README.md](packages/agenticros-claude-code/README.md)**.
|
|
349
355
|
|
|
356
|
+
## Codex + AgenticROS (MCP)
|
|
357
|
+
|
|
358
|
+
**OpenAI Codex CLI** is a standard MCP client — it uses the same `@agenticros/claude-code` server as Claude Code (missions, follow-me, find-object, memory, full ROS tool surface). No separate adapter package.
|
|
359
|
+
|
|
360
|
+
### Quick setup
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
pnpm install && pnpm build # or: npx agenticros init
|
|
364
|
+
agenticros codex setup # ~/.codex/config.toml (global)
|
|
365
|
+
agenticros codex setup --project # .codex/config.toml in repo root
|
|
366
|
+
agenticros codex doctor # validate absolute MCP path + namespace policy
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
Start Codex in your project directory, run `/mcp` — you should see **agenticros** connected with the full tool list. Then ask e.g. “List ROS2 topics” or “What do you see?”
|
|
370
|
+
|
|
371
|
+
### Config files
|
|
372
|
+
|
|
373
|
+
| File | Scope |
|
|
374
|
+
|------|--------|
|
|
375
|
+
| `~/.codex/config.toml` | Global — all Codex sessions |
|
|
376
|
+
| `<project>/.codex/config.toml` | Project — when Codex runs in that directory |
|
|
377
|
+
|
|
378
|
+
`agenticros codex setup` writes an **absolute path** to `packages/agenticros-claude-code/dist/index.js` (or the bundled MCP path after `npx agenticros init`). Relative paths fail because Codex does not spawn MCP servers from the repo root.
|
|
379
|
+
|
|
380
|
+
Leave `AGENTICROS_ROBOT_NAMESPACE = ""` in the Codex env block so `~/.agenticros/config.json` and `agenticros mode real|sim` drive the active robot (same policy as `.mcp.json`).
|
|
381
|
+
|
|
382
|
+
### Manual registration
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
codex mcp add agenticros -- node "$(pwd)/packages/agenticros-claude-code/dist/index.js"
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
Use an absolute path if not run from the repo root.
|
|
389
|
+
|
|
390
|
+
### Troubleshooting
|
|
391
|
+
|
|
392
|
+
- **`/mcp` does not list agenticros** → run `agenticros codex setup`; check `agenticros codex doctor`
|
|
393
|
+
- **Transport timeout** → bring up Zenoh/rosbridge or run `agenticros up sim-amr` / `agenticros up real`
|
|
394
|
+
- **Logs** → `/tmp/agenticros-mcp.log`
|
|
395
|
+
|
|
396
|
+
Full guide: **[docs/codex-setup.md](docs/codex-setup.md)**.
|
|
397
|
+
|
|
398
|
+
## Hermes + AgenticROS (MCP)
|
|
399
|
+
|
|
400
|
+
**[Hermes Agent](https://github.com/NousResearch/hermes-agent)** is a model-agnostic MCP client — it uses the same `@agenticros/claude-code` server as Claude Code and Codex (missions, follow-me, find-object, memory, full ROS tool surface). No separate adapter package. Works with OpenRouter, Ollama, Anthropic, OpenAI, and 200+ other providers.
|
|
401
|
+
|
|
402
|
+
### Quick setup
|
|
403
|
+
|
|
404
|
+
```bash
|
|
405
|
+
pnpm install && pnpm build # or: npx agenticros init
|
|
406
|
+
agenticros hermes setup # ~/.hermes/config.yaml
|
|
407
|
+
agenticros hermes doctor # validate absolute MCP path + namespace policy
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
In Hermes, run `/reload-mcp` or restart, then `hermes mcp test agenticros`. Ask e.g. “List ROS2 topics” or “What do you see?”
|
|
411
|
+
|
|
412
|
+
### Config file
|
|
413
|
+
|
|
414
|
+
| File | Scope |
|
|
415
|
+
|------|--------|
|
|
416
|
+
| `~/.hermes/config.yaml` | Global — default Hermes profile |
|
|
417
|
+
|
|
418
|
+
`agenticros hermes setup` writes an **absolute path** to the MCP server and leaves `AGENTICROS_ROBOT_NAMESPACE: ""` so `agenticros mode real|sim` drives the active robot (same policy as Codex).
|
|
419
|
+
|
|
420
|
+
### Troubleshooting
|
|
421
|
+
|
|
422
|
+
- **MCP tools missing** → run `agenticros hermes setup`; `/reload-mcp` in Hermes; check `agenticros hermes doctor`
|
|
423
|
+
- **Transport timeout** → bring up Zenoh/rosbridge or run `agenticros up sim-amr` / `agenticros up real`
|
|
424
|
+
|
|
425
|
+
Full guide: **[docs/hermes-setup.md](docs/hermes-setup.md)**.
|
|
426
|
+
|
|
350
427
|
## Gemini CLI
|
|
351
428
|
|
|
352
429
|
Use **Google Gemini** to chat with your robot from the terminal (same ROS2 tools as Claude Code, no MCP).
|
|
@@ -362,7 +439,7 @@ See **[packages/agenticros-gemini/README.md](packages/agenticros-gemini/README.m
|
|
|
362
439
|
|
|
363
440
|
## Memory (optional)
|
|
364
441
|
|
|
365
|
-
AgenticROS can give every adapter a **shared, persistent, cross-process** long-term memory so facts you teach the robot from one agent are immediately available in the others — Claude Desktop, Claude Code, Gemini CLI, OpenClaw chat. Off by default. Two backends:
|
|
442
|
+
AgenticROS can give every adapter a **shared, persistent, cross-process** long-term memory so facts you teach the robot from one agent are immediately available in the others — Claude Desktop, Claude Code, OpenAI Codex, Hermes Agent, Gemini CLI, OpenClaw chat. Off by default. Two backends:
|
|
366
443
|
|
|
367
444
|
- **`local`** — zero deps, JSON-on-disk at `~/.agenticros/memory.json`, keyword + recency search. Enable with one config flag.
|
|
368
445
|
- **`mem0`** — semantic search via the pure-Node [`mem0ai`](https://www.npmjs.com/package/mem0ai) package (`pnpm add mem0ai`); file-backed vector store at `~/.mem0/vector_store.db` (shared across all processes on the host, no server to run); embedder auto-detects Ollama (`http://localhost:11434`) → `OPENAI_API_KEY` → clear error.
|
|
@@ -378,7 +455,7 @@ pnpm add mem0ai
|
|
|
378
455
|
ollama pull nomic-embed-text # ~270 MB embedder model
|
|
379
456
|
```
|
|
380
457
|
|
|
381
|
-
Add `{ "memory": { "enabled": true, "backend": "mem0" } }` to `~/.agenticros/config.json` (or the OpenClaw config UI). Restart the gateway / MCP client. Then ask Claude Desktop *"remember that I have a RealSense D435i for eyes"* and ask OpenClaw *"what do I have for eyes?"* — same fact,
|
|
458
|
+
Add `{ "memory": { "enabled": true, "backend": "mem0" } }` to `~/.agenticros/config.json` (or the OpenClaw config UI). Restart the gateway / MCP client. Then ask Claude Desktop *"remember that I have a RealSense D435i for eyes"* and ask Codex or OpenClaw *"what do I have for eyes?"* — same fact, every agent.
|
|
382
459
|
|
|
383
460
|
## Skills
|
|
384
461
|
|
package/runtime/docs/cli.md
CHANGED
|
@@ -65,7 +65,9 @@ skipped (with a checkmark) when already done:
|
|
|
65
65
|
4. OpenClaw plugin install (via `scripts/setup_gateway_plugin.sh`)
|
|
66
66
|
5. Robot config (writes `~/.agenticros/config.json`)
|
|
67
67
|
6. OpenAI API key (paste once → `scripts/configure_agenticros.sh`)
|
|
68
|
-
7.
|
|
68
|
+
7. Codex MCP config (optional — `agenticros codex setup` for `~/.codex/config.toml` and project `.codex/config.toml`)
|
|
69
|
+
8. Hermes MCP config (optional — `agenticros hermes setup` for `~/.hermes/config.yaml`)
|
|
70
|
+
9. Final `agenticros doctor` summary
|
|
69
71
|
|
|
70
72
|
Pass `--force` to re-run every step regardless of state.
|
|
71
73
|
|
|
@@ -83,6 +85,43 @@ same report as a structured object for CI / scripting:
|
|
|
83
85
|
|
|
84
86
|
Exits non-zero if any check is red.
|
|
85
87
|
|
|
88
|
+
Checks include MCP server build status, OpenClaw plugin health, **Codex MCP config**
|
|
89
|
+
(`~/.codex/config.toml` path and namespace policy), **Hermes MCP config**
|
|
90
|
+
(`~/.hermes/config.yaml`), and Codex / Hermes CLI presence on `PATH`.
|
|
91
|
+
|
|
92
|
+
### `agenticros codex setup [--project]`
|
|
93
|
+
|
|
94
|
+
Register the AgenticROS MCP server for **OpenAI Codex CLI**:
|
|
95
|
+
|
|
96
|
+
| Flag | Effect |
|
|
97
|
+
|---|---|
|
|
98
|
+
| (default) | Writes `[mcp_servers.agenticros]` to `~/.codex/config.toml` |
|
|
99
|
+
| `--project` | Writes `.codex/config.toml` in the current repo root instead |
|
|
100
|
+
|
|
101
|
+
Uses an **absolute path** to the MCP server binary (`packages/agenticros-claude-code/dist/index.js` in workspace mode, or the bundled path after `npx agenticros init`). Sets `AGENTICROS_ROBOT_NAMESPACE = ""` so `agenticros mode real|sim` drives the active robot namespace.
|
|
102
|
+
|
|
103
|
+
Also offered as an optional step during `agenticros init`.
|
|
104
|
+
|
|
105
|
+
### `agenticros codex doctor [--json]`
|
|
106
|
+
|
|
107
|
+
Validate Codex MCP configuration: global and (when in a workspace) project `.codex/config.toml`, MCP binary path, and namespace policy. Exits non-zero on red checks. With `--json`, emits structured output for scripting.
|
|
108
|
+
|
|
109
|
+
See **[docs/codex-setup.md](codex-setup.md)** for the full Codex onboarding guide.
|
|
110
|
+
|
|
111
|
+
### `agenticros hermes setup`
|
|
112
|
+
|
|
113
|
+
Register the AgenticROS MCP server for **[Hermes Agent](https://github.com/NousResearch/hermes-agent)**:
|
|
114
|
+
|
|
115
|
+
Writes `mcp_servers.agenticros` to `~/.hermes/config.yaml` with an **absolute path** to the MCP server binary and `AGENTICROS_ROBOT_NAMESPACE: ""` so `agenticros mode real|sim` drives the active robot namespace.
|
|
116
|
+
|
|
117
|
+
Also offered as an optional step during `agenticros init`. After setup, run `/reload-mcp` in Hermes or `hermes mcp test agenticros`.
|
|
118
|
+
|
|
119
|
+
### `agenticros hermes doctor [--json]`
|
|
120
|
+
|
|
121
|
+
Validate Hermes MCP configuration: `~/.hermes/config.yaml`, MCP binary path, and namespace policy. Exits non-zero on red checks. With `--json`, emits structured output for scripting.
|
|
122
|
+
|
|
123
|
+
See **[docs/hermes-setup.md](hermes-setup.md)** for the full Hermes onboarding guide.
|
|
124
|
+
|
|
86
125
|
### `agenticros status [--json]`
|
|
87
126
|
|
|
88
127
|
Shows running components (camera / sim / mcp / rosbridge / openclaw-gateway)
|
|
@@ -111,6 +150,9 @@ Read or edit `~/.agenticros/config.json`. Actions:
|
|
|
111
150
|
|---|---|---|
|
|
112
151
|
| `~/.agenticros/config.json` | User | AgenticROS runtime config (transport mode, namespace, safety limits). |
|
|
113
152
|
| `~/.agenticros/cli-state.json` | CLI | Last-used mode/namespace for the menu's "(yesterday)" hint. |
|
|
153
|
+
| `~/.hermes/config.yaml` | Hermes Agent | MCP server registrations (written by `agenticros hermes setup`). |
|
|
154
|
+
| `~/.codex/config.toml` | Codex CLI | MCP server registrations (written by `agenticros codex setup`). |
|
|
155
|
+
| `.codex/config.toml` | Codex CLI | Project-scoped MCP config (written by `agenticros codex setup --project`). |
|
|
114
156
|
| `~/agenticros/` | CLI (npm-install mode) | Copy of the monorepo, with built dist + colcon install. |
|
|
115
157
|
| `/tmp/agenticros-*.pid` | CLI | PIDs of background processes the CLI spawned. |
|
|
116
158
|
| `/tmp/agenticros-*.log` | CLI | Stdout/stderr from those processes. |
|
|
@@ -140,7 +182,12 @@ Read or edit `~/.agenticros/config.json`. Actions:
|
|
|
140
182
|
## Troubleshooting
|
|
141
183
|
|
|
142
184
|
- **`doctor` shows red checks** → run `agenticros init` to walk through every
|
|
143
|
-
step. Re-run `doctor` afterward.
|
|
185
|
+
step. Re-run `doctor` afterward. For Codex-specific issues, run
|
|
186
|
+
`agenticros codex doctor`. For Hermes, run `agenticros hermes doctor`.
|
|
187
|
+
- **Codex `/mcp` does not list agenticros** → run `agenticros codex setup`
|
|
188
|
+
(absolute MCP path required). See [codex-setup.md](codex-setup.md).
|
|
189
|
+
- **Hermes MCP tools missing** → run `agenticros hermes setup`, then `/reload-mcp`
|
|
190
|
+
in Hermes. See [hermes-setup.md](hermes-setup.md).
|
|
144
191
|
- **`up` exits immediately** → `agenticros logs <component>` (the CLI now
|
|
145
192
|
records where every child wrote its output) and read the error in context.
|
|
146
193
|
- **`up sim-amr` warns "scripts/sim/run_sim.sh not found"** → simulation
|