ethan-skill 1.11.0 → 1.13.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/CHANGELOG.md +272 -0
- package/README.md +84 -33
- package/dist/agents/index.d.ts +14 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +37 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/orchestrator.d.ts +10 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +233 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/orchestrator.test.d.ts +2 -0
- package/dist/agents/orchestrator.test.d.ts.map +1 -0
- package/dist/agents/orchestrator.test.js +151 -0
- package/dist/agents/orchestrator.test.js.map +1 -0
- package/dist/agents/presets.d.ts +16 -0
- package/dist/agents/presets.d.ts.map +1 -0
- package/dist/agents/presets.js +123 -0
- package/dist/agents/presets.js.map +1 -0
- package/dist/agents/types.d.ts +29 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +7 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli/index.js +1168 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/loader/custom-agent-loader.d.ts +13 -0
- package/dist/loader/custom-agent-loader.d.ts.map +1 -0
- package/dist/loader/custom-agent-loader.js +120 -0
- package/dist/loader/custom-agent-loader.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +278 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/27-tech-debt.d.ts +3 -0
- package/dist/skills/27-tech-debt.d.ts.map +1 -0
- package/dist/skills/27-tech-debt.js +149 -0
- package/dist/skills/27-tech-debt.js.map +1 -0
- package/dist/skills/28-api-mock.d.ts +3 -0
- package/dist/skills/28-api-mock.d.ts.map +1 -0
- package/dist/skills/28-api-mock.js +272 -0
- package/dist/skills/28-api-mock.js.map +1 -0
- package/dist/skills/29-data-migration.d.ts +3 -0
- package/dist/skills/29-data-migration.d.ts.map +1 -0
- package/dist/skills/29-data-migration.js +331 -0
- package/dist/skills/29-data-migration.js.map +1 -0
- package/dist/skills/30-llm-feature.d.ts +3 -0
- package/dist/skills/30-llm-feature.d.ts.map +1 -0
- package/dist/skills/30-llm-feature.js +328 -0
- package/dist/skills/30-llm-feature.js.map +1 -0
- package/dist/skills/31-threat-model.d.ts +3 -0
- package/dist/skills/31-threat-model.d.ts.map +1 -0
- package/dist/skills/31-threat-model.js +240 -0
- package/dist/skills/31-threat-model.js.map +1 -0
- package/dist/skills/32-green-code.d.ts +3 -0
- package/dist/skills/32-green-code.d.ts.map +1 -0
- package/dist/skills/32-green-code.js +346 -0
- package/dist/skills/32-green-code.js.map +1 -0
- package/dist/skills/33-service-catalog.d.ts +3 -0
- package/dist/skills/33-service-catalog.d.ts.map +1 -0
- package/dist/skills/33-service-catalog.js +334 -0
- package/dist/skills/33-service-catalog.js.map +1 -0
- package/dist/skills/34-mobile-review.d.ts +3 -0
- package/dist/skills/34-mobile-review.d.ts.map +1 -0
- package/dist/skills/34-mobile-review.js +390 -0
- package/dist/skills/34-mobile-review.js.map +1 -0
- package/dist/skills/35-data-pipeline.d.ts +3 -0
- package/dist/skills/35-data-pipeline.d.ts.map +1 -0
- package/dist/skills/35-data-pipeline.js +392 -0
- package/dist/skills/35-data-pipeline.js.map +1 -0
- package/dist/skills/36-ml-experiment.d.ts +3 -0
- package/dist/skills/36-ml-experiment.d.ts.map +1 -0
- package/dist/skills/36-ml-experiment.js +415 -0
- package/dist/skills/36-ml-experiment.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/pipeline.d.ts.map +1 -1
- package/dist/skills/pipeline.js +35 -0
- package/dist/skills/pipeline.js.map +1 -1
- package/dist/skills/skills.test.js +3 -3
- package/dist/skills/skills.test.js.map +1 -1
- package/package.json +1 -1
- package/rules/claude-code/CLAUDE.md +2963 -3
- package/rules/cline/.clinerules +2805 -2
- package/rules/codebuddy/CODEBUDDY.md +2913 -2
- package/rules/continue/.continuerules +2805 -2
- package/rules/copilot/copilot-instructions.md +2883 -2
- package/rules/cursor/.cursorrules +2952 -2
- package/rules/cursor/smart-flow.mdc +2952 -2
- package/rules/jetbrains/smart-flow.md +2883 -2
- package/rules/lingma/smart-flow.md +2904 -3
- package/rules/windsurf/.windsurf/rules/smart-flow.md +2884 -3
- package/rules/zed/smart-flow.rules +2794 -1
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mlExperimentSkill = void 0;
|
|
4
|
+
exports.mlExperimentSkill = {
|
|
5
|
+
id: 'ml-experiment',
|
|
6
|
+
name: 'ML 实验管理',
|
|
7
|
+
nameEn: 'ml_experiment',
|
|
8
|
+
order: 36,
|
|
9
|
+
description: '规范 ML 实验设计、追踪配置(MLflow/W&B)、数据版本控制、Model Card 生成与部署监控',
|
|
10
|
+
descriptionEn: 'Standardize ML experiment design, tracking config (MLflow/W&B), data versioning, Model Card generation and deployment monitoring',
|
|
11
|
+
detailDescription: `ML 项目最大的痛点是"不可复现"——换台机器、换个版本就跑不出相同结果。
|
|
12
|
+
本 Skill 建立系统化的 ML 工程规范:从假设驱动的实验设计,
|
|
13
|
+
到 MLflow/W&B 实验追踪配置,再到 DVC 数据版本控制和特征工程复现,
|
|
14
|
+
生成标准化的 Model Card,最终覆盖模型注册、A/B 上线、数据漂移监控和自动回滚,
|
|
15
|
+
让 ML 实验从"炼丹"变为"可控的工程实践"。`,
|
|
16
|
+
triggers: [
|
|
17
|
+
'ml experiment',
|
|
18
|
+
'mlops',
|
|
19
|
+
'model training',
|
|
20
|
+
'模型训练',
|
|
21
|
+
'实验追踪',
|
|
22
|
+
'model card',
|
|
23
|
+
'mlflow',
|
|
24
|
+
'wandb',
|
|
25
|
+
'dvc',
|
|
26
|
+
'机器学习实验',
|
|
27
|
+
'@ethan ml-experiment',
|
|
28
|
+
'/ml-experiment',
|
|
29
|
+
],
|
|
30
|
+
steps: [
|
|
31
|
+
{
|
|
32
|
+
title: '1. 实验设计',
|
|
33
|
+
content: `在开始训练前明确实验目标和控制变量:
|
|
34
|
+
|
|
35
|
+
**假设驱动实验设计**
|
|
36
|
+
\`\`\`markdown
|
|
37
|
+
## 实验设计文档
|
|
38
|
+
|
|
39
|
+
### 研究问题
|
|
40
|
+
我们假设:[变量 X] 会导致 [指标 Y] 提升 [Z%],
|
|
41
|
+
因为 [理论依据或先验知识]。
|
|
42
|
+
|
|
43
|
+
### 实验配置
|
|
44
|
+
- 控制组(Baseline):[现有模型/方法描述]
|
|
45
|
+
- 实验组:[变更内容描述]
|
|
46
|
+
- 控制变量:[保持不变的因素:数据集/超参/随机种子]
|
|
47
|
+
|
|
48
|
+
### 评估指标
|
|
49
|
+
- 主要指标:AUC-ROC(因为关注排序,不关注具体阈值)
|
|
50
|
+
- 次要指标:Precision@K, Recall@K
|
|
51
|
+
- 业务指标:CTR 提升(线上 A/B 验证)
|
|
52
|
+
|
|
53
|
+
### 成功标准
|
|
54
|
+
- 主要指标提升 ≥ 2%(统计显著性 p < 0.05)
|
|
55
|
+
- 推理延迟不增加超过 20%
|
|
56
|
+
- 训练成本不超过 $50
|
|
57
|
+
\`\`\`
|
|
58
|
+
|
|
59
|
+
**实验矩阵(超参搜索)**
|
|
60
|
+
\`\`\`python
|
|
61
|
+
# 使用 Optuna 自动超参优化
|
|
62
|
+
import optuna
|
|
63
|
+
|
|
64
|
+
def objective(trial):
|
|
65
|
+
params = {
|
|
66
|
+
'learning_rate': trial.suggest_float('lr', 1e-5, 1e-1, log=True),
|
|
67
|
+
'batch_size': trial.suggest_categorical('batch_size', [16, 32, 64, 128]),
|
|
68
|
+
'dropout': trial.suggest_float('dropout', 0.1, 0.5),
|
|
69
|
+
'hidden_dim': trial.suggest_int('hidden_dim', 64, 512, step=64),
|
|
70
|
+
}
|
|
71
|
+
model = train_model(**params)
|
|
72
|
+
return evaluate(model)['auc']
|
|
73
|
+
|
|
74
|
+
study = optuna.create_study(direction='maximize')
|
|
75
|
+
study.optimize(objective, n_trials=50, timeout=3600)
|
|
76
|
+
print(f"Best params: {study.best_params}")
|
|
77
|
+
\`\`\`
|
|
78
|
+
|
|
79
|
+
**最小可行实验(MVE)原则**
|
|
80
|
+
\`\`\`
|
|
81
|
+
先用 10% 数据快速验证假设(10min 训练)
|
|
82
|
+
→ 有提升信号 → 扩展到全量数据
|
|
83
|
+
→ 无提升信号 → 调整假设重新实验
|
|
84
|
+
\`\`\`
|
|
85
|
+
|
|
86
|
+
**输出**:实验设计文档 + 评估指标定义 + 超参搜索配置`,
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
title: '2. 实验追踪配置',
|
|
90
|
+
content: `配置 MLflow 或 W&B 实现实验全自动追踪:
|
|
91
|
+
|
|
92
|
+
**MLflow 完整配置**
|
|
93
|
+
\`\`\`python
|
|
94
|
+
import mlflow
|
|
95
|
+
import mlflow.pytorch
|
|
96
|
+
|
|
97
|
+
# 配置追踪服务器
|
|
98
|
+
mlflow.set_tracking_uri("http://mlflow-server:5000")
|
|
99
|
+
mlflow.set_experiment("recommendation-model-v2")
|
|
100
|
+
|
|
101
|
+
with mlflow.start_run(run_name="bert-finetune-lr1e-4") as run:
|
|
102
|
+
# 记录所有超参
|
|
103
|
+
mlflow.log_params({
|
|
104
|
+
"model_name": "bert-base-chinese",
|
|
105
|
+
"learning_rate": 1e-4,
|
|
106
|
+
"batch_size": 32,
|
|
107
|
+
"epochs": 10,
|
|
108
|
+
"optimizer": "AdamW",
|
|
109
|
+
"warmup_steps": 500,
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
# 记录数据集信息
|
|
113
|
+
mlflow.log_param("train_samples", len(train_dataset))
|
|
114
|
+
mlflow.log_param("data_version", "v2024-01-15")
|
|
115
|
+
|
|
116
|
+
for epoch in range(config.epochs):
|
|
117
|
+
train_loss = train_epoch(model, train_loader)
|
|
118
|
+
val_metrics = evaluate(model, val_loader)
|
|
119
|
+
|
|
120
|
+
# 实时记录指标
|
|
121
|
+
mlflow.log_metrics({
|
|
122
|
+
"train_loss": train_loss,
|
|
123
|
+
"val_loss": val_metrics['loss'],
|
|
124
|
+
"val_auc": val_metrics['auc'],
|
|
125
|
+
"val_f1": val_metrics['f1'],
|
|
126
|
+
}, step=epoch)
|
|
127
|
+
|
|
128
|
+
# 注册最终模型
|
|
129
|
+
mlflow.pytorch.log_model(
|
|
130
|
+
model,
|
|
131
|
+
"model",
|
|
132
|
+
registered_model_name="recommendation-model",
|
|
133
|
+
pip_requirements=["torch==2.1.0", "transformers==4.35.0"],
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
# 记录评估报告
|
|
137
|
+
mlflow.log_artifact("reports/confusion_matrix.png")
|
|
138
|
+
mlflow.log_artifact("reports/feature_importance.html")
|
|
139
|
+
|
|
140
|
+
print(f"Run ID: {run.info.run_id}")
|
|
141
|
+
\`\`\`
|
|
142
|
+
|
|
143
|
+
**W&B 配置(更丰富的可视化)**
|
|
144
|
+
\`\`\`python
|
|
145
|
+
import wandb
|
|
146
|
+
|
|
147
|
+
wandb.init(
|
|
148
|
+
project="recommendation-v2",
|
|
149
|
+
name="bert-finetune-lr1e-4",
|
|
150
|
+
config={
|
|
151
|
+
"learning_rate": 1e-4,
|
|
152
|
+
"architecture": "bert-base",
|
|
153
|
+
"dataset": "user-clicks-v2",
|
|
154
|
+
},
|
|
155
|
+
tags=["bert", "production-candidate"],
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
# 自动记录梯度和权重(PyTorch)
|
|
159
|
+
wandb.watch(model, log='all', log_freq=100)
|
|
160
|
+
|
|
161
|
+
# 训练循环中
|
|
162
|
+
wandb.log({"train_loss": loss, "val_auc": auc}, step=epoch)
|
|
163
|
+
|
|
164
|
+
# 完成时
|
|
165
|
+
wandb.finish()
|
|
166
|
+
\`\`\`
|
|
167
|
+
|
|
168
|
+
**输出**:MLflow/W&B 实验追踪配置 + 训练脚本模板`,
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
title: '3. 数据版本控制',
|
|
172
|
+
content: `使用 DVC 管理数据集和特征工程的版本:
|
|
173
|
+
|
|
174
|
+
**DVC 初始化与数据版本管理**
|
|
175
|
+
\`\`\`bash
|
|
176
|
+
# 初始化 DVC(与 Git 协同)
|
|
177
|
+
git init && dvc init
|
|
178
|
+
|
|
179
|
+
# 添加数据集到 DVC 管理
|
|
180
|
+
dvc add data/train.parquet
|
|
181
|
+
dvc add data/test.parquet
|
|
182
|
+
git add data/.gitignore data/train.parquet.dvc data/test.parquet.dvc
|
|
183
|
+
git commit -m "Add training data v1"
|
|
184
|
+
|
|
185
|
+
# 配置远程存储(S3/GCS/Azure)
|
|
186
|
+
dvc remote add -d myremote s3://my-ml-bucket/dvc-store
|
|
187
|
+
dvc push # 上传数据到远程
|
|
188
|
+
|
|
189
|
+
# 切换到不同数据版本
|
|
190
|
+
git checkout v1.0-data-tag
|
|
191
|
+
dvc pull # 下载对应版本数据
|
|
192
|
+
\`\`\`
|
|
193
|
+
|
|
194
|
+
**特征工程管道(可复现)**
|
|
195
|
+
\`\`\`python
|
|
196
|
+
# dvc.yaml — 定义可复现的管道
|
|
197
|
+
stages:
|
|
198
|
+
prepare_data:
|
|
199
|
+
cmd: python src/prepare.py --input data/raw --output data/prepared
|
|
200
|
+
deps:
|
|
201
|
+
- src/prepare.py
|
|
202
|
+
- data/raw
|
|
203
|
+
outs:
|
|
204
|
+
- data/prepared
|
|
205
|
+
|
|
206
|
+
feature_engineering:
|
|
207
|
+
cmd: python src/features.py --input data/prepared --output data/features
|
|
208
|
+
deps:
|
|
209
|
+
- src/features.py
|
|
210
|
+
- data/prepared
|
|
211
|
+
- params.yaml # 特征工程超参
|
|
212
|
+
outs:
|
|
213
|
+
- data/features
|
|
214
|
+
metrics:
|
|
215
|
+
- reports/feature_stats.json
|
|
216
|
+
|
|
217
|
+
train:
|
|
218
|
+
cmd: python src/train.py
|
|
219
|
+
deps:
|
|
220
|
+
- src/train.py
|
|
221
|
+
- data/features
|
|
222
|
+
outs:
|
|
223
|
+
- models/model.pkl
|
|
224
|
+
metrics:
|
|
225
|
+
- reports/metrics.json
|
|
226
|
+
\`\`\`
|
|
227
|
+
|
|
228
|
+
\`\`\`bash
|
|
229
|
+
# 运行完整管道(只重新执行有变化的阶段)
|
|
230
|
+
dvc repro
|
|
231
|
+
|
|
232
|
+
# 对比不同版本的指标
|
|
233
|
+
dvc metrics diff v1.0 v2.0
|
|
234
|
+
# ┌──────────────┬───────┬───────┬────────┐
|
|
235
|
+
# │ Metric │ HEAD │ v1.0 │ Change │
|
|
236
|
+
# ├──────────────┼───────┼───────┼────────┤
|
|
237
|
+
# │ val_auc │ 0.847 │ 0.831 │ +0.016 │
|
|
238
|
+
# └──────────────┴───────┴───────┴────────┘
|
|
239
|
+
\`\`\`
|
|
240
|
+
|
|
241
|
+
**输出**:DVC 配置 + 特征管道 dvc.yaml + 版本对比命令`,
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
title: '4. Model Card 生成',
|
|
245
|
+
content: `为每个发布的模型生成标准化的 Model Card:
|
|
246
|
+
|
|
247
|
+
**Model Card 模板**
|
|
248
|
+
\`\`\`markdown
|
|
249
|
+
# Model Card: 推荐模型 v2.1.0
|
|
250
|
+
|
|
251
|
+
## 模型概述
|
|
252
|
+
- **模型类型**:双塔召回模型(BERT + 协同过滤)
|
|
253
|
+
- **任务**:电商商品推荐
|
|
254
|
+
- **训练日期**:2024-01-20
|
|
255
|
+
- **版本**:v2.1.0
|
|
256
|
+
- **MLflow Run ID**:abc123def456
|
|
257
|
+
|
|
258
|
+
## 预期用途
|
|
259
|
+
### 主要用途
|
|
260
|
+
为已登录用户生成个性化商品推荐,覆盖首页、详情页猜你喜欢。
|
|
261
|
+
|
|
262
|
+
### 不适合的用途
|
|
263
|
+
- 冷启动用户(注册 < 7 天)→ 使用热门推荐替代
|
|
264
|
+
- 价格敏感决策(不提供价格预测)
|
|
265
|
+
|
|
266
|
+
## 训练数据
|
|
267
|
+
- **数据集**:user-click-events v2024-01
|
|
268
|
+
- **训练样本**:5,200,000 条用户点击行为
|
|
269
|
+
- **时间范围**:2023-07-01 ~ 2023-12-31
|
|
270
|
+
- **数据版本**:DVC tag \`data-v2024-01\`
|
|
271
|
+
|
|
272
|
+
## 性能指标
|
|
273
|
+
| 指标 | 离线值 | 在线 A/B(1周) |
|
|
274
|
+
|------|--------|---------------|
|
|
275
|
+
| Recall@20 | 0.847 | 0.821 |
|
|
276
|
+
| NDCG@20 | 0.623 | 0.598 |
|
|
277
|
+
| CTR | — | +4.2%(vs 旧模型)|
|
|
278
|
+
| Latency P99 | 45ms | 52ms |
|
|
279
|
+
|
|
280
|
+
## 偏差与公平性
|
|
281
|
+
- 对新品(上架 < 30 天)存在曝光不足偏差 → 已通过 Explore 策略缓解
|
|
282
|
+
- 价格区间分布分析:低价商品点击率被高估(训练集偏差)→ 已加权修正
|
|
283
|
+
|
|
284
|
+
## 限制
|
|
285
|
+
- 模型不包含实时库存信息,需上层过滤下架商品
|
|
286
|
+
- 不支持多语言商品(仅中文描述)
|
|
287
|
+
|
|
288
|
+
## 负责任的 AI 声明
|
|
289
|
+
- 不使用性别/年龄等受保护属性作为特征
|
|
290
|
+
- 符合公司隐私政策,用户行为数据已脱敏处理
|
|
291
|
+
\`\`\`
|
|
292
|
+
|
|
293
|
+
**自动生成脚本**
|
|
294
|
+
\`\`\`python
|
|
295
|
+
def generate_model_card(run_id: str, ab_results: dict) -> str:
|
|
296
|
+
"""从 MLflow run 自动生成 Model Card"""
|
|
297
|
+
run = mlflow.get_run(run_id)
|
|
298
|
+
params = run.data.params
|
|
299
|
+
metrics = run.data.metrics
|
|
300
|
+
|
|
301
|
+
return MODEL_CARD_TEMPLATE.format(
|
|
302
|
+
version=params.get('model_version'),
|
|
303
|
+
train_date=run.info.start_time,
|
|
304
|
+
recall_at_20=metrics.get('val_recall_at_20'),
|
|
305
|
+
ctr_lift=ab_results.get('ctr_lift'),
|
|
306
|
+
run_id=run_id,
|
|
307
|
+
)
|
|
308
|
+
\`\`\`
|
|
309
|
+
|
|
310
|
+
**输出**:Model Card 文档 + 自动生成脚本`,
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
title: '5. 部署与监控',
|
|
314
|
+
content: `模型上线、A/B 测试和生产监控完整方案:
|
|
315
|
+
|
|
316
|
+
**模型注册与晋升流程**
|
|
317
|
+
\`\`\`python
|
|
318
|
+
# MLflow 模型注册与阶段管理
|
|
319
|
+
from mlflow.tracking import MlflowClient
|
|
320
|
+
|
|
321
|
+
client = MlflowClient()
|
|
322
|
+
|
|
323
|
+
# 注册模型
|
|
324
|
+
model_uri = f"runs:/{run_id}/model"
|
|
325
|
+
mv = client.create_model_version(
|
|
326
|
+
name="recommendation-model",
|
|
327
|
+
source=model_uri,
|
|
328
|
+
run_id=run_id,
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
# 模型阶段:None → Staging → Production
|
|
332
|
+
# 先晋升到 Staging(测试)
|
|
333
|
+
client.transition_model_version_stage(
|
|
334
|
+
name="recommendation-model",
|
|
335
|
+
version=mv.version,
|
|
336
|
+
stage="Staging",
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
# 验证通过后晋升到 Production
|
|
340
|
+
client.transition_model_version_stage(
|
|
341
|
+
name="recommendation-model",
|
|
342
|
+
version=mv.version,
|
|
343
|
+
stage="Production",
|
|
344
|
+
archive_existing_versions=True, # 归档旧版本
|
|
345
|
+
)
|
|
346
|
+
\`\`\`
|
|
347
|
+
|
|
348
|
+
**A/B 测试配置**
|
|
349
|
+
\`\`\`python
|
|
350
|
+
# 按用户哈希分流
|
|
351
|
+
def get_model_for_user(user_id: str) -> str:
|
|
352
|
+
hash_val = int(hashlib.md5(user_id.encode()).hexdigest(), 16) % 100
|
|
353
|
+
if hash_val < 10: # 10% 流量
|
|
354
|
+
return "recommendation-model:v2.1.0"
|
|
355
|
+
else:
|
|
356
|
+
return "recommendation-model:v2.0.0"
|
|
357
|
+
|
|
358
|
+
# 记录 A/B 分组(用于统计分析)
|
|
359
|
+
mlflow.log_param("ab_group", "control" if version == "v2.0.0" else "treatment")
|
|
360
|
+
\`\`\`
|
|
361
|
+
|
|
362
|
+
**数据漂移监控(Evidently)**
|
|
363
|
+
\`\`\`python
|
|
364
|
+
from evidently.report import Report
|
|
365
|
+
from evidently.metric_preset import DataDriftPreset, ModelPerformancePreset
|
|
366
|
+
|
|
367
|
+
# 对比训练数据分布 vs 生产数据分布
|
|
368
|
+
report = Report(metrics=[
|
|
369
|
+
DataDriftPreset(), # 特征分布漂移
|
|
370
|
+
ModelPerformancePreset(), # 模型性能漂移
|
|
371
|
+
])
|
|
372
|
+
|
|
373
|
+
report.run(reference_data=train_df, current_data=production_df_last_7d)
|
|
374
|
+
report.save_html("reports/drift_report.html")
|
|
375
|
+
|
|
376
|
+
# 自动回滚条件
|
|
377
|
+
drift_detected = report.as_dict()['metrics'][0]['result']['dataset_drift']
|
|
378
|
+
if drift_detected:
|
|
379
|
+
alert_and_rollback(reason="Feature distribution drift detected")
|
|
380
|
+
\`\`\`
|
|
381
|
+
|
|
382
|
+
**生产监控仪表盘**
|
|
383
|
+
\`\`\`
|
|
384
|
+
关键指标(每日监控):
|
|
385
|
+
─────────────────────────────────
|
|
386
|
+
模型性能:
|
|
387
|
+
在线 CTR(实验 vs 对照)
|
|
388
|
+
推荐命中率(Recall@K)
|
|
389
|
+
|
|
390
|
+
数据漂移:
|
|
391
|
+
用户特征分布变化(PSI > 0.2 告警)
|
|
392
|
+
商品特征新增/消失比率
|
|
393
|
+
|
|
394
|
+
运维指标:
|
|
395
|
+
推理延迟 P99(< 100ms)
|
|
396
|
+
模型服务错误率(< 0.1%)
|
|
397
|
+
预测请求量(异常波动告警)
|
|
398
|
+
\`\`\`
|
|
399
|
+
|
|
400
|
+
**输出**:模型注册流程 + A/B 测试配置 + 漂移监控脚本 + 自动回滚方案`,
|
|
401
|
+
},
|
|
402
|
+
],
|
|
403
|
+
outputFormat: '实验设计文档 + MLflow/W&B 追踪配置 + DVC 数据管道 + Model Card + 部署 A/B 测试方案 + 漂移监控配置',
|
|
404
|
+
examples: [],
|
|
405
|
+
notes: [
|
|
406
|
+
'实验追踪不是可选项——没有追踪记录的实验结果无法复现,也无法与团队分享',
|
|
407
|
+
'每个 MLflow/W&B Run 必须记录数据版本,否则6个月后无法知道用了哪份训练数据',
|
|
408
|
+
'Model Card 对外部合作和监管合规至关重要,建议与模型一起版本化管理',
|
|
409
|
+
'数据漂移监控比模型指标监控更重要——漂移发生在指标下降之前',
|
|
410
|
+
'优先用 MLflow(开源自托管)降低工具成本;大团队再考虑 W&B 或 Vertex AI 等商业方案',
|
|
411
|
+
],
|
|
412
|
+
category: '执行侧',
|
|
413
|
+
nextSkill: 'data-pipeline',
|
|
414
|
+
};
|
|
415
|
+
//# sourceMappingURL=36-ml-experiment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"36-ml-experiment.js","sourceRoot":"","sources":["../../src/skills/36-ml-experiment.ts"],"names":[],"mappings":";;;AAEa,QAAA,iBAAiB,GAAoB;IAChD,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,eAAe;IACvB,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,uDAAuD;IACpE,aAAa,EAAE,kIAAkI;IACjJ,iBAAiB,EAAE;;;;yBAII;IACvB,QAAQ,EAAE;QACR,eAAe;QACf,OAAO;QACP,gBAAgB;QAChB,MAAM;QACN,MAAM;QACN,YAAY;QACZ,QAAQ;QACR,OAAO;QACP,KAAK;QACL,QAAQ;QACR,sBAAsB;QACtB,gBAAgB;KACjB;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAqDiB;SAC3B;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kCA8EmB;SAC7B;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCAqEwB;SAClC;QACD;YACE,KAAK,EAAE,kBAAkB;YACzB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAiEe;SACzB;QACD;YACE,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAsF4B;SACtC;KACF;IACD,YAAY,EAAE,yEAAyE;IACvF,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE;QACL,qCAAqC;QACrC,+CAA+C;QAC/C,wCAAwC;QACxC,+BAA+B;QAC/B,sDAAsD;KACvD;IACD,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,eAAe;CAC3B,CAAC"}
|
package/dist/skills/index.d.ts
CHANGED
|
@@ -28,6 +28,16 @@ export { observabilitySkill } from './23-observability';
|
|
|
28
28
|
export { designPatternsSkill } from './24-design-patterns';
|
|
29
29
|
export { specProposalSkill } from './25-spec-proposal';
|
|
30
30
|
export { specReviewSkill } from './26-spec-review';
|
|
31
|
+
export { techDebtSkill } from './27-tech-debt';
|
|
32
|
+
export { apiMockSkill } from './28-api-mock';
|
|
33
|
+
export { dataMigrationSkill } from './29-data-migration';
|
|
34
|
+
export { llmFeatureSkill } from './30-llm-feature';
|
|
35
|
+
export { threatModelSkill } from './31-threat-model';
|
|
36
|
+
export { greenCodeSkill } from './32-green-code';
|
|
37
|
+
export { serviceCatalogSkill } from './33-service-catalog';
|
|
38
|
+
export { mobileReviewSkill } from './34-mobile-review';
|
|
39
|
+
export { dataPipelineSkill } from './35-data-pipeline';
|
|
40
|
+
export { mlExperimentSkill } from './36-ml-experiment';
|
|
31
41
|
export type { SkillDefinition, SkillStep, SkillExample, Platform, BuildContext, PipelineDefinition } from './types';
|
|
32
42
|
/** 所有 Skill 按顺序排列 */
|
|
33
43
|
export declare const ALL_SKILLS: import("./types").SkillDefinition[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAuCpH,qBAAqB;AACrB,eAAO,MAAM,UAAU,qCAqCtB,CAAC"}
|
package/dist/skills/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* 构建脚本和运行时均从此文件取数据
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ALL_SKILLS = exports.specReviewSkill = exports.specProposalSkill = exports.designPatternsSkill = exports.observabilitySkill = exports.refactoringSkill = exports.performanceSkill = exports.cicdSkill = exports.dockerSkill = exports.databaseOptimizeSkill = exports.systemDesignSkill = exports.unitTestingSkill = exports.gitWorkflowSkill = exports.prdSkill = exports.deploymentSkill = exports.securityReviewSkill = exports.apiDesignSkill = exports.techResearchSkill = exports.debugSkill = exports.codeReviewSkill = exports.weeklyReportSkill = exports.taskReportSkill = exports.progressTrackingSkill = exports.implementationSkill = exports.designSkill = exports.taskBreakdownSkill = exports.requirementSkill = void 0;
|
|
7
|
+
exports.ALL_SKILLS = exports.mlExperimentSkill = exports.dataPipelineSkill = exports.mobileReviewSkill = exports.serviceCatalogSkill = exports.greenCodeSkill = exports.threatModelSkill = exports.llmFeatureSkill = exports.dataMigrationSkill = exports.apiMockSkill = exports.techDebtSkill = exports.specReviewSkill = exports.specProposalSkill = exports.designPatternsSkill = exports.observabilitySkill = exports.refactoringSkill = exports.performanceSkill = exports.cicdSkill = exports.dockerSkill = exports.databaseOptimizeSkill = exports.systemDesignSkill = exports.unitTestingSkill = exports.gitWorkflowSkill = exports.prdSkill = exports.deploymentSkill = exports.securityReviewSkill = exports.apiDesignSkill = exports.techResearchSkill = exports.debugSkill = exports.codeReviewSkill = exports.weeklyReportSkill = exports.taskReportSkill = exports.progressTrackingSkill = exports.implementationSkill = exports.designSkill = exports.taskBreakdownSkill = exports.requirementSkill = void 0;
|
|
8
8
|
var _01_requirement_1 = require("./01-requirement");
|
|
9
9
|
Object.defineProperty(exports, "requirementSkill", { enumerable: true, get: function () { return _01_requirement_1.requirementSkill; } });
|
|
10
10
|
var _02_task_breakdown_1 = require("./02-task-breakdown");
|
|
@@ -57,6 +57,26 @@ var _25_spec_proposal_1 = require("./25-spec-proposal");
|
|
|
57
57
|
Object.defineProperty(exports, "specProposalSkill", { enumerable: true, get: function () { return _25_spec_proposal_1.specProposalSkill; } });
|
|
58
58
|
var _26_spec_review_1 = require("./26-spec-review");
|
|
59
59
|
Object.defineProperty(exports, "specReviewSkill", { enumerable: true, get: function () { return _26_spec_review_1.specReviewSkill; } });
|
|
60
|
+
var _27_tech_debt_1 = require("./27-tech-debt");
|
|
61
|
+
Object.defineProperty(exports, "techDebtSkill", { enumerable: true, get: function () { return _27_tech_debt_1.techDebtSkill; } });
|
|
62
|
+
var _28_api_mock_1 = require("./28-api-mock");
|
|
63
|
+
Object.defineProperty(exports, "apiMockSkill", { enumerable: true, get: function () { return _28_api_mock_1.apiMockSkill; } });
|
|
64
|
+
var _29_data_migration_1 = require("./29-data-migration");
|
|
65
|
+
Object.defineProperty(exports, "dataMigrationSkill", { enumerable: true, get: function () { return _29_data_migration_1.dataMigrationSkill; } });
|
|
66
|
+
var _30_llm_feature_1 = require("./30-llm-feature");
|
|
67
|
+
Object.defineProperty(exports, "llmFeatureSkill", { enumerable: true, get: function () { return _30_llm_feature_1.llmFeatureSkill; } });
|
|
68
|
+
var _31_threat_model_1 = require("./31-threat-model");
|
|
69
|
+
Object.defineProperty(exports, "threatModelSkill", { enumerable: true, get: function () { return _31_threat_model_1.threatModelSkill; } });
|
|
70
|
+
var _32_green_code_1 = require("./32-green-code");
|
|
71
|
+
Object.defineProperty(exports, "greenCodeSkill", { enumerable: true, get: function () { return _32_green_code_1.greenCodeSkill; } });
|
|
72
|
+
var _33_service_catalog_1 = require("./33-service-catalog");
|
|
73
|
+
Object.defineProperty(exports, "serviceCatalogSkill", { enumerable: true, get: function () { return _33_service_catalog_1.serviceCatalogSkill; } });
|
|
74
|
+
var _34_mobile_review_1 = require("./34-mobile-review");
|
|
75
|
+
Object.defineProperty(exports, "mobileReviewSkill", { enumerable: true, get: function () { return _34_mobile_review_1.mobileReviewSkill; } });
|
|
76
|
+
var _35_data_pipeline_1 = require("./35-data-pipeline");
|
|
77
|
+
Object.defineProperty(exports, "dataPipelineSkill", { enumerable: true, get: function () { return _35_data_pipeline_1.dataPipelineSkill; } });
|
|
78
|
+
var _36_ml_experiment_1 = require("./36-ml-experiment");
|
|
79
|
+
Object.defineProperty(exports, "mlExperimentSkill", { enumerable: true, get: function () { return _36_ml_experiment_1.mlExperimentSkill; } });
|
|
60
80
|
const _01_requirement_2 = require("./01-requirement");
|
|
61
81
|
const _02_task_breakdown_2 = require("./02-task-breakdown");
|
|
62
82
|
const _03_design_2 = require("./03-design");
|
|
@@ -83,6 +103,16 @@ const _23_observability_2 = require("./23-observability");
|
|
|
83
103
|
const _24_design_patterns_2 = require("./24-design-patterns");
|
|
84
104
|
const _25_spec_proposal_2 = require("./25-spec-proposal");
|
|
85
105
|
const _26_spec_review_2 = require("./26-spec-review");
|
|
106
|
+
const _27_tech_debt_2 = require("./27-tech-debt");
|
|
107
|
+
const _28_api_mock_2 = require("./28-api-mock");
|
|
108
|
+
const _29_data_migration_2 = require("./29-data-migration");
|
|
109
|
+
const _30_llm_feature_2 = require("./30-llm-feature");
|
|
110
|
+
const _31_threat_model_2 = require("./31-threat-model");
|
|
111
|
+
const _32_green_code_2 = require("./32-green-code");
|
|
112
|
+
const _33_service_catalog_2 = require("./33-service-catalog");
|
|
113
|
+
const _34_mobile_review_2 = require("./34-mobile-review");
|
|
114
|
+
const _35_data_pipeline_2 = require("./35-data-pipeline");
|
|
115
|
+
const _36_ml_experiment_2 = require("./36-ml-experiment");
|
|
86
116
|
/** 所有 Skill 按顺序排列 */
|
|
87
117
|
exports.ALL_SKILLS = [
|
|
88
118
|
_01_requirement_2.requirementSkill,
|
|
@@ -111,5 +141,15 @@ exports.ALL_SKILLS = [
|
|
|
111
141
|
_24_design_patterns_2.designPatternsSkill,
|
|
112
142
|
_25_spec_proposal_2.specProposalSkill,
|
|
113
143
|
_26_spec_review_2.specReviewSkill,
|
|
144
|
+
_27_tech_debt_2.techDebtSkill,
|
|
145
|
+
_28_api_mock_2.apiMockSkill,
|
|
146
|
+
_29_data_migration_2.dataMigrationSkill,
|
|
147
|
+
_30_llm_feature_2.llmFeatureSkill,
|
|
148
|
+
_31_threat_model_2.threatModelSkill,
|
|
149
|
+
_32_green_code_2.greenCodeSkill,
|
|
150
|
+
_33_service_catalog_2.serviceCatalogSkill,
|
|
151
|
+
_34_mobile_review_2.mobileReviewSkill,
|
|
152
|
+
_35_data_pipeline_2.dataPipelineSkill,
|
|
153
|
+
_36_ml_experiment_2.mlExperimentSkill,
|
|
114
154
|
];
|
|
115
155
|
//# sourceMappingURL=index.js.map
|
package/dist/skills/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,oDAAoD;AAA3C,mHAAA,gBAAgB,OAAA;AACzB,0DAAyD;AAAhD,wHAAA,kBAAkB,OAAA;AAC3B,0CAA0C;AAAjC,yGAAA,WAAW,OAAA;AACpB,0DAA0D;AAAjD,yHAAA,mBAAmB,OAAA;AAC5B,gEAA+D;AAAtD,8HAAA,qBAAqB,OAAA;AAC9B,oDAAmD;AAA1C,kHAAA,eAAe,OAAA;AACxB,wDAAuD;AAA9C,sHAAA,iBAAiB,OAAA;AAC1B,oDAAmD;AAA1C,kHAAA,eAAe,OAAA;AACxB,wCAAwC;AAA/B,uGAAA,UAAU,OAAA;AACnB,wDAAuD;AAA9C,sHAAA,iBAAiB,OAAA;AAC1B,kDAAiD;AAAxC,gHAAA,cAAc,OAAA;AACvB,4DAA2D;AAAlD,0HAAA,mBAAmB,OAAA;AAC5B,kDAAkD;AAAzC,iHAAA,eAAe,OAAA;AACxB,oCAAoC;AAA3B,mGAAA,QAAQ,OAAA;AACjB,sDAAqD;AAA5C,oHAAA,gBAAgB,OAAA;AACzB,sDAAqD;AAA5C,oHAAA,gBAAgB,OAAA;AACzB,wDAAuD;AAA9C,sHAAA,iBAAiB,OAAA;AAC1B,gEAA+D;AAAtD,8HAAA,qBAAqB,OAAA;AAC9B,0CAA0C;AAAjC,yGAAA,WAAW,OAAA;AACpB,sCAAsC;AAA7B,qGAAA,SAAS,OAAA;AAClB,oDAAoD;AAA3C,mHAAA,gBAAgB,OAAA;AACzB,oDAAoD;AAA3C,mHAAA,gBAAgB,OAAA;AACzB,wDAAwD;AAA/C,uHAAA,kBAAkB,OAAA;AAC3B,4DAA2D;AAAlD,0HAAA,mBAAmB,OAAA;AAC5B,wDAAuD;AAA9C,sHAAA,iBAAiB,OAAA;AAC1B,oDAAmD;AAA1C,kHAAA,eAAe,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/skills/pipeline.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGnE,eAAO,MAAM,SAAS,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/skills/pipeline.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGnE,eAAO,MAAM,SAAS,EAAE,kBAAkB,EAiHzC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,eAAe,CAAC,EAAE,kBAAkB,EAAE,EACtC,SAAS,CAAC,EAAE,eAAe,EAAE,GAC5B;IAAE,QAAQ,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,GAAG,IAAI,CAWpE"}
|
package/dist/skills/pipeline.js
CHANGED
|
@@ -86,6 +86,41 @@ exports.PIPELINES = [
|
|
|
86
86
|
'spec-review',
|
|
87
87
|
],
|
|
88
88
|
},
|
|
89
|
+
{
|
|
90
|
+
id: 'bugfix-workflow',
|
|
91
|
+
name: 'Bug 修复工作流',
|
|
92
|
+
description: '规范化 Bug 修复流程:故障排查 → 变更提案 → 执行实现 → 单元测试 → 意图审查',
|
|
93
|
+
skillIds: [
|
|
94
|
+
'debug',
|
|
95
|
+
'spec-proposal',
|
|
96
|
+
'implementation',
|
|
97
|
+
'unit-testing',
|
|
98
|
+
'spec-review',
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: 'security-audit-workflow',
|
|
103
|
+
name: '安全审计工作流',
|
|
104
|
+
description: '端到端安全审计:威胁建模 → 安全审查 → 变更提案 → 执行实现 → 意图审查',
|
|
105
|
+
skillIds: [
|
|
106
|
+
'threat-model',
|
|
107
|
+
'security-review',
|
|
108
|
+
'spec-proposal',
|
|
109
|
+
'implementation',
|
|
110
|
+
'spec-review',
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
id: 'open-source-release',
|
|
115
|
+
name: '开源发布工作流',
|
|
116
|
+
description: '开源项目规范发布:技术调研 → 代码审查 → 单元测试 → 部署上线',
|
|
117
|
+
skillIds: [
|
|
118
|
+
'tech-research',
|
|
119
|
+
'code-review',
|
|
120
|
+
'unit-testing',
|
|
121
|
+
'deployment',
|
|
122
|
+
],
|
|
123
|
+
},
|
|
89
124
|
];
|
|
90
125
|
/**
|
|
91
126
|
* 根据 pipeline id 解析出 pipeline 定义和对应的 Skill 列表
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/skills/pipeline.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/skills/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,8 @@ const index_1 = require("./index");
|
|
|
5
5
|
const pipeline_1 = require("./pipeline");
|
|
6
6
|
// ─── ALL_SKILLS 基础契约 ────────────────────────────────────────────────────
|
|
7
7
|
(0, vitest_1.describe)('ALL_SKILLS', () => {
|
|
8
|
-
(0, vitest_1.it)('should contain exactly
|
|
9
|
-
(0, vitest_1.expect)(index_1.ALL_SKILLS).toHaveLength(
|
|
8
|
+
(0, vitest_1.it)('should contain exactly 36 skills', () => {
|
|
9
|
+
(0, vitest_1.expect)(index_1.ALL_SKILLS).toHaveLength(36);
|
|
10
10
|
});
|
|
11
11
|
(0, vitest_1.it)('should have unique ids', () => {
|
|
12
12
|
const ids = index_1.ALL_SKILLS.map((s) => s.id);
|
|
@@ -18,7 +18,7 @@ const pipeline_1 = require("./pipeline");
|
|
|
18
18
|
});
|
|
19
19
|
(0, vitest_1.it)('should have sequential order numbers starting from 1', () => {
|
|
20
20
|
const orders = index_1.ALL_SKILLS.map((s) => s.order).sort((a, b) => a - b);
|
|
21
|
-
(0, vitest_1.expect)(orders).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]);
|
|
21
|
+
(0, vitest_1.expect)(orders).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]);
|
|
22
22
|
});
|
|
23
23
|
(0, vitest_1.it)('every skill should have at least one trigger', () => {
|
|
24
24
|
for (const skill of index_1.ALL_SKILLS) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.test.js","sourceRoot":"","sources":["../../src/skills/skills.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,mCAAqC;AACrC,yCAAwD;AAExD,2EAA2E;AAE3E,IAAA,iBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,IAAA,eAAM,EAAC,kBAAU,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,GAAG,GAAG,kBAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxC,IAAA,eAAM,EAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG,kBAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAA,eAAM,EAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,kBAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.test.js","sourceRoot":"","sources":["../../src/skills/skills.test.ts"],"names":[],"mappings":"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"}
|