clawbr 0.0.16 → 0.0.19

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.
@@ -20,6 +20,7 @@ import { AnalyzeCommand } from "./commands/analyze.command.js";
20
20
  import { NotificationsCommand } from "./commands/notifications.command.js";
21
21
  import { ModelsCommand } from "./commands/models.command.js";
22
22
  import { DockerInitCommand } from "./commands/docker.init.command.js";
23
+ import { SkillsUpdateCommand } from "./commands/skills.update.command.js";
23
24
  export class AppModule {
24
25
  }
25
26
  AppModule = _ts_decorate([
@@ -39,7 +40,8 @@ AppModule = _ts_decorate([
39
40
  AnalyzeCommand,
40
41
  NotificationsCommand,
41
42
  ModelsCommand,
42
- DockerInitCommand
43
+ DockerInitCommand,
44
+ SkillsUpdateCommand
43
45
  ]
44
46
  })
45
47
  ], AppModule);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/app.module.ts"],"sourcesContent":["import { Module } from \"@nestjs/common\";\nimport { PostCommand } from \"./commands/post.command.js\";\nimport { TuiCommand } from \"./commands/tui.command.js\";\nimport { OnboardCommand } from \"./commands/onboard.command.js\";\nimport { DefaultCommand } from \"./commands/default.command.js\";\nimport { GenerateCommand } from \"./commands/generate.command.js\";\nimport { LikeCommand } from \"./commands/like.command.js\";\nimport { CommentCommand } from \"./commands/comment.command.js\";\nimport { CommentsCommand } from \"./commands/comments.command.js\";\nimport { QuoteCommand } from \"./commands/quote.command.js\";\nimport { FeedCommand } from \"./commands/feed.command.js\";\nimport { ShowCommand } from \"./commands/show.command.js\";\nimport { AnalyzeCommand } from \"./commands/analyze.command.js\";\nimport { NotificationsCommand } from \"./commands/notifications.command.js\";\nimport { ModelsCommand } from \"./commands/models.command.js\";\nimport { DockerInitCommand } from \"./commands/docker.init.command.js\";\n\n@Module({\n providers: [\n PostCommand,\n TuiCommand,\n OnboardCommand,\n DefaultCommand,\n GenerateCommand,\n LikeCommand,\n CommentCommand,\n CommentsCommand,\n QuoteCommand,\n FeedCommand,\n ShowCommand,\n AnalyzeCommand,\n NotificationsCommand,\n ModelsCommand,\n DockerInitCommand,\n ],\n})\nexport class AppModule {}\n"],"names":["Module","PostCommand","TuiCommand","OnboardCommand","DefaultCommand","GenerateCommand","LikeCommand","CommentCommand","CommentsCommand","QuoteCommand","FeedCommand","ShowCommand","AnalyzeCommand","NotificationsCommand","ModelsCommand","DockerInitCommand","AppModule","providers"],"mappings":";;;;;;AAAA,SAASA,MAAM,QAAQ,iBAAiB;AACxC,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,UAAU,QAAQ,4BAA4B;AACvD,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,eAAe,QAAQ,iCAAiC;AACjE,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,eAAe,QAAQ,iCAAiC;AACjE,SAASC,YAAY,QAAQ,8BAA8B;AAC3D,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,oBAAoB,QAAQ,sCAAsC;AAC3E,SAASC,aAAa,QAAQ,+BAA+B;AAC7D,SAASC,iBAAiB,QAAQ,oCAAoC;AAqBtE,OAAO,MAAMC;AAAW;;;QAlBtBC,WAAW;YACThB;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;SACD"}
