towns-agent 2.0.6 → 2.0.7
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
|
@@ -43,7 +43,7 @@ var import_dotenv = require("dotenv");
|
|
|
43
43
|
var import_sdk = require("@towns-labs/sdk");
|
|
44
44
|
|
|
45
45
|
// package.json
|
|
46
|
-
var version = "2.0.
|
|
46
|
+
var version = "2.0.7";
|
|
47
47
|
|
|
48
48
|
// src/modules/utils.ts
|
|
49
49
|
var import_meta = {};
|
|
@@ -918,15 +918,12 @@ function validateWebhookUrl(url) {
|
|
|
918
918
|
try {
|
|
919
919
|
const parsed = new URL(trimmed);
|
|
920
920
|
const isLocalhost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || parsed.hostname === "0.0.0.0";
|
|
921
|
-
if (isLocalhost && parsed.protocol === "http:") {
|
|
922
|
-
return "Local bots must use HTTPS. Use https:// instead of http://";
|
|
923
|
-
}
|
|
924
921
|
if (isLocalhost && !parsed.port) {
|
|
925
|
-
return "Localhost URL is missing a port. Example:
|
|
922
|
+
return "Localhost URL is missing a port. Example: http://localhost:3000";
|
|
926
923
|
}
|
|
927
924
|
return true;
|
|
928
925
|
} catch {
|
|
929
|
-
return "Invalid URL format. Example:
|
|
926
|
+
return "Invalid URL format. Example: http://localhost:3000/webhook";
|
|
930
927
|
}
|
|
931
928
|
}
|
|
932
929
|
async function promptWebhookUrl() {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/modules/init.ts","../src/modules/utils.ts","../package.json","../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'\nimport { resolveRiverEnv } from './modules/utils.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 const requiresEnv = ['create', 'setup', 'metadata'].includes(command)\n\n if (requiresEnv) {\n // Set RIVER_ENV from --env flag, fall back to process.env.RIVER_ENV, then .env file\n if (args.env) {\n process.env.RIVER_ENV = args.env\n }\n if (!process.env.RIVER_ENV) {\n const resolvedEnv = resolveRiverEnv()\n if (resolvedEnv) {\n process.env.RIVER_ENV = resolvedEnv\n }\n }\n if (!process.env.RIVER_ENV) {\n console.error(\n red(\n 'Environment is required. Use --env <local_dev|stage|prod>, set RIVER_ENV, or set APP_PRIVATE_DATA in .env.',\n ),\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\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> [appAddress] 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('Environment Options (create, setup, metadata):')}\n --env <name> Environment to use: local_dev, stage, prod\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 cliVersion,\n copyTemplate,\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: '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 // Copy template from embedded templates\n const success = copyTemplate(selectedTemplate.packagePath, targetDir)\n if (!success) {\n console.error(red('Failed to copy template'))\n process.exit(1)\n }\n const latestVersion = cliVersion\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 (best effort)\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(yellow('⚠'), 'Skipping Towns Agent Skills. Install later with:')\n console.log(yellow(` cd ${projectName} && towns-agent install-skill`))\n }\n } catch {\n console.log(yellow('⚠'), 'Skipping Towns Agent Skills. Install later with:')\n console.log(yellow(` cd ${projectName} && 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 { fileURLToPath } from 'node:url'\nimport { default as spawn } from 'cross-spawn'\nimport { default as prompts } from 'prompts'\nimport picocolors from 'picocolors'\nimport { config as dotenvConfig } from 'dotenv'\nimport { parseAppPrivateData } from '@towns-labs/sdk'\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 { version as cliVersion } from '../../package.json'\n\nexport function getTemplatesDir(): string {\n const currentDir =\n typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url))\n // From dist/ (compiled/published)\n const fromDist = path.resolve(currentDir, '..', 'templates')\n if (fs.existsSync(fromDist)) return fromDist\n // From src/modules/ (local dev)\n const fromSrc = path.resolve(currentDir, '..', '..', 'templates')\n if (fs.existsSync(fromSrc)) return fromSrc\n throw new Error('Templates directory not found')\n}\n\nexport function copyTemplate(templateName: string, targetDir: string): boolean {\n console.log(picocolors.blue('Copying template...'))\n\n const templatesDir = getTemplatesDir()\n const sourceDir = path.join(templatesDir, templateName)\n\n if (!fs.existsSync(sourceDir)) {\n console.error(picocolors.red(`Template \"${templateName}\" not found at ${sourceDir}`))\n return false\n }\n\n fs.mkdirSync(targetDir, { recursive: true })\n fs.cpSync(sourceDir, targetDir, {\n recursive: true,\n filter: (source) => {\n const basename = path.basename(source)\n return basename !== 'node_modules' && basename !== 'dist'\n },\n })\n\n // Rename _gitignore to .gitignore (npm strips .gitignore on publish)\n const gitignoreSrc = path.join(targetDir, '_gitignore')\n const gitignoreDest = path.join(targetDir, '.gitignore')\n if (fs.existsSync(gitignoreSrc)) {\n fs.renameSync(gitignoreSrc, gitignoreDest)\n }\n\n console.log(picocolors.green('✓'), 'Template copied successfully!')\n return true\n}\n\nexport function copyAgentsMd(projectDir: string): boolean {\n try {\n const templatesDir = getTemplatesDir()\n const sourceFile = path.join(templatesDir, 'quickstart', 'AGENTS.md')\n\n if (!fs.existsSync(sourceFile)) {\n return false\n }\n\n const destFile = path.join(projectDir, 'AGENTS.md')\n fs.copyFileSync(sourceFile, destFile)\n return true\n } catch {\n return false\n }\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\nfunction parseDotenv() {\n return dotenvConfig({ override: false }).parsed\n}\n\nfunction envFromAppPrivateData(parsed: Record<string, string> | undefined) {\n const appPrivateData = parsed?.APP_PRIVATE_DATA\n if (!appPrivateData) {\n return undefined\n }\n try {\n return parseAppPrivateData(appPrivateData)\n } catch {\n return undefined\n }\n}\nexport function resolveAppAddress(positionalArg: string | undefined): string | undefined {\n if (positionalArg) {\n return positionalArg\n }\n const parsed = parseDotenv()\n const appAddress = parsed?.APP_ADDRESS\n if (appAddress) {\n return appAddress\n }\n return envFromAppPrivateData(parsed)?.appAddress\n}\n\nexport function resolveRiverEnv(): string | undefined {\n const parsed = parseDotenv()\n return parsed?.RIVER_ENV ?? envFromAppPrivateData(parsed)?.env\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","{\n \"name\": \"towns-agent\",\n \"description\": \"CLI for creating and managing Towns Protocol bot projects\",\n \"version\": \"2.0.6\",\n \"author\": \"Towns Protocol\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"cli\": \"NODE_TLS_REJECT_UNAUTHORIZED=0 bun src/index.ts\",\n \"dev\": \"tsx src/index.ts\",\n \"lint\": \"eslint src --ext .ts\",\n \"lint:fix\": \"eslint src --ext .ts --fix\",\n \"watch\": \"tsup --watch\"\n },\n \"bin\": \"index.js\",\n \"dependencies\": {\n \"@bufbuild/protobuf\": \"^2.9.0\",\n \"@connectrpc/connect-node\": \"^2.1.0\",\n \"@towns-labs/contracts\": \"workspace:^\",\n \"@towns-labs/proto\": \"workspace:^\",\n \"@towns-labs/relayer-client\": \"workspace:^\",\n \"@towns-labs/sdk\": \"workspace:^\",\n \"@towns-labs/utils\": \"workspace:^\",\n \"cross-spawn\": \"^7.0.5\",\n \"dotenv\": \"^16.4.5\",\n \"ethers\": \"^5.8.0\",\n \"jsonc-parser\": \"^3.3.1\",\n \"minimist\": \"^1.2.8\",\n \"picocolors\": \"^1.1.1\",\n \"prompts\": \"^2.4.2\",\n \"tsx\": \"^4.7.1\",\n \"viem\": \"2.45.1\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@types/cross-spawn\": \"^6.0.6\",\n \"@types/minimist\": \"^1.2.5\",\n \"@types/node\": \"^20.14.8\",\n \"@types/prompts\": \"^2.4.9\",\n \"@typescript-eslint/eslint-plugin\": \"^8.29.0\",\n \"@typescript-eslint/parser\": \"^8.29.0\",\n \"eslint\": \"^8.57.1\",\n \"eslint-import-resolver-typescript\": \"^4.3.2\",\n \"eslint-plugin-import-x\": \"^4.10.2\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"~5.8.3\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"files\": [\n \"index.js\",\n \"dist\",\n \"templates\"\n ],\n \"keywords\": [\n \"bot\",\n \"cli\",\n \"protocol\",\n \"scaffold\",\n \"towns\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import fs from 'fs'\nimport path from 'path'\nimport { green, red, yellow, cyan } from 'picocolors'\nimport {\n getPackageManager,\n getInstallCommand,\n getDlxCommand,\n runCommand,\n installTownsSkills,\n copyAgentsMd,\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 = copyAgentsMd(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, resolveAppAddress } 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 = resolveAppAddress(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(\n red(\n 'App address is required. Provide it as an argument, or set APP_ADDRESS or APP_PRIVATE_DATA in .env.',\n ),\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 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, yellow } 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, resolveAppAddress } 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 = resolveAppAddress(argv._[1])\n if (!appAddress) {\n console.error(\n red(\n 'App address is required. Provide it as an argument, or set APP_ADDRESS or APP_PRIVATE_DATA in .env.',\n ),\n )\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 let webhookUrl = argv.webhookUrl ?? (await promptWebhookUrl())\n if (!webhookUrl) {\n console.error(red('Webhook URL is required.'))\n process.exit(1)\n }\n\n // Validate URL when provided via CLI flag (interactive mode validates in the prompt)\n if (argv.webhookUrl) {\n const urlError = validateWebhookUrl(webhookUrl)\n if (urlError !== true) {\n console.error(red(urlError))\n process.exit(1)\n }\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 // Try registering the webhook, and if it fails, retry with /webhook appended\n try {\n await appRegistryRpcClient.registerWebhook({ appId, webhookUrl })\n } catch (error) {\n if (!hasWebhookPath(webhookUrl)) {\n const webhookUrlWithPath = appendWebhookPath(webhookUrl)\n try {\n await appRegistryRpcClient.registerWebhook({\n appId,\n webhookUrl: webhookUrlWithPath,\n })\n console.log()\n console.log(yellow(`Registration succeeded with ${webhookUrlWithPath}`))\n webhookUrl = webhookUrlWithPath\n } catch {\n throw error\n }\n } else {\n throw error\n }\n }\n\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\nfunction hasWebhookPath(url: string): boolean {\n const trimmed = url.trim()\n try {\n const parsed = new URL(trimmed)\n const normalizedPath = parsed.pathname.endsWith('/')\n ? parsed.pathname.slice(0, -1)\n : parsed.pathname\n return normalizedPath.endsWith('/webhook')\n } catch {\n return trimmed.replace(/\\s*$/, '').endsWith('/webhook')\n }\n}\n\nfunction appendWebhookPath(url: string): string {\n const trimmed = url.trim()\n const parsed = new URL(trimmed)\n const normalizedPath = parsed.pathname.endsWith('/')\n ? parsed.pathname.slice(0, -1)\n : parsed.pathname\n parsed.pathname = normalizedPath === '/' ? '/webhook' : `${normalizedPath}/webhook`\n return parsed.toString()\n}\n\nfunction validateWebhookUrl(url: string): string | true {\n const trimmed = url.trim()\n if (!trimmed) {\n return 'Webhook URL is required'\n }\n try {\n const parsed = new URL(trimmed)\n const isLocalhost =\n parsed.hostname === 'localhost' ||\n parsed.hostname === '127.0.0.1' ||\n parsed.hostname === '0.0.0.0'\n if (isLocalhost && parsed.protocol === 'http:') {\n return 'Local bots must use HTTPS. Use https:// instead of http://'\n }\n if (isLocalhost && !parsed.port) {\n return 'Localhost URL is missing a port. Example: https://localhost:3000'\n }\n return true\n } catch {\n return 'Invalid URL format. Example: https://localhost:3000/webhook'\n }\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: validateWebhookUrl,\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","picocolors","basename","dotenvConfig","prompts","prompts","import_picocolors","version","path","fs","update","import_picocolors","import_prompts","import_picocolors","import_sdk","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/modules/init.ts","../src/modules/utils.ts","../package.json","../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'\nimport { resolveRiverEnv } from './modules/utils.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 const requiresEnv = ['create', 'setup', 'metadata'].includes(command)\n\n if (requiresEnv) {\n // Set RIVER_ENV from --env flag, fall back to process.env.RIVER_ENV, then .env file\n if (args.env) {\n process.env.RIVER_ENV = args.env\n }\n if (!process.env.RIVER_ENV) {\n const resolvedEnv = resolveRiverEnv()\n if (resolvedEnv) {\n process.env.RIVER_ENV = resolvedEnv\n }\n }\n if (!process.env.RIVER_ENV) {\n console.error(\n red(\n 'Environment is required. Use --env <local_dev|stage|prod>, set RIVER_ENV, or set APP_PRIVATE_DATA in .env.',\n ),\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\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> [appAddress] 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('Environment Options (create, setup, metadata):')}\n --env <name> Environment to use: local_dev, stage, prod\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 cliVersion,\n copyTemplate,\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: '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 // Copy template from embedded templates\n const success = copyTemplate(selectedTemplate.packagePath, targetDir)\n if (!success) {\n console.error(red('Failed to copy template'))\n process.exit(1)\n }\n const latestVersion = cliVersion\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 (best effort)\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(yellow('⚠'), 'Skipping Towns Agent Skills. Install later with:')\n console.log(yellow(` cd ${projectName} && towns-agent install-skill`))\n }\n } catch {\n console.log(yellow('⚠'), 'Skipping Towns Agent Skills. Install later with:')\n console.log(yellow(` cd ${projectName} && 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 { fileURLToPath } from 'node:url'\nimport { default as spawn } from 'cross-spawn'\nimport { default as prompts } from 'prompts'\nimport picocolors from 'picocolors'\nimport { config as dotenvConfig } from 'dotenv'\nimport { parseAppPrivateData } from '@towns-labs/sdk'\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 { version as cliVersion } from '../../package.json'\n\nexport function getTemplatesDir(): string {\n const currentDir =\n typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url))\n // From dist/ (compiled/published)\n const fromDist = path.resolve(currentDir, '..', 'templates')\n if (fs.existsSync(fromDist)) return fromDist\n // From src/modules/ (local dev)\n const fromSrc = path.resolve(currentDir, '..', '..', 'templates')\n if (fs.existsSync(fromSrc)) return fromSrc\n throw new Error('Templates directory not found')\n}\n\nexport function copyTemplate(templateName: string, targetDir: string): boolean {\n console.log(picocolors.blue('Copying template...'))\n\n const templatesDir = getTemplatesDir()\n const sourceDir = path.join(templatesDir, templateName)\n\n if (!fs.existsSync(sourceDir)) {\n console.error(picocolors.red(`Template \"${templateName}\" not found at ${sourceDir}`))\n return false\n }\n\n fs.mkdirSync(targetDir, { recursive: true })\n fs.cpSync(sourceDir, targetDir, {\n recursive: true,\n filter: (source) => {\n const basename = path.basename(source)\n return basename !== 'node_modules' && basename !== 'dist'\n },\n })\n\n // Rename _gitignore to .gitignore (npm strips .gitignore on publish)\n const gitignoreSrc = path.join(targetDir, '_gitignore')\n const gitignoreDest = path.join(targetDir, '.gitignore')\n if (fs.existsSync(gitignoreSrc)) {\n fs.renameSync(gitignoreSrc, gitignoreDest)\n }\n\n console.log(picocolors.green('✓'), 'Template copied successfully!')\n return true\n}\n\nexport function copyAgentsMd(projectDir: string): boolean {\n try {\n const templatesDir = getTemplatesDir()\n const sourceFile = path.join(templatesDir, 'quickstart', 'AGENTS.md')\n\n if (!fs.existsSync(sourceFile)) {\n return false\n }\n\n const destFile = path.join(projectDir, 'AGENTS.md')\n fs.copyFileSync(sourceFile, destFile)\n return true\n } catch {\n return false\n }\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\nfunction parseDotenv() {\n return dotenvConfig({ override: false }).parsed\n}\n\nfunction envFromAppPrivateData(parsed: Record<string, string> | undefined) {\n const appPrivateData = parsed?.APP_PRIVATE_DATA\n if (!appPrivateData) {\n return undefined\n }\n try {\n return parseAppPrivateData(appPrivateData)\n } catch {\n return undefined\n }\n}\nexport function resolveAppAddress(positionalArg: string | undefined): string | undefined {\n if (positionalArg) {\n return positionalArg\n }\n const parsed = parseDotenv()\n const appAddress = parsed?.APP_ADDRESS\n if (appAddress) {\n return appAddress\n }\n return envFromAppPrivateData(parsed)?.appAddress\n}\n\nexport function resolveRiverEnv(): string | undefined {\n const parsed = parseDotenv()\n return parsed?.RIVER_ENV ?? envFromAppPrivateData(parsed)?.env\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","{\n \"name\": \"towns-agent\",\n \"description\": \"CLI for creating and managing Towns Protocol bot projects\",\n \"version\": \"2.0.7\",\n \"author\": \"Towns Protocol\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"cli\": \"NODE_TLS_REJECT_UNAUTHORIZED=0 bun src/index.ts\",\n \"dev\": \"tsx src/index.ts\",\n \"lint\": \"eslint src --ext .ts\",\n \"lint:fix\": \"eslint src --ext .ts --fix\",\n \"watch\": \"tsup --watch\"\n },\n \"bin\": \"index.js\",\n \"dependencies\": {\n \"@bufbuild/protobuf\": \"^2.9.0\",\n \"@connectrpc/connect-node\": \"^2.1.0\",\n \"@towns-labs/contracts\": \"workspace:^\",\n \"@towns-labs/proto\": \"workspace:^\",\n \"@towns-labs/relayer-client\": \"workspace:^\",\n \"@towns-labs/sdk\": \"workspace:^\",\n \"@towns-labs/utils\": \"workspace:^\",\n \"cross-spawn\": \"^7.0.5\",\n \"dotenv\": \"^16.4.5\",\n \"ethers\": \"^5.8.0\",\n \"jsonc-parser\": \"^3.3.1\",\n \"minimist\": \"^1.2.8\",\n \"picocolors\": \"^1.1.1\",\n \"prompts\": \"^2.4.2\",\n \"tsx\": \"^4.7.1\",\n \"viem\": \"2.45.1\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@types/cross-spawn\": \"^6.0.6\",\n \"@types/minimist\": \"^1.2.5\",\n \"@types/node\": \"^20.14.8\",\n \"@types/prompts\": \"^2.4.9\",\n \"@typescript-eslint/eslint-plugin\": \"^8.29.0\",\n \"@typescript-eslint/parser\": \"^8.29.0\",\n \"eslint\": \"^8.57.1\",\n \"eslint-import-resolver-typescript\": \"^4.3.2\",\n \"eslint-plugin-import-x\": \"^4.10.2\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"~5.8.3\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"files\": [\n \"index.js\",\n \"dist\",\n \"templates\"\n ],\n \"keywords\": [\n \"bot\",\n \"cli\",\n \"protocol\",\n \"scaffold\",\n \"towns\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import fs from 'fs'\nimport path from 'path'\nimport { green, red, yellow, cyan } from 'picocolors'\nimport {\n getPackageManager,\n getInstallCommand,\n getDlxCommand,\n runCommand,\n installTownsSkills,\n copyAgentsMd,\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 = copyAgentsMd(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, resolveAppAddress } 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 = resolveAppAddress(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(\n red(\n 'App address is required. Provide it as an argument, or set APP_ADDRESS or APP_PRIVATE_DATA in .env.',\n ),\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 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, yellow } 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, resolveAppAddress } 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 = resolveAppAddress(argv._[1])\n if (!appAddress) {\n console.error(\n red(\n 'App address is required. Provide it as an argument, or set APP_ADDRESS or APP_PRIVATE_DATA in .env.',\n ),\n )\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 let webhookUrl = argv.webhookUrl ?? (await promptWebhookUrl())\n if (!webhookUrl) {\n console.error(red('Webhook URL is required.'))\n process.exit(1)\n }\n\n // Validate URL when provided via CLI flag (interactive mode validates in the prompt)\n if (argv.webhookUrl) {\n const urlError = validateWebhookUrl(webhookUrl)\n if (urlError !== true) {\n console.error(red(urlError))\n process.exit(1)\n }\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 // Try registering the webhook, and if it fails, retry with /webhook appended\n try {\n await appRegistryRpcClient.registerWebhook({ appId, webhookUrl })\n } catch (error) {\n if (!hasWebhookPath(webhookUrl)) {\n const webhookUrlWithPath = appendWebhookPath(webhookUrl)\n try {\n await appRegistryRpcClient.registerWebhook({\n appId,\n webhookUrl: webhookUrlWithPath,\n })\n console.log()\n console.log(yellow(`Registration succeeded with ${webhookUrlWithPath}`))\n webhookUrl = webhookUrlWithPath\n } catch {\n throw error\n }\n } else {\n throw error\n }\n }\n\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\nfunction hasWebhookPath(url: string): boolean {\n const trimmed = url.trim()\n try {\n const parsed = new URL(trimmed)\n const normalizedPath = parsed.pathname.endsWith('/')\n ? parsed.pathname.slice(0, -1)\n : parsed.pathname\n return normalizedPath.endsWith('/webhook')\n } catch {\n return trimmed.replace(/\\s*$/, '').endsWith('/webhook')\n }\n}\n\nfunction appendWebhookPath(url: string): string {\n const trimmed = url.trim()\n const parsed = new URL(trimmed)\n const normalizedPath = parsed.pathname.endsWith('/')\n ? parsed.pathname.slice(0, -1)\n : parsed.pathname\n parsed.pathname = normalizedPath === '/' ? '/webhook' : `${normalizedPath}/webhook`\n return parsed.toString()\n}\n\nfunction validateWebhookUrl(url: string): string | true {\n const trimmed = url.trim()\n if (!trimmed) {\n return 'Webhook URL is required'\n }\n try {\n const parsed = new URL(trimmed)\n const isLocalhost =\n parsed.hostname === 'localhost' ||\n parsed.hostname === '127.0.0.1' ||\n parsed.hostname === '0.0.0.0'\n if (isLocalhost && !parsed.port) {\n return 'Localhost URL is missing a port. Example: http://localhost:3000'\n }\n return true\n } catch {\n return 'Invalid URL format. Example: http://localhost:3000/webhook'\n }\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: validateWebhookUrl,\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","picocolors","basename","dotenvConfig","prompts","prompts","import_picocolors","version","path","fs","update","import_picocolors","import_prompts","import_picocolors","import_sdk","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
|
@@ -19,7 +19,7 @@ import { config as dotenvConfig } from "dotenv";
|
|
|
19
19
|
import { parseAppPrivateData } from "@towns-labs/sdk";
|
|
20
20
|
|
|
21
21
|
// package.json
|
|
22
|
-
var version = "2.0.
|
|
22
|
+
var version = "2.0.7";
|
|
23
23
|
|
|
24
24
|
// src/modules/utils.ts
|
|
25
25
|
var getPackageManager = () => {
|
|
@@ -909,15 +909,12 @@ function validateWebhookUrl(url) {
|
|
|
909
909
|
try {
|
|
910
910
|
const parsed = new URL(trimmed);
|
|
911
911
|
const isLocalhost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || parsed.hostname === "0.0.0.0";
|
|
912
|
-
if (isLocalhost && parsed.protocol === "http:") {
|
|
913
|
-
return "Local bots must use HTTPS. Use https:// instead of http://";
|
|
914
|
-
}
|
|
915
912
|
if (isLocalhost && !parsed.port) {
|
|
916
|
-
return "Localhost URL is missing a port. Example:
|
|
913
|
+
return "Localhost URL is missing a port. Example: http://localhost:3000";
|
|
917
914
|
}
|
|
918
915
|
return true;
|
|
919
916
|
} catch {
|
|
920
|
-
return "Invalid URL format. Example:
|
|
917
|
+
return "Invalid URL format. Example: http://localhost:3000/webhook";
|
|
921
918
|
}
|
|
922
919
|
}
|
|
923
920
|
async function promptWebhookUrl() {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/modules/init.ts","../src/modules/utils.ts","../package.json","../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'\nimport { resolveRiverEnv } from './modules/utils.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 const requiresEnv = ['create', 'setup', 'metadata'].includes(command)\n\n if (requiresEnv) {\n // Set RIVER_ENV from --env flag, fall back to process.env.RIVER_ENV, then .env file\n if (args.env) {\n process.env.RIVER_ENV = args.env\n }\n if (!process.env.RIVER_ENV) {\n const resolvedEnv = resolveRiverEnv()\n if (resolvedEnv) {\n process.env.RIVER_ENV = resolvedEnv\n }\n }\n if (!process.env.RIVER_ENV) {\n console.error(\n red(\n 'Environment is required. Use --env <local_dev|stage|prod>, set RIVER_ENV, or set APP_PRIVATE_DATA in .env.',\n ),\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\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> [appAddress] 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('Environment Options (create, setup, metadata):')}\n --env <name> Environment to use: local_dev, stage, prod\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 cliVersion,\n copyTemplate,\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: '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 // Copy template from embedded templates\n const success = copyTemplate(selectedTemplate.packagePath, targetDir)\n if (!success) {\n console.error(red('Failed to copy template'))\n process.exit(1)\n }\n const latestVersion = cliVersion\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 (best effort)\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(yellow('⚠'), 'Skipping Towns Agent Skills. Install later with:')\n console.log(yellow(` cd ${projectName} && towns-agent install-skill`))\n }\n } catch {\n console.log(yellow('⚠'), 'Skipping Towns Agent Skills. Install later with:')\n console.log(yellow(` cd ${projectName} && 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 { fileURLToPath } from 'node:url'\nimport { default as spawn } from 'cross-spawn'\nimport { default as prompts } from 'prompts'\nimport picocolors from 'picocolors'\nimport { config as dotenvConfig } from 'dotenv'\nimport { parseAppPrivateData } from '@towns-labs/sdk'\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 { version as cliVersion } from '../../package.json'\n\nexport function getTemplatesDir(): string {\n const currentDir =\n typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url))\n // From dist/ (compiled/published)\n const fromDist = path.resolve(currentDir, '..', 'templates')\n if (fs.existsSync(fromDist)) return fromDist\n // From src/modules/ (local dev)\n const fromSrc = path.resolve(currentDir, '..', '..', 'templates')\n if (fs.existsSync(fromSrc)) return fromSrc\n throw new Error('Templates directory not found')\n}\n\nexport function copyTemplate(templateName: string, targetDir: string): boolean {\n console.log(picocolors.blue('Copying template...'))\n\n const templatesDir = getTemplatesDir()\n const sourceDir = path.join(templatesDir, templateName)\n\n if (!fs.existsSync(sourceDir)) {\n console.error(picocolors.red(`Template \"${templateName}\" not found at ${sourceDir}`))\n return false\n }\n\n fs.mkdirSync(targetDir, { recursive: true })\n fs.cpSync(sourceDir, targetDir, {\n recursive: true,\n filter: (source) => {\n const basename = path.basename(source)\n return basename !== 'node_modules' && basename !== 'dist'\n },\n })\n\n // Rename _gitignore to .gitignore (npm strips .gitignore on publish)\n const gitignoreSrc = path.join(targetDir, '_gitignore')\n const gitignoreDest = path.join(targetDir, '.gitignore')\n if (fs.existsSync(gitignoreSrc)) {\n fs.renameSync(gitignoreSrc, gitignoreDest)\n }\n\n console.log(picocolors.green('✓'), 'Template copied successfully!')\n return true\n}\n\nexport function copyAgentsMd(projectDir: string): boolean {\n try {\n const templatesDir = getTemplatesDir()\n const sourceFile = path.join(templatesDir, 'quickstart', 'AGENTS.md')\n\n if (!fs.existsSync(sourceFile)) {\n return false\n }\n\n const destFile = path.join(projectDir, 'AGENTS.md')\n fs.copyFileSync(sourceFile, destFile)\n return true\n } catch {\n return false\n }\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\nfunction parseDotenv() {\n return dotenvConfig({ override: false }).parsed\n}\n\nfunction envFromAppPrivateData(parsed: Record<string, string> | undefined) {\n const appPrivateData = parsed?.APP_PRIVATE_DATA\n if (!appPrivateData) {\n return undefined\n }\n try {\n return parseAppPrivateData(appPrivateData)\n } catch {\n return undefined\n }\n}\nexport function resolveAppAddress(positionalArg: string | undefined): string | undefined {\n if (positionalArg) {\n return positionalArg\n }\n const parsed = parseDotenv()\n const appAddress = parsed?.APP_ADDRESS\n if (appAddress) {\n return appAddress\n }\n return envFromAppPrivateData(parsed)?.appAddress\n}\n\nexport function resolveRiverEnv(): string | undefined {\n const parsed = parseDotenv()\n return parsed?.RIVER_ENV ?? envFromAppPrivateData(parsed)?.env\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","{\n \"name\": \"towns-agent\",\n \"description\": \"CLI for creating and managing Towns Protocol bot projects\",\n \"version\": \"2.0.6\",\n \"author\": \"Towns Protocol\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"cli\": \"NODE_TLS_REJECT_UNAUTHORIZED=0 bun src/index.ts\",\n \"dev\": \"tsx src/index.ts\",\n \"lint\": \"eslint src --ext .ts\",\n \"lint:fix\": \"eslint src --ext .ts --fix\",\n \"watch\": \"tsup --watch\"\n },\n \"bin\": \"index.js\",\n \"dependencies\": {\n \"@bufbuild/protobuf\": \"^2.9.0\",\n \"@connectrpc/connect-node\": \"^2.1.0\",\n \"@towns-labs/contracts\": \"workspace:^\",\n \"@towns-labs/proto\": \"workspace:^\",\n \"@towns-labs/relayer-client\": \"workspace:^\",\n \"@towns-labs/sdk\": \"workspace:^\",\n \"@towns-labs/utils\": \"workspace:^\",\n \"cross-spawn\": \"^7.0.5\",\n \"dotenv\": \"^16.4.5\",\n \"ethers\": \"^5.8.0\",\n \"jsonc-parser\": \"^3.3.1\",\n \"minimist\": \"^1.2.8\",\n \"picocolors\": \"^1.1.1\",\n \"prompts\": \"^2.4.2\",\n \"tsx\": \"^4.7.1\",\n \"viem\": \"2.45.1\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@types/cross-spawn\": \"^6.0.6\",\n \"@types/minimist\": \"^1.2.5\",\n \"@types/node\": \"^20.14.8\",\n \"@types/prompts\": \"^2.4.9\",\n \"@typescript-eslint/eslint-plugin\": \"^8.29.0\",\n \"@typescript-eslint/parser\": \"^8.29.0\",\n \"eslint\": \"^8.57.1\",\n \"eslint-import-resolver-typescript\": \"^4.3.2\",\n \"eslint-plugin-import-x\": \"^4.10.2\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"~5.8.3\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"files\": [\n \"index.js\",\n \"dist\",\n \"templates\"\n ],\n \"keywords\": [\n \"bot\",\n \"cli\",\n \"protocol\",\n \"scaffold\",\n \"towns\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import fs from 'fs'\nimport path from 'path'\nimport { green, red, yellow, cyan } from 'picocolors'\nimport {\n getPackageManager,\n getInstallCommand,\n getDlxCommand,\n runCommand,\n installTownsSkills,\n copyAgentsMd,\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 = copyAgentsMd(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, resolveAppAddress } 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 = resolveAppAddress(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(\n red(\n 'App address is required. Provide it as an argument, or set APP_ADDRESS or APP_PRIVATE_DATA in .env.',\n ),\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 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, yellow } 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, resolveAppAddress } 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 = resolveAppAddress(argv._[1])\n if (!appAddress) {\n console.error(\n red(\n 'App address is required. Provide it as an argument, or set APP_ADDRESS or APP_PRIVATE_DATA in .env.',\n ),\n )\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 let webhookUrl = argv.webhookUrl ?? (await promptWebhookUrl())\n if (!webhookUrl) {\n console.error(red('Webhook URL is required.'))\n process.exit(1)\n }\n\n // Validate URL when provided via CLI flag (interactive mode validates in the prompt)\n if (argv.webhookUrl) {\n const urlError = validateWebhookUrl(webhookUrl)\n if (urlError !== true) {\n console.error(red(urlError))\n process.exit(1)\n }\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 // Try registering the webhook, and if it fails, retry with /webhook appended\n try {\n await appRegistryRpcClient.registerWebhook({ appId, webhookUrl })\n } catch (error) {\n if (!hasWebhookPath(webhookUrl)) {\n const webhookUrlWithPath = appendWebhookPath(webhookUrl)\n try {\n await appRegistryRpcClient.registerWebhook({\n appId,\n webhookUrl: webhookUrlWithPath,\n })\n console.log()\n console.log(yellow(`Registration succeeded with ${webhookUrlWithPath}`))\n webhookUrl = webhookUrlWithPath\n } catch {\n throw error\n }\n } else {\n throw error\n }\n }\n\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\nfunction hasWebhookPath(url: string): boolean {\n const trimmed = url.trim()\n try {\n const parsed = new URL(trimmed)\n const normalizedPath = parsed.pathname.endsWith('/')\n ? parsed.pathname.slice(0, -1)\n : parsed.pathname\n return normalizedPath.endsWith('/webhook')\n } catch {\n return trimmed.replace(/\\s*$/, '').endsWith('/webhook')\n }\n}\n\nfunction appendWebhookPath(url: string): string {\n const trimmed = url.trim()\n const parsed = new URL(trimmed)\n const normalizedPath = parsed.pathname.endsWith('/')\n ? parsed.pathname.slice(0, -1)\n : parsed.pathname\n parsed.pathname = normalizedPath === '/' ? '/webhook' : `${normalizedPath}/webhook`\n return parsed.toString()\n}\n\nfunction validateWebhookUrl(url: string): string | true {\n const trimmed = url.trim()\n if (!trimmed) {\n return 'Webhook URL is required'\n }\n try {\n const parsed = new URL(trimmed)\n const isLocalhost =\n parsed.hostname === 'localhost' ||\n parsed.hostname === '127.0.0.1' ||\n parsed.hostname === '0.0.0.0'\n if (isLocalhost && parsed.protocol === 'http:') {\n return 'Local bots must use HTTPS. Use https:// instead of http://'\n }\n if (isLocalhost && !parsed.port) {\n return 'Localhost URL is missing a port. Example: https://localhost:3000'\n }\n return true\n } catch {\n return 'Invalid URL format. Example: https://localhost:3000/webhook'\n }\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: validateWebhookUrl,\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","basename","prompts","fs","path","green","red","yellow","cyan","version","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","yellow","privateKeyToAccount","generatePrivateKey","AppRegistryService","makeSignerContextFromBearerToken","makeSignerContextFromViem","townsEnv","bin_fromHexString","red","townsEnv","bin_fromHexString","makeSignerContextFromViem","privateKeyToAccount","generatePrivateKey","makeSignerContextFromBearerToken","AppRegistryService","yellow","green","dim","prompts","townsEnv","red","townsEnv","cyan","yellow","green"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/modules/init.ts","../src/modules/utils.ts","../package.json","../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'\nimport { resolveRiverEnv } from './modules/utils.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 const requiresEnv = ['create', 'setup', 'metadata'].includes(command)\n\n if (requiresEnv) {\n // Set RIVER_ENV from --env flag, fall back to process.env.RIVER_ENV, then .env file\n if (args.env) {\n process.env.RIVER_ENV = args.env\n }\n if (!process.env.RIVER_ENV) {\n const resolvedEnv = resolveRiverEnv()\n if (resolvedEnv) {\n process.env.RIVER_ENV = resolvedEnv\n }\n }\n if (!process.env.RIVER_ENV) {\n console.error(\n red(\n 'Environment is required. Use --env <local_dev|stage|prod>, set RIVER_ENV, or set APP_PRIVATE_DATA in .env.',\n ),\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\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> [appAddress] 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('Environment Options (create, setup, metadata):')}\n --env <name> Environment to use: local_dev, stage, prod\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 cliVersion,\n copyTemplate,\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: '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 // Copy template from embedded templates\n const success = copyTemplate(selectedTemplate.packagePath, targetDir)\n if (!success) {\n console.error(red('Failed to copy template'))\n process.exit(1)\n }\n const latestVersion = cliVersion\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 (best effort)\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(yellow('⚠'), 'Skipping Towns Agent Skills. Install later with:')\n console.log(yellow(` cd ${projectName} && towns-agent install-skill`))\n }\n } catch {\n console.log(yellow('⚠'), 'Skipping Towns Agent Skills. Install later with:')\n console.log(yellow(` cd ${projectName} && 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 { fileURLToPath } from 'node:url'\nimport { default as spawn } from 'cross-spawn'\nimport { default as prompts } from 'prompts'\nimport picocolors from 'picocolors'\nimport { config as dotenvConfig } from 'dotenv'\nimport { parseAppPrivateData } from '@towns-labs/sdk'\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 { version as cliVersion } from '../../package.json'\n\nexport function getTemplatesDir(): string {\n const currentDir =\n typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url))\n // From dist/ (compiled/published)\n const fromDist = path.resolve(currentDir, '..', 'templates')\n if (fs.existsSync(fromDist)) return fromDist\n // From src/modules/ (local dev)\n const fromSrc = path.resolve(currentDir, '..', '..', 'templates')\n if (fs.existsSync(fromSrc)) return fromSrc\n throw new Error('Templates directory not found')\n}\n\nexport function copyTemplate(templateName: string, targetDir: string): boolean {\n console.log(picocolors.blue('Copying template...'))\n\n const templatesDir = getTemplatesDir()\n const sourceDir = path.join(templatesDir, templateName)\n\n if (!fs.existsSync(sourceDir)) {\n console.error(picocolors.red(`Template \"${templateName}\" not found at ${sourceDir}`))\n return false\n }\n\n fs.mkdirSync(targetDir, { recursive: true })\n fs.cpSync(sourceDir, targetDir, {\n recursive: true,\n filter: (source) => {\n const basename = path.basename(source)\n return basename !== 'node_modules' && basename !== 'dist'\n },\n })\n\n // Rename _gitignore to .gitignore (npm strips .gitignore on publish)\n const gitignoreSrc = path.join(targetDir, '_gitignore')\n const gitignoreDest = path.join(targetDir, '.gitignore')\n if (fs.existsSync(gitignoreSrc)) {\n fs.renameSync(gitignoreSrc, gitignoreDest)\n }\n\n console.log(picocolors.green('✓'), 'Template copied successfully!')\n return true\n}\n\nexport function copyAgentsMd(projectDir: string): boolean {\n try {\n const templatesDir = getTemplatesDir()\n const sourceFile = path.join(templatesDir, 'quickstart', 'AGENTS.md')\n\n if (!fs.existsSync(sourceFile)) {\n return false\n }\n\n const destFile = path.join(projectDir, 'AGENTS.md')\n fs.copyFileSync(sourceFile, destFile)\n return true\n } catch {\n return false\n }\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\nfunction parseDotenv() {\n return dotenvConfig({ override: false }).parsed\n}\n\nfunction envFromAppPrivateData(parsed: Record<string, string> | undefined) {\n const appPrivateData = parsed?.APP_PRIVATE_DATA\n if (!appPrivateData) {\n return undefined\n }\n try {\n return parseAppPrivateData(appPrivateData)\n } catch {\n return undefined\n }\n}\nexport function resolveAppAddress(positionalArg: string | undefined): string | undefined {\n if (positionalArg) {\n return positionalArg\n }\n const parsed = parseDotenv()\n const appAddress = parsed?.APP_ADDRESS\n if (appAddress) {\n return appAddress\n }\n return envFromAppPrivateData(parsed)?.appAddress\n}\n\nexport function resolveRiverEnv(): string | undefined {\n const parsed = parseDotenv()\n return parsed?.RIVER_ENV ?? envFromAppPrivateData(parsed)?.env\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","{\n \"name\": \"towns-agent\",\n \"description\": \"CLI for creating and managing Towns Protocol bot projects\",\n \"version\": \"2.0.7\",\n \"author\": \"Towns Protocol\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"cli\": \"NODE_TLS_REJECT_UNAUTHORIZED=0 bun src/index.ts\",\n \"dev\": \"tsx src/index.ts\",\n \"lint\": \"eslint src --ext .ts\",\n \"lint:fix\": \"eslint src --ext .ts --fix\",\n \"watch\": \"tsup --watch\"\n },\n \"bin\": \"index.js\",\n \"dependencies\": {\n \"@bufbuild/protobuf\": \"^2.9.0\",\n \"@connectrpc/connect-node\": \"^2.1.0\",\n \"@towns-labs/contracts\": \"workspace:^\",\n \"@towns-labs/proto\": \"workspace:^\",\n \"@towns-labs/relayer-client\": \"workspace:^\",\n \"@towns-labs/sdk\": \"workspace:^\",\n \"@towns-labs/utils\": \"workspace:^\",\n \"cross-spawn\": \"^7.0.5\",\n \"dotenv\": \"^16.4.5\",\n \"ethers\": \"^5.8.0\",\n \"jsonc-parser\": \"^3.3.1\",\n \"minimist\": \"^1.2.8\",\n \"picocolors\": \"^1.1.1\",\n \"prompts\": \"^2.4.2\",\n \"tsx\": \"^4.7.1\",\n \"viem\": \"2.45.1\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@types/cross-spawn\": \"^6.0.6\",\n \"@types/minimist\": \"^1.2.5\",\n \"@types/node\": \"^20.14.8\",\n \"@types/prompts\": \"^2.4.9\",\n \"@typescript-eslint/eslint-plugin\": \"^8.29.0\",\n \"@typescript-eslint/parser\": \"^8.29.0\",\n \"eslint\": \"^8.57.1\",\n \"eslint-import-resolver-typescript\": \"^4.3.2\",\n \"eslint-plugin-import-x\": \"^4.10.2\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"~5.8.3\"\n },\n \"engines\": {\n \"node\": \"^18.0.0 || >=20.0.0\"\n },\n \"files\": [\n \"index.js\",\n \"dist\",\n \"templates\"\n ],\n \"keywords\": [\n \"bot\",\n \"cli\",\n \"protocol\",\n \"scaffold\",\n \"towns\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import fs from 'fs'\nimport path from 'path'\nimport { green, red, yellow, cyan } from 'picocolors'\nimport {\n getPackageManager,\n getInstallCommand,\n getDlxCommand,\n runCommand,\n installTownsSkills,\n copyAgentsMd,\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 = copyAgentsMd(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, resolveAppAddress } 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 = resolveAppAddress(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(\n red(\n 'App address is required. Provide it as an argument, or set APP_ADDRESS or APP_PRIVATE_DATA in .env.',\n ),\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 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, yellow } 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, resolveAppAddress } 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 = resolveAppAddress(argv._[1])\n if (!appAddress) {\n console.error(\n red(\n 'App address is required. Provide it as an argument, or set APP_ADDRESS or APP_PRIVATE_DATA in .env.',\n ),\n )\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 let webhookUrl = argv.webhookUrl ?? (await promptWebhookUrl())\n if (!webhookUrl) {\n console.error(red('Webhook URL is required.'))\n process.exit(1)\n }\n\n // Validate URL when provided via CLI flag (interactive mode validates in the prompt)\n if (argv.webhookUrl) {\n const urlError = validateWebhookUrl(webhookUrl)\n if (urlError !== true) {\n console.error(red(urlError))\n process.exit(1)\n }\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 // Try registering the webhook, and if it fails, retry with /webhook appended\n try {\n await appRegistryRpcClient.registerWebhook({ appId, webhookUrl })\n } catch (error) {\n if (!hasWebhookPath(webhookUrl)) {\n const webhookUrlWithPath = appendWebhookPath(webhookUrl)\n try {\n await appRegistryRpcClient.registerWebhook({\n appId,\n webhookUrl: webhookUrlWithPath,\n })\n console.log()\n console.log(yellow(`Registration succeeded with ${webhookUrlWithPath}`))\n webhookUrl = webhookUrlWithPath\n } catch {\n throw error\n }\n } else {\n throw error\n }\n }\n\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\nfunction hasWebhookPath(url: string): boolean {\n const trimmed = url.trim()\n try {\n const parsed = new URL(trimmed)\n const normalizedPath = parsed.pathname.endsWith('/')\n ? parsed.pathname.slice(0, -1)\n : parsed.pathname\n return normalizedPath.endsWith('/webhook')\n } catch {\n return trimmed.replace(/\\s*$/, '').endsWith('/webhook')\n }\n}\n\nfunction appendWebhookPath(url: string): string {\n const trimmed = url.trim()\n const parsed = new URL(trimmed)\n const normalizedPath = parsed.pathname.endsWith('/')\n ? parsed.pathname.slice(0, -1)\n : parsed.pathname\n parsed.pathname = normalizedPath === '/' ? '/webhook' : `${normalizedPath}/webhook`\n return parsed.toString()\n}\n\nfunction validateWebhookUrl(url: string): string | true {\n const trimmed = url.trim()\n if (!trimmed) {\n return 'Webhook URL is required'\n }\n try {\n const parsed = new URL(trimmed)\n const isLocalhost =\n parsed.hostname === 'localhost' ||\n parsed.hostname === '127.0.0.1' ||\n parsed.hostname === '0.0.0.0'\n if (isLocalhost && !parsed.port) {\n return 'Localhost URL is missing a port. Example: http://localhost:3000'\n }\n return true\n } catch {\n return 'Invalid URL format. Example: http://localhost:3000/webhook'\n }\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: validateWebhookUrl,\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","basename","prompts","fs","path","green","red","yellow","cyan","version","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","yellow","privateKeyToAccount","generatePrivateKey","AppRegistryService","makeSignerContextFromBearerToken","makeSignerContextFromViem","townsEnv","bin_fromHexString","red","townsEnv","bin_fromHexString","makeSignerContextFromViem","privateKeyToAccount","generatePrivateKey","makeSignerContextFromBearerToken","AppRegistryService","yellow","green","dim","prompts","townsEnv","red","townsEnv","cyan","yellow","green"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import "dotenv/config"
|
|
2
|
-
import { serve } from "@hono/node-server"
|
|
3
2
|
import { makeTownsAgent } from "@towns-labs/agent"
|
|
4
|
-
import { createServer } from "node:http2"
|
|
5
3
|
import commands from "./commands"
|
|
6
4
|
|
|
7
5
|
const bot = await makeTownsAgent(
|
|
@@ -49,8 +47,4 @@ bot.onReaction(async (handler, { reaction, channelId }) => {
|
|
|
49
47
|
})
|
|
50
48
|
|
|
51
49
|
const app = bot.start()
|
|
52
|
-
|
|
53
|
-
fetch: app.fetch,
|
|
54
|
-
port: Number(process.env.PORT) || 5123,
|
|
55
|
-
createServer,
|
|
56
|
-
})
|
|
50
|
+
export default app
|