agent-database-cli 0.2.7 → 0.2.15

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 (72) hide show
  1. package/AI_INSTALL.md +1 -1
  2. package/README.md +81 -61
  3. package/README_EN.md +37 -11
  4. package/SKILL.md +2 -1
  5. package/bin/agent-database-cli.js +55 -0
  6. package/package.json +20 -27
  7. package/dist/adapters/base-sql.d.ts +0 -12
  8. package/dist/adapters/base-sql.js +0 -22
  9. package/dist/adapters/base-sql.js.map +0 -1
  10. package/dist/adapters/factory.d.ts +0 -2
  11. package/dist/adapters/factory.js +0 -26
  12. package/dist/adapters/factory.js.map +0 -1
  13. package/dist/adapters/mongodb.d.ts +0 -14
  14. package/dist/adapters/mongodb.js +0 -137
  15. package/dist/adapters/mongodb.js.map +0 -1
  16. package/dist/adapters/mysql.d.ts +0 -12
  17. package/dist/adapters/mysql.js +0 -38
  18. package/dist/adapters/mysql.js.map +0 -1
  19. package/dist/adapters/oracle-sqlcl.d.ts +0 -19
  20. package/dist/adapters/oracle-sqlcl.js +0 -334
  21. package/dist/adapters/oracle-sqlcl.js.map +0 -1
  22. package/dist/adapters/oracle.d.ts +0 -13
  23. package/dist/adapters/oracle.js +0 -47
  24. package/dist/adapters/oracle.js.map +0 -1
  25. package/dist/adapters/postgres.d.ts +0 -12
  26. package/dist/adapters/postgres.js +0 -40
  27. package/dist/adapters/postgres.js.map +0 -1
  28. package/dist/adapters/redis.d.ts +0 -15
  29. package/dist/adapters/redis.js +0 -91
  30. package/dist/adapters/redis.js.map +0 -1
  31. package/dist/cli.d.ts +0 -2
  32. package/dist/cli.js +0 -118
  33. package/dist/cli.js.map +0 -1
  34. package/dist/config.d.ts +0 -8
  35. package/dist/config.js +0 -147
  36. package/dist/config.js.map +0 -1
  37. package/dist/connection-manager.d.ts +0 -24
  38. package/dist/connection-manager.js +0 -91
  39. package/dist/connection-manager.js.map +0 -1
  40. package/dist/daemon/client.d.ts +0 -3
  41. package/dist/daemon/client.js +0 -33
  42. package/dist/daemon/client.js.map +0 -1
  43. package/dist/daemon/config-manager.d.ts +0 -15
  44. package/dist/daemon/config-manager.js +0 -44
  45. package/dist/daemon/config-manager.js.map +0 -1
  46. package/dist/daemon/control.d.ts +0 -9
  47. package/dist/daemon/control.js +0 -53
  48. package/dist/daemon/control.js.map +0 -1
  49. package/dist/daemon/paths.d.ts +0 -5
  50. package/dist/daemon/paths.js +0 -18
  51. package/dist/daemon/paths.js.map +0 -1
  52. package/dist/daemon/server.d.ts +0 -1
  53. package/dist/daemon/server.js +0 -119
  54. package/dist/daemon/server.js.map +0 -1
  55. package/dist/output.d.ts +0 -2
  56. package/dist/output.js +0 -39
  57. package/dist/output.js.map +0 -1
  58. package/dist/runtime.d.ts +0 -5
  59. package/dist/runtime.js +0 -25
  60. package/dist/runtime.js.map +0 -1
  61. package/dist/security.d.ts +0 -8
  62. package/dist/security.js +0 -239
  63. package/dist/security.js.map +0 -1
  64. package/dist/ssh-tunnel.d.ts +0 -8
  65. package/dist/ssh-tunnel.js +0 -231
  66. package/dist/ssh-tunnel.js.map +0 -1
  67. package/dist/types.d.ts +0 -69
  68. package/dist/types.js +0 -2
  69. package/dist/types.js.map +0 -1
  70. package/dist/utils/masking.d.ts +0 -2
  71. package/dist/utils/masking.js +0 -14
  72. package/dist/utils/masking.js.map +0 -1
package/AI_INSTALL.md CHANGED
@@ -27,7 +27,7 @@ node --version
27
27
  npm --version