1
+ {"version":3,"sources":["../src/app.module.ts"],"sourcesContent":["import { Module } from \"@nestjs/common\";\nimport { PostCommand } from \"./commands/post.command.js\";\nimport { TuiCommand } from \"./commands/tui.command.js\";\nimport { OnboardCommand } from \"./commands/onboard.command.js\";\nimport { DefaultCommand } from \"./commands/default.command.js\";\nimport { GenerateCommand } from \"./commands/generate.command.js\";\nimport { LikeCommand } from \"./commands/like.command.js\";\nimport { CommentCommand } from \"./commands/comment.command.js\";\nimport { CommentsCommand } from \"./commands/comments.command.js\";\nimport { QuoteCommand } from \"./commands/quote.command.js\";\nimport { FeedCommand } from \"./commands/feed.command.js\";\nimport { ShowCommand } from \"./commands/show.command.js\";\nimport { AnalyzeCommand } from \"./commands/analyze.command.js\";\nimport { NotificationsCommand } from \"./commands/notifications.command.js\";\nimport { ModelsCommand } from \"./commands/models.command.js\";\nimport { DockerInitCommand } from \"./commands/docker.init.command.js\";\nimport { SkillsUpdateCommand } from \"./commands/skills.update.command.js\";\n\n@Module({\n providers: [\n PostCommand,\n TuiCommand,\n OnboardCommand,\n DefaultCommand,\n GenerateCommand,\n LikeCommand,\n CommentCommand,\n CommentsCommand,\n QuoteCommand,\n FeedCommand,\n ShowCommand,\n AnalyzeCommand,\n NotificationsCommand,\n ModelsCommand,\n DockerInitCommand,\n SkillsUpdateCommand,\n ],\n})\nexport class AppModule {}\n"],"names":["Module","PostCommand","TuiCommand","OnboardCommand","DefaultCommand","GenerateCommand","LikeCommand","CommentCommand","CommentsCommand","QuoteCommand","FeedCommand","ShowCommand","AnalyzeCommand","NotificationsCommand","ModelsCommand","DockerInitCommand","SkillsUpdateCommand","AppModule","providers"],"mappings":";;;;;;AAAA,SAASA,MAAM,QAAQ,iBAAiB;AACxC,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,UAAU,QAAQ,4BAA4B;AACvD,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,eAAe,QAAQ,iCAAiC;AACjE,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,eAAe,QAAQ,iCAAiC;AACjE,SAASC,YAAY,QAAQ,8BAA8B;AAC3D,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,oBAAoB,QAAQ,sCAAsC;AAC3E,SAASC,aAAa,QAAQ,+BAA+B;AAC7D,SAASC,iBAAiB,QAAQ,oCAAoC;AACtE,SAASC,mBAAmB,QAAQ,sCAAsC;AAsB1E,OAAO,MAAMC;AAAW;;;QAnBtBC,WAAW;YACTjB;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;SACD"}
@@ -0,0 +1,75 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ import { Command, CommandRunner } from "nest-commander";
8
+ import chalk from "chalk";
9
+ import ora from "ora";
10
+ import { homedir } from "os";
11
+ import { join } from "path";
12
+ import { writeFile, mkdir } from "node:fs/promises";
13
+ import { existsSync } from "fs";
14
+ export class SkillsUpdateCommand extends CommandRunner {
15
+ async run() {
16
+ console.log(chalk.bold.cyan("\nšŸ“„ Updating Clawbr Skills\n"));
17
+ const skillsDir = join(homedir(), ".openclaw", "skills", "clawbr");
18
+ const baseUrl = "https://clawbr.com";
19
+ // Ensure directory exists
20
+ await mkdir(skillsDir, {
21
+ recursive: true
22
+ });
23
+ const files = [
24
+ {
25
+ name: "SKILL.md",
26
+ url: `${baseUrl}/skill.md`
27
+ },
28
+ {
29
+ name: "HEARTBEAT.md",
30
+ url: `${baseUrl}/heartbeat.md`
31
+ }
32
+ ];
33
+ const spinner = ora("Downloading skill files...").start();
34
+ try {
35
+ for (const file of files){
36
+ const response = await fetch(file.url);
37
+ if (!response.ok) {
38
+ spinner.warn(chalk.yellow(`⚠ Could not fetch ${file.name}: ${response.statusText}`));
39
+ continue;
40
+ }
41
+ const content = await response.text();
42
+ const filePath = join(skillsDir, file.name);
43
+ await writeFile(filePath, content, "utf-8");
44
+ spinner.text = `Downloaded ${file.name}`;
45
+ }
46
+ spinner.succeed(chalk.green("āœ“ Skill files updated"));
47
+ console.log(chalk.gray(`\nšŸ“ Location: ${skillsDir}\n`));
48
+ console.log(chalk.gray("Files updated:"));
49
+ files.forEach((file)=>{
50
+ const filePath = join(skillsDir, file.name);
51
+ if (existsSync(filePath)) {
52
+ console.log(chalk.gray(` āœ“ ${file.name}`));
53
+ }
54
+ });
55
+ console.log();
56
+ } catch (error) {
57
+ spinner.fail(chalk.red("Failed to update skill files"));
58
+ console.error(chalk.red(`\nāŒ Error: ${error.message}\n`));
59
+ throw error;
60
+ }
61
+ }
62
+ }
63
+ SkillsUpdateCommand = _ts_decorate([
64
+ Command({
65
+ name: "skills:update",
66
+ description: "Update Clawbr skill files from clawbr.com",
67
+ aliases: [
68
+ "skills-update",
69
+ "update-skills",
70
+ "update"
71
+ ]
72
+ })
73
+ ], SkillsUpdateCommand);
74
+
75
+ //# sourceMappingURL=skills.update.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/skills.update.command.ts"],"sourcesContent":["import { Command, CommandRunner } from \"nest-commander\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { writeFile, mkdir } from \"fs/promises\";\nimport { existsSync } from \"fs\";\n\n@Command({\n name: \"skills:update\",\n description: \"Update Clawbr skill files from clawbr.com\",\n aliases: [\"skills-update\", \"update-skills\", \"update\"],\n})\nexport class SkillsUpdateCommand extends CommandRunner {\n async run(): Promise<void> {\n console.log(chalk.bold.cyan(\"\\nšŸ“„ Updating Clawbr Skills\\n\"));\n\n const skillsDir = join(homedir(), \".openclaw\", \"skills\", \"clawbr\");\n const baseUrl = \"https://clawbr.com\";\n\n // Ensure directory exists\n await mkdir(skillsDir, { recursive: true });\n\n const files = [\n { name: \"SKILL.md\", url: `${baseUrl}/skill.md` },\n { name: \"HEARTBEAT.md\", url: `${baseUrl}/heartbeat.md` },\n ];\n\n const spinner = ora(\"Downloading skill files...\").start();\n\n try {\n for (const file of files) {\n const response = await fetch(file.url);\n\n if (!response.ok) {\n spinner.warn(chalk.yellow(`⚠ Could not fetch ${file.name}: ${response.statusText}`));\n continue;\n }\n\n const content = await response.text();\n const filePath = join(skillsDir, file.name);\n\n await writeFile(filePath, content, \"utf-8\");\n spinner.text = `Downloaded ${file.name}`;\n }\n\n spinner.succeed(chalk.green(\"āœ“ Skill files updated\"));\n\n console.log(chalk.gray(`\\nšŸ“ Location: ${skillsDir}\\n`));\n console.log(chalk.gray(\"Files updated:\"));\n files.forEach((file) => {\n const filePath = join(skillsDir, file.name);\n if (existsSync(filePath)) {\n console.log(chalk.gray(` āœ“ ${file.name}`));\n }\n });\n console.log();\n } catch (error: any) {\n spinner.fail(chalk.red(\"Failed to update skill files\"));\n console.error(chalk.red(`\\nāŒ Error: ${error.message}\\n`));\n throw error;\n }\n }\n}\n"],"names":["Command","CommandRunner","chalk","ora","homedir","join","writeFile","mkdir","existsSync","SkillsUpdateCommand","run","console","log","bold","cyan","skillsDir","baseUrl","recursive","files","name","url","spinner","start","file","response","fetch","ok","warn","yellow","statusText","content","text","filePath","succeed","green","gray","forEach","error","fail","red","message","description","aliases"],"mappings":";;;;;;AAAA,SAASA,OAAO,EAAEC,aAAa,QAAQ,iBAAiB;AACxD,OAAOC,WAAW,QAAQ;AAC1B,OAAOC,SAAS,MAAM;AACtB,SAASC,OAAO,QAAQ,KAAK;AAC7B,SAASC,IAAI,QAAQ,OAAO;AAC5B,SAASC,SAAS,EAAEC,KAAK,QAAQ,mBAAc;AAC/C,SAASC,UAAU,QAAQ,KAAK;AAOhC,OAAO,MAAMC,4BAA4BR;IACvC,MAAMS,MAAqB;QACzBC,QAAQC,GAAG,CAACV,MAAMW,IAAI,CAACC,IAAI,CAAC;QAE5B,MAAMC,YAAYV,KAAKD,WAAW,aAAa,UAAU;QACzD,MAAMY,UAAU;QAEhB,0BAA0B;QAC1B,MAAMT,MAAMQ,WAAW;YAAEE,WAAW;QAAK;QAEzC,MAAMC,QAAQ;YACZ;gBAAEC,MAAM;gBAAYC,KAAK,GAAGJ,QAAQ,SAAS,CAAC;YAAC;YAC/C;gBAAEG,MAAM;gBAAgBC,KAAK,GAAGJ,QAAQ,aAAa,CAAC;YAAC;SACxD;QAED,MAAMK,UAAUlB,IAAI,8BAA8BmB,KAAK;QAEvD,IAAI;YACF,KAAK,MAAMC,QAAQL,MAAO;gBACxB,MAAMM,WAAW,MAAMC,MAAMF,KAAKH,GAAG;gBAErC,IAAI,CAACI,SAASE,EAAE,EAAE;oBAChBL,QAAQM,IAAI,CAACzB,MAAM0B,MAAM,CAAC,CAAC,kBAAkB,EAAEL,KAAKJ,IAAI,CAAC,EAAE,EAAEK,SAASK,UAAU,EAAE;oBAClF;gBACF;gBAEA,MAAMC,UAAU,MAAMN,SAASO,IAAI;gBACnC,MAAMC,WAAW3B,KAAKU,WAAWQ,KAAKJ,IAAI;gBAE1C,MAAMb,UAAU0B,UAAUF,SAAS;gBACnCT,QAAQU,IAAI,GAAG,CAAC,WAAW,EAAER,KAAKJ,IAAI,EAAE;YAC1C;YAEAE,QAAQY,OAAO,CAAC/B,MAAMgC,KAAK,CAAC;YAE5BvB,QAAQC,GAAG,CAACV,MAAMiC,IAAI,CAAC,CAAC,eAAe,EAAEpB,UAAU,EAAE,CAAC;YACtDJ,QAAQC,GAAG,CAACV,MAAMiC,IAAI,CAAC;YACvBjB,MAAMkB,OAAO,CAAC,CAACb;gBACb,MAAMS,WAAW3B,KAAKU,WAAWQ,KAAKJ,IAAI;gBAC1C,IAAIX,WAAWwB,WAAW;oBACxBrB,QAAQC,GAAG,CAACV,MAAMiC,IAAI,CAAC,CAAC,IAAI,EAAEZ,KAAKJ,IAAI,EAAE;gBAC3C;YACF;YACAR,QAAQC,GAAG;QACb,EAAE,OAAOyB,OAAY;YACnBhB,QAAQiB,IAAI,CAACpC,MAAMqC,GAAG,CAAC;YACvB5B,QAAQ0B,KAAK,CAACnC,MAAMqC,GAAG,CAAC,CAAC,WAAW,EAAEF,MAAMG,OAAO,CAAC,EAAE,CAAC;YACvD,MAAMH;QACR;IACF;AACF;;;QAtDElB,MAAM;QACNsB,aAAa;QACbC,SAAS;YAAC;YAAiB;YAAiB;SAAS"}
@@ -1,9 +1,9 @@
1
1
  services:
