@@ -273,21 +433,35 @@ export default async function HomePage(): Promise
{
{'{'}
- {'\n '}"mcpServers": {'{'}
- {'\n '}"tpmjs": {'{'}
- {'\n '}"command": "npx",
- {'\n '}"args": ["-y", "@anthropic/mcp-remote",
- {'\n '}"https://tpmjs.com/api/mcp/ajax/ajax-collection/sse"]
- {'\n '}{'}'}
- {'\n '}{'}'}
- {'\n'}{'}'}
+ {'\n '}
+ "mcpServers":{' '}
+ {'{'}
+ {'\n '}
+ "tpmjs":{' '}
+ {'{'}
+ {'\n '}
+ "command":{' '}
+ "npx",{'\n '}
+ "args": [
+ "-y",{' '}
+ "@anthropic/mcp-remote",{'\n '}
+
+ "https://tpmjs.com/api/mcp/ajax/ajax-collection/sse"
+
+ ]{'\n '}
+ {'}'}
+ {'\n '}
+ {'}'}
+ {'\n'}
+ {'}'}
- add to config → instant access to 170+ tools
+ add to config → instant access to{' '}
+ 170+ tools
diff --git a/apps/web/src/app/scenarios/[id]/page.tsx b/apps/web/src/app/scenarios/[id]/page.tsx
new file mode 100644
index 0000000..3d9345f
--- /dev/null
+++ b/apps/web/src/app/scenarios/[id]/page.tsx
@@ -0,0 +1,468 @@
+'use client';
+
+import { Badge } from '@tpmjs/ui/Badge/Badge';
+import { Button } from '@tpmjs/ui/Button/Button';
+import { Icon } from '@tpmjs/ui/Icon/Icon';
+import Link from 'next/link';
+import { notFound, useParams } from 'next/navigation';
+import { useCallback, useEffect, useState } from 'react';
+import { AppHeader } from '~/components/AppHeader';
+
+interface ScenarioRun {
+ id: string;
+ status: string;
+ retryCount: number;
+ evaluator: {
+ model: string | null;
+ verdict: string | null;
+ reason: string | null;
+ };
+ assertions: { passed: string[]; failed: string[] } | null;
+ usage: {
+ inputTokens: number | null;
+ outputTokens: number | null;
+ totalTokens: number | null;
+ executionTimeMs: number | null;
+ estimatedCost: number | null;
+ };
+ timestamps: {
+ startedAt: string | null;
+ completedAt: string | null;
+ createdAt: string;
+ };
+ output?: string;
+ errorLog?: string;
+ conversation?: unknown[];
+}
+
+interface ScenarioDetail {
+ id: string;
+ collectionId: string | null;
+ prompt: string;
+ name: string | null;
+ description: string | null;
+ tags: string[];
+ qualityScore: number;
+ consecutivePasses: number;
+ consecutiveFails: number;
+ totalRuns: number;
+ lastRunAt: string | null;
+ lastRunStatus: string | null;
+ createdAt: string;
+ updatedAt: string;
+ isOwner: boolean;
+ collection: {
+ id: string;
+ name: string;
+ slug: string;
+ username: string;
+ } | null;
+ recentRuns: ScenarioRun[];
+ runCount: number;
+}
+
+function StatusBadge({ status }: { status: string | null }) {
+ if (!status) {
+ return
Not run;
+ }
+
+ switch (status) {
+ case 'pass':
+ return (
+
+
+ Pass
+
+ );
+ case 'fail':
+ return (
+
+
+ Fail
+
+ );
+ case 'error':
+ return (
+
+
+ Error
+
+ );
+ case 'running':
+ return (
+
+
+ Running
+
+ );
+ case 'pending':
+ return (
+
+
+ Pending
+
+ );
+ default:
+ return
{status};
+ }
+}
+
+function QualityIndicator({ score, showLabel = true }: { score: number; showLabel?: boolean }) {
+ const percentage = Math.round(score * 100);
+ const color =
+ percentage >= 70
+ ? 'text-success'
+ : percentage >= 40
+ ? 'text-warning'
+ : 'text-foreground-tertiary';
+
+ return (
+
+
+ {percentage}%
+ {showLabel && quality}
+
+ );
+}
+
+function formatDuration(ms: number | null): string {
+ if (!ms) return '—';
+ if (ms < 1000) return `${ms}ms`;
+ return `${(ms / 1000).toFixed(1)}s`;
+}
+
+function formatDate(dateString: string): string {
+ return new Date(dateString).toLocaleDateString('en-US', {
+ month: 'short',
+ day: 'numeric',
+ year: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit',
+ });
+}
+
+export default function ScenarioDetailPage(): React.ReactElement {
+ const params = useParams();
+ const scenarioId = params.id as string;
+
+ const [scenario, setScenario] = useState
(null);
+ const [runs, setRuns] = useState([]);
+ const [isLoading, setIsLoading] = useState(true);
+ const [error, setError] = useState(null);
+ const [isRunning, setIsRunning] = useState(false);
+ const [runError, setRunError] = useState(null);
+ const [expandedRunId, setExpandedRunId] = useState(null);
+
+ const fetchScenario = useCallback(async () => {
+ try {
+ const response = await fetch(`/api/scenarios/${scenarioId}?runsLimit=50`);
+ if (response.status === 404) {
+ setError('not_found');
+ return;
+ }
+ const data = await response.json();
+
+ if (data.success) {
+ setScenario(data.data);
+ setRuns(data.data.recentRuns || []);
+ } else {
+ setError(data.error?.message || 'Failed to load scenario');
+ }
+ } catch {
+ setError('Failed to load scenario');
+ } finally {
+ setIsLoading(false);
+ }
+ }, [scenarioId]);
+
+ useEffect(() => {
+ fetchScenario();
+ }, [fetchScenario]);
+
+ const handleRunScenario = async () => {
+ setIsRunning(true);
+ setRunError(null);
+
+ try {
+ const response = await fetch(`/api/scenarios/${scenarioId}/run`, {
+ method: 'POST',
+ });
+
+ if (response.status === 429) {
+ const data = await response.json();
+ setRunError(`Rate limited. Try again in ${Math.ceil(data.retryAfter / 60)} minute(s).`);
+ return;
+ }
+
+ if (!response.ok) {
+ const data = await response.json();
+ throw new Error(data.error?.message || 'Failed to run scenario');
+ }
+
+ // Refresh to show updated status
+ await fetchScenario();
+ } catch (err) {
+ setRunError(err instanceof Error ? err.message : 'Failed to run scenario');
+ } finally {
+ setIsRunning(false);
+ }
+ };
+
+ if (error === 'not_found') {
+ notFound();
+ }
+
+ return (
+
+
+
+
+ {isLoading ? (
+
+
+
+ ) : error ? (
+
+ ) : scenario ? (
+
+ {/* Breadcrumb */}
+
+
+ {/* Header */}
+
+
+
+ {scenario.name || 'Unnamed Scenario'}
+
+ {scenario.description && (
+
{scenario.description}
+ )}
+
+ {scenario.isOwner && (
+
+ )}
+
+
+ {runError && (
+
+ {runError}
+
+ )}
+
+ {/* Prompt */}
+
+
+ Prompt
+
+
{scenario.prompt}
+
+
+ {/* Stats */}
+
+
+
+
Total Runs
+
{scenario.totalRuns}
+
+
+
Pass Streak
+
+
+ {scenario.consecutivePasses}
+
+
+
+
Fail Streak
+
+
+ {scenario.consecutiveFails}
+
+
+
+
+
+ {/* Tags */}
+ {scenario.tags.length > 0 && (
+
+ {scenario.tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+ )}
+
+ {/* Run History */}
+
+ Run History
+
+ {runs.length === 0 ? (
+
+
+
No runs yet
+ {scenario.isOwner && (
+
+ )}
+
+ ) : (
+
+ {runs.map((run) => (
+
+ {/* Run Header */}
+
+
+ {/* Run Details (Expanded) */}
+ {expandedRunId === run.id && (
+
+
+ {/* Evaluator */}
+ {run.evaluator.verdict && (
+
+
+ LLM Evaluation
+
+
+
+ {run.evaluator.model && (
+
+ {run.evaluator.model}
+
+ )}
+
+ {run.evaluator.reason && (
+
+ {run.evaluator.reason}
+
+ )}
+
+ )}
+
+ {/* Usage Stats */}
+
+
+ Usage
+
+
+
+ Duration:{' '}
+
+ {formatDuration(run.usage.executionTimeMs)}
+
+
+
+ Tokens:{' '}
+
+ {run.usage.totalTokens?.toLocaleString() || '—'}
+
+
+
+ Retries:{' '}
+ {run.retryCount}
+
+
+
+
+
+ {/* Output (if owner) */}
+ {run.output && (
+
+
+ Output
+
+
+ {run.output}
+
+
+ )}
+
+ {/* Error Log (if owner and error) */}
+ {run.errorLog && (
+
+
+ Error Log
+
+
+ {run.errorLog}
+
+
+ )}
+
+ )}
+
+ ))}
+
+ )}
+
+
+ ) : null}
+
+
+ );
+}
diff --git a/apps/web/src/app/scenarios/page.tsx b/apps/web/src/app/scenarios/page.tsx
new file mode 100644
index 0000000..4ccb7cd
--- /dev/null
+++ b/apps/web/src/app/scenarios/page.tsx
@@ -0,0 +1,297 @@
+'use client';
+
+import { Badge } from '@tpmjs/ui/Badge/Badge';
+import { EmptyState } from '@tpmjs/ui/EmptyState/EmptyState';
+import { ErrorState } from '@tpmjs/ui/ErrorState/ErrorState';
+import { Icon } from '@tpmjs/ui/Icon/Icon';
+import { Input } from '@tpmjs/ui/Input/Input';
+import { LoadingState } from '@tpmjs/ui/LoadingState/LoadingState';
+import { PageHeader } from '@tpmjs/ui/PageHeader/PageHeader';
+import { Select } from '@tpmjs/ui/Select/Select';
+import Link from 'next/link';
+import { useCallback, useMemo, useState } from 'react';
+import { TableVirtuoso } from 'react-virtuoso';
+import { AppHeader } from '~/components/AppHeader';
+import { type PublicScenario, useScenarios } from '~/hooks/useScenarios';
+
+type SortOption = 'qualityScore' | 'totalRuns' | 'createdAt' | 'lastRunAt';
+
+function sortScenarios(scenarios: PublicScenario[], sortBy: SortOption): PublicScenario[] {
+ return [...scenarios].sort((a, b) => {
+ switch (sortBy) {
+ case 'qualityScore':
+ return b.qualityScore - a.qualityScore;
+ case 'totalRuns':
+ return b.totalRuns - a.totalRuns;
+ case 'createdAt':
+ return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();
+ case 'lastRunAt': {
+ const aTime = a.lastRunAt ? new Date(a.lastRunAt).getTime() : 0;
+ const bTime = b.lastRunAt ? new Date(b.lastRunAt).getTime() : 0;
+ return bTime - aTime;
+ }
+ default:
+ return 0;
+ }
+ });
+}
+
+function truncateText(text: string, maxLength: number): string {
+ if (text.length <= maxLength) return text;
+ return `${text.slice(0, maxLength).trim()}...`;
+}
+
+function StatusBadge({ status }: { status: string | null }) {
+ if (!status) {
+ return (
+
+ Not run
+
+ );
+ }
+
+ switch (status) {
+ case 'pass':
+ return (
+
+
+ Pass
+
+ );
+ case 'fail':
+ return (
+
+
+ Fail
+
+ );
+ case 'error':
+ return (
+
+
+ Error
+
+ );
+ default:
+ return (
+
+ {status}
+
+ );
+ }
+}
+
+function QualityScore({ score }: { score: number }) {
+ const percentage = Math.round(score * 100);
+ const color =
+ percentage >= 70
+ ? 'text-success'
+ : percentage >= 40
+ ? 'text-warning'
+ : 'text-foreground-tertiary';
+
+ return (
+
+
+ {percentage}%
+
+ );
+}
+
+export default function ScenariosExplorerPage(): React.ReactElement {
+ const [search, setSearch] = useState('');
+ const [sort, setSort] = useState('qualityScore');
+
+ // Fetch scenarios using SWR
+ const { data, isLoading, error: swrError, mutate } = useScenarios({ sortBy: sort });
+
+ const scenarios = data?.scenarios ?? [];
+ const hasMore = data?.pagination.hasMore ?? false;
+ const error = swrError?.message ?? null;
+
+ // Filter and sort scenarios (client-side search)
+ const filteredScenarios = useMemo(() => {
+ let result = scenarios;
+
+ if (search) {
+ const query = search.toLowerCase();
+ result = result.filter(
+ (s: PublicScenario) =>
+ s.prompt.toLowerCase().includes(query) ||
+ s.name?.toLowerCase().includes(query) ||
+ s.tags.some((tag) => tag.toLowerCase().includes(query)) ||
+ s.collection?.name.toLowerCase().includes(query)
+ );
+ }
+
+ return sortScenarios(result, sort);
+ }, [scenarios, search, sort]);
+
+ const TableHeader = useCallback(
+ () => (
+
+ | Scenario |
+ Collection |
+ Quality |
+ Runs |
+ Status |
+ Tags |
+
+ ),
+ []
+ );
+
+ const TableRow = useCallback((_index: number, scenario: PublicScenario) => {
+ const detailUrl = scenario.collection
+ ? `/@${scenario.collection.username}/collections/${scenario.collection.slug}/scenarios/${scenario.id}`
+ : `/scenarios/${scenario.id}`;
+
+ return (
+ <>
+
+
+
+ {scenario.name || truncateText(scenario.prompt, 50)}
+
+ {scenario.name && (
+
+ {truncateText(scenario.prompt, 80)}
+
+ )}
+
+ |
+
+ {scenario.collection ? (
+
+ {scenario.collection.name}
+
+ ) : (
+ —
+ )}
+ |
+
+
+ |
+
+
+ {scenario.totalRuns}
+
+ |
+
+
+ |
+
+
+ {scenario.tags.slice(0, 2).map((tag) => (
+
+ {tag}
+
+ ))}
+ {scenario.tags.length > 2 && (
+
+ +{scenario.tags.length - 2}
+
+ )}
+
+ |
+ >
+ );
+ }, []);
+
+ return (
+
+
+
+
+
+
+ {/* Filters */}
+
+
+ setSearch(e.target.value)}
+ placeholder="Search scenarios..."
+ />
+
+
+
+ Sort:
+
+
+
+ {/* Content */}
+ {error ? (
+ mutate()} />
+ ) : isLoading ? (
+
+ ) : filteredScenarios.length === 0 ? (
+
+ ) : (
+ <>
+
+
(
+
+ ),
+ TableHead: (props) => (
+
+ ),
+ TableBody: (props) => ,
+ TableRow: (props) => (
+
+ ),
+ }}
+ />
+
+
+
+ Showing {filteredScenarios.length} scenario
+ {filteredScenarios.length !== 1 ? 's' : ''}
+ {search && ` matching "${search}"`}
+ {hasMore && ' (scroll for more)'}
+
+ >
+ )}
+
+
+ );
+}
diff --git a/apps/web/src/hooks/useScenarios.ts b/apps/web/src/hooks/useScenarios.ts
new file mode 100644
index 0000000..d512620
--- /dev/null
+++ b/apps/web/src/hooks/useScenarios.ts
@@ -0,0 +1,86 @@
+import useSWR from 'swr';
+
+export interface PublicScenario {
+ id: string;
+ collectionId: string | null;
+ prompt: string;
+ name: string | null;
+ description: string | null;
+ tags: string[];
+ qualityScore: number;
+ totalRuns: number;
+ lastRunAt: string | null;
+ lastRunStatus: string | null;
+ createdAt: string;
+ collection: {
+ id: string;
+ name: string;
+ slug: string;
+ username: string;
+ } | null;
+ runCount: number;
+}
+
+export interface UseScenariosParams {
+ sortBy?: 'qualityScore' | 'totalRuns' | 'createdAt' | 'lastRunAt';
+ limit?: number;
+ offset?: number;
+ tags?: string[];
+}
+
+interface ScenariosResponse {
+ scenarios: PublicScenario[];
+ pagination: {
+ hasMore: boolean;
+ limit: number;
+ offset: number;
+ };
+}
+
+/**
+ * Fetch public scenarios
+ */
+export function useScenarios(params: UseScenariosParams = {}) {
+ const searchParams = new URLSearchParams();
+
+ searchParams.set('limit', String(params.limit ?? 100));
+ searchParams.set('offset', String(params.offset ?? 0));
+ if (params.sortBy) {
+ searchParams.set('sortBy', params.sortBy);
+ }
+ if (params.tags && params.tags.length > 0) {
+ searchParams.set('tags', params.tags.join(','));
+ }
+
+ const queryString = searchParams.toString();
+
+ return useSWR(`/api/scenarios?${queryString}`, async (url: string) => {
+ const res = await fetch(url);
+ const json = await res.json();
+
+ if (!json.success) {
+ throw new Error(json.error?.message || 'Failed to fetch scenarios');
+ }
+
+ return {
+ scenarios: json.data,
+ pagination: json.pagination,
+ };
+ });
+}
+
+/**
+ * Fetch featured scenarios for homepage
+ */
+export function useFeaturedScenarios(limit = 6) {
+ return useSWR(`/api/scenarios/featured?limit=${limit}`, async (url: string) => {
+ const res = await fetch(url);
+ const json = await res.json();
+
+ if (!json.success) {
+ throw new Error(json.error?.message || 'Failed to fetch featured scenarios');
+ }
+
+ return json.data;
+ });
+}
diff --git a/packages/cli/oclif.manifest.json b/packages/cli/oclif.manifest.json
new file mode 100644
index 0000000..eaab908
--- /dev/null
+++ b/packages/cli/oclif.manifest.json
@@ -0,0 +1,1789 @@
+{
+ "commands": {
+ "doctor": {
+ "aliases": [],
+ "args": {},
+ "description": "Run diagnostic checks for TPMJS CLI",
+ "examples": ["<%= config.bin %> <%= command.id %>"],
+ "flags": {
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "doctor",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "doctor.js"]
+ },
+ "playground": {
+ "aliases": [],
+ "args": {},
+ "description": "Interactive playground for testing tools",
+ "examples": [
+ "<%= config.bin %> <%= command.id %>",
+ "<%= config.bin %> <%= command.id %> --tool firecrawl-scrape",
+ "<%= config.bin %> <%= command.id %> --web"
+ ],
+ "flags": {
+ "tool": {
+ "char": "t",
+ "description": "Start with a specific tool selected",
+ "name": "tool",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "web": {
+ "char": "w",
+ "description": "Open the web playground instead",
+ "name": "web",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "playground",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "playground.js"]
+ },
+ "update": {
+ "aliases": [],
+ "args": {},
+ "description": "Update the TPMJS CLI to the latest version",
+ "examples": ["<%= config.bin %> <%= command.id %>"],
+ "flags": {
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "check": {
+ "description": "Only check for updates, do not install",
+ "name": "check",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "update",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "update.js"]
+ },
+ "agent:chat": {
+ "aliases": [],
+ "args": {
+ "agent": {
+ "description": "Agent ID or UID",
+ "name": "agent",
+ "required": true
+ },
+ "message": {
+ "description": "Message to send (required unless --interactive)",
+ "name": "message"
+ }
+ },
+ "description": "Chat with an agent",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> my-agent \"Hello!\"",
+ "<%= config.bin %> <%= command.id %> my-agent --interactive",
+ "<%= config.bin %> <%= command.id %> my-agent -i"
+ ],
+ "flags": {
+ "interactive": {
+ "char": "i",
+ "description": "Enter interactive chat mode (REPL)",
+ "name": "interactive",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "conversation": {
+ "char": "c",
+ "description": "Continue existing conversation by ID",
+ "name": "conversation",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "agent:chat",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "agent", "chat.js"]
+ },
+ "agent:create": {
+ "aliases": [],
+ "args": {},
+ "description": "Create a new agent",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> --name \"My Agent\" --provider ANTHROPIC --model claude-3-5-sonnet-20241022",
+ "<%= config.bin %> <%= command.id %> --name \"GPT Agent\" --provider OPENAI --model gpt-4o --public"
+ ],
+ "flags": {
+ "name": {
+ "char": "n",
+ "description": "Agent name",
+ "name": "name",
+ "required": true,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "uid": {
+ "description": "Unique identifier (URL-friendly)",
+ "name": "uid",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "description": {
+ "char": "d",
+ "description": "Agent description",
+ "name": "description",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "provider": {
+ "char": "p",
+ "description": "AI provider (ANTHROPIC, OPENAI, GOOGLE, GROQ, MISTRAL)",
+ "name": "provider",
+ "required": true,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "options": ["ANTHROPIC", "OPENAI", "GOOGLE", "GROQ", "MISTRAL"],
+ "type": "option"
+ },
+ "model": {
+ "char": "m",
+ "description": "Model ID",
+ "name": "model",
+ "required": true,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "system-prompt": {
+ "char": "s",
+ "description": "System prompt",
+ "name": "system-prompt",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "temperature": {
+ "char": "t",
+ "description": "Temperature (0-2)",
+ "name": "temperature",
+ "default": "0.7",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "public": {
+ "description": "Make agent public",
+ "name": "public",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "agent:create",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "agent", "create.js"]
+ },
+ "agent:delete": {
+ "aliases": [],
+ "args": {
+ "id": {
+ "description": "Agent ID or UID",
+ "name": "id",
+ "required": true
+ }
+ },
+ "description": "Delete an agent",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> my-agent",
+ "<%= config.bin %> <%= command.id %> my-agent --force"
+ ],
+ "flags": {
+ "force": {
+ "char": "f",
+ "description": "Skip confirmation prompt",
+ "name": "force",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "agent:delete",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "agent", "delete.js"]
+ },
+ "agent:list": {
+ "aliases": [],
+ "args": {},
+ "description": "List your agents",
+ "examples": [
+ "<%= config.bin %> <%= command.id %>",
+ "<%= config.bin %> <%= command.id %> --limit 10"
+ ],
+ "flags": {
+ "limit": {
+ "char": "l",
+ "description": "Maximum number of results",
+ "name": "limit",
+ "default": 20,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "offset": {
+ "char": "o",
+ "description": "Offset for pagination",
+ "name": "offset",
+ "default": 0,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "agent:list",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "agent", "list.js"]
+ },
+ "agent:update": {
+ "aliases": [],
+ "args": {
+ "id": {
+ "description": "Agent ID or UID",
+ "name": "id",
+ "required": true
+ }
+ },
+ "description": "Update an agent",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> my-agent --name \"New Name\"",
+ "<%= config.bin %> <%= command.id %> my-agent --temperature 0.5 --public false"
+ ],
+ "flags": {
+ "name": {
+ "char": "n",
+ "description": "Agent name",
+ "name": "name",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "uid": {
+ "description": "Unique identifier (URL-friendly)",
+ "name": "uid",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "description": {
+ "char": "d",
+ "description": "Agent description",
+ "name": "description",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "provider": {
+ "char": "p",
+ "description": "AI provider",
+ "name": "provider",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "options": ["ANTHROPIC", "OPENAI", "GOOGLE", "GROQ", "MISTRAL"],
+ "type": "option"
+ },
+ "model": {
+ "char": "m",
+ "description": "Model ID",
+ "name": "model",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "system-prompt": {
+ "char": "s",
+ "description": "System prompt",
+ "name": "system-prompt",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "temperature": {
+ "char": "t",
+ "description": "Temperature (0-2)",
+ "name": "temperature",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "public": {
+ "description": "Make agent public",
+ "name": "public",
+ "allowNo": true,
+ "type": "boolean"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "agent:update",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "agent", "update.js"]
+ },
+ "auth:login": {
+ "aliases": [],
+ "args": {
+ "key": {
+ "description": "API key (alternative to --api-key flag)",
+ "name": "key",
+ "required": false
+ }
+ },
+ "description": "Authenticate with TPMJS",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> --api-key tpm_xxxxx",
+ "<%= config.bin %> <%= command.id %> --browser"
+ ],
+ "flags": {
+ "api-key": {
+ "char": "k",
+ "description": "API key (or set TPMJS_API_KEY environment variable)",
+ "name": "api-key",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "browser": {
+ "char": "b",
+ "description": "Open browser for OAuth authentication",
+ "name": "browser",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "auth:login",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "auth", "login.js"]
+ },
+ "auth:logout": {
+ "aliases": [],
+ "args": {},
+ "description": "Log out from TPMJS",
+ "examples": ["<%= config.bin %> <%= command.id %>"],
+ "flags": {
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "auth:logout",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "auth", "logout.js"]
+ },
+ "auth:status": {
+ "aliases": [],
+ "args": {},
+ "description": "Show authentication status",
+ "examples": ["<%= config.bin %> <%= command.id %>"],
+ "flags": {
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "auth:status",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "auth", "status.js"]
+ },
+ "auth:whoami": {
+ "aliases": [],
+ "args": {},
+ "description": "Show current user information",
+ "examples": ["<%= config.bin %> <%= command.id %>"],
+ "flags": {
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "auth:whoami",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "auth", "whoami.js"]
+ },
+ "collection:add": {
+ "aliases": [],
+ "args": {
+ "collection": {
+ "description": "Collection ID or slug",
+ "name": "collection",
+ "required": true
+ }
+ },
+ "description": "Add tools to a collection",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> my-collection tool-id-1",
+ "<%= config.bin %> <%= command.id %> my-collection tool-id-1 tool-id-2 tool-id-3"
+ ],
+ "flags": {
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "collection:add",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": false,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "collection", "add.js"]
+ },
+ "collection:create": {
+ "aliases": [],
+ "args": {},
+ "description": "Create a new collection",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> --name \"My Tools\"",
+ "<%= config.bin %> <%= command.id %> --name \"Web Scrapers\" --description \"Tools for web scraping\" --public"
+ ],
+ "flags": {
+ "name": {
+ "char": "n",
+ "description": "Collection name",
+ "name": "name",
+ "required": true,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "description": {
+ "char": "d",
+ "description": "Collection description",
+ "name": "description",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "public": {
+ "description": "Make collection public",
+ "name": "public",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "collection:create",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "collection", "create.js"]
+ },
+ "collection:delete": {
+ "aliases": [],
+ "args": {
+ "id": {
+ "description": "Collection ID or slug",
+ "name": "id",
+ "required": true
+ }
+ },
+ "description": "Delete a collection",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> my-collection",
+ "<%= config.bin %> <%= command.id %> my-collection --force"
+ ],
+ "flags": {
+ "force": {
+ "char": "f",
+ "description": "Skip confirmation prompt",
+ "name": "force",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "collection:delete",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "collection", "delete.js"]
+ },
+ "collection:import": {
+ "aliases": [],
+ "args": {
+ "collection": {
+ "description": "Collection ID or slug",
+ "name": "collection",
+ "required": true
+ }
+ },
+ "description": "Import tools to a collection from a file",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> my-collection --file tools.txt",
+ "<%= config.bin %> <%= command.id %> my-collection --file tools.json"
+ ],
+ "flags": {
+ "file": {
+ "char": "f",
+ "description": "File containing tool IDs (one per line or JSON array)",
+ "name": "file",
+ "required": true,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "collection:import",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "collection", "import.js"]
+ },
+ "collection:list": {
+ "aliases": [],
+ "args": {},
+ "description": "List your collections",
+ "examples": [
+ "<%= config.bin %> <%= command.id %>",
+ "<%= config.bin %> <%= command.id %> --limit 10"
+ ],
+ "flags": {
+ "limit": {
+ "char": "l",
+ "description": "Maximum number of results",
+ "name": "limit",
+ "default": 20,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "offset": {
+ "char": "o",
+ "description": "Offset for pagination",
+ "name": "offset",
+ "default": 0,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "collection:list",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "collection", "list.js"]
+ },
+ "collection:remove": {
+ "aliases": [],
+ "args": {
+ "collection": {
+ "description": "Collection ID or slug",
+ "name": "collection",
+ "required": true
+ },
+ "tool": {
+ "description": "Tool ID to remove",
+ "name": "tool",
+ "required": true
+ }
+ },
+ "description": "Remove a tool from a collection",
+ "examples": ["<%= config.bin %> <%= command.id %> my-collection tool-id-1"],
+ "flags": {
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "collection:remove",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "collection", "remove.js"]
+ },
+ "collection:update": {
+ "aliases": [],
+ "args": {
+ "id": {
+ "description": "Collection ID or slug",
+ "name": "id",
+ "required": true
+ }
+ },
+ "description": "Update a collection",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> my-collection --name \"New Name\"",
+ "<%= config.bin %> <%= command.id %> my-collection --public"
+ ],
+ "flags": {
+ "name": {
+ "char": "n",
+ "description": "Collection name",
+ "name": "name",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "description": {
+ "char": "d",
+ "description": "Collection description",
+ "name": "description",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "public": {
+ "description": "Make collection public",
+ "name": "public",
+ "allowNo": true,
+ "type": "boolean"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "collection:update",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "collection", "update.js"]
+ },
+ "mcp:config": {
+ "aliases": [],
+ "args": {
+ "collection": {
+ "description": "Collection path (username/slug)",
+ "name": "collection",
+ "required": true
+ }
+ },
+ "description": "Generate MCP configuration for AI clients",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> ajax/ajax-collection",
+ "<%= config.bin %> <%= command.id %> ajax/ajax-collection --client cursor",
+ "<%= config.bin %> <%= command.id %> ajax/ajax-collection --output ~/Library/Application\\ Support/Claude/claude_desktop_config.json"
+ ],
+ "flags": {
+ "client": {
+ "char": "c",
+ "description": "Target client (claude, cursor, windsurf, generic)",
+ "name": "client",
+ "default": "claude",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "options": ["claude", "cursor", "windsurf", "generic"],
+ "type": "option"
+ },
+ "output": {
+ "char": "o",
+ "description": "Output file path (will merge with existing config)",
+ "name": "output",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "api-key": {
+ "char": "k",
+ "description": "API key to include in config (optional)",
+ "name": "api-key",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "mcp:config",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "mcp", "config.js"]
+ },
+ "mcp:serve": {
+ "aliases": [],
+ "args": {},
+ "description": "Run as a local MCP server",
+ "examples": [
+ "<%= config.bin %> <%= command.id %>",
+ "<%= config.bin %> <%= command.id %> --port 8080",
+ "<%= config.bin %> <%= command.id %> --stdio",
+ "<%= config.bin %> <%= command.id %> --collection my-collection"
+ ],
+ "flags": {
+ "port": {
+ "char": "p",
+ "description": "Port to run the server on (HTTP mode)",
+ "name": "port",
+ "default": 3333,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "stdio": {
+ "description": "Use stdio transport instead of HTTP",
+ "name": "stdio",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "collection": {
+ "char": "c",
+ "description": "Serve tools from a specific collection",
+ "name": "collection",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "tool": {
+ "char": "t",
+ "description": "Serve specific tools (comma-separated)",
+ "name": "tool",
+ "hasDynamicHelp": false,
+ "multiple": true,
+ "type": "option"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "mcp:serve",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "mcp", "serve.js"]
+ },
+ "publish:check": {
+ "aliases": [],
+ "args": {
+ "package": {
+ "description": "npm package name (defaults to current directory)",
+ "name": "package",
+ "required": false
+ }
+ },
+ "description": "Check if your package has been discovered by tpmjs.com",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> @myorg/my-tool",
+ "<%= config.bin %> <%= command.id %>"
+ ],
+ "flags": {
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "publish:check",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "publish", "check.js"]
+ },
+ "publish:preview": {
+ "aliases": [],
+ "args": {},
+ "description": "Preview how your tool will appear on tpmjs.com",
+ "examples": [
+ "<%= config.bin %> <%= command.id %>",
+ "<%= config.bin %> <%= command.id %> --path ./my-tool"
+ ],
+ "flags": {
+ "path": {
+ "char": "p",
+ "description": "Path to package directory",
+ "name": "path",
+ "default": ".",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "publish:preview",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "publish", "preview.js"]
+ },
+ "scenario:generate": {
+ "aliases": [],
+ "args": {
+ "collection": {
+ "description": "Collection ID or slug",
+ "name": "collection",
+ "required": true
+ }
+ },
+ "description": "Generate AI-powered scenarios for a collection",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> my-collection",
+ "<%= config.bin %> <%= command.id %> my-collection --count 3",
+ "<%= config.bin %> <%= command.id %> my-collection --skip-similarity-check"
+ ],
+ "flags": {
+ "count": {
+ "char": "n",
+ "description": "Number of scenarios to generate (1-10)",
+ "name": "count",
+ "default": 1,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "skip-similarity-check": {
+ "description": "Skip checking for similar existing scenarios",
+ "name": "skip-similarity-check",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "scenario:generate",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "scenario", "generate.js"]
+ },
+ "scenario:info": {
+ "aliases": [],
+ "args": {
+ "scenarioId": {
+ "description": "Scenario ID",
+ "name": "scenarioId",
+ "required": true
+ }
+ },
+ "description": "Show detailed information about a scenario",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> clu123abc456",
+ "<%= config.bin %> <%= command.id %> clu123abc456 --runs 20",
+ "<%= config.bin %> <%= command.id %> clu123abc456 --json"
+ ],
+ "flags": {
+ "runs": {
+ "char": "r",
+ "description": "Number of recent runs to show",
+ "name": "runs",
+ "default": 10,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "scenario:info",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "scenario", "info.js"]
+ },
+ "scenario:list": {
+ "aliases": [],
+ "args": {
+ "collection": {
+ "description": "Collection ID or slug (optional - shows all public scenarios if omitted)",
+ "name": "collection",
+ "required": false
+ }
+ },
+ "description": "List scenarios for a collection or all public scenarios",
+ "examples": [
+ "<%= config.bin %> <%= command.id %>",
+ "<%= config.bin %> <%= command.id %> my-collection",
+ "<%= config.bin %> <%= command.id %> --limit 20 --json"
+ ],
+ "flags": {
+ "limit": {
+ "char": "l",
+ "description": "Maximum number of results",
+ "name": "limit",
+ "default": 20,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "offset": {
+ "char": "o",
+ "description": "Offset for pagination",
+ "name": "offset",
+ "default": 0,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "tags": {
+ "char": "t",
+ "description": "Filter by tags (comma-separated)",
+ "name": "tags",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "scenario:list",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "scenario", "list.js"]
+ },
+ "scenario:run": {
+ "aliases": [],
+ "args": {
+ "collection": {
+ "description": "Collection ID or slug",
+ "name": "collection",
+ "required": true
+ }
+ },
+ "description": "Run all scenarios for a collection",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> my-collection",
+ "<%= config.bin %> <%= command.id %> my-collection --json",
+ "<%= config.bin %> <%= command.id %> my-collection --verbose"
+ ],
+ "flags": {
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "limit": {
+ "char": "l",
+ "description": "Maximum number of scenarios to run",
+ "name": "limit",
+ "default": 50,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "scenario:run",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "scenario", "run.js"]
+ },
+ "scenario:test": {
+ "aliases": [],
+ "args": {
+ "scenarioId": {
+ "description": "Scenario ID to run",
+ "name": "scenarioId",
+ "required": true
+ }
+ },
+ "description": "Run a single scenario by ID",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> clu123abc456",
+ "<%= config.bin %> <%= command.id %> clu123abc456 --json",
+ "<%= config.bin %> <%= command.id %> clu123abc456 --verbose"
+ ],
+ "flags": {
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output including full reason",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "scenario:test",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "scenario", "test.js"]
+ },
+ "tool:execute": {
+ "aliases": [],
+ "args": {
+ "tool": {
+ "description": "Tool slug or ID",
+ "name": "tool",
+ "required": true
+ }
+ },
+ "description": "Execute a TPMJS tool",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> firecrawl-scrape --input '{\"url\":\"https://example.com\"}'",
+ "<%= config.bin %> <%= command.id %> my-tool --input-file params.json",
+ "<%= config.bin %> <%= command.id %> my-tool --stream"
+ ],
+ "flags": {
+ "input": {
+ "char": "i",
+ "description": "Input parameters as JSON string",
+ "name": "input",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "input-file": {
+ "char": "f",
+ "description": "Path to JSON file containing input parameters",
+ "name": "input-file",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "stream": {
+ "char": "s",
+ "description": "Stream output (for tools that support it)",
+ "name": "stream",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "timeout": {
+ "char": "t",
+ "description": "Timeout in seconds",
+ "name": "timeout",
+ "default": 300,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "tool:execute",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "tool", "execute.js"]
+ },
+ "tool:info": {
+ "aliases": [],
+ "args": {
+ "package": {
+ "description": "Package name (e.g., @tpmjs/official-firecrawl)",
+ "name": "package",
+ "required": true
+ },
+ "tool": {
+ "description": "Tool name (e.g., scrapeTool)",
+ "name": "tool",
+ "required": true
+ }
+ },
+ "description": "Get detailed information about a tool",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> @tpmjs/official-firecrawl scrapeTool",
+ "<%= config.bin %> <%= command.id %> firecrawl-tool default"
+ ],
+ "flags": {
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "tool:info",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "tool", "info.js"]
+ },
+ "tool:init": {
+ "aliases": [],
+ "args": {
+ "name": {
+ "description": "Tool name (creates directory if not exists)",
+ "name": "name",
+ "required": false
+ }
+ },
+ "description": "Initialize a new TPMJS tool package",
+ "examples": [
+ "<%= config.bin %> <%= command.id %>",
+ "<%= config.bin %> <%= command.id %> my-tool",
+ "<%= config.bin %> <%= command.id %> --template minimal"
+ ],
+ "flags": {
+ "template": {
+ "char": "t",
+ "description": "Template to use",
+ "name": "template",
+ "default": "minimal",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "options": ["minimal", "rich"],
+ "type": "option"
+ },
+ "category": {
+ "char": "c",
+ "description": "Tool category",
+ "name": "category",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "options": [
+ "research",
+ "web",
+ "data",
+ "documentation",
+ "engineering",
+ "security",
+ "statistics",
+ "ops",
+ "agent",
+ "sandbox",
+ "utilities",
+ "html",
+ "compliance"
+ ],
+ "type": "option"
+ },
+ "force": {
+ "char": "f",
+ "description": "Overwrite existing files",
+ "name": "force",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "yes": {
+ "char": "y",
+ "description": "Skip prompts and use defaults",
+ "name": "yes",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "tool:init",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "tool", "init.js"]
+ },
+ "tool:search": {
+ "aliases": [],
+ "args": {
+ "query": {
+ "description": "Search query",
+ "name": "query",
+ "required": false
+ }
+ },
+ "description": "Search for tools in the TPMJS registry",
+ "examples": [
+ "<%= config.bin %> <%= command.id %> firecrawl",
+ "<%= config.bin %> <%= command.id %> \"web scraper\" --category web",
+ "<%= config.bin %> <%= command.id %> --category data --limit 20"
+ ],
+ "flags": {
+ "category": {
+ "char": "c",
+ "description": "Filter by category",
+ "name": "category",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "limit": {
+ "char": "l",
+ "description": "Maximum number of results",
+ "name": "limit",
+ "default": 20,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "offset": {
+ "char": "o",
+ "description": "Offset for pagination",
+ "name": "offset",
+ "default": 0,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "tool:search",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "tool", "search.js"]
+ },
+ "tool:trending": {
+ "aliases": [],
+ "args": {},
+ "description": "Show trending tools",
+ "examples": [
+ "<%= config.bin %> <%= command.id %>",
+ "<%= config.bin %> <%= command.id %> --limit 10"
+ ],
+ "flags": {
+ "limit": {
+ "char": "l",
+ "description": "Maximum number of results",
+ "name": "limit",
+ "default": 10,
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "tool:trending",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "tool", "trending.js"]
+ },
+ "tool:validate": {
+ "aliases": [],
+ "args": {},
+ "description": "Validate a tpmjs package configuration",
+ "examples": [
+ "<%= config.bin %> <%= command.id %>",
+ "<%= config.bin %> <%= command.id %> --path ./my-tool"
+ ],
+ "flags": {
+ "path": {
+ "char": "p",
+ "description": "Path to package directory (defaults to current directory)",
+ "name": "path",
+ "default": ".",
+ "hasDynamicHelp": false,
+ "multiple": false,
+ "type": "option"
+ },
+ "json": {
+ "description": "Output in JSON format",
+ "name": "json",
+ "allowNo": false,
+ "type": "boolean"
+ },
+ "verbose": {
+ "char": "v",
+ "description": "Show verbose output",
+ "name": "verbose",
+ "allowNo": false,
+ "type": "boolean"
+ }
+ },
+ "hasDynamicHelp": false,
+ "hiddenAliases": [],
+ "id": "tool:validate",
+ "pluginAlias": "@tpmjs/cli",
+ "pluginName": "@tpmjs/cli",
+ "pluginType": "core",
+ "strict": true,
+ "enableJsonFlag": false,
+ "isESM": true,
+ "relativePath": ["dist", "commands", "tool", "validate.js"]
+ }
+ },
+ "version": "0.1.4"
+}