mingdao-harness 0.1.54

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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +246 -0
  3. package/assets/tokenizer-data.json.gz +0 -0
  4. package/docs/ARCHITECTURE.md +108 -0
  5. package/docs/CONFIG.md +257 -0
  6. package/docs/DESKTOP-EVALUATION.md +48 -0
  7. package/docs/PROVIDERS.md +98 -0
  8. package/docs/QA-REPORT.md +333 -0
  9. package/install.bat +8 -0
  10. package/install.ps1 +57 -0
  11. package/install.sh +154 -0
  12. package/package.json +61 -0
  13. package/skills/api-design/SKILL.md +21 -0
  14. package/skills/code-review/SKILL.md +31 -0
  15. package/skills/debugging/SKILL.md +21 -0
  16. package/skills/docker/SKILL.md +27 -0
  17. package/skills/docx/SKILL.md +28 -0
  18. package/skills/frontend-design/SKILL.md +31 -0
  19. package/skills/git-commit/SKILL.md +32 -0
  20. package/skills/pdf/SKILL.md +30 -0
  21. package/skills/pptx/SKILL.md +24 -0
  22. package/skills/refactoring/SKILL.md +24 -0
  23. package/skills/release-checklist/SKILL.md +20 -0
  24. package/skills/testing/SKILL.md +30 -0
  25. package/skills/webapp-testing/SKILL.md +27 -0
  26. package/skills/xlsx/SKILL.md +28 -0
  27. package/src/agent.js +472 -0
  28. package/src/audit.js +68 -0
  29. package/src/autostart.js +74 -0
  30. package/src/batch.js +182 -0
  31. package/src/cachestats.js +215 -0
  32. package/src/cli.js +1099 -0
  33. package/src/commands/key.js +75 -0
  34. package/src/commands/schedule.js +176 -0
  35. package/src/commands/skill.js +168 -0
  36. package/src/commands/sync.js +222 -0
  37. package/src/commands/update.js +157 -0
  38. package/src/commands/workspace.js +109 -0
  39. package/src/compact.js +112 -0
  40. package/src/config.js +134 -0
  41. package/src/context.js +86 -0
  42. package/src/cost-guard.js +58 -0
  43. package/src/credentials.js +69 -0
  44. package/src/hooks.js +123 -0
  45. package/src/index.js +42 -0
  46. package/src/mcp-presets.js +78 -0
  47. package/src/mcp.js +284 -0
  48. package/src/memory.js +242 -0
  49. package/src/model-discovery.js +153 -0
  50. package/src/models.js +186 -0
  51. package/src/notify.js +38 -0
  52. package/src/permissions.js +83 -0
  53. package/src/pricing.js +156 -0
  54. package/src/prompts.js +58 -0
  55. package/src/providers/index.js +135 -0
  56. package/src/providers/openai-compatible.js +171 -0
  57. package/src/routing.js +126 -0
  58. package/src/schedule.js +434 -0
  59. package/src/session-index.js +122 -0
  60. package/src/session.js +131 -0
  61. package/src/skill-lib.js +350 -0
  62. package/src/skill-registry.js +165 -0
  63. package/src/skills.js +135 -0
  64. package/src/sync-server.js +564 -0
  65. package/src/sync.js +479 -0
  66. package/src/tasks.js +126 -0
  67. package/src/titles.js +75 -0
  68. package/src/tokenizer.js +287 -0
  69. package/src/tools/bash.js +165 -0
  70. package/src/tools/fs-tools.js +346 -0
  71. package/src/tools/index.js +287 -0
  72. package/src/ui.js +643 -0
  73. package/src/update.js +222 -0
  74. package/src/web/attachments.js +49 -0
  75. package/src/web/index.html +993 -0
  76. package/src/web/server.js +1173 -0
  77. package/src/web/web-io.js +107 -0
  78. package/src/workspace.js +157 -0
