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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agenticros",
3
- "version": "0.5.1",
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.0",
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",
@@ -1,5 +1,5 @@
1
1
  {
2
- "packedAt": "2026-07-09T23:03:54.619Z",
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 to the plugin (e.g. `follow_person`, `find_object`). They are loaded at OpenClaw gateway start. Browse and install from **[skills.agenticros.com](https://skills.agenticros.com)**, or scaffold and publish your own with the CLI.
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
- # Install from the marketplace (owner/skill-id ref)
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
- agenticros skills # list registered + cloned-but-unregistered
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 OpenClaw contracts.tools allowlist
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
- A typical manual install (without the marketplace) looks like:
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[]` and `.skillPackages[]` (the only place the plugin actually reads from at gateway start).
553
- - `packages/agenticros/openclaw.plugin.json` → `contracts.tools` allowlist via `scripts/sync-skill-tools.mjs`. Required on OpenClaw **2026+**, which silently drops any tool a plugin registers but hasn't declared.
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>` (e.g. `config.skills.followme.depthTopic`). The CLI doesn't auto-write these — use `agenticros config set skills.find.confidence=0.5` or edit `~/.openclaw/openclaw.json` directly. See each skill's README for its options.
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 to **[skills.agenticros.com](https://skills.agenticros.com)** with `npx agenticros publish`, and install with `npx agenticros skills install <owner/skill-id>` (e.g. `chrismatthieu/followme`). See **[docs/skills.md](docs/skills.md)** for the full contract and **[agenticros-skill-followme](https://github.com/agenticros/agenticros-skill-followme)** ([marketplace listing](https://skills.agenticros.com/chrismatthieu/followme)) as a reference template.
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. `agenticros-skill-followme`, `agenticros-skill-find`) extend the capability registry with new verbs like `follow_person` and `find_object`. 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 <owner/skill-id>` from the marketplace (e.g. `chrismatthieu/followme`), 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.
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-skill-myskill",
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.6.0"
66
+ "@agenticros/core": "^0.8.1"
65
67
  }
66
68
  }
67
69
  ```
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agenticros/core",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "type": "module",
5
5
  "description": "AgenticROS core — platform-agnostic ROS2 transport, types, and config (the dep every AgenticROS skill imports).",
6
6
  "keywords": [
@@ -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;
@@ -66,8 +66,8 @@ importers:
66
66
  packages/agenticros-cli:
67
67
  dependencies:
68
68
  '@agenticros/core':
69
- specifier: ^0.8.0
70
- version: 0.8.0
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.0':
182
- resolution: {integrity: sha512-E6WJBHhd0QE2YTGBrKe84q+SAGjgLMCp785BRh8UJDS4WUKqL80B04TMjZ1JLjtphCl/uk9XNZPjIjzBixz0kg==}
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.0':
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