2
- agent-test_agent_00001:
2
+ agent-test111111:
3
3
  build:
4
4
  context: ..
5
5
  dockerfile: docker/Dockerfile
6
- container_name: clawbr-agent-test_agent_00001
6
+ container_name: clawbr-agent-test111111
7
7
  ports:
8
8
  - "18790:18790"
9
9
  environment:
@@ -13,21 +13,21 @@ services:
13
13
 
14
14
  # Clawbr API
15
15
  - CLAWBR_API_URL=https://clawbr.com
16
- - CLAWBR_TOKEN=8b1c33d145d2c3cb21713796bcdb8675c890f6493831b24490462e7b5135bcb0
16
+ - CLAWBR_TOKEN=65d0d875d5e9e66e49448e35116be6faf81ea79d8f26dbeb73d331ea8fbc6d3c
17
17
 
18
18
  # AI Provider Keys
19
- - OPENROUTER_API_KEY=${TEST_AGENT_00001_OPENROUTER_KEY}
20
- - GEMINI_API_KEY=${TEST_AGENT_00001_GEMINI_KEY}
21
- - OPENAI_API_KEY=${TEST_AGENT_00001_OPENAI_KEY}
19
+ - OPENROUTER_API_KEY=${TEST111111_OPENROUTER_KEY}
20
+ - GEMINI_API_KEY=${TEST111111_GEMINI_KEY}
21
+ - OPENAI_API_KEY=${TEST111111_OPENAI_KEY}
22
22
 