package/install.sh ADDED
@@ -0,0 +1,154 @@
1
+ #!/usr/bin/env bash
2
+ # MingDao-Harness 一键安装脚本(三平台通用:Gitee / GitCode / GitHub 内容一致)
3
+ # 用法:
4
+ # 1) 在仓库目录内:bash install.sh —— 就地安装
5
+ # 2) 一行安装:curl -fsSL <本平台 raw install.sh> | bash -s -- <gitee|gitcode|github>
6
+ # —— 脚本自动从指定平台(失败时依次兜底其余平台)获取仓库到 ~/.mingdao/repo 后安装
7
+ # 功能:检查/自动安装 Node.js(官方源 → Gitee 镜像)→ 安装 mingdao 命令(npm link,或用户目录软链)
8
+ set -euo pipefail
9
+
10
+ GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; NC='\033[0m'
11
+ info(){ echo -e "${GREEN}[MingDao]${NC} $*"; }
12
+ warn(){ echo -e "${YELLOW}[警告]${NC} $*"; }
13
+ die(){ echo -e "${RED}[错误]${NC} $*" >&2; exit 1; }
14
+
15
+ # Windows 环境(Git Bash / MSYS)应改用 PowerShell 安装器
16
+ case "$(uname -s 2>/dev/null)" in
17
+ MINGW*|MSYS*|CYGWIN*)
18
+ warn "检测到 Windows 环境,请改用 Windows 安装器:"
19
+ echo " 双击 install.bat,或运行:"
20
+ echo " powershell -NoProfile -ExecutionPolicy Bypass -File install.ps1"
21
+ exit 0
22
+ ;;
23
+ esac
24
+
25
+ # 首选平台(可选参数;未指定时按 gitee → gitcode → github 依次尝试,哪个通装哪个)
26
+ PLATFORM="${1:-}"
27
+
28
+ # 各平台 git 克隆地址与源码包下载地址(|分隔:平台|git|tarball)
29
+ REPO_URLS="
30
+ gitee|https://gitee.com/MingDaoTCM/MingDao-harness.git|https://gitee.com/MingDaoTCM/MingDao-harness/repository/archive/main.tar.gz
31
+ gitcode|https://gitcode.com/MingDaoTCM/MingDao-Harness.git|https://gitcode.com/MingDaoTCM/MingDao-Harness/-/archive/main/MingDao-Harness-main.tar.gz
32
+ github|https://github.com/MingDaoTCM/MingDao-Harness.git|https://github.com/MingDaoTCM/MingDao-Harness/archive/refs/heads/main.tar.gz
33
+ "
34
+
35
+ url_for(){ printf '%s\n' "$REPO_URLS" | grep "^$1|" | cut -d'|' -f"$2"; }
36
+ is_repo(){ [ -f "$1/package.json" ] && [ -f "$1/src/cli.js" ]; }
37
+ REPO_MODE="local" # local(仓库内就地)| git(克隆)| tarball(源码包,无 .git)
38
+
39
+ # 获取仓库到 ~/.mingdao/repo(git 优先,没有 git 时下载源码包)
40
+ fetch_repo(){
41
+ local dir="$HOME/.mingdao/repo"
42
+ if [ -d "$dir/.git" ]; then
43
+ info "检测到已有仓库,尝试更新…"
44
+ git -C "$dir" pull --ff-only --quiet >/dev/null 2>&1 || warn "更新失败,继续使用现有仓库"
45
+ REPO_MODE="git"; cd "$dir"; return 0
46
+ fi
47
+ for p in ${PLATFORM:-} gitee gitcode github; do
48
+ local git_url tgz
49
+ git_url="$(url_for "$p" 2)"; tgz="$(url_for "$p" 3)"
50
+ if command -v git >/dev/null 2>&1 && git clone --depth 1 --quiet "$git_url" "$dir" 2>/dev/null; then
51
+ REPO_MODE="git"; cd "$dir"; info "已从 $p 克隆仓库(git)"; return 0
52
+ fi
53
+ rm -rf "$dir"
54
+ if curl -fsSL -m 120 "$tgz" -o /tmp/mingdao-repo.tgz 2>/dev/null; then
55
+ mkdir -p "$dir"
56
+ if tar -xzf /tmp/mingdao-repo.tgz -C "$dir" --strip-components=1 2>/dev/null; then
57
+ rm -f /tmp/mingdao-repo.tgz
58
+ REPO_MODE="tarball"; cd "$dir"
59
+ info "已从 $p 下载源码包(无 .git;升级请重新运行本安装脚本)"
60
+ return 0
61
+ fi
62
+ rm -rf "$dir"
63
+ fi
64
+ rm -f /tmp/mingdao-repo.tgz
65
+ done
66
+ die "无法获取仓库(git 与源码包下载均失败)。请手动克隆任意平台仓库后,在仓库内运行 bash install.sh。"
67
+ }
68
+
69
+ # 定位安装源:仓库目录内 → 就地;否则(curl|bash)→ 自动获取仓库。
70
+ # 注意:curl | bash 管道执行时 BASH_SOURCE 未绑定,需给默认值(set -u 下否则报错)。
71
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-}")" && pwd)"
72
+ if is_repo "$SCRIPT_DIR"; then
73
+ cd "$SCRIPT_DIR"
74
+ else
75
+ info "未在仓库目录中运行,自动获取仓库(平台:${PLATFORM:-自动})…"
76
+ fetch_repo
77
+ fi
78
+
79
+ # ---------- 1. 检查 Node.js >= 18.17 ----------
80
+ need_node() {
81
+ if command -v node >/dev/null 2>&1; then
82
+ local major
83
+ major="$(node -p 'process.versions.node.split(".")[0]' 2>/dev/null || echo 0)"
84
+ if [ "$major" -ge 18 ]; then return 0; fi
85
+ warn "检测到 Node.js $(node -p 'process.versions.node' 2>/dev/null),需要 >= 18.17"
86
+ return 1
87
+ fi
88
+ return 1
89
+ }
90
+
91
+ install_node() {
92
+ info "未找到合适的 Node.js,尝试通过 nvm 自动安装…"
93
+ if ! command -v curl >/dev/null 2>&1; then
94
+ die "缺少 curl,无法自动安装。请手动安装 Node.js 18+(https://nodejs.org)后重新运行本脚本。"
95
+ fi
96
+ export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
97
+ # nvm 安装源:官方 raw.githubusercontent → 失败回落 Gitee 镜像(国内可用)
98
+ local official=1
99
+ if ! curl -fsSL -m 60 https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh -o /tmp/mingdao-nvm.sh 2>/dev/null; then
100
+ official=0
101
+ warn "nvm 官方源不可达,改用 Gitee 镜像 + npmmirror 的 Node 下载源(国内网络)…"
102
+ curl -fsSL -m 60 https://gitee.com/mirrors/nvm/raw/master/install.sh -o /tmp/mingdao-nvm.sh || die "nvm 下载失败(官方与镜像均不可达),请手动安装 Node.js 18+"
103
+ export NVM_NODEJS_ORG_MIRROR="${NVM_NODEJS_ORG_MIRROR:-https://npmmirror.com/mirrors/node}"
104
+ fi
105
+ bash /tmp/mingdao-nvm.sh >/dev/null 2>&1 || true
106
+ rm -f /tmp/mingdao-nvm.sh
107
+ # shellcheck disable=SC1090
108
+ [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
109
+ if ! command -v nvm >/dev/null 2>&1; then
110
+ die "nvm 安装失败,请手动安装 Node.js:https://nodejs.org"
111
+ fi
112
+ nvm install 20 >/dev/null || nvm install --lts
113
+ nvm use 20 2>/dev/null || true
114
+ if [ "$official" = "0" ]; then unset NVM_NODEJS_ORG_MIRROR; fi
115
+ info "Node.js 已就绪:$(node --version)"
116
+ }
117
+
118
+ if ! need_node; then install_node; fi
119
+ if ! need_node; then die "Node.js 版本检查失败。"; fi
120
+
121
+ # ---------- 2. 安装 mingdao 命令 ----------
122
+ # 优先 npm link:全局命令软链到仓库 → 仓库常驻,mingdao update 可自更新
123
+ info "安装 mingdao 命令…"
124
+ if command -v npm >/dev/null 2>&1 && npm link --silent >/dev/null 2>&1; then
125
+ info "已全局安装(npm link → 指向仓库,支持 mingdao update 自更新)"
126
+ else
127
+ warn "npm link 失败(可能没有管理员权限),改为用户目录软链(同样支持 mingdao update)…"
128
+ chmod +x "$(pwd)/src/cli.js"
129
+ mkdir -p "$HOME/.local/bin"
130
+ ln -sf "$(pwd)/src/cli.js" "$HOME/.local/bin/mingdao"
131
+ ln -sf "$(pwd)/src/cli.js" "$HOME/.local/bin/mdh"
132
+ if ! printf '%s' "$PATH" | tr ':' '\n' | grep -qx "$HOME/.local/bin"; then
133
+ warn "请把 $HOME/.local/bin 加入 PATH(在 ~/.bashrc 或 ~/.zshrc 末尾添加):"
134
+ echo " export PATH=\"\$HOME/.local/bin:\$PATH\""
135
+ fi
136
+ fi
137
+
138
+ # ---------- 3. 完成 ----------
139
+ if command -v mingdao >/dev/null 2>&1; then
140
+ info "安装完成!"
141
+ echo ""
142
+ echo " 接下来:"
143
+ echo " 1. 运行 'mingdao init' 配置模型(API Key 从 https://platform.deepseek.com 获取)"
144
+ echo " 2. 输入 'mingdao' 开始对话"
145
+ echo " 3. 'mingdao \"你的问题\"' 可单次提问,'mingdao --continue' 继续上次会话"
146
+ if [ "$REPO_MODE" = "tarball" ]; then
147
+ echo " 4. 新版本发布后重新运行本安装脚本即可升级"
148
+ else
149
+ echo " 4. 新版本发布后 'mingdao update' 一键升级(失败自动回滚)"
150
+ fi
151
+ else
152
+ warn "安装完成,但当前终端还找不到 mingdao 命令。"
153
+ warn "请重新打开终端,或按上方提示把 ~/.local/bin 加入 PATH 后重试。"
154
+ fi
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "mingdao-harness",
3
+ "version": "0.1.54",
4
+ "description": "明道 MingDao —— 开源智能体框架(Agent Harness)。零依赖、开箱即用,针对 DeepSeek-V4 系列优化,开放主流模型接入。",
5
+ "type": "module",
6
+ "bin": {
7
+ "mingdao": "src/cli.js",
8
+ "mdh": "src/cli.js"
9
+ },
10
+ "main": "src/index.js",
11
+ "exports": {
12
+ ".": "./src/index.js"
13
+ },
14
+ "files": [
15
+ "src/",
16
+ "skills/",
17
+ "assets/",
18
+ "docs/",
19
+ "install.sh",
20
+ "install.ps1",
21
+ "install.bat",
22
+ "README.md",
23
+ "LICENSE"
24
+ ],
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/MingDaoTCM/MingDao-Harness.git"
28
+ },
29
+ "author": "MingDao-Harness Contributors",
30
+ "bugs": {
31
+ "url": "https://github.com/MingDaoTCM/MingDao-Harness/issues"
32
+ },
33
+ "homepage": "https://harness.mingdao.ai",
34
+ "engines": {
35
+ "node": ">=18.17"
36
+ },
37
+ "keywords": [
38
+ "agent",
39
+ "harness",
40
+ "ai",
41
+ "cli",
42
+ "tui",
43
+ "llm",
44
+ "deepseek",
45
+ "coding-agent",
46
+ "mingdao"
47
+ ],
48
+ "license": "MIT",
49
+ "scripts": {
50
+ "start": "node src/cli.js",
51
+ "test": "node test/smoke.js",
52
+ "typecheck": "tsc -p tsconfig.json",
53
+ "prepublishOnly": "node test/smoke.js && node test/e2e-local.js && node test/e2e-schedule.js",
54
+ "desktop": "npm --prefix desktop start",
55
+ "desktop:dist": "npm --prefix desktop run dist:dir"
56
+ },
57
+ "devDependencies": {
58
+ "@types/node": "^26.2.0",
59
+ "typescript": "^7.0.2"
60
+ }
61
+ }
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: api-design
3
+ description: 设计或实现 REST API、审查接口设计时使用
4
+ ---
5
+
6
+ # REST API 设计
7
+
8
+ ## 规则
9
+
10
+ 1. **资源命名**:名词复数、层级清晰:`/users/{id}/orders`;动词交给 HTTP 方法。
11
+ 2. **查询参数**:过滤 `?status=active`、排序 `?sort=-created_at`、分页 `?page=1&page_size=20`。
12
+ 3. **状态码语义准确**:
13
+ - 200 成功读取 / 201 创建 / 204 删除
14
+ - 400 参数错误 / 401 未认证 / 403 无权限 / 404 不存在 / 409 冲突 / 422 语义错误 / 500 服务端错误
15
+ 4. **统一错误体**:`{ "code": "...", "message": "...", "details": [...] }`,所有端点一致。
16
+ 5. **分页**:返回 `total` 与 `items`;大集合用 cursor。
17
+ 6. **版本化**:`/v1` 前缀或 header,破坏性变更升版本。
18
+
19
+ ## 交付
20
+
21
+ 给出:资源与端点表(方法 + 路径 + 说明 + 请求/响应示例)、错误码表、鉴权方式;实现后同步更新接口文档。
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: code-review
3
+ description: 审查代码/PR,或用户要求自查代码质量、找问题时使用
4
+ ---
5
+
6
+ # 代码审查
7
+
8
+ ## 优先级
9
+
10
+ **正确性 > 生命周期与资源释放 > 安全 > 行为破坏 > 风格。**
11
+
12
+ 一个确凿的阻塞问题,胜过一长串小意见。
13
+
14
+ ## 检查清单
15
+
16
+ 1. **正确性**:边界值、空值、错误路径、并发/异步竞态;每条分支都有归属。
17
+ 2. **生命周期**:文件句柄、子进程、定时器、事件监听是否可逆释放;失败路径不泄漏。
18
+ 3. **安全**:注入(命令/SQL/路径)、凭据硬编码、敏感信息日志。
19
+ 4. **行为**:默认值、错误信息、返回结构变化是否破坏调用方。
20
+ 5. **可维护**:命名是否诚实、重复是否值得抽取、注释是否解释"为什么"。
21
+
22
+ ## 输出格式
23
+
24
+ ```
25
+ ✅ 总体判断:一句话
26
+ 🔴 阻塞(必须改):
27
+ 1. …(文件:行号 + 理由 + 建议)
28
+ 🟡 建议:
29
+ 1. …
30
+ 🟢 亮点(可选)
31
+ ```
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: debugging
3
+ description: 排查 bug、分析报错、定位异常行为时使用
4
+ ---
5
+
6
+ # 系统化调试
7
+
8
+ ## 流程
9
+
10
+ 1. **复现**:构造最小复现用例;无法稳定复现的问题先收集现场信息。
11
+ 2. **读错误**:完整阅读堆栈与日志,找**第一现场**(最深的用户代码帧),不要只看最后一行。
12
+ 3. **二分定位**:用日志/断点/注释逐段缩小范围,把"可能"变成"确定"。
13
+ 4. **假设-验证**:每条假设都要用命令或工具验证,禁止凭猜测改代码。
14
+ 5. **修根因**:修复后补回归测试,确认原场景与相邻场景都通过。
15
+
16
+ ## 纪律
17
+
18
+ - 同一方向最多尝试 3 次,失败就换思路,不要反复撞墙
19
+ - 修改前先 `read` 现场代码,改动后用 `edit` 精确修改
20
+ - 环境问题(版本/依赖/权限)用 `bash` 验证:`node -v`、`python -c "import x"` 等
21
+ - 不要把"删掉重写"当作调试手段
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: docker
3
+ description: 容器化应用、编写 Dockerfile / docker-compose、排查容器问题时使用
4
+ ---
5
+
6
+ # 容器化
7
+
8
+ ## Dockerfile 最佳实践
9
+
10
+ 1. **多阶段构建**:builder 阶段编译,runtime 阶段只带产物,镜像最小化。
11
+ 2. **基础镜像固定 tag**(如 `node:20-alpine`),不用 `latest`。
12
+ 3. **非 root 运行**:`USER` 指定非特权用户。
13
+ 4. **分层缓存**:先 COPY 依赖清单并安装(`npm install` / `pip install`),再 COPY 源码。
14
+ 5. **健康检查**:`HEALTHCHECK` 指向存活端点;`EXPOSE` 声明端口。
15
+ 6. `.dockerignore` 排除 node_modules/.git/日志。
16
+
17
+ ## compose 要点
18
+
19
+ - 服务依赖用 `depends_on` + `condition: service_healthy`
20
+ - 数据卷挂载与端口映射显式声明
21
+ - 环境变量走 `.env`,敏感值不进 compose 文件
22
+
23
+ ## 验证闭环
24
+
25
+ 1. `docker build` 实际构建通过
26
+ 2. `docker run` 起一次容器并验证健康检查
27
+ 3. 排查:`docker logs`、`docker exec -it <id> sh` 进容器看现场
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: docx
3
+ description: 创建、读取、编辑 Word 文档(.docx)时使用
4
+ ---
5
+
6
+ # Word 文档处理
7
+
8
+ ## 工具选择
9
+
10
+ | 场景 | 工具 |
11
+ | --- | --- |
12
+ | 读写段落/表格/样式 | `python-docx` |
13
+ | 格式转换 | `pandoc`(docx ↔ md ↔ pdf) |
14
+ | 转 PDF | `libreoffice --headless --convert-to pdf` |
15
+ | 只读提取文本 | `docx2txt` |
16
+
17
+ ## 常用模式
18
+
19
+ 1. **生成文档**:先建样式骨架(标题层级、正文字体),再逐段填充;表格用 `document.add_table`。
20
+ 2. **读取**:遍历 `document.paragraphs` 与 `document.tables`,按需抽取标题层级。
21
+ 3. **模板填充**:复制模板 docx,用 `{{占位符}}` 替换。
22
+ 4. **修改已有文档**:python-docx 打开 → 修改 → 另存,不要手工拼 XML。
23
+
24
+ ## 要点
25
+
26
+ - 首次使用先 `pip install python-docx`
27
+ - 生成后校验:重开文件统计段落/表格数,确认无损坏
28
+ - 中文场景检查字体设置(宋体/黑体),避免导出后乱码
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: frontend-design
3
+ description: 生成前端页面、UI 组件(HTML/CSS/React/Vue)时使用;目标是做出"不像 AI 生成"的成品
4
+ ---
5
+
6
+ # 前端设计原则
7
+
8
+ ## 动手前
9
+
10
+ 1. 明确**目的与受众**:这个页面要用户完成什么动作?谁在看?
11
+ 2. 一个页面一个**主行动**(主按钮),层级用视觉强度表达。
12
+ 3. 先静态原型后接框架:用单文件 HTML 快速验证,确认后移植。
13
+
14
+ ## 设计要点
15
+
16
+ - **排版**:字号层级 ≥3 级;正文行高 1.5–1.7;文本块宽度 ≤65ch
17
+ - **配色**:一个主色 + 中性色阶;语义色只用于状态(成功/警告/错误);正文对比度 ≥4.5:1
18
+ - **间距**:4/8 网格;分组靠留白而非边框
19
+ - **状态**:hover / focus / loading / empty / error 五态齐全
20
+ - **细节**:真实文案而非 lorem ipsum;图标统一风格;移动端先设计
21
+
22
+ ## 避免"AI 味"
23
+
24
+ - ❌ 默认紫蓝渐变、玻璃拟态堆砌
25
+ - ❌ 千篇一律的三卡片 + 图标布局
26
+ - ❌ emoji 当图标、无意义动画
27
+ - ✅ 留白、克制的阴影、清晰的信息层级
28
+
29
+ ## 交付
30
+
31
+ 给出页面结构与关键 CSS/组件代码,说明响应式断点与可访问性处理(alt、focus、语义标签)。
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: git-commit
3
+ description: 生成规范的 Git 提交信息(Conventional Commits),或用户要求写 commit message / 提交代码时使用
4
+ ---
5
+
6
+ # Git 提交规范
7
+
8
+ ## 格式
9
+
10
+ ```
11
+ <type>(<scope>): <subject>
12
+
13
+ <body>(可选,说明动机而非过程)
14
+ ```
15
+
16
+ - type:`feat` 新功能 / `fix` 修复 / `docs` 文档 / `refactor` 重构 / `test` 测试 / `chore` 杂务 / `style` 格式 / `perf` 性能 / `ci` 流水线
17
+ - subject:≤50 字的中文祈使句,不加句号
18
+ - 一条 commit 只做一件事;混在一起的改动先拆分
19
+
20
+ ## 工作流
21
+
22
+ 1. `git status` / `git diff --stat` 查看改动范围
23
+ 2. 需要时 `git diff <file>` 细看关键改动
24
+ 3. 按规范撰写,用 `git commit -m` 提交前把完整信息展示给用户确认
25
+
26
+ ## 示例
27
+
28
+ ```
29
+ feat(export): 支持导出 Markdown 报告
30
+
31
+ 新增 --format md 选项,复用现有模板渲染管线。
32
+ ```
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: pdf
3
+ description: 读取、解析、生成、合并、拆分 PDF 文件时使用
4
+ ---
5
+
6
+ # PDF 处理
7
+
8
+ ## 场景 → 工具
9
+
10
+ | 场景 | 推荐 |
11
+ | --- | --- |
12
+ | 提取文本(速度优先) | `pymupdf`(fitz) |
13
+ | 提取表格 | `pdfplumber`(表格识别强) |
14
+ | 纯命令行提取 | `pdftotext` / `pdfinfo`(poppler-utils) |
15
+ | 合并/拆分/旋转/加水印 | `pypdf` |
16
+ | 程序生成报表 | `reportlab` |
17
+ | 扫描件(无文本层) | OCR:`tesseract` + `pdf2image` |
18
+
19
+ ## 工作流
20
+
21
+ 1. **先探测环境**:`python -c "import fitz"` 等确认依赖,缺什么 `pip install pymupdf`。
22
+ 2. 大文件先看页数:`pdfinfo file.pdf` 或用 fitz 统计,避免一次性读入内存。
23
+ 3. 输出结果写回文件(write 工具)或直接打印关键数据,附上页码范围。
24
+ 4. 校验:合并后重开验证页数;提取后抽查文本。
25
+
26
+ ## 常见坑
27
+
28
+ - 提取文本顺序混乱 → 用 `sort=True` 或按坐标排序
29
+ - 表格识别不准 → pdfplumber 的 `extract_tables` + 手动核对列
30
+ - 中文乱码 → 确认字体嵌入与编码(reportlab 用 CID 字体)
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: pptx
3
+ description: 生成演示文稿(.pptx):汇报、教学、方案展示时使用
4
+ ---
5
+
6
+ # PPT 生成
7
+
8
+ ## 工具
9
+
10
+ - `python-pptx`:程序化生成(首次使用 `pip install python-pptx`)
11
+
12
+ ## 工作流
13
+
14
+ 1. **定结构**:先列大纲(每页一个核心观点),与用户确认页数。
15
+ 2. **用母版布局**:优先使用默认模板的 `slide_layouts`(标题页/标题+内容),避免手工摆坐标。
16
+ 3. **填充内容**:标题 ≤ 12 字;正文要点化(每条 ≤ 20 字);图/表优先于长段落。
17
+ 4. **统一风格**:字体、配色全篇一致;空白充足。
18
+ 5. **校验**:生成后用 python-pptx 读回,检查页数、每页形状数量;再 `libreoffice --headless --convert-to pdf` 抽查渲染效果。
19
+
20
+ ## 设计红线
21
+
22
+ - 一页一个观点;忌整页文字
23
+ - 忌花哨动画/多余装饰
24
+ - 数据页必须有来源与单位
@@ -0,0 +1,24 @@
1
+ ---
2
+ name: refactoring
3
+ description: 重构代码、改善结构但保持行为不变时使用
4
+ ---
5
+
6
+ # 安全重构
7
+
8
+ ## 核心原则
9
+
10
+ **小步、可回退、每步可验证。** 行为保持不变是硬约束。
11
+
12
+ ## 工作流
13
+
14
+ 1. **建安全网**:先跑一遍现有测试;没有测试就先补一条主路径测试,记录当前行为。
15
+ 2. **小步 edit**:每次只做一个动作(改名 / 提取函数 / 消除重复),不夹带逻辑修改。
16
+ 3. **每步验证**:跑测试;失败立即用 `undo` 回退,不要带着红测试继续。
17
+ 4. **顺序**:先易后难——重命名 → 提取函数 → 调整结构 → 最后才动算法。
18
+ 5. **收尾**:删除因重构而死的代码,更新注释与文档。
19
+
20
+ ## 红线
21
+
22
+ - 重构和改功能分两次进行
23
+ - 不重构没测试覆盖、也不理解的代码
24
+ - 大文件先加测试护栏再动结构
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: release-checklist
3
+ description: 准备发布新版本、打包交付前使用
4
+ ---
5
+
6
+ # 发布检查清单
7
+
8
+ 按顺序逐项确认,全部通过才可发布:
9
+
10
+ 1. **测试**:全量测试通过,记录命令与结果(`npm test` / `pytest` 等)。
11
+ 2. **版本**:版本号统一(package.json / 配置 / 文档互相一致),遵循语义化版本。
12
+ 3. **变更说明**:changelog 用用户语言描述新增/修复/破坏性变更。
13
+ 4. **构建验证**:实际构建/打包一次,并在干净环境验证产物可安装可运行。
14
+ 5. **敏感信息**:密钥、token、内网地址、个人信息不得进入仓库与产物(`grep -rE 'sk-[A-Za-z0-9]{20,}' .`)。
15
+ 6. **回滚方案**:明确如何回退到上一版本(旧包/旧 tag 可恢复)。
16
+ 7. **发布后冒烟**:发布完成后立即做一次端到端验证。
17
+
18
+ ## 输出
19
+
20
+ 给出「检查表 + 每项结论(✅/❌)+ 未通过项的修复建议」,发布动作本身必须等用户确认。
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: testing
3
+ description: 编写单元测试/集成测试、为代码补测试时使用
4
+ ---
5
+
6
+ # 测试编写
7
+
8
+ ## 用例设计(表驱动思维)
9
+
10
+ 每个被测函数至少覆盖四类输入:
11
+
12
+ | 类别 | 内容 |
13
+ | --- | --- |
14
+ | 正常 | 典型输入的主路径 |
15
+ | 边界 | 空、0、1、最大值、恰好等于阈值 |
16
+ | 异常 | 非法输入、错误类型、缺失字段 |
17
+ | 组合 | 多参数交互的关键组合 |
18
+
19
+ ## 规范
20
+
21
+ 1. 测试名描述**行为**而非实现("余额不足时报错" > "test_error2")。
22
+ 2. 一条测试只断言一件事;断言用真实期望值,不照抄实现。
23
+ 3. 少 mock:优先真实对象与临时目录;只 mock 网络/时间/随机源。
24
+ 4. 不测试第三方库本身,测试你的调用逻辑。
25
+
26
+ ## 落地
27
+
28
+ - 先确认项目已有框架与运行命令(package.json scripts / pytest / vitest 等),沿用现有约定
29
+ - 新补测试先跑失败(红),再让实现通过(绿)
30
+ - 交付时报告:加了哪些用例、运行命令、通过结果
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: webapp-testing
3
+ description: 测试本地 Web 应用/服务(接口、页面、报错)时使用
4
+ ---
5
+
6
+ # Web 应用测试
7
+
8
+ ## 分层测试
9
+
10
+ ### 接口层(curl,零依赖)
11
+
12
+ - 状态码/响应体/重定向:`curl -sS -i http://localhost:PORT/path`
13
+ - 常见断言:200/201/204、JSON 字段存在、错误格式统一
14
+ - 写脚本循环检查健康端点,最多重试 N 次,每次间隔 1s
15
+
16
+ ### 浏览器层(Playwright)
17
+
18
+ - 首次使用:`pip install playwright && playwright install chromium`
19
+ - 无头模式:打开页面 → 截图 → 断言选择器文本 → 收集 console 错误
20
+ - 交互流程:点击、填表、等待元素出现(`wait_for_selector`)
21
+
22
+ ## 纪律
23
+
24
+ 1. **启动即负责**:自己起的服务进程,测试完必须杀掉(记录 PID)。
25
+ 2. 先确认服务真的起来了(健康检查轮询),再断言业务。
26
+ 3. 失败时保留现场:截图、响应体、日志一起给用户。
27
+ 4. 端口冲突先 `lsof -i :PORT` / `netstat -ano` 排查。
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: xlsx
3
+ description: 处理 Excel 表格(.xlsx/.xls/.csv)数据:读取、统计、清洗、生成报表时使用
4
+ ---
5
+
6
+ # Excel 表格处理
7
+
8
+ ## 工具选择
9
+
10
+ | 场景 | 工具 |
11
+ | --- | --- |
12
+ | 单元格级读写、格式、公式 | `openpyxl` |
13
+ | 批量统计/清洗/透视(数据思维) | `pandas` |
14
+ | 简单 CSV | 标准库 `csv`(零依赖) |
15
+ | 大文件(>100MB) | openpyxl `read_only` 模式,或 pandas 分块读取 |
16
+
17
+ ## 工作流
18
+
19
+ 1. 先探明结构:读表头与前 5 行,确认列名、空值、类型。
20
+ 2. 用 pandas 做统计:分组、透视、去重、缺失值统计,输出关键结论而非全量数据。
21
+ 3. 生成结果写新文件(不要覆盖原始数据),并校验行数。
22
+ 4. CSV 编码坑:中文优先 `utf-8-sig`(Excel 兼容)。
23
+
24
+ ## 要点
25
+
26
+ - 首次使用先 `pip install openpyxl pandas`
27
+ - 大文件先 `wc -l` 估算规模再决定工具
28
+ - 数值列注意空字符串/文本型数字,统计前先 `pd.to_numeric(errors='coerce')`