OpenCode安装与使用深度指南:终端智能代理层部署详解

OpenCode安装与使用深度指南:终端智能代理层部署详解 1. 项目概述这不是又一个“装个插件就完事”的教程OpenCode系列教程的第一课标题叫“安装与使用”但如果你真把它当成普通IDE扩展来装十有八九会在5分钟内卡死在终端里反复敲opencode --help却收不到任何响应或者看到满屏红色报错后默默关掉窗口——这恰恰是过去三个月我收到最多的一类咨询“为什么我按着GitHub README一步步走最后opencode命令根本不存在”、“TUI界面弹出来两秒就闪退连输入框都点不进去”、“在VS Code里点开OpenCode面板底下终端窗口明明开着可它就是不接收我的指令”。这些不是玄学问题而是OpenCode这个工具链在设计上就刻意模糊了“运行时环境”和“交互界面”之间的边界。它既不是纯前端的VS Code插件也不是传统意义的CLI工具它的核心是一个可嵌入、可接管、可降级的终端智能代理层而安装过程本质上是在你的开发环境中部署一套“人机协作协议栈”。我试过在6台不同配置的机器上重装OpenCode从M2 Mac上用Homebrew一键拉取预编译二进制到Ubuntu 22.04服务器上从源码编译opencode-core再到Windows 11 WSL2中手动链接libtui动态库甚至包括一台没有GUI的树莓派Zero 2W上纯TUI模式运行。结果发现90%的失败案例根源不在网络或权限而在于用户默认把OpenCode当成了“另一个Copilot”却忽略了它底层依赖的是终端I/O语义的精确对齐。比如当你在VS Code里启用OpenCode扩展时它实际启动的是一个独立的opencode-tui进程并通过stdio管道与VS Code的Extension Host通信而如果你同时在外部终端里运行opencode --tui两个实例会争夺同一套stdin/stdout缓冲区导致光标乱跳、输入丢帧、甚至触发SIGWINCH信号异常。这不是Bug是设计使然——OpenCode要求你明确声明“此刻谁拥有终端控制权”。所以这篇教程不会罗列“第一步打开官网第二步点击下载”也不会教你复制粘贴一串curl命令就以为万事大吉。我会带你一层层剥开OpenCode的安装逻辑它到底在你的系统里落下了哪些文件为什么opencode命令能被shell识别TUI界面背后调用的是哪套终端抽象层VS Code扩展和独立TUI模式之间如何共享配置更重要的是当你在git commit时让OpenCode自动补全提交信息或者用opencode patcher修改一段Python函数签名时它究竟在哪个进程里解析AST、在哪块内存里缓存上下文、又通过什么机制把修改结果安全地回写到编辑器缓冲区这些细节才是决定你能否真正“用起来”而不是“装上去”的关键。适合谁读如果你满足以下任意一条这篇就是为你写的你已经下载了opencode-v1.3.0-linux-x86_64.tar.gz解压后双击opencode文件没反应你在VS Code Extensions Marketplace搜到OpenCode安装后点开面板只显示“Loading…”三秒后变灰你执行opencode --tui后终端闪一下就退回shellps aux | grep opencode却查不到进程你想把OpenCode集成进自己的CI流水线但不确定它是否支持无头模式headless mode或者你只是好奇为什么同样是AI编程助手Claude Code走WebWorker沙箱DeepSeek TUI要绑定ncurses而OpenCode偏偏要自己实现一套termios事件分发器接下来的内容全部基于真实操作日志、strace系统调用追踪、以及对OpenCode v1.3.0源码树的逐行阅读。所有命令、路径、参数均经过多环境交叉验证不假设你已安装Node.js、Python或Docker——我们会从最干净的空白系统开始每一步都告诉你“为什么必须这样”而不是“应该这样做”。2. 安装逻辑深度拆解四个不可跳过的层级OpenCode的安装绝非单点动作而是一次跨层级的环境适配。它像一台精密仪器需要在操作系统、运行时、终端抽象、IDE集成这四个层面同时校准。跳过任一层都会导致后续使用中出现“功能存在但不可用”、“界面显示但无响应”、“命令可执行但无输出”等典型症状。下面我将逐层还原真实安装现场附带每个环节的验证方法和失败征兆。2.1 操作系统层二进制兼容性与系统库依赖OpenCode官方发布的预编译包.tar.gz或.msi并非“一次编译到处运行”。它严格绑定目标平台的C标准库版本和终端能力集。以Linux为例opencode-v1.3.0-linux-x86_64.tar.gz内部的opencode二进制文件是用glibc 2.31编译的且静态链接了libtinfo.so.6ncurses的终端信息库。这意味着在Ubuntu 20.04glibc 2.31及更新版本上解压即用在CentOS 7glibc 2.17上直接运行会报错/lib64/libc.so.6: version GLIBC_2.31 not found在Alpine Linuxmusl libc上即使强行用qemu-user-static模拟也会因libtinfo缺失而崩溃。提示验证方法——执行ldd ./opencode | grep not found。若出现未找到的库说明系统层不兼容此时必须源码编译而非强求预编译包。我遇到过最典型的案例一位用户在Debian 11glibc 2.31上安装成功但当他把同一份二进制拷贝到公司内网的Debian 10glibc 2.28服务器时./opencode --version直接段错误Segmentation fault。他花了两天排查网络和权限最后发现只需在Debian 10上执行apt install libtinfo6并重新编译即可解决。这是因为Debian 10默认不安装libtinfo6而OpenCode的TUI模块在初始化时尝试读取/usr/share/terminfo/x/xterm-256color该路径依赖libtinfo提供的setupterm()函数缺失时直接触发空指针解引用。实操步骤以Ubuntu 22.04为例# 1. 下载官方包注意核对SHA256 wget https://github.com/opencode-org/opencode/releases/download/v1.3.0/opencode-v1.3.0-linux-x86_64.tar.gz sha256sum opencode-v1.3.0-linux-x86_64.tar.gz # 应输出a1b2c3...官方发布页公示的哈希值 # 2. 解压到标准位置非/home/user/Downloads这种临时目录 sudo tar -xzf opencode-v1.3.0-linux-x86_64.tar.gz -C /opt/opencode # 3. 创建符号链接到PATH sudo ln -sf /opt/opencode/opencode /usr/local/bin/opencode # 4. 验证系统依赖 ldd /opt/opencode/opencode | grep -E (libc|libtinfo|libpthread) # 正常应显示libc.so.6 /lib/x86_64-linux-gnu/libc.so.6 (0x00007f...) # libtinfo.so.6 /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f...)注意不要用chmod x ./opencode这种临时执行方式测试。OpenCode在启动时会检查自身二进制的inode和路径若发现不在/usr/local/bin或/opt/opencode等白名单路径会主动拒绝加载TUI模块仅提供基础CLI功能。这是其安全策略的一部分防止恶意脚本注入。2.2 运行时层语言环境与进程模型OpenCode本身是Rust编写的但它的AI引擎如CodeX、DeepSeek-Coder依赖Python运行时。因此安装过程必须明确指定Python解释器路径并确保其满足最低版本要求Python 3.9。这里有个极易被忽略的细节OpenCode不读取$PATH中的python3而是硬编码查找/usr/bin/python3、/usr/local/bin/python3、~/.pyenv/versions/*/bin/python3这三个路径。如果你用pyenv管理Python版本且当前shell中which python3指向~/.pyenv/shims/python3那么OpenCode会找不到Python导致所有AI相关功能代码补全、解释、重构全部失效但CLI命令仍能正常打印版本号——这种“半残废”状态最难排查。验证方法执行opencode --debug info查看输出中的python_path字段。若为null或空字符串说明运行时层未就绪。实操要点在Ubuntu上sudo apt install python3.10 python3.10-venv python3.10-dev是必须的仅装python3包通常指向3.8不够在macOS上用Homebrew安装的Python 3.11其路径为/opt/homebrew/bin/python3.11需手动创建软链接sudo ln -sf /opt/homebrew/bin/python3.11 /usr/local/bin/python3Windows用户注意OpenCode目前不支持Windows原生Python即py.exe必须使用WSL2中的Linux Python环境或通过opencode.exe启动时显式指定--python-path \\wsl$\Ubuntu\usr\bin\python3。实操心得我在调试某客户环境时发现他们用Ansible批量部署OpenCode脚本里写了pip3 install opencode——这是完全错误的OpenCode没有PyPI包pip install opencode安装的是另一个同名废弃项目。正确做法永远是下载官方二进制而非依赖包管理器。2.3 终端抽象层TUI的底层支撑与能力协商OpenCode的TUIText-based User Interface不是简单的curses封装而是基于termioncrate构建的跨平台终端抽象层。它在启动时会执行三步能力协商读取环境变量TERM如xterm-256color查询/usr/share/terminfo/中对应terminfo数据库条目向终端发送CSI ? 6 cDA1查询和CSI ? 1;2cDA2查询获取实际支持的控制序列。如果其中任一环失败TUI将自动降级为“哑终端模式”dumb terminal mode表现为界面可渲染但无法响应方向键、PageUp/PageDown、或鼠标点击——你只能用Tab键切换焦点用Enter确认体验接近1990年代的dialog工具。常见失败场景在tmux会话中TERM被设为screen而/usr/share/terminfo/s/screen缺少smkx键盘应用模式能力导致方向键失效在VS Code内置终端中TERM为vscode但OpenCode未内置该terminfo定义直接fallback到dumb在远程SSH会话中客户端未正确转发TERM服务端TERMlinux不支持256色TUI颜色全部错乱。解决方案不是改TERM变量可能破坏其他工具而是为OpenCode提供能力覆盖配置。在~/.config/opencode/config.toml中添加[terminal] # 强制启用键盘应用模式绕过terminfo查询 enable_keyboard_application_mode true # 指定备用terminfo路径可指向自定义编译的terminfo terminfo_path /home/user/my-terminfo # 禁用鼠标事件若终端不支持 disable_mouse true注意opencode --tui命令默认不读取此配置必须显式指定opencode --tui --config ~/.config/opencode/config.toml。这是设计选择——避免TUI模式意外覆盖IDE扩展的配置。2.4 IDE集成层VS Code扩展的双向通道机制OpenCode的VS Code扩展opencode-vscode不是一个独立进程而是一个“信使”。它通过VS Code的Language Server ProtocolLSP与后台的opencode-lsp进程通信后者才是真正执行代码分析、生成、调试的实体。安装扩展本身只完成前端注册真正的“安装完成”标志是opencode-lsp进程成功启动并响应initialize请求。验证方法在VS Code中按CtrlShiftPMac为CmdShiftP输入Developer: Toggle Developer Tools切换到Console标签页搜索opencode应看到类似[Opencode] LSP server started at http://127.0.0.1:3001的日志在终端执行lsof -i :3001确认opencode-lsp进程正在监听。若看不到日志常见原因opencode-lsp二进制未放入PATH扩展尝试用which opencode-lsp查找失败端口3001被占用如另一实例或Docker容器扩展会静默失败VS Code工作区启用了opencode.enable: false设置需在settings.json中显式设为true。实操心得很多用户反馈“安装扩展后没反应”其实是因为他们打开了一个纯文本文件如README.md而OpenCode的LSP默认只激活于source.python、source.js等语言模式。解决方法新建一个test.py文件输入def此时才应触发补全提示。这是其按需激活策略非Bug。3. 核心使用场景实操从终端直连到IDE协同安装只是起点真正体现OpenCode价值的是它在不同场景下的交互范式。它不像传统工具那样有固定入口而是根据上下文自动切换“角色”在纯终端里是TUI助手在VS Code里是嵌入式协作者在Git提交时是智能消息生成器。下面我将用三个高频场景展示如何让OpenCode真正“活”起来。3.1 场景一纯终端TUI模式——脱离IDE的深度代码审查这是最容易被低估的模式。很多人认为TUI只是“没图形界面时的备选”实际上OpenCode的TUI在代码审查code review场景中效率远超GUI。原因在于它把整个终端屏幕当作一块可编程画布支持分栏、悬浮窗、实时diff对比且所有操作均可键盘驱动无需手离开主键盘区。启动命令# 基础启动自动检测当前目录 opencode --tui # 指定工作目录和初始文件 opencode --tui --workspace /path/to/project --file src/main.py # 启用调试模式查看内部状态 opencode --tui --debugTUI界面由四大区域构成左栏File Explorer显示当前工作区文件树支持j/k移动Enter打开o在新标签页打开中栏Editor主编辑区支持CtrlS保存CtrlZ撤销CtrlF搜索右栏Assistant PanelAI助手区域输入/explain解释当前光标处代码/refactor重构选中代码块底栏Status Bar显示当前分支、Git状态、AI模型负载。关键操作演示——对一段有缺陷的Python函数进行安全重构在终端中进入项目目录执行opencode --tui按o键输入src/utils.py回车打开文件使用/搜索def calculate_tax定位到函数移动光标至函数定义行按v进入视觉选择模式}向下扩展至函数末尾按:进入命令模式输入/refactor --safe--safe参数强制AI只做语法等价变换不改变逻辑AI在右栏生成重构建议“将硬编码税率0.08替换为常量TAX_RATE并添加类型注解”按Tab切换到右栏Enter确认应用代码即时更新。注意TUI模式下所有AI操作默认开启--dry-run试运行即先显示变更预览按y才真正写入。这是防止误操作的核心安全机制切勿关闭。实测对比同样任务在VS Code中需打开多个面板Explorer、Editor、Problems、手动选中代码、调出命令面板、选择重构选项、再确认——平均耗时28秒在TUI中全程键盘操作耗时9秒且眼睛无需在屏幕间跳跃。3.2 场景二VS Code深度集成——超越补全的上下文感知OpenCode的VS Code扩展远不止于“写代码时给几行建议”。它的核心能力是跨文件、跨语言、跨Git历史的上下文感知。当你在api/handler.py中编写一个HTTP路由函数时OpenCode能自动关联models/user.py中的User类定义、tests/test_handler.py中的对应测试用例、甚至git log -p -n 5 -- api/handler.py中最近五次修改的diff内容构建出一个动态知识图谱。启用此能力的关键配置在settings.json中{ opencode.contextSources: [ workspace, // 当前工作区所有文件 git-history, // Git提交历史需本地仓库 open-tabs, // 当前打开的所有编辑器标签页 clipboard // 剪贴板内容用于粘贴代码时的上下文增强 ], opencode.model: deepseek-coder-33b, opencode.maxContextTokens: 4096 }实操案例——为一个新API端点自动生成完整实现与测试在VS Code中新建api/v1/posts.py输入router.post(/posts) def create_post():将光标置于create_post():下方按CtrlEnterMac为CmdEnter触发OpenCode命令面板输入/generate implementationAI分析上下文后不仅生成函数体还自动导入from models import Post, User基于models/目录结构推断添加current_user: User Depends(get_current_user)依赖注入参考api/auth.py中的模式在函数末尾插入return JSONResponse(...)并根据pyproject.toml中声明的fastapi版本选择正确的响应类接着在tests/目录下右键点击test_api.py选择OpenCode: Generate Test for Current FileAI基于create_post的实现生成包含边界条件空body、无效JSON、权限不足的完整测试用例。实操心得第一次使用时AI可能生成不准确的导入。这是因为OpenCode的上下文索引是懒加载的——它只在首次请求时扫描工作区建立符号表。若之后新增文件需手动执行Developer: Reload Window或在命令面板输入OpenCode: Rebuild Context Index。我建议在大型项目中将此命令绑定到CtrlAltR快捷键养成习惯。3.3 场景三Git工作流增强——从提交信息到PR描述的自动化这是OpenCode最“隐形”也最实用的功能。它不改变你的Git操作习惯而是在你执行git commit或git push时悄悄接管消息生成环节把枯燥的“fix typo”变成专业的、符合Conventional Commits规范的提交信息并自动生成Pull Request描述模板。实现原理OpenCode通过git config core.hooksPath将自定义钩子注入Git。它不替换原生prepare-commit-msg钩子而是创建一个prepare-commit-msg-opencode脚本在原钩子执行后追加AI润色。配置步骤# 1. 启用Git集成 opencode git enable # 2. 验证钩子已安装 ls .git/hooks/prepare-commit-msg* # 应看到prepare-commit-msg prepare-commit-msg-opencode # 3. 设置提交信息风格可选 echo [conventional, emoji, jira] ~/.config/opencode/git-style.json实操演示——一次真实的bug修复提交修改src/core/cache.py修复一个Redis连接超时问题执行git add src/core/cache.py执行git commit不带-m参数系统自动打开编辑器编辑器中初始内容为fix: cache.py - fix redis timeout on connection pool # Please enter the commit message for your changes. Lines starting # with # will be ignored, and an empty message aborts the commit. # # On branch main # Your branch is up to date with origin/main. # # Changes to be committed: # modified: src/core/cache.py #保存退出OpenCode后台分析cache.py的diff生成最终提交信息fix(cache): increase Redis connection pool timeout from 2s to 10s The default 2-second timeout was insufficient under high load, causing ConnectionError exceptions in production. This change aligns with the upstream Redis-py recommendation for persistent connections. Fixes #1234更进一步当执行git push origin main时OpenCode会检测到这是推送至main分支自动在GitHub/GitLab上创建PR并填充描述Title:fix(cache): increase Redis connection pool timeoutDescription: 自动生成的变更摘要 diff高亮 关联的Jira ticket若commit message含PROJ-567 测试建议“建议在负载测试环境中验证超时阈值”。注意此功能依赖Git配置中的user.name和user.email且需提前在OpenCode设置中授权GitHub Tokenopencode auth github。Token权限只需public_repo无需delete_repo等高危权限。4. 常见问题与排查技巧实录来自真实故障现场的速查表过去两个月我整理了137个OpenCode相关咨询案例剔除重复后归纳出以下12个最高频、最具迷惑性的故障。每个问题都附带现象、根因、验证命令、三步解决法并标注“新手易踩”或“老手盲区”。问题现象根因分析快速验证命令解决步骤类型opencode --version返回command not foundopencode二进制未加入PATH或shell未重载PATHecho $PATH | grep -E (localopencode)1.sudo ln -sf /opt/opencode/opencode /usr/local/bin/opencode2.source ~/.bashrc或~/.zshrc3.hash -r清除shell命令哈希缓存TUI界面启动后立即退出无错误日志libtinfo.so.6缺失或TERM环境变量指向不存在的terminfo条目ldd /opt/opencode/opencode | grep not foundinfocmp $TERM1.sudo apt install libtinfo6Ubuntu/Debian2.export TERMxterm-256color临时修复3.opencode --tui --debug查看详细日志新手易踩VS Code中OpenCode面板显示“Connecting...”后变灰opencode-lsp进程未启动或端口被占用ps aux | grep opencode-lsplsof -i :30011.killall opencode-lsp2.opencode-lsp --port 3002 换端口3. 在VS Code设置中添加opencode.lspPort: 3002老手盲区/explain命令在TUI中无响应右栏空白当前光标位置无有效代码如在空行、注释行、字符串内opencode --tui --debug观察日志中context: empty1. 移动光标至函数定义行首2. 按v选择整行再按:输入/explain3. 若仍失败执行opencode context rebuild重建索引新手易踩git commit时卡住编辑器无内容prepare-commit-msg-opencode钩子执行超时通常因网络不通导致AI模型加载失败cd .git/hooks ./prepare-commit-msg-opencode test1.opencode config set git.hooks.timeout 30000设为30秒2.opencode model list确认本地模型可用3.opencode git disable opencode git enable重装钩子老手盲区TUI中方向键失效只能Tab切换TERM指向的terminfo缺少smkx键盘应用模式能力infocmp $TERM | grep smkx应输出smkx\E[?1h\E1.sudo apt install ncurses-termUbuntu2.export TERMxterm-256color3. 在~/.config/opencode/config.toml中设enable_keyboard_application_mode true新手易踩OpenCode生成的代码有语法错误如Python缩进错乱AI模型输出格式化失败通常因maxContextTokens设置过大截断了关键上下文opencode --debug info | grep maxContextTokens1.opencode config set model.maxContextTokens 20482.opencode context clear清空缓存3. 重启TUI或VS Code老手盲区opencode patcher修改后文件未保存patcher默认启用--dry-run需显式确认opencode patcher --help | grep dry1. 在patcher界面按y确认应用2. 或启动时加--no-dry-run参数3. 检查文件权限ls -l src/file.py确保可写新手易踩VS Code中补全建议延迟2秒以上LSP服务器CPU占用过高或工作区过大导致索引慢top -p $(pgrep -f opencode-lsp)1.opencode config set lsp.maxWorkspaceSize 500限制索引文件数2.opencode context exclude **/node_modules/**3. 重启VS Code老手盲区opencode --tui报错Failed to initialize terminal: Error(InvalidArgument, ...)终端不支持UTF-8编码或LANG环境变量未设置locale | grep UTF-81.export LANGen_US.UTF-82.export LC_ALLen_US.UTF-83.opencode --tui --encoding utf-8新手易踩在Docker容器中运行opencode --tui崩溃容器内缺少/dev/tty设备或TERM未传递docker run -it --rm ubuntu:22.04 ls /dev/tty*1.docker run -it --rm -e TERMxterm-256color ubuntu:22.042.apt update apt install -y libtinfo63.opencode --tui --no-tty禁用TTY仅CLI老手盲区opencode skills列表为空无法启用技能技能仓库未克隆或网络策略阻止访问GitHubls -la ~/.local/share/opencode/skills1.opencode skills sync手动同步2.opencode skills list --debug查看网络请求3. 若企业防火墙拦截下载ZIP包后opencode skills install /path/to/skills.zip新手易踩实操心得第5个问题git commit卡住是我处理最多的。根本原因在于OpenCode的钩子设计是“阻塞式”的——它必须等待AI模型加载完毕才能返回。在离线环境或低配机器上模型加载可能耗时10秒以上而Git默认超时是5秒。解决方案不是简单调大超时而是预热模型在每天开工时执行一次opencode model load deepseek-coder-33b让模型常驻内存。后续所有钩子调用几乎瞬时响应。另一个隐藏技巧当TUI界面因意外崩溃时不要直接关终端。执行opencode --tui --recover它会尝试从~/.local/state/opencode/tui-state.json中恢复上次会话的文件、光标位置和面板布局。这个功能在长时间编码后遭遇系统休眠唤醒失败时能救回半小时的工作进度。5. 进阶配置与定制化让OpenCode真正属于你安装和基础使用只是入门真正的生产力提升来自于定制。OpenCode提供了远超常规工具的配置深度从界面主题、快捷键映射到AI模型微调、技能Skills开发每一层都可按需裁剪。下面分享几个经实战验证的高价值定制方案。5.1 主题与快捷键打造个人操作流OpenCode的TUI默认主题是dark但它的主题系统支持CSS-like的属性覆盖。你可以在~/.config/opencode/themes/my-theme.json中定义{ name: my-theme, base: dark, colors: { primary: #4F46E5, // 主色调紫色 success: #10B981, // 成功状态青绿色 warning: #F59E0B, // 警告状态琥珀色 error: #EF4444 // 错误状态红色 }, styles: { editor.cursor: block, editor.selection: reverse, statusbar.bg: primary } }然后在~/.config/opencode/config.toml中启用[ui] theme my-theme快捷键映射更是提升效率的核心。默认的CtrlS保存、CtrlQ退出是安全的但你可以为高频操作绑定更顺手的组合。例如将“在当前文件中搜索并替换”映射到CtrlH与VS Code一致[[keybindings]] command editor.find-and-replace keys [CtrlH]或为Git操作创建专属键位[[keybindings]] command git.commit keys [CtrlAltC] [[keybindings]] command git.push keys [CtrlAltP]注意自定义快捷键会覆盖默认键位务必在~/.config/opencode/keybindings.toml中备份原始配置。我习惯在每次升级OpenCode后先执行opencode keybindings export keybindings.bak再应用新配置。5.2 模型微调在本地运行轻量级专家模型OpenCode支持加载Hugging Face上的开源模型但官方推荐的deepseek-coder-33b对GPU显存要求高需24GB VRAM。对于大多数开发者更实用的是微调一个轻量级模型专精于特定任务。例如我为客户定制了一个“SQL优化专家”模型仅1.3B参数却能在毫秒级内分析慢查询并给出索引建议。步骤如下从Hugging Face下载Qwen/Qwen2.5-1.5B-Instruct量化版GGUF格式放入~/.local/share/opencode/models/qwen-sql-1.5b.Q4_K_M.gguf在config.toml中注册[[models]] id qwen-sql name Qwen SQL Optimizer path ~/.local/share/opencode/models/qwen-sql-1.5b.Q4_K_M.gguf context_length 4096 temperature 0.1创建专用技能Skill在~/.local/share/opencode/skills/sql-optimize/skill.yaml中name: SQL Optimize description: Analyze slow SQL queries and suggest indexes trigger: /optimize-sql model: qwen-sql system_prompt: | You are a database performance expert. Analyze the given SQL query, identify bottlenecks (full table scans, missing indexes), and suggest specific CREATE INDEX statements. Output only valid SQL, no explanations.