prompts.chat 0.0.6 → 0.0.8

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.
Files changed (41) hide show
  1. package/bin/cli.js +2 -0
  2. package/dist/builder/{index.mjs → index.cjs} +255 -3
  3. package/dist/builder/index.cjs.map +1 -0
  4. package/dist/builder/{index.d.mts → index.d.cts} +83 -0
  5. package/dist/builder/index.d.ts +83 -0
  6. package/dist/builder/index.js +215 -41
  7. package/dist/builder/index.js.map +1 -1
  8. package/dist/cli/index.js +1132 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/{index.mjs → index.cjs} +285 -13
  11. package/dist/index.cjs.map +1 -0
  12. package/dist/{index.d.mts → index.d.cts} +5 -5
  13. package/dist/index.js +225 -71
  14. package/dist/index.js.map +1 -1
  15. package/dist/parser/{index.mjs → index.cjs} +32 -3
  16. package/dist/parser/{index.mjs.map → index.cjs.map} +1 -1
  17. package/dist/parser/{index.d.mts → index.d.cts} +1 -1
  18. package/dist/parser/index.js +2 -31
  19. package/dist/parser/index.js.map +1 -1
  20. package/dist/quality/{index.mjs → index.cjs} +31 -3
  21. package/dist/quality/{index.mjs.map → index.cjs.map} +1 -1
  22. package/dist/quality/{index.d.mts → index.d.cts} +1 -1
  23. package/dist/quality/index.js +2 -30
  24. package/dist/quality/index.js.map +1 -1
  25. package/dist/similarity/{index.mjs → index.cjs} +35 -3
  26. package/dist/similarity/{index.mjs.map → index.cjs.map} +1 -1
  27. package/dist/similarity/{index.d.mts → index.d.cts} +1 -1
  28. package/dist/similarity/index.js +2 -34
  29. package/dist/similarity/index.js.map +1 -1
  30. package/dist/variables/{index.mjs → index.cjs} +35 -3
  31. package/dist/variables/{index.mjs.map → index.cjs.map} +1 -1
  32. package/dist/variables/{index.d.mts → index.d.cts} +1 -1
  33. package/dist/variables/index.js +2 -34
  34. package/dist/variables/index.js.map +1 -1
  35. package/package.json +18 -1
  36. package/dist/builder/index.mjs.map +0 -1
  37. package/dist/index.mjs.map +0 -1
  38. /package/dist/{index-BEIO8LCd.d.mts → index-BEIO8LCd.d.cts} +0 -0
  39. /package/dist/{index-CSHEKYfQ.d.mts → index-CSHEKYfQ.d.cts} +0 -0
  40. /package/dist/{index-D41E6D9X.d.mts → index-D41E6D9X.d.cts} +0 -0
  41. /package/dist/{index-DOz8zcA0.d.mts → index-DOz8zcA0.d.cts} +0 -0
@@ -0,0 +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}\n\nexport const codePlatforms: Platform[] = [\n { id: \"windsurf\", name: \"Windsurf\", baseUrl: \"windsurf://\", isDeeplink: true, supportsQuerystring: false },\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 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, 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 const platforms = tab === 'chat' ? chatPlatforms : codePlatforms;\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.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 ⚡ 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,8 +1,66 @@
1
+ "use strict";
1
2
  var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
2
6
  var __export = (target, all) => {
3
7
  for (var name in all)
4
8
  __defProp(target, name, { get: all[name], enumerable: true });
5
9
  };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ AudioPromptBuilder: () => AudioPromptBuilder,
24
+ ChatPromptBuilder: () => ChatPromptBuilder,
25
+ ImagePromptBuilder: () => ImagePromptBuilder,
26
+ PromptBuilder: () => PromptBuilder,
27
+ VideoPromptBuilder: () => VideoPromptBuilder,
28
+ audio: () => audio,
29
+ builder: () => builder,
30
+ calculateSimilarity: () => calculateSimilarity,
31
+ chat: () => chat,
32
+ chatPresets: () => chatPresets,
33
+ checkQuality: () => check,
34
+ compile: () => compile,
35
+ convertAllVariables: () => convertAllVariables,
36
+ convertToSupportedFormat: () => convertToSupportedFormat,
37
+ deduplicate: () => deduplicate,
38
+ detectVariables: () => detectVariables,
39
+ detectVars: () => detect,
40
+ extractVariables: () => extractVariables,
41
+ findDuplicates: () => findDuplicates,
42
+ fromPrompt: () => fromPrompt,
43
+ getContentFingerprint: () => getContentFingerprint,
44
+ getSuggestions: () => getSuggestions,
45
+ getSystemPrompt: () => getSystemPrompt,
46
+ image: () => image,
47
+ interpolate: () => interpolate,
48
+ isSimilarContent: () => isSimilarContent,
49
+ isValidPrompt: () => isValid,
50
+ normalizeContent: () => normalizeContent,
51
+ normalizeVariables: () => normalize,
52
+ parsePrompt: () => parse,
53
+ parser: () => parser_exports,
54
+ quality: () => quality_exports,
55
+ similarity: () => similarity_exports,
56
+ templates: () => templates,
57
+ toJson: () => toJson,
58
+ toYaml: () => toYaml,
59
+ validatePrompt: () => validate,
60
+ variables: () => variables_exports,
61
+ video: () => video
62
+ });
63
+ module.exports = __toCommonJS(src_exports);
6
64
 