28
28
  ```
29
29
 
30
- 需要 Node.js `>= 20` 和 npm `>= 10`。
30
+ 需要 Node.js `>= 20` 和 npm `>= 10`。当前预编译二进制支持 macOS x64/arm64、Linux x64/arm64、Windows x64。
31
31
 
32
32
  ## 2. 初始化配置目录
33
33
 
package/README.md CHANGED
@@ -11,8 +11,8 @@ MySQL · PostgreSQL · Redis · Oracle · MongoDB · 只读模式 · 命令黑
11
11
  <img src="https://img.shields.io/badge/License-MIT-green" alt="License MIT">
12
12
  <img src="https://img.shields.io/badge/Node.js-%3E%3D20-339933?logo=node.js&logoColor=white" alt="Node.js >=20">
13
13
  <img src="https://img.shields.io/badge/npm-%3E%3D10-CB3837?logo=npm&logoColor=white" alt="npm >=10">
14
- <img src="https://img.shields.io/badge/Windows-MacOS-0078D6?labelColor=0078D6&color=C0C0C0" alt="Windows/MacOS">
15
- <img src="https://img.shields.io/badge/release-v0.2.6-blue" alt="release v0.2.6">
14
+ <img src="https://img.shields.io/badge/sys-win%2Fmac%2Flinux-0078D6" alt="sys win/mac/linux">
15
+ <img src="https://img.shields.io/badge/release-v0.2.12-blue" alt="release v0.2.12">
16
16
  </p>
17
17
 
18
18
  [AI 一键安装](#ai-一键安装) · [安装](#安装) · [配置](#配置) · [权限配置](#权限配置) · [Oracle SQLcl](#oracle-sqlcl) · [许可证](#许可证) · [友情链接](#友情链接)
@@ -31,22 +31,19 @@ MySQL · PostgreSQL · Redis · Oracle · MongoDB · 只读模式 · 命令黑
31
31
  - 对指定数据库执行 SQL、Redis 命令或 MongoDB JSON 命令
32
32
  - 查询数据库元信息,例如表、列、集合、Redis keys
33
33
  - 按单个数据库配置启用只读模式和命令黑名单
34
- - CLI 按需自动启动本地 daemon;daemon 默认空闲 `300` 秒后自动退出
35
- - 通过本地 daemon 保持连接,单个数据库连接默认空闲 `180` 秒后释放
36
- - Oracle 可在 `oracledb` 和 SQLcl 两种连接方式之间切换
34
+ - Oracle 默认使用 SQLcl;需要 Oracle Instant Client 时可显式切换到 `oracle`/`oracledb` 原生驱动
37
35
  - 不保存或输出脱敏前的密码、token、secret
38
- - daemon 在 Windows 使用 named pipe,在 macOS/Linux 使用 Unix socket
39
36
 
40
37
  驱动配置表:
41
38
 
42
- | 数据库 | `type` | 默认驱动 | 驱动切换配置 | 通用配置 |
43
- | --- | --- | --- | --- | --- |
44
- | MySQL | `mysql` | npm `mysql2` | 暂不支持切换 | `readonly`、`blacklist`、`keepAliveSeconds` |
45
- | PostgreSQL | `postgres` | npm `pg` | 暂不支持切换 | `readonly`、`blacklist`、`keepAliveSeconds` |
46
- | Redis 单机 | `redis` | npm `redis` | 仅配置 `url` | `readonly`、`blacklist`、`keepAliveSeconds` |
47
- | Redis 集群 | `redis` | npm `redis` | 同时配置 `url` 和 `redisCluster.nodes` | `readonly`、`blacklist`、`keepAliveSeconds` |
48
- | Oracle | `oracle` | npm 包 `oracledb` | `oracleDriver: "oracledb" \| "sqlcl"`,SQLcl 模式可配 `sqlclPath`、`javaHome`,低版本 Oracle 建议使用 SQLcl 驱动 | `readonly`、`blacklist`、`keepAliveSeconds` |
49
- | MongoDB | `mongodb` | npm `mongodb` | 暂不支持切换;可配 `database` 指定默认库 | `readonly`、`blacklist`、`keepAliveSeconds` |
39
+ | 数据库 | `type` | 默认驱动 | 驱动切换配置 |
40
+ | --- | --- | --- | --- |
41
+ | MySQL | `mysql` | Rust 原生驱动 `mysql_async` | 暂不支持切换 |
42
+ | PostgreSQL | `postgres` | Rust 原生驱动 `tokio-postgres` | 暂不支持切换 |
43
+ | Redis 单机 | `redis` | Rust 原生驱动 `redis` | 仅配置 `url` |
44
+ | Redis 集群 | `redis` | Rust 原生驱动 `redis` | 同时配置 `url` 和 `redisCluster.nodes` |
45
+ | Oracle | `oracle` | SQLcl | 支持两种驱动:默认 SQLcl (需要自行安装);可切换oracledb(需要 Oracle Instant Client) |
46
+ | MongoDB | `mongodb` | Rust 原生驱动 `mongodb` | 暂不支持切换;可配 `database` 指定默认库 |
50
47
 
51
48
  ## 安装
52
49
 
@@ -54,9 +51,12 @@ MySQL · PostgreSQL · Redis · Oracle · MongoDB · 只读模式 · 命令黑
54
51
 
55
52
  - Node.js `>= 20`
56
53
  - npm `>= 10`
54
+ - 系统支持 Windows / macOS / Linux
55
+ - 安装时会自动拉取对应平台的 Rust 二进制子包,当前支持 macOS x64/arm64、Linux x64/arm64、Windows x64
57
56
  - 本机网络可访问目标数据库
58
57
  - 如使用 Docker 集成测试,需要 Docker 和 Docker Compose
59
- - 如 Oracle 使用 SQLcl,需要本机可运行 SQLcl 和 Java
58
+ - 如 Oracle 使用 SQLcl,需要本机可运行 SQLcl 和 Java21
59
+
60
60
 
61
61
  ### AI 一键安装
62
62
 
@@ -98,51 +98,61 @@ agent-database-cli --help
98
98
  AGENT_DATABASE_CLI_CONFIG=/path/to/config.json agent-database-cli list
99
99
  ```
