agenticros 0.2.4 → 0.3.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/README.md +4 -0
  2. package/dist/__tests__/skill-scaffold.test.d.ts +2 -0
  3. package/dist/__tests__/skill-scaffold.test.d.ts.map +1 -0
  4. package/dist/__tests__/skill-scaffold.test.js +80 -0
  5. package/dist/__tests__/skill-scaffold.test.js.map +1 -0
  6. package/dist/commands/create-skill.d.ts +9 -0
  7. package/dist/commands/create-skill.d.ts.map +1 -0
  8. package/dist/commands/create-skill.js +41 -0
  9. package/dist/commands/create-skill.js.map +1 -0
  10. package/dist/commands/publish-skill.d.ts +10 -0
  11. package/dist/commands/publish-skill.d.ts.map +1 -0
  12. package/dist/commands/publish-skill.js +222 -0
  13. package/dist/commands/publish-skill.js.map +1 -0
  14. package/dist/commands/skills-dev.d.ts +11 -0
  15. package/dist/commands/skills-dev.d.ts.map +1 -0
  16. package/dist/commands/skills-dev.js +154 -0
  17. package/dist/commands/skills-dev.js.map +1 -0
  18. package/dist/commands/skills.d.ts.map +1 -1
  19. package/dist/commands/skills.js +21 -11
  20. package/dist/commands/skills.js.map +1 -1
  21. package/dist/index.js +37 -2
  22. package/dist/index.js.map +1 -1
  23. package/dist/menu.d.ts.map +1 -1
  24. package/dist/menu.js +28 -2
  25. package/dist/menu.js.map +1 -1
  26. package/dist/util/marketplace.d.ts +26 -2
  27. package/dist/util/marketplace.d.ts.map +1 -1
  28. package/dist/util/marketplace.js +56 -4
  29. package/dist/util/marketplace.js.map +1 -1
  30. package/dist/util/skill-manifest.d.ts +58 -0
  31. package/dist/util/skill-manifest.d.ts.map +1 -0
  32. package/dist/util/skill-manifest.js +81 -0
  33. package/dist/util/skill-manifest.js.map +1 -0
  34. package/dist/util/skill-scaffold.d.ts +26 -0
  35. package/dist/util/skill-scaffold.d.ts.map +1 -0
  36. package/dist/util/skill-scaffold.js +153 -0
  37. package/dist/util/skill-scaffold.js.map +1 -0
  38. package/package.json +2 -1
  39. package/runtime/BUNDLE.json +1 -1
  40. package/runtime/README.md +2 -0
  41. package/runtime/docs/cli.md +12 -0
  42. package/templates/skills/camera/README.md +16 -0
  43. package/templates/skills/camera/demo.md +5 -0
  44. package/templates/skills/camera/package.json +38 -0
  45. package/templates/skills/camera/src/index.ts +68 -0
  46. package/templates/skills/camera/tsconfig.json +15 -0
  47. package/templates/skills/depth/README.md +16 -0
  48. package/templates/skills/depth/demo.md +5 -0
  49. package/templates/skills/depth/package.json +38 -0
  50. package/templates/skills/depth/src/index.ts +69 -0
  51. package/templates/skills/depth/tsconfig.json +15 -0
  52. package/templates/skills/hello/README.md +32 -0
  53. package/templates/skills/hello/demo.md +5 -0
  54. package/templates/skills/hello/package.json +37 -0
  55. package/templates/skills/hello/src/index.ts +37 -0
  56. package/templates/skills/hello/tsconfig.json +15 -0
  57. package/templates/skills/robot/README.md +18 -0
  58. package/templates/skills/robot/demo.md +5 -0
  59. package/templates/skills/robot/package.json +40 -0
  60. package/templates/skills/robot/src/index.ts +69 -0
  61. package/templates/skills/robot/tsconfig.json +15 -0
package/README.md CHANGED
@@ -56,6 +56,10 @@ Three ways, listed easiest first:
56
56
  | `agenticros status` | Snapshot of running components + last mode. |
