prompts.chat 0.0.9 → 0.1.1

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/README.md CHANGED
@@ -22,6 +22,43 @@ Building effective AI prompts is challenging. Developers often struggle with:
22
22
  npm install prompts.chat
23
23
  ```
24
24
 
25
+ ## CLI
26
+
27
+ ### Create a New Instance
28
+
29
+ Scaffold a new prompts.chat deployment with a single command:
30
+
31
+ ```bash
32
+ npx prompts.chat new my-prompt-library
33
+ ```
34
+
35
+ This will:
36
+ 1. Clone a clean copy of the repository (removes `.github`, `.claude`, `packages/`, dev scripts)
37
+ 2. Install dependencies
38
+ 3. Launch the interactive setup wizard to configure branding, theme, auth, and features
39
+
40
+ ### Interactive Prompt Browser
41
+
42
+ Browse and search prompts from your terminal:
43
+
44
+ ```bash
45
+ npx prompts.chat
46
+ ```
47
+
48
+ **Navigation:**
49
+ - `↑/↓` or `j/k` — Navigate list
50
+ - `Enter` — Select prompt
51
+ - `/` — Search prompts
52
+ - `n/p` — Next/Previous page
53
+ - `r` — Run prompt (open in ChatGPT, Claude, etc.)
54
+ - `c` — Copy prompt (with variable filling)
55
+ - `C` — Copy raw prompt
56
+ - `o` — Open in browser
57
+ - `b` — Go back
58
+ - `q` — Quit
59
+
60
+ ---
61
+
25
62
  ## Quick Start
26
63
 
27
64
  ```typescript
package/dist/cli/index.js CHANGED
@@ -134,6 +134,7 @@ import { useState as useState4 } from "react";
134
134
  import { render } from "ink";
135
135
  import meow from "meow";
136
136
  import clipboardy from "clipboardy";
137
+ import { spawn as spawn2 } from "child_process";
137
138
 
138
139
  // src/cli/components/PromptList.tsx
139
140
  import { useState, useEffect, useRef } from "react";
@@ -1044,6 +1045,97 @@ function PromptDetail({ prompt, onBack, onCopy }) {
1044
1045
  ] });
1045
1046
  }
1046
1047
 
1048
+ // src/cli/new.ts
1049
+ import { spawn, execSync } from "child_process";
1050
+ import { existsSync as existsSync2, rmSync, readdirSync } from "fs";
1051
+ import { join as join2, resolve } from "path";
1052
+ var REPO = "f/awesome-chatgpt-prompts";
1053
+ function removeFiles(baseDir) {
1054
+ const toRemove = [
1055
+ ".github",
1056
+ ".claude",
1057
+ "packages"
1058
+ ];
1059
+ for (const item of toRemove) {
1060
+ const itemPath = join2(baseDir, item);
1061
+ if (existsSync2(itemPath)) {
1062
+ console.log(` Removing ${item}/`);
1063
+ rmSync(itemPath, { recursive: true, force: true });
1064
+ }
1065
+ }
1066
+ const scriptsDir = join2(baseDir, "scripts");
1067
+ if (existsSync2(scriptsDir)) {
1068
+ const files = readdirSync(scriptsDir);
1069
+ for (const file of files) {
1070
+ if (file.startsWith("generate") || file.startsWith("rebuild")) {
1071
+ const filePath = join2(scriptsDir, file);
1072
+ console.log(` Removing scripts/${file}`);
1073
+ rmSync(filePath, { force: true });
1074
+ }
1075
+ }
1076
+ }
1077
+ }
1078
+ function runSetup(baseDir) {
1079
+ return new Promise((resolve2, reject) => {
1080
+ const setupScript = join2(baseDir, "scripts", "setup.js");
1081
+ if (!existsSync2(setupScript)) {
1082
+ console.log("\n\u26A0 Setup script not found, skipping interactive setup.");
1083
+ resolve2();
1084
+ return;
1085
+ }
1086
+ console.log("\n\u{1F680} Starting interactive setup...\n");
1087
+ const child = spawn("node", [setupScript], {
1088
+ cwd: baseDir,
1089
+ stdio: "inherit"
1090
+ });
1091
+ child.on("close", (code) => {
1092
+ if (code === 0) {
1093
+ resolve2();
1094
+ } else {
1095
+ reject(new Error(`Setup exited with code ${code}`));
1096
+ }
1097
+ });
1098
+ child.on("error", (err) => {
1099
+ reject(err);
1100
+ });
1101
+ });
1102
+ }
1103
+ async function createNew(options) {
1104
+ const targetDir = resolve(process.cwd(), options.directory);
1105
+ if (existsSync2(targetDir)) {
1106
+ const files = readdirSync(targetDir);
1107
+ if (files.length > 0) {
1108
+ console.error(`
1109
+ \u274C Directory "${options.directory}" already exists and is not empty.`);
1110
+ process.exit(1);
1111
+ }
1112
+ }
1113
+ console.log("\n\u{1F4E6} Creating new prompts.chat instance...\n");
1114
+ try {
1115
+ console.log(` Cloning ${REPO}...`);
1116
+ execSync(`npx degit ${REPO} "${targetDir}"`, { stdio: "inherit" });
1117
+ } catch (error) {
1118
+ console.error("\n\u274C Failed to clone repository. Make sure you have internet connection.");
1119
+ process.exit(1);
1120
+ }
1121
+ console.log("\n\u{1F9F9} Cleaning up files...\n");
1122
+ removeFiles(targetDir);
1123
+ console.log("\n\u{1F4E5} Installing dependencies...\n");
1124
+ try {
1125
+ execSync("npm install", { cwd: targetDir, stdio: "inherit" });
1126
+ } catch (error) {
1127
+ console.error('\n\u26A0 Failed to install dependencies. You can run "npm install" manually.');
1128
+ }
1129
+ try {
1130
+ await runSetup(targetDir);
1131
+ } catch (error) {
1132
+ console.error("\n\u26A0 Setup failed:", error.message);
1133
+ }
1134
+ console.log("\n\u2705 Done! Your prompts.chat instance is ready.\n");
1135
+ console.log(` cd ${options.directory}`);
1136
+ console.log(" npm run dev\n");
1137
+ }
1138
+
1047
1139
  // src/cli/index.tsx
1048
1140
  import { jsx as jsx4 } from "react/jsx-runtime";
