mta-mcp 2.12.0 → 2.14.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 (24) hide show
  1. package/agents/flutter.agent.md +117 -1147
  2. package/agents/vue3.agent.md +177 -464
  3. package/dist/index.d.ts +63 -0
  4. package/dist/index.js +1858 -139
  5. package/dist/index.js.map +1 -1
  6. package/package.json +2 -1
  7. package/troubleshooting/README.md +366 -0
  8. package/troubleshooting/USAGE_GUIDE.md +289 -0
  9. package/troubleshooting/flutter/clip-/351/230/264/345/275/261/350/243/201/345/211/252.md +244 -0
  10. package/troubleshooting/flutter/input-/345/255/227/346/256/265/347/274/272/345/244/261.md +240 -0
  11. package/troubleshooting/flutter/input-/350/276/271/346/241/206/351/227/256/351/242/230.md +236 -0
  12. package/troubleshooting/flutter/layout-/345/260/272/345/257/270/344/270/215/345/214/271/351/205/215.md +214 -0
  13. package/troubleshooting/flutter/shadow-/351/200/217/345/207/272/351/227/256/351/242/230.md +172 -0
  14. package/troubleshooting/flutter/sketch-/345/233/276/346/240/207/345/260/272/345/257/270.md +135 -0
  15. package/troubleshooting/flutter/sketch-/345/256/214/346/225/264/346/217/220/345/217/226.md +201 -0
  16. package/troubleshooting/flutter/sketch-/345/261/236/346/200/247/346/234/252/344/275/277/347/224/250.md +139 -0
  17. package/troubleshooting/flutter/svg-/346/234/252/345/261/205/344/270/255.md +120 -0
  18. package/troubleshooting/flutter/svg-/351/242/234/350/211/262/345/274/202/345/270/270.md +117 -0
  19. package/troubleshooting/flutter/tabbar-/345/212/250/347/224/273/345/220/214/346/255/245.md +107 -0
  20. package/troubleshooting/flutter/withopacity-/345/274/203/347/224/250.md +81 -0
  21. package/troubleshooting/vue3/cascader-/350/257/257/346/233/277/346/215/242.md +130 -0
  22. package/troubleshooting/vue3/drawer-input-/346/240/267/345/274/217.md +181 -0
  23. package/troubleshooting/vue3/table-/347/274/226/350/276/221/345/217/226/346/266/210.md +148 -0
  24. package/troubleshooting/vue3/table-/350/276/271/346/241/206/351/227/256/351/242/230.md +178 -0
