dsh-data-insight 0.1.0 → 0.1.1

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/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/) 约定。
4
4
 
5
+ ## [0.1.1] - 2026-08-16
6
+
7
+ ### 修复
8
+ - DuckDB 直连调用方式(SKILL.md / README):CSV/Parquet 无库查询去掉 `-readonly`——v1.5.5 实测不带库文件时 CLI 打开内存库,`-readonly` 会报 `Cannot launch in-memory database in read-only mode`;`-readonly` 保留用于库文件 / 远程库连接(实测 INSERT 等写语句被拦截)。
9
+
10
+ ### 新增
11
+ - `scripts/setup-duckdb.sh`:macOS/Linux 安装脚本(brew / GitHub release / `~/.local/bin`),与 Windows 版 `setup-duckdb.ps1` 对齐。
12
+ - `test/csv-profile.test.mjs`:csv-profile CLI 契约测试(`node:test` 零依赖,10 例:分隔符探测 / 引号与转义 / 千分位 / 混合类型降级 / 残缺行 / `--limit` / BOM / 退出码),`npm test` 运行。
13
+ - runbook:CLI 缺失时引导运行对应平台的安装脚本。
14
+
5
15
  ## [0.1.0] - 2026-08-16
6
16
 
7
17
  ### 新增
package/README.md CHANGED
@@ -20,7 +20,7 @@ dsh plugin --profile web add dsh-data-insight
20
20
 
21
21
  或手动两步(在目标 profile 目录下):
22
22
 
23
- 1. `package.json` 的 `dependencies` 加 `"dsh-data-insight": "^0.1.0"`;
23
+ 1. `package.json` 的 `dependencies` 加 `"dsh-data-insight": "^0.1.1"`;
24
24
  2. `dsh.profile.bundles` 数组加 `"dsh-data-insight"`。
25
25
 
26
26
  重启 profile 后,技能 `data-insight-runbook` 出现在技能列表即可用。
@@ -47,20 +47,23 @@ dsh-data-insight/
47
47
  ├── docs/chart-spec.md # 三通道图表规范与示例
48
48
  ├── docs/report-template.md # 报告骨架 + 严谨性检查清单
49
49
  ├── scripts/csv-profile.mjs # 零依赖 CSV 探查脚本
50
+ ├── scripts/setup-duckdb.ps1 # DuckDB CLI 安装脚本(Windows)
51
+ ├── scripts/setup-duckdb.sh # DuckDB CLI 安装脚本(macOS/Linux)
50
52
  └── examples/ # 样例 CSV + 样例报告
51
53
  ```
52
54
 
53
55
  ## DuckDB 直连(可选)
54
56
 
55
- 默认零依赖;如需直连数据库,安装 [DuckDB](https://duckdb.org/) 单文件 CLI(加入 PATH):
57
+ 默认零依赖;如需直连数据库,安装 [DuckDB](https://duckdb.org/) 单文件 CLI(加入 PATH)。可使用安装脚本:Windows `scripts/setup-duckdb.ps1`,macOS/Linux `scripts/setup-duckdb.sh`。
56
58
 
57
59
  ```sh
58
- # 连接串走环境变量,强制只读
59
- duckdb -readonly -csv -c "SELECT * FROM read_csv_auto('data.csv') LIMIT 100"
60
+ # CSV/Parquet 直接查:无库文件,不加 -readonly(v1.5.5 实测 -readonly 打不开内存库会报错)
61
+ duckdb -csv -c "SELECT * FROM read_csv_auto('data.csv') LIMIT 100"
62
+ # 库文件 / 远程库:连接串走环境变量,强制只读(POSIX shell 为 "$DATA_INSIGHT_DB_URL")
60
63
  duckdb -readonly -csv -c "SELECT ... LIMIT 5000" "$env:DATA_INSIGHT_DB_URL"
