ethan-skill 1.7.0 → 1.9.0

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 (63) hide show
  1. package/README.md +84 -24
  2. package/dist/cli/index.js +3 -2
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/skills/15-git-workflow.d.ts +3 -0
  5. package/dist/skills/15-git-workflow.d.ts.map +1 -0
  6. package/dist/skills/15-git-workflow.js +288 -0
  7. package/dist/skills/15-git-workflow.js.map +1 -0
  8. package/dist/skills/16-unit-testing.d.ts +3 -0
  9. package/dist/skills/16-unit-testing.d.ts.map +1 -0
  10. package/dist/skills/16-unit-testing.js +298 -0
  11. package/dist/skills/16-unit-testing.js.map +1 -0
  12. package/dist/skills/17-system-design.d.ts +3 -0
  13. package/dist/skills/17-system-design.d.ts.map +1 -0
  14. package/dist/skills/17-system-design.js +294 -0
  15. package/dist/skills/17-system-design.js.map +1 -0
  16. package/dist/skills/18-database-optimize.d.ts +3 -0
  17. package/dist/skills/18-database-optimize.d.ts.map +1 -0
  18. package/dist/skills/18-database-optimize.js +294 -0
  19. package/dist/skills/18-database-optimize.js.map +1 -0
  20. package/dist/skills/19-docker.d.ts +3 -0
  21. package/dist/skills/19-docker.d.ts.map +1 -0
  22. package/dist/skills/19-docker.js +360 -0
  23. package/dist/skills/19-docker.js.map +1 -0
  24. package/dist/skills/20-cicd.d.ts +3 -0
  25. package/dist/skills/20-cicd.d.ts.map +1 -0
  26. package/dist/skills/20-cicd.js +364 -0
  27. package/dist/skills/20-cicd.js.map +1 -0
  28. package/dist/skills/21-performance.d.ts +3 -0
  29. package/dist/skills/21-performance.d.ts.map +1 -0
  30. package/dist/skills/21-performance.js +139 -0
  31. package/dist/skills/21-performance.js.map +1 -0
  32. package/dist/skills/22-refactoring.d.ts +3 -0
  33. package/dist/skills/22-refactoring.d.ts.map +1 -0
  34. package/dist/skills/22-refactoring.js +235 -0
  35. package/dist/skills/22-refactoring.js.map +1 -0
  36. package/dist/skills/23-observability.d.ts +3 -0
  37. package/dist/skills/23-observability.d.ts.map +1 -0
  38. package/dist/skills/23-observability.js +266 -0
  39. package/dist/skills/23-observability.js.map +1 -0
  40. package/dist/skills/24-design-patterns.d.ts +3 -0
  41. package/dist/skills/24-design-patterns.d.ts.map +1 -0
  42. package/dist/skills/24-design-patterns.js +258 -0
  43. package/dist/skills/24-design-patterns.js.map +1 -0
  44. package/dist/skills/index.d.ts +10 -0
  45. package/dist/skills/index.d.ts.map +1 -1
  46. package/dist/skills/index.js +41 -1
  47. package/dist/skills/index.js.map +1 -1
  48. package/dist/skills/skills.test.js +3 -3
  49. package/dist/skills/skills.test.js.map +1 -1
  50. package/dist/templates/templates.test.js +2 -3
  51. package/dist/templates/templates.test.js.map +1 -1
  52. package/package.json +1 -1
  53. package/rules/claude-code/CLAUDE.md +2410 -3
  54. package/rules/cline/.clinerules +2262 -2
  55. package/rules/codebuddy/CODEBUDDY.md +2361 -2
  56. package/rules/continue/.continuerules +2262 -2
  57. package/rules/copilot/copilot-instructions.md +2331 -2
  58. package/rules/cursor/.cursorrules +2399 -2
  59. package/rules/cursor/smart-flow.mdc +2399 -2
  60. package/rules/jetbrains/smart-flow.md +2331 -2
  61. package/rules/lingma/smart-flow.md +2352 -3
  62. package/rules/windsurf/.windsurf/rules/smart-flow.md +2332 -3
  63. package/rules/zed/smart-flow.rules +2251 -1
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dockerSkill = void 0;
4
+ exports.dockerSkill = {
5
+ id: 'docker',
6
+ name: 'Docker 容器化',
7
+ nameEn: 'docker',
8
+ order: 19,
9
+ category: '执行侧',
10
+ description: '编写生产级 Dockerfile,实现多阶段构建、镜像优化和 docker-compose 编排',
11
+ descriptionEn: 'Write production-grade Dockerfiles with multi-stage builds, image optimization, docker-compose orchestration, and security scanning',
12
+ detailDescription: `系统指导 Docker 容器化实践,涵盖 Dockerfile 最佳实践、多阶段构建减小镜像体积、
13
+ 镜像安全扫描、docker-compose 服务编排和容器运行时安全配置,帮助将应用安全高效地容器化。`,
14
+ triggers: [
15
+ 'Docker',
16
+ 'docker',
17
+ '容器化',
18
+ 'containerization',
19
+ 'Dockerfile',
20
+ 'dockerfile',
21
+ 'docker-compose',
22
+ '镜像优化',
23
+ 'image optimization',
24
+ '多阶段构建',
25
+ 'multi-stage build',
26
+ '容器安全',
27
+ '@ethan docker',
28
+ ],
29
+ steps: [
30
+ {
31
+ title: '1. Dockerfile 基础最佳实践',
32
+ content: `**基础规则清单**
33
+
34
+ \`\`\`dockerfile
35
+ # ✅ 使用具体版本标签,避免 latest(不可复现)
36
+ FROM node:20.11-alpine3.19
37
+
38
+ # ✅ 设置工作目录(避免在根目录操作)
39
+ WORKDIR /app
40
+
41
+ # ✅ 先复制依赖文件,利用层缓存
42
+ # 依赖文件不变时,npm install 层直接复用缓存
43
+ COPY package*.json ./
44
+ RUN npm ci --only=production
45
+
46
+ # ✅ 再复制源码(源码改变不影响依赖缓存)
47
+ COPY . .
48
+
49
+ # ✅ 使用非 root 用户运行(安全最佳实践)
50
+ RUN addgroup -S appgroup && adduser -S appuser -G appgroup
51
+ USER appuser
52
+
53
+ # ✅ 仅暴露必要端口
54
+ EXPOSE 3000
55
+
56
+ # ✅ 使用 ENTRYPOINT + CMD 组合(更灵活)
57
+ ENTRYPOINT ["node"]
58
+ CMD ["dist/index.js"]
59
+ \`\`\`
60
+
61
+ **层缓存优化原则**
62
+ \`\`\`
63
+ 构建缓存命中规则:指令 + 参数 + 上下文文件 都相同才命中缓存
64
+
65
+ 优化策略:
66
+ 1. 变化频率低的指令放前面(基础镜像、系统依赖)
67
+ 2. 变化频率高的指令放后面(应用代码)
68
+ 3. 合并 RUN 指令减少层数
69
+
70
+ # ❌ 多个 RUN 产生多个层
71
+ RUN apt-get update
72
+ RUN apt-get install -y curl
73
+ RUN apt-get clean
74
+
75
+ # ✅ 合并为一个 RUN,减少层数 + 及时清理缓存
76
+ RUN apt-get update && apt-get install -y curl \
77
+ && rm -rf /var/lib/apt/lists/*
78
+ \`\`\``,
79
+ },
80
+ {
81
+ title: '2. 多阶段构建(Multi-Stage Build)',
82
+ content: `多阶段构建将构建环境与运行环境分离,显著减小生产镜像体积:
83
+
84
+ **Node.js 应用示例**
85
+ \`\`\`dockerfile
86
+ # ===== Stage 1: Build =====
87
+ FROM node:20.11-alpine3.19 AS builder
88
+ WORKDIR /app
89
+
90
+ # 安装所有依赖(含 devDependencies)
91
+ COPY package*.json ./
92
+ RUN npm ci
93
+
94
+ # 编译 TypeScript
95
+ COPY . .
96
+ RUN npm run build
97
+
98
+ # ===== Stage 2: Dependencies =====
99
+ FROM node:20.11-alpine3.19 AS deps
100
+ WORKDIR /app
101
+ COPY package*.json ./
102
+ # 只安装生产依赖
103
+ RUN npm ci --only=production
104
+
105
+ # ===== Stage 3: Production =====
106
+ FROM node:20.11-alpine3.19 AS production
107
+ WORKDIR /app
108
+
109
+ # 只从前两个阶段复制必要文件
110
+ COPY --from=deps /app/node_modules ./node_modules
111
+ COPY --from=builder /app/dist ./dist
112
+
113
+ # 非 root 用户
114
+ RUN addgroup -S app && adduser -S app -G app
115
+ USER app
116
+
117
+ EXPOSE 3000
118
+ HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:3000/health || exit 1
119
+ CMD ["node", "dist/index.js"]
120
+ \`\`\`
121
+
122
+ **效果对比**
123
+ \`\`\`
124
+ 单阶段构建(含 devDeps + 源码): ~800 MB
125
+ 多阶段构建(只含运行时): ~120 MB
126
+ 体积减少约 85%
127
+ \`\`\`
128
+
129
+ **Go 应用(静态二进制最小镜像)**
130
+ \`\`\`dockerfile
131
+ FROM golang:1.22-alpine AS builder
132
+ WORKDIR /app
133
+ COPY go.mod go.sum ./
134
+ RUN go mod download
135
+ COPY . .
136
+ RUN CGO_ENABLED=0 GOOS=linux go build -o server .
137
+
138
+ # 使用 scratch(空镜像)或 distroless
139
+ FROM gcr.io/distroless/static-debian12
140
+ COPY --from=builder /app/server /server
141
+ EXPOSE 8080
142
+ ENTRYPOINT ["/server"]
143
+ # 最终镜像仅 ~10MB
144
+ \`\`\``,
145
+ },
146
+ {
147
+ title: '3. .dockerignore 与镜像安全',
148
+ content: `**配置 .dockerignore**
149
+ \`\`\`dockerignore
150
+ # 排除不需要的文件,减小构建上下文
151
+ node_modules
152
+ npm-debug.log
153
+ .git
154
+ .gitignore
155
+ .env
156
+ .env.*
157
+ *.md
158
+ .DS_Store
159
+ coverage/
160
+ dist/
161
+ .nyc_output
162
+ __tests__
163
+ *.test.ts
164
+ Dockerfile*
165
+ docker-compose*
166
+ \`\`\`
167
+
168
+ **镜像安全扫描**
169
+ \`\`\`bash
170
+ # Trivy(推荐,免费开源)
171
+ docker pull aquasec/trivy
172
+ trivy image --severity HIGH,CRITICAL myapp:latest
173
+
174
+ # 输出示例:
175
+ # CRITICAL: CVE-2024-xxxx in openssl 3.0.0 → 升级到 3.0.13
176
+
177
+ # 集成到 CI(GitHub Actions)
178
+ - name: Scan Docker image
179
+ uses: aquasecurity/trivy-action@master
180
+ with:
181
+ image-ref: 'myapp:\${{ github.sha }}'
182
+ severity: 'CRITICAL,HIGH'
183
+ exit-code: '1' # 发现高危漏洞时 CI 失败
184
+ \`\`\`
185
+
186
+ **容器运行时安全配置**
187
+ \`\`\`bash
188
+ # 禁止 root 运行(Dockerfile 中已设置 USER,运行时再确认)
189
+ docker run --user 1001:1001 myapp:latest
190
+
191
+ # 只读文件系统(防止容器内写文件)
192
+ docker run --read-only --tmpfs /tmp myapp:latest
193
+
194
+ # 限制资源
195
+ docker run --memory="256m" --cpus="0.5" myapp:latest
196
+
197
+ # 丢弃不需要的 Linux Capabilities
198
+ docker run --cap-drop ALL --cap-add NET_BIND_SERVICE myapp:latest
199
+
200
+ # 禁止权限提升
201
+ docker run --security-opt no-new-privileges myapp:latest
202
+ \`\`\``,
203
+ },
204
+ {
205
+ title: '4. Docker Compose 服务编排',
206
+ content: `**生产级 docker-compose.yml 示例**
207
+ \`\`\`yaml
208
+ version: '3.9'
209
+
210
+ services:
211
+ app:
212
+ build:
213
+ context: .
214
+ dockerfile: Dockerfile
215
+ target: production # 指定多阶段构建的目标阶段
216
+ image: myapp:\${APP_VERSION:-latest}
217
+ restart: unless-stopped
218
+ ports:
219
+ - "3000:3000"
220
+ environment:
221
+ NODE_ENV: production
222
+ DATABASE_URL: \${DATABASE_URL} # 从 .env 文件读取,不硬编码
223
+ env_file:
224
+ - .env.production
225
+ depends_on:
226
+ db:
227
+ condition: service_healthy # 等待健康检查通过
228
+ redis:
229
+ condition: service_healthy
230
+ healthcheck:
231
+ test: ["CMD", "wget", "-qO-", "http://localhost:3000/health"]
232
+ interval: 30s
233
+ timeout: 5s
234
+ retries: 3
235
+ start_period: 40s
236
+ deploy:
237
+ resources:
238
+ limits:
239
+ cpus: '1.0'
240
+ memory: 512M
241
+ networks:
242
+ - app-network
243
+
244
+ db:
245
+ image: postgres:16-alpine
246
+ restart: unless-stopped
247
+ environment:
248
+ POSTGRES_DB: \${DB_NAME}
249
+ POSTGRES_USER: \${DB_USER}
250
+ POSTGRES_PASSWORD: \${DB_PASSWORD}
251
+ volumes:
252
+ - postgres-data:/var/lib/postgresql/data
253
+ - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
254
+ healthcheck:
255
+ test: ["CMD-SHELL", "pg_isready -U \${DB_USER}"]
256
+ interval: 10s
257
+ timeout: 5s
258
+ retries: 5
259
+ networks:
260
+ - app-network
261
+
262
+ redis:
263
+ image: redis:7-alpine
264
+ restart: unless-stopped
265
+ command: redis-server --requirepass \${REDIS_PASSWORD}
266
+ volumes:
267
+ - redis-data:/data
268
+ healthcheck:
269
+ test: ["CMD", "redis-cli", "ping"]
270
+ interval: 10s
271
+ networks:
272
+ - app-network
273
+
274
+ networks:
275
+ app-network:
276
+ driver: bridge
277
+
278
+ volumes:
279
+ postgres-data:
280
+ redis-data:
281
+ \`\`\`
282
+
283
+ **常用 Compose 命令**
284
+ \`\`\`bash
285
+ docker compose up -d # 后台启动
286
+ docker compose up -d --build # 重新构建并启动
287
+ docker compose logs -f app # 实时查看日志
288
+ docker compose exec app sh # 进入容器 shell
289
+ docker compose ps # 查看服务状态
290
+ docker compose down -v # 停止并删除 volume
291
+ \`\`\``,
292
+ },
293
+ {
294
+ title: '5. 镜像优化与发布',
295
+ content: `**镜像大小优化总结**
296
+
297
+ | 优化手段 | 效果 |
298
+ |---------|------|
299
+ | 使用 Alpine 基础镜像 | node:20 → node:20-alpine,1.1GB → 150MB |
300
+ | 多阶段构建 | 去除构建工具 & devDependencies |
301
+ | .dockerignore | 减小构建上下文 |
302
+ | 合并 RUN 清理缓存 | 减少层数和大小 |
303
+ | distroless/scratch | Go/Rust 应用极小镜像 |
304
+
305
+ **镜像打标签规范**
306
+ \`\`\`bash
307
+ # 语义化版本 + git commit hash
308
+ docker build -t myapp:1.2.3 -t myapp:1.2.3-abc1234 .
309
+
310
+ # CI 中自动打标签
311
+ docker build \
312
+ -t myregistry/myapp:\${VERSION} \
313
+ -t myregistry/myapp:latest \
314
+ --label "git.commit=\${GIT_SHA}" \
315
+ --label "build.date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
316
+ .
317
+ \`\`\`
318
+
319
+ **镜像推送到 Registry**
320
+ \`\`\`bash
321
+ # 登录到 GitHub Container Registry
322
+ echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin
323
+
324
+ # 推送
325
+ docker push ghcr.io/org/myapp:1.2.3
326
+
327
+ # 使用 Docker BuildKit(并行构建,更快)
328
+ DOCKER_BUILDKIT=1 docker build .
329
+
330
+ # 多平台构建(兼容 ARM Mac 和 x86 服务器)
331
+ docker buildx build --platform linux/amd64,linux/arm64 \
332
+ -t myapp:latest --push .
333
+ \`\`\``,
334
+ },
335
+ ],
336
+ outputFormat: 'Markdown 容器化方案,含优化后的 Dockerfile、.dockerignore、docker-compose.yml 配置和安全加固建议',
337
+ examples: [
338
+ {
339
+ input: '帮我给 Node.js TypeScript 项目写一个生产级 Dockerfile',
340
+ output: `## 生产级 Node.js Dockerfile
341
+
342
+ 使用三阶段构建(builder → deps → production),最终镜像约 120MB。
343
+
344
+ 关键优化点:
345
+ 1. Alpine 基础镜像减小体积
346
+ 2. builder 阶段编译 TS,deps 阶段只装生产依赖
347
+ 3. production 阶段只复制必要文件,非 root 用户运行
348
+ 4. HEALTHCHECK 支持容器健康检查
349
+ 5. .dockerignore 排除测试文件、.env、.git`,
350
+ },
351
+ ],
352
+ notes: [
353
+ '生产镜像绝不使用 :latest 标签,始终用具体版本号确保可复现',
354
+ '绝不在 Dockerfile 中写入密钥或密码,使用环境变量或 Docker Secrets',
355
+ '每次发版前用 Trivy 扫描镜像漏洞,CRITICAL 漏洞不上线',
356
+ 'docker-compose 仅用于本地开发和小规模部署,生产大规模编排推荐 Kubernetes',
357
+ ],
358
+ nextSkill: 'cicd',
359
+ };
360
+ //# sourceMappingURL=19-docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"19-docker.js","sourceRoot":"","sources":["../../src/skills/19-docker.ts"],"names":[],"mappings":";;;AAEa,QAAA,WAAW,GAAoB;IAC1C,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,kDAAkD;IAC/D,aAAa,EAAE,qIAAqI;IACpJ,iBAAiB,EAAE;oDAC+B;IAClD,QAAQ,EAAE;QACR,QAAQ;QACR,QAAQ;QACR,KAAK;QACL,kBAAkB;QAClB,YAAY;QACZ,YAAY;QACZ,gBAAgB;QAChB,MAAM;QACN,oBAAoB;QACpB,OAAO;QACP,mBAAmB;QACnB,MAAM;QACN,eAAe;KAChB;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8CR;SACF;QACD;YACE,KAAK,EAAE,6BAA6B;YACpC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8DR;SACF;QACD;YACE,KAAK,EAAE,wBAAwB;YAC/B,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsDR;SACF;QACD;YACE,KAAK,EAAE,wBAAwB;YAC/B,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqFR;SACF;QACD;YACE,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCR;SACF;KACF;IACD,YAAY,EACV,4EAA4E;IAC9E,QAAQ,EAAE;QACR;YACE,KAAK,EAAE,4CAA4C;YACnD,MAAM,EAAE;;;;;;;;;kCASoB;SAC7B;KACF;IACD,KAAK,EAAE;QACL,mCAAmC;QACnC,gDAAgD;QAChD,oCAAoC;QACpC,mDAAmD;KACpD;IACD,SAAS,EAAE,MAAM;CAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SkillDefinition } from './types';
2
+ export declare const cicdSkill: SkillDefinition;
3
+ //# sourceMappingURL=20-cicd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"20-cicd.d.ts","sourceRoot":"","sources":["../../src/skills/20-cicd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,SAAS,EAAE,eAwWvB,CAAC"}