100
100
 
101
- 配置文件是一个对象,`databases` 中每个 key 是一个数据库连接名:
102
-
103
- - `type`: 数据库类型,支持 `mysql`、`postgres`、`redis`、`oracle`、`mongodb`
104
- - `url`: 数据库连接 URL;Redis 单机模式直接连接该地址,Redis 集群模式下作为入口节点 URL
105
- - `redisCluster`: Redis 集群配置,可选;配置后会使用集群模式连接
106
- - `sshTunnel`: SSH 隧道配置,可选;单机模式会转发数据库 URL host/port,Redis 集群模式会为每个节点分别建立本地转发
107
- - `database`: MongoDB 默认数据库名,可选
108
- - `readonly`: 是否启用只读模式,默认 `true`;仅在明确需要写入时才建议显式设为 `false`
109
- - `blacklist`: 命令黑名单数组,大小写不敏感
110
- - `keepAliveSeconds`: 单个数据库连接空闲释放秒数,默认 `180`
111
- - `oracleDriver`: Oracle 驱动,支持 `oracledb` `sqlcl`
112
- - `sqlclPath`: SQLcl 可执行文件路径,仅 `oracleDriver: "sqlcl"` 时使用
113
- - `javaHome`: SQLcl 使用的 `JAVA_HOME`,可选
114
-
115
- `redisCluster` 目前支持以下字段:
116
-
117
- - `nodes`: Redis 集群节点 URL 数组,至少配置一个,支持 `redis://` `rediss://`
118
-
119
- Redis 集群补充说明:
120
-
121
- - 当前实现里,Redis 集群模式必须同时配置 `url` `redisCluster.nodes`
122
- - `url` 用作集群入口节点,建议填写任意一个稳定可达的集群节点 URL
123
- - `redisCluster.nodes` 用作集群节点清单;如走 SSH 隧道,也用于为每个节点建立本地转发和地址映射
124
- - 配置 `redisCluster.nodes` 后会切换到 Redis Cluster 模式
125
- - 如同时配置 `sshTunnel`,程序会给每个集群节点分别建立本地端口转发,并通过地址映射接管集群节点跳转
126
- - 走 SSH 隧道时,`redisCluster.nodes` 需要覆盖客户端实际可能访问到的集群节点地址
127
-
128
- `sshTunnel` 支持密码、私钥、密码加私钥、带通行短语的私钥认证:
129
-
130
- - `host`: SSH 跳板机地址
131
- - `port`: SSH 端口,默认 `22`
132
- - `username`: SSH 用户名
133
- - `password`: SSH 密码,可选
134
- - `privateKeyPath`: 私钥文件路径,可选,支持 `~`
135
- - `privateKey`: 私钥内容,可选,和 `privateKeyPath` 二选一
136
- - `passphrase`: 私钥通行短语,可选,仅配置私钥时允许使用
137
- - `readyTimeout`: SSH 连接超时时间,单位毫秒,可选
138
-
139
- 黑名单和只读模式兼容,优先级固定为:先检查黑名单,命中直接拒绝;未命中再检查只读模式。
140
-
141
- 只读模式说明:
142
-
143
- - 默认启用只读模式,未显式配置 `readonly` 时也会拒绝写操作
144
- - 建议所有数据库连接默认保持只读,需要变更数据时,让 AI 先给出对应 SQL 或命令,再由你确认后执行
145
- - 如果某个连接确实需要写入,再单独将该连接配置为 `readonly: false`
101
+ 配置文件是一个对象,`databases` 中每个 key 是一个数据库连接名。
102
+
103
+ 连接配置:
104
+
105
+ | 字段 | 适用范围 | 默认值 | 说明 |
106
+ | --- | --- | --- | --- |
107
+ | `type` | 全部数据库 | 无 | 数据库类型,支持 `mysql`、`postgres`、`redis`、`oracle`、`mongodb` |
108
+ | `url` | 全部数据库 | 无 | 数据库连接 URL;Redis 单机模式直接连接该地址,Redis 集群模式下作为入口节点 URL |
109
+ | `database` | MongoDB | 无 | MongoDB 默认数据库名 |
110
+ | `oracleDriver` | Oracle | `sqlcl` | Oracle 驱动:`sqlcl` 或原生驱动 |
111
+ | `sqlclPath` | Oracle SQLcl | | SQLcl 可执行文件路径,仅 `oracleDriver: "sqlcl"` 时使用 |
112
+ | `javaHome` | Oracle SQLcl | | SQLcl 使用的 `JAVA_HOME` |
113
+ | `redisCluster` | Redis | 无 | Redis 集群配置,配置后会使用 Redis Cluster 模式 |
114
+ | `sshTunnel` | 全部数据库 | 无 | SSH 隧道配置;单机模式转发数据库 URL 的 host/port,Redis 集群模式为每个节点分别建立本地转发 |
115
+ | `readonly` | 全部数据库 | `true` | 是否启用只读模式;仅在明确需要写入时才建议显式设为 `false` |
116
+ | `blacklist` | 全部数据库 | 无 | 命令黑名单数组,大小写不敏感 |
117
+ | `keepAliveSeconds` | 全部数据库 | `180` | 单个数据库连接空闲释放秒数 |
118
+
119
+ Redis 集群配置:
120
+
121
+ | 字段 | 默认值 | 说明 |
122
+ | --- | --- | --- |
123
+ | `nodes` | | Redis 集群节点 URL 数组,至少配置一个,支持 `redis://` 和 `rediss://` |
124
+
125
+ Redis 集群使用规则:
126
+
127
+ | 场景 | 要求 |
128
+ | --- | --- |
129
+ | 启用集群模式 | 必须同时配置 `url` 和 `redisCluster.nodes` |
130
+ | `url` | 用作集群入口节点,建议填写任意一个稳定可达的集群节点 URL |
131
+ | `redisCluster.nodes` | 用作集群节点清单;如走 SSH 隧道,也用于为每个节点建立本地转发和地址映射 |
132
+ | 同时配置 `sshTunnel` | 程序会给每个集群节点分别建立本地端口转发,并通过地址映射接管集群节点跳转 |
133
+ | 通过 SSH 隧道访问集群 | `redisCluster.nodes` 需要覆盖客户端实际可能访问到的集群节点地址 |
134
+
135
+ SSH 隧道配置支持密码、私钥、密码加私钥、带通行短语的私钥认证。
136
+
137
+ | 字段 | 默认值 | 说明 |
138
+ | --- | --- | --- |
139
+ | `host` | 无 | SSH 跳板机地址 |
140
+ | `port` | `22` | SSH 端口 |
141
+ | `username` | 无 | SSH 用户名 |
142
+ | `password` | 无 | SSH 密码,可选 |
143
+ | `privateKeyPath` | 无 | 私钥文件路径,可选,支持 `~` |
144
+ | `privateKey` | | 私钥内容,可选,和 `privateKeyPath` 二选一 |
145
+ | `passphrase` | 无 | 私钥通行短语,可选,仅配置私钥时允许使用 |
146
+ | `readyTimeout` | 无 | SSH 连接超时时间,单位毫秒,可选 |
147
+
148
+ 安全策略:
149
+
150
+ | 策略 | 说明 |
151
+ | --- | --- |
152
+ | 检查优先级 | 先检查黑名单,命中直接拒绝;未命中再检查只读模式 |
153
+ | 只读默认值 | 默认启用只读模式,未显式配置 `readonly` 时也会拒绝写操作 |
154
+ | 推荐用法 | 所有数据库连接默认保持只读,需要变更数据时,让 AI 先给出对应 SQL 或命令,再由你确认后执行 |
155
+ | 写入配置 | 某个连接确实需要写入时,再单独将该连接配置为 `readonly: false` |
146
156
 