1049
1141
  function App() {
@@ -1118,16 +1210,18 @@ function App() {
1118
1210
  }
1119
1211
  var cli = meow(`
1120
1212
  Usage
1121
- $ prompts-chat
1213
+ $ prompts-chat [command] [options]
1122
1214
 
1123
1215
  Commands
1124
1216
  (default) Launch interactive TUI
1217
+ new <dir> Create a new prompts.chat instance
1218
+ mcp Start MCP server for AI tools
1125
1219
 
1126
1220
  Options
1127
1221
  --help Show this help
1128
1222
  --version Show version
1129
1223
 
1130
- Navigation
1224
+ Navigation (TUI)
1131
1225
  \u2191/\u2193 or j/k Navigate list
1132
1226
  Enter Select prompt
1133
1227
  / Search prompts
@@ -1141,12 +1235,32 @@ var cli = meow(`
1141
1235
 
1142
1236
  Examples
1143
1237
  $ npx prompts.chat
1238
+ $ npx prompts.chat new my-prompts
1144
1239
  $ prompts-chat
1145
1240
  `, {
1146
1241
  importMeta: import.meta,
1147
1242
  flags: {}
1148
1243
  });
1149
- function main() {
1244
+ async function main() {
1245
+ const [command, ...args] = cli.input;
1246
+ if (command === "new") {
1247
+ const directory = args[0];
1248
+ if (!directory) {
1249
+ console.error("\n\u274C Please specify a directory name.\n");
1250
+ console.error(" Usage: npx prompts.chat new <directory>\n");
1251
+ process.exit(1);
1252
+ }
1253
+ await createNew({ directory });
1254
+ return;
1255
+ }
1256
+ if (command === "mcp") {
1257
+ const child = spawn2("npx", ["-y", "@fkadev/prompts.chat-mcp", ...args], {
1258
+ stdio: "inherit",
1259
+ shell: true
1260
+ });
1261
+ child.on("close", (code) => process.exit(code ?? 0));
1262
+ return;
1263
+ }
1150
1264
  console.clear();
1151
1265
  const { waitUntilExit } = render(/* @__PURE__ */ jsx4(App, {}), {
1152
1266
  exitOnCtrlC: true
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/platforms.ts","../../src/cli/index.tsx","../../src/cli/components/PromptList.tsx","../../src/cli/api.ts","../../src/cli/components/PromptDetail.tsx","../../src/variables/index.ts","../../src/cli/components/RunPrompt.tsx"],"sourcesContent":["export interface Platform {\n id: string;\n name: string;\n baseUrl: string;\n supportsQuerystring?: boolean;\n isDeeplink?: boolean;\n sponsor?: boolean;\n}\n\n// Image generation platforms (Mitte.ai)\nexport const imagePlatforms: Platform[] = [\n { id: \"mitte-nano-banana\", name: \"Mitte.ai - Nano Banana\", baseUrl: \"https://mitte.ai?model=nano-banana\", sponsor: true },\n { id: \"mitte-nano-banana-pro\", name: \"Mitte.ai - Nano Banana Pro\", baseUrl: \"https://mitte.ai?model=nano-banana-pro\", sponsor: true },\n { id: \"mitte-flux-2-flex\", name: \"Mitte.ai - Flux 2 Flex\", baseUrl: \"https://mitte.ai?model=flux-2-flex\", sponsor: true },\n { id: \"mitte-flux-2\", name: \"Mitte.ai - Flux 2\", baseUrl: \"https://mitte.ai?model=flux-2\", sponsor: true },\n];\n\n// Video generation platforms (Mitte.ai)\nexport const videoPlatforms: Platform[] = [\n { id: \"mitte-veo-31\", name: \"Mitte.ai - Veo 3.1\", baseUrl: \"https://mitte.ai?model=veo-31\", sponsor: true },\n { id: \"mitte-kling-26\", name: \"Mitte.ai - Kling 2.6\", baseUrl: \"https://mitte.ai?model=kling-26\", sponsor: true },\n { id: \"mitte-sora-2\", name: \"Mitte.ai - Sora 2\", baseUrl: \"https://mitte.ai?model=sora-2\", sponsor: true },\n];\n\nexport const codePlatforms: Platform[] = [\n { id: \"windsurf\", name: \"Windsurf\", baseUrl: \"windsurf://\", isDeeplink: true, supportsQuerystring: false, sponsor: true },\n { id: \"vscode\", name: \"VS Code\", baseUrl: \"vscode://\", isDeeplink: true, supportsQuerystring: false },\n { id: \"vscode-insiders\", name: \"VS Code Insiders\", baseUrl: \"vscode-insiders://\", isDeeplink: true, supportsQuerystring: false },\n { id: \"cursor\", name: \"Cursor\", baseUrl: \"cursor://anysphere.cursor-deeplink/prompt\", isDeeplink: true },\n { id: \"goose\", name: \"Goose\", baseUrl: \"goose://recipe\", isDeeplink: true },\n { id: \"github-copilot\", name: \"GitHub Copilot Chat\", baseUrl: \"https://github.com/copilot\" },\n { id: \"github-copilot-agents\", name: \"GitHub Copilot Agents\", baseUrl: \"https://github.com/copilot/agents\" },\n { id: \"bolt\", name: \"Bolt\", baseUrl: \"https://bolt.new\" },\n { id: \"lovable\", name: \"Lovable\", baseUrl: \"https://lovable.dev\" },\n { id: \"v0\", name: \"v0\", baseUrl: \"https://v0.dev/chat\" },\n { id: \"ai2sql\", name: \"AI2SQL\", baseUrl: \"https://builder.ai2sql.io/dashboard/builder-all-lp?tab=generate\" },\n];\n\nexport const chatPlatforms: Platform[] = [\n { id: \"chatgpt\", name: \"ChatGPT\", baseUrl: \"https://chatgpt.com\" },\n { id: \"claude\", name: \"Claude\", baseUrl: \"https://claude.ai/new\" },\n { id: \"copilot\", name: \"Microsoft Copilot\", baseUrl: \"https://copilot.microsoft.com\", supportsQuerystring: false },\n { id: \"deepseek\", name: \"DeepSeek\", baseUrl: \"https://chat.deepseek.com\", supportsQuerystring: false },\n { id: \"fal\", name: \"fal.ai Sandbox\", baseUrl: \"https://fal.ai/sandbox\" },\n { id: \"gemini\", name: \"Gemini\", baseUrl: \"https://gemini.google.com/app\", supportsQuerystring: false },\n { id: \"grok\", name: \"Grok\", baseUrl: \"https://grok.com/chat?reasoningMode=none\" },\n { id: \"grok-deepsearch\", name: \"Grok Deep Search\", baseUrl: \"https://grok.com/chat?reasoningMode=deepsearch\" },\n { id: \"grok-think\", name: \"Grok Think\", baseUrl: \"https://grok.com/chat?reasoningMode=think\" },\n { id: \"huggingface\", name: \"HuggingChat\", baseUrl: \"https://huggingface.co/chat\" },\n { id: \"llama\", name: \"Meta AI\", baseUrl: \"https://www.meta.ai\" },\n { id: \"manus\", name: \"Manus\", baseUrl: \"https://manus.im/app\" },\n { id: \"mistral\", name: \"Le Chat\", baseUrl: \"https://chat.mistral.ai/chat\" },\n { id: \"perplexity\", name: \"Perplexity\", baseUrl: \"https://www.perplexity.ai\" },\n { id: \"phind\", name: \"Phind\", baseUrl: \"https://www.phind.com\" },\n { id: \"pi\", name: \"Pi\", baseUrl: \"https://pi.ai\", supportsQuerystring: false },\n { id: \"poe\", name: \"Poe\", baseUrl: \"https://poe.com\", supportsQuerystring: false },\n { id: \"you\", name: \"You.com\", baseUrl: \"https://you.com\" },\n];\n\nexport function buildUrl(\n platformId: string, \n baseUrl: string, \n promptText: string, \n promptTitle?: string, \n promptDescription?: string\n): string {\n const encoded = encodeURIComponent(promptText);\n \n switch (platformId) {\n case \"cursor\":\n return `${baseUrl}?text=${encoded}`;\n case \"goose\": {\n const config = JSON.stringify({\n version: \"1.0.0\",\n title: promptTitle || \"Prompt\",\n description: promptDescription || \"\",\n instructions: \"This is a prompt imported from prompts.chat.\",\n prompt: promptText,\n activities: [\"Do it now\"]\n });\n const base64Config = Buffer.from(config).toString('base64');\n return `${baseUrl}?config=${base64Config}`;\n }\n case \"bolt\":\n return `${baseUrl}?prompt=${encoded}`;\n case \"chatgpt\":\n return `${baseUrl}/?q=${encoded}`;\n case \"claude\":\n return `${baseUrl}?q=${encoded}`;\n case \"github-copilot\":\n case \"github-copilot-agents\":\n return `${baseUrl}?prompt=${encoded}`;\n case \"ai2sql\":\n return `${baseUrl}&prompt=${encoded}`;\n case \"fal\":\n return `${baseUrl}?prompt=${encoded}`;\n case \"grok\":\n case \"grok-deepsearch\":\n case \"grok-think\":\n return `${baseUrl}&q=${encoded}`;\n case \"huggingface\":\n return `${baseUrl}/?prompt=${encoded}`;\n case \"lovable\":\n return `${baseUrl}/?autosubmit=true#prompt=${encoded}`;\n case \"mistral\":\n return `${baseUrl}?q=${encoded}`;\n case \"perplexity\":\n return `${baseUrl}/search?q=${encoded}`;\n case \"phind\":\n return `${baseUrl}/search?q=${encoded}`;\n case \"v0\":\n return `${baseUrl}?q=${encoded}`;\n case \"you\":\n return `${baseUrl}/search?q=${encoded}`;\n case \"mitte-nano-banana\":\n case \"mitte-nano-banana-pro\":\n case \"mitte-flux-2-flex\":\n case \"mitte-flux-2\":\n case \"mitte-veo-31\":\n case \"mitte-kling-26\":\n case \"mitte-sora-2\":\n return `${baseUrl}&prompt=${encoded}`;\n default:\n return `${baseUrl}?q=${encoded}`;\n }\n}\n","import React, { useState } from 'react';\nimport { render } from 'ink';\nimport meow from 'meow';\nimport clipboardy from 'clipboardy';\nimport { PromptList } from './components/PromptList.js';\nimport { PromptDetail } from './components/PromptDetail.js';\nimport type { Prompt } from './api.js';\n\ntype View = 'list' | 'detail';\n\ninterface AppState {\n view: View;\n selectedPrompt: Prompt | null;\n searchQuery: string;\n page: number;\n selectedCategory: string | null;\n selectedIndex: number;\n}\n\nfunction App() {\n const [state, setState] = useState<AppState>({\n view: 'list',\n selectedPrompt: null,\n searchQuery: '',\n page: 1,\n selectedCategory: null,\n selectedIndex: 0,\n });\n\n const handleSelectPrompt = (prompt: Prompt) => {\n setState(prev => ({\n ...prev,\n view: 'detail',\n selectedPrompt: prompt,\n }));\n };\n\n const handleBack = () => {\n setState(prev => ({\n ...prev,\n view: 'list',\n selectedPrompt: null,\n }));\n };\n\n const handleSearchChange = (query: string) => {\n setState(prev => ({ ...prev, searchQuery: query, page: 1 }));\n };\n\n const handlePageChange = (page: number) => {\n setState(prev => ({ ...prev, page }));\n };\n\n const handleCategoryChange = (category: string | null) => {\n setState(prev => ({ ...prev, selectedCategory: category, page: 1, selectedIndex: 0 }));\n };\n\n const handleIndexChange = (index: number) => {\n setState(prev => ({ ...prev, selectedIndex: index }));\n };\n\n const handleCopy = async (content: string) => {\n try {\n await clipboardy.write(content);\n } catch {\n // Clipboard might not be available in some environments\n }\n };\n\n const handleQuit = () => {\n process.exit(0);\n };\n\n if (state.view === 'detail' && state.selectedPrompt) {\n return (\n <PromptDetail\n prompt={state.selectedPrompt}\n onBack={handleBack}\n onCopy={handleCopy}\n />\n );\n }\n\n return (\n <PromptList\n onSelect={handleSelectPrompt}\n onQuit={handleQuit}\n searchQuery={state.searchQuery}\n onSearchChange={handleSearchChange}\n page={state.page}\n onPageChange={handlePageChange}\n selectedCategory={state.selectedCategory}\n onCategoryChange={handleCategoryChange}\n selectedIndex={state.selectedIndex}\n onIndexChange={handleIndexChange}\n />\n );\n}\n\nconst cli = meow(`\n Usage\n $ prompts-chat\n\n Commands\n (default) Launch interactive TUI\n\n Options\n --help Show this help\n --version Show version\n\n Navigation\n ↑/↓ or j/k Navigate list\n Enter Select prompt\n / Search prompts\n n/p Next/Previous page\n r Run prompt (open in ChatGPT, Claude, etc.)\n c Copy prompt (with variable filling)\n C Copy raw prompt\n o Open in browser\n b Go back\n q Quit\n\n Examples\n $ npx prompts.chat\n $ prompts-chat\n`, {\n importMeta: import.meta,\n flags: {},\n});\n\nfunction main() {\n console.clear();\n \n const { waitUntilExit } = render(<App />, {\n exitOnCtrlC: true,\n });\n \n waitUntilExit().then(() => {\n console.clear();\n });\n}\n\nmain();\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Box, Text, useInput, useApp, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport TextInput from 'ink-text-input';\nimport { loadPrompts as loadAllPrompts, filterPrompts, getCategories, type Prompt, type Category } from '../api.js';\n\ninterface PromptListProps {\n onSelect: (prompt: Prompt) => void;\n onQuit: () => void;\n searchQuery: string;\n onSearchChange: (query: string) => void;\n page: number;\n onPageChange: (page: number) => void;\n selectedCategory: string | null;\n onCategoryChange: (category: string | null) => void;\n selectedIndex: number;\n onIndexChange: (index: number) => void;\n}\n\ntype ViewMode = 'list' | 'categories';\n\nexport function PromptList({ \n onSelect, \n onQuit, \n searchQuery, \n onSearchChange, \n page, \n onPageChange, \n selectedCategory, \n onCategoryChange,\n selectedIndex,\n onIndexChange\n}: PromptListProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const allPromptsRef = useRef<Prompt[]>([]);\n const [prompts, setPrompts] = useState<Prompt[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [localSearchQuery, setLocalSearchQuery] = useState(searchQuery);\n const [isSearching, setIsSearching] = useState(false);\n const [totalPages, setTotalPages] = useState(1);\n const [total, setTotal] = useState(0);\n const [viewMode, setViewMode] = useState<ViewMode>('list');\n const [categories, setCategories] = useState<Category[]>([]);\n const [categoryIndex, setCategoryIndex] = useState(0);\n const [categorySearchQuery, setCategorySearchQuery] = useState('');\n const [isSearchingCategories, setIsSearchingCategories] = useState(false);\n\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n const headerLines = 3;\n const footerLines = 2;\n const listHeight = Math.max(terminalHeight - headerLines - footerLines, 5);\n const perPage = listHeight;\n\n useEffect(() => {\n initializePrompts();\n }, []);\n\n useEffect(() => {\n if (allPromptsRef.current.length > 0) {\n applyFilters();\n }\n }, [page, searchQuery, selectedCategory, perPage]);\n\n async function initializePrompts() {\n setLoading(true);\n setError(null);\n try {\n const all = await loadAllPrompts();\n allPromptsRef.current = all;\n setCategories(getCategories(all));\n applyFilters();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load prompts');\n } finally {\n setLoading(false);\n }\n }\n\n function applyFilters() {\n const result = filterPrompts(allPromptsRef.current, {\n q: searchQuery || undefined,\n category: selectedCategory || undefined,\n page,\n perPage,\n });\n setPrompts(result.prompts);\n setTotalPages(result.totalPages);\n setTotal(result.total);\n }\n\n useInput((input, key) => {\n if (isSearching) {\n if (key.escape) {\n setIsSearching(false);\n setLocalSearchQuery(searchQuery);\n }\n return;\n }\n\n // Category search mode\n if (isSearchingCategories) {\n if (key.escape) {\n setIsSearchingCategories(false);\n setCategorySearchQuery('');\n }\n return;\n }\n\n // Category selector mode\n if (viewMode === 'categories') {\n if (key.escape || input === 'b') {\n setViewMode('list');\n setCategorySearchQuery('');\n return;\n }\n if (input === '/') {\n setIsSearchingCategories(true);\n return;\n }\n if (key.upArrow || input === 'k') {\n setCategoryIndex((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow || input === 'j') {\n const filteredCats = categorySearchQuery \n ? categories.filter(c => c.name.toLowerCase().includes(categorySearchQuery.toLowerCase()))\n : categories;\n const maxIndex = categorySearchQuery ? filteredCats.length - 1 : filteredCats.length;\n setCategoryIndex((i) => Math.min(maxIndex, i + 1));\n return;\n }\n if (key.return) {\n const filteredCats = categorySearchQuery \n ? categories.filter(c => c.name.toLowerCase().includes(categorySearchQuery.toLowerCase()))\n : categories;\n if (categorySearchQuery) {\n // When filtering, index 0 = first filtered category\n if (filteredCats[categoryIndex]) {\n onCategoryChange(filteredCats[categoryIndex].slug);\n }\n } else {\n // When not filtering, index 0 = \"All Categories\"\n if (categoryIndex === 0) {\n onCategoryChange(null);\n } else if (filteredCats[categoryIndex - 1]) {\n onCategoryChange(filteredCats[categoryIndex - 1].slug);\n }\n }\n setViewMode('list');\n setCategorySearchQuery('');\n return;\n }\n return;\n }\n\n if (input === 'q' || key.escape) {\n onQuit();\n exit();\n return;\n }\n\n if (input === '/') {\n setIsSearching(true);\n return;\n }\n\n if (input === 'c') {\n setViewMode('categories');\n setCategoryIndex(selectedCategory ? categories.findIndex(c => c.slug === selectedCategory) + 1 : 0);\n return;\n }\n\n if (key.upArrow || input === 'k') {\n onIndexChange(Math.max(0, selectedIndex - 1));\n }\n\n if (key.downArrow || input === 'j') {\n onIndexChange(Math.min(prompts.length - 1, selectedIndex + 1));\n }\n\n if (key.return && prompts[selectedIndex]) {\n onSelect(prompts[selectedIndex]);\n }\n\n if (input === 'n' && page < totalPages) {\n onPageChange(page + 1);\n }\n\n if (input === 'p' && page > 1) {\n onPageChange(page - 1);\n }\n\n if (input === 'r') {\n initializePrompts();\n }\n });\n\n const handleSearchSubmit = (value: string) => {\n onSearchChange(value);\n setLocalSearchQuery(value);\n setIsSearching(false);\n };\n\n const handleCategorySearchSubmit = (value: string) => {\n setCategorySearchQuery(value);\n setCategoryIndex(0);\n setIsSearchingCategories(false);\n };\n\n const filteredCategories = categorySearchQuery \n ? categories.filter(c => c.name.toLowerCase().includes(categorySearchQuery.toLowerCase()))\n : categories;\n\n const maxTitleLength = terminalWidth - 30;\n\n if (error) {\n return (\n <Box flexDirection=\"column\" height={terminalHeight} padding={1}>\n <Text color=\"red\">Error: {error}</Text>\n <Text dimColor>Press 'r' to retry, 'q' to quit</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n {/* Header */}\n <Box paddingX={1} marginBottom={0}>\n <Text bold color=\"cyan\">⚡ prompts.chat</Text>\n <Text dimColor> — {total} prompts</Text>\n {selectedCategory && (\n <>\n <Text dimColor> · </Text>\n <Text color=\"magenta\">{selectedCategory}</Text>\n </>\n )}\n {searchQuery && !isSearching && (\n <>\n <Text dimColor> · </Text>\n <Text color=\"yellow\">{searchQuery}</Text>\n </>\n )}\n </Box>\n\n {/* Search Input */}\n {isSearching && (\n <Box paddingX={1}>\n <Text color=\"yellow\">Search: </Text>\n <TextInput\n value={localSearchQuery}\n onChange={setLocalSearchQuery}\n onSubmit={handleSearchSubmit}\n placeholder=\"Type to search...\"\n />\n </Box>\n )}\n\n {/* Category Selector */}\n {viewMode === 'categories' && (\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n <Box marginBottom={1}>\n <Text bold color=\"magenta\">Select Category</Text>\n {categorySearchQuery && !isSearchingCategories && (\n <>\n <Text dimColor> · </Text>\n <Text color=\"yellow\">{categorySearchQuery}</Text>\n </>\n )}\n </Box>\n {isSearchingCategories && (\n <Box marginBottom={1}>\n <Text color=\"yellow\">Search: </Text>\n <TextInput\n value={categorySearchQuery}\n onChange={setCategorySearchQuery}\n onSubmit={handleCategorySearchSubmit}\n placeholder=\"Type to filter...\"\n />\n </Box>\n )}\n {categories.length === 0 ? (\n <Box>\n <Text color=\"green\"><Spinner type=\"dots\" /></Text>\n <Text> Loading categories...</Text>\n </Box>\n ) : (\n <>\n {!categorySearchQuery && (\n <Box>\n <Text color={categoryIndex === 0 ? 'cyan' : undefined}>\n {categoryIndex === 0 ? '❯ ' : ' '}\n </Text>\n <Text color={categoryIndex === 0 ? 'cyan' : undefined} bold={categoryIndex === 0}>\n All Categories\n </Text>\n </Box>\n )}\n {filteredCategories.slice(0, listHeight - 1).map((cat, index) => {\n const adjustedIndex = categorySearchQuery ? index : index + 1;\n return (\n <Box key={cat.id}>\n <Text color={adjustedIndex === categoryIndex ? 'cyan' : undefined}>\n {adjustedIndex === categoryIndex ? '❯ ' : ' '}\n </Text>\n <Text\n color={adjustedIndex === categoryIndex ? 'cyan' : undefined}\n bold={adjustedIndex === categoryIndex}\n >\n {cat.name}\n </Text>\n {cat.count > 0 && (\n <Text dimColor> ({cat.count})</Text>\n )}\n </Box>\n );\n })}\n </>\n )}\n </Box>\n )}\n\n {/* List */}\n {viewMode === 'list' && (\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n {loading ? (\n <Box>\n <Text color=\"green\">\n <Spinner type=\"dots\" />\n </Text>\n <Text> Loading prompts...</Text>\n </Box>\n ) : (\n prompts.slice(0, listHeight).map((prompt, index) => (\n <Box key={prompt.id}>\n <Text color={index === selectedIndex ? 'cyan' : undefined}>\n {index === selectedIndex ? '❯ ' : ' '}\n </Text>\n <Text\n color={index === selectedIndex ? 'cyan' : undefined}\n bold={index === selectedIndex}\n >\n {prompt.title.slice(0, maxTitleLength)}\n {prompt.title.length > maxTitleLength ? '…' : ''}\n </Text>\n <Text dimColor> @{prompt.author.username}</Text>\n {prompt.voteCount > 0 && (\n <Text color=\"yellow\"> ⬆ {prompt.voteCount}</Text>\n )}\n </Box>\n ))\n )}\n </Box>\n )}\n\n {/* Footer */}\n <Box paddingX={1} justifyContent=\"space-between\">\n {viewMode === 'categories' ? (\n <Text dimColor>\n j/k nav · Enter select · / search · b back\n </Text>\n ) : (\n <Text dimColor>\n j/k nav · Enter select · / search · c category · n/p pages · q quit\n </Text>\n )}\n <Text dimColor>\n {viewMode === 'list' ? `${page}/${totalPages}` : ''}\n </Text>\n </Box>\n </Box>\n );\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\n\nconst PROMPTS_URL = 'https://prompts.chat/prompts.json';\nconst CACHE_DIR = join(homedir(), '.prompts-chat');\nconst CACHE_FILE = join(CACHE_DIR, 'prompts.json');\n\nexport interface Prompt {\n id: string;\n title: string;\n slug: string;\n description: string | null;\n content: string;\n type: 'TEXT' | 'IMAGE' | 'VIDEO' | 'AUDIO' | 'SKILL';\n mediaUrl: string | null;\n voteCount: number;\n viewCount: number;\n author: {\n username: string;\n name: string | null;\n avatar: string | null;\n verified: boolean;\n };\n category: {\n id: string;\n name: string;\n slug: string;\n } | null;\n tags: Array<{\n id: string;\n name: string;\n slug: string;\n }>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Category {\n id: string;\n name: string;\n slug: string;\n count: number;\n}\n\ninterface CachedData {\n prompts: Prompt[];\n fetchedAt: number;\n}\n\nlet cachedPrompts: Prompt[] | null = null;\n\nfunction ensureCacheDir() {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n}\n\nfunction loadFromCache(): Prompt[] | null {\n try {\n if (existsSync(CACHE_FILE)) {\n const data = JSON.parse(readFileSync(CACHE_FILE, 'utf-8')) as CachedData;\n return data.prompts;\n }\n } catch {\n // Ignore cache read errors\n }\n return null;\n}\n\nfunction saveToCache(prompts: Prompt[]) {\n try {\n ensureCacheDir();\n const data: CachedData = { prompts, fetchedAt: Date.now() };\n writeFileSync(CACHE_FILE, JSON.stringify(data));\n } catch {\n // Ignore cache write errors\n }\n}\n\nexport async function loadPrompts(): Promise<Prompt[]> {\n // Return cached prompts if already loaded\n if (cachedPrompts) {\n return cachedPrompts;\n }\n\n // Try to fetch fresh data\n try {\n const response = await fetch(PROMPTS_URL);\n if (response.ok) {\n const data = await response.json();\n cachedPrompts = data.prompts as Prompt[];\n saveToCache(cachedPrompts);\n return cachedPrompts;\n }\n } catch {\n // Network error, try cache\n }\n\n // Fall back to local cache\n const cached = loadFromCache();\n if (cached) {\n cachedPrompts = cached;\n return cachedPrompts;\n }\n\n throw new Error('No prompts available. Please check your internet connection.');\n}\n\nexport function getCategories(prompts: Prompt[]): Category[] {\n const categoryMap = new Map<string, Category>();\n \n for (const prompt of prompts) {\n if (prompt.category) {\n const existing = categoryMap.get(prompt.category.slug);\n if (existing) {\n existing.count++;\n } else {\n categoryMap.set(prompt.category.slug, {\n id: prompt.category.id,\n name: prompt.category.name,\n slug: prompt.category.slug,\n count: 1,\n });\n }\n }\n }\n \n return Array.from(categoryMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function filterPrompts(prompts: Prompt[], options: {\n q?: string;\n category?: string;\n page?: number;\n perPage?: number;\n}): { prompts: Prompt[]; total: number; page: number; perPage: number; totalPages: number } {\n let filtered = prompts;\n \n // Filter by search query\n if (options.q) {\n const query = options.q.toLowerCase();\n filtered = filtered.filter(p => \n p.title.toLowerCase().includes(query) ||\n p.content.toLowerCase().includes(query) ||\n p.description?.toLowerCase().includes(query) ||\n p.author.username.toLowerCase().includes(query) ||\n p.author.name?.toLowerCase().includes(query) ||\n p.tags.some(t => t.name.toLowerCase().includes(query) || t.slug.toLowerCase().includes(query))\n );\n }\n \n // Filter by category\n if (options.category) {\n filtered = filtered.filter(p => p.category?.slug === options.category);\n }\n \n const total = filtered.length;\n const page = options.page || 1;\n const perPage = options.perPage || 20;\n const totalPages = Math.ceil(total / perPage);\n \n // Paginate\n const start = (page - 1) * perPage;\n const paged = filtered.slice(start, start + perPage);\n \n return { prompts: paged, total, page, perPage, totalPages };\n}\n\nexport function getPrompt(prompts: Prompt[], id: string): Prompt | undefined {\n return prompts.find(p => p.id === id || p.slug === id || `${p.id}_${p.slug}` === id);\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput, useApp, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { type Prompt } from '../api.js';\nimport { extractVariables, compile } from '../../variables/index.js';\nimport { RunPrompt } from './RunPrompt.js';\nimport { type Platform } from '../platforms.js';\n\ninterface PromptDetailProps {\n prompt: Prompt;\n onBack: () => void;\n onCopy: (content: string) => void;\n}\n\ntype ViewMode = 'detail' | 'variables' | 'copied' | 'run' | 'run-variables' | 'preview';\n\nfunction HighlightedLine({ text }: { text: string }) {\n // Split by variable pattern ${...}\n const parts = text.split(/(\\$\\{[^}]+\\})/g);\n \n return (\n <Text>\n {parts.map((part, i) => {\n if (part.match(/^\\$\\{[^}]+\\}$/)) {\n return <Text key={i} color=\"yellow\" bold>{part}</Text>;\n }\n return <Text key={i}>{part}</Text>;\n })}\n </Text>\n );\n}\n\nfunction wrapText(text: string, width: number): string[] {\n const lines: string[] = [];\n const rawLines = text.split('\\n');\n \n for (const rawLine of rawLines) {\n if (rawLine.length <= width) {\n lines.push(rawLine);\n } else {\n let remaining = rawLine;\n while (remaining.length > width) {\n let breakPoint = remaining.lastIndexOf(' ', width);\n if (breakPoint === -1 || breakPoint < width / 2) {\n breakPoint = width;\n }\n lines.push(remaining.slice(0, breakPoint));\n remaining = remaining.slice(breakPoint).trimStart();\n }\n if (remaining) {\n lines.push(remaining);\n }\n }\n }\n return lines;\n}\n\nexport function PromptDetail({ prompt, onBack, onCopy }: PromptDetailProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const [viewMode, setViewMode] = useState<ViewMode>('detail');\n const [variables, setVariables] = useState<Array<{ name: string; defaultValue?: string }>>([]);\n const [variableValues, setVariableValues] = useState<Record<string, string>>({});\n const [currentVarIndex, setCurrentVarIndex] = useState(0);\n const [currentInput, setCurrentInput] = useState('');\n const [compiledContent, setCompiledContent] = useState('');\n const [pendingPlatform, setPendingPlatform] = useState<Platform | null>(null);\n const [runAction, setRunAction] = useState<'copy' | 'run'>('run');\n const [scrollOffset, setScrollOffset] = useState(0);\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const [loadingImage, setLoadingImage] = useState(false);\n\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n const headerLines = 8;\n const footerLines = 2;\n const contentHeight = Math.max(terminalHeight - headerLines - footerLines, 5);\n\n useEffect(() => {\n const vars = extractVariables(prompt.content);\n setVariables(vars);\n \n const defaults: Record<string, string> = {};\n vars.forEach(v => {\n if (v.defaultValue) defaults[v.name] = v.defaultValue;\n });\n setVariableValues(defaults);\n }, [prompt]);\n\n const contentLines = useMemo(() => {\n if (!prompt) return [];\n // Parse escape sequences like \\n\n const parsedContent = prompt.content.replace(/\\\\n/g, '\\n');\n return wrapText(parsedContent, terminalWidth - 6);\n }, [prompt, terminalWidth]);\n\n const maxScroll = Math.max(0, contentLines.length - contentHeight);\n\n const isMediaType = prompt?.type === 'IMAGE' || prompt?.type === 'VIDEO' || prompt?.type === 'AUDIO';\n const hasMedia = isMediaType && prompt?.mediaUrl;\n\n async function loadImagePreview() {\n if (!prompt?.mediaUrl || loadingImage) return;\n setLoadingImage(true);\n try {\n const terminalImage = await import('terminal-image');\n const response = await fetch(prompt.mediaUrl);\n const buffer = Buffer.from(await response.arrayBuffer());\n const image = await terminalImage.default.buffer(buffer, { \n width: terminalWidth - 4,\n height: terminalHeight - 4,\n preserveAspectRatio: true \n });\n setImagePreview(image);\n setViewMode('preview');\n } catch {\n setImagePreview('[Could not load image]');\n } finally {\n setLoadingImage(false);\n }\n }\n\n useInput((input: string, key: { escape?: boolean; return?: boolean; upArrow?: boolean; downArrow?: boolean; pageUp?: boolean; pageDown?: boolean }) => {\n if (viewMode === 'run' || viewMode === 'run-variables') {\n return; // RunPrompt handles its own input\n }\n\n if (viewMode === 'variables') {\n if (key.escape) {\n setViewMode('detail');\n setCurrentVarIndex(0);\n setCurrentInput('');\n }\n return;\n }\n\n if (viewMode === 'copied') {\n if (key.escape || input === 'b' || key.return) {\n setViewMode('detail');\n }\n return;\n }\n\n // Preview mode\n if (viewMode === 'preview') {\n if (key.escape || input === 'b') {\n setImagePreview(null);\n setViewMode('detail');\n }\n return;\n }\n\n // Scrolling with hjkl and arrow keys\n if (viewMode === 'detail') {\n if (input === 'j' || key.downArrow) {\n setScrollOffset(prev => Math.min(prev + 1, maxScroll));\n return;\n }\n if (input === 'k' || key.upArrow) {\n setScrollOffset(prev => Math.max(prev - 1, 0));\n return;\n }\n if (input === 'D' || key.pageDown) {\n setScrollOffset(prev => Math.min(prev + Math.floor(contentHeight / 2), maxScroll));\n return;\n }\n if (input === 'U' || key.pageUp) {\n setScrollOffset(prev => Math.max(prev - Math.floor(contentHeight / 2), 0));\n return;\n }\n if (input === 'g') {\n setScrollOffset(0);\n return;\n }\n if (input === 'G') {\n setScrollOffset(maxScroll);\n return;\n }\n }\n\n if (key.escape || input === 'b') {\n onBack();\n return;\n }\n\n if (input === 'q') {\n exit();\n return;\n }\n\n if (input === 'r' && prompt) {\n setScrollOffset(0);\n setViewMode('run');\n return;\n }\n\n if (input === 'c' && prompt) {\n if (variables.length > 0) {\n setViewMode('variables');\n setCurrentVarIndex(0);\n setCurrentInput(variableValues[variables[0].name] || '');\n } else {\n handleCopy(prompt.content);\n }\n }\n\n if (input === 'C' && prompt) {\n handleCopy(prompt.content);\n }\n\n if (input === 'o' && prompt) {\n import('open').then(({ default: open }) => {\n open(`https://prompts.chat/prompts/${prompt.id}_${prompt.slug}`);\n });\n }\n\n if (input === 'u' && prompt) {\n import('open').then(({ default: open }) => {\n open(`https://prompts.chat/@${prompt.author.username}`);\n });\n }\n\n if (input === 'p' && hasMedia) {\n loadImagePreview();\n }\n });\n\n function handleCopy(content: string) {\n onCopy(content);\n setCompiledContent(content);\n setViewMode('copied');\n }\n\n function handleRun(url: string, platform: Platform) {\n import('open').then(({ default: open }) => {\n open(url);\n });\n setViewMode('detail');\n }\n\n function handleCopyAndOpen(content: string, platform: Platform) {\n if (variables.length > 0) {\n setPendingPlatform(platform);\n setRunAction('copy');\n setViewMode('run-variables');\n setCurrentVarIndex(0);\n setCurrentInput(variableValues[variables[0].name] || '');\n } else {\n onCopy(content);\n import('open').then(({ default: open }) => {\n open(platform.baseUrl);\n });\n setViewMode('detail');\n }\n }\n\n function handleRunWithVariables(url: string, platform: Platform) {\n if (variables.length > 0) {\n setPendingPlatform(platform);\n setRunAction('run');\n setViewMode('run-variables');\n setCurrentVarIndex(0);\n setCurrentInput(variableValues[variables[0].name] || '');\n } else {\n handleRun(url, platform);\n }\n }\n\n function handleVariableSubmit(value: string) {\n const varName = variables[currentVarIndex].name;\n const newValues = { ...variableValues, [varName]: value };\n setVariableValues(newValues);\n\n if (currentVarIndex < variables.length - 1) {\n setCurrentVarIndex(currentVarIndex + 1);\n setCurrentInput(newValues[variables[currentVarIndex + 1].name] || '');\n } else {\n const compiled = compile(prompt!.content, newValues, { useDefaults: true });\n \n if (viewMode === 'run-variables' && pendingPlatform) {\n if (runAction === 'copy') {\n onCopy(compiled);\n import('open').then(({ default: open }) => {\n open(pendingPlatform.baseUrl);\n });\n } else {\n import('../platforms.js').then(({ buildUrl }) => {\n const url = buildUrl(pendingPlatform.id, pendingPlatform.baseUrl, compiled, prompt!.title, prompt!.description || undefined);\n import('open').then(({ default: open }) => {\n open(url);\n });\n });\n }\n setPendingPlatform(null);\n setViewMode('detail');\n } else {\n handleCopy(compiled);\n }\n }\n }\n\n const showCopiedMessage = viewMode === 'copied';\n\n // Fullscreen image preview\n if (viewMode === 'preview' && imagePreview) {\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n <Box paddingX={1} marginBottom={1}>\n <Text bold color=\"magenta\">📷 Image Preview</Text>\n <Text dimColor> · {prompt.title}</Text>\n </Box>\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n <Text>{imagePreview}</Text>\n </Box>\n <Box paddingX={1}>\n <Text dimColor>b back</Text>\n </Box>\n </Box>\n );\n }\n\n if (viewMode === 'run') {\n return (\n <RunPrompt\n content={prompt.content}\n title={prompt.title}\n description={prompt.description || undefined}\n promptType={prompt.type}\n mediaUrl={prompt.mediaUrl}\n onRun={handleRunWithVariables}\n onCopyAndOpen={handleCopyAndOpen}\n onBack={() => setViewMode('detail')}\n />\n );\n }\n\n const isFillingVariables = viewMode === 'variables' || viewMode === 'run-variables';\n const isRunMode = viewMode === 'run-variables';\n const currentVar = isFillingVariables ? variables[currentVarIndex] : null;\n\n const tags = prompt.tags.map(t => t.name).join(', ');\n const inlineSectionHeight = isFillingVariables ? 3 : (showCopiedMessage ? 1 : 0);\n const adjustedContentHeight = contentHeight - inlineSectionHeight;\n const visibleLines = contentLines.slice(scrollOffset, scrollOffset + adjustedContentHeight);\n const adjustedMaxScroll = Math.max(0, contentLines.length - adjustedContentHeight);\n const showScrollIndicator = contentLines.length > adjustedContentHeight;\n const scrollPercent = adjustedMaxScroll > 0 ? Math.round((scrollOffset / adjustedMaxScroll) * 100) : 100;\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n {/* Header */}\n <Box flexDirection=\"column\" paddingX={1}>\n <Box marginBottom={0} flexDirection=\"column\">\n <Text bold color=\"cyan\">{prompt.title}</Text>\n <Box>\n <Text dimColor>by </Text>\n <Text color=\"yellow\">@{prompt.author.username}</Text>\n {prompt.author.verified && <Text color=\"blue\"> ✓</Text>}\n <Text dimColor> · </Text>\n <Text color=\"green\">⬆ {prompt.voteCount}</Text>\n {prompt.category && (\n <>\n <Text dimColor> · </Text>\n <Text color=\"magenta\">{prompt.category.name}</Text>\n </>\n )}\n </Box>\n </Box>\n\n {prompt.description && (\n <Box>\n <Text italic dimColor>{prompt.description.slice(0, terminalWidth - 4)}</Text>\n </Box>\n )}\n\n {(tags || variables.length > 0) && (\n <Box>\n {tags && (\n <>\n <Text dimColor>Tags: </Text>\n <Text color=\"blue\">{tags}</Text>\n </>\n )}\n {tags && variables.length > 0 && <Text dimColor> · </Text>}\n {variables.length > 0 && (\n <>\n <Text dimColor>Vars: </Text>\n <Text color=\"yellow\">{variables.map(v => v.name).join(', ')}</Text>\n </>\n )}\n </Box>\n )}\n </Box>\n\n {/* Scrollable Content */}\n <Box \n flexDirection=\"column\" \n borderStyle=\"round\" \n borderColor=\"gray\" \n paddingX={1}\n flexGrow={1}\n marginX={1}\n overflow=\"hidden\"\n >\n {visibleLines.map((line, i) => (\n <Box key={scrollOffset + i}>\n {line ? <HighlightedLine text={line} /> : <Text> </Text>}\n </Box>\n ))}\n </Box>\n\n {/* Inline Section: Variable Input or Copied Message */}\n {isFillingVariables && currentVar && (\n <Box flexDirection=\"column\" paddingX={1} borderStyle=\"round\" borderColor={isRunMode ? 'green' : 'cyan'} marginX={1}>\n <Box>\n <Text bold color={isRunMode ? 'green' : 'cyan'}>\n {isRunMode ? '▶ ' : ''}\n </Text>\n <Text color=\"yellow\">${`{${currentVar.name}}`}</Text>\n <Text dimColor> ({currentVarIndex + 1}/{variables.length})</Text>\n {currentVar.defaultValue && (\n <Text dimColor> default: {currentVar.defaultValue}</Text>\n )}\n </Box>\n <Box>\n <Text color=\"cyan\">→ </Text>\n <TextInput\n value={currentInput}\n onChange={setCurrentInput}\n onSubmit={handleVariableSubmit}\n placeholder={currentVar.defaultValue || 'Enter value...'}\n />\n </Box>\n </Box>\n )}\n {showCopiedMessage && (\n <Box paddingX={1} marginX={1}>\n <Text color=\"green\" bold>✓ Copied to clipboard!</Text>\n <Text dimColor> Press any key to continue</Text>\n </Box>\n )}\n {loadingImage && (\n <Box paddingX={1} marginX={1}>\n <Text color=\"yellow\">Loading image preview...</Text>\n </Box>\n )}\n\n {/* Footer */}\n <Box paddingX={1} justifyContent=\"space-between\">\n {isFillingVariables ? (\n <Text dimColor>\n Enter confirm · Esc cancel\n </Text>\n ) : (\n <Text dimColor>\n r run · c copy · o open · u user{hasMedia ? ' · p preview' : ''} · b back · q quit\n </Text>\n )}\n {showScrollIndicator && !isFillingVariables && (\n <Text dimColor>\n j/k scroll · {scrollPercent}%\n </Text>\n )}\n </Box>\n </Box>\n );\n}\n","/**\n * Variable Detection Utility\n * Detects common variable-like patterns in text that could be converted\n * to our supported format: ${variableName} or ${variableName:default}\n */\n\nexport interface DetectedVariable {\n original: string;\n name: string;\n defaultValue?: string;\n pattern: VariablePattern;\n startIndex: number;\n endIndex: number;\n}\n\nexport type VariablePattern = \n | \"double_bracket\" // [[name]] or [[ name ]]\n | \"double_curly\" // {{name}} or {{ name }}\n | \"single_bracket\" // [NAME] or [name]\n | \"single_curly\" // {NAME} or {name}\n | \"angle_bracket\" // <NAME> or <name>\n | \"percent\" // %NAME% or %name%\n | \"dollar_curly\"; // ${name} (already our format)\n\ninterface PatternConfig {\n pattern: VariablePattern;\n regex: RegExp;\n extractName: (match: RegExpExecArray) => string;\n extractDefault?: (match: RegExpExecArray) => string | undefined;\n}\n\n// Patterns to detect, ordered by specificity (more specific first)\nconst PATTERNS: PatternConfig[] = [\n // Double bracket: [[name]] or [[ name ]] or [[name: default]]\n {\n pattern: \"double_bracket\",\n regex: /\\[\\[\\s*([a-zA-Z_][a-zA-Z0-9_\\s]*?)(?:\\s*:\\s*([^\\]]*?))?\\s*\\]\\]/g,\n extractName: (m) => m[1].trim(),\n extractDefault: (m) => m[2]?.trim(),\n },\n // Double curly: {{name}} or {{ name }} or {{name: default}}\n {\n pattern: \"double_curly\",\n regex: /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_\\s]*?)(?:\\s*:\\s*([^}]*?))?\\s*\\}\\}/g,\n extractName: (m) => m[1].trim(),\n extractDefault: (m) => m[2]?.trim(),\n },\n // Our supported format (to exclude from warnings)\n {\n pattern: \"dollar_curly\",\n regex: /\\$\\{([a-zA-Z_][a-zA-Z0-9_\\s]*?)(?::([^}]*))?\\}/g,\n extractName: (m) => m[1].trim(),\n },\n // Single bracket with uppercase or placeholder-like: [NAME] or [Your Name]\n {\n pattern: \"single_bracket\",\n regex: /\\[([A-Z][A-Z0-9_\\s]*|[A-Za-z][a-zA-Z0-9_]*(?:\\s+[A-Za-z][a-zA-Z0-9_]*)*)\\]/g,\n extractName: (m) => m[1].trim(),\n },\n // Single curly with uppercase: {NAME} or {Your Name}\n {\n pattern: \"single_curly\",\n regex: /\\{([A-Z][A-Z0-9_\\s]*|[A-Za-z][a-zA-Z0-9_]*(?:\\s+[A-Za-z][a-zA-Z0-9_]*)*)\\}/g,\n extractName: (m) => m[1].trim(),\n },\n // Angle brackets: <NAME> or <name>\n {\n pattern: \"angle_bracket\",\n regex: /<([A-Z][A-Z0-9_\\s]*|[a-zA-Z_][a-zA-Z0-9_\\s]*)>/g,\n extractName: (m) => m[1].trim(),\n },\n // Percent signs: %NAME% or %name%\n {\n pattern: \"percent\",\n regex: /%([a-zA-Z_][a-zA-Z0-9_]*)%/g,\n extractName: (m) => m[1].trim(),\n },\n];\n\n// Common false positives to ignore\nconst FALSE_POSITIVES = new Set([\n // HTML/XML common tags\n \"div\", \"span\", \"p\", \"a\", \"br\", \"hr\", \"img\", \"input\", \"button\",\n \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"ul\", \"ol\", \"li\", \"table\",\n \"tr\", \"td\", \"th\", \"thead\", \"tbody\", \"form\", \"label\", \"select\",\n \"option\", \"textarea\", \"script\", \"style\", \"link\", \"meta\", \"head\",\n \"body\", \"html\", \"section\", \"article\", \"nav\", \"header\", \"footer\",\n \"main\", \"aside\", \"figure\", \"figcaption\", \"strong\", \"em\", \"code\",\n \"pre\", \"blockquote\", \"cite\", \"abbr\", \"address\", \"b\", \"i\", \"u\",\n // Common programming constructs\n \"if\", \"else\", \"for\", \"while\", \"switch\", \"case\", \"break\", \"return\",\n \"function\", \"class\", \"const\", \"let\", \"var\", \"import\", \"export\",\n \"default\", \"try\", \"catch\", \"finally\", \"throw\", \"new\", \"this\",\n \"null\", \"undefined\", \"true\", \"false\", \"typeof\", \"instanceof\",\n // JSON structure keywords (when in context)\n \"type\", \"id\", \"key\", \"value\", \"data\", \"items\", \"properties\",\n]);\n\n/**\n * Check if we're inside a JSON string context\n */\nfunction isInsideJsonString(text: string, index: number): boolean {\n let inString = false;\n for (let i = 0; i < index; i++) {\n if (text[i] === '\"' && (i === 0 || text[i - 1] !== '\\\\')) {\n inString = !inString;\n }\n }\n return inString;\n}\n\n/**\n * Detect variable-like patterns in text\n * Returns detected variables that are NOT in our supported format\n */\nexport function detectVariables(text: string): DetectedVariable[] {\n const detected: DetectedVariable[] = [];\n const seenRanges: Array<[number, number]> = [];\n \n // Track our supported format positions to exclude them\n const supportedVars = new Set<string>();\n const dollarCurlyPattern = /\\$\\{([a-zA-Z_][a-zA-Z0-9_\\s]*?)(?::([^}]*))?\\}/g;\n let match: RegExpExecArray | null;\n \n while ((match = dollarCurlyPattern.exec(text)) !== null) {\n seenRanges.push([match.index, match.index + match[0].length]);\n supportedVars.add(match[0]);\n }\n \n // Check each pattern\n for (const config of PATTERNS) {\n // Skip our supported format pattern for detection\n if (config.pattern === \"dollar_curly\") continue;\n \n const regex = new RegExp(config.regex.source, config.regex.flags);\n \n while ((match = regex.exec(text)) !== null) {\n const startIndex = match.index;\n const endIndex = startIndex + match[0].length;\n \n // Check if this range overlaps with any already detected range\n const overlaps = seenRanges.some(\n ([start, end]) => \n (startIndex >= start && startIndex < end) ||\n (endIndex > start && endIndex <= end)\n );\n \n if (overlaps) continue;\n \n const name = config.extractName(match);\n \n // Skip false positives\n if (FALSE_POSITIVES.has(name.toLowerCase())) continue;\n \n // Skip very short names (likely not variables)\n if (name.length < 2) continue;\n \n // For angle brackets, be more strict\n if (config.pattern === \"angle_bracket\") {\n if (!/^[A-Z]/.test(name) && !name.includes(\" \")) continue;\n }\n \n // For single curly/bracket in JSON context, be more careful\n if (\n (config.pattern === \"single_curly\" || config.pattern === \"single_bracket\") &&\n isInsideJsonString(text, startIndex)\n ) {\n if (!/^[A-Z]/.test(name) && !name.includes(\" \")) continue;\n }\n \n const defaultValue = config.extractDefault?.(match);\n \n detected.push({\n original: match[0],\n name,\n defaultValue,\n pattern: config.pattern,\n startIndex,\n endIndex,\n });\n \n seenRanges.push([startIndex, endIndex]);\n }\n }\n \n // Sort by position and remove duplicates\n return detected\n .sort((a, b) => a.startIndex - b.startIndex)\n .filter((v, i, arr) => \n i === 0 || v.original !== arr[i - 1].original || v.startIndex !== arr[i - 1].startIndex\n );\n}\n\n/**\n * Convert a detected variable to our supported format\n */\nexport function convertToSupportedFormat(variable: DetectedVariable): string {\n // Normalize name: lowercase, replace spaces with underscores\n const normalizedName = variable.name\n .toLowerCase()\n .replace(/\\s+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n \n if (variable.defaultValue) {\n return `\\${${normalizedName}:${variable.defaultValue}}`;\n }\n \n return `\\${${normalizedName}}`;\n}\n\n/**\n * Convert all detected variables in text to our supported format\n */\nexport function convertAllVariables(text: string): string {\n const detected = detectVariables(text);\n \n if (detected.length === 0) return text;\n \n // Sort by position descending to replace from end to start\n const sorted = [...detected].sort((a, b) => b.startIndex - a.startIndex);\n \n let result = text;\n for (const variable of sorted) {\n const converted = convertToSupportedFormat(variable);\n result = result.slice(0, variable.startIndex) + converted + result.slice(variable.endIndex);\n }\n \n return result;\n}\n\n/**\n * Alias for convertAllVariables - normalizes all variable formats to ${var}\n */\nexport const normalize = convertAllVariables;\n\n/**\n * Alias for detectVariables\n */\nexport const detect = detectVariables;\n\n/**\n * Get a human-readable pattern description\n */\nexport function getPatternDescription(pattern: VariablePattern): string {\n switch (pattern) {\n case \"double_bracket\": return \"[[...]]\";\n case \"double_curly\": return \"{{...}}\";\n case \"single_bracket\": return \"[...]\";\n case \"single_curly\": return \"{...}\";\n case \"angle_bracket\": return \"<...>\";\n case \"percent\": return \"%...%\";\n case \"dollar_curly\": return \"${...}\";\n }\n}\n\n/**\n * Extract variables from our supported ${var} or ${var:default} format\n */\nexport function extractVariables(text: string): Array<{ name: string; defaultValue?: string }> {\n const regex = /\\$\\{([a-zA-Z_][a-zA-Z0-9_\\s]*?)(?::([^}]*))?\\}/g;\n const variables: Array<{ name: string; defaultValue?: string }> = [];\n let match: RegExpExecArray | null;\n \n while ((match = regex.exec(text)) !== null) {\n variables.push({\n name: match[1].trim(),\n defaultValue: match[2]?.trim(),\n });\n }\n \n return variables;\n}\n\n/**\n * Compile a prompt template with variable values\n */\nexport function compile(\n template: string, \n values: Record<string, string>,\n options: { useDefaults?: boolean } = {}\n): string {\n const { useDefaults = true } = options;\n \n return template.replace(\n /\\$\\{([a-zA-Z_][a-zA-Z0-9_\\s]*?)(?::([^}]*))?\\}/g,\n (match, name, defaultValue) => {\n const trimmedName = name.trim();\n if (trimmedName in values) {\n return values[trimmedName];\n }\n if (useDefaults && defaultValue !== undefined) {\n return defaultValue.trim();\n }\n return match; // Keep original if no value and no default\n }\n );\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport { chatPlatforms, codePlatforms, imagePlatforms, videoPlatforms, buildUrl, type Platform } from '../platforms.js';\n\ninterface RunPromptProps {\n content: string;\n title?: string;\n description?: string;\n promptType?: 'TEXT' | 'IMAGE' | 'VIDEO' | 'AUDIO' | 'SKILL';\n mediaUrl?: string | null;\n onRun: (url: string, platform: Platform) => void;\n onCopyAndOpen: (content: string, platform: Platform) => void;\n onBack: () => void;\n}\n\ntype Tab = 'chat' | 'code';\n\nexport function RunPrompt({ content, title, description, promptType, mediaUrl, onRun, onCopyAndOpen, onBack }: RunPromptProps) {\n const { stdout } = useStdout();\n const [tab, setTab] = useState<Tab>('chat');\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n // Get platforms based on tab, include media platforms for image/video prompts\n const basePlatforms = tab === 'chat' ? chatPlatforms : codePlatforms;\n const mediaPlatforms = promptType === 'IMAGE' ? imagePlatforms : promptType === 'VIDEO' ? videoPlatforms : [];\n \n // Sort: sponsors first, then alphabetically\n const platforms = [...mediaPlatforms, ...basePlatforms].sort((a, b) => {\n if (a.sponsor && !b.sponsor) return -1;\n if (!a.sponsor && b.sponsor) return 1;\n return a.name.localeCompare(b.name);\n });\n const previewLength = terminalWidth - 6;\n const contentPreview = content.replace(/\\n/g, ' ').slice(0, previewLength);\n const isMediaType = promptType === 'IMAGE' || promptType === 'VIDEO' || promptType === 'AUDIO';\n\n useInput((input: string, key: { escape?: boolean; return?: boolean; leftArrow?: boolean; rightArrow?: boolean; upArrow?: boolean; downArrow?: boolean }) => {\n if (key.escape || input === 'b') {\n onBack();\n return;\n }\n\n if (key.leftArrow || key.rightArrow || input === 'h' || input === 'l') {\n setTab(tab === 'chat' ? 'code' : 'chat');\n setSelectedIndex(0);\n return;\n }\n\n if (key.upArrow || input === 'k') {\n setSelectedIndex((i) => Math.max(0, i - 1));\n }\n\n if (key.downArrow || input === 'j') {\n setSelectedIndex((i) => Math.min(platforms.length - 1, i + 1));\n }\n\n if (key.return) {\n const platform = platforms[selectedIndex];\n if (platform.supportsQuerystring === false) {\n onCopyAndOpen(content, platform);\n } else {\n const url = buildUrl(platform.id, platform.baseUrl, content, title, description);\n onRun(url, platform);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n {/* Header with Prompt Info */}\n <Box flexDirection=\"column\" paddingX={1} marginBottom={1}>\n <Box>\n <Text bold color=\"green\">▶ Run: </Text>\n <Text bold color=\"cyan\">{title || 'Untitled'}</Text>\n {isMediaType && (\n <Text color=\"magenta\"> [{promptType}]</Text>\n )}\n </Box>\n <Box>\n <Text dimColor>{contentPreview}{content.length > previewLength ? '…' : ''}</Text>\n </Box>\n </Box>\n\n {/* Tabs */}\n <Box paddingX={1} marginBottom={1}>\n <Text \n color={tab === 'chat' ? 'cyan' : 'gray'} \n bold={tab === 'chat'}\n underline={tab === 'chat'}\n >\n Chat\n </Text>\n <Text dimColor> </Text>\n <Text \n color={tab === 'code' ? 'cyan' : 'gray'} \n bold={tab === 'code'}\n underline={tab === 'code'}\n >\n Code\n </Text>\n <Text dimColor> h/l to switch</Text>\n </Box>\n\n {/* Platform List */}\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n {platforms.map((platform, index) => (\n <Box key={platform.id}>\n <Text color={index === selectedIndex ? 'cyan' : undefined}>\n {index === selectedIndex ? '❯ ' : ' '}\n </Text>\n {platform.sponsor ? (\n <Text color=\"magenta\">♥ </Text>\n ) : platform.supportsQuerystring === false ? (\n <Text color=\"yellow\">◐ </Text>\n ) : (\n <Text color=\"green\">⚡ </Text>\n )}\n <Text\n color={index === selectedIndex ? 'cyan' : undefined}\n bold={index === selectedIndex}\n >\n {platform.name}\n </Text>\n {platform.supportsQuerystring === false && (\n <Text dimColor> (copy & open)</Text>\n )}\n </Box>\n ))}\n </Box>\n\n {/* Footer */}\n <Box paddingX={1} justifyContent=\"space-between\">\n <Text dimColor>\n j/k select · Enter run · h/l tab · b back\n </Text>\n <Text dimColor>\n ♥ sponsor · ⚡ direct · ◐ copy+open\n </Text>\n </Box>\n </Box>\n );\n}\n"],"mappings":"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","names":["useState","useState","useEffect","Box","Text","useInput","useApp","useStdout","TextInput","useState","Box","Text","useInput","useStdout","jsx","jsxs","Fragment","jsx","jsxs","Text","useApp","useStdout","useState","useEffect","useInput","buildUrl","Box","TextInput","jsx","useState"]}
1
+ {"version":3,"sources":["../../src/cli/platforms.ts","../../src/cli/index.tsx","../../src/cli/components/PromptList.tsx","../../src/cli/api.ts","../../src/cli/components/PromptDetail.tsx","../../src/variables/index.ts","../../src/cli/components/RunPrompt.tsx","../../src/cli/new.ts"],"sourcesContent":["export interface Platform {\n id: string;\n name: string;\n baseUrl: string;\n supportsQuerystring?: boolean;\n isDeeplink?: boolean;\n sponsor?: boolean;\n}\n\n// Image generation platforms (Mitte.ai)\nexport const imagePlatforms: Platform[] = [\n { id: \"mitte-nano-banana\", name: \"Mitte.ai - Nano Banana\", baseUrl: \"https://mitte.ai?model=nano-banana\", sponsor: true },\n { id: \"mitte-nano-banana-pro\", name: \"Mitte.ai - Nano Banana Pro\", baseUrl: \"https://mitte.ai?model=nano-banana-pro\", sponsor: true },\n { id: \"mitte-flux-2-flex\", name: \"Mitte.ai - Flux 2 Flex\", baseUrl: \"https://mitte.ai?model=flux-2-flex\", sponsor: true },\n { id: \"mitte-flux-2\", name: \"Mitte.ai - Flux 2\", baseUrl: \"https://mitte.ai?model=flux-2\", sponsor: true },\n];\n\n// Video generation platforms (Mitte.ai)\nexport const videoPlatforms: Platform[] = [\n { id: \"mitte-veo-31\", name: \"Mitte.ai - Veo 3.1\", baseUrl: \"https://mitte.ai?model=veo-31\", sponsor: true },\n { id: \"mitte-kling-26\", name: \"Mitte.ai - Kling 2.6\", baseUrl: \"https://mitte.ai?model=kling-26\", sponsor: true },\n { id: \"mitte-sora-2\", name: \"Mitte.ai - Sora 2\", baseUrl: \"https://mitte.ai?model=sora-2\", sponsor: true },\n];\n\nexport const codePlatforms: Platform[] = [\n { id: \"windsurf\", name: \"Windsurf\", baseUrl: \"windsurf://\", isDeeplink: true, supportsQuerystring: false, sponsor: true },\n { id: \"vscode\", name: \"VS Code\", baseUrl: \"vscode://\", isDeeplink: true, supportsQuerystring: false },\n { id: \"vscode-insiders\", name: \"VS Code Insiders\", baseUrl: \"vscode-insiders://\", isDeeplink: true, supportsQuerystring: false },\n { id: \"cursor\", name: \"Cursor\", baseUrl: \"cursor://anysphere.cursor-deeplink/prompt\", isDeeplink: true },\n { id: \"goose\", name: \"Goose\", baseUrl: \"goose://recipe\", isDeeplink: true },\n { id: \"github-copilot\", name: \"GitHub Copilot Chat\", baseUrl: \"https://github.com/copilot\" },\n { id: \"github-copilot-agents\", name: \"GitHub Copilot Agents\", baseUrl: \"https://github.com/copilot/agents\" },\n { id: \"bolt\", name: \"Bolt\", baseUrl: \"https://bolt.new\" },\n { id: \"lovable\", name: \"Lovable\", baseUrl: \"https://lovable.dev\" },\n { id: \"v0\", name: \"v0\", baseUrl: \"https://v0.dev/chat\" },\n { id: \"ai2sql\", name: \"AI2SQL\", baseUrl: \"https://builder.ai2sql.io/dashboard/builder-all-lp?tab=generate\" },\n];\n\nexport const chatPlatforms: Platform[] = [\n { id: \"chatgpt\", name: \"ChatGPT\", baseUrl: \"https://chatgpt.com\" },\n { id: \"claude\", name: \"Claude\", baseUrl: \"https://claude.ai/new\" },\n { id: \"copilot\", name: \"Microsoft Copilot\", baseUrl: \"https://copilot.microsoft.com\", supportsQuerystring: false },\n { id: \"deepseek\", name: \"DeepSeek\", baseUrl: \"https://chat.deepseek.com\", supportsQuerystring: false },\n { id: \"fal\", name: \"fal.ai Sandbox\", baseUrl: \"https://fal.ai/sandbox\" },\n { id: \"gemini\", name: \"Gemini\", baseUrl: \"https://gemini.google.com/app\", supportsQuerystring: false },\n { id: \"grok\", name: \"Grok\", baseUrl: \"https://grok.com/chat?reasoningMode=none\" },\n { id: \"grok-deepsearch\", name: \"Grok Deep Search\", baseUrl: \"https://grok.com/chat?reasoningMode=deepsearch\" },\n { id: \"grok-think\", name: \"Grok Think\", baseUrl: \"https://grok.com/chat?reasoningMode=think\" },\n { id: \"huggingface\", name: \"HuggingChat\", baseUrl: \"https://huggingface.co/chat\" },\n { id: \"llama\", name: \"Meta AI\", baseUrl: \"https://www.meta.ai\" },\n { id: \"manus\", name: \"Manus\", baseUrl: \"https://manus.im/app\" },\n { id: \"mistral\", name: \"Le Chat\", baseUrl: \"https://chat.mistral.ai/chat\" },\n { id: \"perplexity\", name: \"Perplexity\", baseUrl: \"https://www.perplexity.ai\" },\n { id: \"phind\", name: \"Phind\", baseUrl: \"https://www.phind.com\" },\n { id: \"pi\", name: \"Pi\", baseUrl: \"https://pi.ai\", supportsQuerystring: false },\n { id: \"poe\", name: \"Poe\", baseUrl: \"https://poe.com\", supportsQuerystring: false },\n { id: \"you\", name: \"You.com\", baseUrl: \"https://you.com\" },\n];\n\nexport function buildUrl(\n platformId: string, \n baseUrl: string, \n promptText: string, \n promptTitle?: string, \n promptDescription?: string\n): string {\n const encoded = encodeURIComponent(promptText);\n \n switch (platformId) {\n case \"cursor\":\n return `${baseUrl}?text=${encoded}`;\n case \"goose\": {\n const config = JSON.stringify({\n version: \"1.0.0\",\n title: promptTitle || \"Prompt\",\n description: promptDescription || \"\",\n instructions: \"This is a prompt imported from prompts.chat.\",\n prompt: promptText,\n activities: [\"Do it now\"]\n });\n const base64Config = Buffer.from(config).toString('base64');\n return `${baseUrl}?config=${base64Config}`;\n }\n case \"bolt\":\n return `${baseUrl}?prompt=${encoded}`;\n case \"chatgpt\":\n return `${baseUrl}/?q=${encoded}`;\n case \"claude\":\n return `${baseUrl}?q=${encoded}`;\n case \"github-copilot\":\n case \"github-copilot-agents\":\n return `${baseUrl}?prompt=${encoded}`;\n case \"ai2sql\":\n return `${baseUrl}&prompt=${encoded}`;\n case \"fal\":\n return `${baseUrl}?prompt=${encoded}`;\n case \"grok\":\n case \"grok-deepsearch\":\n case \"grok-think\":\n return `${baseUrl}&q=${encoded}`;\n case \"huggingface\":\n return `${baseUrl}/?prompt=${encoded}`;\n case \"lovable\":\n return `${baseUrl}/?autosubmit=true#prompt=${encoded}`;\n case \"mistral\":\n return `${baseUrl}?q=${encoded}`;\n case \"perplexity\":\n return `${baseUrl}/search?q=${encoded}`;\n case \"phind\":\n return `${baseUrl}/search?q=${encoded}`;\n case \"v0\":\n return `${baseUrl}?q=${encoded}`;\n case \"you\":\n return `${baseUrl}/search?q=${encoded}`;\n case \"mitte-nano-banana\":\n case \"mitte-nano-banana-pro\":\n case \"mitte-flux-2-flex\":\n case \"mitte-flux-2\":\n case \"mitte-veo-31\":\n case \"mitte-kling-26\":\n case \"mitte-sora-2\":\n return `${baseUrl}&prompt=${encoded}`;\n default:\n return `${baseUrl}?q=${encoded}`;\n }\n}\n","import React, { useState } from 'react';\nimport { render } from 'ink';\nimport meow from 'meow';\nimport clipboardy from 'clipboardy';\nimport { spawn } from 'child_process';\nimport { PromptList } from './components/PromptList.js';\nimport { PromptDetail } from './components/PromptDetail.js';\nimport type { Prompt } from './api.js';\nimport { createNew } from './new.js';\n\ntype View = 'list' | 'detail';\n\ninterface AppState {\n view: View;\n selectedPrompt: Prompt | null;\n searchQuery: string;\n page: number;\n selectedCategory: string | null;\n selectedIndex: number;\n}\n\nfunction App() {\n const [state, setState] = useState<AppState>({\n view: 'list',\n selectedPrompt: null,\n searchQuery: '',\n page: 1,\n selectedCategory: null,\n selectedIndex: 0,\n });\n\n const handleSelectPrompt = (prompt: Prompt) => {\n setState(prev => ({\n ...prev,\n view: 'detail',\n selectedPrompt: prompt,\n }));\n };\n\n const handleBack = () => {\n setState(prev => ({\n ...prev,\n view: 'list',\n selectedPrompt: null,\n }));\n };\n\n const handleSearchChange = (query: string) => {\n setState(prev => ({ ...prev, searchQuery: query, page: 1 }));\n };\n\n const handlePageChange = (page: number) => {\n setState(prev => ({ ...prev, page }));\n };\n\n const handleCategoryChange = (category: string | null) => {\n setState(prev => ({ ...prev, selectedCategory: category, page: 1, selectedIndex: 0 }));\n };\n\n const handleIndexChange = (index: number) => {\n setState(prev => ({ ...prev, selectedIndex: index }));\n };\n\n const handleCopy = async (content: string) => {\n try {\n await clipboardy.write(content);\n } catch {\n // Clipboard might not be available in some environments\n }\n };\n\n const handleQuit = () => {\n process.exit(0);\n };\n\n if (state.view === 'detail' && state.selectedPrompt) {\n return (\n <PromptDetail\n prompt={state.selectedPrompt}\n onBack={handleBack}\n onCopy={handleCopy}\n />\n );\n }\n\n return (\n <PromptList\n onSelect={handleSelectPrompt}\n onQuit={handleQuit}\n searchQuery={state.searchQuery}\n onSearchChange={handleSearchChange}\n page={state.page}\n onPageChange={handlePageChange}\n selectedCategory={state.selectedCategory}\n onCategoryChange={handleCategoryChange}\n selectedIndex={state.selectedIndex}\n onIndexChange={handleIndexChange}\n />\n );\n}\n\nconst cli = meow(`\n Usage\n $ prompts-chat [command] [options]\n\n Commands\n (default) Launch interactive TUI\n new <dir> Create a new prompts.chat instance\n mcp Start MCP server for AI tools\n\n Options\n --help Show this help\n --version Show version\n\n Navigation (TUI)\n ↑/↓ or j/k Navigate list\n Enter Select prompt\n / Search prompts\n n/p Next/Previous page\n r Run prompt (open in ChatGPT, Claude, etc.)\n c Copy prompt (with variable filling)\n C Copy raw prompt\n o Open in browser\n b Go back\n q Quit\n\n Examples\n $ npx prompts.chat\n $ npx prompts.chat new my-prompts\n $ prompts-chat\n`, {\n importMeta: import.meta,\n flags: {},\n});\n\nasync function main() {\n const [command, ...args] = cli.input;\n\n // Handle 'new' command\n if (command === 'new') {\n const directory = args[0];\n if (!directory) {\n console.error('\\n❌ Please specify a directory name.\\n');\n console.error(' Usage: npx prompts.chat new <directory>\\n');\n process.exit(1);\n }\n await createNew({ directory });\n return;\n }\n\n // Handle 'mcp' command - proxy to @fkadev/prompts.chat-mcp\n if (command === 'mcp') {\n const child = spawn('npx', ['-y', '@fkadev/prompts.chat-mcp', ...args], {\n stdio: 'inherit',\n shell: true,\n });\n child.on('close', (code) => process.exit(code ?? 0));\n return;\n }\n\n // Default: Launch interactive TUI\n console.clear();\n \n const { waitUntilExit } = render(<App />, {\n exitOnCtrlC: true,\n });\n \n waitUntilExit().then(() => {\n console.clear();\n });\n}\n\nmain();\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Box, Text, useInput, useApp, useStdout } from 'ink';\nimport Spinner from 'ink-spinner';\nimport TextInput from 'ink-text-input';\nimport { loadPrompts as loadAllPrompts, filterPrompts, getCategories, type Prompt, type Category } from '../api.js';\n\ninterface PromptListProps {\n onSelect: (prompt: Prompt) => void;\n onQuit: () => void;\n searchQuery: string;\n onSearchChange: (query: string) => void;\n page: number;\n onPageChange: (page: number) => void;\n selectedCategory: string | null;\n onCategoryChange: (category: string | null) => void;\n selectedIndex: number;\n onIndexChange: (index: number) => void;\n}\n\ntype ViewMode = 'list' | 'categories';\n\nexport function PromptList({ \n onSelect, \n onQuit, \n searchQuery, \n onSearchChange, \n page, \n onPageChange, \n selectedCategory, \n onCategoryChange,\n selectedIndex,\n onIndexChange\n}: PromptListProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const allPromptsRef = useRef<Prompt[]>([]);\n const [prompts, setPrompts] = useState<Prompt[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [localSearchQuery, setLocalSearchQuery] = useState(searchQuery);\n const [isSearching, setIsSearching] = useState(false);\n const [totalPages, setTotalPages] = useState(1);\n const [total, setTotal] = useState(0);\n const [viewMode, setViewMode] = useState<ViewMode>('list');\n const [categories, setCategories] = useState<Category[]>([]);\n const [categoryIndex, setCategoryIndex] = useState(0);\n const [categorySearchQuery, setCategorySearchQuery] = useState('');\n const [isSearchingCategories, setIsSearchingCategories] = useState(false);\n\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n const headerLines = 3;\n const footerLines = 2;\n const listHeight = Math.max(terminalHeight - headerLines - footerLines, 5);\n const perPage = listHeight;\n\n useEffect(() => {\n initializePrompts();\n }, []);\n\n useEffect(() => {\n if (allPromptsRef.current.length > 0) {\n applyFilters();\n }\n }, [page, searchQuery, selectedCategory, perPage]);\n\n async function initializePrompts() {\n setLoading(true);\n setError(null);\n try {\n const all = await loadAllPrompts();\n allPromptsRef.current = all;\n setCategories(getCategories(all));\n applyFilters();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load prompts');\n } finally {\n setLoading(false);\n }\n }\n\n function applyFilters() {\n const result = filterPrompts(allPromptsRef.current, {\n q: searchQuery || undefined,\n category: selectedCategory || undefined,\n page,\n perPage,\n });\n setPrompts(result.prompts);\n setTotalPages(result.totalPages);\n setTotal(result.total);\n }\n\n useInput((input, key) => {\n if (isSearching) {\n if (key.escape) {\n setIsSearching(false);\n setLocalSearchQuery(searchQuery);\n }\n return;\n }\n\n // Category search mode\n if (isSearchingCategories) {\n if (key.escape) {\n setIsSearchingCategories(false);\n setCategorySearchQuery('');\n }\n return;\n }\n\n // Category selector mode\n if (viewMode === 'categories') {\n if (key.escape || input === 'b') {\n setViewMode('list');\n setCategorySearchQuery('');\n return;\n }\n if (input === '/') {\n setIsSearchingCategories(true);\n return;\n }\n if (key.upArrow || input === 'k') {\n setCategoryIndex((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow || input === 'j') {\n const filteredCats = categorySearchQuery \n ? categories.filter(c => c.name.toLowerCase().includes(categorySearchQuery.toLowerCase()))\n : categories;\n const maxIndex = categorySearchQuery ? filteredCats.length - 1 : filteredCats.length;\n setCategoryIndex((i) => Math.min(maxIndex, i + 1));\n return;\n }\n if (key.return) {\n const filteredCats = categorySearchQuery \n ? categories.filter(c => c.name.toLowerCase().includes(categorySearchQuery.toLowerCase()))\n : categories;\n if (categorySearchQuery) {\n // When filtering, index 0 = first filtered category\n if (filteredCats[categoryIndex]) {\n onCategoryChange(filteredCats[categoryIndex].slug);\n }\n } else {\n // When not filtering, index 0 = \"All Categories\"\n if (categoryIndex === 0) {\n onCategoryChange(null);\n } else if (filteredCats[categoryIndex - 1]) {\n onCategoryChange(filteredCats[categoryIndex - 1].slug);\n }\n }\n setViewMode('list');\n setCategorySearchQuery('');\n return;\n }\n return;\n }\n\n if (input === 'q' || key.escape) {\n onQuit();\n exit();\n return;\n }\n\n if (input === '/') {\n setIsSearching(true);\n return;\n }\n\n if (input === 'c') {\n setViewMode('categories');\n setCategoryIndex(selectedCategory ? categories.findIndex(c => c.slug === selectedCategory) + 1 : 0);\n return;\n }\n\n if (key.upArrow || input === 'k') {\n onIndexChange(Math.max(0, selectedIndex - 1));\n }\n\n if (key.downArrow || input === 'j') {\n onIndexChange(Math.min(prompts.length - 1, selectedIndex + 1));\n }\n\n if (key.return && prompts[selectedIndex]) {\n onSelect(prompts[selectedIndex]);\n }\n\n if (input === 'n' && page < totalPages) {\n onPageChange(page + 1);\n }\n\n if (input === 'p' && page > 1) {\n onPageChange(page - 1);\n }\n\n if (input === 'r') {\n initializePrompts();\n }\n });\n\n const handleSearchSubmit = (value: string) => {\n onSearchChange(value);\n setLocalSearchQuery(value);\n setIsSearching(false);\n };\n\n const handleCategorySearchSubmit = (value: string) => {\n setCategorySearchQuery(value);\n setCategoryIndex(0);\n setIsSearchingCategories(false);\n };\n\n const filteredCategories = categorySearchQuery \n ? categories.filter(c => c.name.toLowerCase().includes(categorySearchQuery.toLowerCase()))\n : categories;\n\n const maxTitleLength = terminalWidth - 30;\n\n if (error) {\n return (\n <Box flexDirection=\"column\" height={terminalHeight} padding={1}>\n <Text color=\"red\">Error: {error}</Text>\n <Text dimColor>Press 'r' to retry, 'q' to quit</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n {/* Header */}\n <Box paddingX={1} marginBottom={0}>\n <Text bold color=\"cyan\">⚡ prompts.chat</Text>\n <Text dimColor> — {total} prompts</Text>\n {selectedCategory && (\n <>\n <Text dimColor> · </Text>\n <Text color=\"magenta\">{selectedCategory}</Text>\n </>\n )}\n {searchQuery && !isSearching && (\n <>\n <Text dimColor> · </Text>\n <Text color=\"yellow\">{searchQuery}</Text>\n </>\n )}\n </Box>\n\n {/* Search Input */}\n {isSearching && (\n <Box paddingX={1}>\n <Text color=\"yellow\">Search: </Text>\n <TextInput\n value={localSearchQuery}\n onChange={setLocalSearchQuery}\n onSubmit={handleSearchSubmit}\n placeholder=\"Type to search...\"\n />\n </Box>\n )}\n\n {/* Category Selector */}\n {viewMode === 'categories' && (\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n <Box marginBottom={1}>\n <Text bold color=\"magenta\">Select Category</Text>\n {categorySearchQuery && !isSearchingCategories && (\n <>\n <Text dimColor> · </Text>\n <Text color=\"yellow\">{categorySearchQuery}</Text>\n </>\n )}\n </Box>\n {isSearchingCategories && (\n <Box marginBottom={1}>\n <Text color=\"yellow\">Search: </Text>\n <TextInput\n value={categorySearchQuery}\n onChange={setCategorySearchQuery}\n onSubmit={handleCategorySearchSubmit}\n placeholder=\"Type to filter...\"\n />\n </Box>\n )}\n {categories.length === 0 ? (\n <Box>\n <Text color=\"green\"><Spinner type=\"dots\" /></Text>\n <Text> Loading categories...</Text>\n </Box>\n ) : (\n <>\n {!categorySearchQuery && (\n <Box>\n <Text color={categoryIndex === 0 ? 'cyan' : undefined}>\n {categoryIndex === 0 ? '❯ ' : ' '}\n </Text>\n <Text color={categoryIndex === 0 ? 'cyan' : undefined} bold={categoryIndex === 0}>\n All Categories\n </Text>\n </Box>\n )}\n {filteredCategories.slice(0, listHeight - 1).map((cat, index) => {\n const adjustedIndex = categorySearchQuery ? index : index + 1;\n return (\n <Box key={cat.id}>\n <Text color={adjustedIndex === categoryIndex ? 'cyan' : undefined}>\n {adjustedIndex === categoryIndex ? '❯ ' : ' '}\n </Text>\n <Text\n color={adjustedIndex === categoryIndex ? 'cyan' : undefined}\n bold={adjustedIndex === categoryIndex}\n >\n {cat.name}\n </Text>\n {cat.count > 0 && (\n <Text dimColor> ({cat.count})</Text>\n )}\n </Box>\n );\n })}\n </>\n )}\n </Box>\n )}\n\n {/* List */}\n {viewMode === 'list' && (\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n {loading ? (\n <Box>\n <Text color=\"green\">\n <Spinner type=\"dots\" />\n </Text>\n <Text> Loading prompts...</Text>\n </Box>\n ) : (\n prompts.slice(0, listHeight).map((prompt, index) => (\n <Box key={prompt.id}>\n <Text color={index === selectedIndex ? 'cyan' : undefined}>\n {index === selectedIndex ? '❯ ' : ' '}\n </Text>\n <Text\n color={index === selectedIndex ? 'cyan' : undefined}\n bold={index === selectedIndex}\n >\n {prompt.title.slice(0, maxTitleLength)}\n {prompt.title.length > maxTitleLength ? '…' : ''}\n </Text>\n <Text dimColor> @{prompt.author.username}</Text>\n {prompt.voteCount > 0 && (\n <Text color=\"yellow\"> ⬆ {prompt.voteCount}</Text>\n )}\n </Box>\n ))\n )}\n </Box>\n )}\n\n {/* Footer */}\n <Box paddingX={1} justifyContent=\"space-between\">\n {viewMode === 'categories' ? (\n <Text dimColor>\n j/k nav · Enter select · / search · b back\n </Text>\n ) : (\n <Text dimColor>\n j/k nav · Enter select · / search · c category · n/p pages · q quit\n </Text>\n )}\n <Text dimColor>\n {viewMode === 'list' ? `${page}/${totalPages}` : ''}\n </Text>\n </Box>\n </Box>\n );\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\n\nconst PROMPTS_URL = 'https://prompts.chat/prompts.json';\nconst CACHE_DIR = join(homedir(), '.prompts-chat');\nconst CACHE_FILE = join(CACHE_DIR, 'prompts.json');\n\nexport interface Prompt {\n id: string;\n title: string;\n slug: string;\n description: string | null;\n content: string;\n type: 'TEXT' | 'IMAGE' | 'VIDEO' | 'AUDIO' | 'SKILL';\n mediaUrl: string | null;\n voteCount: number;\n viewCount: number;\n author: {\n username: string;\n name: string | null;\n avatar: string | null;\n verified: boolean;\n };\n category: {\n id: string;\n name: string;\n slug: string;\n } | null;\n tags: Array<{\n id: string;\n name: string;\n slug: string;\n }>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Category {\n id: string;\n name: string;\n slug: string;\n count: number;\n}\n\ninterface CachedData {\n prompts: Prompt[];\n fetchedAt: number;\n}\n\nlet cachedPrompts: Prompt[] | null = null;\n\nfunction ensureCacheDir() {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n}\n\nfunction loadFromCache(): Prompt[] | null {\n try {\n if (existsSync(CACHE_FILE)) {\n const data = JSON.parse(readFileSync(CACHE_FILE, 'utf-8')) as CachedData;\n return data.prompts;\n }\n } catch {\n // Ignore cache read errors\n }\n return null;\n}\n\nfunction saveToCache(prompts: Prompt[]) {\n try {\n ensureCacheDir();\n const data: CachedData = { prompts, fetchedAt: Date.now() };\n writeFileSync(CACHE_FILE, JSON.stringify(data));\n } catch {\n // Ignore cache write errors\n }\n}\n\nexport async function loadPrompts(): Promise<Prompt[]> {\n // Return cached prompts if already loaded\n if (cachedPrompts) {\n return cachedPrompts;\n }\n\n // Try to fetch fresh data\n try {\n const response = await fetch(PROMPTS_URL);\n if (response.ok) {\n const data = await response.json();\n cachedPrompts = data.prompts as Prompt[];\n saveToCache(cachedPrompts);\n return cachedPrompts;\n }\n } catch {\n // Network error, try cache\n }\n\n // Fall back to local cache\n const cached = loadFromCache();\n if (cached) {\n cachedPrompts = cached;\n return cachedPrompts;\n }\n\n throw new Error('No prompts available. Please check your internet connection.');\n}\n\nexport function getCategories(prompts: Prompt[]): Category[] {\n const categoryMap = new Map<string, Category>();\n \n for (const prompt of prompts) {\n if (prompt.category) {\n const existing = categoryMap.get(prompt.category.slug);\n if (existing) {\n existing.count++;\n } else {\n categoryMap.set(prompt.category.slug, {\n id: prompt.category.id,\n name: prompt.category.name,\n slug: prompt.category.slug,\n count: 1,\n });\n }\n }\n }\n \n return Array.from(categoryMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function filterPrompts(prompts: Prompt[], options: {\n q?: string;\n category?: string;\n page?: number;\n perPage?: number;\n}): { prompts: Prompt[]; total: number; page: number; perPage: number; totalPages: number } {\n let filtered = prompts;\n \n // Filter by search query\n if (options.q) {\n const query = options.q.toLowerCase();\n filtered = filtered.filter(p => \n p.title.toLowerCase().includes(query) ||\n p.content.toLowerCase().includes(query) ||\n p.description?.toLowerCase().includes(query) ||\n p.author.username.toLowerCase().includes(query) ||\n p.author.name?.toLowerCase().includes(query) ||\n p.tags.some(t => t.name.toLowerCase().includes(query) || t.slug.toLowerCase().includes(query))\n );\n }\n \n // Filter by category\n if (options.category) {\n filtered = filtered.filter(p => p.category?.slug === options.category);\n }\n \n const total = filtered.length;\n const page = options.page || 1;\n const perPage = options.perPage || 20;\n const totalPages = Math.ceil(total / perPage);\n \n // Paginate\n const start = (page - 1) * perPage;\n const paged = filtered.slice(start, start + perPage);\n \n return { prompts: paged, total, page, perPage, totalPages };\n}\n\nexport function getPrompt(prompts: Prompt[], id: string): Prompt | undefined {\n return prompts.find(p => p.id === id || p.slug === id || `${p.id}_${p.slug}` === id);\n}\n","import React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput, useApp, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { type Prompt } from '../api.js';\nimport { extractVariables, compile } from '../../variables/index.js';\nimport { RunPrompt } from './RunPrompt.js';\nimport { type Platform } from '../platforms.js';\n\ninterface PromptDetailProps {\n prompt: Prompt;\n onBack: () => void;\n onCopy: (content: string) => void;\n}\n\ntype ViewMode = 'detail' | 'variables' | 'copied' | 'run' | 'run-variables' | 'preview';\n\nfunction HighlightedLine({ text }: { text: string }) {\n // Split by variable pattern ${...}\n const parts = text.split(/(\\$\\{[^}]+\\})/g);\n \n return (\n <Text>\n {parts.map((part, i) => {\n if (part.match(/^\\$\\{[^}]+\\}$/)) {\n return <Text key={i} color=\"yellow\" bold>{part}</Text>;\n }\n return <Text key={i}>{part}</Text>;\n })}\n </Text>\n );\n}\n\nfunction wrapText(text: string, width: number): string[] {\n const lines: string[] = [];\n const rawLines = text.split('\\n');\n \n for (const rawLine of rawLines) {\n if (rawLine.length <= width) {\n lines.push(rawLine);\n } else {\n let remaining = rawLine;\n while (remaining.length > width) {\n let breakPoint = remaining.lastIndexOf(' ', width);\n if (breakPoint === -1 || breakPoint < width / 2) {\n breakPoint = width;\n }\n lines.push(remaining.slice(0, breakPoint));\n remaining = remaining.slice(breakPoint).trimStart();\n }\n if (remaining) {\n lines.push(remaining);\n }\n }\n }\n return lines;\n}\n\nexport function PromptDetail({ prompt, onBack, onCopy }: PromptDetailProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const [viewMode, setViewMode] = useState<ViewMode>('detail');\n const [variables, setVariables] = useState<Array<{ name: string; defaultValue?: string }>>([]);\n const [variableValues, setVariableValues] = useState<Record<string, string>>({});\n const [currentVarIndex, setCurrentVarIndex] = useState(0);\n const [currentInput, setCurrentInput] = useState('');\n const [compiledContent, setCompiledContent] = useState('');\n const [pendingPlatform, setPendingPlatform] = useState<Platform | null>(null);\n const [runAction, setRunAction] = useState<'copy' | 'run'>('run');\n const [scrollOffset, setScrollOffset] = useState(0);\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const [loadingImage, setLoadingImage] = useState(false);\n\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n const headerLines = 8;\n const footerLines = 2;\n const contentHeight = Math.max(terminalHeight - headerLines - footerLines, 5);\n\n useEffect(() => {\n const vars = extractVariables(prompt.content);\n setVariables(vars);\n \n const defaults: Record<string, string> = {};\n vars.forEach(v => {\n if (v.defaultValue) defaults[v.name] = v.defaultValue;\n });\n setVariableValues(defaults);\n }, [prompt]);\n\n const contentLines = useMemo(() => {\n if (!prompt) return [];\n // Parse escape sequences like \\n\n const parsedContent = prompt.content.replace(/\\\\n/g, '\\n');\n return wrapText(parsedContent, terminalWidth - 6);\n }, [prompt, terminalWidth]);\n\n const maxScroll = Math.max(0, contentLines.length - contentHeight);\n\n const isMediaType = prompt?.type === 'IMAGE' || prompt?.type === 'VIDEO' || prompt?.type === 'AUDIO';\n const hasMedia = isMediaType && prompt?.mediaUrl;\n\n async function loadImagePreview() {\n if (!prompt?.mediaUrl || loadingImage) return;\n setLoadingImage(true);\n try {\n const terminalImage = await import('terminal-image');\n const response = await fetch(prompt.mediaUrl);\n const buffer = Buffer.from(await response.arrayBuffer());\n const image = await terminalImage.default.buffer(buffer, { \n width: terminalWidth - 4,\n height: terminalHeight - 4,\n preserveAspectRatio: true \n });\n setImagePreview(image);\n setViewMode('preview');\n } catch {\n setImagePreview('[Could not load image]');\n } finally {\n setLoadingImage(false);\n }\n }\n\n useInput((input: string, key: { escape?: boolean; return?: boolean; upArrow?: boolean; downArrow?: boolean; pageUp?: boolean; pageDown?: boolean }) => {\n if (viewMode === 'run' || viewMode === 'run-variables') {\n return; // RunPrompt handles its own input\n }\n\n if (viewMode === 'variables') {\n if (key.escape) {\n setViewMode('detail');\n setCurrentVarIndex(0);\n setCurrentInput('');\n }\n return;\n }\n\n if (viewMode === 'copied') {\n if (key.escape || input === 'b' || key.return) {\n setViewMode('detail');\n }\n return;\n }\n\n // Preview mode\n if (viewMode === 'preview') {\n if (key.escape || input === 'b') {\n setImagePreview(null);\n setViewMode('detail');\n }\n return;\n }\n\n // Scrolling with hjkl and arrow keys\n if (viewMode === 'detail') {\n if (input === 'j' || key.downArrow) {\n setScrollOffset(prev => Math.min(prev + 1, maxScroll));\n return;\n }\n if (input === 'k' || key.upArrow) {\n setScrollOffset(prev => Math.max(prev - 1, 0));\n return;\n }\n if (input === 'D' || key.pageDown) {\n setScrollOffset(prev => Math.min(prev + Math.floor(contentHeight / 2), maxScroll));\n return;\n }\n if (input === 'U' || key.pageUp) {\n setScrollOffset(prev => Math.max(prev - Math.floor(contentHeight / 2), 0));\n return;\n }\n if (input === 'g') {\n setScrollOffset(0);\n return;\n }\n if (input === 'G') {\n setScrollOffset(maxScroll);\n return;\n }\n }\n\n if (key.escape || input === 'b') {\n onBack();\n return;\n }\n\n if (input === 'q') {\n exit();\n return;\n }\n\n if (input === 'r' && prompt) {\n setScrollOffset(0);\n setViewMode('run');\n return;\n }\n\n if (input === 'c' && prompt) {\n if (variables.length > 0) {\n setViewMode('variables');\n setCurrentVarIndex(0);\n setCurrentInput(variableValues[variables[0].name] || '');\n } else {\n handleCopy(prompt.content);\n }\n }\n\n if (input === 'C' && prompt) {\n handleCopy(prompt.content);\n }\n\n if (input === 'o' && prompt) {\n import('open').then(({ default: open }) => {\n open(`https://prompts.chat/prompts/${prompt.id}_${prompt.slug}`);\n });\n }\n\n if (input === 'u' && prompt) {\n import('open').then(({ default: open }) => {\n open(`https://prompts.chat/@${prompt.author.username}`);\n });\n }\n\n if (input === 'p' && hasMedia) {\n loadImagePreview();\n }\n });\n\n function handleCopy(content: string) {\n onCopy(content);\n setCompiledContent(content);\n setViewMode('copied');\n }\n\n function handleRun(url: string, platform: Platform) {\n import('open').then(({ default: open }) => {\n open(url);\n });\n setViewMode('detail');\n }\n\n function handleCopyAndOpen(content: string, platform: Platform) {\n if (variables.length > 0) {\n setPendingPlatform(platform);\n setRunAction('copy');\n setViewMode('run-variables');\n setCurrentVarIndex(0);\n setCurrentInput(variableValues[variables[0].name] || '');\n } else {\n onCopy(content);\n import('open').then(({ default: open }) => {\n open(platform.baseUrl);\n });\n setViewMode('detail');\n }\n }\n\n function handleRunWithVariables(url: string, platform: Platform) {\n if (variables.length > 0) {\n setPendingPlatform(platform);\n setRunAction('run');\n setViewMode('run-variables');\n setCurrentVarIndex(0);\n setCurrentInput(variableValues[variables[0].name] || '');\n } else {\n handleRun(url, platform);\n }\n }\n\n function handleVariableSubmit(value: string) {\n const varName = variables[currentVarIndex].name;\n const newValues = { ...variableValues, [varName]: value };\n setVariableValues(newValues);\n\n if (currentVarIndex < variables.length - 1) {\n setCurrentVarIndex(currentVarIndex + 1);\n setCurrentInput(newValues[variables[currentVarIndex + 1].name] || '');\n } else {\n const compiled = compile(prompt!.content, newValues, { useDefaults: true });\n \n if (viewMode === 'run-variables' && pendingPlatform) {\n if (runAction === 'copy') {\n onCopy(compiled);\n import('open').then(({ default: open }) => {\n open(pendingPlatform.baseUrl);\n });\n } else {\n import('../platforms.js').then(({ buildUrl }) => {\n const url = buildUrl(pendingPlatform.id, pendingPlatform.baseUrl, compiled, prompt!.title, prompt!.description || undefined);\n import('open').then(({ default: open }) => {\n open(url);\n });\n });\n }\n setPendingPlatform(null);\n setViewMode('detail');\n } else {\n handleCopy(compiled);\n }\n }\n }\n\n const showCopiedMessage = viewMode === 'copied';\n\n // Fullscreen image preview\n if (viewMode === 'preview' && imagePreview) {\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n <Box paddingX={1} marginBottom={1}>\n <Text bold color=\"magenta\">📷 Image Preview</Text>\n <Text dimColor> · {prompt.title}</Text>\n </Box>\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n <Text>{imagePreview}</Text>\n </Box>\n <Box paddingX={1}>\n <Text dimColor>b back</Text>\n </Box>\n </Box>\n );\n }\n\n if (viewMode === 'run') {\n return (\n <RunPrompt\n content={prompt.content}\n title={prompt.title}\n description={prompt.description || undefined}\n promptType={prompt.type}\n mediaUrl={prompt.mediaUrl}\n onRun={handleRunWithVariables}\n onCopyAndOpen={handleCopyAndOpen}\n onBack={() => setViewMode('detail')}\n />\n );\n }\n\n const isFillingVariables = viewMode === 'variables' || viewMode === 'run-variables';\n const isRunMode = viewMode === 'run-variables';\n const currentVar = isFillingVariables ? variables[currentVarIndex] : null;\n\n const tags = prompt.tags.map(t => t.name).join(', ');\n const inlineSectionHeight = isFillingVariables ? 3 : (showCopiedMessage ? 1 : 0);\n const adjustedContentHeight = contentHeight - inlineSectionHeight;\n const visibleLines = contentLines.slice(scrollOffset, scrollOffset + adjustedContentHeight);\n const adjustedMaxScroll = Math.max(0, contentLines.length - adjustedContentHeight);\n const showScrollIndicator = contentLines.length > adjustedContentHeight;\n const scrollPercent = adjustedMaxScroll > 0 ? Math.round((scrollOffset / adjustedMaxScroll) * 100) : 100;\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n {/* Header */}\n <Box flexDirection=\"column\" paddingX={1}>\n <Box marginBottom={0} flexDirection=\"column\">\n <Text bold color=\"cyan\">{prompt.title}</Text>\n <Box>\n <Text dimColor>by </Text>\n <Text color=\"yellow\">@{prompt.author.username}</Text>\n {prompt.author.verified && <Text color=\"blue\"> ✓</Text>}\n <Text dimColor> · </Text>\n <Text color=\"green\">⬆ {prompt.voteCount}</Text>\n {prompt.category && (\n <>\n <Text dimColor> · </Text>\n <Text color=\"magenta\">{prompt.category.name}</Text>\n </>\n )}\n </Box>\n </Box>\n\n {prompt.description && (\n <Box>\n <Text italic dimColor>{prompt.description.slice(0, terminalWidth - 4)}</Text>\n </Box>\n )}\n\n {(tags || variables.length > 0) && (\n <Box>\n {tags && (\n <>\n <Text dimColor>Tags: </Text>\n <Text color=\"blue\">{tags}</Text>\n </>\n )}\n {tags && variables.length > 0 && <Text dimColor> · </Text>}\n {variables.length > 0 && (\n <>\n <Text dimColor>Vars: </Text>\n <Text color=\"yellow\">{variables.map(v => v.name).join(', ')}</Text>\n </>\n )}\n </Box>\n )}\n </Box>\n\n {/* Scrollable Content */}\n <Box \n flexDirection=\"column\" \n borderStyle=\"round\" \n borderColor=\"gray\" \n paddingX={1}\n flexGrow={1}\n marginX={1}\n overflow=\"hidden\"\n >\n {visibleLines.map((line, i) => (\n <Box key={scrollOffset + i}>\n {line ? <HighlightedLine text={line} /> : <Text> </Text>}\n </Box>\n ))}\n </Box>\n\n {/* Inline Section: Variable Input or Copied Message */}\n {isFillingVariables && currentVar && (\n <Box flexDirection=\"column\" paddingX={1} borderStyle=\"round\" borderColor={isRunMode ? 'green' : 'cyan'} marginX={1}>\n <Box>\n <Text bold color={isRunMode ? 'green' : 'cyan'}>\n {isRunMode ? '▶ ' : ''}\n </Text>\n <Text color=\"yellow\">${`{${currentVar.name}}`}</Text>\n <Text dimColor> ({currentVarIndex + 1}/{variables.length})</Text>\n {currentVar.defaultValue && (\n <Text dimColor> default: {currentVar.defaultValue}</Text>\n )}\n </Box>\n <Box>\n <Text color=\"cyan\">→ </Text>\n <TextInput\n value={currentInput}\n onChange={setCurrentInput}\n onSubmit={handleVariableSubmit}\n placeholder={currentVar.defaultValue || 'Enter value...'}\n />\n </Box>\n </Box>\n )}\n {showCopiedMessage && (\n <Box paddingX={1} marginX={1}>\n <Text color=\"green\" bold>✓ Copied to clipboard!</Text>\n <Text dimColor> Press any key to continue</Text>\n </Box>\n )}\n {loadingImage && (\n <Box paddingX={1} marginX={1}>\n <Text color=\"yellow\">Loading image preview...</Text>\n </Box>\n )}\n\n {/* Footer */}\n <Box paddingX={1} justifyContent=\"space-between\">\n {isFillingVariables ? (\n <Text dimColor>\n Enter confirm · Esc cancel\n </Text>\n ) : (\n <Text dimColor>\n r run · c copy · o open · u user{hasMedia ? ' · p preview' : ''} · b back · q quit\n </Text>\n )}\n {showScrollIndicator && !isFillingVariables && (\n <Text dimColor>\n j/k scroll · {scrollPercent}%\n </Text>\n )}\n </Box>\n </Box>\n );\n}\n","/**\n * Variable Detection Utility\n * Detects common variable-like patterns in text that could be converted\n * to our supported format: ${variableName} or ${variableName:default}\n */\n\nexport interface DetectedVariable {\n original: string;\n name: string;\n defaultValue?: string;\n pattern: VariablePattern;\n startIndex: number;\n endIndex: number;\n}\n\nexport type VariablePattern = \n | \"double_bracket\" // [[name]] or [[ name ]]\n | \"double_curly\" // {{name}} or {{ name }}\n | \"single_bracket\" // [NAME] or [name]\n | \"single_curly\" // {NAME} or {name}\n | \"angle_bracket\" // <NAME> or <name>\n | \"percent\" // %NAME% or %name%\n | \"dollar_curly\"; // ${name} (already our format)\n\ninterface PatternConfig {\n pattern: VariablePattern;\n regex: RegExp;\n extractName: (match: RegExpExecArray) => string;\n extractDefault?: (match: RegExpExecArray) => string | undefined;\n}\n\n// Patterns to detect, ordered by specificity (more specific first)\nconst PATTERNS: PatternConfig[] = [\n // Double bracket: [[name]] or [[ name ]] or [[name: default]]\n {\n pattern: \"double_bracket\",\n regex: /\\[\\[\\s*([a-zA-Z_][a-zA-Z0-9_\\s]*?)(?:\\s*:\\s*([^\\]]*?))?\\s*\\]\\]/g,\n extractName: (m) => m[1].trim(),\n extractDefault: (m) => m[2]?.trim(),\n },\n // Double curly: {{name}} or {{ name }} or {{name: default}}\n {\n pattern: \"double_curly\",\n regex: /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_\\s]*?)(?:\\s*:\\s*([^}]*?))?\\s*\\}\\}/g,\n extractName: (m) => m[1].trim(),\n extractDefault: (m) => m[2]?.trim(),\n },\n // Our supported format (to exclude from warnings)\n {\n pattern: \"dollar_curly\",\n regex: /\\$\\{([a-zA-Z_][a-zA-Z0-9_\\s]*?)(?::([^}]*))?\\}/g,\n extractName: (m) => m[1].trim(),\n },\n // Single bracket with uppercase or placeholder-like: [NAME] or [Your Name]\n {\n pattern: \"single_bracket\",\n regex: /\\[([A-Z][A-Z0-9_\\s]*|[A-Za-z][a-zA-Z0-9_]*(?:\\s+[A-Za-z][a-zA-Z0-9_]*)*)\\]/g,\n extractName: (m) => m[1].trim(),\n },\n // Single curly with uppercase: {NAME} or {Your Name}\n {\n pattern: \"single_curly\",\n regex: /\\{([A-Z][A-Z0-9_\\s]*|[A-Za-z][a-zA-Z0-9_]*(?:\\s+[A-Za-z][a-zA-Z0-9_]*)*)\\}/g,\n extractName: (m) => m[1].trim(),\n },\n // Angle brackets: <NAME> or <name>\n {\n pattern: \"angle_bracket\",\n regex: /<([A-Z][A-Z0-9_\\s]*|[a-zA-Z_][a-zA-Z0-9_\\s]*)>/g,\n extractName: (m) => m[1].trim(),\n },\n // Percent signs: %NAME% or %name%\n {\n pattern: \"percent\",\n regex: /%([a-zA-Z_][a-zA-Z0-9_]*)%/g,\n extractName: (m) => m[1].trim(),\n },\n];\n\n// Common false positives to ignore\nconst FALSE_POSITIVES = new Set([\n // HTML/XML common tags\n \"div\", \"span\", \"p\", \"a\", \"br\", \"hr\", \"img\", \"input\", \"button\",\n \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"ul\", \"ol\", \"li\", \"table\",\n \"tr\", \"td\", \"th\", \"thead\", \"tbody\", \"form\", \"label\", \"select\",\n \"option\", \"textarea\", \"script\", \"style\", \"link\", \"meta\", \"head\",\n \"body\", \"html\", \"section\", \"article\", \"nav\", \"header\", \"footer\",\n \"main\", \"aside\", \"figure\", \"figcaption\", \"strong\", \"em\", \"code\",\n \"pre\", \"blockquote\", \"cite\", \"abbr\", \"address\", \"b\", \"i\", \"u\",\n // Common programming constructs\n \"if\", \"else\", \"for\", \"while\", \"switch\", \"case\", \"break\", \"return\",\n \"function\", \"class\", \"const\", \"let\", \"var\", \"import\", \"export\",\n \"default\", \"try\", \"catch\", \"finally\", \"throw\", \"new\", \"this\",\n \"null\", \"undefined\", \"true\", \"false\", \"typeof\", \"instanceof\",\n // JSON structure keywords (when in context)\n \"type\", \"id\", \"key\", \"value\", \"data\", \"items\", \"properties\",\n]);\n\n/**\n * Check if we're inside a JSON string context\n */\nfunction isInsideJsonString(text: string, index: number): boolean {\n let inString = false;\n for (let i = 0; i < index; i++) {\n if (text[i] === '\"' && (i === 0 || text[i - 1] !== '\\\\')) {\n inString = !inString;\n }\n }\n return inString;\n}\n\n/**\n * Detect variable-like patterns in text\n * Returns detected variables that are NOT in our supported format\n */\nexport function detectVariables(text: string): DetectedVariable[] {\n const detected: DetectedVariable[] = [];\n const seenRanges: Array<[number, number]> = [];\n \n // Track our supported format positions to exclude them\n const supportedVars = new Set<string>();\n const dollarCurlyPattern = /\\$\\{([a-zA-Z_][a-zA-Z0-9_\\s]*?)(?::([^}]*))?\\}/g;\n let match: RegExpExecArray | null;\n \n while ((match = dollarCurlyPattern.exec(text)) !== null) {\n seenRanges.push([match.index, match.index + match[0].length]);\n supportedVars.add(match[0]);\n }\n \n // Check each pattern\n for (const config of PATTERNS) {\n // Skip our supported format pattern for detection\n if (config.pattern === \"dollar_curly\") continue;\n \n const regex = new RegExp(config.regex.source, config.regex.flags);\n \n while ((match = regex.exec(text)) !== null) {\n const startIndex = match.index;\n const endIndex = startIndex + match[0].length;\n \n // Check if this range overlaps with any already detected range\n const overlaps = seenRanges.some(\n ([start, end]) => \n (startIndex >= start && startIndex < end) ||\n (endIndex > start && endIndex <= end)\n );\n \n if (overlaps) continue;\n \n const name = config.extractName(match);\n \n // Skip false positives\n if (FALSE_POSITIVES.has(name.toLowerCase())) continue;\n \n // Skip very short names (likely not variables)\n if (name.length < 2) continue;\n \n // For angle brackets, be more strict\n if (config.pattern === \"angle_bracket\") {\n if (!/^[A-Z]/.test(name) && !name.includes(\" \")) continue;\n }\n \n // For single curly/bracket in JSON context, be more careful\n if (\n (config.pattern === \"single_curly\" || config.pattern === \"single_bracket\") &&\n isInsideJsonString(text, startIndex)\n ) {\n if (!/^[A-Z]/.test(name) && !name.includes(\" \")) continue;\n }\n \n const defaultValue = config.extractDefault?.(match);\n \n detected.push({\n original: match[0],\n name,\n defaultValue,\n pattern: config.pattern,\n startIndex,\n endIndex,\n });\n \n seenRanges.push([startIndex, endIndex]);\n }\n }\n \n // Sort by position and remove duplicates\n return detected\n .sort((a, b) => a.startIndex - b.startIndex)\n .filter((v, i, arr) => \n i === 0 || v.original !== arr[i - 1].original || v.startIndex !== arr[i - 1].startIndex\n );\n}\n\n/**\n * Convert a detected variable to our supported format\n */\nexport function convertToSupportedFormat(variable: DetectedVariable): string {\n // Normalize name: lowercase, replace spaces with underscores\n const normalizedName = variable.name\n .toLowerCase()\n .replace(/\\s+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n \n if (variable.defaultValue) {\n return `\\${${normalizedName}:${variable.defaultValue}}`;\n }\n \n return `\\${${normalizedName}}`;\n}\n\n/**\n * Convert all detected variables in text to our supported format\n */\nexport function convertAllVariables(text: string): string {\n const detected = detectVariables(text);\n \n if (detected.length === 0) return text;\n \n // Sort by position descending to replace from end to start\n const sorted = [...detected].sort((a, b) => b.startIndex - a.startIndex);\n \n let result = text;\n for (const variable of sorted) {\n const converted = convertToSupportedFormat(variable);\n result = result.slice(0, variable.startIndex) + converted + result.slice(variable.endIndex);\n }\n \n return result;\n}\n\n/**\n * Alias for convertAllVariables - normalizes all variable formats to ${var}\n */\nexport const normalize = convertAllVariables;\n\n/**\n * Alias for detectVariables\n */\nexport const detect = detectVariables;\n\n/**\n * Get a human-readable pattern description\n */\nexport function getPatternDescription(pattern: VariablePattern): string {\n switch (pattern) {\n case \"double_bracket\": return \"[[...]]\";\n case \"double_curly\": return \"{{...}}\";\n case \"single_bracket\": return \"[...]\";\n case \"single_curly\": return \"{...}\";\n case \"angle_bracket\": return \"<...>\";\n case \"percent\": return \"%...%\";\n case \"dollar_curly\": return \"${...}\";\n }\n}\n\n/**\n * Extract variables from our supported ${var} or ${var:default} format\n */\nexport function extractVariables(text: string): Array<{ name: string; defaultValue?: string }> {\n const regex = /\\$\\{([a-zA-Z_][a-zA-Z0-9_\\s]*?)(?::([^}]*))?\\}/g;\n const variables: Array<{ name: string; defaultValue?: string }> = [];\n let match: RegExpExecArray | null;\n \n while ((match = regex.exec(text)) !== null) {\n variables.push({\n name: match[1].trim(),\n defaultValue: match[2]?.trim(),\n });\n }\n \n return variables;\n}\n\n/**\n * Compile a prompt template with variable values\n */\nexport function compile(\n template: string, \n values: Record<string, string>,\n options: { useDefaults?: boolean } = {}\n): string {\n const { useDefaults = true } = options;\n \n return template.replace(\n /\\$\\{([a-zA-Z_][a-zA-Z0-9_\\s]*?)(?::([^}]*))?\\}/g,\n (match, name, defaultValue) => {\n const trimmedName = name.trim();\n if (trimmedName in values) {\n return values[trimmedName];\n }\n if (useDefaults && defaultValue !== undefined) {\n return defaultValue.trim();\n }\n return match; // Keep original if no value and no default\n }\n );\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport { chatPlatforms, codePlatforms, imagePlatforms, videoPlatforms, buildUrl, type Platform } from '../platforms.js';\n\ninterface RunPromptProps {\n content: string;\n title?: string;\n description?: string;\n promptType?: 'TEXT' | 'IMAGE' | 'VIDEO' | 'AUDIO' | 'SKILL';\n mediaUrl?: string | null;\n onRun: (url: string, platform: Platform) => void;\n onCopyAndOpen: (content: string, platform: Platform) => void;\n onBack: () => void;\n}\n\ntype Tab = 'chat' | 'code';\n\nexport function RunPrompt({ content, title, description, promptType, mediaUrl, onRun, onCopyAndOpen, onBack }: RunPromptProps) {\n const { stdout } = useStdout();\n const [tab, setTab] = useState<Tab>('chat');\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const terminalHeight = stdout?.rows || 24;\n const terminalWidth = stdout?.columns || 80;\n // Get platforms based on tab, include media platforms for image/video prompts\n const basePlatforms = tab === 'chat' ? chatPlatforms : codePlatforms;\n const mediaPlatforms = promptType === 'IMAGE' ? imagePlatforms : promptType === 'VIDEO' ? videoPlatforms : [];\n \n // Sort: sponsors first, then alphabetically\n const platforms = [...mediaPlatforms, ...basePlatforms].sort((a, b) => {\n if (a.sponsor && !b.sponsor) return -1;\n if (!a.sponsor && b.sponsor) return 1;\n return a.name.localeCompare(b.name);\n });\n const previewLength = terminalWidth - 6;\n const contentPreview = content.replace(/\\n/g, ' ').slice(0, previewLength);\n const isMediaType = promptType === 'IMAGE' || promptType === 'VIDEO' || promptType === 'AUDIO';\n\n useInput((input: string, key: { escape?: boolean; return?: boolean; leftArrow?: boolean; rightArrow?: boolean; upArrow?: boolean; downArrow?: boolean }) => {\n if (key.escape || input === 'b') {\n onBack();\n return;\n }\n\n if (key.leftArrow || key.rightArrow || input === 'h' || input === 'l') {\n setTab(tab === 'chat' ? 'code' : 'chat');\n setSelectedIndex(0);\n return;\n }\n\n if (key.upArrow || input === 'k') {\n setSelectedIndex((i) => Math.max(0, i - 1));\n }\n\n if (key.downArrow || input === 'j') {\n setSelectedIndex((i) => Math.min(platforms.length - 1, i + 1));\n }\n\n if (key.return) {\n const platform = platforms[selectedIndex];\n if (platform.supportsQuerystring === false) {\n onCopyAndOpen(content, platform);\n } else {\n const url = buildUrl(platform.id, platform.baseUrl, content, title, description);\n onRun(url, platform);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n {/* Header with Prompt Info */}\n <Box flexDirection=\"column\" paddingX={1} marginBottom={1}>\n <Box>\n <Text bold color=\"green\">▶ Run: </Text>\n <Text bold color=\"cyan\">{title || 'Untitled'}</Text>\n {isMediaType && (\n <Text color=\"magenta\"> [{promptType}]</Text>\n )}\n </Box>\n <Box>\n <Text dimColor>{contentPreview}{content.length > previewLength ? '…' : ''}</Text>\n </Box>\n </Box>\n\n {/* Tabs */}\n <Box paddingX={1} marginBottom={1}>\n <Text \n color={tab === 'chat' ? 'cyan' : 'gray'} \n bold={tab === 'chat'}\n underline={tab === 'chat'}\n >\n Chat\n </Text>\n <Text dimColor> </Text>\n <Text \n color={tab === 'code' ? 'cyan' : 'gray'} \n bold={tab === 'code'}\n underline={tab === 'code'}\n >\n Code\n </Text>\n <Text dimColor> h/l to switch</Text>\n </Box>\n\n {/* Platform List */}\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n {platforms.map((platform, index) => (\n <Box key={platform.id}>\n <Text color={index === selectedIndex ? 'cyan' : undefined}>\n {index === selectedIndex ? '❯ ' : ' '}\n </Text>\n {platform.sponsor ? (\n <Text color=\"magenta\">♥ </Text>\n ) : platform.supportsQuerystring === false ? (\n <Text color=\"yellow\">◐ </Text>\n ) : (\n <Text color=\"green\">⚡ </Text>\n )}\n <Text\n color={index === selectedIndex ? 'cyan' : undefined}\n bold={index === selectedIndex}\n >\n {platform.name}\n </Text>\n {platform.supportsQuerystring === false && (\n <Text dimColor> (copy & open)</Text>\n )}\n </Box>\n ))}\n </Box>\n\n {/* Footer */}\n <Box paddingX={1} justifyContent=\"space-between\">\n <Text dimColor>\n j/k select · Enter run · h/l tab · b back\n </Text>\n <Text dimColor>\n ♥ sponsor · ⚡ direct · ◐ copy+open\n </Text>\n </Box>\n </Box>\n );\n}\n","import { spawn, execSync } from 'child_process';\nimport { existsSync, rmSync, readdirSync } from 'fs';\nimport { join, resolve } from 'path';\n\nconst REPO = 'f/awesome-chatgpt-prompts';\n\ninterface NewOptions {\n directory: string;\n}\n\nfunction removeFiles(baseDir: string): void {\n const toRemove = [\n '.github',\n '.claude',\n 'packages',\n ];\n\n // Remove directories\n for (const item of toRemove) {\n const itemPath = join(baseDir, item);\n if (existsSync(itemPath)) {\n console.log(` Removing ${item}/`);\n rmSync(itemPath, { recursive: true, force: true });\n }\n }\n\n // Remove scripts/generate* and scripts/rebuild* files\n const scriptsDir = join(baseDir, 'scripts');\n if (existsSync(scriptsDir)) {\n const files = readdirSync(scriptsDir);\n for (const file of files) {\n if (file.startsWith('generate') || file.startsWith('rebuild')) {\n const filePath = join(scriptsDir, file);\n console.log(` Removing scripts/${file}`);\n rmSync(filePath, { force: true });\n }\n }\n }\n}\n\nfunction runSetup(baseDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const setupScript = join(baseDir, 'scripts', 'setup.js');\n \n if (!existsSync(setupScript)) {\n console.log('\\n⚠ Setup script not found, skipping interactive setup.');\n resolve();\n return;\n }\n\n console.log('\\n🚀 Starting interactive setup...\\n');\n \n const child = spawn('node', [setupScript], {\n cwd: baseDir,\n stdio: 'inherit',\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Setup exited with code ${code}`));\n }\n });\n\n child.on('error', (err) => {\n reject(err);\n });\n });\n}\n\nexport async function createNew(options: NewOptions): Promise<void> {\n const targetDir = resolve(process.cwd(), options.directory);\n\n if (existsSync(targetDir)) {\n const files = readdirSync(targetDir);\n if (files.length > 0) {\n console.error(`\\n❌ Directory \"${options.directory}\" already exists and is not empty.`);\n process.exit(1);\n }\n }\n\n console.log('\\n📦 Creating new prompts.chat instance...\\n');\n\n // Use degit to clone the repo\n try {\n console.log(` Cloning ${REPO}...`);\n execSync(`npx degit ${REPO} \"${targetDir}\"`, { stdio: 'inherit' });\n } catch (error) {\n console.error('\\n❌ Failed to clone repository. Make sure you have internet connection.');\n process.exit(1);\n }\n\n // Remove unnecessary files\n console.log('\\n🧹 Cleaning up files...\\n');\n removeFiles(targetDir);\n\n // Install dependencies\n console.log('\\n📥 Installing dependencies...\\n');\n try {\n execSync('npm install', { cwd: targetDir, stdio: 'inherit' });\n } catch (error) {\n console.error('\\n⚠ Failed to install dependencies. You can run \"npm install\" manually.');\n }\n\n // Run the setup script\n try {\n await runSetup(targetDir);\n } catch (error) {\n console.error('\\n⚠ Setup failed:', (error as Error).message);\n }\n\n console.log('\\n✅ Done! Your prompts.chat instance is ready.\\n');\n console.log(` cd ${options.directory}`);\n console.log(' npm run dev\\n');\n}\n"],"mappings":"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","names":["useState","spawn","useState","useEffect","Box","Text","useInput","useApp","useStdout","TextInput","useState","Box","Text","useInput","useStdout","jsx","jsxs","Fragment","jsx","jsxs","Text","useApp","useStdout","useState","useEffect","useInput","buildUrl","Box","TextInput","existsSync","join","resolve","jsx","useState","spawn"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prompts.chat",
3
- "version": "0.0.9",
3
+ "version": "0.1.1",
4
4
  "description": "Developer toolkit for AI prompts - build, validate, parse, and connect to prompts.chat",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",