61
64
  ```
62
65
 
63
- 安全红线:一律 `-readonly`;连接串走环境变量 `DATA_INSIGHT_DB_URL`;查询默认 `LIMIT 5000`。
66
+ 安全红线:连接库一律 `-readonly`(写语句会被拦截);连接串走环境变量 `DATA_INSIGHT_DB_URL`;查询默认 `LIMIT 5000`。
64
67
 
65
68
  ## 参考文档
66
69
 
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "dsh-data-insight",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "DSH (DeepSeek Harness) data-insight skill plugin: turn raw data (CSV / pasted table / SQL results / DuckDB) into a structured Markdown report with business conclusions, metrics and charts.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
+ "scripts": {
8
+ "test": "node --test test/csv-profile.test.mjs"
9
+ },
7
10
  "main": "./plugin/index.js",
8
11
  "exports": {
9
12
  ".": "./plugin/index.js",
@@ -0,0 +1,90 @@
1
+ #!/bin/sh
2
+ # setup-duckdb.sh — 安装 DuckDB CLI(可选依赖,用于 dsh-data-insight 直连数据库路径;macOS / Linux)
3
+ #
4
+ # 用法:
5
+ # sh scripts/setup-duckdb.sh # 安装最新稳定版
6
+ # sh scripts/setup-duckdb.sh 1.5.5 # 指定版本
7
+ #
8
+ # 安装位置:$HOME/.local/bin/duckdb,并提示加入 PATH。
9
+ # 安全红线由 runbook 保证:连接库一律 -readonly,连接串走环境变量 DATA_INSIGHT_DB_URL。
10
+
11
+ set -eu
12
+
13
+ VERSION="${1:-}"
14
+
15
+ get_latest_version() {
16
+ v=$(curl -fsSL --max-time 20 https://duckdb.org/data/latest_stable_version.txt 2>/dev/null || true)
17
+ case "$v" in
18
+ [0-9]*.[0-9]*.[0-9]*) echo "$v" ;;
19
+ *) echo "1.5.5" ;;
20
+ esac
21
+ }
22
+
23
+ [ -z "$VERSION" ] && VERSION=$(get_latest_version)
24
+ echo "目标 DuckDB 版本:$VERSION"
25
+
26
+ INSTALL_DIR="$HOME/.local/bin"
27
+ EXE="$INSTALL_DIR/duckdb"
28
+
29
+ # 已安装且版本匹配则跳过
30
+ if [ -x "$EXE" ]; then
31
+ installed=$("$EXE" --version 2>/dev/null | head -n 1 || true)
32
+ case "$installed" in
33
+ "v$VERSION "*|*" $VERSION "*)
34
+ echo "已安装 DuckDB $VERSION($EXE)"
35
+ exit 0
36
+ ;;
37
+ esac
38
+ fi
39
+
40
+ # ── 方案 1:macOS 用 Homebrew ────────────────────────────────────────────────
41
+ if command -v brew >/dev/null 2>&1; then
42
+ echo "尝试 brew 安装 duckdb ..."
43
+ if brew install duckdb; then
44
+ echo "brew 安装完成。验证:"
45
+ duckdb --version
46
+ exit 0
47
+ fi
48
+ echo "brew 安装未成功,回退到直接下载。" >&2
49
+ fi
50
+
51
+ # ── 方案 2:直接下载 GitHub release ─────────────────────────────────────────
52
+ OS=$(uname -s)
53
+ ARCH=$(uname -m)
54
+ case "$OS:$ARCH" in
55
+ Darwin:*) ASSET="duckdb_cli-osx-universal.zip" ;;
56
+ Linux:x86_64) ASSET="duckdb_cli-linux-amd64.zip" ;;
57
+ Linux:arm64|Linux:aarch64) ASSET="duckdb_cli-linux-arm64.zip" ;;
58
+ *)
59
+ echo "不支持的平台:$OS $ARCH。请手动安装:https://duckdb.org/docs/stable/clients/cli/overview" >&2
60
+ exit 1
61
+ ;;
62
+ esac
63
+
64
+ URL="https://github.com/duckdb/duckdb/releases/download/v$VERSION/$ASSET"
65
+ mkdir -p "$INSTALL_DIR"
66
+ TMP=$(mktemp -d)
67
+ trap 'rm -rf "$TMP"' EXIT
68
+
69
+ echo "下载 $URL ..."
70
+ curl -fSL --max-time 120 -o "$TMP/duckdb.zip" "$URL"
71
+
72
+ unzip -o "$TMP/duckdb.zip" -d "$TMP" >/dev/null
73
+ mv "$TMP/duckdb" "$EXE"
74
+ chmod +x "$EXE"
75
+
76
+ # ── PATH 提示(不擅改 shell 配置)──────────────────────────────────────────
77
+ case ":$PATH:" in
78
+ *":$INSTALL_DIR:"*) ;;
79
+ *)
80
+ echo "提示:$INSTALL_DIR 不在 PATH。请在 ~/.profile 或 ~/.zshrc 添加:"
81
+ echo " export PATH=\"\$HOME/.local/bin:\$PATH\""
82
+ ;;
83
+ esac
84
+
85
+ echo "验证安装:"
86
+ "$EXE" --version
87
+ echo ""
88
+ echo "完成。用法示例(只读):"
89
+ echo " duckdb -csv -c \"SELECT * FROM read_csv_auto('data.csv') LIMIT 100\""
90
+ echo " duckdb -readonly -csv -c \"SELECT ... LIMIT 5000\" \"\$DATA_INSIGHT_DB_URL\""
@@ -124,14 +124,16 @@ description: 数据洞察报告:输入原始数据(CSV 文件 / 粘贴表格
124
124
  - 若来自 SQL:记录来源查询(脱敏后写入附录),确认是否已聚合。
125
125
 
126
126
  ### DuckDB 直连
127
- - **启用检测**:`duckdb --version` 可用才走直连;不可用时 CSV/粘贴仍全功能,直连路径明确告知「需安装 DuckDB(见 scripts/setup-duckdb.ps1)」,不静默降级。
127
+ - **启用检测**:`duckdb --version` 可用才走直连;不可用时 CSV/粘贴仍全功能,直连路径明确告知「需安装 DuckDB(Windows:scripts/setup-duckdb.ps1,macOS/Linux:scripts/setup-duckdb.sh)」,并引导用户运行对应平台的安装脚本,不静默降级。
128
128
  - **安全红线(必须遵守)**:
129
- - 一律 `-readonly`,禁止任何写库 / 建表 / `INSTALL`/`LOAD` 之外的破坏性语句。
129
+ - 连接库文件 / 远程库时一律 `-readonly`(v1.5.5 实测会拦截 INSERT/CREATE 等写语句),禁止任何写库 / 建表 / 破坏性语句。
130
130
  - 连接串走环境变量 `DATA_INSIGHT_DB_URL`,禁止把密码写进命令或报告。
131
131
  - 查询加 `LIMIT`(默认 5000),列宽截断;超限提示分批。
132
- - **调用方式(直接调 CLI,勿写 Node spawn 包装——规避沙箱子进程管道 EPERM)**:
133
- - CSV/Parquet 直接查:`duckdb -readonly -csv -c "SELECT * FROM read_csv_auto('data.csv') LIMIT 100"`
134
- - 远程库:`duckdb -readonly -csv -c "SELECT ... LIMIT 5000" "$env:DATA_INSIGHT_DB_URL"`
132
+ - **调用方式(直接调 CLI,勿写 Node spawn 包装——规避沙箱子进程管道 EPERM;已在 v1.5.5 实测)**:
133
+ - CSV/Parquet 直接查(无库文件,**不加 `-readonly`**——不带库文件时 CLI 打开内存库,`-readonly` 会报 `Cannot launch in-memory database in read-only mode`;仅执行 SELECT,无持久化写入):
134
+ `duckdb -csv -c "SELECT * FROM read_csv_auto('data.csv') LIMIT 100"`
135
+ - 库文件 / 远程库(`-readonly` 强制只读,连接串走环境变量):
136
+ `duckdb -readonly -csv -c "SELECT ... LIMIT 5000" "$env:DATA_INSIGHT_DB_URL"`(POSIX shell 为 `"$DATA_INSIGHT_DB_URL"`)
135
137
 
136
138
  ---
137
139