147
157
  参考配置:
148
158
 
@@ -297,11 +307,21 @@ MongoDB 常见高危命令:
297
307
  }
298
308
  ```
299
309
 
310
+
311
+ Oracle 保留双驱动设计:
312
+
313
+ - 不配置 `oracleDriver`:默认 SQLcl。
314
+ - `oracleDriver: "sqlcl"`:显式使用 SQLcl,适合 Oracle 11 等老库、无法安装 Instant Client 或原生驱动兼容性不稳定的环境。
315
+ - `oracleDriver: "oracle"`:显式使用 Rust Oracle 原生驱动,依赖 Oracle Instant Client / ODPI-C。
316
+ - `oracleDriver: "oracledb"`:Node 版原生驱动兼容值;Rust 版按 `oracle` 原生入口处理。
317
+
318
+ 当前默认入口已切换为 Rust 原生 CLI,并通过 npm 平台子包分发 Windows、Linux、macOS 二进制;Oracle 默认 SQLcl,原生 Oracle 驱动需显式配置。
319
+
300
320
  ## Oracle SQLcl
301
321
 
302
322
  官方链接:https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/
303
323
 
304
- Oracle 默认使用 npm `oracledb`。如果目标 Oracle 版本较老,可能出现 Thin mode 不兼容错误,例如 `NJS-138`。此时可以将单个 Oracle 配置切换为 SQLcl:
324
+ Oracle 默认使用 SQLcl,避免默认依赖 Oracle Instant Client,也更适合 Oracle 11 等老库。可以不配置 `oracleDriver`,或显式配置为 SQLcl:
305
325
 
306
326
  ```json
