ironweave 1.0.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/.claude-plugin/plugin.json +16 -0
- package/.clinerules +7 -0
- package/.codex/INSTALL.md +45 -0
- package/.cursor-plugin/plugin.json +19 -0
- package/.cursorrules +7 -0
- package/.github/copilot-instructions.md +7 -0
- package/.opencode/INSTALL.md +42 -0
- package/.windsurfrules +7 -0
- package/AGENTS.md +1 -0
- package/CLAUDE.md +22 -0
- package/CONTRIBUTING.md +81 -0
- package/GEMINI.md +1 -0
- package/LICENSE +21 -0
- package/README.md +250 -0
- package/README_CN.md +248 -0
- package/package.json +48 -0
- package/skills/api-contract-design/SKILL.md +227 -0
- package/skills/api-contract-design/references/api-design-rules.md +106 -0
- package/skills/brainstorm/SKILL.md +271 -0
- package/skills/brainstorm/agents/architect.md +34 -0
- package/skills/brainstorm/agents/challenger.md +34 -0
- package/skills/brainstorm/agents/domain-expert.md +34 -0
- package/skills/brainstorm/agents/pragmatist.md +34 -0
- package/skills/brainstorm/agents/product-manager.md +34 -0
- package/skills/brainstorm/agents/ux-designer.md +34 -0
- package/skills/brainstorm/references/synthesis-rules.md +51 -0
- package/skills/code-scaffold/SKILL.md +313 -0
- package/skills/code-scaffold/references/scaffold-rules.md +131 -0
- package/skills/docs-output/SKILL.md +149 -0
- package/skills/docs-output/references/naming-rules.md +52 -0
- package/skills/docs-output/scripts/docs_manager.py +353 -0
- package/skills/engineering-principles/SKILL.md +133 -0
- package/skills/engineering-principles/references/anti-patterns.md +144 -0
- package/skills/engineering-principles/references/ddd-patterns.md +66 -0
- package/skills/engineering-principles/references/design-patterns.md +34 -0
- package/skills/engineering-principles/references/patterns-architecture.md +301 -0
- package/skills/engineering-principles/references/patterns-backend.md +77 -0
- package/skills/engineering-principles/references/patterns-classic.md +200 -0
- package/skills/engineering-principles/references/patterns-crosscut.md +67 -0
- package/skills/engineering-principles/references/patterns-frontend.md +27 -0
- package/skills/engineering-principles/references/patterns-module.md +95 -0
- package/skills/engineering-principles/references/patterns-small-scale.md +79 -0
- package/skills/engineering-principles/references/quality-checklist.md +76 -0
- package/skills/engineering-principles/references/solid-principles.md +46 -0
- package/skills/engineering-principles/references/tdd-workflow.md +60 -0
- package/skills/engineering-principles/scripts/principles_matcher.py +433 -0
- package/skills/error-handling-strategy/SKILL.md +347 -0
- package/skills/error-handling-strategy/references/error-handling-rules.md +91 -0
- package/skills/implementation-complexity-analysis/SKILL.md +193 -0
- package/skills/implementation-complexity-analysis/references/complexity-rules.md +126 -0
- package/skills/integration-test-design/SKILL.md +296 -0
- package/skills/integration-test-design/references/test-strategy-rules.md +90 -0
- package/skills/observability-design/SKILL.md +327 -0
- package/skills/observability-design/references/observability-rules.md +129 -0
- package/skills/orchestrator/SKILL.md +260 -0
- package/skills/orchestrator/references/deliver.md +112 -0
- package/skills/orchestrator/references/execute.md +313 -0
- package/skills/orchestrator/references/gates.md +252 -0
- package/skills/orchestrator/references/parallel.md +70 -0
- package/skills/orchestrator/references/route-a.md +135 -0
- package/skills/orchestrator/references/route-b.md +91 -0
- package/skills/orchestrator/references/route-c.md +65 -0
- package/skills/orchestrator/references/route-d.md +75 -0
- package/skills/orchestrator/references/scope-sizer.md +219 -0
- package/skills/performance-arch-design/SKILL.md +208 -0
- package/skills/performance-arch-design/references/performance-rules.md +95 -0
- package/skills/project-context/SKILL.md +104 -0
- package/skills/project-context/references/schema.md +97 -0
- package/skills/project-context/scripts/context_db.py +358 -0
- package/skills/requirement-qa/SKILL.md +287 -0
- package/skills/requirement-qa/references/completion-signals.md +42 -0
- package/skills/requirement-qa/references/option-rules.md +57 -0
- package/skills/requirement-qa/scripts/qa_session.py +223 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +485 -0
- package/skills/skill-creator/agents/analyzer.md +274 -0
- package/skills/skill-creator/agents/comparator.md +202 -0
- package/skills/skill-creator/agents/grader.md +223 -0
- package/skills/skill-creator/assets/eval_review.html +146 -0
- package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/skill-creator/references/schemas.md +430 -0
- package/skills/skill-creator/scripts/__init__.py +0 -0
- package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/skill-creator/scripts/generate_report.py +326 -0
- package/skills/skill-creator/scripts/improve_description.py +247 -0
- package/skills/skill-creator/scripts/package_skill.py +136 -0
- package/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/skills/skill-creator/scripts/run_eval.py +310 -0
- package/skills/skill-creator/scripts/run_loop.py +328 -0
- package/skills/skill-creator/scripts/utils.py +47 -0
- package/skills/spec-writing/SKILL.md +96 -0
- package/skills/spec-writing/references/mermaid-guide.md +66 -0
- package/skills/spec-writing/references/test-matrix.md +73 -0
- package/skills/task-difficulty/SKILL.md +162 -0
- package/skills/task-difficulty/references/scoring-guide.md +123 -0
- package/skills/task-difficulty/scripts/difficulty_scorer.py +328 -0
- package/skills/tech-stack/SKILL.md +67 -0
- package/skills/tech-stack/references/tech-reference-tables.md +130 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: task-difficulty
|
|
3
|
+
description: >-
|
|
4
|
+
任务难度评估节流阀——对用户输入的任务/需求进行多维度难度分析和评分,防止低估复杂度。先追溯任务涉及的上下文(代码结构、依赖关系、影响范围),再综合评分并给出分级和执行建议。内置"上浮偏差":除非任务明显简单,否则主动提升一个难度等级。独立使用时做纯难度评估,结合其他工具时可作为任务执行的前置判断。
|
|
5
|
+
务必在以下场景使用本 skill:难度分析、任务评估、复杂度评分、difficulty analysis、task scoring、节流阀、任务分级、风险评估、影响范围分析、工作量评估、scope analysis、前置判断。
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 任务难度评估
|
|
9
|
+
|
|
10
|
+
本 Skill 解决一个核心问题:**AI 模型容易低估任务复杂度**。用户给出一句话需求,模型可能直接动手,忽略隐藏的技术债、跨模块耦合、边界条件,导致返工或质量问题。
|
|
11
|
+
|
|
12
|
+
本 Skill 作为**节流阀(throttle valve)**:在执行前先评估难度,给出分级和上下文分析,防止"看起来简单实则复杂"的任务被草率处理。
|
|
13
|
+
|
|
14
|
+
## 核心机制
|
|
15
|
+
|
|
16
|
+
```mermaid
|
|
17
|
+
graph LR
|
|
18
|
+
INPUT["用户输入<br/>任务描述"]
|
|
19
|
+
CTX["上下文追溯<br/>涉及的文件·模块·依赖"]
|
|
20
|
+
SCORE["多维度评分<br/>5个维度 × 1-5分"]
|
|
21
|
+
LEVEL["难度分级<br/>L1-L5"]
|
|
22
|
+
THROTTLE{"节流阀<br/>是否明显简单?"}
|
|
23
|
+
OUT_KEEP["维持原级"]
|
|
24
|
+
OUT_BUMP["上浮一级"]
|
|
25
|
+
RESULT["输出<br/>难度报告"]
|
|
26
|
+
|
|
27
|
+
INPUT --> CTX --> SCORE --> LEVEL --> THROTTLE
|
|
28
|
+
THROTTLE -->|"是,L1证据充分"| OUT_KEEP --> RESULT
|
|
29
|
+
THROTTLE -->|"否,存在不确定性"| OUT_BUMP --> RESULT
|
|
30
|
+
|
|
31
|
+
style INPUT fill:#e3f2fd,stroke:#1976d2
|
|
32
|
+
style THROTTLE fill:#fff3e0,stroke:#f57c00,stroke-width:2px
|
|
33
|
+
style RESULT fill:#e8f5e9,stroke:#388e3c
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 难度等级
|
|
37
|
+
|
|
38
|
+
| 等级 | 名称 | 典型特征 | 示例 |
|
|
39
|
+
|------|------|---------|------|
|
|
40
|
+
| **L1** | 琐碎 | 单文件、无逻辑变更、配置/文案修改 | 修改按钮文字、更新版本号 |
|
|
41
|
+
| **L2** | 简单 | 单模块、逻辑清晰、无跨模块影响 | 新增一个工具函数、修复已定位的 Bug |
|
|
42
|
+
| **L3** | 中等 | 多文件、涉及 2-3 个模块、需要设计决策 | 新增 CRUD 页面、重构组件 API |
|
|
43
|
+
| **L4** | 复杂 | 跨模块联动、架构影响、需要方案评审 | 新增权限系统、接入第三方支付 |
|
|
44
|
+
| **L5** | 重大 | 系统级变更、破坏性改动、数据迁移 | 微服务拆分、数据库 Schema 迁移、框架升级 |
|
|
45
|
+
|
|
46
|
+
## 上浮偏差规则(Throttle)
|
|
47
|
+
|
|
48
|
+
这是本 skill 的核心差异化机制——**加权分偏置**,而非直接跳级:
|
|
49
|
+
|
|
50
|
+
1. **偏置上浮**:加权分 +0.5(10 分制下),可能导致跨级也可能不跨级
|
|
51
|
+
2. **L1 豁免条件**:仅当以下全部满足时,不施加偏置:
|
|
52
|
+
- 变更范围 ≤ 1 个文件
|
|
53
|
+
- 不涉及业务逻辑
|
|
54
|
+
- 不涉及跨模块导入/导出
|
|
55
|
+
- 无测试覆盖要求
|
|
56
|
+
3. **封顶 10 分**:偏置后不超过 10
|
|
57
|
+
4. **偏置可被覆盖**:如果上下文分析明确表明无风险(如纯文案修改),可取消偏置,但须在报告中给出原因
|
|
58
|
+
|
|
59
|
+
## 评估维度
|
|
60
|
+
|
|
61
|
+
对每个维度打 **1-10 分**,然后取加权平均映射到 L1-L5。
|
|
62
|
+
|
|
63
|
+
| 维度 | 权重 | 评估内容 |
|
|
64
|
+
|------|------|---------|
|
|
65
|
+
| **范围 (Scope)** | 30% | 涉及多少文件/模块、变更面积 |
|
|
66
|
+
| **深度 (Depth)** | 25% | 技术复杂度、算法难度、架构层级 |
|
|
67
|
+
| **耦合 (Coupling)** | 20% | 跨模块依赖、接口变更的连锁影响 |
|
|
68
|
+
| **风险 (Risk)** | 15% | 出错的代价、可逆性、数据安全 |
|
|
69
|
+
| **认知 (Cognition)** | 10% | 需要的领域知识、隐含的业务规则 |
|
|
70
|
+
|
|
71
|
+
### 加权分 → 等级映射
|
|
72
|
+
|
|
73
|
+
| 加权分范围 | 等级 |
|
|
74
|
+
|-----------|------|
|
|
75
|
+
| 1.0 - 2.0 | L1(琐碎) |
|
|
76
|
+
| 2.1 - 4.0 | L2(简单) |
|
|
77
|
+
| 4.1 - 6.0 | L3(中等) |
|
|
78
|
+
| 6.1 - 8.0 | L4(复杂) |
|
|
79
|
+
| 8.1 - 10.0 | L5(重大) |
|
|
80
|
+
|
|
81
|
+
> 完整评分细则见 → `references/scoring-guide.md`
|
|
82
|
+
|
|
83
|
+
## 上下文追溯
|
|
84
|
+
|
|
85
|
+
评分不是凭空打分,必须先追溯任务涉及的上下文:
|
|
86
|
+
|
|
87
|
+
### 追溯步骤
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
1. 解析输入 → 提取关键实体(模块名、文件名、功能点、技术概念)
|
|
91
|
+
2. 探索代码 → 查找相关文件、导入链、依赖关系
|
|
92
|
+
3. 识别边界 → 确定变更的直接影响范围和间接影响范围
|
|
93
|
+
4. 发现隐患 → 检查测试覆盖、类型安全、错误处理等
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 上下文来源
|
|
97
|
+
|
|
98
|
+
- 项目文件结构(目录树、文件分类)
|
|
99
|
+
- 代码依赖关系(import/export 链)
|
|
100
|
+
- 配置文件(package.json、tsconfig 等)
|
|
101
|
+
- 已有测试覆盖
|
|
102
|
+
- Git 历史(该区域的变更频率)
|
|
103
|
+
|
|
104
|
+
> 注意:本 skill 独立工作时,自行读取项目文件获取上下文。
|
|
105
|
+
|
|
106
|
+
## 输入输出
|
|
107
|
+
|
|
108
|
+
### 输入
|
|
109
|
+
|
|
110
|
+
一段任务描述文本。可以是:
|
|
111
|
+
- 用户的自然语言需求("帮我加个登录功能")
|
|
112
|
+
- Bug 报告("点击提交按钮后页面白屏")
|
|
113
|
+
- 重构请求("把这个组件拆成三个")
|
|
114
|
+
- 技术任务("升级到 Vue 3.5")
|
|
115
|
+
|
|
116
|
+
### 输出:难度报告
|
|
117
|
+
|
|
118
|
+
```markdown
|
|
119
|
+
# 难度评估报告
|
|
120
|
+
|
|
121
|
+
## 基本信息
|
|
122
|
+
|
|
123
|
+
- **任务**: {一句话描述}
|
|
124
|
+
- **原始评级**: L{n}
|
|
125
|
+
- **最终评级**: L{m} {上浮说明或保持原因}
|
|
126
|
+
|
|
127
|
+
## 评分明细
|
|
128
|
+
|
|
129
|
+
| 维度 | 分数(1-5) | 依据 |
|
|
130
|
+
|------|----------|------|
|
|
131
|
+
| 范围 | {n} | {简要说明} |
|
|
132
|
+
| 深度 | {n} | {简要说明} |
|
|
133
|
+
| 耦合 | {n} | {简要说明} |
|
|
134
|
+
| 风险 | {n} | {简要说明} |
|
|
135
|
+
| 认知 | {n} | {简要说明} |
|
|
136
|
+
| **加权** | **{avg}** | |
|
|
137
|
+
|
|
138
|
+
## 上下文分析
|
|
139
|
+
|
|
140
|
+
### 涉及范围
|
|
141
|
+
- 直接影响:{文件/模块列表}
|
|
142
|
+
- 间接影响:{可能受连锁影响的部分}
|
|
143
|
+
|
|
144
|
+
### 关键风险点
|
|
145
|
+
- {风险1}
|
|
146
|
+
- {风险2}
|
|
147
|
+
|
|
148
|
+
## 执行建议
|
|
149
|
+
|
|
150
|
+
{根据难度等级给出的执行策略建议}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Python 脚本
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
python scripts/difficulty_scorer.py assess --input <任务描述文本> [--root <project_root>] [--format json|markdown]
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
- `--root`:提供项目路径时,会自动追溯代码上下文辅助评分
|
|
160
|
+
- `--format`:默认 `markdown`,`json` 格式便于程序消费
|
|
161
|
+
|
|
162
|
+
> 脚本实现见 → `scripts/difficulty_scorer.py`
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# 难度评分细则(1-10 分制)
|
|
2
|
+
|
|
3
|
+
## 维度评分标准
|
|
4
|
+
|
|
5
|
+
### 范围 (Scope) — 权重 30%
|
|
6
|
+
|
|
7
|
+
| 分数 | 标准 |
|
|
8
|
+
|------|------|
|
|
9
|
+
| 1 | 单文件内的微修改(≤ 5 行,纯文案/数值) |
|
|
10
|
+
| 2 | 单文件局部修改(≤ 20 行) |
|
|
11
|
+
| 3 | 单文件较大修改 或 2-3 个紧密相关文件的小改动 |
|
|
12
|
+
| 4 | 单模块内 3-5 个文件 |
|
|
13
|
+
| 5 | 单模块内 5-8 个文件,或跨 2 个模块各少量文件 |
|
|
14
|
+
| 6 | 跨 2-3 个模块,涉及 8-12 个文件 |
|
|
15
|
+
| 7 | 跨 3-4 个模块,涉及 12-20 个文件 |
|
|
16
|
+
| 8 | 跨 4+ 个模块,涉及 20+ 文件 |
|
|
17
|
+
| 9 | 多数模块受影响,可能需要批量修改 |
|
|
18
|
+
| 10 | 全局性变更,几乎所有模块都需修改 |
|
|
19
|
+
|
|
20
|
+
### 深度 (Depth) — 权重 25%
|
|
21
|
+
|
|
22
|
+
| 分数 | 标准 |
|
|
23
|
+
|------|------|
|
|
24
|
+
| 1 | 无逻辑变更(纯文案替换) |
|
|
25
|
+
| 2 | 极简逻辑(配置值修改、样式调整) |
|
|
26
|
+
| 3 | 简单逻辑(条件分支、字段映射) |
|
|
27
|
+
| 4 | CRUD 模板化操作(增删改查页面,套路化) |
|
|
28
|
+
| 5 | 中等逻辑(表单校验、API 集成、组件状态管理) |
|
|
29
|
+
| 6 | 较复杂逻辑(权限控制、工作流、乐观更新) |
|
|
30
|
+
| 7 | 复杂逻辑(状态机、并发处理、缓存策略) |
|
|
31
|
+
| 8 | 高度复杂(自定义构建流程、性能关键路径优化) |
|
|
32
|
+
| 9 | 算法密集(复杂数据结构、分布式协调) |
|
|
33
|
+
| 10 | 系统级复杂度(编译器/解释器、实时计算引擎) |
|
|
34
|
+
|
|
35
|
+
### 耦合 (Coupling) — 权重 20%
|
|
36
|
+
|
|
37
|
+
| 分数 | 标准 |
|
|
38
|
+
|------|------|
|
|
39
|
+
| 1 | 完全独立,无外部依赖 |
|
|
40
|
+
| 2 | 使用外部模块但不修改其接口 |
|
|
41
|
+
| 3 | 修改模块内部实现,接口不变 |
|
|
42
|
+
| 4 | 修改模块接口,已知调用方 ≤ 3 处 |
|
|
43
|
+
| 5 | 修改模块接口,调用方 3-5 处 |
|
|
44
|
+
| 6 | 修改公共接口,调用方 5-10 处 |
|
|
45
|
+
| 7 | 修改公共接口,调用链 > 3 层 |
|
|
46
|
+
| 8 | 修改基础设施组件(路由、中间件) |
|
|
47
|
+
| 9 | 修改核心抽象(ORM 基类、通用组件库) |
|
|
48
|
+
| 10 | 修改底层框架/运行时,影响全局所有模块 |
|
|
49
|
+
|
|
50
|
+
### 风险 (Risk) — 权重 15%
|
|
51
|
+
|
|
52
|
+
| 分数 | 标准 |
|
|
53
|
+
|------|------|
|
|
54
|
+
| 1 | 完全可逆,出错无影响 |
|
|
55
|
+
| 2 | 可逆,出错影响极小(开发环境配置) |
|
|
56
|
+
| 3 | 可逆但需额外工作(功能回退) |
|
|
57
|
+
| 4 | 回退成本中等(需要测试验证) |
|
|
58
|
+
| 5 | 部分不可逆(数据库 Schema 有 down migration) |
|
|
59
|
+
| 6 | 回退困难(生产配置变更、第三方 API 对接) |
|
|
60
|
+
| 7 | 涉及用户数据格式变更 |
|
|
61
|
+
| 8 | 涉及安全策略或加密方案 |
|
|
62
|
+
| 9 | 涉及付款/金融/合规流程 |
|
|
63
|
+
| 10 | 不可逆且高危(删除生产数据、密钥轮换) |
|
|
64
|
+
|
|
65
|
+
### 认知 (Cognition) — 权重 10%
|
|
66
|
+
|
|
67
|
+
| 分数 | 标准 |
|
|
68
|
+
|------|------|
|
|
69
|
+
| 1 | 纯机械操作,无需任何领域知识 |
|
|
70
|
+
| 2 | 需了解单个配置项或 API |
|
|
71
|
+
| 3 | 需了解一个技术概念的基本用法 |
|
|
72
|
+
| 4 | 需理解一个完整的技术方案(如 JWT 认证流程) |
|
|
73
|
+
| 5 | 需理解业务领域规则(权限模型、计费逻辑) |
|
|
74
|
+
| 6 | 需理解复杂业务流程(工作流、审批链) |
|
|
75
|
+
| 7 | 需要跨领域知识(前端+后端+数据库) |
|
|
76
|
+
| 8 | 需要跨领域+业务(技术方案+安全+业务合规) |
|
|
77
|
+
| 9 | 需要专家级单领域知识(密码学、分布式一致性) |
|
|
78
|
+
| 10 | 需要多个专家级领域知识(编译+安全+行业法规) |
|
|
79
|
+
|
|
80
|
+
## 加权平均 → 等级映射
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
加权分 = Scope×0.30 + Depth×0.25 + Coupling×0.20 + Risk×0.15 + Cognition×0.10
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
| 加权分范围 | 等级 | 名称 |
|
|
87
|
+
|-----------|------|------|
|
|
88
|
+
| 1.0 - 2.0 | L1 | 琐碎 |
|
|
89
|
+
| 2.1 - 4.0 | L2 | 简单 |
|
|
90
|
+
| 4.1 - 6.0 | L3 | 中等 |
|
|
91
|
+
| 6.1 - 8.0 | L4 | 复杂 |
|
|
92
|
+
| 8.1 - 10.0 | L5 | 重大 |
|
|
93
|
+
|
|
94
|
+
## 偏置上浮规则
|
|
95
|
+
|
|
96
|
+
不再整级上浮,改为**加权分 +0.5 偏置**:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
IF 范围 ≤ 2 AND 深度 ≤ 2 AND 耦合 ≤ 2 AND 风险 ≤ 3:
|
|
100
|
+
→ 豁免偏置(明确标注理由)
|
|
101
|
+
ELSE:
|
|
102
|
+
→ 加权分 += 0.5(上限 10.0)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**效果示例**:
|
|
106
|
+
|
|
107
|
+
| 原始加权 | 原始等级 | +0.5 后 | 最终等级 | 是否跨级 |
|
|
108
|
+
|---------|---------|--------|---------|---------|
|
|
109
|
+
| 1.5 | L1 | 2.0 | L1 | 否 |
|
|
110
|
+
| 1.9 | L1 | 2.4 | L2 | 是(边界) |
|
|
111
|
+
| 3.2 | L2 | 3.7 | L2 | 否 |
|
|
112
|
+
| 3.8 | L2 | 4.3 | L3 | 是(边界) |
|
|
113
|
+
| 5.5 | L3 | 6.0 | L3 | 否 |
|
|
114
|
+
|
|
115
|
+
## 边界情况处理
|
|
116
|
+
|
|
117
|
+
| 情况 | 处理方式 |
|
|
118
|
+
|------|---------|
|
|
119
|
+
| 任务描述模糊(< 20 字) | 认知 +1,范围 +1 |
|
|
120
|
+
| 涉及遗留代码 | 耦合 +1 |
|
|
121
|
+
| 首次接触的模块 | 认知 +1 |
|
|
122
|
+
| 用户明确说"简单" | 不因此降分,按实际评估 |
|
|
123
|
+
| 无法获取项目上下文 | 所有维度下限 +1 |
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
task-difficulty: 任务难度评估脚本
|
|
4
|
+
|
|
5
|
+
用法:
|
|
6
|
+
python difficulty_scorer.py assess --input <任务描述> [--root <project_root>] [--format json|markdown]
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
import json
|
|
11
|
+
import os
|
|
12
|
+
import re
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
# ── 维度定义 ──────────────────────────────────────────────
|
|
17
|
+
|
|
18
|
+
DIMENSIONS = [
|
|
19
|
+
{"key": "scope", "name": "范围", "weight": 0.30},
|
|
20
|
+
{"key": "depth", "name": "深度", "weight": 0.25},
|
|
21
|
+
{"key": "coupling", "name": "耦合", "weight": 0.20},
|
|
22
|
+
{"key": "risk", "name": "风险", "weight": 0.15},
|
|
23
|
+
{"key": "cognition", "name": "认知", "weight": 0.10},
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
LEVEL_RANGES = [
|
|
27
|
+
(1.0, 2.0, "L1", "琐碎"),
|
|
28
|
+
(2.1, 4.0, "L2", "简单"),
|
|
29
|
+
(4.1, 6.0, "L3", "中等"),
|
|
30
|
+
(6.1, 8.0, "L4", "复杂"),
|
|
31
|
+
(8.1, 10.0, "L5", "重大"),
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
THROTTLE_BIAS = 0.5
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def score_to_level(score: float) -> tuple[str, str]:
|
|
38
|
+
"""将加权分映射为等级。"""
|
|
39
|
+
for low, high, level, label in LEVEL_RANGES:
|
|
40
|
+
if low <= score <= high:
|
|
41
|
+
return level, label
|
|
42
|
+
return "L5", "重大"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def level_label(level: str) -> str:
|
|
46
|
+
for _, _, lv, label in LEVEL_RANGES:
|
|
47
|
+
if lv == level:
|
|
48
|
+
return label
|
|
49
|
+
return ""
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def should_exempt_throttle(scores: dict[str, int]) -> bool:
|
|
53
|
+
"""豁免偏置判定:范围≤2 且 深度≤2 且 耦合≤2 且 风险≤3。"""
|
|
54
|
+
return (
|
|
55
|
+
scores.get("scope", 0) <= 2
|
|
56
|
+
and scores.get("depth", 0) <= 2
|
|
57
|
+
and scores.get("coupling", 0) <= 2
|
|
58
|
+
and scores.get("risk", 0) <= 3
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def compute_weighted(scores: dict[str, int]) -> float:
|
|
63
|
+
total = 0.0
|
|
64
|
+
for dim in DIMENSIONS:
|
|
65
|
+
total += scores.get(dim["key"], 5) * dim["weight"]
|
|
66
|
+
return round(total, 2)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
# ── 上下文探索 ──────────────────────────────────────────────
|
|
70
|
+
|
|
71
|
+
def explore_context(root: str, task_text: str) -> dict:
|
|
72
|
+
"""探索项目上下文,提取与任务相关的结构信息。"""
|
|
73
|
+
context = {
|
|
74
|
+
"has_project": False,
|
|
75
|
+
"total_files": 0,
|
|
76
|
+
"modules": [],
|
|
77
|
+
"config_files": [],
|
|
78
|
+
"test_coverage": False,
|
|
79
|
+
"keywords_found": [],
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
root_path = Path(root).resolve()
|
|
83
|
+
if not root_path.exists():
|
|
84
|
+
return context
|
|
85
|
+
|
|
86
|
+
context["has_project"] = True
|
|
87
|
+
|
|
88
|
+
ignore_dirs = {
|
|
89
|
+
"node_modules", "dist", "build", ".git", "__pycache__",
|
|
90
|
+
".next", ".nuxt", ".output", "coverage", ".cache",
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# 提取任务中的关键词
|
|
94
|
+
words = set(re.findall(r"[a-zA-Z\u4e00-\u9fff]{2,}", task_text.lower()))
|
|
95
|
+
|
|
96
|
+
files = []
|
|
97
|
+
for dirpath, dirnames, filenames in os.walk(root_path):
|
|
98
|
+
dirnames[:] = [d for d in dirnames if d not in ignore_dirs]
|
|
99
|
+
rel_dir = Path(dirpath).relative_to(root_path)
|
|
100
|
+
|
|
101
|
+
for fname in filenames:
|
|
102
|
+
rel = str(rel_dir / fname)
|
|
103
|
+
files.append(rel)
|
|
104
|
+
|
|
105
|
+
# 检查文件名/路径是否与任务关键词相关
|
|
106
|
+
fname_lower = fname.lower()
|
|
107
|
+
for w in words:
|
|
108
|
+
if w in fname_lower or w in str(rel_dir).lower():
|
|
109
|
+
context["keywords_found"].append({"keyword": w, "file": rel})
|
|
110
|
+
|
|
111
|
+
context["total_files"] = len(files)
|
|
112
|
+
|
|
113
|
+
# 识别模块(src/ 下的一级目录)
|
|
114
|
+
src_path = root_path / "src"
|
|
115
|
+
if src_path.exists():
|
|
116
|
+
context["modules"] = [
|
|
117
|
+
d.name for d in src_path.iterdir()
|
|
118
|
+
if d.is_dir() and d.name not in ignore_dirs
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
# 识别配置文件
|
|
122
|
+
for f in root_path.iterdir():
|
|
123
|
+
if f.is_file() and f.suffix in (".json", ".yaml", ".yml", ".toml"):
|
|
124
|
+
context["config_files"].append(f.name)
|
|
125
|
+
|
|
126
|
+
# 检查测试覆盖
|
|
127
|
+
for test_pattern in ["__tests__", "test", "tests", "spec"]:
|
|
128
|
+
if (root_path / test_pattern).exists():
|
|
129
|
+
context["test_coverage"] = True
|
|
130
|
+
break
|
|
131
|
+
|
|
132
|
+
# 去重
|
|
133
|
+
seen = set()
|
|
134
|
+
unique = []
|
|
135
|
+
for kf in context["keywords_found"]:
|
|
136
|
+
key = f"{kf['keyword']}:{kf['file']}"
|
|
137
|
+
if key not in seen:
|
|
138
|
+
seen.add(key)
|
|
139
|
+
unique.append(kf)
|
|
140
|
+
context["keywords_found"] = unique[:20]
|
|
141
|
+
|
|
142
|
+
return context
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
# ── 启发式预评分 ──────────────────────────────────────────────
|
|
146
|
+
|
|
147
|
+
# 关键词与难度倾向的映射
|
|
148
|
+
HIGH_COMPLEXITY_SIGNALS = [
|
|
149
|
+
"迁移", "migration", "升级", "upgrade", "重构", "refactor",
|
|
150
|
+
"权限", "permission", "auth", "安全", "security",
|
|
151
|
+
"支付", "payment", "加密", "encrypt",
|
|
152
|
+
"微服务", "microservice", "分布式", "distributed",
|
|
153
|
+
"性能", "performance", "并发", "concurrent",
|
|
154
|
+
"数据库", "database", "schema", "索引", "index",
|
|
155
|
+
]
|
|
156
|
+
|
|
157
|
+
LOW_COMPLEXITY_SIGNALS = [
|
|
158
|
+
"文案", "文字", "typo", "拼写",
|
|
159
|
+
"样式", "style", "颜色", "color",
|
|
160
|
+
"注释", "comment", "文档", "readme",
|
|
161
|
+
"版本号", "version",
|
|
162
|
+
]
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def heuristic_scores(task_text: str, context: dict) -> dict:
|
|
166
|
+
"""基于启发式规则生成初始评分建议(供模型参考或作为无模型降级)。"""
|
|
167
|
+
text_lower = task_text.lower()
|
|
168
|
+
|
|
169
|
+
scores = {"scope": 3, "depth": 3, "coupling": 3, "risk": 3, "cognition": 3}
|
|
170
|
+
|
|
171
|
+
# 高复杂度信号
|
|
172
|
+
high_hits = sum(1 for s in HIGH_COMPLEXITY_SIGNALS if s in text_lower)
|
|
173
|
+
if high_hits >= 4:
|
|
174
|
+
for k in scores:
|
|
175
|
+
scores[k] = min(10, scores[k] + 4)
|
|
176
|
+
elif high_hits >= 2:
|
|
177
|
+
for k in scores:
|
|
178
|
+
scores[k] = min(10, scores[k] + 2)
|
|
179
|
+
elif high_hits == 1:
|
|
180
|
+
for k in scores:
|
|
181
|
+
scores[k] = min(10, scores[k] + 1)
|
|
182
|
+
|
|
183
|
+
# 低复杂度信号
|
|
184
|
+
low_hits = sum(1 for s in LOW_COMPLEXITY_SIGNALS if s in text_lower)
|
|
185
|
+
if low_hits >= 2 and high_hits == 0:
|
|
186
|
+
for k in scores:
|
|
187
|
+
scores[k] = max(1, scores[k] - 2)
|
|
188
|
+
elif low_hits == 1 and high_hits == 0:
|
|
189
|
+
for k in scores:
|
|
190
|
+
scores[k] = max(1, scores[k] - 1)
|
|
191
|
+
|
|
192
|
+
# 上下文修正
|
|
193
|
+
if context.get("has_project"):
|
|
194
|
+
total = context.get("total_files", 0)
|
|
195
|
+
if total > 500:
|
|
196
|
+
scores["scope"] = min(10, scores["scope"] + 1)
|
|
197
|
+
if total > 1000:
|
|
198
|
+
scores["scope"] = min(10, scores["scope"] + 1)
|
|
199
|
+
keywords = context.get("keywords_found", [])
|
|
200
|
+
if len(keywords) > 10:
|
|
201
|
+
scores["coupling"] = min(10, scores["coupling"] + 1)
|
|
202
|
+
|
|
203
|
+
# 信息不足修正(无项目上下文)
|
|
204
|
+
if not context.get("has_project"):
|
|
205
|
+
for k in scores:
|
|
206
|
+
scores[k] = min(10, scores[k] + 1)
|
|
207
|
+
|
|
208
|
+
# 任务描述太短 → 信息不足
|
|
209
|
+
if len(task_text.strip()) < 20:
|
|
210
|
+
scores["cognition"] = min(10, scores["cognition"] + 1)
|
|
211
|
+
scores["scope"] = min(10, scores["scope"] + 1)
|
|
212
|
+
|
|
213
|
+
return scores
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
# ── 输出格式化 ──────────────────────────────────────────────
|
|
217
|
+
|
|
218
|
+
def format_markdown(result: dict) -> str:
|
|
219
|
+
lines = [
|
|
220
|
+
"# 难度评估报告",
|
|
221
|
+
"",
|
|
222
|
+
"## 基本信息",
|
|
223
|
+
"",
|
|
224
|
+
f"- **任务**: {result['task']}",
|
|
225
|
+
f"- **原始评级**: {result['raw_level']} ({level_label(result['raw_level'])})",
|
|
226
|
+
f"- **最终评级**: {result['final_level']} ({level_label(result['final_level'])})",
|
|
227
|
+
f"- **上浮说明**: {result['throttle_reason']}",
|
|
228
|
+
"",
|
|
229
|
+
"## 评分明细",
|
|
230
|
+
"",
|
|
231
|
+
"| 维度 | 分数(1-10) | 权重 |",
|
|
232
|
+
"|------|----------|------|",
|
|
233
|
+
]
|
|
234
|
+
|
|
235
|
+
for dim in DIMENSIONS:
|
|
236
|
+
score = result["scores"].get(dim["key"], 0)
|
|
237
|
+
lines.append(f"| {dim['name']} | {score} | {int(dim['weight']*100)}% |")
|
|
238
|
+
|
|
239
|
+
lines.append(f"| **加权** | **{result['weighted_score']}** | |")
|
|
240
|
+
lines.append("")
|
|
241
|
+
|
|
242
|
+
if result.get("context_summary"):
|
|
243
|
+
lines.append("## 上下文分析")
|
|
244
|
+
lines.append("")
|
|
245
|
+
ctx = result["context_summary"]
|
|
246
|
+
if ctx.get("total_files"):
|
|
247
|
+
lines.append(f"- 项目文件总数: {ctx['total_files']}")
|
|
248
|
+
if ctx.get("modules"):
|
|
249
|
+
lines.append(f"- 识别模块: {', '.join(ctx['modules'])}")
|
|
250
|
+
if ctx.get("keywords_found"):
|
|
251
|
+
kw_list = [f"`{k['file']}`" for k in ctx["keywords_found"][:5]]
|
|
252
|
+
lines.append(f"- 关联文件: {', '.join(kw_list)}")
|
|
253
|
+
lines.append("")
|
|
254
|
+
|
|
255
|
+
return "\n".join(lines)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def format_json(result: dict) -> str:
|
|
259
|
+
return json.dumps(result, ensure_ascii=False, indent=2)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
# ── 命令实现 ──────────────────────────────────────────────
|
|
263
|
+
|
|
264
|
+
def cmd_assess(task_input: str, root: str | None = None, fmt: str = "markdown"):
|
|
265
|
+
# 1. 追溯上下文
|
|
266
|
+
context = {}
|
|
267
|
+
if root:
|
|
268
|
+
context = explore_context(root, task_input)
|
|
269
|
+
|
|
270
|
+
# 2. 启发式评分
|
|
271
|
+
scores = heuristic_scores(task_input, context)
|
|
272
|
+
|
|
273
|
+
# 3. 计算加权分和等级
|
|
274
|
+
weighted = compute_weighted(scores)
|
|
275
|
+
raw_level, _ = score_to_level(weighted)
|
|
276
|
+
|
|
277
|
+
# 4. 节流阀偏置
|
|
278
|
+
if should_exempt_throttle(scores):
|
|
279
|
+
final_weighted = weighted
|
|
280
|
+
throttle_reason = "豁免偏置:范围/深度/耦合均低,风险可控"
|
|
281
|
+
else:
|
|
282
|
+
final_weighted = min(10.0, weighted + THROTTLE_BIAS)
|
|
283
|
+
throttle_reason = f"加权分 +{THROTTLE_BIAS} 偏置:{weighted} → {final_weighted}"
|
|
284
|
+
|
|
285
|
+
final_level, _ = score_to_level(final_weighted)
|
|
286
|
+
|
|
287
|
+
result = {
|
|
288
|
+
"task": task_input,
|
|
289
|
+
"scores": scores,
|
|
290
|
+
"weighted_score": weighted,
|
|
291
|
+
"final_weighted": final_weighted,
|
|
292
|
+
"raw_level": raw_level,
|
|
293
|
+
"final_level": final_level,
|
|
294
|
+
"throttle_reason": throttle_reason,
|
|
295
|
+
"context_summary": {
|
|
296
|
+
"total_files": context.get("total_files", 0),
|
|
297
|
+
"modules": context.get("modules", []),
|
|
298
|
+
"keywords_found": context.get("keywords_found", []),
|
|
299
|
+
"has_project": context.get("has_project", False),
|
|
300
|
+
} if context else None,
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
if fmt == "json":
|
|
304
|
+
print(format_json(result))
|
|
305
|
+
else:
|
|
306
|
+
print(format_markdown(result))
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
# ── CLI 入口 ──────────────────────────────────────────────
|
|
310
|
+
|
|
311
|
+
def main():
|
|
312
|
+
parser = argparse.ArgumentParser(description="task-difficulty: 任务难度评估")
|
|
313
|
+
sub = parser.add_subparsers(dest="command", required=True)
|
|
314
|
+
|
|
315
|
+
p_assess = sub.add_parser("assess", help="评估任务难度")
|
|
316
|
+
p_assess.add_argument("--input", required=True, help="任务描述文本")
|
|
317
|
+
p_assess.add_argument("--root", default=None, help="项目根目录(提供后会自动追溯上下文)")
|
|
318
|
+
p_assess.add_argument("--format", default="markdown", choices=["json", "markdown"],
|
|
319
|
+
help="输出格式(默认 markdown)")
|
|
320
|
+
|
|
321
|
+
args = parser.parse_args()
|
|
322
|
+
|
|
323
|
+
if args.command == "assess":
|
|
324
|
+
cmd_assess(args.input, args.root, args.format)
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
if __name__ == "__main__":
|
|
328
|
+
main()
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tech-stack
|
|
3
|
+
description: >-
|
|
4
|
+
撰写和维护技术选型文档(如 docs/tech-stack.md),覆盖前端(Vue 3 / React)、后端(Node.js 系如 NestJS / Express / Koa,或 Java 系如 Spring Boot)、数据库、运维、工程规范等全栈技术决策。Monorepo 默认 apps/ + packages/ 布局,TS 库使用 tsdown(非 tsup)构建,所有架构图和 ER 图使用 Mermaid。文档中须明确 Node.js 和 pnpm 版本。
|
|
5
|
+
务必在以下场景使用本 skill:用户提到技术选型、tech stack、技术架构、技术方案、架构设计、数据库设计、database design、stack decisions、框架选择、技术栈、技术路线、依赖选择、工具链选型、前后端选型、基础设施选型,或者用户要求编写/修订/评审技术架构文档、讨论该用什么框架/库/工具,即使没有明确说“技术选型”。不适用于具体功能需求文档。
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 技术架构选型
|
|
9
|
+
|
|
10
|
+
本 Skill 负责**技术选型文档**(如 `docs/tech-stack.md`,路径以项目约定为准)——帮助团队将分散的技术决策统一成一份可追溯、可评审的文档。技术选型文档的核心价值是:让每个技术决策都有据可查、有理可循,避免"我以为你用的是 X"这类沟通问题。
|
|
11
|
+
|
|
12
|
+
**不**展开需求六段式 Specs 的写法。
|
|
13
|
+
|
|
14
|
+
## 原则
|
|
15
|
+
|
|
16
|
+
- 在独立文档中写清**实际采用**的路线与依赖,每个技术选择都应说明**选择理由**和**对比过的备选方案**——这让后来者理解决策背景,也方便未来重新评估。
|
|
17
|
+
- 前端可在 **Vue 3** 与 **React** 中选型(Monorepo 可多应用并存);必须明确所选路线及理由,而非罗列全部可能技术。
|
|
18
|
+
- **Monorepo 默认目录约定**:`apps/` 存放**业务应用/可运行项目**;`packages/` 存放**可复用包**(组件库、工具库、配置包等)。技术选型文档中应写明仓库是否采用该结构及例外说明。
|
|
19
|
+
- **TypeScript 库构建**:`packages/` 内需产出 JS/类型声明的 TS 库,**优先使用 tsdown 作为打包工具,不采用 tsup**(tsdown 与 tsup 主要选项兼容,便于迁移;需满足其 Node 版本等要求时写入文档)。
|
|
20
|
+
- **Node.js 与 pnpm 版本**:技术选型文档中应**明确写出**项目采用的 Node.js 与 pnpm 版本(或兼容范围)。版本选择建议采用当前 **稳定的 LTS**(非最新版,也非即将 EOL 的旧版),同时确保 ≥ 工具链的最低要求(如 tsdown)。版本信息应在以下位置保持一致:`package.json` 的 `engines`、`packageManager` 字段、`.nvmrc`(若有)、CI 与 Docker 配置。推荐使用 Corepack 锁定 pnpm 版本。
|
|
21
|
+
|
|
22
|
+
## 图表(唯一绘图语言:Mermaid)
|
|
23
|
+
|
|
24
|
+
技术选型文档中凡需**可视化**(架构、部署、模块关系、关键流程、组件时序、**数据库实体关系**等),**一律使用 Mermaid**,不使用 PlantUML、Draw.io 源文件、纯图片替代可编辑结构图等其它绘图方式(导出图若来自 Mermaid 渲染则可)。选择 Mermaid 是因为它是纯文本格式,可与 Markdown 文档一起纳入 Git 版本管理,便于 PR review 和变更追踪。
|
|
25
|
+
|
|
26
|
+
常用类型与语法方向(按需选用,可组合多篇图):
|
|
27
|
+
|
|
28
|
+
| 类型 | 典型用途 | Mermaid 形式 |
|
|
29
|
+
|------|----------|----------------|
|
|
30
|
+
| 架构图 | 客户端、网关、服务、DB、缓存等部署与数据流 | `flowchart` / `flowchart LR` |
|
|
31
|
+
| 模块图 | 业务模块、包之间的依赖或调用关系 | `graph TD` / `graph LR` |
|
|
32
|
+
| 流程图 | 请求处理、发布、鉴权等步骤 | `flowchart` |
|
|
33
|
+
| 时序图 | 登录、支付等多角色交互顺序 | `sequenceDiagram` |
|
|
34
|
+
| **ER 图** | **数据库设计**:实体、字段、主外键、实体间关系 | **`erDiagram`** |
|
|
35
|
+
|
|
36
|
+
图应内嵌于 Markdown 代码块(` ```mermaid `),便于版本管理与评审。
|
|
37
|
+
|
|
38
|
+
> **画图时机**:架构图是技术选型文档的标配,至少要有一张全局架构视图;数据库设计必须有 ER 图;前后端交互复杂的场景配时序图。
|
|
39
|
+
|
|
40
|
+
## 文档建议结构
|
|
41
|
+
|
|
42
|
+
1. **概述**:项目形态、仓库结构(Monorepo 时说明 `apps/` / `packages/` 职责)、前后端边界;**运行时与工具链**:写明 **Node.js**、**pnpm** 的确认版本(或范围)及锁定方式(如 `packageManager`、`engines`、Corepack);可配**架构图**。
|
|
43
|
+
2. **前端**:先写「跨框架通用」已定选项,再写「Vue 路线」或「React 路线」**之一(或按应用分别说明)**;可配**模块图**说明应用与包关系。
|
|
44
|
+
3. **UI**:第三方组件库或自研 `packages/ui` 等的选择与原则。
|
|
45
|
+
4. **后端**:框架(Node.js 系如 NestJS / Express / Koa,或 Java 系如 Spring Boot;**推荐 NestJS**)、API 风格、文档、校验、认证、权限、ORM(如 TypeORM / Prisma / Drizzle;**推荐 TypeORM**)、数据库(如 PostgreSQL / MySQL / MongoDB;**推荐 PostgreSQL**)、缓存、日志。**数据库设计**须用 Mermaid **`erDiagram`** 给出核心实体、字段与关系。
|
|
46
|
+
5. **运维与基础设施**(可选):反向代理、容器化等。Docker 是可选项,根据项目实际部署需求决定是否采用。
|
|
47
|
+
6. **工程规范**:Lint/格式化、Git 钩子、提交规范、版本管理、CLI 等(按需取舍并写明版本或范围)。
|
|
48
|
+
|
|
49
|
+
> 每一节的技术选择都应包含简短的**选型理由**(一两句话即可),说明为什么选它、有没有考虑过其他方案。这让文档不仅是一份清单,更是一份决策记录。
|
|
50
|
+
|
|
51
|
+
## 参考技术表
|
|
52
|
+
|
|
53
|
+
覆盖运行时与包管理、前端跨框架通用、Vue 路线、React 路线、UI 与组件库、后端、运维基础设施、工程规范共 8 类。写入文档时对每项标注「采用 / 不采用 / 待定」并说明理由。
|
|
54
|
+
|
|
55
|
+
> 全部参考技术表见 → `references/tech-reference-tables.md`
|
|
56
|
+
|
|
57
|
+
## 执行方式
|
|
58
|
+
|
|
59
|
+
- 根据用户已给约束(团队规定、遗留栈、云厂商等)收敛选项;表中条目**非强制**,未采用的技术不必写入最终文档,或标注「未采用」。
|
|
60
|
+
- 输出物应是**可交付的 Markdown**(或用户指定格式),便于纳入版本库并与实现保持一致;**与结构、流程、协作、数据库实体关系相关的说明应配 Mermaid 图**(含 **`erDiagram`**),避免仅用长段落描述。
|
|
61
|
+
- 若用户未给出 **Node / pnpm** 版本:应结合当前**稳定 LTS**与依赖最低要求,在选型文档中给出**建议版本**并提醒同步写入 `engines`、`packageManager` 与 CI/Docker。
|
|
62
|
+
|
|
63
|
+
## 常见问题与处理
|
|
64
|
+
|
|
65
|
+
- **用户只说"帮我做个技术选型"**:先确认项目类型(Web 应用?移动端?管理后台?)、团队规模、是否有已有技术栈约束,再给出选型建议。
|
|
66
|
+
- **用户要求对比两个技术方案**:从功能覆盖度、生态成熟度、学习曲线、团队熟悉度、社区活跃度等维度做对比表,给出推荐及理由。
|
|
67
|
+
- **版本锁定不一致**:检查 `package.json` 的 `engines`/`packageManager`、`.nvmrc`、CI 配置、Docker 镜像中的版本,如有不一致应在文档中指出并给出统一方案。
|