towns-bot 0.0.452 → 0.0.455
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/dist/index.js +260 -29
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +256 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -23,7 +23,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
23
23
|
));
|
|
24
24
|
|
|
25
25
|
// src/index.ts
|
|
26
|
-
var
|
|
26
|
+
var import_picocolors5 = require("picocolors");
|
|
27
27
|
|
|
28
28
|
// src/modules/init.ts
|
|
29
29
|
var fs2 = __toESM(require("fs"));
|
|
@@ -267,6 +267,135 @@ async function initializeGitRepository(targetDir) {
|
|
|
267
267
|
return false;
|
|
268
268
|
}
|
|
269
269
|
}
|
|
270
|
+
var TOWNS_SKILL_REPO = "https://github.com/towns-protocol/skills.git";
|
|
271
|
+
var AGENTS_SKILL_FOLDERS = [".claude/skills", ".codex/skills"];
|
|
272
|
+
async function installTownsSkills(projectDir) {
|
|
273
|
+
const tempDir = `${projectDir}-skills-temp`;
|
|
274
|
+
try {
|
|
275
|
+
const cloneResult = import_cross_spawn.default.sync(
|
|
276
|
+
"git",
|
|
277
|
+
["clone", "--depth", "1", "--filter=blob:none", "--sparse", TOWNS_SKILL_REPO, tempDir],
|
|
278
|
+
{ stdio: "pipe" }
|
|
279
|
+
);
|
|
280
|
+
if (cloneResult.status !== 0) {
|
|
281
|
+
if (fs.existsSync(tempDir)) {
|
|
282
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
283
|
+
}
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
const sparseResult = import_cross_spawn.default.sync("git", ["sparse-checkout", "set", "skills"], {
|
|
287
|
+
stdio: "pipe",
|
|
288
|
+
cwd: tempDir
|
|
289
|
+
});
|
|
290
|
+
if (sparseResult.status !== 0) {
|
|
291
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
const checkoutResult = import_cross_spawn.default.sync("git", ["checkout"], {
|
|
295
|
+
stdio: "pipe",
|
|
296
|
+
cwd: tempDir
|
|
297
|
+
});
|
|
298
|
+
if (checkoutResult.status !== 0) {
|
|
299
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
const sourceSkillsDir = path.join(tempDir, "skills");
|
|
303
|
+
if (!fs.existsSync(sourceSkillsDir)) {
|
|
304
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
const skillDirs = fs.readdirSync(sourceSkillsDir, { withFileTypes: true });
|
|
308
|
+
for (const skillFolder of AGENTS_SKILL_FOLDERS) {
|
|
309
|
+
const targetDir = path.join(projectDir, skillFolder);
|
|
310
|
+
if (!fs.existsSync(targetDir)) {
|
|
311
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
312
|
+
}
|
|
313
|
+
for (const skillDir of skillDirs) {
|
|
314
|
+
if (skillDir.isDirectory()) {
|
|
315
|
+
const sourcePath = path.join(sourceSkillsDir, skillDir.name);
|
|
316
|
+
const destPath = path.join(targetDir, skillDir.name);
|
|
317
|
+
fs.cpSync(sourcePath, destPath, { recursive: true });
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
322
|
+
return true;
|
|
323
|
+
} catch (error) {
|
|
324
|
+
console.error(
|
|
325
|
+
import_picocolors.default.red("Error installing skills:"),
|
|
326
|
+
error instanceof Error ? error.message : error
|
|
327
|
+
);
|
|
328
|
+
if (fs.existsSync(tempDir)) {
|
|
329
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
330
|
+
}
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
async function downloadAgentsMd(projectDir) {
|
|
335
|
+
const tempDir = `${projectDir}-agents-md-temp`;
|
|
336
|
+
try {
|
|
337
|
+
const agentsMdPath = "packages/examples/bot-quickstart/AGENTS.md";
|
|
338
|
+
const latestSdkTag = getLatestSdkTag();
|
|
339
|
+
if (!latestSdkTag) {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
const cloneResult = import_cross_spawn.default.sync(
|
|
343
|
+
"git",
|
|
344
|
+
[
|
|
345
|
+
"clone",
|
|
346
|
+
"--no-checkout",
|
|
347
|
+
"--depth",
|
|
348
|
+
"1",
|
|
349
|
+
"--sparse",
|
|
350
|
+
"--branch",
|
|
351
|
+
latestSdkTag,
|
|
352
|
+
"https://github.com/towns-protocol/towns.git",
|
|
353
|
+
tempDir
|
|
354
|
+
],
|
|
355
|
+
{ stdio: "pipe" }
|
|
356
|
+
);
|
|
357
|
+
if (cloneResult.status !== 0) {
|
|
358
|
+
if (fs.existsSync(tempDir)) {
|
|
359
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
360
|
+
}
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
const sparseResult = import_cross_spawn.default.sync("git", ["sparse-checkout", "set", agentsMdPath], {
|
|
364
|
+
stdio: "pipe",
|
|
365
|
+
cwd: tempDir
|
|
366
|
+
});
|
|
367
|
+
if (sparseResult.status !== 0) {
|
|
368
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
369
|
+
return false;
|
|
370
|
+
}
|
|
371
|
+
const checkoutResult = import_cross_spawn.default.sync("git", ["checkout"], {
|
|
372
|
+
stdio: "pipe",
|
|
373
|
+
cwd: tempDir
|
|
374
|
+
});
|
|
375
|
+
if (checkoutResult.status !== 0) {
|
|
376
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
const sourceFile = path.join(tempDir, agentsMdPath);
|
|
380
|
+
if (!fs.existsSync(sourceFile)) {
|
|
381
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
382
|
+
return false;
|
|
383
|
+
}
|
|
384
|
+
const destFile = path.join(projectDir, "AGENTS.md");
|
|
385
|
+
fs.copyFileSync(sourceFile, destFile);
|
|
386
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
387
|
+
return true;
|
|
388
|
+
} catch (error) {
|
|
389
|
+
console.error(
|
|
390
|
+
import_picocolors.default.red("Error downloading AGENTS.md:"),
|
|
391
|
+
error instanceof Error ? error.message : error
|
|
392
|
+
);
|
|
393
|
+
if (fs.existsSync(tempDir)) {
|
|
394
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
395
|
+
}
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
270
399
|
|
|
271
400
|
// src/modules/init.ts
|
|
272
401
|
var TEMPLATES = {
|
|
@@ -334,6 +463,26 @@ async function init(argv) {
|
|
|
334
463
|
modifiedContent = JSON.stringify(parsed, null, 2);
|
|
335
464
|
fs2.writeFileSync(packageJsonPath, modifiedContent);
|
|
336
465
|
}
|
|
466
|
+
console.log((0, import_picocolors2.cyan)("Installing Towns Agent Skills..."));
|
|
467
|
+
try {
|
|
468
|
+
const skillSuccess = await installTownsSkills(targetDir);
|
|
469
|
+
if (skillSuccess) {
|
|
470
|
+
console.log((0, import_picocolors2.green)("\u2713"), "Towns Agent Skills installed successfully!");
|
|
471
|
+
} else {
|
|
472
|
+
console.log(
|
|
473
|
+
(0, import_picocolors2.yellow)("\u26A0"),
|
|
474
|
+
"Failed to install Towns Agent Skills. You can install them later with:"
|
|
475
|
+
);
|
|
476
|
+
console.log((0, import_picocolors2.yellow)(` cd ${projectName} && towns-bot install-skill`));
|
|
477
|
+
}
|
|
478
|
+
} catch (error) {
|
|
479
|
+
console.log(
|
|
480
|
+
(0, import_picocolors2.yellow)("\u26A0"),
|
|
481
|
+
"Error installing skills:",
|
|
482
|
+
error instanceof Error ? error.message : error
|
|
483
|
+
);
|
|
484
|
+
console.log((0, import_picocolors2.yellow)(` You can install them later with: towns-bot install-skill`));
|
|
485
|
+
}
|
|
337
486
|
await initializeGitRepository(targetDir);
|
|
338
487
|
printSuccess(projectName, packageManager);
|
|
339
488
|
} catch (error) {
|
|
@@ -392,25 +541,95 @@ async function update(_argv) {
|
|
|
392
541
|
}
|
|
393
542
|
if (updates.length === 0) {
|
|
394
543
|
console.log((0, import_picocolors3.green)("\u2713"), "All @towns-protocol packages are up to date!");
|
|
395
|
-
|
|
544
|
+
} else {
|
|
545
|
+
console.log();
|
|
546
|
+
for (const update2 of updates) {
|
|
547
|
+
console.log((0, import_picocolors3.green)("\u2713"), `${update2.package} ${update2.from} \u2192 ${update2.to}`);
|
|
548
|
+
}
|
|
549
|
+
console.log();
|
|
550
|
+
console.log((0, import_picocolors3.cyan)(`Installing dependencies with ${packageManager}...`));
|
|
551
|
+
const installCmd = getInstallCommand(packageManager);
|
|
552
|
+
const [installBin, ...installArgs] = installCmd.split(" ");
|
|
553
|
+
await runCommand(installBin, installArgs.length > 0 ? installArgs : []);
|
|
554
|
+
console.log();
|
|
555
|
+
console.log((0, import_picocolors3.green)("\u2713"), "Dependencies updated successfully!");
|
|
556
|
+
}
|
|
557
|
+
const projectDir = process.cwd();
|
|
558
|
+
const claudeSkillsDir = import_path.default.join(projectDir, ".claude", "skills");
|
|
559
|
+
const codexSkillsDir = import_path.default.join(projectDir, ".codex", "skills");
|
|
560
|
+
if (import_fs.default.existsSync(claudeSkillsDir) || import_fs.default.existsSync(codexSkillsDir)) {
|
|
561
|
+
console.log();
|
|
562
|
+
console.log((0, import_picocolors3.cyan)("Updating Towns Agent Skills..."));
|
|
563
|
+
try {
|
|
564
|
+
const skillSuccess = await installTownsSkills(projectDir);
|
|
565
|
+
if (skillSuccess) {
|
|
566
|
+
console.log((0, import_picocolors3.green)("\u2713"), "Towns Agent Skills updated successfully!");
|
|
567
|
+
} else {
|
|
568
|
+
console.log(
|
|
569
|
+
(0, import_picocolors3.yellow)("\u26A0"),
|
|
570
|
+
"Failed to update skills. You can reinstall them with: towns-bot install-skill"
|
|
571
|
+
);
|
|
572
|
+
}
|
|
573
|
+
} catch (error) {
|
|
574
|
+
console.log(
|
|
575
|
+
(0, import_picocolors3.yellow)("\u26A0"),
|
|
576
|
+
"Error updating skills:",
|
|
577
|
+
error instanceof Error ? error.message : error
|
|
578
|
+
);
|
|
579
|
+
}
|
|
396
580
|
}
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
console.log((0, import_picocolors3.
|
|
581
|
+
if (!_argv.skipAgentsMd) {
|
|
582
|
+
console.log();
|
|
583
|
+
console.log((0, import_picocolors3.cyan)("Updating AGENTS.md..."));
|
|
584
|
+
try {
|
|
585
|
+
const agentsMdSuccess = await downloadAgentsMd(projectDir);
|
|
586
|
+
if (agentsMdSuccess) {
|
|
587
|
+
console.log((0, import_picocolors3.green)("\u2713"), "AGENTS.md updated successfully!");
|
|
588
|
+
} else {
|
|
589
|
+
console.log(
|
|
590
|
+
(0, import_picocolors3.yellow)("\u26A0"),
|
|
591
|
+
"Failed to update AGENTS.md. You can update it manually or run update again."
|
|
592
|
+
);
|
|
593
|
+
}
|
|
594
|
+
} catch (error) {
|
|
595
|
+
console.log(
|
|
596
|
+
(0, import_picocolors3.yellow)("\u26A0"),
|
|
597
|
+
"Error updating AGENTS.md:",
|
|
598
|
+
error instanceof Error ? error.message : error
|
|
599
|
+
);
|
|
600
|
+
}
|
|
400
601
|
}
|
|
401
|
-
console.log();
|
|
402
|
-
console.log((0, import_picocolors3.cyan)(`Installing dependencies with ${packageManager}...`));
|
|
403
|
-
const installCmd = getInstallCommand(packageManager);
|
|
404
|
-
const [installBin, ...installArgs] = installCmd.split(" ");
|
|
405
|
-
await runCommand(installBin, installArgs.length > 0 ? installArgs : []);
|
|
406
|
-
console.log();
|
|
407
|
-
console.log((0, import_picocolors3.green)("\u2713"), "Dependencies updated successfully!");
|
|
408
602
|
} catch {
|
|
409
603
|
console.error((0, import_picocolors3.red)("Error:"), "Failed to update dependencies");
|
|
410
604
|
process.exit(1);
|
|
411
605
|
}
|
|
412
606
|
}
|
|
413
607
|
|
|
608
|
+
// src/modules/install-skill.ts
|
|
609
|
+
var import_picocolors4 = require("picocolors");
|
|
610
|
+
async function skill(_argv) {
|
|
611
|
+
const cwd = process.cwd();
|
|
612
|
+
await installSkill(cwd);
|
|
613
|
+
}
|
|
614
|
+
async function installSkill(projectDir) {
|
|
615
|
+
console.log((0, import_picocolors4.cyan)("Installing Towns Agent Skills..."));
|
|
616
|
+
try {
|
|
617
|
+
const success = await installTownsSkills(projectDir);
|
|
618
|
+
if (success) {
|
|
619
|
+
console.log((0, import_picocolors4.green)("\u2713"), "Towns Agent Skills installed successfully!");
|
|
620
|
+
console.log();
|
|
621
|
+
console.log("Skills have been installed to .claude/skills/ and .codex/skills/");
|
|
622
|
+
console.log("They will be available when you open this project in your AI assistant");
|
|
623
|
+
} else {
|
|
624
|
+
console.error((0, import_picocolors4.red)("Failed to install Towns Agent Skills"));
|
|
625
|
+
process.exit(1);
|
|
626
|
+
}
|
|
627
|
+
} catch (error) {
|
|
628
|
+
console.error((0, import_picocolors4.red)("Error:"), error instanceof Error ? error.message : error);
|
|
629
|
+
process.exit(1);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
|
|
414
633
|
// src/parser.ts
|
|
415
634
|
var import_minimist = __toESM(require("minimist"));
|
|
416
635
|
var COMMAND_CONFIGS = {
|
|
@@ -420,8 +639,10 @@ var COMMAND_CONFIGS = {
|
|
|
420
639
|
default: { template: "quickstart" }
|
|
421
640
|
},
|
|
422
641
|
update: {
|
|
423
|
-
|
|
424
|
-
|
|
642
|
+
boolean: ["skipAgentsMd"],
|
|
643
|
+
alias: { "skip-agents-md": "skipAgentsMd" }
|
|
644
|
+
},
|
|
645
|
+
"install-skill": {}
|
|
425
646
|
};
|
|
426
647
|
function parseArgs(args) {
|
|
427
648
|
const initial = (0, import_minimist.default)(args, {
|
|
@@ -451,6 +672,9 @@ function isInitArgs(args) {
|
|
|
451
672
|
function isUpdateArgs(args) {
|
|
452
673
|
return args._[0] === "update";
|
|
453
674
|
}
|
|
675
|
+
function isSkillArgs(args) {
|
|
676
|
+
return args._[0] === "install-skill";
|
|
677
|
+
}
|
|
454
678
|
|
|
455
679
|
// src/index.ts
|
|
456
680
|
async function main() {
|
|
@@ -472,56 +696,63 @@ async function main() {
|
|
|
472
696
|
await update(args);
|
|
473
697
|
}
|
|
474
698
|
break;
|
|
699
|
+
case "install-skill":
|
|
700
|
+
if (isSkillArgs(args)) {
|
|
701
|
+
await skill(args);
|
|
702
|
+
}
|
|
703
|
+
break;
|
|
475
704
|
default:
|
|
476
|
-
console.error((0,
|
|
705
|
+
console.error((0, import_picocolors5.red)(`Unknown command: ${command}`));
|
|
477
706
|
showHelp();
|
|
478
707
|
process.exit(1);
|
|
479
708
|
}
|
|
480
709
|
} catch (error) {
|
|
481
|
-
console.error((0,
|
|
710
|
+
console.error((0, import_picocolors5.red)("Error:"), error instanceof Error ? error.message : error);
|
|
482
711
|
process.exit(1);
|
|
483
712
|
}
|
|
484
713
|
}
|
|
485
714
|
function showHelp() {
|
|
486
715
|
console.log(`
|
|
487
|
-
${(0,
|
|
716
|
+
${(0, import_picocolors5.cyan)("towns-bot")} - CLI for creating and managing Towns Protocol bot projects
|
|
488
717
|
|
|
489
|
-
${(0,
|
|
718
|
+
${(0, import_picocolors5.yellow)("Usage:")}
|
|
490
719
|
towns-bot <command> [options]
|
|
491
720
|
|
|
492
|
-
${(0,
|
|
493
|
-
${(0,
|
|
494
|
-
${(0,
|
|
721
|
+
${(0, import_picocolors5.yellow)("Commands:")}
|
|
722
|
+
${(0, import_picocolors5.green)("init")} [project-name] Create a new bot project
|
|
723
|
+
${(0, import_picocolors5.green)("update")} Update @towns-protocol dependencies and skills
|
|
724
|
+
${(0, import_picocolors5.green)("install-skill")} Install Towns Agent Skills to current project
|
|
495
725
|
|
|
496
|
-
${(0,
|
|
726
|
+
${(0, import_picocolors5.yellow)("Init Options:")}
|
|
497
727
|
-t, --template <name> Template to use:
|
|
498
728
|
${Object.entries(TEMPLATES).map(
|
|
499
729
|
([key, template]) => ` ${key} - ${template.description}`
|
|
500
730
|
).join("\n")}
|
|
501
731
|
Default: quickstart
|
|
502
732
|
|
|
503
|
-
${(0,
|
|
733
|
+
${(0, import_picocolors5.yellow)("List Commands Options:")}
|
|
504
734
|
-f, --file <path> Path to commands file
|
|
505
735
|
|
|
506
|
-
${(0,
|
|
736
|
+
${(0, import_picocolors5.yellow)("Update Commands Options:")}
|
|
507
737
|
-f, --file <path> Path to commands file
|
|
508
738
|
-t, --bearerToken <token> Bearer token for authentication
|
|
509
739
|
-e, --envFile <path> Path to .env file (default: .env)
|
|
740
|
+
--skip-agents-md Skip updating AGENTS.md file
|
|
510
741
|
|
|
511
|
-
${(0,
|
|
742
|
+
${(0, import_picocolors5.yellow)("Global Options:")}
|
|
512
743
|
-h, --help Show this help message
|
|
513
744
|
|
|
514
|
-
${(0,
|
|
515
|
-
${(0,
|
|
745
|
+
${(0, import_picocolors5.yellow)("Examples:")}
|
|
746
|
+
${(0, import_picocolors5.cyan)("# Create a new bot project")}
|
|
516
747
|
towns-bot init my-bot
|
|
517
748
|
towns-bot init my-ai-bot --template quickstart
|
|
518
749
|
|
|
519
|
-
${(0,
|
|
750
|
+
${(0, import_picocolors5.cyan)("# Update dependencies")}
|
|
520
751
|
towns-bot update
|
|
521
752
|
`);
|
|
522
753
|
}
|
|
523
754
|
main().catch((error) => {
|
|
524
|
-
console.error((0,
|
|
755
|
+
console.error((0, import_picocolors5.red)("Unexpected error:"), error);
|
|
525
756
|
process.exit(1);
|
|
526
757
|
});
|
|
527
758
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/modules/init.ts","../src/modules/utils.ts","../src/modules/update.ts","../src/parser.ts"],"sourcesContent":["import { green, red, yellow, cyan } from 'picocolors'\nimport { init, TEMPLATES, type Template } from './modules/init.js'\nimport { update } from './modules/update.js'\nimport { parseArgs, isInitArgs, isUpdateArgs } from './parser.js'\n\nasync function main() {\n const args = parseArgs(process.argv.slice(2))\n const command = args._[0]\n\n if (args.help || !command) {\n showHelp()\n return\n }\n\n try {\n switch (command) {\n case 'init':\n if (isInitArgs(args)) {\n await init(args)\n }\n break\n case 'update':\n if (isUpdateArgs(args)) {\n await update(args)\n }\n break\n default:\n console.error(red(`Unknown command: ${command}`))\n showHelp()\n process.exit(1)\n }\n } catch (error) {\n console.error(red('Error:'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n}\n\nfunction showHelp() {\n console.log(`\n${cyan('towns-bot')} - CLI for creating and managing Towns Protocol bot projects\n\n${yellow('Usage:')}\n towns-bot <command> [options]\n\n${yellow('Commands:')}\n ${green('init')} [project-name] Create a new bot project\n ${green('update')} Update @towns-protocol dependencies to latest versions\n\n${yellow('Init Options:')}\n -t, --template <name> Template to use:\n${Object.entries(TEMPLATES)\n .map(\n ([key, template]: [string, Template]) =>\n ` ${key} - ${template.description}`,\n )\n .join('\\n')}\n Default: quickstart\n\n${yellow('List Commands Options:')}\n -f, --file <path> Path to commands file\n\n${yellow('Update Commands Options:')}\n -f, --file <path> Path to commands file\n -t, --bearerToken <token> Bearer token for authentication\n -e, --envFile <path> Path to .env file (default: .env)\n\n${yellow('Global Options:')}\n -h, --help Show this help message\n\n${yellow('Examples:')}\n ${cyan('# Create a new bot project')}\n towns-bot init my-bot\n towns-bot init my-ai-bot --template quickstart\n\n ${cyan('# Update dependencies')}\n towns-bot update\n`)\n}\n\nmain().catch((error) => {\n console.error(red('Unexpected error:'), error)\n process.exit(1)\n})\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { default as prompts } from 'prompts'\nimport { red, yellow, cyan } from 'picocolors'\nimport * as jsonc from 'jsonc-parser'\nimport {\n getPackageManager,\n getLatestTownsProtocolVersion,\n cloneTemplate,\n applyReplacements,\n printSuccess,\n initializeGitRepository,\n type PackageJson,\n} from './utils.js'\nimport type { InitArgs } from '../parser.js'\n\nexport type Template = (typeof TEMPLATES)[keyof typeof TEMPLATES]\nexport const TEMPLATES = {\n quickstart: {\n name: 'Bot Quickstart',\n description: 'Simple starter bot with basic commands',\n packagePath: 'bot-quickstart',\n },\n} as const\n\nexport async function init(argv: InitArgs) {\n const projectName = argv._[1]\n const template = argv.template || 'quickstart'\n\n if (!projectName) {\n console.error(red('Error: Please provide a project name'))\n console.log(yellow('Usage: towns-bot init <project-name>'))\n process.exit(1)\n }\n\n if (!TEMPLATES[template as keyof typeof TEMPLATES]) {\n console.error(red(`Error: Unknown template \"${template}\"`))\n console.log(yellow('Available templates:'), Object.keys(TEMPLATES).join(', '))\n process.exit(1)\n }\n\n const targetDir = path.resolve(process.cwd(), projectName)\n\n if (fs.existsSync(targetDir)) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `Directory ${projectName} already exists. Overwrite?`,\n initial: false,\n })\n\n if (!overwrite) {\n console.log(yellow('Operation cancelled'))\n process.exit(0)\n }\n\n fs.rmSync(targetDir, { recursive: true, force: true })\n }\n\n console.log(cyan(`Creating a new Towns Protocol bot in ${targetDir}`))\n if (template !== 'quickstart') {\n console.log(cyan(`Using template: ${TEMPLATES[template as keyof typeof TEMPLATES].name}`))\n }\n\n const packageManager = getPackageManager()\n const selectedTemplate = TEMPLATES[template as keyof typeof TEMPLATES]\n\n try {\n // Clone template from GitHub\n const success = await cloneTemplate(selectedTemplate.packagePath, targetDir)\n if (!success) {\n console.error(red('Failed to clone template'))\n process.exit(1)\n }\n const latestVersion = await getLatestTownsProtocolVersion()\n // Replace workspace dependencies in package.json and other files\n const replacements = new Map([\n ['workspace:\\\\^', `^${latestVersion}`],\n ['workspace:\\\\*', `^${latestVersion}`],\n ])\n\n // Apply replacements to all relevant files\n applyReplacements(targetDir, replacements)\n\n const packageJsonPath = path.join(targetDir, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n const content = fs.readFileSync(packageJsonPath, 'utf-8')\n const edits = [\n jsonc.modify(content, ['name'], projectName, {}),\n jsonc.modify(content, ['version'], '0.0.1', {}),\n ]\n\n let modifiedContent = jsonc.applyEdits(content, edits.flat())\n\n const parsed = jsonc.parse(modifiedContent) as PackageJson\n delete parsed.private\n\n modifiedContent = JSON.stringify(parsed, null, 2)\n fs.writeFileSync(packageJsonPath, modifiedContent)\n }\n await initializeGitRepository(targetDir)\n printSuccess(projectName, packageManager)\n } catch (error) {\n console.error(red('Error:'), error instanceof Error ? error.message : error)\n console.error(red(`Please delete the directory ${targetDir} and try again.`))\n process.exit(1)\n }\n}\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { default as spawn } from 'cross-spawn'\nimport picocolors from 'picocolors'\n\nexport type PackageJson = {\n private?: boolean\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n}\n\nexport const getPackageManager = () => {\n if (process.env.npm_config_user_agent) {\n const agent = process.env.npm_config_user_agent\n if (agent.startsWith('yarn')) return 'yarn'\n if (agent.startsWith('npm')) return 'npm'\n if (agent.startsWith('pnpm')) return 'pnpm'\n if (agent.startsWith('bun')) return 'bun'\n }\n // Default to npm if no user agent is found\n return 'npm'\n}\n\nexport function getInstallCommand(packageManager: string): string {\n switch (packageManager) {\n case 'bun':\n return 'bun install'\n case 'yarn':\n return 'yarn'\n case 'pnpm':\n return 'pnpm install'\n default:\n return 'npm install'\n }\n}\n\nexport function getRunCommand(packageManager: string, script: string): string {\n switch (packageManager) {\n case 'bun':\n return `bun run ${script}`\n case 'yarn':\n return `yarn ${script}`\n case 'pnpm':\n return `pnpm ${script}`\n default:\n return `npm run ${script}`\n }\n}\n\nexport function getDlxCommand(packageManager: string): string {\n switch (packageManager) {\n case 'bun':\n return 'bunx'\n case 'yarn':\n return 'yarn dlx'\n case 'pnpm':\n return 'pnpm dlx'\n default:\n return 'npx'\n }\n}\n\nexport function runCommand(\n command: string,\n args: string[],\n opts: { cwd?: string; silent?: boolean } = { cwd: undefined, silent: false },\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: opts.silent ? 'ignore' : 'inherit',\n cwd: opts.cwd,\n shell: process.platform === 'win32',\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`Command failed with exit code ${code}`))\n } else {\n resolve()\n }\n })\n\n child.on('error', reject)\n })\n}\n\nexport function runCommandWithOutput(\n command: string,\n args: string[],\n opts: { cwd?: string } = {},\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd: opts.cwd,\n shell: process.platform === 'win32',\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString()\n })\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString()\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(stderr || `Command failed with exit code ${code}`))\n } else {\n resolve(stdout)\n }\n })\n\n child.on('error', reject)\n })\n}\n\nexport async function getLatestTownsProtocolVersion(): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn('npm', ['view', '@towns-protocol/bot', 'version'], {\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n\n let output = ''\n child.stdout?.on('data', (data) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n output += data.toString()\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error('Failed to fetch latest @towns-protocol/bot version'))\n } else {\n resolve(output.trim())\n }\n })\n\n child.on('error', reject)\n })\n}\n\nexport function copyDirectory(src: string, dest: string, replacements?: Map<string, string>) {\n if (!fs.existsSync(dest)) {\n fs.mkdirSync(dest, { recursive: true })\n }\n\n const entries = fs.readdirSync(src, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n\n if (entry.isDirectory()) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {\n continue\n }\n copyDirectory(srcPath, destPath, replacements)\n } else {\n let content = fs.readFileSync(srcPath, 'utf-8')\n\n if (\n replacements &&\n (entry.name === 'package.json' ||\n entry.name.endsWith('.ts') ||\n entry.name.endsWith('.js'))\n ) {\n for (const [search, replace] of replacements) {\n content = content.replace(new RegExp(search, 'g'), replace)\n }\n }\n\n fs.writeFileSync(destPath, content)\n }\n }\n}\n\nexport function getLatestSdkTag(): string | null {\n const tagsResult = spawn.sync(\n 'git',\n ['ls-remote', '--tags', 'https://github.com/towns-protocol/towns.git', 'sdk-*'],\n { encoding: 'utf8' },\n )\n\n if (tagsResult.status !== 0 || !tagsResult.stdout) return null\n\n const tags = tagsResult.stdout\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [_hash, ref] = line.split('\\t')\n const tag = ref.replace('refs/tags/', '').replace(/\\^{}$/, '')\n\n // Extract version numbers from tags like sdk-hash-1.2.3\n const match = tag.match(/^sdk-[0-9a-f]+-(\\d+)\\.(\\d+)\\.(\\d+)$/)\n if (!match) return null\n\n return {\n tag,\n version: [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])],\n }\n })\n .filter(\n (item): item is { tag: string; version: number[] } =>\n item !== null && Array.isArray(item.version) && item.version.length === 3,\n )\n .sort((a, b) => {\n // Compare version numbers\n for (let i = 0; i < 3; i++) {\n if (a.version[i] !== b.version[i]) {\n return b.version[i] - a.version[i]\n }\n }\n return 0\n })\n\n return tags.length > 0 ? tags[0].tag : null\n}\n\nexport async function cloneTemplate(packagePath: string, targetDir: string): Promise<boolean> {\n console.log(picocolors.blue('Cloning template from GitHub...'))\n\n const tempDir = `${targetDir}-temp`\n const fullTemplatePath = `packages/examples/${packagePath}`\n\n // Get latest SDK tag\n const latestSdkTag = getLatestSdkTag()\n if (!latestSdkTag) {\n console.error(picocolors.red('Failed to get latest SDK tag.'))\n return false\n }\n\n // Clone with minimal data to a temporary directory\n const cloneResult = spawn.sync(\n 'git',\n [\n 'clone',\n '--no-checkout',\n '--depth',\n '1',\n '--sparse',\n '--branch',\n latestSdkTag,\n 'https://github.com/towns-protocol/towns.git',\n tempDir,\n ],\n { stdio: 'pipe' },\n )\n if (cloneResult.status !== 0) return false\n\n // Set up sparse checkout for the specific template\n const sparseResult = spawn.sync('git', ['sparse-checkout', 'set', fullTemplatePath], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (sparseResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n // Checkout the content\n const checkoutResult = spawn.sync('git', ['checkout'], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (checkoutResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n // Verify template directory exists\n const sourceDir = path.join(tempDir, fullTemplatePath)\n if (!fs.existsSync(sourceDir)) {\n console.error(picocolors.red(`\\nTemplate directory not found at ${sourceDir}`))\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n // Copy template contents to target directory\n fs.mkdirSync(targetDir, { recursive: true })\n // Use filter to ensure all files (including hidden) are copied\n fs.cpSync(sourceDir, targetDir, {\n recursive: true,\n filter: () => {\n // Copy all files, including hidden ones\n return true\n },\n })\n\n // Clean up temporary directory\n fs.rmSync(tempDir, { recursive: true, force: true })\n\n console.log(picocolors.green('✓'), 'Template cloned successfully!')\n return true\n}\n\nexport function applyReplacements(targetDir: string, replacements: Map<string, string>) {\n function processDirectory(dir: string) {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {\n continue\n }\n processDirectory(fullPath)\n } else {\n let content = fs.readFileSync(fullPath, 'utf-8')\n let modified = false\n\n if (\n entry.name === 'package.json' ||\n entry.name.endsWith('.ts') ||\n entry.name.endsWith('.js')\n ) {\n for (const [search, replace] of replacements) {\n const regex = new RegExp(search, 'g')\n if (regex.test(content)) {\n content = content.replace(regex, replace)\n modified = true\n }\n }\n\n if (modified) {\n fs.writeFileSync(fullPath, content)\n }\n }\n }\n }\n }\n\n processDirectory(targetDir)\n}\n\nexport function printSuccess(projectName: string, packageManager: string) {\n console.log(picocolors.green('✓'), 'Bot project created successfully!')\n console.log()\n console.log('Next steps:')\n console.log(picocolors.cyan(` cd ${projectName}`))\n console.log(picocolors.cyan(` ${getInstallCommand(packageManager)}`))\n console.log('Set up your environment variables:')\n console.log(picocolors.cyan(' cp .env.sample .env'))\n console.log(' Edit .env with your bot credentials')\n console.log('Start your bot:')\n console.log(picocolors.cyan(` ${getRunCommand(packageManager, 'dev')}`))\n}\n\nexport async function initializeGitRepository(targetDir: string): Promise<boolean> {\n try {\n await runCommand('git', ['init'], { cwd: targetDir, silent: true })\n await runCommand('git', ['add', '.'], { cwd: targetDir, silent: true })\n await runCommand('git', ['commit', '-m', 'feat: towns bot scaffolding'], {\n cwd: targetDir,\n silent: true,\n })\n return true\n } catch (error) {\n console.log(\n picocolors.yellow('⚠'),\n 'Failed to initialize git repository:',\n error instanceof Error ? error.message : 'Unknown error',\n )\n console.log(picocolors.yellow(' You can manually initialize git later with: git init'))\n return false\n }\n}\n","import fs from 'fs'\nimport path from 'path'\nimport { green, red, yellow, cyan } from 'picocolors'\nimport { getPackageManager, getInstallCommand, getDlxCommand, runCommand } from './utils.js'\nimport type { UpdateArgs } from '../parser.js'\n\ninterface PackageJson {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n}\n\ninterface VersionUpdate {\n package: string\n from: string\n to: string\n}\n\nfunction getTownsVersions(packageJson: PackageJson): Record<string, string> {\n const versions: Record<string, string> = {}\n for (const deps of [packageJson.dependencies, packageJson.devDependencies]) {\n if (deps) {\n for (const [pkg, version] of Object.entries(deps)) {\n if (pkg.startsWith('@towns-protocol/')) {\n versions[pkg] = version\n }\n }\n }\n }\n return versions\n}\n\nexport async function update(_argv: UpdateArgs) {\n const packageJsonPath = path.join(process.cwd(), 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n console.error(red('Error: No package.json found in the current directory'))\n console.log(yellow('Please run this command from a Towns Protocol bot project directory'))\n process.exit(1)\n }\n\n const packageManager = getPackageManager()\n const dlxCommand = getDlxCommand(packageManager)\n\n console.log(cyan('Checking for @towns-protocol updates...'))\n\n try {\n const [dlxBin, ...dlxArgs] = dlxCommand.split(' ')\n\n const packageJsonBefore: PackageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n const versionsBefore = getTownsVersions(packageJsonBefore)\n\n await runCommand(\n dlxBin,\n [...dlxArgs, 'npm-check-updates', '-u', '-f', '@towns-protocol/*'],\n {\n silent: true,\n },\n )\n\n const packageJsonAfter: PackageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n const versionsAfter = getTownsVersions(packageJsonAfter)\n\n const updates: VersionUpdate[] = []\n for (const [pkg, newVersion] of Object.entries(versionsAfter)) {\n const oldVersion = versionsBefore[pkg]\n if (oldVersion && oldVersion !== newVersion) {\n updates.push({ package: pkg, from: oldVersion, to: newVersion })\n }\n }\n\n if (updates.length === 0) {\n console.log(green('✓'), 'All @towns-protocol packages are up to date!')\n return\n }\n\n console.log()\n for (const update of updates) {\n console.log(green('✓'), `${update.package} ${update.from} → ${update.to}`)\n }\n\n console.log()\n console.log(cyan(`Installing dependencies with ${packageManager}...`))\n const installCmd = getInstallCommand(packageManager)\n const [installBin, ...installArgs] = installCmd.split(' ')\n await runCommand(installBin, installArgs.length > 0 ? installArgs : [])\n\n console.log()\n console.log(green('✓'), 'Dependencies updated successfully!')\n } catch {\n console.error(red('Error:'), 'Failed to update dependencies')\n process.exit(1)\n }\n}\n","import minimist from 'minimist'\n\n// Command-specific argument interfaces\nexport interface BaseArgs {\n _: string[]\n help?: boolean\n}\n\nexport interface InitArgs extends BaseArgs {\n template?: string\n}\n\nexport type UpdateArgs = BaseArgs\n\nexport type CommandArgs = InitArgs | UpdateArgs\n\n// Command configurations for minimist\nconst COMMAND_CONFIGS: Record<string, minimist.Opts> = {\n init: {\n string: ['template'],\n alias: { t: 'template' },\n default: { template: 'quickstart' },\n },\n update: {\n // No special config needed\n },\n}\n\n/**\n * Parse command line arguments with command-specific configurations\n *\n * This function does a two-pass parse:\n * 1. First parse to identify the command\n * 2. Second parse with command-specific configuration\n *\n * This allows each command to have its own argument parsing rules,\n * preventing issues like hex addresses being converted to numbers.\n */\nexport function parseArgs(args: string[]): CommandArgs {\n // First, do a minimal parse to get the command\n const initial = minimist(args, {\n stopEarly: true,\n boolean: ['help'],\n alias: { h: 'help' },\n })\n\n const command = initial._[0]\n\n // If no command or help requested, return early\n if (!command || initial.help) {\n return initial as BaseArgs\n }\n\n // Get command-specific configuration\n const commandConfig = COMMAND_CONFIGS[command] || {}\n\n // Re-parse with command-specific configuration\n const booleanOptions = Array.isArray(commandConfig.boolean)\n ? ['help', ...commandConfig.boolean]\n : ['help']\n const parsed = minimist(args, {\n ...commandConfig,\n boolean: booleanOptions,\n alias: {\n ...commandConfig.alias,\n h: 'help',\n },\n })\n\n return parsed as CommandArgs\n}\n\n/**\n * Type guard functions for command-specific args\n */\nexport function isInitArgs(args: CommandArgs): args is InitArgs {\n return args._[0] === 'init'\n}\n\nexport function isUpdateArgs(args: CommandArgs): args is UpdateArgs {\n return args._[0] === 'update'\n}\n"],"mappings":"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","names":["import_picocolors","fs","path","import_picocolors","resolve","spawn","resolve","spawn","spawn","picocolors","prompts","import_picocolors","path","fs","update","minimist"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/modules/init.ts","../src/modules/utils.ts","../src/modules/update.ts","../src/modules/install-skill.ts","../src/parser.ts"],"sourcesContent":["import { green, red, yellow, cyan } from 'picocolors'\nimport { init, TEMPLATES, type Template } from './modules/init.js'\nimport { update } from './modules/update.js'\nimport { skill } from './modules/install-skill.js'\nimport { parseArgs, isInitArgs, isUpdateArgs, isSkillArgs } from './parser.js'\n\nasync function main() {\n const args = parseArgs(process.argv.slice(2))\n const command = args._[0]\n\n if (args.help || !command) {\n showHelp()\n return\n }\n\n try {\n switch (command) {\n case 'init':\n if (isInitArgs(args)) {\n await init(args)\n }\n break\n case 'update':\n if (isUpdateArgs(args)) {\n await update(args)\n }\n break\n case 'install-skill':\n if (isSkillArgs(args)) {\n await skill(args)\n }\n break\n default:\n console.error(red(`Unknown command: ${command}`))\n showHelp()\n process.exit(1)\n }\n } catch (error) {\n console.error(red('Error:'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n}\n\nfunction showHelp() {\n console.log(`\n${cyan('towns-bot')} - CLI for creating and managing Towns Protocol bot projects\n\n${yellow('Usage:')}\n towns-bot <command> [options]\n\n${yellow('Commands:')}\n ${green('init')} [project-name] Create a new bot project\n ${green('update')} Update @towns-protocol dependencies and skills\n ${green('install-skill')} Install Towns Agent Skills to current project\n\n${yellow('Init Options:')}\n -t, --template <name> Template to use:\n${Object.entries(TEMPLATES)\n .map(\n ([key, template]: [string, Template]) =>\n ` ${key} - ${template.description}`,\n )\n .join('\\n')}\n Default: quickstart\n\n${yellow('List Commands Options:')}\n -f, --file <path> Path to commands file\n\n${yellow('Update Commands Options:')}\n -f, --file <path> Path to commands file\n -t, --bearerToken <token> Bearer token for authentication\n -e, --envFile <path> Path to .env file (default: .env)\n --skip-agents-md Skip updating AGENTS.md file\n\n${yellow('Global Options:')}\n -h, --help Show this help message\n\n${yellow('Examples:')}\n ${cyan('# Create a new bot project')}\n towns-bot init my-bot\n towns-bot init my-ai-bot --template quickstart\n\n ${cyan('# Update dependencies')}\n towns-bot update\n`)\n}\n\nmain().catch((error) => {\n console.error(red('Unexpected error:'), error)\n process.exit(1)\n})\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { default as prompts } from 'prompts'\nimport { red, yellow, cyan, green } from 'picocolors'\nimport * as jsonc from 'jsonc-parser'\nimport {\n getPackageManager,\n getLatestTownsProtocolVersion,\n cloneTemplate,\n applyReplacements,\n printSuccess,\n initializeGitRepository,\n installTownsSkills,\n type PackageJson,\n} from './utils.js'\nimport type { InitArgs } from '../parser.js'\n\nexport type Template = (typeof TEMPLATES)[keyof typeof TEMPLATES]\nexport const TEMPLATES = {\n quickstart: {\n name: 'Bot Quickstart',\n description: 'Simple starter bot with basic commands',\n packagePath: 'bot-quickstart',\n },\n} as const\n\nexport async function init(argv: InitArgs) {\n const projectName = argv._[1]\n const template = argv.template || 'quickstart'\n\n if (!projectName) {\n console.error(red('Error: Please provide a project name'))\n console.log(yellow('Usage: towns-bot init <project-name>'))\n process.exit(1)\n }\n\n if (!TEMPLATES[template as keyof typeof TEMPLATES]) {\n console.error(red(`Error: Unknown template \"${template}\"`))\n console.log(yellow('Available templates:'), Object.keys(TEMPLATES).join(', '))\n process.exit(1)\n }\n\n const targetDir = path.resolve(process.cwd(), projectName)\n\n if (fs.existsSync(targetDir)) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `Directory ${projectName} already exists. Overwrite?`,\n initial: false,\n })\n\n if (!overwrite) {\n console.log(yellow('Operation cancelled'))\n process.exit(0)\n }\n\n fs.rmSync(targetDir, { recursive: true, force: true })\n }\n\n console.log(cyan(`Creating a new Towns Protocol bot in ${targetDir}`))\n if (template !== 'quickstart') {\n console.log(cyan(`Using template: ${TEMPLATES[template as keyof typeof TEMPLATES].name}`))\n }\n\n const packageManager = getPackageManager()\n const selectedTemplate = TEMPLATES[template as keyof typeof TEMPLATES]\n\n try {\n // Clone template from GitHub\n const success = await cloneTemplate(selectedTemplate.packagePath, targetDir)\n if (!success) {\n console.error(red('Failed to clone template'))\n process.exit(1)\n }\n const latestVersion = await getLatestTownsProtocolVersion()\n // Replace workspace dependencies in package.json and other files\n const replacements = new Map([\n ['workspace:\\\\^', `^${latestVersion}`],\n ['workspace:\\\\*', `^${latestVersion}`],\n ])\n\n // Apply replacements to all relevant files\n applyReplacements(targetDir, replacements)\n\n const packageJsonPath = path.join(targetDir, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n const content = fs.readFileSync(packageJsonPath, 'utf-8')\n const edits = [\n jsonc.modify(content, ['name'], projectName, {}),\n jsonc.modify(content, ['version'], '0.0.1', {}),\n ]\n\n let modifiedContent = jsonc.applyEdits(content, edits.flat())\n\n const parsed = jsonc.parse(modifiedContent) as PackageJson\n delete parsed.private\n\n modifiedContent = JSON.stringify(parsed, null, 2)\n fs.writeFileSync(packageJsonPath, modifiedContent)\n }\n\n // Install skills\n console.log(cyan('Installing Towns Agent Skills...'))\n try {\n const skillSuccess = await installTownsSkills(targetDir)\n if (skillSuccess) {\n console.log(green('✓'), 'Towns Agent Skills installed successfully!')\n } else {\n console.log(\n yellow('⚠'),\n 'Failed to install Towns Agent Skills. You can install them later with:',\n )\n console.log(yellow(` cd ${projectName} && towns-bot install-skill`))\n }\n } catch (error) {\n console.log(\n yellow('⚠'),\n 'Error installing skills:',\n error instanceof Error ? error.message : error,\n )\n console.log(yellow(` You can install them later with: towns-bot install-skill`))\n }\n\n await initializeGitRepository(targetDir)\n printSuccess(projectName, packageManager)\n } catch (error) {\n console.error(red('Error:'), error instanceof Error ? error.message : error)\n console.error(red(`Please delete the directory ${targetDir} and try again.`))\n process.exit(1)\n }\n}\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { default as spawn } from 'cross-spawn'\nimport picocolors from 'picocolors'\n\nexport type PackageJson = {\n private?: boolean\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n}\n\nexport const getPackageManager = () => {\n if (process.env.npm_config_user_agent) {\n const agent = process.env.npm_config_user_agent\n if (agent.startsWith('yarn')) return 'yarn'\n if (agent.startsWith('npm')) return 'npm'\n if (agent.startsWith('pnpm')) return 'pnpm'\n if (agent.startsWith('bun')) return 'bun'\n }\n // Default to npm if no user agent is found\n return 'npm'\n}\n\nexport function getInstallCommand(packageManager: string): string {\n switch (packageManager) {\n case 'bun':\n return 'bun install'\n case 'yarn':\n return 'yarn'\n case 'pnpm':\n return 'pnpm install'\n default:\n return 'npm install'\n }\n}\n\nexport function getRunCommand(packageManager: string, script: string): string {\n switch (packageManager) {\n case 'bun':\n return `bun run ${script}`\n case 'yarn':\n return `yarn ${script}`\n case 'pnpm':\n return `pnpm ${script}`\n default:\n return `npm run ${script}`\n }\n}\n\nexport function getDlxCommand(packageManager: string): string {\n switch (packageManager) {\n case 'bun':\n return 'bunx'\n case 'yarn':\n return 'yarn dlx'\n case 'pnpm':\n return 'pnpm dlx'\n default:\n return 'npx'\n }\n}\n\nexport function runCommand(\n command: string,\n args: string[],\n opts: { cwd?: string; silent?: boolean } = { cwd: undefined, silent: false },\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: opts.silent ? 'ignore' : 'inherit',\n cwd: opts.cwd,\n shell: process.platform === 'win32',\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`Command failed with exit code ${code}`))\n } else {\n resolve()\n }\n })\n\n child.on('error', reject)\n })\n}\n\nexport function runCommandWithOutput(\n command: string,\n args: string[],\n opts: { cwd?: string } = {},\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd: opts.cwd,\n shell: process.platform === 'win32',\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString()\n })\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString()\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(stderr || `Command failed with exit code ${code}`))\n } else {\n resolve(stdout)\n }\n })\n\n child.on('error', reject)\n })\n}\n\nexport async function getLatestTownsProtocolVersion(): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn('npm', ['view', '@towns-protocol/bot', 'version'], {\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n\n let output = ''\n child.stdout?.on('data', (data) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n output += data.toString()\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error('Failed to fetch latest @towns-protocol/bot version'))\n } else {\n resolve(output.trim())\n }\n })\n\n child.on('error', reject)\n })\n}\n\nexport function copyDirectory(src: string, dest: string, replacements?: Map<string, string>) {\n if (!fs.existsSync(dest)) {\n fs.mkdirSync(dest, { recursive: true })\n }\n\n const entries = fs.readdirSync(src, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n\n if (entry.isDirectory()) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {\n continue\n }\n copyDirectory(srcPath, destPath, replacements)\n } else {\n let content = fs.readFileSync(srcPath, 'utf-8')\n\n if (\n replacements &&\n (entry.name === 'package.json' ||\n entry.name.endsWith('.ts') ||\n entry.name.endsWith('.js'))\n ) {\n for (const [search, replace] of replacements) {\n content = content.replace(new RegExp(search, 'g'), replace)\n }\n }\n\n fs.writeFileSync(destPath, content)\n }\n }\n}\n\nexport function getLatestSdkTag(): string | null {\n const tagsResult = spawn.sync(\n 'git',\n ['ls-remote', '--tags', 'https://github.com/towns-protocol/towns.git', 'sdk-*'],\n { encoding: 'utf8' },\n )\n\n if (tagsResult.status !== 0 || !tagsResult.stdout) return null\n\n const tags = tagsResult.stdout\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [_hash, ref] = line.split('\\t')\n const tag = ref.replace('refs/tags/', '').replace(/\\^{}$/, '')\n\n // Extract version numbers from tags like sdk-hash-1.2.3\n const match = tag.match(/^sdk-[0-9a-f]+-(\\d+)\\.(\\d+)\\.(\\d+)$/)\n if (!match) return null\n\n return {\n tag,\n version: [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])],\n }\n })\n .filter(\n (item): item is { tag: string; version: number[] } =>\n item !== null && Array.isArray(item.version) && item.version.length === 3,\n )\n .sort((a, b) => {\n // Compare version numbers\n for (let i = 0; i < 3; i++) {\n if (a.version[i] !== b.version[i]) {\n return b.version[i] - a.version[i]\n }\n }\n return 0\n })\n\n return tags.length > 0 ? tags[0].tag : null\n}\n\nexport async function cloneTemplate(packagePath: string, targetDir: string): Promise<boolean> {\n console.log(picocolors.blue('Cloning template from GitHub...'))\n\n const tempDir = `${targetDir}-temp`\n const fullTemplatePath = `packages/examples/${packagePath}`\n\n // Get latest SDK tag\n const latestSdkTag = getLatestSdkTag()\n if (!latestSdkTag) {\n console.error(picocolors.red('Failed to get latest SDK tag.'))\n return false\n }\n\n // Clone with minimal data to a temporary directory\n const cloneResult = spawn.sync(\n 'git',\n [\n 'clone',\n '--no-checkout',\n '--depth',\n '1',\n '--sparse',\n '--branch',\n latestSdkTag,\n 'https://github.com/towns-protocol/towns.git',\n tempDir,\n ],\n { stdio: 'pipe' },\n )\n if (cloneResult.status !== 0) return false\n\n // Set up sparse checkout for the specific template\n const sparseResult = spawn.sync('git', ['sparse-checkout', 'set', fullTemplatePath], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (sparseResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n // Checkout the content\n const checkoutResult = spawn.sync('git', ['checkout'], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (checkoutResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n // Verify template directory exists\n const sourceDir = path.join(tempDir, fullTemplatePath)\n if (!fs.existsSync(sourceDir)) {\n console.error(picocolors.red(`\\nTemplate directory not found at ${sourceDir}`))\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n // Copy template contents to target directory\n fs.mkdirSync(targetDir, { recursive: true })\n // Use filter to ensure all files (including hidden) are copied\n fs.cpSync(sourceDir, targetDir, {\n recursive: true,\n filter: () => {\n // Copy all files, including hidden ones\n return true\n },\n })\n\n // Clean up temporary directory\n fs.rmSync(tempDir, { recursive: true, force: true })\n\n console.log(picocolors.green('✓'), 'Template cloned successfully!')\n return true\n}\n\nexport function applyReplacements(targetDir: string, replacements: Map<string, string>) {\n function processDirectory(dir: string) {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {\n continue\n }\n processDirectory(fullPath)\n } else {\n let content = fs.readFileSync(fullPath, 'utf-8')\n let modified = false\n\n if (\n entry.name === 'package.json' ||\n entry.name.endsWith('.ts') ||\n entry.name.endsWith('.js')\n ) {\n for (const [search, replace] of replacements) {\n const regex = new RegExp(search, 'g')\n if (regex.test(content)) {\n content = content.replace(regex, replace)\n modified = true\n }\n }\n\n if (modified) {\n fs.writeFileSync(fullPath, content)\n }\n }\n }\n }\n }\n\n processDirectory(targetDir)\n}\n\nexport function printSuccess(projectName: string, packageManager: string) {\n console.log(picocolors.green('✓'), 'Bot project created successfully!')\n console.log()\n console.log('Next steps:')\n console.log(picocolors.cyan(` cd ${projectName}`))\n console.log(picocolors.cyan(` ${getInstallCommand(packageManager)}`))\n console.log('Set up your environment variables:')\n console.log(picocolors.cyan(' cp .env.sample .env'))\n console.log(' Edit .env with your bot credentials')\n console.log('Start your bot:')\n console.log(picocolors.cyan(` ${getRunCommand(packageManager, 'dev')}`))\n}\n\nexport async function initializeGitRepository(targetDir: string): Promise<boolean> {\n try {\n await runCommand('git', ['init'], { cwd: targetDir, silent: true })\n await runCommand('git', ['add', '.'], { cwd: targetDir, silent: true })\n await runCommand('git', ['commit', '-m', 'feat: towns bot scaffolding'], {\n cwd: targetDir,\n silent: true,\n })\n return true\n } catch (error) {\n console.log(\n picocolors.yellow('⚠'),\n 'Failed to initialize git repository:',\n error instanceof Error ? error.message : 'Unknown error',\n )\n console.log(picocolors.yellow(' You can manually initialize git later with: git init'))\n return false\n }\n}\n\nconst TOWNS_SKILL_REPO = 'https://github.com/towns-protocol/skills.git'\nconst AGENTS_SKILL_FOLDERS = ['.claude/skills', '.codex/skills']\n\nexport async function installTownsSkills(projectDir: string): Promise<boolean> {\n const tempDir = `${projectDir}-skills-temp`\n try {\n const cloneResult = spawn.sync(\n 'git',\n ['clone', '--depth', '1', '--filter=blob:none', '--sparse', TOWNS_SKILL_REPO, tempDir],\n { stdio: 'pipe' },\n )\n\n if (cloneResult.status !== 0) {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n }\n return false\n }\n const sparseResult = spawn.sync('git', ['sparse-checkout', 'set', 'skills'], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (sparseResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n const checkoutResult = spawn.sync('git', ['checkout'], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (checkoutResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n const sourceSkillsDir = path.join(tempDir, 'skills')\n if (!fs.existsSync(sourceSkillsDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n const skillDirs = fs.readdirSync(sourceSkillsDir, { withFileTypes: true })\n for (const skillFolder of AGENTS_SKILL_FOLDERS) {\n const targetDir = path.join(projectDir, skillFolder)\n\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true })\n }\n\n for (const skillDir of skillDirs) {\n if (skillDir.isDirectory()) {\n const sourcePath = path.join(sourceSkillsDir, skillDir.name)\n const destPath = path.join(targetDir, skillDir.name)\n\n fs.cpSync(sourcePath, destPath, { recursive: true })\n }\n }\n }\n\n fs.rmSync(tempDir, { recursive: true, force: true })\n return true\n } catch (error) {\n console.error(\n picocolors.red('Error installing skills:'),\n error instanceof Error ? error.message : error,\n )\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n }\n return false\n }\n}\n\nexport async function downloadAgentsMd(projectDir: string): Promise<boolean> {\n const tempDir = `${projectDir}-agents-md-temp`\n try {\n const agentsMdPath = 'packages/examples/bot-quickstart/AGENTS.md'\n const latestSdkTag = getLatestSdkTag()\n if (!latestSdkTag) {\n return false\n }\n const cloneResult = spawn.sync(\n 'git',\n [\n 'clone',\n '--no-checkout',\n '--depth',\n '1',\n '--sparse',\n '--branch',\n latestSdkTag,\n 'https://github.com/towns-protocol/towns.git',\n tempDir,\n ],\n { stdio: 'pipe' },\n )\n if (cloneResult.status !== 0) {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n }\n return false\n }\n const sparseResult = spawn.sync('git', ['sparse-checkout', 'set', agentsMdPath], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (sparseResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n const checkoutResult = spawn.sync('git', ['checkout'], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (checkoutResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n const sourceFile = path.join(tempDir, agentsMdPath)\n if (!fs.existsSync(sourceFile)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n const destFile = path.join(projectDir, 'AGENTS.md')\n fs.copyFileSync(sourceFile, destFile)\n fs.rmSync(tempDir, { recursive: true, force: true })\n return true\n } catch (error) {\n console.error(\n picocolors.red('Error downloading AGENTS.md:'),\n error instanceof Error ? error.message : error,\n )\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n }\n return false\n }\n}\n","import fs from 'fs'\nimport path from 'path'\nimport { green, red, yellow, cyan } from 'picocolors'\nimport {\n getPackageManager,\n getInstallCommand,\n getDlxCommand,\n runCommand,\n installTownsSkills,\n downloadAgentsMd,\n} from './utils.js'\nimport type { UpdateArgs } from '../parser.js'\n\ninterface PackageJson {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n}\n\ninterface VersionUpdate {\n package: string\n from: string\n to: string\n}\n\nfunction getTownsVersions(packageJson: PackageJson): Record<string, string> {\n const versions: Record<string, string> = {}\n for (const deps of [packageJson.dependencies, packageJson.devDependencies]) {\n if (deps) {\n for (const [pkg, version] of Object.entries(deps)) {\n if (pkg.startsWith('@towns-protocol/')) {\n versions[pkg] = version\n }\n }\n }\n }\n return versions\n}\n\nexport async function update(_argv: UpdateArgs) {\n const packageJsonPath = path.join(process.cwd(), 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n console.error(red('Error: No package.json found in the current directory'))\n console.log(yellow('Please run this command from a Towns Protocol bot project directory'))\n process.exit(1)\n }\n\n const packageManager = getPackageManager()\n const dlxCommand = getDlxCommand(packageManager)\n\n console.log(cyan('Checking for @towns-protocol updates...'))\n\n try {\n const [dlxBin, ...dlxArgs] = dlxCommand.split(' ')\n\n const packageJsonBefore: PackageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n const versionsBefore = getTownsVersions(packageJsonBefore)\n\n await runCommand(\n dlxBin,\n [...dlxArgs, 'npm-check-updates', '-u', '-f', '@towns-protocol/*'],\n {\n silent: true,\n },\n )\n\n const packageJsonAfter: PackageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n const versionsAfter = getTownsVersions(packageJsonAfter)\n\n const updates: VersionUpdate[] = []\n for (const [pkg, newVersion] of Object.entries(versionsAfter)) {\n const oldVersion = versionsBefore[pkg]\n if (oldVersion && oldVersion !== newVersion) {\n updates.push({ package: pkg, from: oldVersion, to: newVersion })\n }\n }\n\n if (updates.length === 0) {\n console.log(green('✓'), 'All @towns-protocol packages are up to date!')\n } else {\n console.log()\n for (const update of updates) {\n console.log(green('✓'), `${update.package} ${update.from} → ${update.to}`)\n }\n\n console.log()\n console.log(cyan(`Installing dependencies with ${packageManager}...`))\n const installCmd = getInstallCommand(packageManager)\n const [installBin, ...installArgs] = installCmd.split(' ')\n await runCommand(installBin, installArgs.length > 0 ? installArgs : [])\n\n console.log()\n console.log(green('✓'), 'Dependencies updated successfully!')\n }\n\n // Check if skills are installed and update them\n const projectDir = process.cwd()\n const claudeSkillsDir = path.join(projectDir, '.claude', 'skills')\n const codexSkillsDir = path.join(projectDir, '.codex', 'skills')\n\n if (fs.existsSync(claudeSkillsDir) || fs.existsSync(codexSkillsDir)) {\n console.log()\n console.log(cyan('Updating Towns Agent Skills...'))\n\n try {\n const skillSuccess = await installTownsSkills(projectDir)\n if (skillSuccess) {\n console.log(green('✓'), 'Towns Agent Skills updated successfully!')\n } else {\n console.log(\n yellow('⚠'),\n 'Failed to update skills. You can reinstall them with: towns-bot install-skill',\n )\n }\n } catch (error) {\n console.log(\n yellow('⚠'),\n 'Error updating skills:',\n error instanceof Error ? error.message : error,\n )\n }\n }\n\n // Download/update AGENTS.md\n if (!_argv.skipAgentsMd) {\n console.log()\n console.log(cyan('Updating AGENTS.md...'))\n\n try {\n const agentsMdSuccess = await downloadAgentsMd(projectDir)\n if (agentsMdSuccess) {\n console.log(green('✓'), 'AGENTS.md updated successfully!')\n } else {\n console.log(\n yellow('⚠'),\n 'Failed to update AGENTS.md. You can update it manually or run update again.',\n )\n }\n } catch (error) {\n console.log(\n yellow('⚠'),\n 'Error updating AGENTS.md:',\n error instanceof Error ? error.message : error,\n )\n }\n }\n } catch {\n console.error(red('Error:'), 'Failed to update dependencies')\n process.exit(1)\n }\n}\n","import { red, cyan, green } from 'picocolors'\nimport type { SkillArgs } from '../parser.js'\nimport { installTownsSkills } from './utils.js'\n\nexport async function skill(_argv: SkillArgs) {\n const cwd = process.cwd()\n await installSkill(cwd)\n}\n\nasync function installSkill(projectDir: string) {\n console.log(cyan('Installing Towns Agent Skills...'))\n\n try {\n const success = await installTownsSkills(projectDir)\n if (success) {\n console.log(green('✓'), 'Towns Agent Skills installed successfully!')\n console.log()\n console.log('Skills have been installed to .claude/skills/ and .codex/skills/')\n console.log('They will be available when you open this project in your AI assistant')\n } else {\n console.error(red('Failed to install Towns Agent Skills'))\n process.exit(1)\n }\n } catch (error) {\n console.error(red('Error:'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n}\n","import minimist from 'minimist'\n\n// Command-specific argument interfaces\nexport interface BaseArgs {\n _: string[]\n help?: boolean\n}\n\nexport interface InitArgs extends BaseArgs {\n template?: string\n}\n\nexport interface UpdateArgs extends BaseArgs {\n skipAgentsMd?: boolean\n}\n\nexport type SkillArgs = BaseArgs\n\nexport type CommandArgs = InitArgs | UpdateArgs | SkillArgs\n\n// Command configurations for minimist\nconst COMMAND_CONFIGS: Record<string, minimist.Opts> = {\n init: {\n string: ['template'],\n alias: { t: 'template' },\n default: { template: 'quickstart' },\n },\n update: {\n boolean: ['skipAgentsMd'],\n alias: { 'skip-agents-md': 'skipAgentsMd' },\n },\n 'install-skill': {},\n}\n\n/**\n * Parse command line arguments with command-specific configurations\n *\n * This function does a two-pass parse:\n * 1. First parse to identify the command\n * 2. Second parse with command-specific configuration\n *\n * This allows each command to have its own argument parsing rules,\n * preventing issues like hex addresses being converted to numbers.\n */\nexport function parseArgs(args: string[]): CommandArgs {\n // First, do a minimal parse to get the command\n const initial = minimist(args, {\n stopEarly: true,\n boolean: ['help'],\n alias: { h: 'help' },\n })\n\n const command = initial._[0]\n\n // If no command or help requested, return early\n if (!command || initial.help) {\n return initial as BaseArgs\n }\n\n // Get command-specific configuration\n const commandConfig = COMMAND_CONFIGS[command] || {}\n\n // Re-parse with command-specific configuration\n const booleanOptions = Array.isArray(commandConfig.boolean)\n ? ['help', ...commandConfig.boolean]\n : ['help']\n const parsed = minimist(args, {\n ...commandConfig,\n boolean: booleanOptions,\n alias: {\n ...commandConfig.alias,\n h: 'help',\n },\n })\n\n return parsed as CommandArgs\n}\n\n/**\n * Type guard functions for command-specific args\n */\nexport function isInitArgs(args: CommandArgs): args is InitArgs {\n return args._[0] === 'init'\n}\n\nexport function isUpdateArgs(args: CommandArgs): args is UpdateArgs {\n return args._[0] === 'update'\n}\n\nexport function isSkillArgs(args: CommandArgs): args is SkillArgs {\n return args._[0] === 'install-skill'\n}\n"],"mappings":"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","names":["import_picocolors","fs","path","import_picocolors","resolve","spawn","resolve","spawn","spawn","picocolors","prompts","import_picocolors","path","fs","update","import_picocolors","minimist"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
|
-
import { green as
|
|
2
|
+
import { green as green4, red as red4, yellow as yellow3, cyan as cyan4 } from "picocolors";
|
|
3
3
|
|
|
4
4
|
// src/modules/init.ts
|
|
5
5
|
import * as fs2 from "fs";
|
|
6
6
|
import * as path2 from "path";
|
|
7
7
|
import { default as prompts } from "prompts";
|
|
8
|
-
import { red, yellow, cyan } from "picocolors";
|
|
8
|
+
import { red, yellow, cyan, green } from "picocolors";
|
|
9
9
|
import * as jsonc from "jsonc-parser";
|
|
10
10
|
|
|
11
11
|
// src/modules/utils.ts
|
|
@@ -243,6 +243,135 @@ async function initializeGitRepository(targetDir) {
|
|
|
243
243
|
return false;
|
|
244
244
|
}
|
|
245
245
|
}
|
|
246
|
+
var TOWNS_SKILL_REPO = "https://github.com/towns-protocol/skills.git";
|
|
247
|
+
var AGENTS_SKILL_FOLDERS = [".claude/skills", ".codex/skills"];
|
|
248
|
+
async function installTownsSkills(projectDir) {
|
|
249
|
+
const tempDir = `${projectDir}-skills-temp`;
|
|
250
|
+
try {
|
|
251
|
+
const cloneResult = spawn.sync(
|
|
252
|
+
"git",
|
|
253
|
+
["clone", "--depth", "1", "--filter=blob:none", "--sparse", TOWNS_SKILL_REPO, tempDir],
|
|
254
|
+
{ stdio: "pipe" }
|
|
255
|
+
);
|
|
256
|
+
if (cloneResult.status !== 0) {
|
|
257
|
+
if (fs.existsSync(tempDir)) {
|
|
258
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
259
|
+
}
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
const sparseResult = spawn.sync("git", ["sparse-checkout", "set", "skills"], {
|
|
263
|
+
stdio: "pipe",
|
|
264
|
+
cwd: tempDir
|
|
265
|
+
});
|
|
266
|
+
if (sparseResult.status !== 0) {
|
|
267
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
const checkoutResult = spawn.sync("git", ["checkout"], {
|
|
271
|
+
stdio: "pipe",
|
|
272
|
+
cwd: tempDir
|
|
273
|
+
});
|
|
274
|
+
if (checkoutResult.status !== 0) {
|
|
275
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
const sourceSkillsDir = path.join(tempDir, "skills");
|
|
279
|
+
if (!fs.existsSync(sourceSkillsDir)) {
|
|
280
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
const skillDirs = fs.readdirSync(sourceSkillsDir, { withFileTypes: true });
|
|
284
|
+
for (const skillFolder of AGENTS_SKILL_FOLDERS) {
|
|
285
|
+
const targetDir = path.join(projectDir, skillFolder);
|
|
286
|
+
if (!fs.existsSync(targetDir)) {
|
|
287
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
288
|
+
}
|
|
289
|
+
for (const skillDir of skillDirs) {
|
|
290
|
+
if (skillDir.isDirectory()) {
|
|
291
|
+
const sourcePath = path.join(sourceSkillsDir, skillDir.name);
|
|
292
|
+
const destPath = path.join(targetDir, skillDir.name);
|
|
293
|
+
fs.cpSync(sourcePath, destPath, { recursive: true });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
298
|
+
return true;
|
|
299
|
+
} catch (error) {
|
|
300
|
+
console.error(
|
|
301
|
+
picocolors.red("Error installing skills:"),
|
|
302
|
+
error instanceof Error ? error.message : error
|
|
303
|
+
);
|
|
304
|
+
if (fs.existsSync(tempDir)) {
|
|
305
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
306
|
+
}
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
async function downloadAgentsMd(projectDir) {
|
|
311
|
+
const tempDir = `${projectDir}-agents-md-temp`;
|
|
312
|
+
try {
|
|
313
|
+
const agentsMdPath = "packages/examples/bot-quickstart/AGENTS.md";
|
|
314
|
+
const latestSdkTag = getLatestSdkTag();
|
|
315
|
+
if (!latestSdkTag) {
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
const cloneResult = spawn.sync(
|
|
319
|
+
"git",
|
|
320
|
+
[
|
|
321
|
+
"clone",
|
|
322
|
+
"--no-checkout",
|
|
323
|
+
"--depth",
|
|
324
|
+
"1",
|
|
325
|
+
"--sparse",
|
|
326
|
+
"--branch",
|
|
327
|
+
latestSdkTag,
|
|
328
|
+
"https://github.com/towns-protocol/towns.git",
|
|
329
|
+
tempDir
|
|
330
|
+
],
|
|
331
|
+
{ stdio: "pipe" }
|
|
332
|
+
);
|
|
333
|
+
if (cloneResult.status !== 0) {
|
|
334
|
+
if (fs.existsSync(tempDir)) {
|
|
335
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
336
|
+
}
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
const sparseResult = spawn.sync("git", ["sparse-checkout", "set", agentsMdPath], {
|
|
340
|
+
stdio: "pipe",
|
|
341
|
+
cwd: tempDir
|
|
342
|
+
});
|
|
343
|
+
if (sparseResult.status !== 0) {
|
|
344
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
const checkoutResult = spawn.sync("git", ["checkout"], {
|
|
348
|
+
stdio: "pipe",
|
|
349
|
+
cwd: tempDir
|
|
350
|
+
});
|
|
351
|
+
if (checkoutResult.status !== 0) {
|
|
352
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
const sourceFile = path.join(tempDir, agentsMdPath);
|
|
356
|
+
if (!fs.existsSync(sourceFile)) {
|
|
357
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
const destFile = path.join(projectDir, "AGENTS.md");
|
|
361
|
+
fs.copyFileSync(sourceFile, destFile);
|
|
362
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
363
|
+
return true;
|
|
364
|
+
} catch (error) {
|
|
365
|
+
console.error(
|
|
366
|
+
picocolors.red("Error downloading AGENTS.md:"),
|
|
367
|
+
error instanceof Error ? error.message : error
|
|
368
|
+
);
|
|
369
|
+
if (fs.existsSync(tempDir)) {
|
|
370
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
371
|
+
}
|
|
372
|
+
return false;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
246
375
|
|
|
247
376
|
// src/modules/init.ts
|
|
248
377
|
var TEMPLATES = {
|
|
@@ -310,6 +439,26 @@ async function init(argv) {
|
|
|
310
439
|
modifiedContent = JSON.stringify(parsed, null, 2);
|
|
311
440
|
fs2.writeFileSync(packageJsonPath, modifiedContent);
|
|
312
441
|
}
|
|
442
|
+
console.log(cyan("Installing Towns Agent Skills..."));
|
|
443
|
+
try {
|
|
444
|
+
const skillSuccess = await installTownsSkills(targetDir);
|
|
445
|
+
if (skillSuccess) {
|
|
446
|
+
console.log(green("\u2713"), "Towns Agent Skills installed successfully!");
|
|
447
|
+
} else {
|
|
448
|
+
console.log(
|
|
449
|
+
yellow("\u26A0"),
|
|
450
|
+
"Failed to install Towns Agent Skills. You can install them later with:"
|
|
451
|
+
);
|
|
452
|
+
console.log(yellow(` cd ${projectName} && towns-bot install-skill`));
|
|
453
|
+
}
|
|
454
|
+
} catch (error) {
|
|
455
|
+
console.log(
|
|
456
|
+
yellow("\u26A0"),
|
|
457
|
+
"Error installing skills:",
|
|
458
|
+
error instanceof Error ? error.message : error
|
|
459
|
+
);
|
|
460
|
+
console.log(yellow(` You can install them later with: towns-bot install-skill`));
|
|
461
|
+
}
|
|
313
462
|
await initializeGitRepository(targetDir);
|
|
314
463
|
printSuccess(projectName, packageManager);
|
|
315
464
|
} catch (error) {
|
|
@@ -322,7 +471,7 @@ async function init(argv) {
|
|
|
322
471
|
// src/modules/update.ts
|
|
323
472
|
import fs3 from "fs";
|
|
324
473
|
import path3 from "path";
|
|
325
|
-
import { green, red as red2, yellow as yellow2, cyan as cyan2 } from "picocolors";
|
|
474
|
+
import { green as green2, red as red2, yellow as yellow2, cyan as cyan2 } from "picocolors";
|
|
326
475
|
function getTownsVersions(packageJson) {
|
|
327
476
|
const versions = {};
|
|
328
477
|
for (const deps of [packageJson.dependencies, packageJson.devDependencies]) {
|
|
@@ -367,26 +516,96 @@ async function update(_argv) {
|
|
|
367
516
|
}
|
|
368
517
|
}
|
|
369
518
|
if (updates.length === 0) {
|
|
370
|
-
console.log(
|
|
371
|
-
|
|
519
|
+
console.log(green2("\u2713"), "All @towns-protocol packages are up to date!");
|
|
520
|
+
} else {
|
|
521
|
+
console.log();
|
|
522
|
+
for (const update2 of updates) {
|
|
523
|
+
console.log(green2("\u2713"), `${update2.package} ${update2.from} \u2192 ${update2.to}`);
|
|
524
|
+
}
|
|
525
|
+
console.log();
|
|
526
|
+
console.log(cyan2(`Installing dependencies with ${packageManager}...`));
|
|
527
|
+
const installCmd = getInstallCommand(packageManager);
|
|
528
|
+
const [installBin, ...installArgs] = installCmd.split(" ");
|
|
529
|
+
await runCommand(installBin, installArgs.length > 0 ? installArgs : []);
|
|
530
|
+
console.log();
|
|
531
|
+
console.log(green2("\u2713"), "Dependencies updated successfully!");
|
|
532
|
+
}
|
|
533
|
+
const projectDir = process.cwd();
|
|
534
|
+
const claudeSkillsDir = path3.join(projectDir, ".claude", "skills");
|
|
535
|
+
const codexSkillsDir = path3.join(projectDir, ".codex", "skills");
|
|
536
|
+
if (fs3.existsSync(claudeSkillsDir) || fs3.existsSync(codexSkillsDir)) {
|
|
537
|
+
console.log();
|
|
538
|
+
console.log(cyan2("Updating Towns Agent Skills..."));
|
|
539
|
+
try {
|
|
540
|
+
const skillSuccess = await installTownsSkills(projectDir);
|
|
541
|
+
if (skillSuccess) {
|
|
542
|
+
console.log(green2("\u2713"), "Towns Agent Skills updated successfully!");
|
|
543
|
+
} else {
|
|
544
|
+
console.log(
|
|
545
|
+
yellow2("\u26A0"),
|
|
546
|
+
"Failed to update skills. You can reinstall them with: towns-bot install-skill"
|
|
547
|
+
);
|
|
548
|
+
}
|
|
549
|
+
} catch (error) {
|
|
550
|
+
console.log(
|
|
551
|
+
yellow2("\u26A0"),
|
|
552
|
+
"Error updating skills:",
|
|
553
|
+
error instanceof Error ? error.message : error
|
|
554
|
+
);
|
|
555
|
+
}
|
|
372
556
|
}
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
console.log(
|
|
557
|
+
if (!_argv.skipAgentsMd) {
|
|
558
|
+
console.log();
|
|
559
|
+
console.log(cyan2("Updating AGENTS.md..."));
|
|
560
|
+
try {
|
|
561
|
+
const agentsMdSuccess = await downloadAgentsMd(projectDir);
|
|
562
|
+
if (agentsMdSuccess) {
|
|
563
|
+
console.log(green2("\u2713"), "AGENTS.md updated successfully!");
|
|
564
|
+
} else {
|
|
565
|
+
console.log(
|
|
566
|
+
yellow2("\u26A0"),
|
|
567
|
+
"Failed to update AGENTS.md. You can update it manually or run update again."
|
|
568
|
+
);
|
|
569
|
+
}
|
|
570
|
+
} catch (error) {
|
|
571
|
+
console.log(
|
|
572
|
+
yellow2("\u26A0"),
|
|
573
|
+
"Error updating AGENTS.md:",
|
|
574
|
+
error instanceof Error ? error.message : error
|
|
575
|
+
);
|
|
576
|
+
}
|
|
376
577
|
}
|
|
377
|
-
console.log();
|
|
378
|
-
console.log(cyan2(`Installing dependencies with ${packageManager}...`));
|
|
379
|
-
const installCmd = getInstallCommand(packageManager);
|
|
380
|
-
const [installBin, ...installArgs] = installCmd.split(" ");
|
|
381
|
-
await runCommand(installBin, installArgs.length > 0 ? installArgs : []);
|
|
382
|
-
console.log();
|
|
383
|
-
console.log(green("\u2713"), "Dependencies updated successfully!");
|
|
384
578
|
} catch {
|
|
385
579
|
console.error(red2("Error:"), "Failed to update dependencies");
|
|
386
580
|
process.exit(1);
|
|
387
581
|
}
|
|
388
582
|
}
|
|
389
583
|
|
|
584
|
+
// src/modules/install-skill.ts
|
|
585
|
+
import { red as red3, cyan as cyan3, green as green3 } from "picocolors";
|
|
586
|
+
async function skill(_argv) {
|
|
587
|
+
const cwd = process.cwd();
|
|
588
|
+
await installSkill(cwd);
|
|
589
|
+
}
|
|
590
|
+
async function installSkill(projectDir) {
|
|
591
|
+
console.log(cyan3("Installing Towns Agent Skills..."));
|
|
592
|
+
try {
|
|
593
|
+
const success = await installTownsSkills(projectDir);
|
|
594
|
+
if (success) {
|
|
595
|
+
console.log(green3("\u2713"), "Towns Agent Skills installed successfully!");
|
|
596
|
+
console.log();
|
|
597
|
+
console.log("Skills have been installed to .claude/skills/ and .codex/skills/");
|
|
598
|
+
console.log("They will be available when you open this project in your AI assistant");
|
|
599
|
+
} else {
|
|
600
|
+
console.error(red3("Failed to install Towns Agent Skills"));
|
|
601
|
+
process.exit(1);
|
|
602
|
+
}
|
|
603
|
+
} catch (error) {
|
|
604
|
+
console.error(red3("Error:"), error instanceof Error ? error.message : error);
|
|
605
|
+
process.exit(1);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
|
|
390
609
|
// src/parser.ts
|
|
391
610
|
import minimist from "minimist";
|
|
392
611
|
var COMMAND_CONFIGS = {
|
|
@@ -396,8 +615,10 @@ var COMMAND_CONFIGS = {
|
|
|
396
615
|
default: { template: "quickstart" }
|
|
397
616
|
},
|
|
398
617
|
update: {
|
|
399
|
-
|
|
400
|
-
|
|
618
|
+
boolean: ["skipAgentsMd"],
|
|
619
|
+
alias: { "skip-agents-md": "skipAgentsMd" }
|
|
620
|
+
},
|
|
621
|
+
"install-skill": {}
|
|
401
622
|
};
|
|
402
623
|
function parseArgs(args) {
|
|
403
624
|
const initial = minimist(args, {
|
|
@@ -427,6 +648,9 @@ function isInitArgs(args) {
|
|
|
427
648
|
function isUpdateArgs(args) {
|
|
428
649
|
return args._[0] === "update";
|
|
429
650
|
}
|
|
651
|
+
function isSkillArgs(args) {
|
|
652
|
+
return args._[0] === "install-skill";
|
|
653
|
+
}
|
|
430
654
|
|
|
431
655
|
// src/index.ts
|
|
432
656
|
async function main() {
|
|
@@ -448,26 +672,32 @@ async function main() {
|
|
|
448
672
|
await update(args);
|
|
449
673
|
}
|
|
450
674
|
break;
|
|
675
|
+
case "install-skill":
|
|
676
|
+
if (isSkillArgs(args)) {
|
|
677
|
+
await skill(args);
|
|
678
|
+
}
|
|
679
|
+
break;
|
|
451
680
|
default:
|
|
452
|
-
console.error(
|
|
681
|
+
console.error(red4(`Unknown command: ${command}`));
|
|
453
682
|
showHelp();
|
|
454
683
|
process.exit(1);
|
|
455
684
|
}
|
|
456
685
|
} catch (error) {
|
|
457
|
-
console.error(
|
|
686
|
+
console.error(red4("Error:"), error instanceof Error ? error.message : error);
|
|
458
687
|
process.exit(1);
|
|
459
688
|
}
|
|
460
689
|
}
|
|
461
690
|
function showHelp() {
|
|
462
691
|
console.log(`
|
|
463
|
-
${
|
|
692
|
+
${cyan4("towns-bot")} - CLI for creating and managing Towns Protocol bot projects
|
|
464
693
|
|
|
465
694
|
${yellow3("Usage:")}
|
|
466
695
|
towns-bot <command> [options]
|
|
467
696
|
|
|
468
697
|
${yellow3("Commands:")}
|
|
469
|
-
${
|
|
470
|
-
${
|
|
698
|
+
${green4("init")} [project-name] Create a new bot project
|
|
699
|
+
${green4("update")} Update @towns-protocol dependencies and skills
|
|
700
|
+
${green4("install-skill")} Install Towns Agent Skills to current project
|
|
471
701
|
|
|
472
702
|
${yellow3("Init Options:")}
|
|
473
703
|
-t, --template <name> Template to use:
|
|
@@ -483,21 +713,22 @@ ${yellow3("Update Commands Options:")}
|
|
|
483
713
|
-f, --file <path> Path to commands file
|
|
484
714
|
-t, --bearerToken <token> Bearer token for authentication
|
|
485
715
|
-e, --envFile <path> Path to .env file (default: .env)
|
|
716
|
+
--skip-agents-md Skip updating AGENTS.md file
|
|
486
717
|
|
|
487
718
|
${yellow3("Global Options:")}
|
|
488
719
|
-h, --help Show this help message
|
|
489
720
|
|
|
490
721
|
${yellow3("Examples:")}
|
|
491
|
-
${
|
|
722
|
+
${cyan4("# Create a new bot project")}
|
|
492
723
|
towns-bot init my-bot
|
|
493
724
|
towns-bot init my-ai-bot --template quickstart
|
|
494
725
|
|
|
495
|
-
${
|
|
726
|
+
${cyan4("# Update dependencies")}
|
|
496
727
|
towns-bot update
|
|
497
728
|
`);
|
|
498
729
|
}
|
|
499
730
|
main().catch((error) => {
|
|
500
|
-
console.error(
|
|
731
|
+
console.error(red4("Unexpected error:"), error);
|
|
501
732
|
process.exit(1);
|
|
502
733
|
});
|
|
503
734
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/modules/init.ts","../src/modules/utils.ts","../src/modules/update.ts","../src/parser.ts"],"sourcesContent":["import { green, red, yellow, cyan } from 'picocolors'\nimport { init, TEMPLATES, type Template } from './modules/init.js'\nimport { update } from './modules/update.js'\nimport { parseArgs, isInitArgs, isUpdateArgs } from './parser.js'\n\nasync function main() {\n const args = parseArgs(process.argv.slice(2))\n const command = args._[0]\n\n if (args.help || !command) {\n showHelp()\n return\n }\n\n try {\n switch (command) {\n case 'init':\n if (isInitArgs(args)) {\n await init(args)\n }\n break\n case 'update':\n if (isUpdateArgs(args)) {\n await update(args)\n }\n break\n default:\n console.error(red(`Unknown command: ${command}`))\n showHelp()\n process.exit(1)\n }\n } catch (error) {\n console.error(red('Error:'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n}\n\nfunction showHelp() {\n console.log(`\n${cyan('towns-bot')} - CLI for creating and managing Towns Protocol bot projects\n\n${yellow('Usage:')}\n towns-bot <command> [options]\n\n${yellow('Commands:')}\n ${green('init')} [project-name] Create a new bot project\n ${green('update')} Update @towns-protocol dependencies to latest versions\n\n${yellow('Init Options:')}\n -t, --template <name> Template to use:\n${Object.entries(TEMPLATES)\n .map(\n ([key, template]: [string, Template]) =>\n ` ${key} - ${template.description}`,\n )\n .join('\\n')}\n Default: quickstart\n\n${yellow('List Commands Options:')}\n -f, --file <path> Path to commands file\n\n${yellow('Update Commands Options:')}\n -f, --file <path> Path to commands file\n -t, --bearerToken <token> Bearer token for authentication\n -e, --envFile <path> Path to .env file (default: .env)\n\n${yellow('Global Options:')}\n -h, --help Show this help message\n\n${yellow('Examples:')}\n ${cyan('# Create a new bot project')}\n towns-bot init my-bot\n towns-bot init my-ai-bot --template quickstart\n\n ${cyan('# Update dependencies')}\n towns-bot update\n`)\n}\n\nmain().catch((error) => {\n console.error(red('Unexpected error:'), error)\n process.exit(1)\n})\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { default as prompts } from 'prompts'\nimport { red, yellow, cyan } from 'picocolors'\nimport * as jsonc from 'jsonc-parser'\nimport {\n getPackageManager,\n getLatestTownsProtocolVersion,\n cloneTemplate,\n applyReplacements,\n printSuccess,\n initializeGitRepository,\n type PackageJson,\n} from './utils.js'\nimport type { InitArgs } from '../parser.js'\n\nexport type Template = (typeof TEMPLATES)[keyof typeof TEMPLATES]\nexport const TEMPLATES = {\n quickstart: {\n name: 'Bot Quickstart',\n description: 'Simple starter bot with basic commands',\n packagePath: 'bot-quickstart',\n },\n} as const\n\nexport async function init(argv: InitArgs) {\n const projectName = argv._[1]\n const template = argv.template || 'quickstart'\n\n if (!projectName) {\n console.error(red('Error: Please provide a project name'))\n console.log(yellow('Usage: towns-bot init <project-name>'))\n process.exit(1)\n }\n\n if (!TEMPLATES[template as keyof typeof TEMPLATES]) {\n console.error(red(`Error: Unknown template \"${template}\"`))\n console.log(yellow('Available templates:'), Object.keys(TEMPLATES).join(', '))\n process.exit(1)\n }\n\n const targetDir = path.resolve(process.cwd(), projectName)\n\n if (fs.existsSync(targetDir)) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `Directory ${projectName} already exists. Overwrite?`,\n initial: false,\n })\n\n if (!overwrite) {\n console.log(yellow('Operation cancelled'))\n process.exit(0)\n }\n\n fs.rmSync(targetDir, { recursive: true, force: true })\n }\n\n console.log(cyan(`Creating a new Towns Protocol bot in ${targetDir}`))\n if (template !== 'quickstart') {\n console.log(cyan(`Using template: ${TEMPLATES[template as keyof typeof TEMPLATES].name}`))\n }\n\n const packageManager = getPackageManager()\n const selectedTemplate = TEMPLATES[template as keyof typeof TEMPLATES]\n\n try {\n // Clone template from GitHub\n const success = await cloneTemplate(selectedTemplate.packagePath, targetDir)\n if (!success) {\n console.error(red('Failed to clone template'))\n process.exit(1)\n }\n const latestVersion = await getLatestTownsProtocolVersion()\n // Replace workspace dependencies in package.json and other files\n const replacements = new Map([\n ['workspace:\\\\^', `^${latestVersion}`],\n ['workspace:\\\\*', `^${latestVersion}`],\n ])\n\n // Apply replacements to all relevant files\n applyReplacements(targetDir, replacements)\n\n const packageJsonPath = path.join(targetDir, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n const content = fs.readFileSync(packageJsonPath, 'utf-8')\n const edits = [\n jsonc.modify(content, ['name'], projectName, {}),\n jsonc.modify(content, ['version'], '0.0.1', {}),\n ]\n\n let modifiedContent = jsonc.applyEdits(content, edits.flat())\n\n const parsed = jsonc.parse(modifiedContent) as PackageJson\n delete parsed.private\n\n modifiedContent = JSON.stringify(parsed, null, 2)\n fs.writeFileSync(packageJsonPath, modifiedContent)\n }\n await initializeGitRepository(targetDir)\n printSuccess(projectName, packageManager)\n } catch (error) {\n console.error(red('Error:'), error instanceof Error ? error.message : error)\n console.error(red(`Please delete the directory ${targetDir} and try again.`))\n process.exit(1)\n }\n}\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { default as spawn } from 'cross-spawn'\nimport picocolors from 'picocolors'\n\nexport type PackageJson = {\n private?: boolean\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n}\n\nexport const getPackageManager = () => {\n if (process.env.npm_config_user_agent) {\n const agent = process.env.npm_config_user_agent\n if (agent.startsWith('yarn')) return 'yarn'\n if (agent.startsWith('npm')) return 'npm'\n if (agent.startsWith('pnpm')) return 'pnpm'\n if (agent.startsWith('bun')) return 'bun'\n }\n // Default to npm if no user agent is found\n return 'npm'\n}\n\nexport function getInstallCommand(packageManager: string): string {\n switch (packageManager) {\n case 'bun':\n return 'bun install'\n case 'yarn':\n return 'yarn'\n case 'pnpm':\n return 'pnpm install'\n default:\n return 'npm install'\n }\n}\n\nexport function getRunCommand(packageManager: string, script: string): string {\n switch (packageManager) {\n case 'bun':\n return `bun run ${script}`\n case 'yarn':\n return `yarn ${script}`\n case 'pnpm':\n return `pnpm ${script}`\n default:\n return `npm run ${script}`\n }\n}\n\nexport function getDlxCommand(packageManager: string): string {\n switch (packageManager) {\n case 'bun':\n return 'bunx'\n case 'yarn':\n return 'yarn dlx'\n case 'pnpm':\n return 'pnpm dlx'\n default:\n return 'npx'\n }\n}\n\nexport function runCommand(\n command: string,\n args: string[],\n opts: { cwd?: string; silent?: boolean } = { cwd: undefined, silent: false },\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: opts.silent ? 'ignore' : 'inherit',\n cwd: opts.cwd,\n shell: process.platform === 'win32',\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`Command failed with exit code ${code}`))\n } else {\n resolve()\n }\n })\n\n child.on('error', reject)\n })\n}\n\nexport function runCommandWithOutput(\n command: string,\n args: string[],\n opts: { cwd?: string } = {},\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd: opts.cwd,\n shell: process.platform === 'win32',\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString()\n })\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString()\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(stderr || `Command failed with exit code ${code}`))\n } else {\n resolve(stdout)\n }\n })\n\n child.on('error', reject)\n })\n}\n\nexport async function getLatestTownsProtocolVersion(): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn('npm', ['view', '@towns-protocol/bot', 'version'], {\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n\n let output = ''\n child.stdout?.on('data', (data) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n output += data.toString()\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error('Failed to fetch latest @towns-protocol/bot version'))\n } else {\n resolve(output.trim())\n }\n })\n\n child.on('error', reject)\n })\n}\n\nexport function copyDirectory(src: string, dest: string, replacements?: Map<string, string>) {\n if (!fs.existsSync(dest)) {\n fs.mkdirSync(dest, { recursive: true })\n }\n\n const entries = fs.readdirSync(src, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n\n if (entry.isDirectory()) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {\n continue\n }\n copyDirectory(srcPath, destPath, replacements)\n } else {\n let content = fs.readFileSync(srcPath, 'utf-8')\n\n if (\n replacements &&\n (entry.name === 'package.json' ||\n entry.name.endsWith('.ts') ||\n entry.name.endsWith('.js'))\n ) {\n for (const [search, replace] of replacements) {\n content = content.replace(new RegExp(search, 'g'), replace)\n }\n }\n\n fs.writeFileSync(destPath, content)\n }\n }\n}\n\nexport function getLatestSdkTag(): string | null {\n const tagsResult = spawn.sync(\n 'git',\n ['ls-remote', '--tags', 'https://github.com/towns-protocol/towns.git', 'sdk-*'],\n { encoding: 'utf8' },\n )\n\n if (tagsResult.status !== 0 || !tagsResult.stdout) return null\n\n const tags = tagsResult.stdout\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [_hash, ref] = line.split('\\t')\n const tag = ref.replace('refs/tags/', '').replace(/\\^{}$/, '')\n\n // Extract version numbers from tags like sdk-hash-1.2.3\n const match = tag.match(/^sdk-[0-9a-f]+-(\\d+)\\.(\\d+)\\.(\\d+)$/)\n if (!match) return null\n\n return {\n tag,\n version: [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])],\n }\n })\n .filter(\n (item): item is { tag: string; version: number[] } =>\n item !== null && Array.isArray(item.version) && item.version.length === 3,\n )\n .sort((a, b) => {\n // Compare version numbers\n for (let i = 0; i < 3; i++) {\n if (a.version[i] !== b.version[i]) {\n return b.version[i] - a.version[i]\n }\n }\n return 0\n })\n\n return tags.length > 0 ? tags[0].tag : null\n}\n\nexport async function cloneTemplate(packagePath: string, targetDir: string): Promise<boolean> {\n console.log(picocolors.blue('Cloning template from GitHub...'))\n\n const tempDir = `${targetDir}-temp`\n const fullTemplatePath = `packages/examples/${packagePath}`\n\n // Get latest SDK tag\n const latestSdkTag = getLatestSdkTag()\n if (!latestSdkTag) {\n console.error(picocolors.red('Failed to get latest SDK tag.'))\n return false\n }\n\n // Clone with minimal data to a temporary directory\n const cloneResult = spawn.sync(\n 'git',\n [\n 'clone',\n '--no-checkout',\n '--depth',\n '1',\n '--sparse',\n '--branch',\n latestSdkTag,\n 'https://github.com/towns-protocol/towns.git',\n tempDir,\n ],\n { stdio: 'pipe' },\n )\n if (cloneResult.status !== 0) return false\n\n // Set up sparse checkout for the specific template\n const sparseResult = spawn.sync('git', ['sparse-checkout', 'set', fullTemplatePath], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (sparseResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n // Checkout the content\n const checkoutResult = spawn.sync('git', ['checkout'], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (checkoutResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n // Verify template directory exists\n const sourceDir = path.join(tempDir, fullTemplatePath)\n if (!fs.existsSync(sourceDir)) {\n console.error(picocolors.red(`\\nTemplate directory not found at ${sourceDir}`))\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n // Copy template contents to target directory\n fs.mkdirSync(targetDir, { recursive: true })\n // Use filter to ensure all files (including hidden) are copied\n fs.cpSync(sourceDir, targetDir, {\n recursive: true,\n filter: () => {\n // Copy all files, including hidden ones\n return true\n },\n })\n\n // Clean up temporary directory\n fs.rmSync(tempDir, { recursive: true, force: true })\n\n console.log(picocolors.green('✓'), 'Template cloned successfully!')\n return true\n}\n\nexport function applyReplacements(targetDir: string, replacements: Map<string, string>) {\n function processDirectory(dir: string) {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {\n continue\n }\n processDirectory(fullPath)\n } else {\n let content = fs.readFileSync(fullPath, 'utf-8')\n let modified = false\n\n if (\n entry.name === 'package.json' ||\n entry.name.endsWith('.ts') ||\n entry.name.endsWith('.js')\n ) {\n for (const [search, replace] of replacements) {\n const regex = new RegExp(search, 'g')\n if (regex.test(content)) {\n content = content.replace(regex, replace)\n modified = true\n }\n }\n\n if (modified) {\n fs.writeFileSync(fullPath, content)\n }\n }\n }\n }\n }\n\n processDirectory(targetDir)\n}\n\nexport function printSuccess(projectName: string, packageManager: string) {\n console.log(picocolors.green('✓'), 'Bot project created successfully!')\n console.log()\n console.log('Next steps:')\n console.log(picocolors.cyan(` cd ${projectName}`))\n console.log(picocolors.cyan(` ${getInstallCommand(packageManager)}`))\n console.log('Set up your environment variables:')\n console.log(picocolors.cyan(' cp .env.sample .env'))\n console.log(' Edit .env with your bot credentials')\n console.log('Start your bot:')\n console.log(picocolors.cyan(` ${getRunCommand(packageManager, 'dev')}`))\n}\n\nexport async function initializeGitRepository(targetDir: string): Promise<boolean> {\n try {\n await runCommand('git', ['init'], { cwd: targetDir, silent: true })\n await runCommand('git', ['add', '.'], { cwd: targetDir, silent: true })\n await runCommand('git', ['commit', '-m', 'feat: towns bot scaffolding'], {\n cwd: targetDir,\n silent: true,\n })\n return true\n } catch (error) {\n console.log(\n picocolors.yellow('⚠'),\n 'Failed to initialize git repository:',\n error instanceof Error ? error.message : 'Unknown error',\n )\n console.log(picocolors.yellow(' You can manually initialize git later with: git init'))\n return false\n }\n}\n","import fs from 'fs'\nimport path from 'path'\nimport { green, red, yellow, cyan } from 'picocolors'\nimport { getPackageManager, getInstallCommand, getDlxCommand, runCommand } from './utils.js'\nimport type { UpdateArgs } from '../parser.js'\n\ninterface PackageJson {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n}\n\ninterface VersionUpdate {\n package: string\n from: string\n to: string\n}\n\nfunction getTownsVersions(packageJson: PackageJson): Record<string, string> {\n const versions: Record<string, string> = {}\n for (const deps of [packageJson.dependencies, packageJson.devDependencies]) {\n if (deps) {\n for (const [pkg, version] of Object.entries(deps)) {\n if (pkg.startsWith('@towns-protocol/')) {\n versions[pkg] = version\n }\n }\n }\n }\n return versions\n}\n\nexport async function update(_argv: UpdateArgs) {\n const packageJsonPath = path.join(process.cwd(), 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n console.error(red('Error: No package.json found in the current directory'))\n console.log(yellow('Please run this command from a Towns Protocol bot project directory'))\n process.exit(1)\n }\n\n const packageManager = getPackageManager()\n const dlxCommand = getDlxCommand(packageManager)\n\n console.log(cyan('Checking for @towns-protocol updates...'))\n\n try {\n const [dlxBin, ...dlxArgs] = dlxCommand.split(' ')\n\n const packageJsonBefore: PackageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n const versionsBefore = getTownsVersions(packageJsonBefore)\n\n await runCommand(\n dlxBin,\n [...dlxArgs, 'npm-check-updates', '-u', '-f', '@towns-protocol/*'],\n {\n silent: true,\n },\n )\n\n const packageJsonAfter: PackageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n const versionsAfter = getTownsVersions(packageJsonAfter)\n\n const updates: VersionUpdate[] = []\n for (const [pkg, newVersion] of Object.entries(versionsAfter)) {\n const oldVersion = versionsBefore[pkg]\n if (oldVersion && oldVersion !== newVersion) {\n updates.push({ package: pkg, from: oldVersion, to: newVersion })\n }\n }\n\n if (updates.length === 0) {\n console.log(green('✓'), 'All @towns-protocol packages are up to date!')\n return\n }\n\n console.log()\n for (const update of updates) {\n console.log(green('✓'), `${update.package} ${update.from} → ${update.to}`)\n }\n\n console.log()\n console.log(cyan(`Installing dependencies with ${packageManager}...`))\n const installCmd = getInstallCommand(packageManager)\n const [installBin, ...installArgs] = installCmd.split(' ')\n await runCommand(installBin, installArgs.length > 0 ? installArgs : [])\n\n console.log()\n console.log(green('✓'), 'Dependencies updated successfully!')\n } catch {\n console.error(red('Error:'), 'Failed to update dependencies')\n process.exit(1)\n }\n}\n","import minimist from 'minimist'\n\n// Command-specific argument interfaces\nexport interface BaseArgs {\n _: string[]\n help?: boolean\n}\n\nexport interface InitArgs extends BaseArgs {\n template?: string\n}\n\nexport type UpdateArgs = BaseArgs\n\nexport type CommandArgs = InitArgs | UpdateArgs\n\n// Command configurations for minimist\nconst COMMAND_CONFIGS: Record<string, minimist.Opts> = {\n init: {\n string: ['template'],\n alias: { t: 'template' },\n default: { template: 'quickstart' },\n },\n update: {\n // No special config needed\n },\n}\n\n/**\n * Parse command line arguments with command-specific configurations\n *\n * This function does a two-pass parse:\n * 1. First parse to identify the command\n * 2. Second parse with command-specific configuration\n *\n * This allows each command to have its own argument parsing rules,\n * preventing issues like hex addresses being converted to numbers.\n */\nexport function parseArgs(args: string[]): CommandArgs {\n // First, do a minimal parse to get the command\n const initial = minimist(args, {\n stopEarly: true,\n boolean: ['help'],\n alias: { h: 'help' },\n })\n\n const command = initial._[0]\n\n // If no command or help requested, return early\n if (!command || initial.help) {\n return initial as BaseArgs\n }\n\n // Get command-specific configuration\n const commandConfig = COMMAND_CONFIGS[command] || {}\n\n // Re-parse with command-specific configuration\n const booleanOptions = Array.isArray(commandConfig.boolean)\n ? ['help', ...commandConfig.boolean]\n : ['help']\n const parsed = minimist(args, {\n ...commandConfig,\n boolean: booleanOptions,\n alias: {\n ...commandConfig.alias,\n h: 'help',\n },\n })\n\n return parsed as CommandArgs\n}\n\n/**\n * Type guard functions for command-specific args\n */\nexport function isInitArgs(args: CommandArgs): args is InitArgs {\n return args._[0] === 'init'\n}\n\nexport function isUpdateArgs(args: CommandArgs): args is UpdateArgs {\n return args._[0] === 'update'\n}\n"],"mappings":"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","names":["green","red","yellow","cyan","fs","path","resolve","resolve","fs","path","red","yellow","cyan","path","fs","red","yellow","cyan","update","red","cyan","yellow","green"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/modules/init.ts","../src/modules/utils.ts","../src/modules/update.ts","../src/modules/install-skill.ts","../src/parser.ts"],"sourcesContent":["import { green, red, yellow, cyan } from 'picocolors'\nimport { init, TEMPLATES, type Template } from './modules/init.js'\nimport { update } from './modules/update.js'\nimport { skill } from './modules/install-skill.js'\nimport { parseArgs, isInitArgs, isUpdateArgs, isSkillArgs } from './parser.js'\n\nasync function main() {\n const args = parseArgs(process.argv.slice(2))\n const command = args._[0]\n\n if (args.help || !command) {\n showHelp()\n return\n }\n\n try {\n switch (command) {\n case 'init':\n if (isInitArgs(args)) {\n await init(args)\n }\n break\n case 'update':\n if (isUpdateArgs(args)) {\n await update(args)\n }\n break\n case 'install-skill':\n if (isSkillArgs(args)) {\n await skill(args)\n }\n break\n default:\n console.error(red(`Unknown command: ${command}`))\n showHelp()\n process.exit(1)\n }\n } catch (error) {\n console.error(red('Error:'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n}\n\nfunction showHelp() {\n console.log(`\n${cyan('towns-bot')} - CLI for creating and managing Towns Protocol bot projects\n\n${yellow('Usage:')}\n towns-bot <command> [options]\n\n${yellow('Commands:')}\n ${green('init')} [project-name] Create a new bot project\n ${green('update')} Update @towns-protocol dependencies and skills\n ${green('install-skill')} Install Towns Agent Skills to current project\n\n${yellow('Init Options:')}\n -t, --template <name> Template to use:\n${Object.entries(TEMPLATES)\n .map(\n ([key, template]: [string, Template]) =>\n ` ${key} - ${template.description}`,\n )\n .join('\\n')}\n Default: quickstart\n\n${yellow('List Commands Options:')}\n -f, --file <path> Path to commands file\n\n${yellow('Update Commands Options:')}\n -f, --file <path> Path to commands file\n -t, --bearerToken <token> Bearer token for authentication\n -e, --envFile <path> Path to .env file (default: .env)\n --skip-agents-md Skip updating AGENTS.md file\n\n${yellow('Global Options:')}\n -h, --help Show this help message\n\n${yellow('Examples:')}\n ${cyan('# Create a new bot project')}\n towns-bot init my-bot\n towns-bot init my-ai-bot --template quickstart\n\n ${cyan('# Update dependencies')}\n towns-bot update\n`)\n}\n\nmain().catch((error) => {\n console.error(red('Unexpected error:'), error)\n process.exit(1)\n})\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { default as prompts } from 'prompts'\nimport { red, yellow, cyan, green } from 'picocolors'\nimport * as jsonc from 'jsonc-parser'\nimport {\n getPackageManager,\n getLatestTownsProtocolVersion,\n cloneTemplate,\n applyReplacements,\n printSuccess,\n initializeGitRepository,\n installTownsSkills,\n type PackageJson,\n} from './utils.js'\nimport type { InitArgs } from '../parser.js'\n\nexport type Template = (typeof TEMPLATES)[keyof typeof TEMPLATES]\nexport const TEMPLATES = {\n quickstart: {\n name: 'Bot Quickstart',\n description: 'Simple starter bot with basic commands',\n packagePath: 'bot-quickstart',\n },\n} as const\n\nexport async function init(argv: InitArgs) {\n const projectName = argv._[1]\n const template = argv.template || 'quickstart'\n\n if (!projectName) {\n console.error(red('Error: Please provide a project name'))\n console.log(yellow('Usage: towns-bot init <project-name>'))\n process.exit(1)\n }\n\n if (!TEMPLATES[template as keyof typeof TEMPLATES]) {\n console.error(red(`Error: Unknown template \"${template}\"`))\n console.log(yellow('Available templates:'), Object.keys(TEMPLATES).join(', '))\n process.exit(1)\n }\n\n const targetDir = path.resolve(process.cwd(), projectName)\n\n if (fs.existsSync(targetDir)) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `Directory ${projectName} already exists. Overwrite?`,\n initial: false,\n })\n\n if (!overwrite) {\n console.log(yellow('Operation cancelled'))\n process.exit(0)\n }\n\n fs.rmSync(targetDir, { recursive: true, force: true })\n }\n\n console.log(cyan(`Creating a new Towns Protocol bot in ${targetDir}`))\n if (template !== 'quickstart') {\n console.log(cyan(`Using template: ${TEMPLATES[template as keyof typeof TEMPLATES].name}`))\n }\n\n const packageManager = getPackageManager()\n const selectedTemplate = TEMPLATES[template as keyof typeof TEMPLATES]\n\n try {\n // Clone template from GitHub\n const success = await cloneTemplate(selectedTemplate.packagePath, targetDir)\n if (!success) {\n console.error(red('Failed to clone template'))\n process.exit(1)\n }\n const latestVersion = await getLatestTownsProtocolVersion()\n // Replace workspace dependencies in package.json and other files\n const replacements = new Map([\n ['workspace:\\\\^', `^${latestVersion}`],\n ['workspace:\\\\*', `^${latestVersion}`],\n ])\n\n // Apply replacements to all relevant files\n applyReplacements(targetDir, replacements)\n\n const packageJsonPath = path.join(targetDir, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n const content = fs.readFileSync(packageJsonPath, 'utf-8')\n const edits = [\n jsonc.modify(content, ['name'], projectName, {}),\n jsonc.modify(content, ['version'], '0.0.1', {}),\n ]\n\n let modifiedContent = jsonc.applyEdits(content, edits.flat())\n\n const parsed = jsonc.parse(modifiedContent) as PackageJson\n delete parsed.private\n\n modifiedContent = JSON.stringify(parsed, null, 2)\n fs.writeFileSync(packageJsonPath, modifiedContent)\n }\n\n // Install skills\n console.log(cyan('Installing Towns Agent Skills...'))\n try {\n const skillSuccess = await installTownsSkills(targetDir)\n if (skillSuccess) {\n console.log(green('✓'), 'Towns Agent Skills installed successfully!')\n } else {\n console.log(\n yellow('⚠'),\n 'Failed to install Towns Agent Skills. You can install them later with:',\n )\n console.log(yellow(` cd ${projectName} && towns-bot install-skill`))\n }\n } catch (error) {\n console.log(\n yellow('⚠'),\n 'Error installing skills:',\n error instanceof Error ? error.message : error,\n )\n console.log(yellow(` You can install them later with: towns-bot install-skill`))\n }\n\n await initializeGitRepository(targetDir)\n printSuccess(projectName, packageManager)\n } catch (error) {\n console.error(red('Error:'), error instanceof Error ? error.message : error)\n console.error(red(`Please delete the directory ${targetDir} and try again.`))\n process.exit(1)\n }\n}\n","import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport { default as spawn } from 'cross-spawn'\nimport picocolors from 'picocolors'\n\nexport type PackageJson = {\n private?: boolean\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n}\n\nexport const getPackageManager = () => {\n if (process.env.npm_config_user_agent) {\n const agent = process.env.npm_config_user_agent\n if (agent.startsWith('yarn')) return 'yarn'\n if (agent.startsWith('npm')) return 'npm'\n if (agent.startsWith('pnpm')) return 'pnpm'\n if (agent.startsWith('bun')) return 'bun'\n }\n // Default to npm if no user agent is found\n return 'npm'\n}\n\nexport function getInstallCommand(packageManager: string): string {\n switch (packageManager) {\n case 'bun':\n return 'bun install'\n case 'yarn':\n return 'yarn'\n case 'pnpm':\n return 'pnpm install'\n default:\n return 'npm install'\n }\n}\n\nexport function getRunCommand(packageManager: string, script: string): string {\n switch (packageManager) {\n case 'bun':\n return `bun run ${script}`\n case 'yarn':\n return `yarn ${script}`\n case 'pnpm':\n return `pnpm ${script}`\n default:\n return `npm run ${script}`\n }\n}\n\nexport function getDlxCommand(packageManager: string): string {\n switch (packageManager) {\n case 'bun':\n return 'bunx'\n case 'yarn':\n return 'yarn dlx'\n case 'pnpm':\n return 'pnpm dlx'\n default:\n return 'npx'\n }\n}\n\nexport function runCommand(\n command: string,\n args: string[],\n opts: { cwd?: string; silent?: boolean } = { cwd: undefined, silent: false },\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: opts.silent ? 'ignore' : 'inherit',\n cwd: opts.cwd,\n shell: process.platform === 'win32',\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(`Command failed with exit code ${code}`))\n } else {\n resolve()\n }\n })\n\n child.on('error', reject)\n })\n}\n\nexport function runCommandWithOutput(\n command: string,\n args: string[],\n opts: { cwd?: string } = {},\n): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n cwd: opts.cwd,\n shell: process.platform === 'win32',\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString()\n })\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString()\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error(stderr || `Command failed with exit code ${code}`))\n } else {\n resolve(stdout)\n }\n })\n\n child.on('error', reject)\n })\n}\n\nexport async function getLatestTownsProtocolVersion(): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn('npm', ['view', '@towns-protocol/bot', 'version'], {\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n\n let output = ''\n child.stdout?.on('data', (data) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n output += data.toString()\n })\n\n child.on('close', (code) => {\n if (code !== 0) {\n reject(new Error('Failed to fetch latest @towns-protocol/bot version'))\n } else {\n resolve(output.trim())\n }\n })\n\n child.on('error', reject)\n })\n}\n\nexport function copyDirectory(src: string, dest: string, replacements?: Map<string, string>) {\n if (!fs.existsSync(dest)) {\n fs.mkdirSync(dest, { recursive: true })\n }\n\n const entries = fs.readdirSync(src, { withFileTypes: true })\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n\n if (entry.isDirectory()) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {\n continue\n }\n copyDirectory(srcPath, destPath, replacements)\n } else {\n let content = fs.readFileSync(srcPath, 'utf-8')\n\n if (\n replacements &&\n (entry.name === 'package.json' ||\n entry.name.endsWith('.ts') ||\n entry.name.endsWith('.js'))\n ) {\n for (const [search, replace] of replacements) {\n content = content.replace(new RegExp(search, 'g'), replace)\n }\n }\n\n fs.writeFileSync(destPath, content)\n }\n }\n}\n\nexport function getLatestSdkTag(): string | null {\n const tagsResult = spawn.sync(\n 'git',\n ['ls-remote', '--tags', 'https://github.com/towns-protocol/towns.git', 'sdk-*'],\n { encoding: 'utf8' },\n )\n\n if (tagsResult.status !== 0 || !tagsResult.stdout) return null\n\n const tags = tagsResult.stdout\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [_hash, ref] = line.split('\\t')\n const tag = ref.replace('refs/tags/', '').replace(/\\^{}$/, '')\n\n // Extract version numbers from tags like sdk-hash-1.2.3\n const match = tag.match(/^sdk-[0-9a-f]+-(\\d+)\\.(\\d+)\\.(\\d+)$/)\n if (!match) return null\n\n return {\n tag,\n version: [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])],\n }\n })\n .filter(\n (item): item is { tag: string; version: number[] } =>\n item !== null && Array.isArray(item.version) && item.version.length === 3,\n )\n .sort((a, b) => {\n // Compare version numbers\n for (let i = 0; i < 3; i++) {\n if (a.version[i] !== b.version[i]) {\n return b.version[i] - a.version[i]\n }\n }\n return 0\n })\n\n return tags.length > 0 ? tags[0].tag : null\n}\n\nexport async function cloneTemplate(packagePath: string, targetDir: string): Promise<boolean> {\n console.log(picocolors.blue('Cloning template from GitHub...'))\n\n const tempDir = `${targetDir}-temp`\n const fullTemplatePath = `packages/examples/${packagePath}`\n\n // Get latest SDK tag\n const latestSdkTag = getLatestSdkTag()\n if (!latestSdkTag) {\n console.error(picocolors.red('Failed to get latest SDK tag.'))\n return false\n }\n\n // Clone with minimal data to a temporary directory\n const cloneResult = spawn.sync(\n 'git',\n [\n 'clone',\n '--no-checkout',\n '--depth',\n '1',\n '--sparse',\n '--branch',\n latestSdkTag,\n 'https://github.com/towns-protocol/towns.git',\n tempDir,\n ],\n { stdio: 'pipe' },\n )\n if (cloneResult.status !== 0) return false\n\n // Set up sparse checkout for the specific template\n const sparseResult = spawn.sync('git', ['sparse-checkout', 'set', fullTemplatePath], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (sparseResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n // Checkout the content\n const checkoutResult = spawn.sync('git', ['checkout'], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (checkoutResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n // Verify template directory exists\n const sourceDir = path.join(tempDir, fullTemplatePath)\n if (!fs.existsSync(sourceDir)) {\n console.error(picocolors.red(`\\nTemplate directory not found at ${sourceDir}`))\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n // Copy template contents to target directory\n fs.mkdirSync(targetDir, { recursive: true })\n // Use filter to ensure all files (including hidden) are copied\n fs.cpSync(sourceDir, targetDir, {\n recursive: true,\n filter: () => {\n // Copy all files, including hidden ones\n return true\n },\n })\n\n // Clean up temporary directory\n fs.rmSync(tempDir, { recursive: true, force: true })\n\n console.log(picocolors.green('✓'), 'Template cloned successfully!')\n return true\n}\n\nexport function applyReplacements(targetDir: string, replacements: Map<string, string>) {\n function processDirectory(dir: string) {\n const entries = fs.readdirSync(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {\n continue\n }\n processDirectory(fullPath)\n } else {\n let content = fs.readFileSync(fullPath, 'utf-8')\n let modified = false\n\n if (\n entry.name === 'package.json' ||\n entry.name.endsWith('.ts') ||\n entry.name.endsWith('.js')\n ) {\n for (const [search, replace] of replacements) {\n const regex = new RegExp(search, 'g')\n if (regex.test(content)) {\n content = content.replace(regex, replace)\n modified = true\n }\n }\n\n if (modified) {\n fs.writeFileSync(fullPath, content)\n }\n }\n }\n }\n }\n\n processDirectory(targetDir)\n}\n\nexport function printSuccess(projectName: string, packageManager: string) {\n console.log(picocolors.green('✓'), 'Bot project created successfully!')\n console.log()\n console.log('Next steps:')\n console.log(picocolors.cyan(` cd ${projectName}`))\n console.log(picocolors.cyan(` ${getInstallCommand(packageManager)}`))\n console.log('Set up your environment variables:')\n console.log(picocolors.cyan(' cp .env.sample .env'))\n console.log(' Edit .env with your bot credentials')\n console.log('Start your bot:')\n console.log(picocolors.cyan(` ${getRunCommand(packageManager, 'dev')}`))\n}\n\nexport async function initializeGitRepository(targetDir: string): Promise<boolean> {\n try {\n await runCommand('git', ['init'], { cwd: targetDir, silent: true })\n await runCommand('git', ['add', '.'], { cwd: targetDir, silent: true })\n await runCommand('git', ['commit', '-m', 'feat: towns bot scaffolding'], {\n cwd: targetDir,\n silent: true,\n })\n return true\n } catch (error) {\n console.log(\n picocolors.yellow('⚠'),\n 'Failed to initialize git repository:',\n error instanceof Error ? error.message : 'Unknown error',\n )\n console.log(picocolors.yellow(' You can manually initialize git later with: git init'))\n return false\n }\n}\n\nconst TOWNS_SKILL_REPO = 'https://github.com/towns-protocol/skills.git'\nconst AGENTS_SKILL_FOLDERS = ['.claude/skills', '.codex/skills']\n\nexport async function installTownsSkills(projectDir: string): Promise<boolean> {\n const tempDir = `${projectDir}-skills-temp`\n try {\n const cloneResult = spawn.sync(\n 'git',\n ['clone', '--depth', '1', '--filter=blob:none', '--sparse', TOWNS_SKILL_REPO, tempDir],\n { stdio: 'pipe' },\n )\n\n if (cloneResult.status !== 0) {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n }\n return false\n }\n const sparseResult = spawn.sync('git', ['sparse-checkout', 'set', 'skills'], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (sparseResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n const checkoutResult = spawn.sync('git', ['checkout'], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (checkoutResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n const sourceSkillsDir = path.join(tempDir, 'skills')\n if (!fs.existsSync(sourceSkillsDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n\n const skillDirs = fs.readdirSync(sourceSkillsDir, { withFileTypes: true })\n for (const skillFolder of AGENTS_SKILL_FOLDERS) {\n const targetDir = path.join(projectDir, skillFolder)\n\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true })\n }\n\n for (const skillDir of skillDirs) {\n if (skillDir.isDirectory()) {\n const sourcePath = path.join(sourceSkillsDir, skillDir.name)\n const destPath = path.join(targetDir, skillDir.name)\n\n fs.cpSync(sourcePath, destPath, { recursive: true })\n }\n }\n }\n\n fs.rmSync(tempDir, { recursive: true, force: true })\n return true\n } catch (error) {\n console.error(\n picocolors.red('Error installing skills:'),\n error instanceof Error ? error.message : error,\n )\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n }\n return false\n }\n}\n\nexport async function downloadAgentsMd(projectDir: string): Promise<boolean> {\n const tempDir = `${projectDir}-agents-md-temp`\n try {\n const agentsMdPath = 'packages/examples/bot-quickstart/AGENTS.md'\n const latestSdkTag = getLatestSdkTag()\n if (!latestSdkTag) {\n return false\n }\n const cloneResult = spawn.sync(\n 'git',\n [\n 'clone',\n '--no-checkout',\n '--depth',\n '1',\n '--sparse',\n '--branch',\n latestSdkTag,\n 'https://github.com/towns-protocol/towns.git',\n tempDir,\n ],\n { stdio: 'pipe' },\n )\n if (cloneResult.status !== 0) {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n }\n return false\n }\n const sparseResult = spawn.sync('git', ['sparse-checkout', 'set', agentsMdPath], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (sparseResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n const checkoutResult = spawn.sync('git', ['checkout'], {\n stdio: 'pipe',\n cwd: tempDir,\n })\n if (checkoutResult.status !== 0) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n const sourceFile = path.join(tempDir, agentsMdPath)\n if (!fs.existsSync(sourceFile)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n return false\n }\n const destFile = path.join(projectDir, 'AGENTS.md')\n fs.copyFileSync(sourceFile, destFile)\n fs.rmSync(tempDir, { recursive: true, force: true })\n return true\n } catch (error) {\n console.error(\n picocolors.red('Error downloading AGENTS.md:'),\n error instanceof Error ? error.message : error,\n )\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n }\n return false\n }\n}\n","import fs from 'fs'\nimport path from 'path'\nimport { green, red, yellow, cyan } from 'picocolors'\nimport {\n getPackageManager,\n getInstallCommand,\n getDlxCommand,\n runCommand,\n installTownsSkills,\n downloadAgentsMd,\n} from './utils.js'\nimport type { UpdateArgs } from '../parser.js'\n\ninterface PackageJson {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n}\n\ninterface VersionUpdate {\n package: string\n from: string\n to: string\n}\n\nfunction getTownsVersions(packageJson: PackageJson): Record<string, string> {\n const versions: Record<string, string> = {}\n for (const deps of [packageJson.dependencies, packageJson.devDependencies]) {\n if (deps) {\n for (const [pkg, version] of Object.entries(deps)) {\n if (pkg.startsWith('@towns-protocol/')) {\n versions[pkg] = version\n }\n }\n }\n }\n return versions\n}\n\nexport async function update(_argv: UpdateArgs) {\n const packageJsonPath = path.join(process.cwd(), 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n console.error(red('Error: No package.json found in the current directory'))\n console.log(yellow('Please run this command from a Towns Protocol bot project directory'))\n process.exit(1)\n }\n\n const packageManager = getPackageManager()\n const dlxCommand = getDlxCommand(packageManager)\n\n console.log(cyan('Checking for @towns-protocol updates...'))\n\n try {\n const [dlxBin, ...dlxArgs] = dlxCommand.split(' ')\n\n const packageJsonBefore: PackageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n const versionsBefore = getTownsVersions(packageJsonBefore)\n\n await runCommand(\n dlxBin,\n [...dlxArgs, 'npm-check-updates', '-u', '-f', '@towns-protocol/*'],\n {\n silent: true,\n },\n )\n\n const packageJsonAfter: PackageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n const versionsAfter = getTownsVersions(packageJsonAfter)\n\n const updates: VersionUpdate[] = []\n for (const [pkg, newVersion] of Object.entries(versionsAfter)) {\n const oldVersion = versionsBefore[pkg]\n if (oldVersion && oldVersion !== newVersion) {\n updates.push({ package: pkg, from: oldVersion, to: newVersion })\n }\n }\n\n if (updates.length === 0) {\n console.log(green('✓'), 'All @towns-protocol packages are up to date!')\n } else {\n console.log()\n for (const update of updates) {\n console.log(green('✓'), `${update.package} ${update.from} → ${update.to}`)\n }\n\n console.log()\n console.log(cyan(`Installing dependencies with ${packageManager}...`))\n const installCmd = getInstallCommand(packageManager)\n const [installBin, ...installArgs] = installCmd.split(' ')\n await runCommand(installBin, installArgs.length > 0 ? installArgs : [])\n\n console.log()\n console.log(green('✓'), 'Dependencies updated successfully!')\n }\n\n // Check if skills are installed and update them\n const projectDir = process.cwd()\n const claudeSkillsDir = path.join(projectDir, '.claude', 'skills')\n const codexSkillsDir = path.join(projectDir, '.codex', 'skills')\n\n if (fs.existsSync(claudeSkillsDir) || fs.existsSync(codexSkillsDir)) {\n console.log()\n console.log(cyan('Updating Towns Agent Skills...'))\n\n try {\n const skillSuccess = await installTownsSkills(projectDir)\n if (skillSuccess) {\n console.log(green('✓'), 'Towns Agent Skills updated successfully!')\n } else {\n console.log(\n yellow('⚠'),\n 'Failed to update skills. You can reinstall them with: towns-bot install-skill',\n )\n }\n } catch (error) {\n console.log(\n yellow('⚠'),\n 'Error updating skills:',\n error instanceof Error ? error.message : error,\n )\n }\n }\n\n // Download/update AGENTS.md\n if (!_argv.skipAgentsMd) {\n console.log()\n console.log(cyan('Updating AGENTS.md...'))\n\n try {\n const agentsMdSuccess = await downloadAgentsMd(projectDir)\n if (agentsMdSuccess) {\n console.log(green('✓'), 'AGENTS.md updated successfully!')\n } else {\n console.log(\n yellow('⚠'),\n 'Failed to update AGENTS.md. You can update it manually or run update again.',\n )\n }\n } catch (error) {\n console.log(\n yellow('⚠'),\n 'Error updating AGENTS.md:',\n error instanceof Error ? error.message : error,\n )\n }\n }\n } catch {\n console.error(red('Error:'), 'Failed to update dependencies')\n process.exit(1)\n }\n}\n","import { red, cyan, green } from 'picocolors'\nimport type { SkillArgs } from '../parser.js'\nimport { installTownsSkills } from './utils.js'\n\nexport async function skill(_argv: SkillArgs) {\n const cwd = process.cwd()\n await installSkill(cwd)\n}\n\nasync function installSkill(projectDir: string) {\n console.log(cyan('Installing Towns Agent Skills...'))\n\n try {\n const success = await installTownsSkills(projectDir)\n if (success) {\n console.log(green('✓'), 'Towns Agent Skills installed successfully!')\n console.log()\n console.log('Skills have been installed to .claude/skills/ and .codex/skills/')\n console.log('They will be available when you open this project in your AI assistant')\n } else {\n console.error(red('Failed to install Towns Agent Skills'))\n process.exit(1)\n }\n } catch (error) {\n console.error(red('Error:'), error instanceof Error ? error.message : error)\n process.exit(1)\n }\n}\n","import minimist from 'minimist'\n\n// Command-specific argument interfaces\nexport interface BaseArgs {\n _: string[]\n help?: boolean\n}\n\nexport interface InitArgs extends BaseArgs {\n template?: string\n}\n\nexport interface UpdateArgs extends BaseArgs {\n skipAgentsMd?: boolean\n}\n\nexport type SkillArgs = BaseArgs\n\nexport type CommandArgs = InitArgs | UpdateArgs | SkillArgs\n\n// Command configurations for minimist\nconst COMMAND_CONFIGS: Record<string, minimist.Opts> = {\n init: {\n string: ['template'],\n alias: { t: 'template' },\n default: { template: 'quickstart' },\n },\n update: {\n boolean: ['skipAgentsMd'],\n alias: { 'skip-agents-md': 'skipAgentsMd' },\n },\n 'install-skill': {},\n}\n\n/**\n * Parse command line arguments with command-specific configurations\n *\n * This function does a two-pass parse:\n * 1. First parse to identify the command\n * 2. Second parse with command-specific configuration\n *\n * This allows each command to have its own argument parsing rules,\n * preventing issues like hex addresses being converted to numbers.\n */\nexport function parseArgs(args: string[]): CommandArgs {\n // First, do a minimal parse to get the command\n const initial = minimist(args, {\n stopEarly: true,\n boolean: ['help'],\n alias: { h: 'help' },\n })\n\n const command = initial._[0]\n\n // If no command or help requested, return early\n if (!command || initial.help) {\n return initial as BaseArgs\n }\n\n // Get command-specific configuration\n const commandConfig = COMMAND_CONFIGS[command] || {}\n\n // Re-parse with command-specific configuration\n const booleanOptions = Array.isArray(commandConfig.boolean)\n ? ['help', ...commandConfig.boolean]\n : ['help']\n const parsed = minimist(args, {\n ...commandConfig,\n boolean: booleanOptions,\n alias: {\n ...commandConfig.alias,\n h: 'help',\n },\n })\n\n return parsed as CommandArgs\n}\n\n/**\n * Type guard functions for command-specific args\n */\nexport function isInitArgs(args: CommandArgs): args is InitArgs {\n return args._[0] === 'init'\n}\n\nexport function isUpdateArgs(args: CommandArgs): args is UpdateArgs {\n return args._[0] === 'update'\n}\n\nexport function isSkillArgs(args: CommandArgs): args is SkillArgs {\n return args._[0] === 'install-skill'\n}\n"],"mappings":"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","names":["green","red","yellow","cyan","fs","path","resolve","resolve","fs","path","green","red","yellow","cyan","path","fs","red","yellow","cyan","green","update","red","cyan","green","cyan","green","red","red","cyan","yellow","green"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "towns-bot",
|
|
3
3
|
"description": "CLI for creating and managing Towns Protocol bot projects",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.455",
|
|
5
5
|
"author": "Towns Protocol",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "tsup",
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@bufbuild/protobuf": "^2.9.0",
|
|
16
16
|
"@connectrpc/connect-node": "^2.1.0",
|
|
17
|
-
"@towns-protocol/proto": "^0.0.
|
|
18
|
-
"@towns-protocol/sdk": "^0.0.
|
|
19
|
-
"@towns-protocol/utils": "^0.0.
|
|
17
|
+
"@towns-protocol/proto": "^0.0.455",
|
|
18
|
+
"@towns-protocol/sdk": "^0.0.455",
|
|
19
|
+
"@towns-protocol/utils": "^0.0.455",
|
|
20
20
|
"cross-spawn": "^7.0.5",
|
|
21
21
|
"dotenv": "^17.2.3",
|
|
22
22
|
"ethers": "^5.8.0",
|
|
@@ -57,5 +57,5 @@
|
|
|
57
57
|
"publishConfig": {
|
|
58
58
|
"access": "public"
|
|
59
59
|
},
|
|
60
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "9a5d511378b12fca4eb316895e0bbfe137de137b"
|
|
61
61
|
}
|