nextclaw 0.4.1 → 0.4.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.
Files changed (2) hide show
  1. package/dist/cli/index.js +52 -0
  2. package/package.json +2 -2
package/dist/cli/index.js CHANGED
@@ -38,6 +38,7 @@ import {
38
38
  existsSync as existsSync3,
39
39
  mkdirSync as mkdirSync2,
40
40
  openSync,
41
+ readdirSync,
41
42
  readFileSync as readFileSync3,
42
43
  rmSync as rmSync2,
43
44
  writeFileSync as writeFileSync2
@@ -45,6 +46,7 @@ import {
45
46
  import { dirname, join as join3, resolve as resolve3 } from "path";
46
47
  import { spawn as spawn2, spawnSync as spawnSync2 } from "child_process";
47
48
  import { createInterface } from "readline";
49
+ import { createRequire } from "module";
48
50
  import { fileURLToPath as fileURLToPath3 } from "url";
49
51
  import chokidar from "chokidar";
50
52
 
@@ -1314,8 +1316,58 @@ ${this.logo} ${APP_NAME} is ready! (${source})`);
1314
1316
  mkdirSync2(skillsDir, { recursive: true });
1315
1317
  created.push(join3("skills", ""));
1316
1318
  }
1319
+ const seeded = this.seedBuiltinSkills(skillsDir, { force });
1320
+ if (seeded > 0) {
1321
+ created.push(`skills (seeded ${seeded} built-ins)`);
1322
+ }
1317
1323
  return { created };
1318
1324
  }
1325
+ seedBuiltinSkills(targetDir, options = {}) {
1326
+ const sourceDir = this.resolveBuiltinSkillsDir();
1327
+ if (!sourceDir) {
1328
+ return 0;
1329
+ }
1330
+ const force = Boolean(options.force);
1331
+ const existing = readdirSync(targetDir, { withFileTypes: true }).filter((entry) => !entry.name.startsWith("."));
1332
+ if (!force && existing.length > 0) {
1333
+ return 0;
1334
+ }
1335
+ let seeded = 0;
1336
+ for (const entry of readdirSync(sourceDir, { withFileTypes: true })) {
1337
+ if (!entry.isDirectory()) {
1338
+ continue;
1339
+ }
1340
+ const src = join3(sourceDir, entry.name);
1341
+ if (!existsSync3(join3(src, "SKILL.md"))) {
1342
+ continue;
1343
+ }
1344
+ const dest = join3(targetDir, entry.name);
1345
+ if (!force && existsSync3(dest)) {
1346
+ continue;
1347
+ }
1348
+ cpSync(src, dest, { recursive: true, force: true });
1349
+ seeded += 1;
1350
+ }
1351
+ return seeded;
1352
+ }
1353
+ resolveBuiltinSkillsDir() {
1354
+ try {
1355
+ const require2 = createRequire(import.meta.url);
1356
+ const entry = require2.resolve("nextclaw-core");
1357
+ const pkgRoot = resolve3(dirname(entry), "..");
1358
+ const distSkills = join3(pkgRoot, "dist", "skills");
1359
+ if (existsSync3(distSkills)) {
1360
+ return distSkills;
1361
+ }
1362
+ const srcSkills = join3(pkgRoot, "src", "agent", "skills");
1363
+ if (existsSync3(srcSkills)) {
1364
+ return srcSkills;
1365
+ }
1366
+ return null;
1367
+ } catch {
1368
+ return null;
1369
+ }
1370
+ }
1319
1371
  resolveTemplateDir() {
1320
1372
  const override = process.env.NEXTCLAW_TEMPLATE_DIR?.trim();
1321
1373
  if (override) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nextclaw",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "description": "Lightweight personal AI assistant with CLI, multi-provider routing, and channel integrations.",
5
5
  "private": false,
6
6
  "type": "module",
@@ -38,7 +38,7 @@
38
38
  "dependencies": {
39
39
  "chokidar": "^3.6.0",
40
40
  "commander": "^12.1.0",
41
- "nextclaw-core": "^0.4.1",
41
+ "nextclaw-core": "^0.4.2",
42
42
  "nextclaw-server": "^0.3.2"
43
43
  },
44
44
  "devDependencies": {