7
65
  // src/variables/index.ts
8
66
  var variables_exports = {};
@@ -3230,9 +3288,223 @@ var templates = {
3230
3288
  "If you don't know the answer, say so",
3231
3289
  "Cite relevant parts of the context if applicable"
3232
3290
  ]);
3291
+ },
3292
+ /**
3293
+ * Create a debugging prompt
3294
+ */
3295
+ debug: (options = {}) => {
3296
+ const b = builder().role("expert software debugger").task("Analyze the code and error, identify the root cause, and provide a fix.").variable("code", { required: true, description: "The code with the bug" }).variable("error", { required: false, description: "Error message or unexpected behavior" });
3297
+ if (options.language) {
3298
+ b.context(`Debugging ${options.language} code.`);
3299
+ }
3300
+ if (options.errorType) {
3301
+ b.context(`The error appears to be related to: ${options.errorType}`);
3302
+ }
3303
+ return b.constraints([
3304
+ "Identify the root cause, not just symptoms",
3305
+ "Explain why the bug occurs",
3306
+ "Provide a working fix with explanation"
3307
+ ]).output("1. Root cause analysis\n2. Explanation\n3. Fixed code\n4. Prevention tips");
3308
+ },
3309
+ /**
3310
+ * Create a writing assistant prompt
3311
+ */
3312
+ write: (options = {}) => {
3313
+ const typeDescriptions = {
3314
+ blog: "engaging blog post",
3315
+ email: "professional email",
3316
+ essay: "well-structured essay",
3317
+ story: "creative story",
3318
+ documentation: "clear technical documentation"
3319
+ };
3320
+ const b = builder().role("skilled writer").task(`Write a ${typeDescriptions[options.type || "blog"] || "piece of content"} based on the given topic or outline.`).variable("topic", { required: true, description: "Topic or outline to write about" });
3321
+ if (options.tone) {
3322
+ b.constraint(`Use a ${options.tone} tone throughout`);
3323
+ }
3324
+ return b.constraints([
3325
+ "Use clear and engaging language",
3326
+ "Structure content logically",
3327
+ "Maintain consistent voice and style"
3328
+ ]);
3329
+ },
3330
+ /**
3331
+ * Create an explanation/teaching prompt
3332
+ */
3333
+ explain: (options = {}) => {
3334
+ const levelDescriptions = {
3335
+ beginner: "someone new to the topic with no prior knowledge",
3336
+ intermediate: "someone with basic understanding who wants to go deeper",
3337
+ expert: "an expert who wants technical precision and nuance"
3338
+ };
3339
+ const b = builder().role("expert teacher and communicator").task("Explain the concept clearly and thoroughly.").variable("concept", { required: true, description: "The concept to explain" });
3340
+ if (options.level) {
3341
+ b.context(`Target audience: ${levelDescriptions[options.level]}`);
3342
+ }
3343
+ if (options.useAnalogies) {
3344
+ b.constraint("Use relatable analogies and real-world examples");
3345
+ }
3346
+ return b.constraints([
3347
+ "Break down complex ideas into digestible parts",
3348
+ "Build understanding progressively",
3349
+ "Anticipate and address common misconceptions"
3350
+ ]);
3351
+ },
3352
+ /**
3353
+ * Create a data extraction prompt
3354
+ */
3355
+ extract: (options = {}) => {
3356
+ const b = builder().role("data extraction specialist").task("Extract structured data from the provided text.").variable("text", { required: true, description: "Text to extract data from" });
3357
+ if (options.fields && options.fields.length > 0) {
3358
+ b.context(`Fields to extract: ${options.fields.join(", ")}`);
3359
+ }
3360
+ if (options.format) {
3361
+ b.output(`Return extracted data in ${options.format.toUpperCase()} format`);
3362
+ }
3363
+ return b.constraints([
3364
+ "Extract only factual information present in the text",
3365
+ "Use null or empty values for missing fields",
3366
+ "Maintain consistent formatting"
3367
+ ]);
3368
+ },
3369
+ /**
3370
+ * Create a brainstorming prompt
3371
+ */
3372
+ brainstorm: (options = {}) => {
3373
+ const b = builder().role("creative strategist and ideation expert").task("Generate diverse and innovative ideas based on the given topic or challenge.").variable("topic", { required: true, description: "Topic or challenge to brainstorm about" });
3374
+ if (options.count) {
3375
+ b.constraint(`Generate exactly ${options.count} ideas`);
3376
+ }
3377
+ if (options.creative) {
3378
+ b.constraint("Include unconventional and out-of-the-box ideas");
3379
+ }
3380
+ return b.constraints([
3381
+ "Ensure ideas are distinct and varied",
3382
+ "Consider different perspectives and approaches",
3383
+ "Make ideas actionable when possible"
3384
+ ]).output("List each idea with a brief description and potential benefits");
3385
+ },
3386
+ /**
3387
+ * Create a code refactoring prompt
3388
+ */
3389
+ refactor: (options = {}) => {
3390
+ const goalDescriptions = {
3391
+ readability: "improving code readability and clarity",
3392
+ performance: "optimizing performance and efficiency",
3393
+ maintainability: "enhancing maintainability and extensibility",
3394
+ all: "overall code quality improvement"
3395
+ };
3396
+ const b = builder().role("senior software engineer specializing in code quality").task(`Refactor the code with focus on ${goalDescriptions[options.goal || "all"]}.`).variable("code", { required: true, description: "Code to refactor" });
3397
+ if (options.language) {
3398
+ b.context(`The code is written in ${options.language}.`);
3399
+ }
3400
+ return b.constraints([
3401
+ "Preserve existing functionality",
3402
+ "Follow language best practices and idioms",
3403
+ "Explain each significant change"
3404
+ ]).output("1. Refactored code\n2. List of changes made\n3. Explanation of improvements");
3405
+ },
3406
+ /**
3407
+ * Create an API documentation prompt
3408
+ */
3409
+ apiDocs: (options = {}) => {
3410
+ const b = builder().role("technical documentation writer").task("Generate comprehensive API documentation for the provided code or endpoint.").variable("code", { required: true, description: "API code or endpoint definition" });
3411
+ if (options.style) {
3412
+ b.output(`Format documentation in ${options.style.toUpperCase()} style`);
3413
+ }
3414
+ if (options.includeExamples) {
3415
+ b.constraint("Include request/response examples for each endpoint");
3416
+ }
3417
+ return b.constraints([
3418
+ "Document all parameters with types and descriptions",
3419
+ "Include error responses and status codes",
3420
+ "Be precise and developer-friendly"
3421
+ ]);
3422
+ },
3423
+ /**
3424
+ * Create a unit test generation prompt
3425
+ */
3426
+ unitTest: (options = {}) => {
3427
+ const b = builder().role("test automation engineer").task("Generate unit tests for the provided code.").variable("code", { required: true, description: "Code to generate tests for" });
3428
+ if (options.framework) {
3429
+ b.context(`Use ${options.framework} testing framework.`);
3430
+ }
3431
+ const coverageConstraints = options.coverage === "comprehensive" ? ["Cover all code paths including edge cases", "Test error handling scenarios", "Include boundary value tests"] : ["Cover main functionality", "Include basic edge cases"];
3432
+ return b.constraints([
3433
+ ...coverageConstraints,
3434
+ "Write clear, descriptive test names",
3435
+ "Follow AAA pattern (Arrange, Act, Assert)"
3436
+ ]).output("Complete, runnable test file");
3437
+ },
3438
+ /**
3439
+ * Create a commit message prompt
3440
+ */
3441
+ commitMessage: (options = {}) => {
3442
+ const b = builder().role("developer with excellent communication skills").task("Generate a clear and descriptive commit message for the provided code changes.").variable("diff", { required: true, description: "Git diff or description of changes" });
3443
+ if (options.style === "conventional") {
3444
+ b.constraints([
3445
+ "Follow Conventional Commits format (type(scope): description)",
3446
+ "Use appropriate type: feat, fix, docs, style, refactor, test, chore"
3447
+ ]);
3448
+ }
3449
+ if (options.includeBody) {
3450
+ b.constraint("Include a detailed body explaining the why behind changes");
3451
+ }
3452
+ return b.constraints([
3453
+ "Keep subject line under 72 characters",
3454
+ "Use imperative mood (Add, Fix, Update, not Added, Fixed, Updated)"
3455
+ ]);
3456
+ },
3457
+ /**
3458
+ * Create a code review comment prompt
3459
+ */
3460
+ reviewComment: (options = {}) => {
3461
+ const b = builder().role("thoughtful code reviewer").task("Write a helpful code review comment for the provided code snippet.").variable("code", { required: true, description: "Code to comment on" }).variable("issue", { required: true, description: "The issue or improvement to address" });
3462
+ if (options.tone === "constructive") {
3463
+ b.constraint("Frame feedback positively and suggest improvements rather than just pointing out problems");
3464
+ }
3465
+ if (options.severity) {
3466
+ b.constraint("Indicate severity level: nitpick, suggestion, important, or blocker");
3467
+ }
3468
+ return b.constraints([
3469
+ "Be specific and actionable",
3470
+ "Explain the reasoning behind the suggestion",
3471
+ "Provide an example of the improved code when helpful"
3472
+ ]);
3473
+ },
3474
+ /**
3475
+ * Create a regex generator prompt
3476
+ */
3477
+ regex: (options = {}) => {
3478
+ const b = builder().role("regex expert").task("Create a regular expression that matches the described pattern.").variable("pattern", { required: true, description: "Description of the pattern to match" }).variable("examples", { required: false, description: "Example strings that should match" });
3479
+ if (options.flavor) {
3480
+ b.context(`Use ${options.flavor} regex flavor/syntax.`);
3481
+ }
3482
+ return b.constraints([
3483
+ "Provide the regex pattern",
3484
+ "Explain each part of the pattern",
3485
+ "Include test cases showing matches and non-matches"
3486
+ ]).output("1. Regex pattern\n2. Explanation\n3. Test cases");
3487
+ },
3488
+ /**
3489
+ * Create a SQL query prompt
3490
+ */
3491
+ sql: (options = {}) => {
3492
+ const b = builder().role("database expert").task("Write an SQL query based on the requirements.").variable("requirement", { required: true, description: "What the query should accomplish" }).variable("schema", { required: false, description: "Database schema or table definitions" });
3493
+ if (options.dialect) {
3494
+ b.context(`Use ${options.dialect.toUpperCase()} syntax.`);
3495
+ }
3496
+ if (options.optimize) {
3497
+ b.constraint("Optimize for performance and include index recommendations if applicable");
3498
+ }
3499
+ return b.constraints([
3500
+ "Write clean, readable SQL",
3501
+ "Use appropriate JOINs and avoid N+1 patterns",
3502
+ "Include comments explaining complex logic"
3503
+ ]);
3233
3504
  }
