opendevbrowser 0.0.10
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 +241 -0
- package/dist/chunk-R5VUZEUU.js +128 -0
- package/dist/chunk-R5VUZEUU.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +802 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +3615 -0
- package/dist/index.js.map +1 -0
- package/dist/opendevbrowser.d.ts +5 -0
- package/dist/opendevbrowser.js +3615 -0
- package/dist/opendevbrowser.js.map +1 -0
- package/extension/dist/background.js +32 -0
- package/extension/dist/popup.js +150 -0
- package/extension/dist/popup.jsx +150 -0
- package/extension/dist/relay-settings.js +4 -0
- package/extension/dist/services/CDPRouter.js +176 -0
- package/extension/dist/services/ConnectionManager.js +301 -0
- package/extension/dist/services/RelayClient.js +73 -0
- package/extension/dist/services/TabManager.js +18 -0
- package/extension/dist/types.js +1 -0
- package/extension/icons/icon128.png +0 -0
- package/extension/icons/icon16.png +0 -0
- package/extension/icons/icon32.png +0 -0
- package/extension/icons/icon48.png +0 -0
- package/extension/manifest.json +34 -0
- package/extension/popup.html +108 -0
- package/package.json +71 -0
- package/skills/AGENTS.md +80 -0
- package/skills/data-extraction/SKILL.md +136 -0
- package/skills/form-testing/SKILL.md +113 -0
- package/skills/login-automation/SKILL.md +98 -0
- package/skills/opendevbrowser-best-practices/SKILL.md +81 -0
- package/skills/opendevbrowser-continuity-ledger/SKILL.md +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/args.ts","../../src/cli/installers/global.ts","../../src/cli/utils/config.ts","../../src/utils/fs.ts","../../src/cli/templates/config.ts","../../src/cli/installers/local.ts","../../src/cli/installers/skills.ts","../../src/cli/utils/skills.ts","../../src/cli/commands/update.ts","../../src/cli/commands/uninstall.ts","../../src/cli/index.ts"],"sourcesContent":["export type CliCommand = \"install\" | \"update\" | \"uninstall\" | \"help\" | \"version\";\nexport type InstallMode = \"global\" | \"local\";\nexport type SkillsMode = \"global\" | \"local\" | \"none\";\n\nexport interface ParsedArgs {\n command: CliCommand;\n mode?: InstallMode;\n withConfig: boolean;\n noPrompt: boolean;\n skillsMode: SkillsMode;\n fullInstall: boolean;\n}\n\nconst SHORT_FLAGS: Record<string, string> = {\n \"-g\": \"--global\",\n \"-l\": \"--local\",\n \"-u\": \"--update\",\n \"-h\": \"--help\",\n \"-v\": \"--version\",\n \"-f\": \"--full\"\n};\n\nfunction expandShortFlags(args: string[]): string[] {\n return args.map((arg) => SHORT_FLAGS[arg] ?? arg);\n}\n\nfunction parseSkillsMode(args: string[]): SkillsMode {\n if (args.includes(\"--no-skills\")) {\n return \"none\";\n }\n if (args.includes(\"--skills-local\")) {\n return \"local\";\n }\n if (args.includes(\"--skills-global\")) {\n return \"global\";\n }\n return \"global\";\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const args = expandShortFlags(argv.slice(2));\n const skillsMode = parseSkillsMode(args);\n const fullInstall = args.includes(\"--full\");\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n return { command: \"help\", withConfig: false, noPrompt: false, skillsMode, fullInstall };\n }\n\n if (args.includes(\"--version\") || args.includes(\"-v\")) {\n return { command: \"version\", withConfig: false, noPrompt: false, skillsMode, fullInstall };\n }\n\n if (args.includes(\"--update\")) {\n const mode = args.includes(\"--global\") ? \"global\" : args.includes(\"--local\") ? \"local\" : undefined;\n return { command: \"update\", mode, withConfig: false, noPrompt: false, skillsMode, fullInstall };\n }\n\n if (args.includes(\"--uninstall\")) {\n const mode = args.includes(\"--global\") ? \"global\" : args.includes(\"--local\") ? \"local\" : undefined;\n const noPrompt = args.includes(\"--no-prompt\");\n return { command: \"uninstall\", mode, withConfig: false, noPrompt, skillsMode, fullInstall };\n }\n\n const withConfig = args.includes(\"--with-config\") || fullInstall;\n const noPrompt = args.includes(\"--no-prompt\");\n\n let mode: InstallMode | undefined;\n if (args.includes(\"--global\")) {\n mode = \"global\";\n } else if (args.includes(\"--local\")) {\n mode = \"local\";\n } else if (noPrompt) {\n mode = \"global\";\n }\n\n const validFlags = new Set([\n \"--global\", \"--local\", \"--update\", \"--uninstall\",\n \"--help\", \"--version\", \"--with-config\", \"--no-prompt\",\n \"--full\",\n \"--skills-global\", \"--skills-local\", \"--no-skills\"\n ]);\n \n for (const arg of args) {\n if (arg.startsWith(\"--\") && !validFlags.has(arg)) {\n throw new Error(`Unknown flag: ${arg}`);\n }\n if (arg.startsWith(\"-\") && !arg.startsWith(\"--\") && !SHORT_FLAGS[arg]) {\n throw new Error(`Unknown flag: ${arg}`);\n }\n }\n\n return { command: \"install\", mode, withConfig, noPrompt, skillsMode, fullInstall };\n}\n\nexport function getHelpText(): string {\n return `\nOpenDevBrowser CLI - Install and manage the OpenDevBrowser plugin\n\nUSAGE:\n npx opendevbrowser [options]\n\nCOMMANDS:\n (default) Install the plugin (interactive if no mode specified)\n --update, -u Clear cached plugin to trigger reinstall\n --uninstall Remove plugin from config\n --help, -h Show this help message\n --version, -v Show version\n\nINSTALL OPTIONS:\n --global, -g Install to ~/.config/opencode/opencode.json\n --local, -l Install to ./opencode.json (project-local)\n --with-config Also create opendevbrowser.jsonc with defaults\n --full, -f Create config and pre-extract extension assets\n --no-prompt Skip prompts, use defaults (global install)\n --skills-global Install bundled skills to ~/.config/opencode/skill (default)\n --skills-local Install bundled skills to ./.opencode/skill\n --no-skills Skip installing bundled skills\n\nEXAMPLES:\n npx opendevbrowser # Interactive install\n npx opendevbrowser --global # Global install\n npx opendevbrowser --local # Project install\n npx opendevbrowser --full # Install + config + extension assets\n npx opendevbrowser -g --with-config # Global + config file\n npx opendevbrowser --skills-local # Install skills locally\n npx opendevbrowser --no-skills # Skip skill installation\n npx opendevbrowser --update # Update plugin\n npx opendevbrowser --uninstall --global # Remove from global config\n`.trim();\n}\n","import * as fs from \"fs\";\nimport {\n getGlobalConfigPath,\n readConfig,\n hasPlugin,\n ensureDir,\n updateConfigContent\n} from \"../utils/config\";\nimport { createPluginConfig } from \"../templates/config\";\n\nexport interface InstallResult {\n success: boolean;\n message: string;\n configPath: string;\n created: boolean;\n alreadyInstalled: boolean;\n}\n\nexport function installGlobal(withConfig: boolean = false): InstallResult {\n const configPath = getGlobalConfigPath();\n\n try {\n const { content, config } = readConfig(configPath);\n\n if (hasPlugin(config)) {\n return {\n success: true,\n message: `opendevbrowser is already installed in ${configPath}`,\n configPath,\n created: false,\n alreadyInstalled: true\n };\n }\n\n const newContent = updateConfigContent(content, \"opendevbrowser\");\n\n ensureDir(configPath.replace(/[/\\\\][^/\\\\]+$/, \"\"));\n fs.writeFileSync(configPath, newContent, \"utf-8\");\n\n if (withConfig) {\n createPluginConfig(\"global\");\n }\n\n return {\n success: true,\n message: `Added opendevbrowser to ${configPath}`,\n configPath,\n created: content.trim() === \"\",\n alreadyInstalled: false\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to install globally: ${message}`,\n configPath,\n created: false,\n alreadyInstalled: false\n };\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { parse as parseJsonc, modify, applyEdits } from \"jsonc-parser\";\nimport { writeFileAtomic } from \"../../utils/fs\";\n\nconst PLUGIN_NAME = \"opendevbrowser\";\nconst SCHEMA_URL = \"https://opencode.ai/config.json\";\n\nexport interface OpenCodeConfig {\n $schema?: string;\n plugin?: string[];\n [key: string]: unknown;\n}\n\nexport function getGlobalConfigPath(): string {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, \"opencode.json\");\n}\n\nexport function getLocalConfigPath(): string {\n return path.join(process.cwd(), \"opencode.json\");\n}\n\nexport function ensureDir(dirPath: string): void {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n}\n\nexport function readConfig(configPath: string): { content: string; config: OpenCodeConfig } {\n if (!fs.existsSync(configPath)) {\n return { content: \"\", config: {} };\n }\n\n const content = fs.readFileSync(configPath, \"utf-8\");\n const errors: Array<{ error: number; offset: number; length: number }> = [];\n const parsed = parseJsonc(content, errors, { allowTrailingComma: true });\n\n if (errors.length > 0) {\n const firstError = errors[0];\n throw new Error(`Invalid JSONC at ${configPath}: parse error at offset ${firstError?.offset ?? 0}`);\n }\n\n return { content, config: (parsed ?? {}) as OpenCodeConfig };\n}\n\nexport function writeConfig(configPath: string, config: OpenCodeConfig): void {\n ensureDir(path.dirname(configPath));\n const content = JSON.stringify(config, null, 2) + \"\\n\";\n writeFileAtomic(configPath, content);\n}\n\nexport function addPlugin(config: OpenCodeConfig, pluginName: string = PLUGIN_NAME): OpenCodeConfig {\n const result = { ...config };\n\n if (!result.$schema) {\n result.$schema = SCHEMA_URL;\n }\n\n if (!result.plugin) {\n result.plugin = [pluginName];\n } else if (!result.plugin.includes(pluginName)) {\n result.plugin = [...result.plugin, pluginName];\n }\n\n return result;\n}\n\nexport function removePlugin(config: OpenCodeConfig, pluginName: string = PLUGIN_NAME): OpenCodeConfig {\n const result = { ...config };\n\n if (result.plugin) {\n result.plugin = result.plugin.filter((p) => p !== pluginName);\n if (result.plugin.length === 0) {\n delete result.plugin;\n }\n }\n\n return result;\n}\n\nexport function hasPlugin(config: OpenCodeConfig, pluginName: string = PLUGIN_NAME): boolean {\n return config.plugin?.includes(pluginName) ?? false;\n}\n\nexport function createConfigWithPlugin(pluginName: string = PLUGIN_NAME): OpenCodeConfig {\n return {\n $schema: SCHEMA_URL,\n plugin: [pluginName]\n };\n}\n\nexport function updateConfigContent(content: string, pluginName: string = PLUGIN_NAME): string {\n if (!content.trim()) {\n return JSON.stringify(createConfigWithPlugin(pluginName), null, 2) + \"\\n\";\n }\n\n const parsed = parseJsonc(content, [], { allowTrailingComma: true }) as OpenCodeConfig ?? {};\n\n if (parsed.plugin?.includes(pluginName)) {\n return content;\n }\n\n let result = content;\n\n if (!parsed.$schema) {\n const edits = modify(result, [\"$schema\"], SCHEMA_URL, { formattingOptions: { tabSize: 2, insertSpaces: true } });\n result = applyEdits(result, edits);\n }\n\n const newPlugins = parsed.plugin ? [...parsed.plugin, pluginName] : [pluginName];\n const edits = modify(result, [\"plugin\"], newPlugins, { formattingOptions: { tabSize: 2, insertSpaces: true } });\n result = applyEdits(result, edits);\n\n return result;\n}\n\nexport function removePluginFromContent(content: string, pluginName: string = PLUGIN_NAME): string {\n if (!content.trim()) {\n return content;\n }\n\n const parsed = parseJsonc(content, [], { allowTrailingComma: true }) as OpenCodeConfig ?? {};\n\n if (!parsed.plugin?.includes(pluginName)) {\n return content;\n }\n\n const newPlugins = parsed.plugin.filter((p) => p !== pluginName);\n const edits = modify(content, [\"plugin\"], newPlugins.length > 0 ? newPlugins : undefined, {\n formattingOptions: { tabSize: 2, insertSpaces: true }\n });\n\n return applyEdits(content, edits);\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as crypto from \"crypto\";\n\nexport function writeFileAtomic(\n filePath: string,\n content: string,\n options: { encoding?: BufferEncoding; mode?: number } = {}\n): void {\n const { encoding = \"utf-8\", mode } = options;\n const dir = path.dirname(filePath);\n const hash = crypto.randomBytes(8).toString(\"hex\");\n const tempPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${hash}.tmp`);\n\n try {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const writeOptions: fs.WriteFileOptions = { encoding };\n if (mode !== undefined) {\n writeOptions.mode = mode;\n }\n fs.writeFileSync(tempPath, content, writeOptions);\n fs.renameSync(tempPath, filePath);\n } catch (error) {\n try {\n if (fs.existsSync(tempPath)) {\n fs.unlinkSync(tempPath);\n }\n } catch {\n /* best-effort cleanup */\n }\n throw error;\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { generateSecureToken } from \"../../utils/crypto\";\nimport { writeFileAtomic } from \"../../utils/fs\";\n\nfunction buildConfigTemplate(token: string): string {\n return `{\n // OpenDevBrowser Plugin Configuration\n // See: https://github.com/anthropics/opendevbrowser#configuration\n\n \"headless\": false,\n \"profile\": \"default\",\n \"persistProfile\": true,\n\n \"snapshot\": {\n \"maxChars\": 16000,\n \"maxNodes\": 1000\n },\n\n \"export\": {\n \"maxNodes\": 1000,\n \"inlineStyles\": true\n },\n\n \"devtools\": {\n \"showFullUrls\": false,\n \"showFullConsole\": false\n },\n\n \"security\": {\n \"allowRawCDP\": false,\n \"allowNonLocalCdp\": false,\n \"allowUnsafeExport\": false\n },\n\n \"skillPaths\": [],\n \"skills\": {\n \"nudge\": {\n \"enabled\": true,\n \"keywords\": [\"login\", \"form\", \"extract\"],\n \"maxAgeMs\": 60000\n }\n },\n\n \"continuity\": {\n \"enabled\": true,\n \"filePath\": \"opendevbrowser_continuity.md\",\n \"nudge\": {\n \"enabled\": true,\n \"keywords\": [\n \"plan\",\n \"multi-step\",\n \"multi step\",\n \"long-running\",\n \"long running\",\n \"refactor\",\n \"migration\",\n \"rollout\",\n \"release\",\n \"upgrade\",\n \"investigate\",\n \"follow-up\",\n \"continue\"\n ],\n \"maxAgeMs\": 60000\n }\n },\n\n \"relayPort\": 8787,\n \"relayToken\": \"${token}\",\n\n \"flags\": [],\n\n \"checkForUpdates\": false\n}\n`;\n}\n\nexport function getPluginConfigPath(mode: \"global\" | \"local\"): string {\n if (mode === \"global\") {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, \"opendevbrowser.jsonc\");\n }\n return path.join(process.cwd(), \"opendevbrowser.jsonc\");\n}\n\nexport function createPluginConfig(mode: \"global\" | \"local\"): { created: boolean; path: string } {\n const configPath = getPluginConfigPath(mode);\n\n if (fs.existsSync(configPath)) {\n return { created: false, path: configPath };\n }\n\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const token = generateSecureToken();\n writeFileAtomic(configPath, buildConfigTemplate(token));\n return { created: true, path: configPath };\n}\n\nexport function getConfigTemplate(): string {\n return buildConfigTemplate(generateSecureToken());\n}\n","import * as fs from \"fs\";\nimport {\n getLocalConfigPath,\n readConfig,\n hasPlugin,\n updateConfigContent\n} from \"../utils/config\";\nimport { createPluginConfig } from \"../templates/config\";\n\nexport interface InstallResult {\n success: boolean;\n message: string;\n configPath: string;\n created: boolean;\n alreadyInstalled: boolean;\n}\n\nexport function installLocal(withConfig: boolean = false): InstallResult {\n const configPath = getLocalConfigPath();\n\n try {\n const { content, config } = readConfig(configPath);\n\n if (hasPlugin(config)) {\n return {\n success: true,\n message: `opendevbrowser is already installed in ${configPath}`,\n configPath,\n created: false,\n alreadyInstalled: true\n };\n }\n\n const newContent = updateConfigContent(content, \"opendevbrowser\");\n\n fs.writeFileSync(configPath, newContent, \"utf-8\");\n\n if (withConfig) {\n createPluginConfig(\"local\");\n }\n\n return {\n success: true,\n message: `Added opendevbrowser to ${configPath}`,\n configPath,\n created: content.trim() === \"\",\n alreadyInstalled: false\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to install locally: ${message}`,\n configPath,\n created: false,\n alreadyInstalled: false\n };\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { ensureDir } from \"../utils/config\";\nimport { getBundledSkillsDir, getGlobalSkillDir, getLocalSkillDir } from \"../utils/skills\";\n\nexport type SkillInstallMode = \"global\" | \"local\";\n\nexport interface SkillInstallResult {\n success: boolean;\n message: string;\n targetDir: string;\n installed: string[];\n skipped: string[];\n}\n\nexport function installSkills(mode: SkillInstallMode): SkillInstallResult {\n const targetDir = mode === \"global\" ? getGlobalSkillDir() : getLocalSkillDir();\n const installed: string[] = [];\n const skipped: string[] = [];\n\n try {\n const sourceDir = getBundledSkillsDir();\n const entries = fs.readdirSync(sourceDir, { withFileTypes: true });\n\n ensureDir(targetDir);\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const skillName = entry.name;\n const sourcePath = path.join(sourceDir, skillName);\n const targetPath = path.join(targetDir, skillName);\n\n if (fs.existsSync(targetPath)) {\n skipped.push(skillName);\n continue;\n }\n\n fs.cpSync(sourcePath, targetPath, { recursive: true });\n installed.push(skillName);\n }\n\n const summary = `Skills ${mode} install: ${installed.length} installed${skipped.length ? `, ${skipped.length} skipped` : \"\"} (${targetDir})`;\n return {\n success: true,\n message: summary,\n targetDir,\n installed,\n skipped\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to install skills (${mode}): ${message}`,\n targetDir,\n installed,\n skipped\n };\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { fileURLToPath } from \"url\";\n\nconst PACKAGE_NAME = \"opendevbrowser\";\nconst SKILL_DIR_NAME = \"skill\";\n\nlet cachedPackageRoot: string | null = null;\n\nfunction findPackageRoot(startDir: string): string {\n let current = startDir;\n\n while (true) {\n const pkgPath = path.join(current, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const parsed = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")) as { name?: string };\n if (parsed.name === PACKAGE_NAME) {\n return current;\n }\n } catch {\n void 0;\n }\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n throw new Error(\"Unable to locate opendevbrowser package root for skill installation.\");\n}\n\nexport function getPackageRoot(): string {\n if (cachedPackageRoot) return cachedPackageRoot;\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n cachedPackageRoot = findPackageRoot(moduleDir);\n return cachedPackageRoot;\n}\n\nexport function getBundledSkillsDir(): string {\n const skillsDir = path.join(getPackageRoot(), \"skills\");\n if (!fs.existsSync(skillsDir)) {\n throw new Error(`Bundled skills directory not found at ${skillsDir}`);\n }\n return skillsDir;\n}\n\nexport function getGlobalSkillDir(): string {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, SKILL_DIR_NAME);\n}\n\nexport function getLocalSkillDir(): string {\n return path.join(process.cwd(), \".opencode\", SKILL_DIR_NAME);\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst PLUGIN_NAME = \"opendevbrowser\";\n\nexport interface UpdateResult {\n success: boolean;\n message: string;\n cleared: boolean;\n}\n\nfunction getCacheDir(): string {\n return process.env.OPENCODE_CACHE_DIR\n || path.join(os.homedir(), \".cache\", \"opencode\");\n}\n\nfunction rmdir(dirPath: string): void {\n const cacheDir = getCacheDir();\n const resolvedCache = path.resolve(cacheDir);\n const resolvedPath = path.resolve(dirPath);\n\n if (!resolvedPath.startsWith(resolvedCache + path.sep) || resolvedPath === resolvedCache) {\n throw new Error(`Security: refusing to delete path outside cache directory: ${dirPath}`);\n }\n\n if (fs.existsSync(dirPath)) {\n fs.rmSync(dirPath, { recursive: true, force: true });\n }\n}\n\nexport function runUpdate(): UpdateResult {\n const cacheDir = getCacheDir();\n const nodeModulesDir = path.join(cacheDir, \"node_modules\");\n const pluginCacheDir = path.join(nodeModulesDir, PLUGIN_NAME);\n\n try {\n if (!fs.existsSync(pluginCacheDir)) {\n if (fs.existsSync(nodeModulesDir)) {\n rmdir(nodeModulesDir);\n return {\n success: true,\n message: \"Cleared OpenCode plugin cache. The latest version will be installed on next run.\",\n cleared: true\n };\n }\n\n return {\n success: true,\n message: \"No cached plugin found. OpenCode will install the latest version on next run.\",\n cleared: false\n };\n }\n\n rmdir(pluginCacheDir);\n\n return {\n success: true,\n message: \"Cache cleared. OpenCode will install the latest version on next run.\",\n cleared: true\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to clear cache: ${message}`,\n cleared: false\n };\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport {\n getGlobalConfigPath,\n getLocalConfigPath,\n readConfig,\n hasPlugin,\n removePluginFromContent\n} from \"../utils/config\";\nimport type { InstallMode } from \"../args\";\n\nexport interface UninstallResult {\n success: boolean;\n message: string;\n configPath?: string;\n removed: boolean;\n configFileDeleted: boolean;\n}\n\nfunction getPluginConfigPath(mode: InstallMode): string {\n if (mode === \"global\") {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, \"opendevbrowser.jsonc\");\n }\n return path.join(process.cwd(), \"opendevbrowser.jsonc\");\n}\n\nfunction removePluginConfigFile(mode: InstallMode): boolean {\n const configPath = getPluginConfigPath(mode);\n if (fs.existsSync(configPath)) {\n fs.unlinkSync(configPath);\n return true;\n }\n return false;\n}\n\nexport function runUninstall(\n mode: InstallMode,\n deleteConfigFile: boolean = false\n): UninstallResult {\n const configPath = mode === \"global\" ? getGlobalConfigPath() : getLocalConfigPath();\n\n try {\n const { content, config } = readConfig(configPath);\n\n if (!hasPlugin(config)) {\n return {\n success: true,\n message: `opendevbrowser is not installed in ${configPath}`,\n configPath,\n removed: false,\n configFileDeleted: false\n };\n }\n\n const newContent = removePluginFromContent(content, \"opendevbrowser\");\n\n fs.writeFileSync(configPath, newContent, \"utf-8\");\n\n let configFileDeleted = false;\n if (deleteConfigFile) {\n configFileDeleted = removePluginConfigFile(mode);\n }\n\n return {\n success: true,\n message: `Removed opendevbrowser from ${configPath}`,\n configPath,\n removed: true,\n configFileDeleted\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to uninstall: ${message}`,\n configPath,\n removed: false,\n configFileDeleted: false\n };\n }\n}\n\nexport function findInstalledConfigs(): { global: boolean; local: boolean } {\n let global = false;\n let local = false;\n\n try {\n const { config: globalConfig } = readConfig(getGlobalConfigPath());\n global = hasPlugin(globalConfig);\n } catch {\n void 0;\n }\n\n try {\n const { config: localConfig } = readConfig(getLocalConfigPath());\n local = hasPlugin(localConfig);\n } catch {\n void 0;\n }\n\n return { global, local };\n}\n","#!/usr/bin/env node\n\nimport { parseArgs, getHelpText } from \"./args\";\nimport { installGlobal } from \"./installers/global\";\nimport { installLocal } from \"./installers/local\";\nimport { installSkills } from \"./installers/skills\";\nimport { runUpdate } from \"./commands/update\";\nimport { runUninstall, findInstalledConfigs } from \"./commands/uninstall\";\nimport { extractExtension } from \"../extension-extractor\";\nimport type { InstallMode } from \"./args\";\n\nconst VERSION = \"0.1.0\";\n\nasync function promptInstallMode(): Promise<InstallMode> {\n if (!process.stdin.isTTY) {\n console.log(\"Non-interactive mode detected. Using global install.\");\n return \"global\";\n }\n\n return new Promise((resolve) => {\n console.log(\"\\nWhere would you like to install opendevbrowser?\\n\");\n console.log(\" 1. Global (~/.config/opencode/opencode.json)\");\n console.log(\" 2. Local (./opencode.json in this project)\\n\");\n\n process.stdout.write(\"Enter choice [1]: \");\n\n process.stdin.setEncoding(\"utf8\");\n let resolved = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const cleanup = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n process.stdin.once(\"data\", (data) => {\n cleanup();\n if (resolved) return;\n resolved = true;\n const input = data.toString().trim();\n if (input === \"2\") {\n resolve(\"local\");\n } else {\n resolve(\"global\");\n }\n });\n\n process.stdin.once(\"close\", () => {\n cleanup();\n if (resolved) return;\n resolved = true;\n resolve(\"global\");\n });\n\n timeoutId = setTimeout(() => {\n timeoutId = null;\n if (resolved) return;\n resolved = true;\n console.log(\"\\nTimeout - using global install.\");\n resolve(\"global\");\n }, 30000);\n });\n}\n\nasync function promptUninstallMode(): Promise<InstallMode | null> {\n const installed = findInstalledConfigs();\n\n if (!installed.global && !installed.local) {\n console.log(\"opendevbrowser is not installed in any config.\");\n return null;\n }\n\n if (installed.global && !installed.local) {\n return \"global\";\n }\n\n if (!installed.global && installed.local) {\n return \"local\";\n }\n\n if (!process.stdin.isTTY) {\n console.log(\"Plugin found in both global and local configs. Use --global or --local flag.\");\n return null;\n }\n\n return new Promise((resolve) => {\n console.log(\"\\nopendevbrowser is installed in multiple locations:\\n\");\n console.log(\" 1. Global (~/.config/opencode/opencode.json)\");\n console.log(\" 2. Local (./opencode.json)\");\n console.log(\" 3. Cancel\\n\");\n\n process.stdout.write(\"Which to uninstall? [3]: \");\n\n process.stdin.setEncoding(\"utf8\");\n process.stdin.once(\"data\", (data) => {\n const input = data.toString().trim();\n if (input === \"1\") {\n resolve(\"global\");\n } else if (input === \"2\") {\n resolve(\"local\");\n } else {\n resolve(null);\n }\n });\n\n process.stdin.once(\"close\", () => {\n resolve(null);\n });\n });\n}\n\nasync function main(): Promise<void> {\n try {\n const args = parseArgs(process.argv);\n\n switch (args.command) {\n case \"help\":\n console.log(getHelpText());\n process.exit(0);\n break;\n\n case \"version\":\n console.log(`opendevbrowser v${VERSION}`);\n process.exit(0);\n break;\n\n case \"update\": {\n const result = runUpdate();\n console.log(result.message);\n process.exit(result.success ? 0 : 1);\n break;\n }\n\n case \"uninstall\": {\n let mode = args.mode;\n if (!mode && !args.noPrompt) {\n mode = await promptUninstallMode() ?? undefined;\n if (!mode) {\n console.log(\"Uninstall cancelled.\");\n process.exit(0);\n }\n }\n if (!mode) {\n console.error(\"Error: Please specify --global or --local for uninstall.\");\n process.exit(1);\n }\n const result = runUninstall(mode);\n console.log(result.message);\n process.exit(result.success ? 0 : 1);\n break;\n }\n\n case \"install\":\n default: {\n let mode = args.mode;\n if (!mode) {\n mode = await promptInstallMode();\n }\n\n const result = mode === \"global\"\n ? installGlobal(args.withConfig)\n : installLocal(args.withConfig);\n\n console.log(result.message);\n\n if (args.skillsMode === \"none\") {\n console.log(\"Skill installation skipped (--no-skills).\");\n } else if (result.success) {\n const skillsResult = installSkills(args.skillsMode);\n if (skillsResult.success) {\n console.log(skillsResult.message);\n } else {\n console.warn(skillsResult.message);\n }\n } else {\n console.warn(\"Skill installation skipped because plugin install failed.\");\n }\n\n if (args.fullInstall && result.success) {\n try {\n const extensionPath = extractExtension();\n if (extensionPath) {\n console.log(`Extension assets extracted to ${extensionPath}`);\n } else {\n console.warn(\"Extension assets not found; skipping extraction.\");\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Extension pre-extraction failed: ${message}`);\n }\n }\n\n if (result.success && !result.alreadyInstalled) {\n console.log(\"\\nNext steps:\");\n console.log(\" 1. Start or restart OpenCode\");\n console.log(\" 2. Use opendevbrowser_status to verify the plugin is loaded\");\n console.log(\"\\nFor help: npx opendevbrowser --help\");\n }\n\n process.exit(result.success ? 0 : 1);\n break;\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Error: ${message}`);\n console.error(\"\\nFor help: npx opendevbrowser --help\");\n process.exit(1);\n }\n}\n\nmain().catch((error: unknown) => {\n console.error(\"Unexpected error:\", error);\n process.exit(1);\n});\n"],"mappings":"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","names":["mode","noPrompt","fs","fs","path","edits","fs","path","os","fs","fs","path","fs","path","os","fs","path","os","PLUGIN_NAME","fs","path","os","getPluginConfigPath","resolve"]}
|