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.
- package/README.md +84 -24
- package/dist/cli/index.js +3 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/skills/15-git-workflow.d.ts +3 -0
- package/dist/skills/15-git-workflow.d.ts.map +1 -0
- package/dist/skills/15-git-workflow.js +288 -0
- package/dist/skills/15-git-workflow.js.map +1 -0
- package/dist/skills/16-unit-testing.d.ts +3 -0
- package/dist/skills/16-unit-testing.d.ts.map +1 -0
- package/dist/skills/16-unit-testing.js +298 -0
- package/dist/skills/16-unit-testing.js.map +1 -0
- package/dist/skills/17-system-design.d.ts +3 -0
- package/dist/skills/17-system-design.d.ts.map +1 -0
- package/dist/skills/17-system-design.js +294 -0
- package/dist/skills/17-system-design.js.map +1 -0
- package/dist/skills/18-database-optimize.d.ts +3 -0
- package/dist/skills/18-database-optimize.d.ts.map +1 -0
- package/dist/skills/18-database-optimize.js +294 -0
- package/dist/skills/18-database-optimize.js.map +1 -0
- package/dist/skills/19-docker.d.ts +3 -0
- package/dist/skills/19-docker.d.ts.map +1 -0
- package/dist/skills/19-docker.js +360 -0
- package/dist/skills/19-docker.js.map +1 -0
- package/dist/skills/20-cicd.d.ts +3 -0
- package/dist/skills/20-cicd.d.ts.map +1 -0
- package/dist/skills/20-cicd.js +364 -0
- package/dist/skills/20-cicd.js.map +1 -0
- package/dist/skills/21-performance.d.ts +3 -0
- package/dist/skills/21-performance.d.ts.map +1 -0
- package/dist/skills/21-performance.js +139 -0
- package/dist/skills/21-performance.js.map +1 -0
- package/dist/skills/22-refactoring.d.ts +3 -0
- package/dist/skills/22-refactoring.d.ts.map +1 -0
- package/dist/skills/22-refactoring.js +235 -0
- package/dist/skills/22-refactoring.js.map +1 -0
- package/dist/skills/23-observability.d.ts +3 -0
- package/dist/skills/23-observability.d.ts.map +1 -0
- package/dist/skills/23-observability.js +266 -0
- package/dist/skills/23-observability.js.map +1 -0
- package/dist/skills/24-design-patterns.d.ts +3 -0
- package/dist/skills/24-design-patterns.d.ts.map +1 -0
- package/dist/skills/24-design-patterns.js +258 -0
- package/dist/skills/24-design-patterns.js.map +1 -0
- package/dist/skills/index.d.ts +10 -0
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +41 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/skills.test.js +3 -3
- package/dist/skills/skills.test.js.map +1 -1
- package/dist/templates/templates.test.js +2 -3
- package/dist/templates/templates.test.js.map +1 -1
- package/package.json +1 -1
- package/rules/claude-code/CLAUDE.md +2410 -3
- package/rules/cline/.clinerules +2262 -2
- package/rules/codebuddy/CODEBUDDY.md +2361 -2
- package/rules/continue/.continuerules +2262 -2
- package/rules/copilot/copilot-instructions.md +2331 -2
- package/rules/cursor/.cursorrules +2399 -2
- package/rules/cursor/smart-flow.mdc +2399 -2
- package/rules/jetbrains/smart-flow.md +2331 -2
- package/rules/lingma/smart-flow.md +2352 -3
- package/rules/windsurf/.windsurf/rules/smart-flow.md +2332 -3
- 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 @@
|
|
|
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"}
|