agent-database-cli 0.2.7 → 0.2.14
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/AI_INSTALL.md +1 -1
- package/README.md +81 -61
- package/README_EN.md +37 -11
- package/SKILL.md +2 -1
- package/bin/agent-database-cli.js +55 -0
- package/package.json +20 -27
- package/dist/adapters/base-sql.d.ts +0 -12
- package/dist/adapters/base-sql.js +0 -22
- package/dist/adapters/base-sql.js.map +0 -1
- package/dist/adapters/factory.d.ts +0 -2
- package/dist/adapters/factory.js +0 -26
- package/dist/adapters/factory.js.map +0 -1
- package/dist/adapters/mongodb.d.ts +0 -14
- package/dist/adapters/mongodb.js +0 -137
- package/dist/adapters/mongodb.js.map +0 -1
- package/dist/adapters/mysql.d.ts +0 -12
- package/dist/adapters/mysql.js +0 -38
- package/dist/adapters/mysql.js.map +0 -1
- package/dist/adapters/oracle-sqlcl.d.ts +0 -19
- package/dist/adapters/oracle-sqlcl.js +0 -334
- package/dist/adapters/oracle-sqlcl.js.map +0 -1
- package/dist/adapters/oracle.d.ts +0 -13
- package/dist/adapters/oracle.js +0 -47
- package/dist/adapters/oracle.js.map +0 -1
- package/dist/adapters/postgres.d.ts +0 -12
- package/dist/adapters/postgres.js +0 -40
- package/dist/adapters/postgres.js.map +0 -1
- package/dist/adapters/redis.d.ts +0 -15
- package/dist/adapters/redis.js +0 -91
- package/dist/adapters/redis.js.map +0 -1
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +0 -118
- package/dist/cli.js.map +0 -1
- package/dist/config.d.ts +0 -8
- package/dist/config.js +0 -147
- package/dist/config.js.map +0 -1
- package/dist/connection-manager.d.ts +0 -24
- package/dist/connection-manager.js +0 -91
- package/dist/connection-manager.js.map +0 -1
- package/dist/daemon/client.d.ts +0 -3
- package/dist/daemon/client.js +0 -33
- package/dist/daemon/client.js.map +0 -1
- package/dist/daemon/config-manager.d.ts +0 -15
- package/dist/daemon/config-manager.js +0 -44
- package/dist/daemon/config-manager.js.map +0 -1
- package/dist/daemon/control.d.ts +0 -9
- package/dist/daemon/control.js +0 -53
- package/dist/daemon/control.js.map +0 -1
- package/dist/daemon/paths.d.ts +0 -5
- package/dist/daemon/paths.js +0 -18
- package/dist/daemon/paths.js.map +0 -1
- package/dist/daemon/server.d.ts +0 -1
- package/dist/daemon/server.js +0 -119
- package/dist/daemon/server.js.map +0 -1
- package/dist/output.d.ts +0 -2
- package/dist/output.js +0 -39
- package/dist/output.js.map +0 -1
- package/dist/runtime.d.ts +0 -5
- package/dist/runtime.js +0 -25
- package/dist/runtime.js.map +0 -1
- package/dist/security.d.ts +0 -8
- package/dist/security.js +0 -239
- package/dist/security.js.map +0 -1
- package/dist/ssh-tunnel.d.ts +0 -8
- package/dist/ssh-tunnel.js +0 -231
- package/dist/ssh-tunnel.js.map +0 -1
- package/dist/types.d.ts +0 -69
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils/masking.d.ts +0 -2
- package/dist/utils/masking.js +0 -14
- package/dist/utils/masking.js.map +0 -1
package/AI_INSTALL.md
CHANGED
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/
|
|
15
|
-
<img src="https://img.shields.io/badge/release-v0.2.
|
|
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
|
-
-
|
|
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` |
|
|
45
|
-
| PostgreSQL | `postgres` |
|
|
46
|
-
| Redis 单机 | `redis` |
|
|
47
|
-
| Redis 集群 | `redis` |
|
|
48
|
-
| Oracle | `oracle` |
|
|
49
|
-
| MongoDB | `mongodb` |
|
|
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 | `oracleDriver: "sqlcl" \| "oracle" \| "oracledb"`;不配置时默认 SQLcl,SQLcl 模式可配 `sqlclPath`、`javaHome`;原生驱动需要 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 和
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
`
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
Redis
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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`、`oracle` 或 `oracledb`;默认 SQLcl,不需要 Oracle Instant Client;只有明确要使用原生驱动时才配置 `oracle`/`oracledb` |
|
|
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 默认使用
|
|
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/
|
|
15
|
-
<img src="https://img.shields.io/badge/release-v0.2.
|
|
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
|
-
-
|
|
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` |
|
|
45
|
-
| PostgreSQL | `postgres` |
|
|
46
|
-
| Redis standalone | `redis` |
|
|
47
|
-
| Redis cluster | `redis` |
|
|
48
|
-
| Oracle | `oracle` |
|
|
49
|
-
| MongoDB | `mongodb` |
|
|
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 `
|
|
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
|
|
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
|
-
-
|
|
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.
|
|
3
|
+
"version": "0.2.14",
|
|
4
4
|
"description": "统一数据库命令行工具,支持只读、黑名单和本地连接守护进程。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"agent-database-cli": "
|
|
7
|
+
"agent-database-cli": "bin/agent-database-cli.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
|
-
"build": "
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"test
|
|
15
|
-
"
|
|
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
|
-
"
|
|
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.14",
|
|
28
|
+
"@agent-database-cli/darwin-x64": "0.2.14",
|
|
29
|
+
"@agent-database-cli/linux-arm64": "0.2.14",
|
|
30
|
+
"@agent-database-cli/linux-x64": "0.2.14",
|
|
31
|
+
"@agent-database-cli/win32-x64": "0.2.14"
|
|
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"}
|
package/dist/adapters/factory.js
DELETED
|
@@ -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
|
-
}
|