57
57
  | `agenticros logs [target]` | Tail `camera` / `mcp` / `sim` / `rosbridge` / `gateway`. |
58
58
  | `agenticros config [show\|set\|edit\|reset]` | Read or edit `~/.agenticros/config.json`. |
59
+ | `agenticros create-skill <slug>` | Scaffold a new skill package in cwd. |
60
+ | `agenticros publish` | Publish skill in cwd to skills.agenticros.com. |
61
+ | `agenticros skills dev` | Local skill dev harness (`npm run dev` in skill repos). |
62
+ | `agenticros skills install <owner/skill>` | Install from the marketplace. |
59
63
  | `agenticros --help` | Full help text. |
60
64
 
61
65
  ## How `init` works
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skill-scaffold.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-scaffold.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/skill-scaffold.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { normalizeSkillSlug, normalizeTemplate, scaffoldSkill, slugToToolName, hashSkillSource, } from "../util/skill-scaffold.js";
4
+ import { isValidSlug, parseMarketplaceRef, validateManifest, ManifestError, marketplaceRef, firestoreDocId, } from "../util/skill-manifest.js";
5
+ import { mkdtempSync, rmSync, existsSync } from "node:fs";
6
+ import { join } from "node:path";
7
+ import { tmpdir } from "node:os";
8
+ describe("skill-scaffold", () => {
9
+ it("normalizes slugs", () => {
10
+ assert.equal(normalizeSkillSlug("Hello-World"), "hello-world");
11
+ assert.equal(slugToToolName("hello-world"), "hello_world");
12
+ });
13
+ it("rejects invalid slugs", () => {
14
+ assert.throws(() => normalizeSkillSlug("a"), /kebab-case/);
15
+ });
16
+ it("normalizes templates", () => {
17
+ assert.equal(normalizeTemplate("robot"), "robot");
18
+ assert.throws(() => normalizeTemplate("invalid"));
19
+ });
20
+ it("scaffolds hello template into temp dir", () => {
21
+ const parent = mkdtempSync(join(tmpdir(), "agenticros-skill-"));
22
+ try {
23
+ const result = scaffoldSkill({
24
+ slug: "test-hello",
25
+ template: "hello",
26
+ cwd: parent,
27
+ });
28
+ assert.equal(result.slug, "test-hello");
29
+ assert.ok(existsSync(join(result.dir, "package.json")));
30
+ assert.ok(existsSync(join(result.dir, "src", "index.ts")));
31
+ assert.ok(existsSync(join(result.dir, "demo.md")));
32
+ }
33
+ finally {
34
+ rmSync(parent, { recursive: true, force: true });
35
+ }
36
+ });
37
+ it("hashes source consistently", () => {
38
+ const a = hashSkillSource("hello\nworld");
39
+ const b = hashSkillSource("hello world");
40
+ assert.equal(a, b);
41
+ });
42
+ });
43
+ describe("skill-manifest", () => {
44
+ it("validates minimal manifest", () => {
45
+ const { block, warnings } = validateManifest({
46
+ name: "agenticros-skill-x",
47
+ version: "0.1.0",
48
+ main: "dist/index.js",
49
+ agenticros: {
50
+ id: "test-skill",
51
+ capabilities: [{ id: "t", verb: "run", description: "d" }],
52
+ },
53
+ });
54
+ assert.equal(block.id, "test-skill");
55
+ assert.ok(warnings.length > 0);
56
+ });
57
+ it("rejects missing agenticros block", () => {
58
+ assert.throws(() => validateManifest({
59
+ name: "x",
60
+ version: "0.1.0",
61
+ main: "dist/index.js",
62
+ }), ManifestError);
63
+ });
64
+ it("parses marketplace refs", () => {
65
+ assert.deepEqual(parseMarketplaceRef("chrismatthieu/follow-me"), {
66
+ owner: "chrismatthieu",
67
+ skill: "follow-me",
68
+ });
69
+ assert.equal(parseMarketplaceRef("bad"), null);
70
+ });
71
+ it("builds firestore doc ids", () => {
72
+ assert.equal(firestoreDocId("Chris", "follow-me"), "chris__follow-me");
73
+ assert.equal(marketplaceRef("chris", "follow-me"), "chris/follow-me");
74
+ });
75
+ it("validates slug shape", () => {
76
+ assert.ok(isValidSlug("hello-world"));
77
+ assert.ok(!isValidSlug("Hello"));
78
+ });
79
+ });
80
+ //# sourceMappingURL=skill-scaffold.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-scaffold.test.js","sourceRoot":"","sources":["../../src/__tests__/skill-scaffold.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `agenticros create-skill <slug>` — scaffold a new skill package in cwd.
3
+ */
4
+ export interface CreateSkillOptions {
5
+ slug: string;
6
+ template?: string;
7
+ }
8
+ export declare function createSkillCommand(opts: CreateSkillOptions): Promise<void>;
9
+ //# sourceMappingURL=create-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-skill.d.ts","sourceRoot":"","sources":["../../src/commands/create-skill.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoChF"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * `agenticros create-skill <slug>` — scaffold a new skill package in cwd.
3
+ */
4
+ import { basename } from "node:path";
5
+ import { scaffoldSkill } from "../util/skill-scaffold.js";
6
+ import { dim, err, header, info, ok } from "../util/logger.js";
7
+ export async function createSkillCommand(opts) {
8
+ if (!opts.slug?.trim()) {
9
+ err("Usage: agenticros create-skill <slug> [--template hello|robot|camera|depth]");
10
+ process.exit(1);
11
+ }
12
+ header("Creating skill");
13
+ let result;
14
+ try {
15
+ result = scaffoldSkill({ slug: opts.slug, template: opts.template });
16
+ }
17
+ catch (e) {
18
+ err(e instanceof Error ? e.message : String(e));
19
+ process.exit(1);
20
+ }
21
+ ok(`Creating skill ${result.slug}`);
22
+ const dirName = basename(result.dir);
23
+ info("");
24
+ info("Skill created:");
25
+ info("");
26
+ info(` ${dirName}/`);
27
+ info(" src/index.ts");
28
+ info(" package.json");
29
+ info(" README.md");
30
+ info(" demo.md");
31
+ info(" docs/icon.png");
32
+ info("");
33
+ info("Next steps:");
34
+ info("");
35
+ info(` cd ${dirName}`);
36
+ info(" npm install");
37
+ info(" npm run dev");
38
+ info("");
39
+ dim(`Template: ${result.template} | Tool: ${result.toolName}`);
40
+ }
41
+ //# sourceMappingURL=create-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-skill.js","sourceRoot":"","sources":["../../src/commands/create-skill.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAU,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAOvE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAwB;IAC/D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACvB,GAAG,CAAC,6EAA6E,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAEzB,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,EAAE,CAAC,kBAAkB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACvB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzB,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzB,IAAI,CAAC,eAAe,CAAC,CAAC;IACtB,IAAI,CAAC,aAAa,CAAC,CAAC;IACpB,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,aAAa,CAAC,CAAC;IACpB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;IACxB,IAAI,CAAC,eAAe,CAAC,CAAC;IACtB,IAAI,CAAC,eAAe,CAAC,CAAC;IACtB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `agenticros publish` — validate, push to GitHub, submit to skills marketplace.
3
+ */
4
+ export interface PublishSkillOptions {
5
+ graduate?: boolean;
6
+ cwd?: string;
7
+ yes?: boolean;
8
+ }
9
+ export declare function publishSkillCommand(opts: PublishSkillOptions): Promise<void>;
10
+ //# sourceMappingURL=publish-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-skill.d.ts","sourceRoot":"","sources":["../../src/commands/publish-skill.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmCH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAyFD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+HlF"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * `agenticros publish` — validate, push to GitHub, submit to skills marketplace.
3
+ */
4
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
5
+ import { join } from "node:path";
6
+ import { checkbox, confirm, input } from "@inquirer/prompts";
7
+ import { execa } from "execa";
8
+ import { skillsDevCommand } from "./skills-dev.js";
9
+ import { isUnmodifiedTemplate, readSkillIndexSource, } from "../util/skill-scaffold.js";
10
+ import { validateManifest, } from "../util/skill-manifest.js";
11
+ import { apiBase, submitSkillToMarketplace, validateSkillOnMarketplace, } from "../util/marketplace.js";
12
+ import { colors, err, header, info, ok, warn } from "../util/logger.js";
13
+ const MARKETPLACE_CATEGORIES = [
14
+ "navigation",
15
+ "vision",
16
+ "human-interaction",
17
+ "manipulation",
18
+ "search",
19
+ "audio",
20
+ "communication",
21
+ "telemetry",
22
+ ];
23
+ async function getGithubToken() {
24
+ const env = process.env.GH_TOKEN || process.env.GITHUB_TOKEN;
25
+ if (env?.trim())
26
+ return env.trim();
27
+ try {
28
+ const { stdout } = await execa("gh", ["auth", "token"], { reject: false });
29
+ const t = stdout.trim();
30
+ return t || null;
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ async function getGithubLogin(token) {
37
+ const res = await fetch("https://api.github.com/user", {
38
+ headers: {
39
+ Authorization: `Bearer ${token}`,
40
+ Accept: "application/vnd.github+json",
41
+ "User-Agent": "agenticros-cli",
42
+ },
43
+ });
44
+ if (!res.ok) {
45
+ throw new Error(`GitHub auth failed (${res.status}). Run: gh auth login -s public_repo`);
46
+ }
47
+ const data = (await res.json());
48
+ if (!data.login)
49
+ throw new Error("Could not read GitHub login from token.");
50
+ return data.login;
51
+ }
52
+ function readSkillPackage(cwd) {
53
+ const path = join(cwd, "package.json");
54
+ if (!existsSync(path)) {
55
+ throw new Error("No package.json in current directory. Run from your skill root.");
56
+ }
57
+ return JSON.parse(readFileSync(path, "utf8"));
58
+ }
59
+ function writeSkillPackage(cwd, manifest) {
60
+ writeFileSync(join(cwd, "package.json"), `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
61
+ }
62
+ function detectTemplate(manifest) {
63
+ if (manifest.agenticros?.tutorial === true)
64
+ return "hello";
65
+ const source = readSkillIndexSource(process.cwd());
66
+ if (!source)
67
+ return null;
68
+ for (const t of ["hello", "robot", "camera", "depth"]) {
69
+ if (isUnmodifiedTemplate(source, t))
70
+ return t;
71
+ }
72
+ return null;
73
+ }
74
+ async function ensureGitRemote(cwd, slug) {
75
+ try {
76
+ const { stdout } = await execa("git", ["remote", "get-url", "origin"], { cwd });
77
+ const url = stdout.trim();
78
+ if (url)
79
+ return normalizeGithubUrl(url);
80
+ }
81
+ catch {
82
+ // no remote
83
+ }
84
+ const token = await getGithubToken();
85
+ if (!token) {
86
+ throw new Error("No git remote origin. Create a GitHub repo and run:\n" +
87
+ ` gh repo create agenticros-skill-${slug} --public --source=. --remote=origin --push`);
88
+ }
89
+ const login = await getGithubLogin(token);
90
+ const repoName = `agenticros-skill-${slug}`;
91
+ info(`Creating GitHub repo ${login}/${repoName}…`);
92
+ await execa("gh", ["repo", "create", repoName, "--public", "--source=.", "--remote=origin", "--push"], { cwd, stdio: "inherit" });
93
+ const { stdout } = await execa("git", ["remote", "get-url", "origin"], { cwd });
94
+ return normalizeGithubUrl(stdout.trim());
95
+ }
96
+ function normalizeGithubUrl(url) {
97
+ let u = url.replace(/\.git$/, "");
98
+ if (u.startsWith("git@github.com:")) {
99
+ u = `https://github.com/${u.slice("git@github.com:".length)}`;
100
+ }
101
+ return u;
102
+ }
103
+ export async function publishSkillCommand(opts) {
104
+ const cwd = opts.cwd ?? process.cwd();
105
+ header("Publish skill to marketplace");
106
+ let manifest = readSkillPackage(cwd);
107
+ const { block, warnings } = validateManifest(manifest);
108
+ if (block.tutorial === true && !opts.graduate) {
109
+ err("This is a tutorial skill (agenticros.tutorial: true). " +
110
+ "Customize src/index.ts and run with --graduate to publish to the public catalog, " +
111
+ "or use --template robot|camera|depth for a publish-ready skill.");
112
+ process.exit(1);
113
+ }
114
+ const source = readSkillIndexSource(cwd);
115
+ const detectedTemplate = detectTemplate(manifest);
116
+ if (opts.graduate) {
117
+ if (!source || (detectedTemplate && isUnmodifiedTemplate(source, detectedTemplate))) {
118
+ err("Source still matches the default template. Customize src/index.ts before --graduate.");
119
+ process.exit(1);
120
+ }
121
+ const yes = await confirm({
122
+ message: "Remove tutorial flag and publish to the public catalog?",
123
+ default: false,
124
+ });
125
+ if (!yes) {
126
+ info("Publish cancelled.");
127
+ return;
128
+ }
129
+ if (manifest.agenticros) {
130
+ manifest.agenticros.tutorial = false;
131
+ writeSkillPackage(cwd, manifest);
132
+ }
133
+ }
134
+ try {
135
+ await execa("npm", ["run", "build"], { cwd, stdio: "inherit" });
136
+ }
137
+ catch {
138
+ err("Build failed.");
139
+ process.exit(1);
140
+ }
141
+ try {
142
+ await skillsDevCommand({ cwd, live: false });
143
+ }
144
+ catch {
145
+ // skillsDevCommand exits on failure
146
+ return;
147
+ }
148
+ if (!opts.yes) {
149
+ if (!block.description) {
150
+ const description = await input({
151
+ message: "Description (one sentence):",
152
+ validate: (v) => v.trim().length > 0 || "Required",
153
+ });
154
+ manifest.agenticros = { ...block, description: description.trim() };
155
+ manifest.description = description.trim();
156
+ writeSkillPackage(cwd, manifest);
157
+ }
158
+ if (!block.categories || block.categories.length === 0) {
159
+ const categories = await checkbox({
160
+ message: "Categories:",
161
+ choices: MARKETPLACE_CATEGORIES.map((c) => ({ name: c, value: c })),
162
+ });
163
+ manifest.agenticros = {
164
+ ...(manifest.agenticros ?? block),
165
+ categories,
166
+ };
167
+ writeSkillPackage(cwd, manifest);
168
+ }
169
+ }
170
+ manifest = readSkillPackage(cwd);
171
+ const remoteUrl = await ensureGitRemote(cwd, block.id);
172
+ try {
173
+ await execa("git", ["add", "-A"], { cwd });
174
+ const { stdout: status } = await execa("git", ["status", "--porcelain"], { cwd });
175
+ if (status.trim()) {
176
+ await execa("git", ["commit", "-m", `chore: prepare ${block.id} for marketplace`], {
177
+ cwd,
178
+ stdio: "inherit",
179
+ });
180
+ }
181
+ await execa("git", ["push", "-u", "origin", "HEAD"], { cwd, stdio: "inherit" });
182
+ }
183
+ catch (e) {
184
+ warn(`Git push issue: ${e instanceof Error ? e.message : String(e)}`);
185
+ }
186
+ const remoteValidation = await validateSkillOnMarketplace(manifest);
187
+ if (!remoteValidation.ok) {
188
+ for (const e of remoteValidation.errors)
189
+ err(e);
190
+ process.exit(1);
191
+ }
192
+ for (const w of [...warnings, ...remoteValidation.warnings]) {
193
+ warn(w);
194
+ }
195
+ const token = await getGithubToken();
196
+ if (!token) {
197
+ err("GitHub token required. Run: gh auth login -s public_repo");
198
+ info(`Or submit manually: ${apiBase().replace("/api", "")}/submit`);
199
+ process.exit(1);
200
+ }
201
+ const login = await getGithubLogin(token);
202
+ let result;
203
+ try {
204
+ result = await submitSkillToMarketplace({ githubUrl: remoteUrl, githubAccessToken: token });
205
+ }
206
+ catch (e) {
207
+ err(e instanceof Error ? e.message : String(e));
208
+ process.exit(1);
209
+ }
210
+ const ref = result.marketplaceRef ?? `${login}/${block.id}`;
211
+ const site = apiBase().replace(/\/api$/, "");
212
+ ok("Published to skills.agenticros.com");
213
+ info(` ${site}/${ref}`);
214
+ info(` Profile: ${site}/${login}`);
215
+ info("");
216
+ info(`Install: ${colors.bold(`npx agenticros skills install ${ref}`)}`);
217
+ if (result.warnings?.length) {
218
+ for (const w of result.warnings)
219
+ warn(w);
220
+ }
221
+ }
222
+ //# sourceMappingURL=publish-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-skill.js","sourceRoot":"","sources":["../../src/commands/publish-skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `agenticros skills dev` — load a skill locally without the OpenClaw gateway.
3
+ */
4
+ export interface SkillsDevOptions {
5
+ invoke?: string;
6
+ watch?: boolean;
7
+ live?: boolean;
8
+ cwd?: string;
9
+ }
10
+ export declare function skillsDevCommand(opts: SkillsDevOptions): Promise<void>;
11
+ //# sourceMappingURL=skills-dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-dev.d.ts","sourceRoot":"","sources":["../../src/commands/skills-dev.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAyGD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0D5E"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * `agenticros skills dev` — load a skill locally without the OpenClaw gateway.
3
+ */
4
+ import { existsSync, readFileSync } from "node:fs";
5
+ import { join, resolve } from "node:path";
6
+ import { createRequire } from "node:module";
7
+ import { pathToFileURL } from "node:url";
8
+ import { execa } from "execa";
9
+ import { validateManifest } from "../util/skill-manifest.js";
10
+ import { err, ok, info, warn } from "../util/logger.js";
11
+ function readPackageJson(dir) {
12
+ const path = join(dir, "package.json");
13
+ if (!existsSync(path)) {
14
+ throw new Error("No package.json in current directory. Run from your skill root.");
15
+ }
16
+ return JSON.parse(readFileSync(path, "utf8"));
17
+ }
18
+ function stubContext(live) {
19
+ const noopTransport = {
20
+ async publish() { },
21
+ async subscribeOnce() {
22
+ return null;
23
+ },
24
+ async listTopics() {
25
+ return [];
26
+ },
27
+ async callService() {
28
+ return null;
29
+ },
30
+ async sendActionGoal() {
31
+ return null;
32
+ },
33
+ async getParameter() {
34
+ return null;
35
+ },
36
+ async setParameter() { },
37
+ status: live ? "connected" : "disconnected",
38
+ };
39
+ return {
40
+ getTransport() {
41
+ if (!live) {
42
+ throw new Error("Transport not connected. Use --live when a gateway is running, or test tool registration only.");
43
+ }
44
+ return noopTransport;
45
+ },
46
+ async getDepthDistance() {
47
+ return {
48
+ distance_m: 0,
49
+ median_m: 0,
50
+ valid: false,
51
+ topic: "",
52
+ encoding: "",
53
+ width: 0,
54
+ height: 0,
55
+ sample_count: 0,
56
+ min_m: 0,
57
+ max_m: 0,
58
+ };
59
+ },
60
+ async getDepthSectors() {
61
+ return {
62
+ left_m: 0,
63
+ center_m: 0,
64
+ right_m: 0,
65
+ valid: false,
66
+ topic: "",
67
+ };
68
+ },
69
+ logger: {
70
+ info: (...m) => console.log("[skill]", ...m),
71
+ warn: (...m) => console.warn("[skill]", ...m),
72
+ error: (...m) => console.error("[skill]", ...m),
73
+ debug: () => { },
74
+ },
75
+ };
76
+ }
77
+ function loadRegisteredTools(entryPath, config, live) {
78
+ const tools = [];
79
+ const api = {
80
+ registerTool(tool) {
81
+ tools.push({ name: tool.name, execute: tool.execute });
82
+ },
83
+ logger: {
84
+ info: () => { },
85
+ warn: () => { },
86
+ error: () => { },
87
+ debug: () => { },
88
+ },
89
+ };
90
+ const require = createRequire(pathToFileURL(entryPath).href);
91
+ const mod = require(entryPath);
92
+ if (typeof mod.registerSkill !== "function") {
93
+ throw new Error(`${entryPath} must export registerSkill(api, config, context).`);
94
+ }
95
+ mod.registerSkill(api, config, stubContext(live));
96
+ return tools;
97
+ }
98
+ export async function skillsDevCommand(opts) {
99
+ const cwd = opts.cwd ?? process.cwd();
100
+ const pkg = readPackageJson(cwd);
101
+ const { block } = validateManifest(pkg);
102
+ const skillId = block.id;
103
+ if (!opts.watch) {
104
+ try {
105
+ await execa("npm", ["run", "build"], { cwd, stdio: "inherit" });
106
+ }
107
+ catch {
108
+ err("Build failed. Fix TypeScript errors and retry.");
109
+ process.exit(1);
110
+ }
111
+ }
112
+ const main = typeof pkg.main === "string" ? pkg.main : "dist/index.js";
113
+ const entryPath = resolve(cwd, main);
114
+ if (!existsSync(entryPath)) {
115
+ err(`Built entry not found: ${entryPath}. Run npm run build first.`);
116
+ process.exit(1);
117
+ }
118
+ const agenticrosConfig = {
119
+ skills: { [skillId]: {} },
120
+ robot: {
121
+ cameraTopic: "camera/color/image_raw",
122
+ depthTopic: "depth/image_rect_raw",
123
+ },
124
+ };
125
+ let tools;
126
+ try {
127
+ tools = loadRegisteredTools(entryPath, agenticrosConfig, opts.live === true);
128
+ }
129
+ catch (e) {
130
+ err(e instanceof Error ? e.message : String(e));
131
+ process.exit(1);
132
+ }
133
+ ok(`Skill loaded: ${skillId}`);
134
+ info(` Tools: ${tools.map((t) => t.name).join(", ") || "(none)"}`);
135
+ if (opts.invoke) {
136
+ const tool = tools.find((t) => t.name === opts.invoke);
137
+ if (!tool) {
138
+ err(`Tool not found: ${opts.invoke}`);
139
+ process.exit(1);
140
+ }
141
+ try {
142
+ const result = await tool.execute("dev", {}, undefined);
143
+ info(JSON.stringify(result, null, 2));
144
+ }
145
+ catch (e) {
146
+ if (!opts.live) {
147
+ warn("Tool execution failed (expected without --live for robot/camera/depth tools).");
148
+ }
149
+ err(e instanceof Error ? e.message : String(e));
150
+ process.exit(1);
151
+ }
152
+ }
153
+ }
154
+ //# sourceMappingURL=skills-dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-dev.js","sourceRoot":"","sources":["../../src/commands/skills-dev.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAkCH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BtE"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAsCH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCtE"}