@@ -0,0 +1,81 @@
1
+ # withOpacity 弃用警告
2
+
3
+ > **问题标签**: `deprecation`, `color`, `opacity`, `flutter3`
4
+ > **框架**: Flutter
5
+ > **严重程度**: 低(警告)
6
+
7
+ ---
8
+
9
+ ## 🔍 问题识别
10
+
11
+ ### IDE 提示
12
+ ```
13
+ 'withOpacity' is deprecated and shouldn't be used.
14
+ Use withValues to avoid precision loss.
15
+ ```
16
+
17
+ ### 问题特征
18
+ - [ ] 使用了 `Color.withOpacity()`
19
+ - [ ] IDE 显示删除线警告
20
+ - [ ] Flutter 3.x 版本
21
+
22
+ ---
23
+
24
+ ## 🎯 核心原理
25
+
26
+ **原因**:Flutter 3.x 弃用了 `withOpacity()` 方法,因为浮点数精度问题。推荐使用精度更高的 `withValues()`。
27
+
28
+ ---
29
+
30
+ ## ✅ 正确解决方案
31
+
32
+ ### 替换语法
33
+
34
+ ```dart
35
+ // ❌ 弃用写法
36
+ color: Colors.white.withOpacity(0.7)
37
+ color: const Color(0xFF1C2B45).withOpacity(0.15)
38
+
39
+ // ✅ 新写法
40
+ color: Colors.white.withValues(alpha: 0.7)
41
+ color: const Color(0xFF1C2B45).withValues(alpha: 0.15)
42
+ ```
43
+
44
+ ### 批量替换命令
45
+
46
+ ```bash
47
+ # 查找所有使用
48
+ grep -r "\.withOpacity(" lib/
49
+
50
+ # macOS/Linux sed 替换
51
+ find lib -name "*.dart" -exec sed -i '' 's/\.withOpacity(\([^)]*\))/.withValues(alpha: \1)/g' {} \;
52
+ ```
53
+
54
+ ### IDE 全局替换
55
+ - 搜索:`.withOpacity(`
56
+ - 替换:`.withValues(alpha: `
57
+ - 注意:需要手动调整括号
58
+
59
+ ---
60
+
61
+ ## 📝 注意事项
62
+
63
+ 1. **const 表达式**:`withValues` 同样不能在 const 中使用
64
+ ```dart
65
+ // 两种都不行用于 const
66
+ const color = Colors.white.withOpacity(0.5); // ❌
67
+ const color = Colors.white.withValues(alpha: 0.5); // ❌
68
+
69
+ // const 颜色需要直接指定 alpha
70
+ const color = Color(0x80FFFFFF); // ✅ 0x80 = 50% alpha
71
+ ```
72
+
73
+ 2. **alpha 范围**:0.0 - 1.0(与 withOpacity 相同)
74
+
75
+ ---
76
+
77
+ ## 📁 适用场景
78
+
79
+ - ✅ Flutter 3.x 项目升级
80
+ - ✅ 消除 IDE 警告
81
+ - ✅ 代码规范化
@@ -0,0 +1,130 @@
1
+ # Vue3 组件类型误替换问题
2
+
3
+ > **问题标签**: `vue3`, `component`, `requirement`, `cascader`, `select`, `理解偏差`
4
+ > **框架**: Vue3
5
+ > **严重程度**: 中等(导致返工)
6
+
7
+ ---
8
+
9
+ ## 🔍 问题识别
10
+
11
+ ### 用户描述关键词
12
+ - "让级联选择器支持选中第一级"
13
+ - "一级菜单也要能选"
14
+ - "可以只选父级"
15
+ - "checkStrictly"
16
+
17
+ ### 问题特征
18
+ - [ ] AI 将"修改组件行为"误解为"替换组件类型"
19
+ - [ ] 用户要求修改 el-cascader,AI 换成了 el-select
20
+ - [ ] 用户要求添加功能,AI 删除了原有组件
21
+
22
+ ---
23
+
24
+ ## 🎯 核心原理
25
+
26
+ **根本原因**:需求理解偏差,未区分"组件行为修改"与"组件类型替换"。
27
+
28
+ ### 术语准确性
29
+
30
+ | 用户说法 | 正确理解 | 错误理解 |
31
+ |----------|----------|----------|
32
+ | "让级联选择器支持选中第一级" | 修改 el-cascader 的 props | ❌ 换成 el-select |
33
+ | "一级/二级菜单" | 级联选择器的层级概念 | ❌ 菜单组件 |
34
+ | "选中第一级" | `checkStrictly: true` | ❌ 换成单选 |
35
+
36
+ ---
37
+
38
+ ## ✅ 正确解决方案
39
+
40
+ ### el-cascader 支持选中任意级别
41
+
42
+ ```vue
43
+ <template>
44
+ <el-cascader
45
+ v-model="selectedValue"
46
+ :options="options"
47
+ :props="cascaderProps"
48
+ :placeholder="$t('请选择')"
49
+ clearable
50
+ />
51
+ </template>
52
+
53
+ <script setup lang="ts">
54
+ import { ref, reactive } from 'vue'
55
+
56
+ const selectedValue = ref([])
57
+
58
+ // 关键配置:checkStrictly
59
+ const cascaderProps = reactive({
60
+ lazy: true,
61
+ checkStrictly: true, // ✅ 允许选中任意级别(包括父级)
62
+ lazyLoad: async (node, resolve) => {
63
+ // 异步加载子级数据
64
+ const { level, value } = node
65
+ const children = await fetchChildren(value, level)
66
+ resolve(children)
67
+ }
68
+ })
69
+
70
+ const options = ref([
71
+ { value: 1, label: '一级菜单 A', children: [] },
72
+ { value: 2, label: '一级菜单 B', children: [] }
73
+ ])
74
+ </script>
75
+ ```
76
+
77
+ ### 与 el-select 的区别
78
+
79
+ ```vue
80
+ <!-- ❌ 错误:换成 el-select 丢失了层级关系 -->
81
+ <el-select v-model="selected">
82
+ <el-option label="一级菜单 A" value="1" />
83
+ <el-option label="二级菜单 A1" value="1-1" />
84
+ <el-option label="二级菜单 A2" value="1-2" />
85
+ </el-select>
86
+
87
+ <!-- ✅ 正确:保留 el-cascader,添加 checkStrictly -->
88
+ <el-cascader
89
+ v-model="selected"
90
+ :options="options"
91
+ :props="{ checkStrictly: true }"
92
+ />
93
+ ```
94
+
95
+ ---
96
+
97
+ ## ❌ 常见错误排查路线(避免重复)
98
+
99
+ | 尝试方向 | 为什么无效 | 浪费时间 |
100
+ |----------|-----------|---------|
101
+ | 将 el-cascader 换成 el-select | 丢失层级关系和结构 | 3-5 轮返工 |
102
+ | 用 el-tree-select 代替 | 组件不同,交互方式不符合需求 | 2-4 轮 |
103
+ | 自己实现多级选择逻辑 | 重复造轮子,复杂且易出错 | 5-10 轮 |
104
+
105
+ ---
106
+
107
+ ## 📋 需求理解检查清单
108
+
109
+ **遇到组件修改需求时,必须先确认:**
110
+
111
+ - [ ] 用户是要"修改组件行为"还是"替换组件类型"?
112
+ - [ ] 如果是修改行为,先查阅组件文档,看是否有对应配置项
113
+ - [ ] 如果用户说"一级菜单",确认是指级联选择器的层级还是导航菜单
114
+ - [ ] 如果不确定,先询问用户确认,列出理解让用户选择
115
+
116
+ ---
117
+
118
+ ## 📁 适用场景
119
+
120
+ - ✅ el-cascader 需要支持选中任意级别
121
+ - ✅ 需要在层级数据中选择父级节点
122
+ - ✅ 异步加载的级联选择器
123
+ - ✅ 区分"修改组件行为"与"替换组件"
124
+
125
+ ---
126
+
127
+ ## 🔗 相关案例
128
+
129
+ - [form-验证问题.md](./form-验证问题.md) - 表单配置相关
130
+ - [table-编辑取消.md](./table-编辑取消.md) - 编辑模式切换
@@ -0,0 +1,181 @@
1
+ # Vue3 el-drawer 表格输入框样式问题
2
+
3
+ > **问题标签**: `vue3`, `element-plus`, `drawer`, `table`, `input`, `style`, `background`
4
+ > **框架**: Vue3
5
+ > **严重程度**: 中等(UI 不符合预期)
6
+
7
+ ---
8
+
9
+ ## 🔍 问题识别
10
+
11
+ ### 用户描述关键词
12
+ - "drawer 里的输入框背景色不对"
13
+ - "输入框在抽屉中样式异常"
14
+ - "禁用状态和启用状态背景一样"
15
+ - "表格中的输入框透明"
16
+
17
+ ### 问题特征
18
+ - [ ] el-drawer 中的 el-table 内,el-input/el-select 样式异常
19
+ - [ ] 禁用和启用状态背景色一样
20
+ - [ ] 输入框边框丢失或显示异常
21
+ - [ ] 使用了硬编码颜色(如 `#fff`)
22
+
23
+ ---
24
+
25
+ ## 🎯 核心原理
26
+
27
+ **根本原因**:el-drawer 中的表格输入控件需要特殊处理,区分禁用/启用状态,并使用 CSS 变量适配主题。
28
+
29
+ ### 问题代码模式
30
+
31
+ ```scss
32
+ // ❌ 错误:硬编码颜色,不区分状态
33
+ .el-input__wrapper {
34
+ background-color: #fff !important; // 导致所有状态都是白色
35
+ }
36
+
37
+ // ❌ 错误:全局覆盖
38
+ .el-input__wrapper {
39
+ background-color: transparent !important; // 导致所有输入框透明
40
+ }
41
+ ```
42
+
43
+ ---
44
+
45
+ ## ✅ 正确解决方案
46
+
47
+ ### 使用 CSS 变量 + 状态选择器
48
+
49
+ ```vue
50
+ <style scoped lang="scss">
51
+ :deep(.el-drawer) {
52
+ .el-table__body {
53
+ // 禁用状态:透明背景,无边框
54
+ .el-input__wrapper,
55
+ .el-select .el-input__wrapper {
56
+ background-color: transparent !important;
57
+ box-shadow: none !important;
58
+ }
59
+
60
+ // 启用状态:使用 CSS 变量适配主题
61
+ .el-input:not(.is-disabled) .el-input__wrapper,
62
+ .el-select:not(.is-disabled) .el-input__wrapper {
63
+ background-color: var(--el-fill-color-blank) !important;
64
+ box-shadow: 0 0 0 1px var(--el-border-color) inset !important;
65
+ }
66
+
67
+ // 聚焦状态
68
+ .el-input:not(.is-disabled).is-focus .el-input__wrapper,
69
+ .el-select:not(.is-disabled).is-focus .el-input__wrapper {
70
+ box-shadow: 0 0 0 1px var(--el-color-primary) inset !important;
71
+ }
72
+ }
73
+ }
74
+ </style>
75
+ ```
76
+
77
+ ### CSS 变量说明
78
+
79
+ | CSS 变量 | 说明 | 默认值(浅色主题) |
80
+ |----------|------|--------------------|
81
+ | `--el-fill-color-blank` | 空白填充色 | `#ffffff` |
82
+ | `--el-border-color` | 边框颜色 | `#dcdfe6` |
83
+ | `--el-color-primary` | 主题色 | `#409eff` |
84
+ | `--el-text-color-disabled` | 禁用文字色 | `#a8abb2` |
85
+
86
+ ### 完整示例
87
+
88
+ ```vue
89
+ <template>
90
+ <el-drawer v-model="visible" :title="$t('编辑数据')" size="60%">
91
+ <el-table :data="list" border>
92
+ <el-table-column :label="$t('名称')" prop="name">
93
+ <template #default="{ row }">
94
+ <el-input v-model="row.name" :disabled="editR" :placeholder="$t('请输入')" />
95
+ </template>
96
+ </el-table-column>
97
+
98
+ <el-table-column :label="$t('类型')" prop="type">
99
+ <template #default="{ row }">
100
+ <el-select v-model="row.type" :disabled="editR" :placeholder="$t('请选择')">
101
+ <el-option :label="$t('类型A')" value="A" />
102
+ <el-option :label="$t('类型B')" value="B" />
103
+ </el-select>
104
+ </template>
105
+ </el-table-column>
106
+ </el-table>
107
+ </el-drawer>
108
+ </template>
109
+
110
+ <script setup lang="ts">
111
+ import { ref } from 'vue'
112
+
113
+ const visible = ref(false)
114
+ const editR = ref(false) // false=编辑模式, true=查看模式
115
+ const list = ref([
116
+ { name: '测试1', type: 'A' },
117
+ { name: '测试2', type: 'B' }
118
+ ])
119
+ </script>
120
+
121
+ <style scoped lang="scss">
122
+ :deep(.el-drawer) {
123
+ .el-table__body {
124
+ // 禁用状态:透明背景,无边框
125
+ .el-input__wrapper,
126
+ .el-select .el-input__wrapper {
127
+ background-color: transparent !important;
128
+ box-shadow: none !important;
129
+ }
130
+
131
+ // 启用状态:使用 CSS 变量适配主题
132
+ .el-input:not(.is-disabled) .el-input__wrapper,
133
+ .el-select:not(.is-disabled) .el-input__wrapper {
134
+ background-color: var(--el-fill-color-blank) !important;
135
+ box-shadow: 0 0 0 1px var(--el-border-color) inset !important;
136
+ }
137
+ }
138
+ }
139
+ </style>
140
+ ```
141
+
142
+ ---
143
+
144
+ ## ❌ 常见错误排查路线(避免重复)
145
+
146
+ | 尝试方向 | 为什么无效 | 浪费时间 |
147
+ |----------|-----------|---------|
148
+ | 硬编码 `#fff` | 不适配暗色主题,所有状态一样 | 2-3 轮 |
149
+ | 全局覆盖 `.el-input__wrapper` | 影响其他页面的输入框 | 3-5 轮 |
150
+ | 不区分 `.is-disabled` | 禁用和启用状态样式一样 | 2-4 轮 |
151
+ | 使用 `style="..."` 内联样式 | 无法适配主题,优先级问题 | 1-2 轮 |
152
+
153
+ ---
154
+
155
+ ## 📋 样式检查清单
156
+
157
+ **在 el-drawer 中使用表格输入框时,必须确认:**
158
+
159
+ - [ ] 使用 CSS 变量(`var(--el-xxx)`)而非硬编码颜色
160
+ - [ ] 区分禁用状态(`.is-disabled`)和启用状态
161
+ - [ ] 使用 `:deep()` 穿透 scoped 样式
162
+ - [ ] 限定作用域(`.el-drawer .el-table__body`)不影响其他组件
163
+ - [ ] 禁用状态:透明背景 + 无边框
164
+ - [ ] 启用状态:白色背景 + 边框
165
+
166
+ ---
167
+
168
+ ## 📁 适用场景
169
+
170
+ - ✅ el-drawer 中的表格编辑功能
171
+ - ✅ 需要区分禁用/启用状态的输入框
172
+ - ✅ 需要适配浅色/暗色主题
173
+ - ✅ 表格内嵌 el-input、el-select、el-date-picker 等
174
+
175
+ ---
176
+
177
+ ## 🔗 相关案例
178
+
179
+ - [table-编辑取消.md](./table-编辑取消.md) - 表格编辑取消逻辑
180
+ - [table-边框问题.md](./table-边框问题.md) - 表格边框样式
181
+ - [style-优先级问题.md](./style-优先级问题.md) - 样式优先级问题
@@ -0,0 +1,148 @@
1
+ # Vue3 表格编辑取消逻辑错误
2
+
3
+ > **问题标签**: `vue3`, `table`, `edit`, `cancel`, `backup`, `深拷贝`
4
+ > **框架**: Vue3
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
+ 1. 数据获取时同时创建备份
31
+ 2. 使用 `JSON.parse(JSON.stringify())` 深拷贝
32
+ 3. 取消时从备份恢复数据
33
+ 4. 提交成功后更新备份
34
+
35
+ ---
36
+
37
+ ## ✅ 正确解决方案
38
+
39
+ ### 完整实现模式
40
+
41
+ ```typescript
42
+ // 1. 数据定义:表格数据 + 备份数据
43
+ const list = ref<any[]>([])
44
+ const subList = ref<any[]>([]) // 备份
45
+ const editMode = ref(true) // true=查看模式, false=编辑模式
46
+
47
+ // 2. 数据获取时同时创建备份
48
+ const getList = async () => {
49
+ const agin = await api.$getList(params)
50
+ if (agin.success) {
51
+ list.value = agin.Data
52
+ // 深拷贝创建备份
53
+ subList.value = JSON.parse(JSON.stringify(agin.Data))
54
+ }
55
+ }
56
+
57
+ // 3. 取消方法(推荐使用独立方法,而非模板内联)
58
+ const cancelListEdit = () => {
59
+ // 从备份恢复数据
60
+ list.value = JSON.parse(JSON.stringify(subList.value))
61
+ editMode.value = true // 切回查看模式
62
+ }
63
+
64
+ // 4. 提交成功后更新备份
65
+ const submitList = async () => {
66
+ const agin = await api.$updateList({ list: list.value })
67
+ if (agin.success) {
68
+ // 提交成功后,更新备份为当前数据
69
+ subList.value = JSON.parse(JSON.stringify(list.value))
70
+ editMode.value = true
71
+ ElMessage.success($t('保存成功'))
72
+ }
73
+ }
74
+
75
+ // 5. 进入编辑模式
76
+ const enterEditMode = () => {
77
+ editMode.value = false
78
+ }
79
+ ```
80
+
81
+ ### 模板使用
82
+
83
+ ```vue
84
+ <template>
85
+ <el-table v-loading="loading" :data="list" border highlight-current-row>
86
+ <el-table-column prop="name" :label="$t('名称')">
87
+ <template #default="{ row }">
88
+ <!-- 编辑模式:显示输入框 -->
89
+ <el-input v-if="!editMode" v-model="row.name" :placeholder="$t('请输入名称')"></el-input>
90
+ <!-- 查看模式:显示文本 -->
91
+ <span v-else>{{ row.name }}</span>
92
+ </template>
93
+ </el-table-column>
94
+ </el-table>
95
+
96
+ <!-- 按钮组 -->
97
+ <div class="btn-group">
98
+ <!-- 查看模式:显示编辑按钮 -->
99
+ <el-button v-if="editMode" type="primary" @click="enterEditMode">{{ $t('编辑') }}</el-button>
100
+
101
+ <!-- 编辑模式:显示取消和提交按钮 -->
102
+ <template v-else>
103
+ <el-button @click="cancelListEdit" class="cancel_btn">{{ $t('取消') }}</el-button>
104
+ <el-button type="primary" :loading="btnLoading" @click="submitList">{{ $t('提交') }}</el-button>
105
+ </template>
106
+ </div>
107
+ </template>
108
+ ```
109
+
110
+ ---
111
+
112
+ ## ❌ 常见错误排查路线(避免重复)
113
+
114
+ | 尝试方向 | 为什么无效 | 浪费时间 |
115
+ |----------|-----------|---------|
116
+ | 不创建备份,直接重新请求数据 | 网络请求慢,用户体验差,且可能数据已变化 | 2-3 轮 |
117
+ | 使用浅拷贝 `subList = list` | 引用同一对象,修改 list 会影响 subList | 3-5 轮 |
118
+ | 模板内联逻辑 `@click="list = subList"` | 无法深拷贝,且难以维护 | 1-2 轮 |
119
+ | 忘记提交成功后更新备份 | 下次取消会恢复到更早的数据 | 2-4 轮 |
120
+
121
+ ---
122
+
123
+ ## 📋 检查清单
124
+
125
+ **实现表格编辑取消功能时,必须确认:**
126
+
127
+ - [ ] 每个可编辑表格都有对应的备份变量(`xxxSubList`)
128
+ - [ ] 使用 `JSON.parse(JSON.stringify())` 进行深拷贝
129
+ - [ ] 取消按钮调用独立方法,而非模板内联逻辑
130
+ - [ ] 取消方法中恢复的数据源与表格 `:data` 绑定一致
131
+ - [ ] 提交成功后更新备份数据
132
+ - [ ] 方法中使用 `.value` 访问 ref 变量
133
+
134
+ ---
135
+
136
+ ## 📁 适用场景
137
+
138
+ - ✅ 表格内编辑功能
139
+ - ✅ 需要支持取消恢复的表单
140
+ - ✅ 多个编辑项的复杂表格
141
+ - ✅ 编辑-取消-提交三按钮模式
142
+
143
+ ---
144
+
145
+ ## 🔗 相关案例
146
+
147
+ - [form-验证问题.md](./form-验证问题.md) - 表单验证相关问题
148
+ - [table-边框问题.md](./table-边框问题.md) - 表格样式问题