[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-82115":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":11,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":14,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":15,"rankGlobal":9,"rankLanguage":9,"license":16,"archived":17,"fork":17,"defaultBranch":18,"hasWiki":19,"hasPages":17,"topics":20,"createdAt":9,"pushedAt":9,"updatedAt":21,"readmeContent":22,"aiSummary":23,"trendingCount":14,"starSnapshotCount":14,"syncStatus":24,"lastSyncTime":25,"discoverSource":26},82115,"agent-database-cli","sleepinginsummer\u002Fagent-database-cli","sleepinginsummer","A CLI-based multi-database tool that exposes database connections, query execution, metadata inspection, and connection reuse as local commands callable by agents. 基于 CLI 的多数据库操作工具，将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。",null,"Rust",21,3,1,0,41.81,"MIT License",false,"main",true,[],"2026-06-12 04:01:37","\u003Cdiv align=\"center\">\n\n# agent-database-cli\n\n基于 CLI 的多数据库操作工具，将常见数据库连接、查询、元信息读取和连接复用能力封装为 Agent 可调用的本地命令。\n\nMySQL · PostgreSQL · Redis · Oracle · MongoDB · 只读模式 · 命令黑名单 · SQLcl Oracle · 本地 daemon\n\n\u003Cp>\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCLI-agent--database--cli-2ea44f\" alt=\"CLI agent-database-cli\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-green\" alt=\"License MIT\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FNode.js-%3E%3D20-339933?logo=node.js&logoColor=white\" alt=\"Node.js >=20\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnpm-%3E%3D10-CB3837?logo=npm&logoColor=white\" alt=\"npm >=10\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fsys-win%2Fmac%2Flinux-0078D6\" alt=\"sys win\u002Fmac\u002Flinux\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Frelease-v0.2.20-blue\" alt=\"release v0.2.20\">\n\u003C\u002Fp>\n\n[AI 一键安装](#ai-一键安装) · [安装](#安装) · [配置](#配置) · [权限配置](#权限配置) · [Oracle SQLcl](#oracle-sqlcl) · [许可证](#许可证) · [友情链接](#友情链接)\n\n中文 | [English](README_EN.md)\n\n\u003C\u002Fdiv>\n\n## 简介\n\n`agent-database-cli` 是一个面向 Agent 的本地多数据库 CLI 工具，用 Rust 封装 MySQL、PostgreSQL、Redis、Oracle、MongoDB 的连接、查询、元信息读取、只读控制、命令黑名单和密码加密能力。\n\n它能做的事：\n\n- 列出当前支持的数据库类型和本地已配置连接\n- 对指定数据库执行 SQL、Redis 命令或 MongoDB JSON 命令\n- 查询数据库元信息，例如表、列、集合、Redis keys；Redis keys 元信息使用 `SCAN` 分批读取，避免阻塞式 `KEYS`\n- 按单个数据库配置启用只读模式和命令黑名单\n- Oracle 默认使用 SQLcl；需要 Oracle Instant Client 时可显式切换到 `oracle`\u002F`oracledb` 原生驱动\n- 不保存或输出脱敏前的密码、token、secret\n\n驱动配置表：\n\n| 数据库 | `type` | 默认驱动 | 驱动切换配置 |\n| --- | --- | --- | --- |\n| MySQL | `mysql` | Rust 原生驱动 `mysql_async` | 暂不支持切换 |\n| PostgreSQL | `postgres` | Rust 原生驱动 `tokio-postgres` | 暂不支持切换 |\n| Redis 单机 | `redis` | Rust 原生驱动 `redis` | 仅配置 `url` |\n| Redis 集群 | `redis` | Rust 原生驱动 `redis` | 同时配置 `url` 和 `redisCluster.nodes` |\n| Oracle | `oracle` | SQLcl | 支持两种驱动：默认 SQLcl （需要自行安装）；可切换oracledb（需要 Oracle Instant Client） |\n| MongoDB | `mongodb` | Rust 原生驱动 `mongodb` | 暂不支持切换；可配 `database` 指定默认库 |\n\n## 安装\n\n### 环境要求\n\n- Node.js `>= 20`\n- npm `>= 10`\n- 系统支持 Windows \u002F macOS \u002F Linux\n- 安装时会自动拉取对应平台的 Rust 二进制子包，当前支持 macOS x64\u002Farm64、Linux x64\u002Farm64、Windows x64\n- 本机网络可访问目标数据库\n- 如使用 Docker 集成测试，需要 Docker 和 Docker Compose\n- 如 Oracle 使用 SQLcl，需要本机可运行 SQLcl 和 Java21\n\n\n### AI 一键安装\n\n```text\n安装请阅读 https:\u002F\u002Fgithub.com\u002Fsleepinginsummer\u002Fagent-database-cli\u002Fblob\u002Fmain\u002FAI_INSTALL.md，按说明安装 CLI 并添加 `SKILL.md`。\n```\n\n### 手动全局安装\n\n```bash\nnpm install -g agent-database-cli\nagent-database-cli --help\n```\n\n如果 npm 包安装受限，使用等价的源码安装方式：\n\n```powershell\ngit clone https:\u002F\u002Fgithub.com\u002Fsleepinginsummer\u002Fagent-database-cli.git\ncd agent-database-cli\nnpm install\nnpm run build\nnpm link\nagent-database-cli --help\n```\n\n添加skiil.md到需要使用的agent中\n\n## 配置\n\n默认配置文件：\n\n```text\n~\u002F.agent-database-cli\u002Fconfig.json\n```\n\n可以通过环境变量修改配置位置：\n\n```bash\nAGENT_DATABASE_CLI_CONFIG=\u002Fpath\u002Fto\u002Fconfig.json agent-database-cli list\n```\n\n配置文件是一个对象，`databases` 中每个 key 是一个数据库连接名。\n\n连接配置：\n\n| 字段 | 适用范围 | 默认值 | 说明 |\n| --- | --- | --- | --- |\n| `type` | 全部数据库 | 无 | 数据库类型，支持 `mysql`、`postgres`、`redis`、`oracle`、`mongodb` |\n| `url` | 全部数据库 | 无 | 数据库连接 URL；Redis 单机模式直接连接该地址，Redis 集群模式下作为入口节点 URL |\n| `passwordRef` | 全部数据库 | 无 | 数据库 URL 密码的本地密文引用；首次使用明文 URL 密码时自动生成 |\n| `database` | MongoDB | 无 | MongoDB 默认数据库名 |\n| `oracleDriver` | Oracle | `sqlcl` | Oracle 驱动：`sqlcl` 或原生驱动 |\n| `sqlclPath` | Oracle SQLcl | 无 | SQLcl 可执行文件路径，仅 `oracleDriver: \"sqlcl\"` 时使用 |\n| `javaHome` | Oracle SQLcl | 无 | SQLcl 使用的 `JAVA_HOME` |\n| `redisCluster` | Redis | 无 | Redis 集群配置，配置后会使用 Redis Cluster 模式 |\n| `sshTunnel` | 全部数据库 | 无 | SSH 隧道配置；单机模式转发数据库 URL 的 host\u002Fport，Redis 集群模式为每个节点分别建立本地转发 |\n| `readonly` | 全部数据库 | `true` | 是否启用只读模式；仅在明确需要写入时才建议显式设为 `false` |\n| `blacklist` | 全部数据库 | 无 | 命令黑名单数组，大小写不敏感 |\n| `keepAliveSeconds` | 全部数据库 | `180` | 单个数据库连接空闲释放秒数 |\n\nRedis 集群配置：\n\n| 字段 | 默认值 | 说明 |\n| --- | --- | --- |\n| `nodes` | 无 | Redis 集群节点 URL 数组，至少配置一个，支持 `redis:\u002F\u002F` 和 `rediss:\u002F\u002F` |\n\nRedis 集群使用规则：\n\n| 场景 | 要求 |\n| --- | --- |\n| 启用集群模式 | 必须同时配置 `url` 和 `redisCluster.nodes` |\n| `url` | 用作集群入口节点，建议填写任意一个稳定可达的集群节点 URL |\n| `redisCluster.nodes` | 用作集群节点清单；如走 SSH 隧道，也用于为每个节点建立本地转发和地址映射 |\n| 同时配置 `sshTunnel` | 程序会给每个集群节点分别建立本地端口转发，并通过地址映射接管集群节点跳转 |\n| 通过 SSH 隧道访问集群 | `redisCluster.nodes` 需要覆盖客户端实际可能访问到的集群节点地址 |\n\nSSH 隧道配置支持密码、私钥、密码加私钥、带通行短语的私钥认证。\n\n| 字段 | 默认值 | 说明 |\n| --- | --- | --- |\n| `host` | 无 | SSH 跳板机地址 |\n| `port` | `22` | SSH 端口 |\n| `username` | 无 | SSH 用户名 |\n| `password` | 无 | SSH 密码，可选 |\n| `passwordRef` | 无 | SSH 密码的本地密文引用；首次使用明文 `password` 时自动生成 |\n| `privateKeyPath` | 无 | 私钥文件路径，可选，支持 `~` |\n| `privateKey` | 无 | 私钥内容，可选，和 `privateKeyPath` 二选一 |\n| `passphrase` | 无 | 私钥通行短语，可选，仅配置私钥时允许使用 |\n| `passphraseRef` | 无 | 私钥通行短语的本地密文引用；首次使用明文 `passphrase` 时自动生成 |\n| `readyTimeout` | 无 | SSH 连接超时时间，单位毫秒，可选 |\n\n敏感信息会在首次使用对应连接时被动加密保存。数据库 URL 中的明文密码、`sshTunnel.password` 和 `sshTunnel.passphrase` 会写入配置目录下的 `secrets.json`，本地密钥写入 `secret.key`，并把配置中的明文字段清空或移除密码内容后写入对应 `*Ref`。后续运行只通过引用解密到内存中使用；如需修改密码，把明文字段重新填成新值，下次使用会覆盖旧密文。\n\n安全策略：\n\n| 策略 | 说明 |\n| --- | --- |\n| 检查优先级 | 先检查黑名单，命中直接拒绝；未命中再检查只读模式 |\n| 只读默认值 | 默认启用只读模式，未显式配置 `readonly` 时也会拒绝写操作 |\n| 推荐用法 | 所有数据库连接默认保持只读，需要变更数据时，让 AI 先给出对应 SQL 或命令，再由你确认后执行 |\n| 写入配置 | 某个连接确实需要写入时，再单独将该连接配置为 `readonly: false` |\n\n参考配置：\n\n```json\n{\n  \"databases\": {\n    \"local-mysql\": {\n      \"type\": \"mysql\",\n      \"url\": \"mysql:\u002F\u002Fuser:password@localhost:3306\u002Fapp\",\n      \"readonly\": true,\n      \"blacklist\": [\"drop\", \"truncate\", \"delete\"],\n      \"keepAliveSeconds\": 180\n    },\n    \"remote-mysql\": {\n      \"type\": \"mysql\",\n      \"url\": \"mysql:\u002F\u002Fuser:password@db.internal:3306\u002Fapp\",\n      \"sshTunnel\": {\n        \"host\": \"jump.example.com\",\n        \"port\": 22,\n        \"username\": \"deploy\",\n        \"privateKeyPath\": \"~\u002F.ssh\u002Fid_rsa\",\n        \"passphrase\": \"key-passphrase\"\n      },\n      \"readonly\": true,\n      \"keepAliveSeconds\": 180\n    },\n    \"redis-standalone\": {\n      \"type\": \"redis\",\n      \"url\": \"redis:\u002F\u002Flocalhost:6379\",\n      \"readonly\": false,\n      \"blacklist\": [\"flushall\", \"flushdb\"],\n      \"keepAliveSeconds\": 180\n    },\n    \"redis-cluster\": {\n      \"type\": \"redis\",\n      \"url\": \"redis:\u002F\u002F10.0.0.11:7001\",\n      \"redisCluster\": {\n        \"nodes\": [\n          \"redis:\u002F\u002F10.0.0.11:7001\",\n          \"redis:\u002F\u002F10.0.0.12:7001\",\n          \"redis:\u002F\u002F10.0.0.13:7001\"\n        ]\n      },\n      \"readonly\": true,\n      \"blacklist\": [\"flushall\", \"flushdb\"],\n      \"keepAliveSeconds\": 180\n    },\n    \"redis-cluster-via-ssh\": {\n      \"type\": \"redis\",\n      \"url\": \"redis:\u002F\u002F10.0.0.11:7001\",\n      \"redisCluster\": {\n        \"nodes\": [\n          \"redis:\u002F\u002F10.0.0.11:7001\",\n          \"redis:\u002F\u002F10.0.0.12:7001\",\n          \"redis:\u002F\u002F10.0.0.13:7001\"\n        ]\n      },\n      \"sshTunnel\": {\n        \"host\": \"jump.example.com\",\n        \"port\": 22,\n        \"username\": \"deploy\",\n        \"privateKeyPath\": \"~\u002F.ssh\u002Fid_rsa\"\n      },\n      \"readonly\": true,\n      \"blacklist\": [\"flushall\", \"flushdb\"],\n      \"keepAliveSeconds\": 180\n    },\n    \"oracle-test\": {\n      \"type\": \"oracle\",\n      \"url\": \"oracle:\u002F\u002FUSER:password@127.0.0.1:1521\u002Fqftest201\",\n      \"oracleDriver\": \"sqlcl\",\n      \"sqlclPath\": \"\u002Fopt\u002Fhomebrew\u002FCaskroom\u002Fsqlcl\u002F26.1.0.086.1709\u002Fsqlcl\u002Fbin\u002Fsql\",\n      \"javaHome\": \"\u002FApplications\u002FIntelliJ IDEA Ultimate.app\u002FContents\u002Fjbr\u002FContents\u002FHome\",\n      \"readonly\": true,\n      \"blacklist\": [\"drop\", \"truncate\", \"delete\", \"update\", \"insert\", \"merge\", \"alter\", \"create\"],\n      \"keepAliveSeconds\": 180\n    }\n  }\n}\n```\n\n\n## 权限配置\n\n权限控制建议同时使用 `readonly` 和 `blacklist`，不要只依赖其中一个。\n\n### 只读模式\n\n- 默认值是 `true`\n- 不配置 `readonly` 时，仍然会按只读模式处理\n- 只读模式会额外拒绝存在写入语义的查询，例如 PostgreSQL `SELECT INTO` 和 MongoDB aggregate 中的 `$out`、`$merge`\n- 推荐所有日常查询连接都保持默认只读\n- 需要修改数据时，建议先让 AI 生成对应 SQL 或命令，再由你确认后执行\n- 只有明确需要写入的专用连接，才单独配置 `readonly: false`\n\n### 命令黑名单\n\n- 黑名单优先级高于只读模式\n- 命中黑名单后会直接拒绝，不再继续判断是否只读\n- 适合拦截高危命令，避免误执行删库、删表、结构变更、批量写入、清空缓存等操作\n- 建议生产库、共享测试库、线上 Redis 都配置黑名单\n\n### 执行顺序\n\n1. 先检查 `blacklist`\n2. 命中则直接拒绝\n3. 未命中再检查 `readonly`\n4. `readonly` 生效时只允许读命令\n\n### 常见高危命令\n\nMySQL \u002F PostgreSQL \u002F Oracle 常见高危 SQL：\n\n```json\n[\"drop\", \"truncate\", \"delete\", \"update\", \"insert\", \"merge\", \"alter\", \"create\", \"replace\", \"grant\", \"revoke\"]\n```\n\nRedis 常见高危命令：\n\n```json\n[\"flushall\", \"flushdb\", \"del\", \"unlink\", \"set\", \"mset\", \"expire\", \"rename\", \"hset\", \"lpush\", \"rpush\", \"sadd\", \"zadd\", \"keys\"]\n```\n\nMongoDB 常见高危命令：\n\n```json\n[\"insertOne\", \"insertMany\", \"updateOne\", \"updateMany\", \"replaceOne\", \"deleteOne\", \"deleteMany\", \"findAndModify\", \"findOneAndUpdate\", \"findOneAndDelete\", \"drop\", \"dropDatabase\", \"createIndex\", \"dropIndex\", \"$out\", \"$merge\"]\n```\n\n### 推荐配置示例\n\n生产库推荐：\n\n```json\n{\n  \"type\": \"mysql\",\n  \"url\": \"mysql:\u002F\u002Fuser:password@prod-db:3306\u002Fapp\",\n  \"readonly\": true,\n  \"blacklist\": [\"drop\", \"truncate\", \"delete\", \"update\", \"insert\", \"alter\", \"create\"],\n  \"keepAliveSeconds\": 180\n}\n```\n\n允许写入的专用连接推荐：\n\n```json\n{\n  \"type\": \"postgres\",\n  \"url\": \"postgres:\u002F\u002Fuser:password@write-db:5432\u002Fapp\",\n  \"readonly\": false,\n  \"blacklist\": [\"drop\", \"truncate\", \"alter\"],\n  \"keepAliveSeconds\": 180\n}\n```\n\n\nOracle 保留双驱动设计：\n\n- 不配置 `oracleDriver`：默认 SQLcl。\n- `oracleDriver: \"sqlcl\"`：显式使用 SQLcl，适合 Oracle 11 等老库、无法安装 Instant Client 或原生驱动兼容性不稳定的环境。\n- `oracleDriver: \"oracle\"`：显式使用 Rust Oracle 原生驱动，依赖 Oracle Instant Client \u002F ODPI-C。\n- `oracleDriver: \"oracledb\"`：Node 版原生驱动兼容值；Rust 版按 `oracle` 原生入口处理。\n\n当前默认入口已切换为 Rust 原生 CLI，并通过 npm 平台子包分发 Windows、Linux、macOS 二进制；Oracle 默认 SQLcl，原生 Oracle 驱动需显式配置。\n\n## Oracle SQLcl\n\n官方链接：https:\u002F\u002Fwww.oracle.com\u002Fdatabase\u002Fsqldeveloper\u002Ftechnologies\u002Fsqlcl\u002F\n\nOracle 默认使用 SQLcl，避免默认依赖 Oracle Instant Client，也更适合 Oracle 11 等老库。可以不配置 `oracleDriver`，或显式配置为 SQLcl：\n\n```json\n{\n  \"type\": \"oracle\",\n  \"url\": \"oracle:\u002F\u002FUSER:password@127.0.0.1:1521\u002Fqftest201\",\n  \"oracleDriver\": \"sqlcl\",\n  \"sqlclPath\": \"\u002Fopt\u002Fhomebrew\u002FCaskroom\u002Fsqlcl\u002F26.1.0.086.1709\u002Fsqlcl\u002Fbin\u002Fsql\",\n  \"javaHome\": \"\u002FApplications\u002FIntelliJ IDEA Ultimate.app\u002FContents\u002Fjbr\u002FContents\u002FHome\",\n  \"readonly\": true,\n  \"blacklist\": [\"drop\", \"truncate\", \"delete\", \"update\", \"insert\", \"merge\", \"alter\", \"create\"]\n}\n```\n\nSQLcl 模式会通过 stdin 传入连接脚本，避免密码出现在命令行参数列表中。安全检查仍在执行前完成，黑名单和只读模式都会生效。\n\n## 更新\n\n```bash\nnpm install -g agent-database-cli@latest\n```\n\n## 卸载和清理\n\n```bash\nnpm uninstall -g agent-database-cli\nnpm cache clean --force\nrm -rf ~\u002F.agent-database-cli\n```\n\n## 许可证\n\n[MIT](LICENSE)\n\n## 友情链接\n\n- [LINUX DO - 新的理想型社区](https:\u002F\u002Flinux.do\u002F)\n","`agent-database-cli` 是一个面向 Agent 的本地多数据库 CLI 工具，使用 Rust 语言开发，支持 MySQL、PostgreSQL、Redis、Oracle 和 MongoDB 等多种数据库的连接、查询、元信息读取以及连接复用。其核心功能包括列出已配置数据库连接、执行 SQL 或 Redis 命令、查询数据库元信息（如表、列、集合等），并提供只读模式和命令黑名单以增强安全性。此外，该工具还支持 Oracle 的 SQLcl 和原生驱动切换，并确保密码等敏感信息的安全处理。适用于需要通过脚本或自动化工具管理多个不同类型数据库的场景，特别是在 DevOps、运维管理和数据迁移等工作中。",2,"2026-06-11 04:07:48","CREATED_QUERY"]