23
23
  # Agent Identity
24
- - AGENT_NAME=Test_agent_00001
25
- - OPENCLAW_GATEWAY_NAME=test_agent_00001
24
+ - AGENT_NAME=test111111
25
+ - OPENCLAW_GATEWAY_NAME=test111111
26
26
 
27
27
  # FULL DISABLE OF AUTH AND PAIRING
28
28
  - OPENCLAW_GATEWAY_AUTH=none
29
29
  - OPENCLAW_AUTH_MODE=none
30
- - OPENCLAW_GATEWAY_TOKEN=9b71ff99-108c-4aac-be74-f825d5471aac
30
+ - OPENCLAW_GATEWAY_TOKEN=01478959-e64d-4bbb-91b7-d79e178a0f72
31
31
  - OPENCLAW_CONTROL_UI_ALLOW_INSECURE_AUTH=true
32
32
  - OPENCLAW_CONTROL_UI_DANGEROUSLY_DISABLE_DEVICE_AUTH=true
33
33
  - OPENCLAW_CONTROL_UI_DANGEROUSLY_DISABLE_PAIRING=true
@@ -42,16 +42,16 @@ services:
42
42
  - DEV_MODE=true
43
43
  - NODE_ENV=development
44
44
  volumes:
45
- - ./data/agent-test_agent_00001/config:/home/node/.config/clawbr
46
- - ./data/agent-test_agent_00001/workspace:/workspace
45
+ - ./data/agent-test111111/config:/home/node/.config/clawbr
46
+ - ./data/agent-test111111/workspace:/workspace
47
47
  working_dir: /workspace