3234
3505
  };
3235
- export {
3506
+ // Annotate the CommonJS export names for ESM import in node:
3507
+ 0 && (module.exports = {
3236
3508
  AudioPromptBuilder,
3237
3509
  ChatPromptBuilder,
3238
3510
  ImagePromptBuilder,
@@ -3243,13 +3515,13 @@ export {
3243
3515
  calculateSimilarity,
3244
3516
  chat,
3245
3517
  chatPresets,
3246
- check as checkQuality,
3518
+ checkQuality,
3247
3519
  compile,
3248
3520
  convertAllVariables,
3249
3521
  convertToSupportedFormat,
3250
3522
  deduplicate,
3251
3523
  detectVariables,
3252
- detect as detectVars,
3524
+ detectVars,
3253
3525
  extractVariables,
3254
3526
  findDuplicates,
3255
3527
  fromPrompt,
@@ -3259,18 +3531,18 @@ export {
3259
3531
  image,
3260
3532
  interpolate,
3261
3533
  isSimilarContent,
3262
- isValid as isValidPrompt,
3534
+ isValidPrompt,
3263
3535
  normalizeContent,
3264
- normalize as normalizeVariables,
3265
- parse as parsePrompt,
3266
- parser_exports as parser,
3267
- quality_exports as quality,
3268
- similarity_exports as similarity,
3536
+ normalizeVariables,
3537
+ parsePrompt,
3538
+ parser,
3539
+ quality,
3540
+ similarity,
3269
3541
  templates,
3270
3542
  toJson,
3271
3543
  toYaml,
3272
- validate as validatePrompt,
3273
- variables_exports as variables,
3544
+ validatePrompt,
3545
+ variables,
3274
3546
  video
3275
- };
3276
- //# sourceMappingURL=index.mjs.map
3547
+ });
3548
+ //# sourceMappingURL=index.cjs.map