towns-agent 2.0.4 → 2.0.5

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 CHANGED
@@ -23,8 +23,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
23
23
  ));
24
24
 
25
25
  // src/index.ts
26
- var import_path2 = require("path");
27
- var import_dotenv = require("dotenv");
28
26
  var import_picocolors8 = require("picocolors");
29
27
 
30
28
  // src/modules/init.ts
@@ -87,7 +85,7 @@ function getDlxCommand(packageManager) {
87
85
  }
88
86
  }
89
87
  function runCommand(command, args, opts = { cwd: void 0, silent: false }) {
90
- return new Promise((resolve3, reject) => {
88
+ return new Promise((resolve2, reject) => {
91
89
  const child = (0, import_cross_spawn.default)(command, args, {
92
90
  stdio: opts.silent ? "ignore" : "inherit",
93
91
  cwd: opts.cwd,
@@ -97,14 +95,14 @@ function runCommand(command, args, opts = { cwd: void 0, silent: false }) {
97
95
  if (code !== 0) {
98
96
  reject(new Error(`Command failed with exit code ${code}`));
99
97
  } else {
100
- resolve3();
98
+ resolve2();
101
99
  }
102
100
  });
103
101
  child.on("error", reject);
104
102
  });
105
103
  }
106
104
  async function getLatestTownsProtocolVersion() {
107
- return new Promise((resolve3, reject) => {
105
+ return new Promise((resolve2, reject) => {
108
106
  const child = (0, import_cross_spawn.default)("npm", ["view", "@towns-labs/agent", "version"], {
109
107
  stdio: ["ignore", "pipe", "ignore"]
110
108
  });
@@ -116,7 +114,7 @@ async function getLatestTownsProtocolVersion() {
116
114
  if (code !== 0) {
117
115
  reject(new Error("Failed to fetch latest @towns-labs/agent version"));
118
116
  } else {
119
- resolve3(output.trim());
117
+ resolve2(output.trim());
120
118
  }
121
119
  });
122
120
  child.on("error", reject);
@@ -707,7 +705,7 @@ async function create(argv) {
707
705
  if (!addresses?.accountProxy) {
708
706
  throw new Error(`No accountProxy address found for ${townsConfig.environmentId}/${chainId}`);
709
707
  }
710
- const relayerUrl = process.env.RELAYER_URL ?? "http://127.0.0.1:8787";
708
+ const relayerUrl = townsConfig.services.relayer.url;
711
709
  const relayerClient = (0, import_viem.createPublicClient)({
712
710
  chain: {
713
711
  id: chainId,
@@ -982,6 +980,9 @@ async function promptNotify() {
982
980
  return value;
983
981
  }
984
982
 
983
+ // src/index.ts
984
+ var import_sdk4 = require("@towns-labs/sdk");
985
+
985
986
  // src/parser.ts
986
987
  var import_minimist = __toESM(require("minimist"));
987
988
  var COMMAND_CONFIGS = {
@@ -1050,6 +1051,7 @@ var COMMAND_CONFIGS = {
1050
1051
  function parseArgs(args) {
1051
1052
  const initial = (0, import_minimist.default)(args, {
1052
1053
  stopEarly: true,
1054
+ string: ["env"],
1053
1055
  boolean: ["help"],
1054
1056
  alias: { h: "help" }
1055
1057
  });
@@ -1059,8 +1061,10 @@ function parseArgs(args) {
1059
1061
  }
1060
1062
  const commandConfig = COMMAND_CONFIGS[command] || {};
1061
1063
  const booleanOptions = Array.isArray(commandConfig.boolean) ? ["help", ...commandConfig.boolean] : ["help"];
1064
+ const stringOptions = Array.isArray(commandConfig.string) ? ["env", ...commandConfig.string] : ["env"];
1062
1065
  const parsed = (0, import_minimist.default)(args, {
1063
1066
  ...commandConfig,
1067
+ string: stringOptions,
1064
1068
  boolean: booleanOptions,
1065
1069
  alias: {
1066
1070
  ...commandConfig.alias,
@@ -1089,8 +1093,6 @@ function isSetupArgs(args) {
1089
1093
  }
1090
1094
 
1091
1095
  // src/index.ts
1092
- (0, import_dotenv.config)({ path: (0, import_path2.resolve)(__dirname, "../../generated/deployments/local_dev/.env") });
1093
- (0, import_dotenv.config)({ path: (0, import_path2.resolve)(__dirname, "../../contracts/deployments/envs/local/.env") });
1094
1096
  async function main() {
1095
1097
  const args = parseArgs(process.argv.slice(2));
1096
1098
  const command = args._[0];
@@ -1098,6 +1100,21 @@ async function main() {
1098
1100
  showHelp();
1099
1101
  return;
1100
1102
  }
1103
+ if (args.env) {
1104
+ process.env.RIVER_ENV = args.env;
1105
+ }
1106
+ if (!process.env.RIVER_ENV) {
1107
+ console.error(
1108
+ (0, import_picocolors8.red)("Environment is required. Use --env <local_dev|stage|prod> or set RIVER_ENV.")
1109
+ );
1110
+ process.exit(1);
1111
+ }
1112
+ try {
1113
+ (0, import_sdk4.townsEnv)().makeTownsConfig();
1114
+ } catch {
1115
+ console.error((0, import_picocolors8.red)(`Invalid environment: ${process.env.RIVER_ENV}`));
1116
+ process.exit(1);
1117
+ }
1101
1118
  try {
1102
1119
  switch (command) {
1103
1120
  case "init":
@@ -1172,6 +1189,7 @@ ${(0, import_picocolors8.yellow)("Update Commands Options:")}
1172
1189
  --skip-agents-md Skip updating AGENTS.md file
1173
1190
 
1174
1191
  ${(0, import_picocolors8.yellow)("Global Options:")}
1192
+ --env <name> Environment to use: local_dev, stage, prod
1175
1193
  -h, --help Show this help message
1176
1194
 
1177
1195
  ${(0, import_picocolors8.yellow)("Examples:")}
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/modules/install-skill.ts","../src/modules/create.ts","../src/modules/metadata.ts","../src/modules/setup.ts","../src/parser.ts"],"sourcesContent":["import { resolve } from 'path'\nimport { config as dotenvConfig } from 'dotenv'\nimport { green, red, yellow, cyan } from 'picocolors'\n\n// Load local dev env files (contract addresses, chain IDs, etc.)\ndotenvConfig({ path: resolve(__dirname, '../../generated/deployments/local_dev/.env') })\ndotenvConfig({ path: resolve(__dirname, '../../contracts/deployments/envs/local/.env') })\nimport { init, TEMPLATES, type Template } from './modules/init.js'\nimport { update } from './modules/update.js'\nimport { skill } from './modules/install-skill.js'\nimport { create } from './modules/create.js'\nimport { metadata } from './modules/metadata.js'\nimport { setup } from './modules/setup.js'\nimport {\n parseArgs,\n isInitArgs,\n isUpdateArgs,\n isSkillArgs,\n isCreateArgs,\n isMetadataArgs,\n isSetupArgs,\n} 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 case 'create':\n if (isCreateArgs(args)) {\n await create(args)\n }\n break\n case 'metadata':\n if (isMetadataArgs(args)) {\n await metadata(args)\n }\n break\n case 'setup':\n if (isSetupArgs(args)) {\n await setup(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-agent')} - CLI for creating and managing Towns Protocol agent projects\n\n${yellow('Usage:')}\n towns-agent <command> [options]\n\n${yellow('Commands:')}\n ${green('init')} [project-name] Create a new agent project\n ${green('create')} Create a new bot/app account interactively\n ${green('setup')} <appAddress> Register webhook and notification settings\n ${green('metadata')} <view|update> View or update app metadata\n ${green('update')} Update @towns-labs 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 agent project')}\n towns-agent init my-agent\n towns-agent init my-ai-agent --template quickstart\n\n ${cyan('# Update dependencies')}\n towns-agent 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: 'Agent Quickstart',\n description: 'Simple starter agent with basic commands',\n packagePath: 'agent-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-agent 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 agent 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-agent 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-agent 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 { default as prompts } from 'prompts'\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-labs/agent', '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-labs/agent 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/HereNotThere/chat.git', '@towns-labs/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 @towns-labs/sdk@1.2.3\n const match = tag.match(/^@towns-protocol\\/sdk@(\\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/agent-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\nexport async function promptAuth(): Promise<\n { method: 'privateKey'; value: string } | { method: 'bearerToken'; value: string } | undefined\n> {\n const { method } = await prompts({\n type: 'select',\n name: 'method',\n message: 'Login method',\n choices: [\n { title: 'Bearer Token', value: 'bearerToken' },\n { title: 'Private Key', value: 'privateKey' },\n ],\n })\n if (method === undefined) return undefined\n\n const promptMessage =\n method === 'bearerToken' ? 'Enter your bearer token' : 'Enter your private key'\n\n const { value } = await prompts({\n type: 'password',\n name: 'value',\n message: promptMessage,\n validate: (v: string) => (v.trim() ? true : 'This field is required'),\n })\n if (!value) return undefined\n\n return { method, value }\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-labs/') || 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(dlxBin, [...dlxArgs, 'npm-check-updates', '-u', '-f', '@towns-labs/*'], {\n silent: true,\n })\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 and @towns-labs 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-agent 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 { default as prompts } from 'prompts'\nimport { red } from 'picocolors'\nimport { createPublicClient, http, type Hex } from 'viem'\nimport { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'\nimport { relayerActions } from '@towns-labs/relayer-client'\nimport {\n createApp,\n makeSignerContextFromBearerToken,\n makeSignerContextFromViem,\n townsEnv,\n} from '@towns-labs/sdk'\nimport { getAddressesWithFallback } from '@towns-labs/contracts/deployments'\nimport type { CreateArgs } from '../parser.js'\nimport { promptAuth } from './utils.js'\n\nexport async function create(argv: CreateArgs) {\n let ownerPrivateKey = argv.ownerPrivateKey\n let bearerToken = argv.bearerToken\n\n if (!ownerPrivateKey && !bearerToken) {\n const auth = await promptAuth()\n if (!auth) {\n console.error(red('Authentication is required.'))\n process.exit(1)\n }\n if (auth.method === 'privateKey') {\n ownerPrivateKey = auth.value\n } else {\n bearerToken = auth.value\n }\n }\n\n const username = argv.username ?? (await promptText('Bot username'))\n if (!username) {\n console.error(red('Username is required.'))\n process.exit(1)\n }\n\n const displayName = argv.displayName ?? (await promptText('Bot display name'))\n if (!displayName) {\n console.error(red('Display name is required.'))\n process.exit(1)\n }\n\n const description = argv.description ?? (await promptText('Bot description'))\n if (!description) {\n console.error(red('Description is required.'))\n process.exit(1)\n }\n\n const imageUrl = argv.imageUrl ?? (await promptText('Bot image URL (optional)', true))\n\n const owner = ownerPrivateKey\n ? await makeSignerContextFromViem(\n privateKeyToAccount(ownerPrivateKey as Hex),\n generatePrivateKey(),\n { days: 1 },\n )\n : await makeSignerContextFromBearerToken(bearerToken!)\n\n const townsConfig = townsEnv().makeTownsConfig()\n const chainId = townsConfig.base.chainConfig.chainId\n\n const addresses = getAddressesWithFallback(townsConfig.environmentId, chainId)\n if (!addresses?.accountProxy) {\n throw new Error(`No accountProxy address found for ${townsConfig.environmentId}/${chainId}`)\n }\n\n const relayerUrl = process.env.RELAYER_URL ?? 'http://127.0.0.1:8787'\n const relayerClient = createPublicClient({\n chain: {\n id: chainId,\n name: 'Local',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: { default: { http: [townsConfig.base.rpcUrl] } },\n },\n transport: http(townsConfig.base.rpcUrl),\n }).extend(relayerActions({ relayerUrl }))\n\n const result = await createApp({\n owner,\n metadata: {\n username,\n displayName,\n description,\n imageUrl: imageUrl || '',\n },\n relayerClient,\n accountProxy: addresses.accountProxy,\n townsConfig,\n })\n\n console.log(`APP_ADDRESS=${result.appAddress}`)\n console.log(`APP_PRIVATE_KEY=${result.appPrivateKey}`)\n console.log(`APP_PRIVATE_DATA=${result.appPrivateData}`)\n console.log(`JWT_SECRET=${result.jwtSecretBase64}`)\n\n process.exit(0)\n}\n\nasync function promptText(message: string, optional = false): Promise<string | undefined> {\n const { value }: { value: string | undefined } = await prompts({\n type: 'text',\n name: 'value',\n message,\n validate: optional\n ? undefined\n : (v: string) => (v.trim() ? true : 'This field is required'),\n })\n return value\n}\n","import { default as prompts } from 'prompts'\nimport { red, dim } from 'picocolors'\nimport { type Hex } from 'viem'\nimport { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'\nimport {\n AppRegistryService,\n makeAppRegistryRpcClient,\n makeSignerContextFromBearerToken,\n makeSignerContextFromViem,\n townsEnv,\n} from '@towns-labs/sdk'\nimport { bin_fromHexString } from '@towns-labs/utils'\nimport type { MetadataArgs } from '../parser.js'\nimport { promptAuth } from './utils.js'\n\nconst FIELD_DEFS = [\n { flag: 'username', label: 'USERNAME', mask: 'username', prompt: 'Username' },\n { flag: 'displayName', label: 'DISPLAY_NAME', mask: 'display_name', prompt: 'Display name' },\n { flag: 'description', label: 'DESCRIPTION', mask: 'description', prompt: 'Description' },\n { flag: 'imageUrl', label: 'IMAGE_URL', mask: 'image_url', prompt: 'Image URL' },\n { flag: 'avatarUrl', label: 'AVATAR_URL', mask: 'avatar_url', prompt: 'Avatar URL' },\n {\n flag: 'externalUrl',\n label: 'EXTERNAL_URL',\n mask: 'external_url',\n prompt: 'External URL',\n },\n { flag: 'motto', label: 'MOTTO', mask: 'motto', prompt: 'Motto' },\n] as const\n\ntype FieldFlag = (typeof FIELD_DEFS)[number]['flag']\n\nexport async function metadata(argv: MetadataArgs) {\n const subcommand = argv._[1]\n const appAddress = argv._[2]\n\n if (!subcommand || !['view', 'update'].includes(subcommand)) {\n console.error(red('Usage: towns-agent metadata <view|update> <appAddress> [options]'))\n process.exit(1)\n }\n\n if (!appAddress) {\n console.error(red('App address is required.'))\n process.exit(1)\n }\n\n const env = townsEnv()\n const townsConfig = env.makeTownsConfig()\n const appRegistryUrl = env.getAppRegistryUrl(townsConfig.environmentId)\n const appId = bin_fromHexString(appAddress)\n\n if (subcommand === 'view') {\n const client = makeAppRegistryRpcClient(appRegistryUrl, '')\n const { metadata: meta } = await client.getAppMetadata({ appId })\n\n if (!meta) {\n console.error(red('No metadata found for this app.'))\n process.exit(1)\n }\n\n console.log()\n for (const field of FIELD_DEFS) {\n const value = meta[field.flag] ?? ''\n console.log(` ${dim(field.prompt.padEnd(14))} ${value || dim('—')}`)\n }\n console.log()\n\n process.exit(0)\n }\n\n // UPDATE — auth required\n let ownerPrivateKey = argv.ownerPrivateKey\n let bearerToken = ownerPrivateKey ? undefined : argv.bearerToken\n\n if (!ownerPrivateKey && !bearerToken) {\n const auth = await promptAuth()\n if (!auth) {\n console.error(red('Authentication is required for update.'))\n process.exit(1)\n }\n if (auth.method === 'privateKey') {\n ownerPrivateKey = auth.value\n } else {\n bearerToken = auth.value\n }\n }\n\n const signerContext = ownerPrivateKey\n ? await makeSignerContextFromViem(\n privateKeyToAccount(ownerPrivateKey as Hex),\n generatePrivateKey(),\n { days: 1 },\n )\n : await makeSignerContextFromBearerToken(bearerToken!)\n\n const { appRegistryRpcClient } = await AppRegistryService.authenticate(\n signerContext,\n appRegistryUrl,\n )\n\n // Determine which fields to update\n const hasAnyFlag = FIELD_DEFS.some((f) => argv[f.flag] !== undefined)\n\n let values: Record<FieldFlag, string>\n\n if (hasAnyFlag) {\n // Non-interactive: use only flags that were provided\n values = {} as Record<FieldFlag, string>\n for (const field of FIELD_DEFS) {\n if (argv[field.flag] !== undefined) {\n values[field.flag] = argv[field.flag]!\n }\n }\n } else {\n // Interactive: fetch current values and prompt for each\n const unauthClient = makeAppRegistryRpcClient(appRegistryUrl, '')\n const { metadata: current } = await unauthClient.getAppMetadata({ appId })\n\n values = {} as Record<FieldFlag, string>\n for (const field of FIELD_DEFS) {\n const { value } = await prompts({\n type: 'text',\n name: 'value',\n message: field.prompt,\n initial: current?.[field.flag] ?? '',\n })\n if (value === undefined) {\n // User cancelled\n process.exit(1)\n }\n if (value !== (current?.[field.flag] ?? '')) {\n values[field.flag] = value\n }\n }\n\n if (Object.keys(values).length === 0) {\n console.log('No changes.')\n process.exit(0)\n }\n }\n\n const updateMask: string[] = []\n const metadataUpdate: Record<string, string> = {}\n\n for (const field of FIELD_DEFS) {\n if (values[field.flag] !== undefined) {\n updateMask.push(field.mask)\n metadataUpdate[field.flag] = values[field.flag]\n }\n }\n\n await appRegistryRpcClient.updateAppMetadata({\n appId,\n updateMask,\n metadata: metadataUpdate,\n })\n\n for (const field of FIELD_DEFS) {\n if (values[field.flag] !== undefined) {\n console.log(` ${dim(field.prompt.padEnd(14))} ${values[field.flag]}`)\n }\n }\n console.log()\n\n process.exit(0)\n}\n","import { default as prompts } from 'prompts'\nimport { red, dim, green } from 'picocolors'\nimport { type Hex } from 'viem'\nimport { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'\nimport {\n AppRegistryService,\n makeSignerContextFromBearerToken,\n makeSignerContextFromViem,\n townsEnv,\n} from '@towns-labs/sdk'\nimport { ForwardSettingValue } from '@towns-labs/proto'\nimport { bin_fromHexString } from '@towns-labs/utils'\nimport type { SetupArgs } from '../parser.js'\nimport { promptAuth } from './utils.js'\n\nconst NOTIFY_MAP: Record<string, ForwardSettingValue> = {\n ALL: ForwardSettingValue.FORWARD_SETTING_ALL_MESSAGES,\n NONE: ForwardSettingValue.FORWARD_SETTING_NO_MESSAGES,\n MENTION_REPLY_REACTION: ForwardSettingValue.FORWARD_SETTING_MENTIONS_REPLIES_REACTIONS,\n}\n\nconst NOTIFY_LABELS: Record<string, string> = {\n ALL: 'All messages',\n MENTION_REPLY_REACTION: 'Mentions, replies & reactions',\n NONE: 'No messages',\n}\n\nexport async function setup(argv: SetupArgs) {\n const appAddress = argv._[1]\n if (!appAddress) {\n console.error(red('Usage: towns-agent setup <appAddress> [options]'))\n process.exit(1)\n }\n\n // Auth\n let ownerPrivateKey = argv.ownerPrivateKey\n let bearerToken = argv.bearerToken\n\n if (!ownerPrivateKey && !bearerToken) {\n const auth = await promptAuth()\n if (!auth) {\n console.error(red('Authentication is required.'))\n process.exit(1)\n }\n if (auth.method === 'privateKey') {\n ownerPrivateKey = auth.value\n } else {\n bearerToken = auth.value\n }\n }\n\n // Webhook URL\n const webhookUrl = argv.webhookUrl ?? (await promptWebhookUrl())\n if (!webhookUrl) {\n console.error(red('Webhook URL is required.'))\n process.exit(1)\n }\n\n // Notify setting\n let notifyKey: string\n if (argv.notify) {\n notifyKey = argv.notify.toUpperCase()\n } else if (argv.webhookUrl) {\n // Non-interactive without explicit --notify: default to ALL\n notifyKey = 'ALL'\n } else {\n notifyKey = await promptNotify()\n }\n\n const forwardSetting = NOTIFY_MAP[notifyKey]\n if (forwardSetting === undefined) {\n console.error(\n red(`Invalid --notify value: ${notifyKey}. Use ALL, NONE, or MENTION_REPLY_REACTION.`),\n )\n process.exit(1)\n }\n\n const env = townsEnv()\n const townsConfig = env.makeTownsConfig()\n const appRegistryUrl = env.getAppRegistryUrl(townsConfig.environmentId)\n const appId = bin_fromHexString(appAddress)\n\n const signerContext = ownerPrivateKey\n ? await makeSignerContextFromViem(\n privateKeyToAccount(ownerPrivateKey as Hex),\n generatePrivateKey(),\n { days: 1 },\n )\n : await makeSignerContextFromBearerToken(bearerToken!)\n\n const { appRegistryRpcClient } = await AppRegistryService.authenticate(\n signerContext,\n appRegistryUrl,\n )\n\n await appRegistryRpcClient.registerWebhook({ appId, webhookUrl })\n await appRegistryRpcClient.setAppSettings({\n appId,\n settings: { forwardSetting },\n })\n\n console.log()\n console.log(green('Setup complete!'))\n console.log()\n console.log(` ${dim('Webhook URL'.padEnd(14))} ${webhookUrl}`)\n console.log(` ${dim('Notify'.padEnd(14))} ${NOTIFY_LABELS[notifyKey] ?? notifyKey}`)\n console.log()\n\n process.exit(0)\n}\n\nasync function promptWebhookUrl(): Promise<string | undefined> {\n const { value }: { value: string | undefined } = await prompts({\n type: 'text',\n name: 'value',\n message: 'Webhook URL',\n validate: (v: string) => (v.trim() ? true : 'Webhook URL is required'),\n })\n return value\n}\n\nasync function promptNotify(): Promise<string> {\n const { value }: { value: string | undefined } = await prompts({\n type: 'select',\n name: 'value',\n message: 'Notify setting',\n choices: [\n { title: 'All messages', value: 'ALL' },\n { title: 'Mentions, replies & reactions', value: 'MENTION_REPLY_REACTION' },\n { title: 'No messages', value: 'NONE' },\n ],\n initial: 0,\n })\n if (value === undefined) {\n process.exit(1)\n }\n return value\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 interface CreateArgs extends BaseArgs {\n bearerToken?: string\n ownerPrivateKey?: string\n username?: string\n displayName?: string\n description?: string\n imageUrl?: string\n}\n\nexport interface MetadataArgs extends BaseArgs {\n ownerPrivateKey?: string\n bearerToken?: string\n username?: string\n displayName?: string\n description?: string\n imageUrl?: string\n avatarUrl?: string\n externalUrl?: string\n motto?: string\n}\n\nexport interface SetupArgs extends BaseArgs {\n ownerPrivateKey?: string\n bearerToken?: string\n webhookUrl?: string\n notify?: string\n}\n\nexport type SkillArgs = BaseArgs\n\nexport type CommandArgs = InitArgs | UpdateArgs | SkillArgs | CreateArgs | MetadataArgs | SetupArgs\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 create: {\n string: [\n 'bearerToken',\n 'ownerPrivateKey',\n 'username',\n 'displayName',\n 'description',\n 'imageUrl',\n ],\n alias: {\n b: 'bearerToken',\n k: 'ownerPrivateKey',\n u: 'username',\n n: 'displayName',\n d: 'description',\n i: 'imageUrl',\n },\n },\n metadata: {\n string: [\n '_',\n 'ownerPrivateKey',\n 'bearerToken',\n 'username',\n 'displayName',\n 'description',\n 'imageUrl',\n 'avatarUrl',\n 'externalUrl',\n 'motto',\n ],\n alias: {\n k: 'ownerPrivateKey',\n b: 'bearerToken',\n u: 'username',\n n: 'displayName',\n d: 'description',\n i: 'imageUrl',\n a: 'avatarUrl',\n e: 'externalUrl',\n m: 'motto',\n },\n },\n setup: {\n string: ['_', 'ownerPrivateKey', 'bearerToken', 'webhookUrl', 'notify'],\n alias: {\n k: 'ownerPrivateKey',\n b: 'bearerToken',\n w: 'webhookUrl',\n },\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\nexport function isSkillArgs(args: CommandArgs): args is SkillArgs {\n return args._[0] === 'install-skill'\n}\n\nexport function isCreateArgs(args: CommandArgs): args is CreateArgs {\n return args._[0] === 'create'\n}\n\nexport function isMetadataArgs(args: CommandArgs): args is MetadataArgs {\n return args._[0] === 'metadata'\n}\n\nexport function isSetupArgs(args: CommandArgs): args is SetupArgs {\n return args._[0] === 'setup'\n}\n"],"mappings":"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","names":["import_path","import_picocolors","fs","path","import_prompts","import_picocolors","resolve","spawn","resolve","spawn","spawn","picocolors","prompts","prompts","import_picocolors","path","fs","update","import_picocolors","import_prompts","import_picocolors","prompts","import_prompts","import_picocolors","import_accounts","import_sdk","import_utils","prompts","import_prompts","import_picocolors","import_accounts","import_sdk","import_utils","prompts","minimist","dotenvConfig"]}
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/modules/create.ts","../src/modules/metadata.ts","../src/modules/setup.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 { create } from './modules/create.js'\nimport { metadata } from './modules/metadata.js'\nimport { setup } from './modules/setup.js'\nimport { townsEnv } from '@towns-labs/sdk'\nimport {\n parseArgs,\n isInitArgs,\n isUpdateArgs,\n isSkillArgs,\n isCreateArgs,\n isMetadataArgs,\n isSetupArgs,\n} 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 // Set RIVER_ENV from --env flag, fall back to process.env.RIVER_ENV\n if (args.env) {\n process.env.RIVER_ENV = args.env\n }\n if (!process.env.RIVER_ENV) {\n console.error(\n red('Environment is required. Use --env <local_dev|stage|prod> or set RIVER_ENV.'),\n )\n process.exit(1)\n }\n try {\n townsEnv().makeTownsConfig()\n } catch {\n console.error(red(`Invalid environment: ${process.env.RIVER_ENV}`))\n process.exit(1)\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 case 'create':\n if (isCreateArgs(args)) {\n await create(args)\n }\n break\n case 'metadata':\n if (isMetadataArgs(args)) {\n await metadata(args)\n }\n break\n case 'setup':\n if (isSetupArgs(args)) {\n await setup(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-agent')} - CLI for creating and managing Towns Protocol agent projects\n\n${yellow('Usage:')}\n towns-agent <command> [options]\n\n${yellow('Commands:')}\n ${green('init')} [project-name] Create a new agent project\n ${green('create')} Create a new bot/app account interactively\n ${green('setup')} <appAddress> Register webhook and notification settings\n ${green('metadata')} <view|update> View or update app metadata\n ${green('update')} Update @towns-labs 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 --env <name> Environment to use: local_dev, stage, prod\n -h, --help Show this help message\n\n${yellow('Examples:')}\n ${cyan('# Create a new agent project')}\n towns-agent init my-agent\n towns-agent init my-ai-agent --template quickstart\n\n ${cyan('# Update dependencies')}\n towns-agent 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: 'Agent Quickstart',\n description: 'Simple starter agent with basic commands',\n packagePath: 'agent-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-agent 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 agent 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-agent 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-agent 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 { default as prompts } from 'prompts'\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-labs/agent', '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-labs/agent 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/HereNotThere/chat.git', '@towns-labs/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 @towns-labs/sdk@1.2.3\n const match = tag.match(/^@towns-protocol\\/sdk@(\\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/agent-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\nexport async function promptAuth(): Promise<\n { method: 'privateKey'; value: string } | { method: 'bearerToken'; value: string } | undefined\n> {\n const { method } = await prompts({\n type: 'select',\n name: 'method',\n message: 'Login method',\n choices: [\n { title: 'Bearer Token', value: 'bearerToken' },\n { title: 'Private Key', value: 'privateKey' },\n ],\n })\n if (method === undefined) return undefined\n\n const promptMessage =\n method === 'bearerToken' ? 'Enter your bearer token' : 'Enter your private key'\n\n const { value } = await prompts({\n type: 'password',\n name: 'value',\n message: promptMessage,\n validate: (v: string) => (v.trim() ? true : 'This field is required'),\n })\n if (!value) return undefined\n\n return { method, value }\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-labs/') || 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(dlxBin, [...dlxArgs, 'npm-check-updates', '-u', '-f', '@towns-labs/*'], {\n silent: true,\n })\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 and @towns-labs 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-agent 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 { default as prompts } from 'prompts'\nimport { red } from 'picocolors'\nimport { createPublicClient, http, type Hex } from 'viem'\nimport { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'\nimport { relayerActions } from '@towns-labs/relayer-client'\nimport {\n createApp,\n makeSignerContextFromBearerToken,\n makeSignerContextFromViem,\n townsEnv,\n} from '@towns-labs/sdk'\nimport { getAddressesWithFallback } from '@towns-labs/contracts/deployments'\nimport type { CreateArgs } from '../parser.js'\nimport { promptAuth } from './utils.js'\n\nexport async function create(argv: CreateArgs) {\n let ownerPrivateKey = argv.ownerPrivateKey\n let bearerToken = argv.bearerToken\n\n if (!ownerPrivateKey && !bearerToken) {\n const auth = await promptAuth()\n if (!auth) {\n console.error(red('Authentication is required.'))\n process.exit(1)\n }\n if (auth.method === 'privateKey') {\n ownerPrivateKey = auth.value\n } else {\n bearerToken = auth.value\n }\n }\n\n const username = argv.username ?? (await promptText('Bot username'))\n if (!username) {\n console.error(red('Username is required.'))\n process.exit(1)\n }\n\n const displayName = argv.displayName ?? (await promptText('Bot display name'))\n if (!displayName) {\n console.error(red('Display name is required.'))\n process.exit(1)\n }\n\n const description = argv.description ?? (await promptText('Bot description'))\n if (!description) {\n console.error(red('Description is required.'))\n process.exit(1)\n }\n\n const imageUrl = argv.imageUrl ?? (await promptText('Bot image URL (optional)', true))\n\n const owner = ownerPrivateKey\n ? await makeSignerContextFromViem(\n privateKeyToAccount(ownerPrivateKey as Hex),\n generatePrivateKey(),\n { days: 1 },\n )\n : await makeSignerContextFromBearerToken(bearerToken!)\n\n const townsConfig = townsEnv().makeTownsConfig()\n const chainId = townsConfig.base.chainConfig.chainId\n\n const addresses = getAddressesWithFallback(townsConfig.environmentId, chainId)\n if (!addresses?.accountProxy) {\n throw new Error(`No accountProxy address found for ${townsConfig.environmentId}/${chainId}`)\n }\n\n const relayerUrl = townsConfig.services.relayer.url\n const relayerClient = createPublicClient({\n chain: {\n id: chainId,\n name: 'Local',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: { default: { http: [townsConfig.base.rpcUrl] } },\n },\n transport: http(townsConfig.base.rpcUrl),\n }).extend(relayerActions({ relayerUrl }))\n\n const result = await createApp({\n owner,\n metadata: {\n username,\n displayName,\n description,\n imageUrl: imageUrl || '',\n },\n relayerClient,\n accountProxy: addresses.accountProxy,\n townsConfig,\n })\n\n console.log(`APP_ADDRESS=${result.appAddress}`)\n console.log(`APP_PRIVATE_KEY=${result.appPrivateKey}`)\n console.log(`APP_PRIVATE_DATA=${result.appPrivateData}`)\n console.log(`JWT_SECRET=${result.jwtSecretBase64}`)\n\n process.exit(0)\n}\n\nasync function promptText(message: string, optional = false): Promise<string | undefined> {\n const { value }: { value: string | undefined } = await prompts({\n type: 'text',\n name: 'value',\n message,\n validate: optional\n ? undefined\n : (v: string) => (v.trim() ? true : 'This field is required'),\n })\n return value\n}\n","import { default as prompts } from 'prompts'\nimport { red, dim } from 'picocolors'\nimport { type Hex } from 'viem'\nimport { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'\nimport {\n AppRegistryService,\n makeAppRegistryRpcClient,\n makeSignerContextFromBearerToken,\n makeSignerContextFromViem,\n townsEnv,\n} from '@towns-labs/sdk'\nimport { bin_fromHexString } from '@towns-labs/utils'\nimport type { MetadataArgs } from '../parser.js'\nimport { promptAuth } from './utils.js'\n\nconst FIELD_DEFS = [\n { flag: 'username', label: 'USERNAME', mask: 'username', prompt: 'Username' },\n { flag: 'displayName', label: 'DISPLAY_NAME', mask: 'display_name', prompt: 'Display name' },\n { flag: 'description', label: 'DESCRIPTION', mask: 'description', prompt: 'Description' },\n { flag: 'imageUrl', label: 'IMAGE_URL', mask: 'image_url', prompt: 'Image URL' },\n { flag: 'avatarUrl', label: 'AVATAR_URL', mask: 'avatar_url', prompt: 'Avatar URL' },\n {\n flag: 'externalUrl',\n label: 'EXTERNAL_URL',\n mask: 'external_url',\n prompt: 'External URL',\n },\n { flag: 'motto', label: 'MOTTO', mask: 'motto', prompt: 'Motto' },\n] as const\n\ntype FieldFlag = (typeof FIELD_DEFS)[number]['flag']\n\nexport async function metadata(argv: MetadataArgs) {\n const subcommand = argv._[1]\n const appAddress = argv._[2]\n\n if (!subcommand || !['view', 'update'].includes(subcommand)) {\n console.error(red('Usage: towns-agent metadata <view|update> <appAddress> [options]'))\n process.exit(1)\n }\n\n if (!appAddress) {\n console.error(red('App address is required.'))\n process.exit(1)\n }\n\n const env = townsEnv()\n const townsConfig = env.makeTownsConfig()\n const appRegistryUrl = env.getAppRegistryUrl(townsConfig.environmentId)\n const appId = bin_fromHexString(appAddress)\n\n if (subcommand === 'view') {\n const client = makeAppRegistryRpcClient(appRegistryUrl, '')\n const { metadata: meta } = await client.getAppMetadata({ appId })\n\n if (!meta) {\n console.error(red('No metadata found for this app.'))\n process.exit(1)\n }\n\n console.log()\n for (const field of FIELD_DEFS) {\n const value = meta[field.flag] ?? ''\n console.log(` ${dim(field.prompt.padEnd(14))} ${value || dim('—')}`)\n }\n console.log()\n\n process.exit(0)\n }\n\n // UPDATE — auth required\n let ownerPrivateKey = argv.ownerPrivateKey\n let bearerToken = ownerPrivateKey ? undefined : argv.bearerToken\n\n if (!ownerPrivateKey && !bearerToken) {\n const auth = await promptAuth()\n if (!auth) {\n console.error(red('Authentication is required for update.'))\n process.exit(1)\n }\n if (auth.method === 'privateKey') {\n ownerPrivateKey = auth.value\n } else {\n bearerToken = auth.value\n }\n }\n\n const signerContext = ownerPrivateKey\n ? await makeSignerContextFromViem(\n privateKeyToAccount(ownerPrivateKey as Hex),\n generatePrivateKey(),\n { days: 1 },\n )\n : await makeSignerContextFromBearerToken(bearerToken!)\n\n const { appRegistryRpcClient } = await AppRegistryService.authenticate(\n signerContext,\n appRegistryUrl,\n )\n\n // Determine which fields to update\n const hasAnyFlag = FIELD_DEFS.some((f) => argv[f.flag] !== undefined)\n\n let values: Record<FieldFlag, string>\n\n if (hasAnyFlag) {\n // Non-interactive: use only flags that were provided\n values = {} as Record<FieldFlag, string>\n for (const field of FIELD_DEFS) {\n if (argv[field.flag] !== undefined) {\n values[field.flag] = argv[field.flag]!\n }\n }\n } else {\n // Interactive: fetch current values and prompt for each\n const unauthClient = makeAppRegistryRpcClient(appRegistryUrl, '')\n const { metadata: current } = await unauthClient.getAppMetadata({ appId })\n\n values = {} as Record<FieldFlag, string>\n for (const field of FIELD_DEFS) {\n const { value } = await prompts({\n type: 'text',\n name: 'value',\n message: field.prompt,\n initial: current?.[field.flag] ?? '',\n })\n if (value === undefined) {\n // User cancelled\n process.exit(1)\n }\n if (value !== (current?.[field.flag] ?? '')) {\n values[field.flag] = value\n }\n }\n\n if (Object.keys(values).length === 0) {\n console.log('No changes.')\n process.exit(0)\n }\n }\n\n const updateMask: string[] = []\n const metadataUpdate: Record<string, string> = {}\n\n for (const field of FIELD_DEFS) {\n if (values[field.flag] !== undefined) {\n updateMask.push(field.mask)\n metadataUpdate[field.flag] = values[field.flag]\n }\n }\n\n await appRegistryRpcClient.updateAppMetadata({\n appId,\n updateMask,\n metadata: metadataUpdate,\n })\n\n for (const field of FIELD_DEFS) {\n if (values[field.flag] !== undefined) {\n console.log(` ${dim(field.prompt.padEnd(14))} ${values[field.flag]}`)\n }\n }\n console.log()\n\n process.exit(0)\n}\n","import { default as prompts } from 'prompts'\nimport { red, dim, green } from 'picocolors'\nimport { type Hex } from 'viem'\nimport { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'\nimport {\n AppRegistryService,\n makeSignerContextFromBearerToken,\n makeSignerContextFromViem,\n townsEnv,\n} from '@towns-labs/sdk'\nimport { ForwardSettingValue } from '@towns-labs/proto'\nimport { bin_fromHexString } from '@towns-labs/utils'\nimport type { SetupArgs } from '../parser.js'\nimport { promptAuth } from './utils.js'\n\nconst NOTIFY_MAP: Record<string, ForwardSettingValue> = {\n ALL: ForwardSettingValue.FORWARD_SETTING_ALL_MESSAGES,\n NONE: ForwardSettingValue.FORWARD_SETTING_NO_MESSAGES,\n MENTION_REPLY_REACTION: ForwardSettingValue.FORWARD_SETTING_MENTIONS_REPLIES_REACTIONS,\n}\n\nconst NOTIFY_LABELS: Record<string, string> = {\n ALL: 'All messages',\n MENTION_REPLY_REACTION: 'Mentions, replies & reactions',\n NONE: 'No messages',\n}\n\nexport async function setup(argv: SetupArgs) {\n const appAddress = argv._[1]\n if (!appAddress) {\n console.error(red('Usage: towns-agent setup <appAddress> [options]'))\n process.exit(1)\n }\n\n // Auth\n let ownerPrivateKey = argv.ownerPrivateKey\n let bearerToken = argv.bearerToken\n\n if (!ownerPrivateKey && !bearerToken) {\n const auth = await promptAuth()\n if (!auth) {\n console.error(red('Authentication is required.'))\n process.exit(1)\n }\n if (auth.method === 'privateKey') {\n ownerPrivateKey = auth.value\n } else {\n bearerToken = auth.value\n }\n }\n\n // Webhook URL\n const webhookUrl = argv.webhookUrl ?? (await promptWebhookUrl())\n if (!webhookUrl) {\n console.error(red('Webhook URL is required.'))\n process.exit(1)\n }\n\n // Notify setting\n let notifyKey: string\n if (argv.notify) {\n notifyKey = argv.notify.toUpperCase()\n } else if (argv.webhookUrl) {\n // Non-interactive without explicit --notify: default to ALL\n notifyKey = 'ALL'\n } else {\n notifyKey = await promptNotify()\n }\n\n const forwardSetting = NOTIFY_MAP[notifyKey]\n if (forwardSetting === undefined) {\n console.error(\n red(`Invalid --notify value: ${notifyKey}. Use ALL, NONE, or MENTION_REPLY_REACTION.`),\n )\n process.exit(1)\n }\n\n const env = townsEnv()\n const townsConfig = env.makeTownsConfig()\n const appRegistryUrl = env.getAppRegistryUrl(townsConfig.environmentId)\n const appId = bin_fromHexString(appAddress)\n\n const signerContext = ownerPrivateKey\n ? await makeSignerContextFromViem(\n privateKeyToAccount(ownerPrivateKey as Hex),\n generatePrivateKey(),\n { days: 1 },\n )\n : await makeSignerContextFromBearerToken(bearerToken!)\n\n const { appRegistryRpcClient } = await AppRegistryService.authenticate(\n signerContext,\n appRegistryUrl,\n )\n\n await appRegistryRpcClient.registerWebhook({ appId, webhookUrl })\n await appRegistryRpcClient.setAppSettings({\n appId,\n settings: { forwardSetting },\n })\n\n console.log()\n console.log(green('Setup complete!'))\n console.log()\n console.log(` ${dim('Webhook URL'.padEnd(14))} ${webhookUrl}`)\n console.log(` ${dim('Notify'.padEnd(14))} ${NOTIFY_LABELS[notifyKey] ?? notifyKey}`)\n console.log()\n\n process.exit(0)\n}\n\nasync function promptWebhookUrl(): Promise<string | undefined> {\n const { value }: { value: string | undefined } = await prompts({\n type: 'text',\n name: 'value',\n message: 'Webhook URL',\n validate: (v: string) => (v.trim() ? true : 'Webhook URL is required'),\n })\n return value\n}\n\nasync function promptNotify(): Promise<string> {\n const { value }: { value: string | undefined } = await prompts({\n type: 'select',\n name: 'value',\n message: 'Notify setting',\n choices: [\n { title: 'All messages', value: 'ALL' },\n { title: 'Mentions, replies & reactions', value: 'MENTION_REPLY_REACTION' },\n { title: 'No messages', value: 'NONE' },\n ],\n initial: 0,\n })\n if (value === undefined) {\n process.exit(1)\n }\n return value\n}\n","import minimist from 'minimist'\n\n// Command-specific argument interfaces\nexport interface BaseArgs {\n _: string[]\n help?: boolean\n env?: string\n}\n\nexport interface InitArgs extends BaseArgs {\n template?: string\n}\n\nexport interface UpdateArgs extends BaseArgs {\n skipAgentsMd?: boolean\n}\n\nexport interface CreateArgs extends BaseArgs {\n bearerToken?: string\n ownerPrivateKey?: string\n username?: string\n displayName?: string\n description?: string\n imageUrl?: string\n}\n\nexport interface MetadataArgs extends BaseArgs {\n ownerPrivateKey?: string\n bearerToken?: string\n username?: string\n displayName?: string\n description?: string\n imageUrl?: string\n avatarUrl?: string\n externalUrl?: string\n motto?: string\n}\n\nexport interface SetupArgs extends BaseArgs {\n ownerPrivateKey?: string\n bearerToken?: string\n webhookUrl?: string\n notify?: string\n}\n\nexport type SkillArgs = BaseArgs\n\nexport type CommandArgs = InitArgs | UpdateArgs | SkillArgs | CreateArgs | MetadataArgs | SetupArgs\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 create: {\n string: [\n 'bearerToken',\n 'ownerPrivateKey',\n 'username',\n 'displayName',\n 'description',\n 'imageUrl',\n ],\n alias: {\n b: 'bearerToken',\n k: 'ownerPrivateKey',\n u: 'username',\n n: 'displayName',\n d: 'description',\n i: 'imageUrl',\n },\n },\n metadata: {\n string: [\n '_',\n 'ownerPrivateKey',\n 'bearerToken',\n 'username',\n 'displayName',\n 'description',\n 'imageUrl',\n 'avatarUrl',\n 'externalUrl',\n 'motto',\n ],\n alias: {\n k: 'ownerPrivateKey',\n b: 'bearerToken',\n u: 'username',\n n: 'displayName',\n d: 'description',\n i: 'imageUrl',\n a: 'avatarUrl',\n e: 'externalUrl',\n m: 'motto',\n },\n },\n setup: {\n string: ['_', 'ownerPrivateKey', 'bearerToken', 'webhookUrl', 'notify'],\n alias: {\n k: 'ownerPrivateKey',\n b: 'bearerToken',\n w: 'webhookUrl',\n },\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 string: ['env'],\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 stringOptions = Array.isArray(commandConfig.string)\n ? ['env', ...commandConfig.string]\n : ['env']\n const parsed = minimist(args, {\n ...commandConfig,\n string: stringOptions,\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\nexport function isCreateArgs(args: CommandArgs): args is CreateArgs {\n return args._[0] === 'create'\n}\n\nexport function isMetadataArgs(args: CommandArgs): args is MetadataArgs {\n return args._[0] === 'metadata'\n}\n\nexport function isSetupArgs(args: CommandArgs): args is SetupArgs {\n return args._[0] === 'setup'\n}\n"],"mappings":"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","names":["import_picocolors","fs","path","import_prompts","import_picocolors","resolve","spawn","resolve","spawn","spawn","picocolors","prompts","prompts","import_picocolors","path","fs","update","import_picocolors","import_prompts","import_picocolors","prompts","import_prompts","import_picocolors","import_accounts","import_sdk","import_utils","prompts","import_prompts","import_picocolors","import_accounts","import_sdk","import_utils","prompts","import_sdk","minimist"]}
package/dist/index.mjs CHANGED
@@ -1,6 +1,4 @@
1
1
  // src/index.ts
2
- import { resolve as resolve2 } from "path";
3
- import { config as dotenvConfig } from "dotenv";
4
2
  import { green as green5, red as red7, yellow as yellow3, cyan as cyan4 } from "picocolors";
5
3
 
6
4
  // src/modules/init.ts
@@ -63,7 +61,7 @@ function getDlxCommand(packageManager) {
63
61
  }
64
62
  }
65
63
  function runCommand(command, args, opts = { cwd: void 0, silent: false }) {
66
- return new Promise((resolve3, reject) => {
64
+ return new Promise((resolve2, reject) => {
67
65
  const child = spawn(command, args, {
68
66
  stdio: opts.silent ? "ignore" : "inherit",
69
67
  cwd: opts.cwd,
@@ -73,14 +71,14 @@ function runCommand(command, args, opts = { cwd: void 0, silent: false }) {
73
71
  if (code !== 0) {
74
72
  reject(new Error(`Command failed with exit code ${code}`));
75
73
  } else {
76
- resolve3();
74
+ resolve2();
77
75
  }
78
76
  });
79
77
  child.on("error", reject);
80
78
  });
81
79
  }
82
80
  async function getLatestTownsProtocolVersion() {
83
- return new Promise((resolve3, reject) => {
81
+ return new Promise((resolve2, reject) => {
84
82
  const child = spawn("npm", ["view", "@towns-labs/agent", "version"], {
85
83
  stdio: ["ignore", "pipe", "ignore"]
86
84
  });
@@ -92,7 +90,7 @@ async function getLatestTownsProtocolVersion() {
92
90
  if (code !== 0) {
93
91
  reject(new Error("Failed to fetch latest @towns-labs/agent version"));
94
92
  } else {
95
- resolve3(output.trim());
93
+ resolve2(output.trim());
96
94
  }
97
95
  });
98
96
  child.on("error", reject);
@@ -688,7 +686,7 @@ async function create(argv) {
688
686
  if (!addresses?.accountProxy) {
689
687
  throw new Error(`No accountProxy address found for ${townsConfig.environmentId}/${chainId}`);
690
688
  }
691
- const relayerUrl = process.env.RELAYER_URL ?? "http://127.0.0.1:8787";
689
+ const relayerUrl = townsConfig.services.relayer.url;
692
690
  const relayerClient = createPublicClient({
693
691
  chain: {
694
692
  id: chainId,
@@ -974,6 +972,9 @@ async function promptNotify() {
974
972
  return value;
975
973
  }
976
974
 
975
+ // src/index.ts
976
+ import { townsEnv as townsEnv4 } from "@towns-labs/sdk";
977
+
977
978
  // src/parser.ts
978
979
  import minimist from "minimist";
979
980
  var COMMAND_CONFIGS = {
@@ -1042,6 +1043,7 @@ var COMMAND_CONFIGS = {
1042
1043
  function parseArgs(args) {
1043
1044
  const initial = minimist(args, {
1044
1045
  stopEarly: true,
1046
+ string: ["env"],
1045
1047
  boolean: ["help"],
1046
1048
  alias: { h: "help" }
1047
1049
  });
@@ -1051,8 +1053,10 @@ function parseArgs(args) {
1051
1053
  }
1052
1054
  const commandConfig = COMMAND_CONFIGS[command] || {};
1053
1055
  const booleanOptions = Array.isArray(commandConfig.boolean) ? ["help", ...commandConfig.boolean] : ["help"];
1056
+ const stringOptions = Array.isArray(commandConfig.string) ? ["env", ...commandConfig.string] : ["env"];
1054
1057
  const parsed = minimist(args, {
1055
1058
  ...commandConfig,
1059
+ string: stringOptions,
1056
1060
  boolean: booleanOptions,
1057
1061
  alias: {
1058
1062
  ...commandConfig.alias,
@@ -1081,8 +1085,6 @@ function isSetupArgs(args) {
1081
1085
  }
1082
1086
 
1083
1087
  // src/index.ts
1084
- dotenvConfig({ path: resolve2(__dirname, "../../generated/deployments/local_dev/.env") });
1085
- dotenvConfig({ path: resolve2(__dirname, "../../contracts/deployments/envs/local/.env") });
1086
1088
  async function main() {
1087
1089
  const args = parseArgs(process.argv.slice(2));
1088
1090
  const command = args._[0];
@@ -1090,6 +1092,21 @@ async function main() {
1090
1092
  showHelp();
1091
1093
  return;
1092
1094
  }
1095
+ if (args.env) {
1096
+ process.env.RIVER_ENV = args.env;
1097
+ }
1098
+ if (!process.env.RIVER_ENV) {
1099
+ console.error(
1100
+ red7("Environment is required. Use --env <local_dev|stage|prod> or set RIVER_ENV.")
1101
+ );
1102
+ process.exit(1);
1103
+ }
1104
+ try {
1105
+ townsEnv4().makeTownsConfig();
1106
+ } catch {
1107
+ console.error(red7(`Invalid environment: ${process.env.RIVER_ENV}`));
1108
+ process.exit(1);
1109
+ }
1093
1110
  try {
1094
1111
  switch (command) {
1095
1112
  case "init":
@@ -1164,6 +1181,7 @@ ${yellow3("Update Commands Options:")}
1164
1181
  --skip-agents-md Skip updating AGENTS.md file
1165
1182
 
1166
1183
  ${yellow3("Global Options:")}
1184
+ --env <name> Environment to use: local_dev, stage, prod
1167
1185
  -h, --help Show this help message
1168
1186
 
1169
1187
  ${yellow3("Examples:")}
@@ -1 +1 @@
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/modules/create.ts","../src/modules/metadata.ts","../src/modules/setup.ts","../src/parser.ts"],"sourcesContent":["import { resolve } from 'path'\nimport { config as dotenvConfig } from 'dotenv'\nimport { green, red, yellow, cyan } from 'picocolors'\n\n// Load local dev env files (contract addresses, chain IDs, etc.)\ndotenvConfig({ path: resolve(__dirname, '../../generated/deployments/local_dev/.env') })\ndotenvConfig({ path: resolve(__dirname, '../../contracts/deployments/envs/local/.env') })\nimport { init, TEMPLATES, type Template } from './modules/init.js'\nimport { update } from './modules/update.js'\nimport { skill } from './modules/install-skill.js'\nimport { create } from './modules/create.js'\nimport { metadata } from './modules/metadata.js'\nimport { setup } from './modules/setup.js'\nimport {\n parseArgs,\n isInitArgs,\n isUpdateArgs,\n isSkillArgs,\n isCreateArgs,\n isMetadataArgs,\n isSetupArgs,\n} 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 case 'create':\n if (isCreateArgs(args)) {\n await create(args)\n }\n break\n case 'metadata':\n if (isMetadataArgs(args)) {\n await metadata(args)\n }\n break\n case 'setup':\n if (isSetupArgs(args)) {\n await setup(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-agent')} - CLI for creating and managing Towns Protocol agent projects\n\n${yellow('Usage:')}\n towns-agent <command> [options]\n\n${yellow('Commands:')}\n ${green('init')} [project-name] Create a new agent project\n ${green('create')} Create a new bot/app account interactively\n ${green('setup')} <appAddress> Register webhook and notification settings\n ${green('metadata')} <view|update> View or update app metadata\n ${green('update')} Update @towns-labs 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 agent project')}\n towns-agent init my-agent\n towns-agent init my-ai-agent --template quickstart\n\n ${cyan('# Update dependencies')}\n towns-agent 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: 'Agent Quickstart',\n description: 'Simple starter agent with basic commands',\n packagePath: 'agent-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-agent 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 agent 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-agent 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-agent 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 { default as prompts } from 'prompts'\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-labs/agent', '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-labs/agent 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/HereNotThere/chat.git', '@towns-labs/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 @towns-labs/sdk@1.2.3\n const match = tag.match(/^@towns-protocol\\/sdk@(\\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/agent-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\nexport async function promptAuth(): Promise<\n { method: 'privateKey'; value: string } | { method: 'bearerToken'; value: string } | undefined\n> {\n const { method } = await prompts({\n type: 'select',\n name: 'method',\n message: 'Login method',\n choices: [\n { title: 'Bearer Token', value: 'bearerToken' },\n { title: 'Private Key', value: 'privateKey' },\n ],\n })\n if (method === undefined) return undefined\n\n const promptMessage =\n method === 'bearerToken' ? 'Enter your bearer token' : 'Enter your private key'\n\n const { value } = await prompts({\n type: 'password',\n name: 'value',\n message: promptMessage,\n validate: (v: string) => (v.trim() ? true : 'This field is required'),\n })\n if (!value) return undefined\n\n return { method, value }\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-labs/') || 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(dlxBin, [...dlxArgs, 'npm-check-updates', '-u', '-f', '@towns-labs/*'], {\n silent: true,\n })\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 and @towns-labs 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-agent 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 { default as prompts } from 'prompts'\nimport { red } from 'picocolors'\nimport { createPublicClient, http, type Hex } from 'viem'\nimport { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'\nimport { relayerActions } from '@towns-labs/relayer-client'\nimport {\n createApp,\n makeSignerContextFromBearerToken,\n makeSignerContextFromViem,\n townsEnv,\n} from '@towns-labs/sdk'\nimport { getAddressesWithFallback } from '@towns-labs/contracts/deployments'\nimport type { CreateArgs } from '../parser.js'\nimport { promptAuth } from './utils.js'\n\nexport async function create(argv: CreateArgs) {\n let ownerPrivateKey = argv.ownerPrivateKey\n let bearerToken = argv.bearerToken\n\n if (!ownerPrivateKey && !bearerToken) {\n const auth = await promptAuth()\n if (!auth) {\n console.error(red('Authentication is required.'))\n process.exit(1)\n }\n if (auth.method === 'privateKey') {\n ownerPrivateKey = auth.value\n } else {\n bearerToken = auth.value\n }\n }\n\n const username = argv.username ?? (await promptText('Bot username'))\n if (!username) {\n console.error(red('Username is required.'))\n process.exit(1)\n }\n\n const displayName = argv.displayName ?? (await promptText('Bot display name'))\n if (!displayName) {\n console.error(red('Display name is required.'))\n process.exit(1)\n }\n\n const description = argv.description ?? (await promptText('Bot description'))\n if (!description) {\n console.error(red('Description is required.'))\n process.exit(1)\n }\n\n const imageUrl = argv.imageUrl ?? (await promptText('Bot image URL (optional)', true))\n\n const owner = ownerPrivateKey\n ? await makeSignerContextFromViem(\n privateKeyToAccount(ownerPrivateKey as Hex),\n generatePrivateKey(),\n { days: 1 },\n )\n : await makeSignerContextFromBearerToken(bearerToken!)\n\n const townsConfig = townsEnv().makeTownsConfig()\n const chainId = townsConfig.base.chainConfig.chainId\n\n const addresses = getAddressesWithFallback(townsConfig.environmentId, chainId)\n if (!addresses?.accountProxy) {\n throw new Error(`No accountProxy address found for ${townsConfig.environmentId}/${chainId}`)\n }\n\n const relayerUrl = process.env.RELAYER_URL ?? 'http://127.0.0.1:8787'\n const relayerClient = createPublicClient({\n chain: {\n id: chainId,\n name: 'Local',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: { default: { http: [townsConfig.base.rpcUrl] } },\n },\n transport: http(townsConfig.base.rpcUrl),\n }).extend(relayerActions({ relayerUrl }))\n\n const result = await createApp({\n owner,\n metadata: {\n username,\n displayName,\n description,\n imageUrl: imageUrl || '',\n },\n relayerClient,\n accountProxy: addresses.accountProxy,\n townsConfig,\n })\n\n console.log(`APP_ADDRESS=${result.appAddress}`)\n console.log(`APP_PRIVATE_KEY=${result.appPrivateKey}`)\n console.log(`APP_PRIVATE_DATA=${result.appPrivateData}`)\n console.log(`JWT_SECRET=${result.jwtSecretBase64}`)\n\n process.exit(0)\n}\n\nasync function promptText(message: string, optional = false): Promise<string | undefined> {\n const { value }: { value: string | undefined } = await prompts({\n type: 'text',\n name: 'value',\n message,\n validate: optional\n ? undefined\n : (v: string) => (v.trim() ? true : 'This field is required'),\n })\n return value\n}\n","import { default as prompts } from 'prompts'\nimport { red, dim } from 'picocolors'\nimport { type Hex } from 'viem'\nimport { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'\nimport {\n AppRegistryService,\n makeAppRegistryRpcClient,\n makeSignerContextFromBearerToken,\n makeSignerContextFromViem,\n townsEnv,\n} from '@towns-labs/sdk'\nimport { bin_fromHexString } from '@towns-labs/utils'\nimport type { MetadataArgs } from '../parser.js'\nimport { promptAuth } from './utils.js'\n\nconst FIELD_DEFS = [\n { flag: 'username', label: 'USERNAME', mask: 'username', prompt: 'Username' },\n { flag: 'displayName', label: 'DISPLAY_NAME', mask: 'display_name', prompt: 'Display name' },\n { flag: 'description', label: 'DESCRIPTION', mask: 'description', prompt: 'Description' },\n { flag: 'imageUrl', label: 'IMAGE_URL', mask: 'image_url', prompt: 'Image URL' },\n { flag: 'avatarUrl', label: 'AVATAR_URL', mask: 'avatar_url', prompt: 'Avatar URL' },\n {\n flag: 'externalUrl',\n label: 'EXTERNAL_URL',\n mask: 'external_url',\n prompt: 'External URL',\n },\n { flag: 'motto', label: 'MOTTO', mask: 'motto', prompt: 'Motto' },\n] as const\n\ntype FieldFlag = (typeof FIELD_DEFS)[number]['flag']\n\nexport async function metadata(argv: MetadataArgs) {\n const subcommand = argv._[1]\n const appAddress = argv._[2]\n\n if (!subcommand || !['view', 'update'].includes(subcommand)) {\n console.error(red('Usage: towns-agent metadata <view|update> <appAddress> [options]'))\n process.exit(1)\n }\n\n if (!appAddress) {\n console.error(red('App address is required.'))\n process.exit(1)\n }\n\n const env = townsEnv()\n const townsConfig = env.makeTownsConfig()\n const appRegistryUrl = env.getAppRegistryUrl(townsConfig.environmentId)\n const appId = bin_fromHexString(appAddress)\n\n if (subcommand === 'view') {\n const client = makeAppRegistryRpcClient(appRegistryUrl, '')\n const { metadata: meta } = await client.getAppMetadata({ appId })\n\n if (!meta) {\n console.error(red('No metadata found for this app.'))\n process.exit(1)\n }\n\n console.log()\n for (const field of FIELD_DEFS) {\n const value = meta[field.flag] ?? ''\n console.log(` ${dim(field.prompt.padEnd(14))} ${value || dim('—')}`)\n }\n console.log()\n\n process.exit(0)\n }\n\n // UPDATE — auth required\n let ownerPrivateKey = argv.ownerPrivateKey\n let bearerToken = ownerPrivateKey ? undefined : argv.bearerToken\n\n if (!ownerPrivateKey && !bearerToken) {\n const auth = await promptAuth()\n if (!auth) {\n console.error(red('Authentication is required for update.'))\n process.exit(1)\n }\n if (auth.method === 'privateKey') {\n ownerPrivateKey = auth.value\n } else {\n bearerToken = auth.value\n }\n }\n\n const signerContext = ownerPrivateKey\n ? await makeSignerContextFromViem(\n privateKeyToAccount(ownerPrivateKey as Hex),\n generatePrivateKey(),\n { days: 1 },\n )\n : await makeSignerContextFromBearerToken(bearerToken!)\n\n const { appRegistryRpcClient } = await AppRegistryService.authenticate(\n signerContext,\n appRegistryUrl,\n )\n\n // Determine which fields to update\n const hasAnyFlag = FIELD_DEFS.some((f) => argv[f.flag] !== undefined)\n\n let values: Record<FieldFlag, string>\n\n if (hasAnyFlag) {\n // Non-interactive: use only flags that were provided\n values = {} as Record<FieldFlag, string>\n for (const field of FIELD_DEFS) {\n if (argv[field.flag] !== undefined) {\n values[field.flag] = argv[field.flag]!\n }\n }\n } else {\n // Interactive: fetch current values and prompt for each\n const unauthClient = makeAppRegistryRpcClient(appRegistryUrl, '')\n const { metadata: current } = await unauthClient.getAppMetadata({ appId })\n\n values = {} as Record<FieldFlag, string>\n for (const field of FIELD_DEFS) {\n const { value } = await prompts({\n type: 'text',\n name: 'value',\n message: field.prompt,\n initial: current?.[field.flag] ?? '',\n })\n if (value === undefined) {\n // User cancelled\n process.exit(1)\n }\n if (value !== (current?.[field.flag] ?? '')) {\n values[field.flag] = value\n }\n }\n\n if (Object.keys(values).length === 0) {\n console.log('No changes.')\n process.exit(0)\n }\n }\n\n const updateMask: string[] = []\n const metadataUpdate: Record<string, string> = {}\n\n for (const field of FIELD_DEFS) {\n if (values[field.flag] !== undefined) {\n updateMask.push(field.mask)\n metadataUpdate[field.flag] = values[field.flag]\n }\n }\n\n await appRegistryRpcClient.updateAppMetadata({\n appId,\n updateMask,\n metadata: metadataUpdate,\n })\n\n for (const field of FIELD_DEFS) {\n if (values[field.flag] !== undefined) {\n console.log(` ${dim(field.prompt.padEnd(14))} ${values[field.flag]}`)\n }\n }\n console.log()\n\n process.exit(0)\n}\n","import { default as prompts } from 'prompts'\nimport { red, dim, green } from 'picocolors'\nimport { type Hex } from 'viem'\nimport { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'\nimport {\n AppRegistryService,\n makeSignerContextFromBearerToken,\n makeSignerContextFromViem,\n townsEnv,\n} from '@towns-labs/sdk'\nimport { ForwardSettingValue } from '@towns-labs/proto'\nimport { bin_fromHexString } from '@towns-labs/utils'\nimport type { SetupArgs } from '../parser.js'\nimport { promptAuth } from './utils.js'\n\nconst NOTIFY_MAP: Record<string, ForwardSettingValue> = {\n ALL: ForwardSettingValue.FORWARD_SETTING_ALL_MESSAGES,\n NONE: ForwardSettingValue.FORWARD_SETTING_NO_MESSAGES,\n MENTION_REPLY_REACTION: ForwardSettingValue.FORWARD_SETTING_MENTIONS_REPLIES_REACTIONS,\n}\n\nconst NOTIFY_LABELS: Record<string, string> = {\n ALL: 'All messages',\n MENTION_REPLY_REACTION: 'Mentions, replies & reactions',\n NONE: 'No messages',\n}\n\nexport async function setup(argv: SetupArgs) {\n const appAddress = argv._[1]\n if (!appAddress) {\n console.error(red('Usage: towns-agent setup <appAddress> [options]'))\n process.exit(1)\n }\n\n // Auth\n let ownerPrivateKey = argv.ownerPrivateKey\n let bearerToken = argv.bearerToken\n\n if (!ownerPrivateKey && !bearerToken) {\n const auth = await promptAuth()\n if (!auth) {\n console.error(red('Authentication is required.'))\n process.exit(1)\n }\n if (auth.method === 'privateKey') {\n ownerPrivateKey = auth.value\n } else {\n bearerToken = auth.value\n }\n }\n\n // Webhook URL\n const webhookUrl = argv.webhookUrl ?? (await promptWebhookUrl())\n if (!webhookUrl) {\n console.error(red('Webhook URL is required.'))\n process.exit(1)\n }\n\n // Notify setting\n let notifyKey: string\n if (argv.notify) {\n notifyKey = argv.notify.toUpperCase()\n } else if (argv.webhookUrl) {\n // Non-interactive without explicit --notify: default to ALL\n notifyKey = 'ALL'\n } else {\n notifyKey = await promptNotify()\n }\n\n const forwardSetting = NOTIFY_MAP[notifyKey]\n if (forwardSetting === undefined) {\n console.error(\n red(`Invalid --notify value: ${notifyKey}. Use ALL, NONE, or MENTION_REPLY_REACTION.`),\n )\n process.exit(1)\n }\n\n const env = townsEnv()\n const townsConfig = env.makeTownsConfig()\n const appRegistryUrl = env.getAppRegistryUrl(townsConfig.environmentId)\n const appId = bin_fromHexString(appAddress)\n\n const signerContext = ownerPrivateKey\n ? await makeSignerContextFromViem(\n privateKeyToAccount(ownerPrivateKey as Hex),\n generatePrivateKey(),\n { days: 1 },\n )\n : await makeSignerContextFromBearerToken(bearerToken!)\n\n const { appRegistryRpcClient } = await AppRegistryService.authenticate(\n signerContext,\n appRegistryUrl,\n )\n\n await appRegistryRpcClient.registerWebhook({ appId, webhookUrl })\n await appRegistryRpcClient.setAppSettings({\n appId,\n settings: { forwardSetting },\n })\n\n console.log()\n console.log(green('Setup complete!'))\n console.log()\n console.log(` ${dim('Webhook URL'.padEnd(14))} ${webhookUrl}`)\n console.log(` ${dim('Notify'.padEnd(14))} ${NOTIFY_LABELS[notifyKey] ?? notifyKey}`)\n console.log()\n\n process.exit(0)\n}\n\nasync function promptWebhookUrl(): Promise<string | undefined> {\n const { value }: { value: string | undefined } = await prompts({\n type: 'text',\n name: 'value',\n message: 'Webhook URL',\n validate: (v: string) => (v.trim() ? true : 'Webhook URL is required'),\n })\n return value\n}\n\nasync function promptNotify(): Promise<string> {\n const { value }: { value: string | undefined } = await prompts({\n type: 'select',\n name: 'value',\n message: 'Notify setting',\n choices: [\n { title: 'All messages', value: 'ALL' },\n { title: 'Mentions, replies & reactions', value: 'MENTION_REPLY_REACTION' },\n { title: 'No messages', value: 'NONE' },\n ],\n initial: 0,\n })\n if (value === undefined) {\n process.exit(1)\n }\n return value\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 interface CreateArgs extends BaseArgs {\n bearerToken?: string\n ownerPrivateKey?: string\n username?: string\n displayName?: string\n description?: string\n imageUrl?: string\n}\n\nexport interface MetadataArgs extends BaseArgs {\n ownerPrivateKey?: string\n bearerToken?: string\n username?: string\n displayName?: string\n description?: string\n imageUrl?: string\n avatarUrl?: string\n externalUrl?: string\n motto?: string\n}\n\nexport interface SetupArgs extends BaseArgs {\n ownerPrivateKey?: string\n bearerToken?: string\n webhookUrl?: string\n notify?: string\n}\n\nexport type SkillArgs = BaseArgs\n\nexport type CommandArgs = InitArgs | UpdateArgs | SkillArgs | CreateArgs | MetadataArgs | SetupArgs\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 create: {\n string: [\n 'bearerToken',\n 'ownerPrivateKey',\n 'username',\n 'displayName',\n 'description',\n 'imageUrl',\n ],\n alias: {\n b: 'bearerToken',\n k: 'ownerPrivateKey',\n u: 'username',\n n: 'displayName',\n d: 'description',\n i: 'imageUrl',\n },\n },\n metadata: {\n string: [\n '_',\n 'ownerPrivateKey',\n 'bearerToken',\n 'username',\n 'displayName',\n 'description',\n 'imageUrl',\n 'avatarUrl',\n 'externalUrl',\n 'motto',\n ],\n alias: {\n k: 'ownerPrivateKey',\n b: 'bearerToken',\n u: 'username',\n n: 'displayName',\n d: 'description',\n i: 'imageUrl',\n a: 'avatarUrl',\n e: 'externalUrl',\n m: 'motto',\n },\n },\n setup: {\n string: ['_', 'ownerPrivateKey', 'bearerToken', 'webhookUrl', 'notify'],\n alias: {\n k: 'ownerPrivateKey',\n b: 'bearerToken',\n w: 'webhookUrl',\n },\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\nexport function isSkillArgs(args: CommandArgs): args is SkillArgs {\n return args._[0] === 'install-skill'\n}\n\nexport function isCreateArgs(args: CommandArgs): args is CreateArgs {\n return args._[0] === 'create'\n}\n\nexport function isMetadataArgs(args: CommandArgs): args is MetadataArgs {\n return args._[0] === 'metadata'\n}\n\nexport function isSetupArgs(args: CommandArgs): args is SetupArgs {\n return args._[0] === 'setup'\n}\n"],"mappings":"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","names":["resolve","green","red","yellow","cyan","fs","path","prompts","resolve","resolve","prompts","fs","path","green","red","yellow","cyan","path","fs","red","yellow","cyan","green","update","red","cyan","green","cyan","green","red","prompts","red","red","prompts","prompts","red","privateKeyToAccount","generatePrivateKey","makeSignerContextFromBearerToken","makeSignerContextFromViem","townsEnv","red","townsEnv","makeSignerContextFromViem","privateKeyToAccount","generatePrivateKey","makeSignerContextFromBearerToken","prompts","prompts","red","dim","green","privateKeyToAccount","generatePrivateKey","AppRegistryService","makeSignerContextFromBearerToken","makeSignerContextFromViem","townsEnv","bin_fromHexString","red","townsEnv","bin_fromHexString","makeSignerContextFromViem","privateKeyToAccount","generatePrivateKey","makeSignerContextFromBearerToken","AppRegistryService","green","dim","prompts","resolve","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/modules/create.ts","../src/modules/metadata.ts","../src/modules/setup.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 { create } from './modules/create.js'\nimport { metadata } from './modules/metadata.js'\nimport { setup } from './modules/setup.js'\nimport { townsEnv } from '@towns-labs/sdk'\nimport {\n parseArgs,\n isInitArgs,\n isUpdateArgs,\n isSkillArgs,\n isCreateArgs,\n isMetadataArgs,\n isSetupArgs,\n} 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 // Set RIVER_ENV from --env flag, fall back to process.env.RIVER_ENV\n if (args.env) {\n process.env.RIVER_ENV = args.env\n }\n if (!process.env.RIVER_ENV) {\n console.error(\n red('Environment is required. Use --env <local_dev|stage|prod> or set RIVER_ENV.'),\n )\n process.exit(1)\n }\n try {\n townsEnv().makeTownsConfig()\n } catch {\n console.error(red(`Invalid environment: ${process.env.RIVER_ENV}`))\n process.exit(1)\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 case 'create':\n if (isCreateArgs(args)) {\n await create(args)\n }\n break\n case 'metadata':\n if (isMetadataArgs(args)) {\n await metadata(args)\n }\n break\n case 'setup':\n if (isSetupArgs(args)) {\n await setup(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-agent')} - CLI for creating and managing Towns Protocol agent projects\n\n${yellow('Usage:')}\n towns-agent <command> [options]\n\n${yellow('Commands:')}\n ${green('init')} [project-name] Create a new agent project\n ${green('create')} Create a new bot/app account interactively\n ${green('setup')} <appAddress> Register webhook and notification settings\n ${green('metadata')} <view|update> View or update app metadata\n ${green('update')} Update @towns-labs 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 --env <name> Environment to use: local_dev, stage, prod\n -h, --help Show this help message\n\n${yellow('Examples:')}\n ${cyan('# Create a new agent project')}\n towns-agent init my-agent\n towns-agent init my-ai-agent --template quickstart\n\n ${cyan('# Update dependencies')}\n towns-agent 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: 'Agent Quickstart',\n description: 'Simple starter agent with basic commands',\n packagePath: 'agent-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-agent 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 agent 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-agent 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-agent 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 { default as prompts } from 'prompts'\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-labs/agent', '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-labs/agent 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/HereNotThere/chat.git', '@towns-labs/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 @towns-labs/sdk@1.2.3\n const match = tag.match(/^@towns-protocol\\/sdk@(\\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/agent-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\nexport async function promptAuth(): Promise<\n { method: 'privateKey'; value: string } | { method: 'bearerToken'; value: string } | undefined\n> {\n const { method } = await prompts({\n type: 'select',\n name: 'method',\n message: 'Login method',\n choices: [\n { title: 'Bearer Token', value: 'bearerToken' },\n { title: 'Private Key', value: 'privateKey' },\n ],\n })\n if (method === undefined) return undefined\n\n const promptMessage =\n method === 'bearerToken' ? 'Enter your bearer token' : 'Enter your private key'\n\n const { value } = await prompts({\n type: 'password',\n name: 'value',\n message: promptMessage,\n validate: (v: string) => (v.trim() ? true : 'This field is required'),\n })\n if (!value) return undefined\n\n return { method, value }\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-labs/') || 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(dlxBin, [...dlxArgs, 'npm-check-updates', '-u', '-f', '@towns-labs/*'], {\n silent: true,\n })\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 and @towns-labs 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-agent 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 { default as prompts } from 'prompts'\nimport { red } from 'picocolors'\nimport { createPublicClient, http, type Hex } from 'viem'\nimport { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'\nimport { relayerActions } from '@towns-labs/relayer-client'\nimport {\n createApp,\n makeSignerContextFromBearerToken,\n makeSignerContextFromViem,\n townsEnv,\n} from '@towns-labs/sdk'\nimport { getAddressesWithFallback } from '@towns-labs/contracts/deployments'\nimport type { CreateArgs } from '../parser.js'\nimport { promptAuth } from './utils.js'\n\nexport async function create(argv: CreateArgs) {\n let ownerPrivateKey = argv.ownerPrivateKey\n let bearerToken = argv.bearerToken\n\n if (!ownerPrivateKey && !bearerToken) {\n const auth = await promptAuth()\n if (!auth) {\n console.error(red('Authentication is required.'))\n process.exit(1)\n }\n if (auth.method === 'privateKey') {\n ownerPrivateKey = auth.value\n } else {\n bearerToken = auth.value\n }\n }\n\n const username = argv.username ?? (await promptText('Bot username'))\n if (!username) {\n console.error(red('Username is required.'))\n process.exit(1)\n }\n\n const displayName = argv.displayName ?? (await promptText('Bot display name'))\n if (!displayName) {\n console.error(red('Display name is required.'))\n process.exit(1)\n }\n\n const description = argv.description ?? (await promptText('Bot description'))\n if (!description) {\n console.error(red('Description is required.'))\n process.exit(1)\n }\n\n const imageUrl = argv.imageUrl ?? (await promptText('Bot image URL (optional)', true))\n\n const owner = ownerPrivateKey\n ? await makeSignerContextFromViem(\n privateKeyToAccount(ownerPrivateKey as Hex),\n generatePrivateKey(),\n { days: 1 },\n )\n : await makeSignerContextFromBearerToken(bearerToken!)\n\n const townsConfig = townsEnv().makeTownsConfig()\n const chainId = townsConfig.base.chainConfig.chainId\n\n const addresses = getAddressesWithFallback(townsConfig.environmentId, chainId)\n if (!addresses?.accountProxy) {\n throw new Error(`No accountProxy address found for ${townsConfig.environmentId}/${chainId}`)\n }\n\n const relayerUrl = townsConfig.services.relayer.url\n const relayerClient = createPublicClient({\n chain: {\n id: chainId,\n name: 'Local',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: { default: { http: [townsConfig.base.rpcUrl] } },\n },\n transport: http(townsConfig.base.rpcUrl),\n }).extend(relayerActions({ relayerUrl }))\n\n const result = await createApp({\n owner,\n metadata: {\n username,\n displayName,\n description,\n imageUrl: imageUrl || '',\n },\n relayerClient,\n accountProxy: addresses.accountProxy,\n townsConfig,\n })\n\n console.log(`APP_ADDRESS=${result.appAddress}`)\n console.log(`APP_PRIVATE_KEY=${result.appPrivateKey}`)\n console.log(`APP_PRIVATE_DATA=${result.appPrivateData}`)\n console.log(`JWT_SECRET=${result.jwtSecretBase64}`)\n\n process.exit(0)\n}\n\nasync function promptText(message: string, optional = false): Promise<string | undefined> {\n const { value }: { value: string | undefined } = await prompts({\n type: 'text',\n name: 'value',\n message,\n validate: optional\n ? undefined\n : (v: string) => (v.trim() ? true : 'This field is required'),\n })\n return value\n}\n","import { default as prompts } from 'prompts'\nimport { red, dim } from 'picocolors'\nimport { type Hex } from 'viem'\nimport { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'\nimport {\n AppRegistryService,\n makeAppRegistryRpcClient,\n makeSignerContextFromBearerToken,\n makeSignerContextFromViem,\n townsEnv,\n} from '@towns-labs/sdk'\nimport { bin_fromHexString } from '@towns-labs/utils'\nimport type { MetadataArgs } from '../parser.js'\nimport { promptAuth } from './utils.js'\n\nconst FIELD_DEFS = [\n { flag: 'username', label: 'USERNAME', mask: 'username', prompt: 'Username' },\n { flag: 'displayName', label: 'DISPLAY_NAME', mask: 'display_name', prompt: 'Display name' },\n { flag: 'description', label: 'DESCRIPTION', mask: 'description', prompt: 'Description' },\n { flag: 'imageUrl', label: 'IMAGE_URL', mask: 'image_url', prompt: 'Image URL' },\n { flag: 'avatarUrl', label: 'AVATAR_URL', mask: 'avatar_url', prompt: 'Avatar URL' },\n {\n flag: 'externalUrl',\n label: 'EXTERNAL_URL',\n mask: 'external_url',\n prompt: 'External URL',\n },\n { flag: 'motto', label: 'MOTTO', mask: 'motto', prompt: 'Motto' },\n] as const\n\ntype FieldFlag = (typeof FIELD_DEFS)[number]['flag']\n\nexport async function metadata(argv: MetadataArgs) {\n const subcommand = argv._[1]\n const appAddress = argv._[2]\n\n if (!subcommand || !['view', 'update'].includes(subcommand)) {\n console.error(red('Usage: towns-agent metadata <view|update> <appAddress> [options]'))\n process.exit(1)\n }\n\n if (!appAddress) {\n console.error(red('App address is required.'))\n process.exit(1)\n }\n\n const env = townsEnv()\n const townsConfig = env.makeTownsConfig()\n const appRegistryUrl = env.getAppRegistryUrl(townsConfig.environmentId)\n const appId = bin_fromHexString(appAddress)\n\n if (subcommand === 'view') {\n const client = makeAppRegistryRpcClient(appRegistryUrl, '')\n const { metadata: meta } = await client.getAppMetadata({ appId })\n\n if (!meta) {\n console.error(red('No metadata found for this app.'))\n process.exit(1)\n }\n\n console.log()\n for (const field of FIELD_DEFS) {\n const value = meta[field.flag] ?? ''\n console.log(` ${dim(field.prompt.padEnd(14))} ${value || dim('—')}`)\n }\n console.log()\n\n process.exit(0)\n }\n\n // UPDATE — auth required\n let ownerPrivateKey = argv.ownerPrivateKey\n let bearerToken = ownerPrivateKey ? undefined : argv.bearerToken\n\n if (!ownerPrivateKey && !bearerToken) {\n const auth = await promptAuth()\n if (!auth) {\n console.error(red('Authentication is required for update.'))\n process.exit(1)\n }\n if (auth.method === 'privateKey') {\n ownerPrivateKey = auth.value\n } else {\n bearerToken = auth.value\n }\n }\n\n const signerContext = ownerPrivateKey\n ? await makeSignerContextFromViem(\n privateKeyToAccount(ownerPrivateKey as Hex),\n generatePrivateKey(),\n { days: 1 },\n )\n : await makeSignerContextFromBearerToken(bearerToken!)\n\n const { appRegistryRpcClient } = await AppRegistryService.authenticate(\n signerContext,\n appRegistryUrl,\n )\n\n // Determine which fields to update\n const hasAnyFlag = FIELD_DEFS.some((f) => argv[f.flag] !== undefined)\n\n let values: Record<FieldFlag, string>\n\n if (hasAnyFlag) {\n // Non-interactive: use only flags that were provided\n values = {} as Record<FieldFlag, string>\n for (const field of FIELD_DEFS) {\n if (argv[field.flag] !== undefined) {\n values[field.flag] = argv[field.flag]!\n }\n }\n } else {\n // Interactive: fetch current values and prompt for each\n const unauthClient = makeAppRegistryRpcClient(appRegistryUrl, '')\n const { metadata: current } = await unauthClient.getAppMetadata({ appId })\n\n values = {} as Record<FieldFlag, string>\n for (const field of FIELD_DEFS) {\n const { value } = await prompts({\n type: 'text',\n name: 'value',\n message: field.prompt,\n initial: current?.[field.flag] ?? '',\n })\n if (value === undefined) {\n // User cancelled\n process.exit(1)\n }\n if (value !== (current?.[field.flag] ?? '')) {\n values[field.flag] = value\n }\n }\n\n if (Object.keys(values).length === 0) {\n console.log('No changes.')\n process.exit(0)\n }\n }\n\n const updateMask: string[] = []\n const metadataUpdate: Record<string, string> = {}\n\n for (const field of FIELD_DEFS) {\n if (values[field.flag] !== undefined) {\n updateMask.push(field.mask)\n metadataUpdate[field.flag] = values[field.flag]\n }\n }\n\n await appRegistryRpcClient.updateAppMetadata({\n appId,\n updateMask,\n metadata: metadataUpdate,\n })\n\n for (const field of FIELD_DEFS) {\n if (values[field.flag] !== undefined) {\n console.log(` ${dim(field.prompt.padEnd(14))} ${values[field.flag]}`)\n }\n }\n console.log()\n\n process.exit(0)\n}\n","import { default as prompts } from 'prompts'\nimport { red, dim, green } from 'picocolors'\nimport { type Hex } from 'viem'\nimport { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'\nimport {\n AppRegistryService,\n makeSignerContextFromBearerToken,\n makeSignerContextFromViem,\n townsEnv,\n} from '@towns-labs/sdk'\nimport { ForwardSettingValue } from '@towns-labs/proto'\nimport { bin_fromHexString } from '@towns-labs/utils'\nimport type { SetupArgs } from '../parser.js'\nimport { promptAuth } from './utils.js'\n\nconst NOTIFY_MAP: Record<string, ForwardSettingValue> = {\n ALL: ForwardSettingValue.FORWARD_SETTING_ALL_MESSAGES,\n NONE: ForwardSettingValue.FORWARD_SETTING_NO_MESSAGES,\n MENTION_REPLY_REACTION: ForwardSettingValue.FORWARD_SETTING_MENTIONS_REPLIES_REACTIONS,\n}\n\nconst NOTIFY_LABELS: Record<string, string> = {\n ALL: 'All messages',\n MENTION_REPLY_REACTION: 'Mentions, replies & reactions',\n NONE: 'No messages',\n}\n\nexport async function setup(argv: SetupArgs) {\n const appAddress = argv._[1]\n if (!appAddress) {\n console.error(red('Usage: towns-agent setup <appAddress> [options]'))\n process.exit(1)\n }\n\n // Auth\n let ownerPrivateKey = argv.ownerPrivateKey\n let bearerToken = argv.bearerToken\n\n if (!ownerPrivateKey && !bearerToken) {\n const auth = await promptAuth()\n if (!auth) {\n console.error(red('Authentication is required.'))\n process.exit(1)\n }\n if (auth.method === 'privateKey') {\n ownerPrivateKey = auth.value\n } else {\n bearerToken = auth.value\n }\n }\n\n // Webhook URL\n const webhookUrl = argv.webhookUrl ?? (await promptWebhookUrl())\n if (!webhookUrl) {\n console.error(red('Webhook URL is required.'))\n process.exit(1)\n }\n\n // Notify setting\n let notifyKey: string\n if (argv.notify) {\n notifyKey = argv.notify.toUpperCase()\n } else if (argv.webhookUrl) {\n // Non-interactive without explicit --notify: default to ALL\n notifyKey = 'ALL'\n } else {\n notifyKey = await promptNotify()\n }\n\n const forwardSetting = NOTIFY_MAP[notifyKey]\n if (forwardSetting === undefined) {\n console.error(\n red(`Invalid --notify value: ${notifyKey}. Use ALL, NONE, or MENTION_REPLY_REACTION.`),\n )\n process.exit(1)\n }\n\n const env = townsEnv()\n const townsConfig = env.makeTownsConfig()\n const appRegistryUrl = env.getAppRegistryUrl(townsConfig.environmentId)\n const appId = bin_fromHexString(appAddress)\n\n const signerContext = ownerPrivateKey\n ? await makeSignerContextFromViem(\n privateKeyToAccount(ownerPrivateKey as Hex),\n generatePrivateKey(),\n { days: 1 },\n )\n : await makeSignerContextFromBearerToken(bearerToken!)\n\n const { appRegistryRpcClient } = await AppRegistryService.authenticate(\n signerContext,\n appRegistryUrl,\n )\n\n await appRegistryRpcClient.registerWebhook({ appId, webhookUrl })\n await appRegistryRpcClient.setAppSettings({\n appId,\n settings: { forwardSetting },\n })\n\n console.log()\n console.log(green('Setup complete!'))\n console.log()\n console.log(` ${dim('Webhook URL'.padEnd(14))} ${webhookUrl}`)\n console.log(` ${dim('Notify'.padEnd(14))} ${NOTIFY_LABELS[notifyKey] ?? notifyKey}`)\n console.log()\n\n process.exit(0)\n}\n\nasync function promptWebhookUrl(): Promise<string | undefined> {\n const { value }: { value: string | undefined } = await prompts({\n type: 'text',\n name: 'value',\n message: 'Webhook URL',\n validate: (v: string) => (v.trim() ? true : 'Webhook URL is required'),\n })\n return value\n}\n\nasync function promptNotify(): Promise<string> {\n const { value }: { value: string | undefined } = await prompts({\n type: 'select',\n name: 'value',\n message: 'Notify setting',\n choices: [\n { title: 'All messages', value: 'ALL' },\n { title: 'Mentions, replies & reactions', value: 'MENTION_REPLY_REACTION' },\n { title: 'No messages', value: 'NONE' },\n ],\n initial: 0,\n })\n if (value === undefined) {\n process.exit(1)\n }\n return value\n}\n","import minimist from 'minimist'\n\n// Command-specific argument interfaces\nexport interface BaseArgs {\n _: string[]\n help?: boolean\n env?: string\n}\n\nexport interface InitArgs extends BaseArgs {\n template?: string\n}\n\nexport interface UpdateArgs extends BaseArgs {\n skipAgentsMd?: boolean\n}\n\nexport interface CreateArgs extends BaseArgs {\n bearerToken?: string\n ownerPrivateKey?: string\n username?: string\n displayName?: string\n description?: string\n imageUrl?: string\n}\n\nexport interface MetadataArgs extends BaseArgs {\n ownerPrivateKey?: string\n bearerToken?: string\n username?: string\n displayName?: string\n description?: string\n imageUrl?: string\n avatarUrl?: string\n externalUrl?: string\n motto?: string\n}\n\nexport interface SetupArgs extends BaseArgs {\n ownerPrivateKey?: string\n bearerToken?: string\n webhookUrl?: string\n notify?: string\n}\n\nexport type SkillArgs = BaseArgs\n\nexport type CommandArgs = InitArgs | UpdateArgs | SkillArgs | CreateArgs | MetadataArgs | SetupArgs\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 create: {\n string: [\n 'bearerToken',\n 'ownerPrivateKey',\n 'username',\n 'displayName',\n 'description',\n 'imageUrl',\n ],\n alias: {\n b: 'bearerToken',\n k: 'ownerPrivateKey',\n u: 'username',\n n: 'displayName',\n d: 'description',\n i: 'imageUrl',\n },\n },\n metadata: {\n string: [\n '_',\n 'ownerPrivateKey',\n 'bearerToken',\n 'username',\n 'displayName',\n 'description',\n 'imageUrl',\n 'avatarUrl',\n 'externalUrl',\n 'motto',\n ],\n alias: {\n k: 'ownerPrivateKey',\n b: 'bearerToken',\n u: 'username',\n n: 'displayName',\n d: 'description',\n i: 'imageUrl',\n a: 'avatarUrl',\n e: 'externalUrl',\n m: 'motto',\n },\n },\n setup: {\n string: ['_', 'ownerPrivateKey', 'bearerToken', 'webhookUrl', 'notify'],\n alias: {\n k: 'ownerPrivateKey',\n b: 'bearerToken',\n w: 'webhookUrl',\n },\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 string: ['env'],\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 stringOptions = Array.isArray(commandConfig.string)\n ? ['env', ...commandConfig.string]\n : ['env']\n const parsed = minimist(args, {\n ...commandConfig,\n string: stringOptions,\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\nexport function isCreateArgs(args: CommandArgs): args is CreateArgs {\n return args._[0] === 'create'\n}\n\nexport function isMetadataArgs(args: CommandArgs): args is MetadataArgs {\n return args._[0] === 'metadata'\n}\n\nexport function isSetupArgs(args: CommandArgs): args is SetupArgs {\n return args._[0] === 'setup'\n}\n"],"mappings":"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","names":["green","red","yellow","cyan","fs","path","prompts","resolve","resolve","prompts","fs","path","green","red","yellow","cyan","path","fs","red","yellow","cyan","green","update","red","cyan","green","cyan","green","red","prompts","red","red","prompts","prompts","red","privateKeyToAccount","generatePrivateKey","makeSignerContextFromBearerToken","makeSignerContextFromViem","townsEnv","red","townsEnv","makeSignerContextFromViem","privateKeyToAccount","generatePrivateKey","makeSignerContextFromBearerToken","prompts","prompts","red","dim","green","privateKeyToAccount","generatePrivateKey","AppRegistryService","makeSignerContextFromBearerToken","makeSignerContextFromViem","townsEnv","bin_fromHexString","red","townsEnv","bin_fromHexString","makeSignerContextFromViem","privateKeyToAccount","generatePrivateKey","makeSignerContextFromBearerToken","AppRegistryService","green","dim","prompts","townsEnv","red","townsEnv","cyan","yellow","green"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "towns-agent",
3
3
  "description": "CLI for creating and managing Towns Protocol bot projects",
4
- "version": "2.0.4",
4
+ "version": "2.0.5",
5
5
  "author": "Towns Protocol",
6
6
  "scripts": {
7
7
  "build": "tsup",
@@ -15,11 +15,11 @@
15
15
  "dependencies": {
16
16
  "@bufbuild/protobuf": "^2.9.0",
17
17
  "@connectrpc/connect-node": "^2.1.0",
18
- "@towns-labs/proto": "workspace:^",
19
- "@towns-labs/contracts": "workspace:^",
20
- "@towns-labs/relayer-client": "workspace:^",
21
- "@towns-labs/sdk": "workspace:^",
22
- "@towns-labs/utils": "workspace:^",
18
+ "@towns-labs/proto": "^2.0.5",
19
+ "@towns-labs/contracts": "^2.0.5",
20
+ "@towns-labs/relayer-client": "^2.0.5",
21
+ "@towns-labs/sdk": "^2.0.5",
22
+ "@towns-labs/utils": "^2.0.5",
23
23
  "cross-spawn": "^7.0.5",
24
24
  "dotenv": "^16.4.5",
25
25
  "ethers": "^5.8.0",