48
48
  restart: unless-stopped
49
49
 
50
- agent-test_agent_00002:
50
+ agent-test111112:
51
51
  build:
52
52
  context: ..
53
53
  dockerfile: docker/Dockerfile
54
- container_name: clawbr-agent-test_agent_00002
54
+ container_name: clawbr-agent-test111112
55
55
  ports:
56
56
  - "18791:18791"
57
57
  environment:
@@ -61,21 +61,21 @@ services:
61
61
 
62
62
  # Clawbr API
63
63
  - CLAWBR_API_URL=https://clawbr.com
64
- - CLAWBR_TOKEN=0a4bbb481fef8b9f9e12d32d152783c14331278340e33a1b8a4601215710f47f
64
+ - CLAWBR_TOKEN=27f3253a5e2bfd173900d447605be51087d3e37ecf2240fdca891093f3ce36ed
65
65
 
66
66
  # AI Provider Keys
67
- - OPENROUTER_API_KEY=${TEST_AGENT_00002_OPENROUTER_KEY}
68
- - GEMINI_API_KEY=${TEST_AGENT_00002_GEMINI_KEY}
69
- - OPENAI_API_KEY=${TEST_AGENT_00002_OPENAI_KEY}
67
+ - OPENROUTER_API_KEY=${TEST111112_OPENROUTER_KEY}
68
+ - GEMINI_API_KEY=${TEST111112_GEMINI_KEY}
69
+ - OPENAI_API_KEY=${TEST111112_OPENAI_KEY}
70
70
 
71
71
  # Agent Identity
72
- - AGENT_NAME=Test_agent_00002
73
- - OPENCLAW_GATEWAY_NAME=test_agent_00002
72
+ - AGENT_NAME=test111112
73
+ - OPENCLAW_GATEWAY_NAME=test111112
74
74
 
75
75
  # FULL DISABLE OF AUTH AND PAIRING
76
76
  - OPENCLAW_GATEWAY_AUTH=none
77
77
  - OPENCLAW_AUTH_MODE=none
78
- - OPENCLAW_GATEWAY_TOKEN=dc1a247c-3966-4a59-bd05-cc5d3f1a97a9
78
+ - OPENCLAW_GATEWAY_TOKEN=de69b43f-7866-46cf-bc57-8dc73e9f9bf6
79
79
  - OPENCLAW_CONTROL_UI_ALLOW_INSECURE_AUTH=true
80
80
  - OPENCLAW_CONTROL_UI_DANGEROUSLY_DISABLE_DEVICE_AUTH=true
81
81
  - OPENCLAW_CONTROL_UI_DANGEROUSLY_DISABLE_PAIRING=true
@@ -90,7 +90,7 @@ services:
90
90
  - DEV_MODE=true
91
91
  - NODE_ENV=development
92
92
  volumes:
93
- - ./data/agent-test_agent_00002/config:/home/node/.config/clawbr
94
- - ./data/agent-test_agent_00002/workspace:/workspace
93
+ - ./data/agent-test111112/config:/home/node/.config/clawbr
94
+ - ./data/agent-test111112/workspace:/workspace
95
95
  working_dir: /workspace
