Skip to content

Commit 3c3578b

Browse files
committed
feat: add CLI commands for fetch pattern demonstration
- Add fetch-example command with backend, cache, and user-agent options - Add configure-fetch command for runtime fetch configuration - Implement comprehensive option parsing and error handling - Provide clear CLI help and command descriptions - Total of 3 CLI commands now available
1 parent b507c3d commit 3c3578b

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

src/cli.ts

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import chalk from 'chalk';
77
import { Command } from 'commander';
88
import ora from 'ora';
99
import { exampleTool } from './tools/example.js';
10+
import { configureFetchTool, fetchExampleTool } from './tools/fetch-example.js';
1011

1112
/**
1213
* Create and configure the CLI command structure
@@ -49,5 +50,89 @@ export function createCLI() {
4950
}
5051
});
5152

53+
// Fetch example tool command
54+
program
55+
.command('fetch-example <url>')
56+
.description('Demonstrate configurable fetch patterns with different backends and caching')
57+
.option(
58+
'-b, --backend <backend>',
59+
'Fetch backend to use (built-in, cache-memory, cache-disk)',
60+
)
61+
.option('--no-cache', 'Bypass cache for this request')
62+
.option('-u, --user-agent <agent>', 'Custom User-Agent header for this request')
63+
.action(
64+
async (
65+
url: string,
66+
options: { backend?: string; cache?: boolean; userAgent?: string },
67+
) => {
68+
const spinner = ora('Fetching data...').start();
69+
try {
70+
const args: any = { url };
71+
if (options.backend) args.backend = options.backend;
72+
if (options.cache === false) args.no_cache = true;
73+
if (options.userAgent) args.user_agent = options.userAgent;
74+
75+
const result = await fetchExampleTool(args);
76+
77+
if (result.isError) {
78+
spinner.fail(chalk.red('Error fetching data'));
79+
console.error(chalk.red(result.content[0].text));
80+
process.exit(1);
81+
} else {
82+
spinner.succeed(chalk.green('Fetch completed!'));
83+
console.log(result.content[0].text);
84+
}
85+
} catch (error) {
86+
spinner.fail(chalk.red('Error fetching data'));
87+
console.error(error);
88+
process.exit(1);
89+
}
90+
},
91+
);
92+
93+
// Configure fetch tool command
94+
program
95+
.command('configure-fetch')
96+
.description('Configure the global fetch instance settings and caching behavior')
97+
.option('-b, --backend <backend>', 'Default fetch backend to use')
98+
.option('-t, --cache-ttl <ms>', 'Cache TTL in milliseconds', Number.parseInt)
99+
.option('-d, --cache-dir <dir>', 'Directory for disk caching')
100+
.option('-u, --user-agent <agent>', 'Default User-Agent header')
101+
.option('--clear-cache', 'Clear all caches')
102+
.action(
103+
async (options: {
104+
backend?: string;
105+
cacheTtl?: number;
106+
cacheDir?: string;
107+
userAgent?: string;
108+
clearCache?: boolean;
109+
}) => {
110+
const spinner = ora('Updating fetch configuration...').start();
111+
try {
112+
const args: any = {};
113+
if (options.backend) args.backend = options.backend;
114+
if (options.cacheTtl) args.cache_ttl = options.cacheTtl;
115+
if (options.cacheDir) args.cache_dir = options.cacheDir;
116+
if (options.userAgent) args.user_agent = options.userAgent;
117+
if (options.clearCache) args.clear_cache = true;
118+
119+
const result = await configureFetchTool(args);
120+
121+
if (result.isError) {
122+
spinner.fail(chalk.red('Error updating configuration'));
123+
console.error(chalk.red(result.content[0].text));
124+
process.exit(1);
125+
} else {
126+
spinner.succeed(chalk.green('Configuration updated!'));
127+
console.log(result.content[0].text);
128+
}
129+
} catch (error) {
130+
spinner.fail(chalk.red('Error updating configuration'));
131+
console.error(error);
132+
process.exit(1);
133+
}
134+
},
135+
);
136+
52137
return program;
53138
}

0 commit comments

Comments
 (0)