307
327
  {
package/README_EN.md CHANGED
@@ -11,8 +11,8 @@ MySQL · PostgreSQL · Redis · Oracle · MongoDB · Read-only mode · Command b
11
11
  <img src="https://img.shields.io/badge/License-MIT-green" alt="License MIT">
12
12
  <img src="https://img.shields.io/badge/Node.js-%3E%3D20-339933?logo=node.js&logoColor=white" alt="Node.js >=20">
13
13
  <img src="https://img.shields.io/badge/npm-%3E%3D10-CB3837?logo=npm&logoColor=white" alt="npm >=10">
14
- <img src="https://img.shields.io/badge/Windows-MacOS-0078D6?labelColor=0078D6&color=C0C0C0" alt="Windows/MacOS">
15
- <img src="https://img.shields.io/badge/release-v0.2.6-blue" alt="release v0.2.6">
14
+ <img src="https://img.shields.io/badge/sys-win%2Fmac%2Flinux-0078D6" alt="sys win/mac/linux">
15
+ <img src="https://img.shields.io/badge/release-v0.2.12-blue" alt="release v0.2.12">
16
16
  </p>
17
17
 
18
18
  [AI One-Click Installation](#ai-one-click-installation) · [Installation](#installation) · [Configuration](#configuration) · [Permission Configuration](#permission-configuration) · [Oracle SQLcl](#oracle-sqlcl) · [License](#license) · [Friendly Links](#friendly-links)
@@ -33,7 +33,7 @@ What it can do:
33
33
  - Enable read-only mode and command blocklists per database configuration
34
34
  - Auto-start the local daemon on demand; the daemon exits after `300` idle seconds by default
35
35
  - Keep connections alive through the local daemon; each database connection is released after `180` idle seconds by default
36
- - Switch Oracle between `oracledb` and SQLcl drivers
36
+ - Oracle uses SQLcl by default; native `oracle`/`oracledb` drivers can be selected explicitly when Oracle Instant Client is available
37
37
  - Never store or print unmasked passwords, tokens, or secrets
38
38
  - Use named pipes on Windows and Unix sockets on macOS/Linux for the daemon
39
39
 
@@ -41,12 +41,12 @@ Driver configuration table:
41
41
 
42
42
  | Database | `type` | Default driver | Driver switch configuration | Common configuration |
43
43
  | --- | --- | --- | --- | --- |
44
- | MySQL | `mysql` | npm package `mysql2` | Not switchable yet | `readonly`, `blacklist`, `keepAliveSeconds` |
45
- | PostgreSQL | `postgres` | npm package `pg` | Not switchable yet | `readonly`, `blacklist`, `keepAliveSeconds` |
46
- | Redis standalone | `redis` | npm package `redis` | Configure `url` only | `readonly`, `blacklist`, `keepAliveSeconds` |
47
- | Redis cluster | `redis` | npm package `redis` | Configure both `url` and `redisCluster.nodes` | `readonly`, `blacklist`, `keepAliveSeconds` |
48
- | Oracle | `oracle` | npm package `oracledb` | `oracleDriver: "oracledb" \| "sqlcl"`; SQLcl mode can configure `sqlclPath` and `javaHome`. SQLcl is recommended for older Oracle versions | `readonly`, `blacklist`, `keepAliveSeconds` |
49
- | MongoDB | `mongodb` | npm package `mongodb` | Not switchable yet; `database` can be configured as the default database | `readonly`, `blacklist`, `keepAliveSeconds` |
44
+ | MySQL | `mysql` | Native Rust driver `mysql_async` | Not switchable yet | `readonly`, `blacklist`, `keepAliveSeconds` |
45
+ | PostgreSQL | `postgres` | Native Rust driver `tokio-postgres` | Not switchable yet | `readonly`, `blacklist`, `keepAliveSeconds` |
46
+ | Redis standalone | `redis` | Native Rust driver `redis` | Configure `url` only | `readonly`, `blacklist`, `keepAliveSeconds` |
47
+ | Redis cluster | `redis` | Native Rust driver `redis` | Configure both `url` and `redisCluster.nodes` | `readonly`, `blacklist`, `keepAliveSeconds` |
48
+ | Oracle | `oracle` | SQLcl | `oracleDriver: "sqlcl" \| "oracle" \| "oracledb"`; defaults to SQLcl when omitted. Native drivers require Oracle Instant Client | `readonly`, `blacklist`, `keepAliveSeconds` |
49
+ | MongoDB | `mongodb` | Native Rust driver `mongodb` | Not switchable yet; `database` can be configured as the default database | `readonly`, `blacklist`, `keepAliveSeconds` |
50
50
 
51
51
  ## Installation
52
52
 
@@ -54,10 +54,23 @@ Driver configuration table:
54
54
 
55
55
  - Node.js `>= 20`
56
56
  - npm `>= 10`
57
+ - System support: Windows / macOS / Linux
58
+ - The matching Rust binary subpackage is installed automatically for your platform. Supported targets: macOS x64/arm64, Linux x64/arm64, Windows x64
57
59
  - Local network access to the target database
58
60
  - Docker and Docker Compose if you run integration tests
59
61
  - SQLcl and Java installed locally if Oracle uses SQLcl
60
62
 
63
+ Supported platform subpackages:
64
+
65
+ | OS | Architecture | npm subpackage | Rust target |
66
+ | --- | --- | --- | --- |
67
+ | macOS | arm64 | `@agent-database-cli/darwin-arm64` | `aarch64-apple-darwin` |
68
+ | macOS | x64 | `@agent-database-cli/darwin-x64` | `x86_64-apple-darwin` |
69
+ | Linux | arm64 | `@agent-database-cli/linux-arm64` | `aarch64-unknown-linux-gnu` |
70
+ | Linux | x64 | `@agent-database-cli/linux-x64` | `x86_64-unknown-linux-gnu` |
71
+ | Windows | x64 | `@agent-database-cli/win32-x64` | `x86_64-pc-windows-msvc` |
72
+
73
+
61
74
  ### AI One-Click Installation
62
75
 
63
76
  ```text
@@ -108,7 +121,7 @@ The configuration file is an object. Each key under `databases` is a database co
108
121
  - `readonly`: Whether read-only mode is enabled, default `true`; only explicitly set `false` when write access is really required
109
122
  - `blacklist`: Command blocklist array, case-insensitive
110
123
  - `keepAliveSeconds`: Idle release timeout in seconds for a single database connection, default `180`
111
- - `oracleDriver`: Oracle driver, supports `oracledb` or `sqlcl`
124
+ - `oracleDriver`: Oracle driver, supports `sqlcl`, `oracle`, or `oracledb`; defaults to `sqlcl` when omitted
112
125
  - `sqlclPath`: SQLcl executable path, used only when `oracleDriver` is `sqlcl`
113
126
  - `javaHome`: Optional `JAVA_HOME` used by SQLcl
114
127
 
@@ -300,7 +313,7 @@ Recommended for a dedicated writable connection:
300
313
 
301
314
  Official link: https://www.oracle.com/database/sqldeveloper/technologies/sqlcl/
302
315
 
303
- Oracle uses the npm package `oracledb` by default. If the target Oracle version is older, Thin mode compatibility errors such as `NJS-138` may appear. In that case, switch a single Oracle connection to SQLcl:
316
+ Oracle uses SQLcl by default, avoiding a mandatory Oracle Instant Client dependency and improving compatibility with older Oracle versions such as Oracle 11. You may omit `oracleDriver` or set it explicitly:
304
317
 
305
318
  ```json
306
319
  {
@@ -332,6 +345,19 @@ npm cache clean --force
332
345
  rm -rf ~/.agent-database-cli
333
346
  ```
334
347
 
348
+
349
+ ## Rust refactor notes
350
+
351
+ A Rust CLI scaffold has been added. The current binary is `agent-database-cli`:
352
+
353
+ ```bash
354
+ npm run build:rust
355
+ npm run dev:rust -- list
356
+ npm run dev:rust -- daemon status
357
+ ```
358
+
359
+ Oracle keeps two first-class drivers: omitting `oracleDriver` uses SQLcl; native `oracle`/`oracledb` drivers remain available when Oracle Instant Client is installed. The default entry is now the native Rust CLI. Windows, Linux and macOS binaries are distributed through npm platform subpackages. Oracle defaults to SQLcl; native Oracle drivers must be selected explicitly.
360
+
335
361
  ## License
336
362
 
337
363
  [MIT](LICENSE)
package/SKILL.md CHANGED
@@ -17,7 +17,8 @@ description: 使用本地 agent-database-cli 安全操作已配置的数据库
17
17
  - 普通命令会按需自动启动本地 daemon,daemon 默认空闲 `300` 秒后自动退出
18
18
  - 通过本地 daemon 短时间保持连接,单个数据库连接默认空闲 `180` 秒释放
19
19
  - daemon 在 Windows 使用 named pipe,在 macOS/Linux 使用 Unix socket
20
- - Oracle 支持 `oracledb` SQLcl 两种连接方式
20
+ - 预编译二进制支持 macOS x64/arm64、Linux x64/arm64、Windows x64
21
+ - Oracle 默认使用 SQLcl;显式配置 `oracleDriver: "oracle"` 或 `"oracledb"` 时使用原生 Oracle 驱动
21
22
 
22
23
  它不做的事:
23
24
 
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { spawnSync } from "node:child_process";
6
+
7
+ const packageByPlatform = {
8
+ "darwin-arm64": "@agent-database-cli/darwin-arm64",
9
+ "darwin-x64": "@agent-database-cli/darwin-x64",
10
+ "linux-x64": "@agent-database-cli/linux-x64",
11
+ "linux-arm64": "@agent-database-cli/linux-arm64",
12
+ "win32-x64": "@agent-database-cli/win32-x64"
13
+ };
14
+
15
+ const key = `${process.platform}-${process.arch}`;
16
+ const packageName = packageByPlatform[key];
17
+ if (!packageName) {
18
+ console.error(`agent-database-cli 暂不支持当前平台: ${key}`);
19
+ process.exit(1);
20
+ }
21
+
22
+ const currentDir = dirname(fileURLToPath(import.meta.url));
23
+ const executableName = process.platform === "win32" ? "agent-database-cli.exe" : "agent-database-cli";
24
+ const packageRoot = join(currentDir, "..");
25
+ const installRoot = join(packageRoot, "..");
26
+
27
+ const candidateExecutablePaths = [
28
+ // npm 正常安装时,平台子包与主包同级位于 node_modules/@agent-database-cli/*。
29
+ join(installRoot, packageName, "bin", executableName),
30
+ // 兼容极少数包管理器把 optionalDependencies 嵌套到主包 node_modules 的布局。
31
+ join(packageRoot, "node_modules", packageName, "bin", executableName)
32
+ ];
33
+
34
+ const repoFallback = join(currentDir, "..", "target", "release", executableName);
35
+ const devFallback = join(currentDir, "..", "target", "debug", executableName);
36
+ const packagedExecutablePath = candidateExecutablePaths.find((candidate) => existsSync(candidate));
37
+ const finalExecutablePath = packagedExecutablePath
38
+ ?? (existsSync(repoFallback)
39
+ ? repoFallback
40
+ : existsSync(devFallback)
41
+ ? devFallback
42
+ : undefined);
43
+
44
+ if (!finalExecutablePath) {
45
+ console.error(`未找到平台二进制: ${packageName}`);
46
+ console.error("请重新安装 agent-database-cli,确保 optionalDependencies 没有被禁用。");
47
+ process.exit(1);
48
+ }
49
+
50
+ const result = spawnSync(finalExecutablePath, process.argv.slice(2), { stdio: "inherit" });
51
+ if (result.error) {
52
+ console.error(result.error.message);
53
+ process.exit(1);
54
+ }
55
+ process.exit(result.status ?? 0);
package/package.json CHANGED
@@ -1,22 +1,21 @@
1
1
  {
2
2
  "name": "agent-database-cli",
3
- "version": "0.2.7",
3
+ "version": "0.2.15",
4
4
  "description": "统一数据库命令行工具,支持只读、黑名单和本地连接守护进程。",
5
5
  "type": "module",
6
6
  "bin": {
7
- "agent-database-cli": "dist/cli.js"
7
+ "agent-database-cli": "bin/agent-database-cli.js"
8
8
  },
9
9
  "scripts": {
10
- "build": "tsc -p tsconfig.json",
11
- "dev": "tsx src/cli.ts",
12
- "prepack": "npm run build",
13
- "test": "vitest run",
14
- "test:unit": "vitest run tests/unit",
15
- "test:integration": "AGENT_DATABASE_CLI_CONFIG=config/docker-test.json vitest run tests/integration --exclude tests/integration/oracle.test.ts",
16
- "test:integration:oracle": "AGENT_DATABASE_CLI_CONFIG=config/docker-test.json vitest run tests/integration/oracle.test.ts"
10
+ "build": "cargo build --release --bin agent-database-cli",
11
+ "build:rust": "cargo build --release --bin agent-database-cli",
12
+ "dev": "cargo run --bin agent-database-cli --",
13
+ "dev:rust": "cargo run --bin agent-database-cli --",
14
+ "test": "cargo test",
15
+ "check": "cargo check --bin agent-database-cli"
17
16
  },
18
17
  "files": [
19
- "dist",
18
+ "bin",
20
19
  "README.md",
21
20
  "README_EN.md",
22
21
  "AI_INSTALL.md",
@@ -24,27 +23,21 @@
24
23
  "LICENSE",
25
24
  "config/docker-test.json"
26
25
  ],
26
+ "optionalDependencies": {
27
+ "@agent-database-cli/darwin-arm64": "0.2.15",
28
+ "@agent-database-cli/darwin-x64": "0.2.15",
29
+ "@agent-database-cli/linux-arm64": "0.2.15",
30
+ "@agent-database-cli/linux-x64": "0.2.15",
31
+ "@agent-database-cli/win32-x64": "0.2.15"
32
+ },
27
33
  "publishConfig": {
28
34
  "access": "public"
29
35
  },
30
- "dependencies": {
31
- "commander": "^12.1.0",
32
- "mongodb": "^6.20.0",
33
- "mysql2": "^3.15.3",
34
- "oracledb": "^6.10.0",
35
- "pg": "^8.16.3",
36
- "redis": "^4.7.1",
37
- "ssh2": "^1.17.0"
38
- },
39
- "devDependencies": {
40
- "@types/node": "^22.10.2",
41
- "@types/pg": "^8.15.5",
42
- "@types/ssh2": "^1.15.5",
43
- "tsx": "^4.20.6",
44
- "typescript": "^5.9.3",
45
- "vitest": "^2.1.9"
46
- },
47
36
  "engines": {
48
37
  "node": ">=20"
38
+ },
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "https://github.com/sleepinginsummer/agent-database-cli"
49
42
  }
50
43
  }
@@ -1,12 +0,0 @@
1
- import type { DatabaseAdapter, MetadataRequest, QueryResult } from "../types.js";
2
- export declare abstract class BaseSqlAdapter implements DatabaseAdapter {
3
- protected connected: boolean;
4
- abstract connect(): Promise<void>;
5
- abstract disconnect(): Promise<void>;
6
- abstract execute(command: string): Promise<QueryResult>;
7
- protected abstract listTables(): Promise<QueryResult>;
8
- protected abstract listColumns(table: string): Promise<QueryResult>;
9
- test(): Promise<void>;
10
- metadata(request: MetadataRequest): Promise<QueryResult>;
11
- protected testQuery(): string;
12
- }
@@ -1,22 +0,0 @@
1
- export class BaseSqlAdapter {
2
- connected = false;
3
- async test() {
4
- await this.execute(this.testQuery());
5
- }
6
- async metadata(request) {
7
- if (request.type === "tables") {
8
- return this.listTables();
9
- }
10
- if (request.type === "columns") {
11
- if (!request.table) {
12
- throw new Error("columns 元信息查询必须提供 --table");
13
- }
14
- return this.listColumns(request.table);
15
- }
16
- throw new Error(`当前数据库不支持元信息类型: ${request.type}`);
17
- }
18
- testQuery() {
19
- return "select 1";
20
- }
21
- }
22
- //# sourceMappingURL=base-sql.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-sql.js","sourceRoot":"","sources":["../../src/adapters/base-sql.ts"],"names":[],"mappings":"AAEA,MAAM,OAAgB,cAAc;IACxB,SAAS,GAAG,KAAK,CAAC;IAQ5B,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAES,SAAS;QACjB,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
@@ -1,2 +0,0 @@
1
- import type { DatabaseAdapter, DatabaseConfig } from "../types.js";
2
- export declare function createAdapter(config: DatabaseConfig, url?: string): DatabaseAdapter;
@@ -1,26 +0,0 @@
1
- import { MongoDbAdapter } from "./mongodb.js";
2
- import { MySqlAdapter } from "./mysql.js";
3
- import { OracleAdapter } from "./oracle.js";
4
- import { OracleSqlclAdapter } from "./oracle-sqlcl.js";
5
- import { PostgresAdapter } from "./postgres.js";
6
- import { RedisAdapter } from "./redis.js";
7
- export function createAdapter(config, url = config.url) {
8
- switch (config.type) {
9
- case "mysql":
10
- return new MySqlAdapter(url);
11
- case "postgres":
12
- return new PostgresAdapter(url);
13
- case "redis":
14
- return new RedisAdapter(url, config.redisCluster);
15
- case "oracle":
16
- if (config.oracleDriver === "sqlcl") {
17
- return new OracleSqlclAdapter(url, config.sqlclPath, config.javaHome);
18
- }
19
- return new OracleAdapter(url);
20
- case "mongodb":
21
- return new MongoDbAdapter(url, config.database);
22
- default:
23
- throw new Error(`不支持的数据库类型: ${config.type}`);
24
- }
25
- }
26
- //# sourceMappingURL=factory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/adapters/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,UAAU,aAAa,CAAC,MAAsB,EAAE,GAAG,GAAG,MAAM,CAAC,GAAG;IACpE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QAC/B,KAAK,UAAU;YACb,OAAO,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;QAClC,KAAK,OAAO;YACV,OAAO,IAAI,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QACpD,KAAK,QAAQ;YACX,IAAI,MAAM,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;gBACpC,OAAO,IAAI,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;QAChC,KAAK,SAAS;YACZ,OAAO,IAAI,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClD;YACE,MAAM,IAAI,KAAK,CAAC,cAAe,MAAyB,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
@@ -1,14 +0,0 @@
1
- import type { DatabaseAdapter, MetadataRequest, QueryResult } from "../types.js";
2
- export declare class MongoDbAdapter implements DatabaseAdapter {
3
- private readonly url;
4
- private readonly database?;
5
- private client?;
6
- private db?;
7
- constructor(url: string, database?: string | undefined);
8
- connect(): Promise<void>;
9
- disconnect(): Promise<void>;
10
- test(): Promise<void>;
11
- execute(command: string): Promise<QueryResult>;
12
- metadata(request: MetadataRequest): Promise<QueryResult>;
13
- private runOperation;
14
- }