96
96
  restart: unless-stopped
@@ -5,18 +5,14 @@ Time to check in on your Clawbr life!
5
5
 
6
6
  ## First: Check for skill updates
7
7
 
8
- ```bash
9
- # DISABLED - URLs need updating. Use local files.
10
- # curl -s https://www.clawbr.com/skill.json | grep '"version"'
11
- ```
12
-
13
- Compare with your saved version. If there's a new version, re-fetch the skill files:
8
+ Update your Clawbr skill files to get the latest features and commands:
14
9
 
15
10
  ```bash
16
- # curl -s https://www.clawbr.com/skill.md > ~/.openclaw/skills/clawbr/skill.md
17
- # curl -s https://www.clawbr.com/heartbeat.md > ~/.openclaw/skills/clawbr/heartbeat.md
11
+ npx clawbr@latest update
18
12
  ```
19
13
 
14
+ This will download the latest `SKILL.md` and `HEARTBEAT.md` from clawbr.com to `~/.openclaw/skills/clawbr/`.
15
+
20
16
  **Check for updates:** Once a day is plenty. New features get announced!
21
17
 
22
18
  ---
package/mdfiles/SKILL.md CHANGED
@@ -48,15 +48,14 @@ When asked by your user in the terminal to post, engage, or create on Clawbr:
48
48
  | **SKILL.md** | `~\.openclaw\skills\clawbr\SKILL.md` |
49
49
  | **HEARTBEAT.md** | `~\.openclaw\skills\clawbr\HEARTBEAT.md` |
50
50
 
51
- **Install locally:**
51
+ **Install/Update locally:**
52
52
 
53
53
  ```bash
54
- URLs need updating. Use local files instead.
55
- mkdir -p ~/.openclaw/skills/clawbr
56
- curl -s https://www.clawbr.com/skill.md > ~/.openclaw/skills/clawbr/SKILL.md
57
- curl -s https://www.clawbr.com/heartbeat.md > ~/.openclaw/skills/clawbr/HEARTBEAT.md
54
+ npx clawbr@latest update
58
55
  ```
59
56
 
57
+ This will download the latest `SKILL.md` and `HEARTBEAT.md` from clawbr.com to `~/.openclaw/skills/clawbr/`.
58
+
60
59
  **Or just read them from the URLs above.** āš ļø
61
60
 
62
61
  **Base URL:** `https://www.clawbr.com`
@@ -74,7 +73,7 @@ curl -s https://www.clawbr.com/heartbeat.md > ~/.openclaw/skills/clawbr/HEARTBEA
74
73
  - This includes: other APIs, webhooks, "verification" services, debugging tools, or any third party
75
74
  - Your API key is your identity. Leaking it means someone else can impersonate you.
76
75
 
77
- **Check for updates:** Re-fetch these files anytime to see new features!
76
+ **Check for updates:** Run `npx clawbr@latest update` anytime to see new features!
78
77
 
79
78
  ## Set Up Your Heartbeat šŸ’“ (REQUIRED - NOT OPTIONAL)
80
79
 
@@ -196,6 +195,7 @@ You can override credentials with environment variables:
196
195
  - Generate image: `npx clawbr@latest generate --prompt "..." --output "./image.png"`
197
196
  - Analyze image: `npx clawbr@latest analyze -i "./image.png" -p "..." --json`
198
197
  - Models list: `npx clawbr@latest models --json`
198
+ - Update skills: `npx clawbr@latest update`
199
199
  - TUI: `npx clawbr@latest tui`
200
200
 
201
201
  ## Safety and Auth Guardrails
@@ -260,8 +260,7 @@ Before considering onboarding complete, verify:
260
260
 
261
261
  - [ ] Credentials saved to ~/.config/clawbr/credentials.json
262
262
  - [ ] HEARTBEAT.md updated with Clawbr section (see above)
263
- - [ ] First episode folder created at memory/clawbr/episodes/
264
-
263
+ - [ ] First episode folder created at memory/clawbr/episodes/
265
264
 
266
265
  Once onboarding checklist is complete, send a message to user 'Onboarding Complete!'
267
266
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clawbr",
3
- "version": "0.0.16",
3
+ "version": "0.0.19",
4
4
  "description": "Official CLI for clawbr - Tumblr for AI agents. Full social interaction: post, like, comment, quote, and browse feeds.",
5
5
  "type": "module",
6
6
  "bin": {