agenticros 0.5.1 → 0.5.2
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/package.json +2 -2
- package/runtime/BUNDLE.json +1 -1
- package/runtime/README.md +18 -48
- package/runtime/packages/agenticros-claude-code/README.md +1 -1
- package/runtime/packages/core/README.md +4 -2
- package/runtime/packages/core/package.json +1 -1
- package/runtime/packages/core/src/__tests__/external-capability.test.ts +21 -0
- package/runtime/packages/core/src/external-capability.ts +35 -0
- package/runtime/pnpm-lock.yaml +5 -5
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agenticros",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
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": [
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"prepublishOnly": "pnpm run clean && pnpm run build && pnpm run pack:runtime && pnpm run size:check && pnpm run tarball:check"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@agenticros/core": "^0.8.
|
|
49
|
+
"@agenticros/core": "^0.8.1",
|
|
50
50
|
"@inquirer/prompts": "^7.0.0",
|
|
51
51
|
"commander": "^12.1.0",
|
|
52
52
|
"execa": "^9.5.0",
|
package/runtime/BUNDLE.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"packedAt": "2026-07-09T23:
|
|
2
|
+
"packedAt": "2026-07-09T23:38:28.747Z",
|
|
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
|
@@ -484,79 +484,49 @@ Add `{ "memory": { "enabled": true, "backend": "mem0" } }` to `~/.agenticros/con
|
|
|
484
484
|
|
|
485
485
|
## Skills
|
|
486
486
|
|
|
487
|
-
AgenticROS **skills** are optional packages that add tools and behaviors
|
|
487
|
+
AgenticROS **skills** are optional packages that add tools and behaviors (e.g. `follow_person`, `find_object`, `navigate_to`). They load at OpenClaw gateway start from **`skillPackages`**, **`skillPaths`**, and **`skillRefs`** (marketplace / npm pins cached under `~/.agenticros/skills-cache/`). Browse and install from **[skills.agenticros.com](https://skills.agenticros.com)**, or scaffold and publish your own with the CLI.
|
|
488
488
|
|
|
489
489
|
### Managing skills with the CLI
|
|
490
490
|
|
|
491
|
-
The `agenticros skills` command (and the **Manage skills** menu entry) does everything for you: it scans the usual locations for clones, edits `~/.openclaw/openclaw.json`, refreshes the plugin manifest's `contracts.tools` allowlist, and reminds you to bounce the gateway.
|
|
492
|
-
|
|
493
491
|
```bash
|
|
494
|
-
#
|
|
492
|
+
# Search + install (prefers npm @agenticros/* when advertised; else git clone)
|
|
495
493
|
npx agenticros skills search follow
|
|
494
|
+
npx agenticros skills install @agenticros/followme
|
|
496
495
|
npx agenticros skills install chrismatthieu/followme
|
|
497
496
|
|
|
498
|
-
|
|
497
|
+
# Skip automatic OpenClaw gateway restart:
|
|
498
|
+
npx agenticros skills install @agenticros/navigate-to --no-restart
|
|
499
|
+
|
|
500
|
+
agenticros skills # list registered skills
|
|
499
501
|
agenticros skills discover # interactive picker over candidates on disk
|
|
500
502
|
agenticros skills add <path-or-name> # register a clone (path) or npm package
|
|
501
503
|
agenticros skills remove <id-or-name> # unregister
|
|
502
|
-
agenticros skills sync # refresh
|
|
504
|
+
agenticros skills sync # refresh contracts.tools (+ auto-restart)
|
|
503
505
|
```
|
|
504
506
|
|
|
505
|
-
**Create and publish** a new skill:
|
|
507
|
+
**Create and publish** a new skill (npm name `@agenticros/<slug>`):
|
|
506
508
|
|
|
507
509
|
```bash
|
|
508
510
|
npx agenticros create-skill my-skill --template robot
|
|
509
511
|
cd agenticros-skill-my-skill && npm install && npm run dev
|
|
510
|
-
npx agenticros publish
|
|
512
|
+
npx agenticros publish # GitHub + marketplace + npm publish
|
|
511
513
|
```
|
|
512
514
|
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
```bash
|
|
516
|
-
# clone whichever skills you want, anywhere near the repo
|
|
517
|
-
cd ~/Projects
|
|
518
|
-
git clone https://github.com/agenticros/agenticros-skill-followme
|
|
519
|
-
git clone https://github.com/agenticros/agenticros-skill-find
|
|
520
|
-
|
|
521
|
-
# build them (skills compile independently of the main workspace)
|
|
522
|
-
cd agenticros-skill-followme && pnpm install && pnpm build && cd ..
|
|
523
|
-
cd agenticros-skill-find && pnpm install && pnpm build && cd ..
|
|
524
|
-
|
|
525
|
-
# register both — short ids resolve against the discovered clones
|
|
526
|
-
agenticros skills add followme
|
|
527
|
-
agenticros skills add find
|
|
528
|
-
agenticros skills sync # update contracts.tools
|
|
529
|
-
systemctl --user restart openclaw-gateway.service
|
|
530
|
-
```
|
|
531
|
-
|
|
532
|
-
`agenticros skills` then shows them as registered, and `agenticros doctor` includes a skills health-check that flags any clone that hasn't been built or whose `skillPaths` entry no longer exists.
|
|
533
|
-
|
|
534
|
-
Listing output:
|
|
535
|
-
|
|
536
|
-
```text
|
|
537
|
-
╔─────────────────────╗
|
|
538
|
-
║ AgenticROS skills ║
|
|
539
|
-
╚─────────────────────╝
|
|
540
|
-
|
|
541
|
-
› OpenClaw config: /home/you/.openclaw/openclaw.json
|
|
542
|
-
|
|
543
|
-
Registered:
|
|
544
|
-
● followme agenticros-skill-followme
|
|
545
|
-
via path → /home/you/Projects/agenticros-skill-followme
|
|
546
|
-
● find agenticros-skill-find
|
|
547
|
-
via path → /home/you/Projects/agenticros-skill-find
|
|
548
|
-
```
|
|
515
|
+
Seed catalog (npm): `@agenticros/followme`, `find`, `navigate-to`, `navigate-through-poses`, `detect-humans`, `start-slam`, `follow-me-ros`, `moveit-pick`, `dock-to-charger`.
|
|
549
516
|
|
|
550
517
|
### What the CLI writes
|
|
551
518
|
|
|
552
|
-
- `~/.openclaw/openclaw.json` → `plugins.entries.agenticros.config.skillPaths[]
|
|
553
|
-
-
|
|
519
|
+
- `~/.openclaw/openclaw.json` → `plugins.entries.agenticros.config.skillPaths[]`, `.skillPackages[]`, and `.skillRefs[]`
|
|
520
|
+
- `~/.agenticros/config.json` → `skillRefs` for MCP / Gemini
|
|
521
|
+
- Plugin `contracts.tools` via `scripts/sync-skill-tools.mjs` (OpenClaw 2026+)
|
|
554
522
|
|
|
555
|
-
Per-skill behaviour lives under `config.skills.<skillId
|
|
523
|
+
Per-skill behaviour lives under `config.skills.<skillId>`. See each skill's README.
|
|
556
524
|
|
|
557
525
|
### Contract & writing your own skill
|
|
558
526
|
|
|
559
|
-
A skill is a Node package with an `"agenticros": { "id": "..." }` block in `package.json` and a `registerSkill(api, config, context)` export from `main`. Scaffold with `npx agenticros create-skill`, publish
|
|
527
|
+
A skill is a Node package with an `"agenticros": { "id": "..." }` block in `package.json` and a `registerSkill(api, config, context)` export from `main`. Scaffold with `npx agenticros create-skill`, publish with `npx agenticros publish`, install with `npx agenticros skills install @agenticros/<slug>`. See **[docs/skills.md](docs/skills.md)** and **[@agenticros/followme](https://www.npmjs.com/package/@agenticros/followme)** ([marketplace](https://skills.agenticros.com/chrismatthieu/followme)).
|
|
528
|
+
|
|
529
|
+
Missions support step **`retry`**, **pause/resume**, and **mid-step cancel** for interruptible capabilities — see **[docs/missions.md](docs/missions.md)**.
|
|
560
530
|
|
|
561
531
|
## Strategy & vision
|
|
562
532
|
|
|
@@ -347,4 +347,4 @@ If `ros2_publish` runs but the robot doesn’t move:
|
|
|
347
347
|
|
|
348
348
|
## Skills
|
|
349
349
|
|
|
350
|
-
Skill packages (e.g.
|
|
350
|
+
Skill packages (e.g. `@agenticros/followme`, `@agenticros/find`, `@agenticros/navigate-to`) extend the capability registry with new verbs like `follow_person`, `find_object`, and `navigate_to`. The MCP server reads each skill's `package.json` `agenticros` block (`id`, `capabilities[]`) at startup and surfaces those verbs through `ros2_list_capabilities` and `run_mission` — no per-skill MCP tool needed. To register a skill for this adapter, install it with `agenticros skills install @agenticros/<slug>` (or `chrismatthieu/<skill-id>` from the marketplace), or add its path under `skillPaths[]` in `~/.agenticros/config.json` (or use the `agenticros skills add <path>` CLI). See [docs/skills.md](../../docs/skills.md) for the full skill contract.
|
|
@@ -39,7 +39,9 @@ Your `package.json` declares an `agenticros` block:
|
|
|
39
39
|
|
|
40
40
|
```jsonc
|
|
41
41
|
{
|
|
42
|
-
"name": "agenticros
|
|
42
|
+
"name": "@agenticros/myskill",
|
|
43
|
+
"version": "0.1.0",
|
|
44
|
+
"publishConfig": { "access": "public" },
|
|
43
45
|
"main": "dist/index.js",
|
|
44
46
|
"repository": {
|
|
45
47
|
"type": "git",
|
|
@@ -61,7 +63,7 @@ Your `package.json` declares an `agenticros` block:
|
|
|
61
63
|
]
|
|
62
64
|
},
|
|
63
65
|
"dependencies": {
|
|
64
|
-
"@agenticros/core": "^0.
|
|
66
|
+
"@agenticros/core": "^0.8.1"
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
69
|
```
|
|
@@ -26,6 +26,27 @@ test("buildExternalGoal maps x/y/yaw to NavigateToPose", () => {
|
|
|
26
26
|
assert.equal(pose.pose.position.y, 2);
|
|
27
27
|
});
|
|
28
28
|
|
|
29
|
+
test("buildExternalGoal maps poses[] to NavigateThroughPoses", () => {
|
|
30
|
+
const goal = buildExternalGoal(
|
|
31
|
+
{
|
|
32
|
+
kind: "external_ros_node",
|
|
33
|
+
action: "navigate_through_poses",
|
|
34
|
+
msg_type: "nav2_msgs/action/NavigateThroughPoses",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
poses: [
|
|
38
|
+
{ x: 1, y: 0, yaw: 0 },
|
|
39
|
+
{ x: 2, y: 1, yaw: Math.PI / 2 },
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
);
|
|
43
|
+
const poses = (goal as { poses: Array<{ pose: { position: { x: number; y: number } } }> })
|
|
44
|
+
.poses;
|
|
45
|
+
assert.equal(poses.length, 2);
|
|
46
|
+
assert.equal(poses[0]!.pose.position.x, 1);
|
|
47
|
+
assert.equal(poses[1]!.pose.position.y, 1);
|
|
48
|
+
});
|
|
49
|
+
|
|
29
50
|
test("executeExternalCapability sends action goal", async () => {
|
|
30
51
|
const calls: unknown[] = [];
|
|
31
52
|
const transport = {
|
|
@@ -80,6 +80,41 @@ export function buildExternalGoal(
|
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
+
if (
|
|
84
|
+
msgType.includes("navigatethroughposes") ||
|
|
85
|
+
impl.action?.includes("navigate_through_poses")
|
|
86
|
+
) {
|
|
87
|
+
const frame = typeof inputs.frame_id === "string" ? inputs.frame_id : "map";
|
|
88
|
+
const rawPoses = Array.isArray(inputs.poses) ? inputs.poses : [];
|
|
89
|
+
const poses = rawPoses.map((p) => {
|
|
90
|
+
const entry = p && typeof p === "object" ? (p as Record<string, unknown>) : {};
|
|
91
|
+
const x = Number(entry.x ?? 0) || 0;
|
|
92
|
+
const y = Number(entry.y ?? 0) || 0;
|
|
93
|
+
const yaw = Number(entry.yaw ?? 0) || 0;
|
|
94
|
+
const qz = Math.sin(yaw / 2);
|
|
95
|
+
const qw = Math.cos(yaw / 2);
|
|
96
|
+
const poseFrame =
|
|
97
|
+
typeof entry.frame_id === "string" ? entry.frame_id : frame;
|
|
98
|
+
return {
|
|
99
|
+
header: { frame_id: poseFrame },
|
|
100
|
+
pose: {
|
|
101
|
+
position: { x, y, z: Number(entry.z ?? 0) || 0 },
|
|
102
|
+
orientation: { x: 0, y: 0, z: qz, w: qw },
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
return { poses };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (
|
|
110
|
+
msgType.includes("dockrobot") ||
|
|
111
|
+
impl.action?.includes("dock_robot")
|
|
112
|
+
) {
|
|
113
|
+
if (typeof inputs.dock_id === "string" && inputs.dock_id.trim()) {
|
|
114
|
+
return { dock_id: inputs.dock_id.trim() };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
83
118
|
// Passthrough remaining inputs (minus robot_id).
|
|
84
119
|
const { robot_id: _rid, ...rest } = inputs;
|
|
85
120
|
return rest;
|
package/runtime/pnpm-lock.yaml
CHANGED
|
@@ -66,8 +66,8 @@ importers:
|
|
|
66
66
|
packages/agenticros-cli:
|
|
67
67
|
dependencies:
|
|
68
68
|
'@agenticros/core':
|
|
69
|
-
specifier: ^0.8.
|
|
70
|
-
version: 0.8.
|
|
69
|
+
specifier: ^0.8.1
|
|
70
|
+
version: 0.8.1
|
|
71
71
|
'@inquirer/prompts':
|
|
72
72
|
specifier: ^7.0.0
|
|
73
73
|
version: 7.10.1(@types/node@20.19.35)
|
|
@@ -178,8 +178,8 @@ importers:
|
|
|
178
178
|
|
|
179
179
|
packages:
|
|
180
180
|
|
|
181
|
-
'@agenticros/core@0.8.
|
|
182
|
-
resolution: {integrity: sha512-
|
|
181
|
+
'@agenticros/core@0.8.1':
|
|
182
|
+
resolution: {integrity: sha512-zFpzuViviZb6y3c+W0B1LzCpQvmhcvPYwrT9ZKL9u3eTLGNmKR2I5IhDlvF03Yv2/TwQzDHGGNZ6+onerPlG0Q==}
|
|
183
183
|
engines: {node: '>=20'}
|
|
184
184
|
|
|
185
185
|
'@eclipse-zenoh/zenoh-ts@1.9.0':
|
|
@@ -1981,7 +1981,7 @@ packages:
|
|
|
1981
1981
|
|
|
1982
1982
|
snapshots:
|
|
1983
1983
|
|
|
1984
|
-
'@agenticros/core@0.8.
|
|
1984
|
+
'@agenticros/core@0.8.1':
|
|
1985
1985
|
dependencies:
|
|
1986
1986
|
'@eclipse-zenoh/zenoh-ts': 1.9.0(patch_hash=pdjq6ms3zvqwikn6vpqzasydsy)
|
|
1987
1987
|
'@foxglove/cdr': 3.5.0
|